掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
sentry是一個跨平臺的錯誤監(jiān)控和搜集的異常上報監(jiān)控系統(tǒng)。sentry主要用于實時監(jiān)控的應用服務,收集相關(guān)應用服務在運行狀態(tài)時出現(xiàn)的異?;蛘咤e誤日志信息,并且sentry會通過自身集成的通知渠道將錯誤信息推送給維護人員。

sentry收集到的異?;蛘咤e誤日志,會在告警規(guī)則的匹配下,第一時間讓維護人員接收到服務運行的異常信息,便于快速定位問題以及解決問題。
sentry支持絕大多數(shù)的語言以及框架,使用相對便捷。
優(yōu)點:
缺點:
保障Sentry服務端高可用。
在SDK上設置請求sentry的超時時間
合理設置SDK的采樣率。
sentry在高負載下,應及時熔斷處理,比如優(yōu)化采樣率為0.00。
SDK使用異步發(fā)送請求,避免同步阻塞。
sentry實例采用環(huán)境隔離的方式使用。
通過隊列來緩沖請求至 Sentry 的并發(fā)壓力。
sentry組件架構(gòu)。
sentry組件架構(gòu)
準備sentry的工作目錄:
mkdir sentry && cd $_
touch sentry.env docker-compose.yml # 分別填充以下內(nèi)容
sentry.env:
SENTRY_SECRET_KEY=0x4r6f^0ak5w_3)w1ybh2qbr4@-0tr33ey)lf*e5_cq55xae&5-)r*=9
DB_PASSWORD="bw1knjWnUA"
DB_USER=sentry
將以下內(nèi)容填充到docker-compose.yml中:
version: '2'
volumes:
pgdb:
services:
redis:
image: redis:alpine
restart: always
#command: /bin/sh -c "redis-server --requirepass $$REDIS_HOST_PASSWORD"
postgres:
image: postgres
environment:
POSTGRES_USER: $$DB_USER
POSTGRES_PASSWORD: $$DB_PASSWORD
POSTGRES_DB: sentry
volumes:
- pgdb:/var/lib/postgresql/data
env_file:
- sentry.env
sentry:
image: sentry
links:
- redis
- postgres
ports:
- 9000:9000
environment:
SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
SENTRY_POSTGRES_HOST: postgres
SENTRY_DB_USER: $$DB_USER
SENTRY_DB_PASSWORD: $$DB_PASSWORD
SENTRY_REDIS_HOST: redis
env_file:
- sentry.env
cron:
image: sentry
links:
- redis
- postgres
command: "sentry run cron"
environment:
SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
SENTRY_POSTGRES_HOST: postgres
SENTRY_DB_USER: $$DB_USER
SENTRY_DB_PASSWORD: $$DB_PASSWORD
SENTRY_REDIS_HOST: redis
env_file:
- sentry.env
worker:
image: sentry
links:
- redis
- postgres
command: "sentry run worker"
environment:
SENTRY_SECRET_KEY: $$SENTRY_SECRET_KEY
SENTRY_POSTGRES_HOST: postgres
SENTRY_DB_USER: $$DB_USER
SENTRY_DB_PASSWORD: $$DB_PASSWORD
SENTRY_REDIS_HOST: redis
env_file:
- sentry.env
生成sentry secret key填充到sentry.env中的SENTRY_SECRET_KEY。
docker run --rm sentry config generate-secret-key
初始化數(shù)據(jù)庫以及創(chuàng)建登錄用戶。
docker-compose up -d # 部署sentry以及相關(guān)依賴的服務
docker-compose exec sentry sentry upgrade ## create user and password.
使用前面創(chuàng)建的用戶以及密碼登錄:
sentry dashboard login
創(chuàng)建項目:
創(chuàng)建項目
一個配置demo:
配置demo
大概就是這些,具體的各語言的SDK還要看對應的文檔以及源碼。
本實例,將通過創(chuàng)建一個go語言編寫的demo服務,測試錯誤上報到sentry的效果
創(chuàng)建go項目:
mkdir go-sentry-gin
cd $_
初始化模塊:
go mod init go-gin-sentry
go get github.com/getsentry/sentry-go
go get github.com/getsentry/sentry-go/gin
source code:
package main
import (
"github.com/getsentry/sentry-go"
sentrygin "github.com/getsentry/sentry-go/gin"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
err := sentry.Init(sentry.ClientOptions{
Dsn: "http://c0056580f26c469c8cc31d780d1995a8@localhost:9000/6",
Environment: "dev",
Release: "[email protected]",
Debug: true,
})
if err != nil {
sentry.CaptureMessage("Sentry initialization failed." + err.Error())
}
r := gin.Default()
r.Use(sentrygin.New(sentrygin.Options{}))
r.Use(func(ctx *gin.Context) {
if hub := sentrygin.GetHubFromContext(ctx); hub != nil {
hub.Scope().SetTag("someRandomTag", "maybeYouNeedIt")
ctx.Next()
}
})
r.GET("/demo", func(c *gin.Context) {
if hub := sentrygin.GetHubFromContext(c); hub != nil {
hub.WithScope(func(scope *sentry.Scope) {
scope.SetExtra("unwantedQuery", "someQueryDataMaybe")
hub.CaptureMessage("User provided unwanted query string, but we recovered just fine")
})
c.Status(http.StatusOK)
}
panic("error occured")
})
r.Run()
}
運行后,訪問服務路由,錯誤日志信息即上報到sentry上。
打開項目詳情頁,即可看到整個項目的狀態(tài)信息。
go-gin-sentry相關(guān)信息
[1]sentry官網(wǎng): https://sentry.io/welcome/。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流