錯誤跟蹤系統Sentry是何方神圣?
本文轉載自微信公眾號「運維開發故事」,作者喬克 。轉載本文請聯系運維開發故事公眾號。
大家好,我是喬克,一名一線運維實踐者。
今天和大家分享一下什么是錯誤跟蹤系統,以及如何使用。
在應用的整個生命周期里,避無可避的就是“錯誤”,很多時候都是借助日志平臺來捕獲、查看日志,以此來找到錯誤的原因,但是很多時候應用的日志有很多誤導性,也不能夠很直觀的指出問題的源點,并且也缺乏及時分析和告警能力(當然現在很多商用的日志系統都有這個功能了,但是需要Money)。
有沒有比較好用的開源軟件呢?
Sentry就是這樣一款優秀的應用錯誤跟蹤系統,并且支持大多數的語言,如下。
錯誤跟蹤系統是什么?
從字面上就可以很好理解,錯誤跟蹤系統就是跟蹤系統錯誤、異常的一個軟件,旨在幫助開發、運維等技術人員跟蹤應用的一些錯誤信息。
通過對應用的錯誤進行實時追蹤并統一跟進,提高對錯誤的治理能力。讓業務場景下自己發現Bug的速度快于用戶報告Bug的速度。
Sentry是什么
Sentry是一個跨平臺的應用錯誤跟蹤系統,專注于錯誤報告。
Sentry的原理是什么呢?
首先,應用要集成Sentry的SDK,然后在應用發生錯誤時將錯誤信息發送給Sentry服務端。Sentry的服務端分為web、cron、worker這幾個部分,應用(客戶端)發生錯誤后將錯誤信息上報給web,web處理后放入消息隊列或Redis內存隊列,worker從隊列中消費數據進行處理 。
其主要優點如下:
- 提供精美的WEB UI界面
- 支持幾乎所有的主流開發語言的SDK,接入簡單
- 提供完整的錯誤詳情
- 支持統一的錯誤聚合分析
- 支持儀表盤、監控、告警等功能
- 支持團隊管理、成員管理
- 支持日志審計等
當然也有一些缺點,針對維護部署其需要的中間件非常多,有kafka、rabbitMQ、redis、pgsql等,這一套部署下來的成本還是比較高。不過瑕不掩瑜,相比于它給我們帶來的好處,這些問題都可以克服。
image.png
部署Sentry
Sentry提供服務的方式有兩種:
- SAAS平臺,有不同的付費方式
- 私有化部署
這里主要闡述如何在Kubernetes中進行部署。
環境介紹
- Kubernetes:1.17.17
- Docker:18.09.0
- Helm:3.6.3
- 存儲:使用Local PV
OpenEBS簡介
OpenEBS是一款使用Go語言編寫的基于容器的塊存儲開源軟件。OpenEBS使得在容器中運行關鍵性任務和需要數據持久化的負載變得更可靠。
使用OpenEBS,你可以將有持久化數據的容器,像對待其他普通容器一樣來對待。OpenEBS本身也是通過容器來部署的,支持Kubernetes、Swarm、Mesos、Rancher編排調度,存儲服務可以分派給每個pod、應用程序、集群或者容器級別,包括:
- 跨節點的數據持久化
- 跨可用區和云廠商的數據同步
- 使用商業硬件和容器引擎來提供高可擴展的塊存儲
- 與容器編排引擎集成,開發者的應用程序可以自動的配置OpenEBS
- 基于CloudByte在BSD的容器化經驗,為用戶提供OpenEBS的QoS保證
OpenEBS的架構可以分為數據平面(Data Plane)和控制平面(Control Plane)兩部分:
- 數據平面:為應用程序提供數據存儲
- 控制平面:管理OpenEBS卷容器,這通常會用到容器編排軟件的功能
環境部署
1、部署OpenEBS
OpenEBS支持Helm Chart和Operator部署.
(1)使用Helm Chart部署
- helm repo add openebs https://openebs.github.io/charts
- helm repo update
- helm install openebs --namespace openebs openebs/openebs --create-namespace
(2)使用Operator部署
- kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
部署完成后會生成如下Pod。
- # kubectl get pod -n openebs
- NAME READY STATUS RESTARTS AGE
- maya-apiserver-67b5b5c858-4mstb 1/1 Running 0 5d19h
- openebs-admission-server-6bdf9b76d6-r4r6b 1/1 Running 0 5d19h
- openebs-localpv-provisioner-966d864cd-sf8fp 1/1 Running 0 5d19h
- openebs-ndm-59lkx 1/1 Running 0 5d19h
- openebs-ndm-bphgw 1/1 Running 0 5d19h
- openebs-ndm-grxlb 1/1 Running 0 5d19h
- openebs-ndm-operator-55b8ccc64b-r7tkr 1/1 Running 0 5d19h
- openebs-ndm-zwhmm 1/1 Running 0 5d19h
- openebs-provisioner-55794b6cd4-ptd85 1/1 Running 0 5d19h
- openebs-snapshot-operator-5d78fcbd96-7xqzv 2/2 Running 0 5d19h
以及如下的StorageClass。
- # kubectl get sc | grep openebs
- local (default) openebs.io/local Delete WaitForFirstConsumer false 5d19h
- openebs-device openebs.io/local Delete WaitForFirstConsumer false 5d19h
- openebs-hostpath openebs.io/local Delete WaitForFirstConsumer false 5d19h
- openebs-jiva-default openebs.io/provisioner-iscsi Delete Immediate false 5d19h
- openebs-snapshot-promoter volumesnapshot.external-storage.k8s.io/snapshot-promoter Delete Immediate false 5d19h
2、部署Postgresql
其實在Sentry的Helm Chart中有Postgresql的Chart包,這里之所以單獨來部署,是因為通過Sentry中的Chart包部署,在Postgresql環節出現了各種問題,比如:
- FATAL: password authentication failed for user "postgres"
這里通過Helm Chart來部署Postgresql,具體步驟如下:
- # 添加Helm倉庫
- helm repo add bitnami https://charts.bitnami.com/bitnami
- helm repo update
- # 把Chart包下載下來
- helm pull bitnami/postgresql
編寫配置文件(my-value.yaml),如下:
- global:
- postgresql:
- postgresqlDatabase: "sentry"
- postgresqlUsername: "postgres"
- existingSecret: ""
- postgresqlPassword: "postgres"
- servicePort: ""
- replicationPassword: ""
安裝PGSQL,命令如下:
- helm install postgresql -n sentry -f my-value.yaml bitnami/postgresql
部署完成后,可以看到如下Pod:
- # kubectl get po -n sentry
- NAME READY STATUS RESTARTS AGE
- postgresql-postgresql-0 1/1 Running 0 3h39m
3、部署Sentry
Sentry也是采用Helm Chart來進行部署,如下:
- # 添加Helm倉庫
- helm repo add sentry https://sentry-kubernetes.github.io/charts
- helm repo update
- helm search repo sentry
- # 下載Chart包,便于查看修改Chart
- helm pull sentry/sentry
編寫配置文件(my-value.yaml),如下:
- externalPostgresql:
- database: sentry
- port: 5432
- username: postgres
- host: postgresql
- password: postgres
- postgresql:
- enabled: false
- mail:
- backend: dummy
- from: "joker2021@163.com"
- host: "smtp"
- password: "UZKSGLFEANWGLZNT"
- port: 465
- useTls: true
- username: ""
- user:
- create: true
- email: admin@sentry.local
- password: P@ssword
部署Sentry,如下:
- helm install sentry -n sentry -f my-value.yaml sentry/sentry
部署完成后,會生成如下Pod:
- # kubectl get po -n sentry
- NAME READY STATUS RESTARTS AGE
- postgresql-postgresql-0 1/1 Running 0 3h50m
- sentry-clickhouse-0 1/1 Running 0 3h50m
- sentry-clickhouse-1 1/1 Running 0 3h50m
- sentry-clickhouse-2 1/1 Running 0 3h50m
- sentry-cron-578647dd7-gk7gf 1/1 Running 0 3h50m
- sentry-ingest-consumer-7564f644bf-srkj2 1/1 Running 0 3h47m
- sentry-kafka-0 1/1 Running 2 3h50m
- sentry-kafka-1 1/1 Running 2 3h50m
- sentry-kafka-2 1/1 Running 2 3h50m
- sentry-nginx-675d779699-tfdr5 1/1 Running 0 3h50m
- sentry-post-process-forward-5f586f6cdf-lxmc4 1/1 Running 0 3h47m
- sentry-rabbitmq-0 1/1 Running 0 3h50m
- sentry-rabbitmq-1 1/1 Running 0 3h49m
- sentry-rabbitmq-2 1/1 Running 0 3h48m
- sentry-relay-75597cb98b-jm282 1/1 Running 0 3h47m
- sentry-sentry-redis-master-0 1/1 Running 0 3h50m
- sentry-sentry-redis-slave-0 1/1 Running 0 3h50m
- sentry-sentry-redis-slave-1 1/1 Running 0 3h49m
- sentry-sessions-consumer-6b499bf64d-lm7gq 1/1 Running 0 3h47m
- sentry-snuba-api-5586d5f9f8-tcn5s 1/1 Running 0 3h50m
- sentry-snuba-cleanup-errors-1630472400-xv5wh 0/1 Completed 0 134m
- sentry-snuba-cleanup-errors-1630476000-xd7d2 0/1 Completed 0 74m
- sentry-snuba-cleanup-errors-1630479600-sd59b 0/1 Completed 0 14m
- sentry-snuba-cleanup-transactions-1630472400-l9bcx 0/1 Completed 0 134m
- sentry-snuba-cleanup-transactions-1630476000-cjsbd 0/1 Completed 0 74m
- sentry-snuba-cleanup-transactions-1630479600-zn5dz 0/1 Completed 0 14m
- sentry-snuba-consumer-58b7bfd545-rnjmx 1/1 Running 0 3h47m
- sentry-snuba-outcomes-consumer-57c589bf6d-lxg5m 1/1 Running 0 3h47m
- sentry-snuba-replacer-5bf4d6b5d7-gcc7g 1/1 Running 0 3h47m
- sentry-snuba-transactions-consumer-57bb7f8ccb-q6gkt 1/1 Running 0 3h47m
- sentry-web-7c9766768b-njxjl 1/1 Running 0 3h50m
- sentry-worker-844fd65687-6b26p 1/1 Running 2 3h50m
- sentry-worker-844fd65687-k2h6z 1/1 Running 2 3h50m
- sentry-worker-844fd65687-rfjcl 1/1 Running 2 3h50m
- sentry-zookeeper-0 1/1 Running 0 3h50m
然后可以通過ingress或者nodeport的方式進行訪問,用戶名和密碼是上面配置的admin@sentry.local和P@ssword。
創建項目
進入WEB UI界面,在項目專欄創建項目,如下:
我這里創建一個Go項目,如下:
點擊創建后,就會生成一個Dsn地址,并且給出一個配置示例,如下:
- package main
- import (
- "fmt"
- "github.com/getsentry/sentry-go"
- sentrygin "github.com/getsentry/sentry-go/gin"
- "github.com/gin-gonic/gin"
- "github.com/pkg/errors"
- "net/http"
- )
- func main() {
- // To initialize Sentry's handler, you need to initialize Sentry itself beforehand
- if err := sentry.Init(sentry.ClientOptions{
- Dsn: "https://b06bcc1c67b44084a3f65fc8b219a5fc@o985819.ingest.sentry.io/5942245",
- }); err != nil {
- fmt.Printf("Sentry initialization failed: %v\n", err)
- }
- sentry.CaptureMessage("It works!")
- sentry.CaptureException(errors.New("error msg"))
- // Then create your app
- app := gin.Default()
- // Once it's done, you can attach the handler as one of your middleware
- app.Use(sentrygin.New(sentrygin.Options{}))
- // Set up routes
- app.GET("/", func(ctx *gin.Context) {
- ctx.String(http.StatusOK, "Hello world!")
- })
- // And run it
- app.Run(":3000")
- }
其他類型的項目與此類似,具體步驟也就三步:
- 在Sentry WEB UI界面創建項目
- 生成對應的Dsn
- 將其引入到具體的應用代碼中
然后應用部署過后,就會通過Post的方式上報應用錯誤,屆時就可以在WEB界面進行查看。
image.png
創建警報
可以創建的告警類型還是比較豐富,如下:
然后創建規則,如下:
除此之外還可以進行團隊、成員管理,日志審計等,更多功能需要自己去實踐了。