Sentry的應(yīng)用接入與部署運(yùn)維

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)目集成在一起。
image.png

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

image.png

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ù)列表:


image.png

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

sentry.png

五、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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容