Sentry的優(yōu)勢(shì)
- 開(kāi)源,有免費(fèi)版
- 可以部署自己的服務(wù)器,安全
- 錯(cuò)誤信息及告警機(jī)制完善
- 簡(jiǎn)單易上手,開(kāi)發(fā)成本低
- 錯(cuò)誤追蹤及狀態(tài)流轉(zhuǎn)及時(shí),方便
- 豐富的SDK
-
社區(qū)活躍
采用sentry的優(yōu)勢(shì).png
一、部署運(yùn)維
sentry分為收費(fèi)版和免費(fèi)自建版,收費(fèi)版的不適用我們大多數(shù)公司,所以本文主要是介紹免費(fèi)版。
Docker Compose
官方提供了docker-compose,也是它推薦的部署方式,參考地址:https://github.com/getsentry/onpremise。
git clone https://github.com/getsentry/onpremise.git
cd onpremise
./install.sh
docker-compose up -d
k8s
另外關(guān)于sentry的高可用方案,首推k8s部署了,參考地址:https://github.com/sentry-kubernetes/charts。
sentry升級(jí)
sentry提供了升級(jí)命令,一鍵升級(jí)數(shù)據(jù)庫(kù)到對(duì)應(yīng)的新版本,但是需要注意之前的版本需要是9.1.2之上。如果小于9.1.2是不兼容的。只能通過(guò)命令把用戶和項(xiàng)目數(shù)據(jù)導(dǎo)出。放棄之前的錯(cuò)誤信息。
docker-compose run --rm web upgrade
二、應(yīng)用接入
2.1 Java應(yīng)用接入
- pom.xml引入官方的jar包
<dependency>
<groupId>io.sentry</groupId>
<artifactId>sentry-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>io.sentry</groupId>
<artifactId>sentry-logback</artifactId>
<version>4.3.0</version>
</dependency>
- 配置項(xiàng)
<?xml version="1.0" encoding="UTF-8"?><root>
<include resource="org/springframework/boot/logging/logback/defaults.xml"></include>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"></include>
<appender name="SENTRY" class="io.sentry.logback.SentryAppender">
<options>
<dsn>http://ac5a2918ec064472a861066a5c3ddcdc@10.10.4.23:19000/4</dsn>
<shutdownTimeout>2000</shutdownTimeout>
<flushTimeoutMillis>15000</flushTimeoutMillis>
<debug>false</debug>
<maxBreadcrumbs>100</maxBreadcrumbs>
<release>1.0.0</release>
<environment>production</environment>
<sampleRate>1.0</sampleRate>
<attachThreads>false</attachThreads>
<attachStacktrace>false</attachStacktrace>
<serverName>host-4</serverName>
<connectionTimeoutMillis>5000</connectionTimeoutMillis>
<readTimeoutMillis>5000</readTimeoutMillis>
</options>
<minimumEventLevel>WARN</minimumEventLevel>
<minimumBreadcrumbLevel>DEBUG</minimumBreadcrumbLevel>
</appender>
<root level="info">
<appender_ref ref="CONSOLE"></appender_ref>
<appender_ref ref="SENTRY"></appender_ref>
</root>
</root>
2.2 前端應(yīng)用接入
除了自主研發(fā)外,還可以借助第三方插件( 阿里ARMS、fundebug、BadJS,sentry )
- 阿里ARMS :是阿里的一個(gè)前端數(shù)據(jù)監(jiān)控的服務(wù),是收費(fèi)的
- fundebug :挺完善的前端錯(cuò)誤日志服務(wù),也是收費(fèi)的
- BadJS :騰訊團(tuán)隊(duì)的一個(gè)開(kāi)源項(xiàng)目,沒(méi)看過(guò),應(yīng)該很不錯(cuò)的
還有就是可以使用sentry來(lái)做監(jiān)控了,可以和公司的其他語(yǔ)言項(xiàng)目集成在一起。

三、sentry啟動(dòng)的服務(wù)

nginx:進(jìn)行服務(wù)間的網(wǎng)絡(luò)通信
sentry_defaults:默認(rèn)環(huán)境
- worker:處理后臺(tái)工作,郵件,報(bào)警等
- cron:處理定時(shí)任務(wù)
- web:sentry 的 web 頁(yè)面服務(wù)
- post-process-forwarder
- ingest-consumer:處理 kafka 消息
snuba-cleanup:數(shù)據(jù)清理
relay:
- web 上報(bào)的數(shù)據(jù)先到 relay
- relay 直接返回響應(yīng)狀態(tài)
- 然后在后臺(tái)任務(wù)中繼續(xù)處理數(shù)據(jù)
- 解析事件、格式調(diào)整、啟用過(guò)濾規(guī)則等
- 數(shù)據(jù)寫(xiě)入 kafka
postgres:服務(wù)后臺(tái)默認(rèn)的數(shù)據(jù)庫(kù),存儲(chǔ)異常數(shù)據(jù)
redis:數(shù)據(jù)攔截配置
kafka:數(shù)據(jù)響應(yīng),建立服務(wù)間的長(zhǎng)連接
zookeeper:支持管理 kafaka 的服務(wù)
這里再使用思維導(dǎo)圖梳理下服務(wù)列表:

四、sentry整體運(yùn)行流程

五、sentry配置文件
- config.yml:配置文件
- sentry.conf.py:為 python 代碼,覆蓋或合并至 sentry 服務(wù)中,從而影響 sentry 運(yùn)行。
- .env:鏡像版本、數(shù)據(jù)保留天數(shù)、端口等配置
.env文件
COMPOSE_PROJECT_NAME=sentry_onpremise
SENTRY_EVENT_RETENTION_DAYS=90
SENTRY_IMAGE=getsentry/sentry:83b1380
# You can either use a port number or an IP:PORT combo for SENTRY_BIND
# See https://docs.docker.com/compose/compose-file/#ports for more
SENTRY_BIND=9000
SENTRY_IMAGE=getsentry/sentry:nightly
SNUBA_IMAGE=getsentry/snuba:nightly
RELAY_IMAGE=getsentry/relay:nightly
SYMBOLICATOR_IMAGE=getsentry/symbolicator:nightly
數(shù)據(jù)保留時(shí)長(zhǎng)
默認(rèn)90天
如果需要將數(shù)據(jù)保留時(shí)長(zhǎng)改為 7 天。修改 .env 文件即可:
SENTRY_EVENT_RETENTION_DAYS=7
數(shù)據(jù)存儲(chǔ)位置修改
在服務(wù)運(yùn)行過(guò)程中,會(huì)有大量的 log、Postgres 生成,這些數(shù)據(jù)都會(huì)掛在到 docker volume 中,volume 默認(rèn)掛在/var 目錄下,通常/var 目錄容量較小,隨著服務(wù)運(yùn)行內(nèi)存很容易被占滿,我們可以對(duì) docker volume 掛在目錄進(jìn)行修改
# 在容量最大的目錄下創(chuàng)建文件夾
mkdir -p /data/var/lib/
# 停止 docker 服務(wù)
systemctl stop docker
# 將 docker 的默認(rèn)數(shù)據(jù)復(fù)制到新路徑下,刪除舊數(shù)據(jù)并創(chuàng)建軟連接,即使得存儲(chǔ)實(shí)際占用磁盤(pán)為新路徑
/bin/cp -a /var/lib/docker /data/var/lib/docker && rm -rf /var/lib/docker && ln -s /data/var/lib/docker /var/lib/docker
# 重啟 docker 服務(wù)
systemctl start docker
六、術(shù)語(yǔ)
Event:事件。
每次產(chǎn)生的日志記錄,每個(gè)event有很多元信息,包括事件級(jí)別,項(xiàng)目信息,環(huán)境等??赏ㄟ^(guò)點(diǎn)擊具體事件對(duì)應(yīng)的“JSON”數(shù)據(jù)進(jìn)行查看Issue:?jiǎn)栴}。
相同的地方產(chǎn)生的一個(gè)異常稱(chēng)為一個(gè)Issue(是同一類(lèi)問(wèn)題的聚合)。假如在同一個(gè)位置發(fā)生了兩次報(bào)錯(cuò),那么會(huì)產(chǎn)生兩個(gè)Event事件,但是只有一個(gè)Issue。DSN:客戶端(具體項(xiàng)目)密鑰。
DSN是一個(gè)url,包含相關(guān)密鑰信息,客戶端與服務(wù)端(sentry服務(wù)器)就是通過(guò)這個(gè)DSN進(jìn)行通信,上報(bào)錯(cuò)誤信息的。Auth Token:授權(quán)令牌。
授權(quán)令牌允許基于你的賬戶使用Sentry API,我們主要用到使用@sentry/cli進(jìn)行上傳sourceMap文件等操作時(shí),sentry/cli會(huì)基于Auth Token進(jìn)行調(diào)用相應(yīng)API方法。Org:組織名稱(chēng)。
對(duì)應(yīng)公司部署的sentry服務(wù)器上的組織名稱(chēng)。Release:版本號(hào)。
Project:客戶端名稱(chēng)。(接入sentry的具體項(xiàng)目名)
Tag:標(biāo)簽。
七、錯(cuò)誤解決方案
Resolve
- 當(dāng)前版本解決:發(fā)完版本以后,修改issue狀態(tài)
- 下個(gè)版本解決:issue發(fā)現(xiàn)后馬上解決,代碼跟隨下個(gè)版本上線
- 其他版本:一般不使用該選項(xiàng)
Ignore
- 時(shí)間維度:xx時(shí)間之前忽略(可自定義時(shí)間)
- 數(shù)量維度:再出現(xiàn)xx次之前忽略
- 用戶維度:再有xx個(gè)用戶復(fù)現(xiàn)這個(gè)錯(cuò)誤之前忽略
八、使用技巧
主動(dòng)補(bǔ)貨并上報(bào)錯(cuò)誤
有時(shí)我們可能需要自己去主動(dòng)去觸發(fā)一些錯(cuò)誤上報(bào),比如一些特定操作、某些已經(jīng)被棄用的接口被調(diào)用了、捕獲一些線上運(yùn)行數(shù)據(jù)去排查問(wèn)題。可以利用 Sentry 提供過(guò)的 captureException 或者 captureMessage 去上報(bào)錯(cuò)誤或者文本信息。
豐富上報(bào)數(shù)據(jù)上下文
除了剛剛我們介入過(guò)程中提到的 user 用戶信息,還可以有tags、level、fingerprint、extra data。
比如添加一些 tags,可以使用 scope.setTags(前端,不同語(yǔ)言語(yǔ)法不一樣,如 Django 為 sentry_sdk.set_context) 可以給事件定義不同的鍵/值對(duì)。我們?cè)诤笈_(tái)查找的時(shí)候,篩選條件選項(xiàng)會(huì)多出來(lái)一些選項(xiàng),就是通過(guò) setTags 來(lái)設(shè)置的這些鍵值對(duì)。
參考文章列表:
https://jiankunking.com/sentry-high-availability-deploy.html [sentry高可用的思考]
https://zhuanlan.zhihu.com/p/343268881
掘金網(wǎng)站的一些文章,偏向于前端監(jiān)控。
https://juejin.cn/post/6954303116783124487
https://juejin.cn/post/6956100572239888398
https://juejin.cn/post/6957475955858210823#heading-6
https://juejin.cn/post/6979874801091346440
https://juejin.cn/post/6844903731083870215
java后端的接入文章比較多,官方也提供了starter接入,注意版本兼容情況。
https://segmentfault.com/a/1190000039131388
