Sentry 監(jiān)控-私有 Docker Compose 部署與故障排除詳解
本文轉(zhuǎn)載自微信公眾號(hào)「黑客下午茶」,作者為少 。轉(zhuǎn)載本文請(qǐng)聯(lián)系黑客下午茶公眾號(hào)。
自托管 Sentry
除了公開(kāi)提供其源代碼外,Sentry 還提供并維護(hù)了一個(gè)最小的設(shè)置,可以為簡(jiǎn)單的用例開(kāi)箱即用。該存儲(chǔ)庫(kù)還可以作為各種 Sentry 服務(wù)如何連接以進(jìn)行完整設(shè)置的藍(lán)圖,這對(duì)于愿意維護(hù)更大安裝的人很有用。為簡(jiǎn)單起見(jiàn),我們?yōu)榇诉x擇使用 Docker 和 Docker Compose, 以及基于 bash 的安裝和升級(jí)腳本。
入門(mén)
我們的建議是下載自托管存儲(chǔ)庫(kù)的最新版本, 然后在此目錄中運(yùn)行 ./install.sh。這個(gè)腳本會(huì)處理你開(kāi)始需要的所有事情,包括一個(gè) base-line 配置, 然后會(huì)告訴你運(yùn)行 docker-compose up -d 來(lái)啟動(dòng) Sentry。 Sentry 默認(rèn)綁定到端口 9000。您應(yīng)該能夠訪問(wèn) http://127.0.0.1:9000 上的登錄頁(yè)面。
https://github.com/getsentry/self-hosted/releases/latest
配置
您很可能希望調(diào)整 Sentry 的默認(rèn)配置。這些設(shè)施可用于此目的:
sentry/config.yml — 包含大多數(shù)(如果不是全部)要調(diào)整的配置選項(xiàng)。這個(gè)文件是在安裝時(shí)從 sentry/config.example.yml 生成的。該文件本身將最常見(jiàn)的配置選項(xiàng)記錄為代碼注釋。此文件中的一些常用設(shè)置包括:
- system.url-prefix(我們會(huì)在安裝后立即提示您在歡迎屏幕上進(jìn)行設(shè)置)
- mail.*(雖然我們提供了一個(gè)基本的 SMTP 服務(wù)器)
- GitHub、Slack 等的集成。
sentry/sentry.conf.py—包含更高級(jí)的配置。這個(gè)文件是在安裝過(guò)程中從 sentry/sentry.conf.example.py 生成的。
- https://github.com/getsentry/self-hosted/blob/master/sentry/sentry.conf.example.py
環(huán)境變量—可用的 key 在 .env 中定義。如果您需要覆蓋任何環(huán)境變量,請(qǐng)使用一些與系統(tǒng)相關(guān)的方法來(lái)設(shè)置環(huán)境變量。為避免 Git 更改,只需創(chuàng)建一個(gè)名為 .env.custom 的文件并在其中插入與系統(tǒng)相關(guān)的環(huán)境變量。為了使用它,請(qǐng)使用 docker-compose --env-file /path/to/.env.custom up -d。
Geolocation 使用自定義配置文件來(lái)符合底層技術(shù)。
注意:更改配置后,您需要通過(guò)運(yùn)行 docker-compose restart web worker cron sentry-cleanup(或僅 docker-compose restart 重新啟動(dòng)所有內(nèi)容)來(lái)重新啟動(dòng)所有 Sentry 服務(wù)。
配置特定主題
以下是與自托管相關(guān)的特定配置主題的更多信息:
- 自定義 CA 根
- 地理位置
- 單點(diǎn)登錄 (SSO)
產(chǎn)品化
我們強(qiáng)烈建議在綁定到專(zhuān)用域或子域的 Sentry 設(shè)置前使用專(zhuān)用負(fù)載均衡器。一個(gè)執(zhí)行 SSL/TLS 終止的專(zhuān)用負(fù)載平衡器也將客戶(hù)端 IP 地址轉(zhuǎn)發(fā)為 Docker Compose 內(nèi)部網(wǎng)絡(luò) (因?yàn)檫@幾乎不可能以其他方式獲得)將為您提供最佳的 Sentry 體驗(yàn)。作為此設(shè)置的一部分,我們建議使用 HTTP 協(xié)議針對(duì) /_health/ 端點(diǎn)配置負(fù)載均衡器運(yùn)行狀況檢查。如果 Sentry 啟動(dòng),這將返回 200 或帶有問(wèn)題列表的 500。
請(qǐng)記住,所有這些設(shè)置都對(duì)所有服務(wù)使用單節(jié)點(diǎn),包括 Kafka。對(duì)于更大的負(fù)載,您需要一臺(tái)具有大量 RAM 和磁盤(pán)存儲(chǔ)空間的強(qiáng)大機(jī)器。為了進(jìn)一步擴(kuò)展,您很可能會(huì)使用帶有更復(fù)雜工具(例如 Kubernetes)的集群。由于自托管安裝的自定義性質(zhì),我們不提供任何有關(guān)擴(kuò)展的建議或指導(dǎo)。
https://github.com/getsentry/self-hosted/issues/554
自托管發(fā)布和升級(jí)
Sentry 減少了自托管的定期發(fā)布,以使其盡可能接近 sentry.io。我們決定遵循使用 CalVer 版本控制方案的月度發(fā)布計(jì)劃。 每個(gè)月的 15 號(hào)發(fā)布一個(gè)新版本,并在必要時(shí)進(jìn)行后續(xù)發(fā)布。您可以在我們自托管存儲(chǔ)庫(kù)的發(fā)布部分 找到最新版本。
- https://calver.org/#scheme
- https://github.com/getsentry/self-hosted/releases
為什么選擇 CalVer?
- 簡(jiǎn)而言之,這是為了讓自托管的 Sentry 與在 sentry.io 托管的實(shí)時(shí)版本接近。在我們宣布切換的博客文章中,有更多細(xì)節(jié)可供參考。
- https://blog.sentry.io/2020/06/22/self-hosted-sentry-switching-to-calver
- CalVer 針對(duì)持續(xù)部署進(jìn)行了優(yōu)化,而非長(zhǎng)期穩(wěn)定性。我們建議您定期升級(jí),就像我們?cè)?SaaS 環(huán)境中所做的那樣。
升級(jí)
我們鼓勵(lì)每個(gè)人定期更新他們的 Sentry 安裝以獲得最佳和最新的 Sentry 體驗(yàn)。
要升級(jí),您需要做的就是下載或檢查您想要的自托管存儲(chǔ)庫(kù)的版本,用該版本替換現(xiàn)有文件夾的內(nèi)容,然后運(yùn)行 ./install.sh。
配置更新
我們可能有一些更新的配置,特別是對(duì)于新功能,因此請(qǐng)始終檢查 sentry 目錄下的示例配置文件,看看是否需要更新現(xiàn)有配置。我們盡最大努力自動(dòng)化關(guān)鍵配置更新,但您應(yīng)該始終在升級(jí)期間檢查您的配置。
在開(kāi)始升級(jí)之前,我們關(guān)閉了所有服務(wù),然后運(yùn)行了一些數(shù)據(jù)遷移,因此預(yù)計(jì)會(huì)有一些停機(jī)時(shí)間。有一個(gè)實(shí)驗(yàn)性的 --minimize-downtime 選項(xiàng)可以減少升級(jí)期間的停機(jī)時(shí)間。使用它的風(fēng)險(xiǎn)由您自己承擔(dān),并查看它在其中實(shí)施的PR以獲取更多信息。
- https://github.com/getsentry/self-hosted/issues/607
從早期版本升級(jí)時(shí),您需要經(jīng)歷一些困難。請(qǐng)閱讀下面的 難點(diǎn) 部分以獲取列表。
難點(diǎn)
我們有三個(gè)難點(diǎn),您需要通過(guò)這些步驟才能獲取重大的數(shù)據(jù)庫(kù)更改:
如果您來(lái)自 9.1.2 之前的版本,則首先需要升級(jí)到 9.1.2 并按照以下步驟操作:
- <your.sentry.version> -> 9.1.2 -> 21.5.0 -> 21.6.3 -> latest
如果您來(lái)自 9.1.2,首先需要升級(jí)到 21.5.0 并按照以下步驟操作:
- <your.sentry.version> -> 21.5.0 -> 21.6.3 -> latest
如果您來(lái)自 21.6.3 之前的版本,則首先需要升級(jí)到 21.6.3:
- <your.sentry.version> -> 21.6.3 -> latest
任何其他情況(21.6.3+),你應(yīng)該可以直接升級(jí)到最新版本。
每晚構(gòu)建
我們?yōu)?Sentry 的每個(gè)新提交以及所有支持項(xiàng)目提供自托管存儲(chǔ)庫(kù)的 master 分支的每晚構(gòu)建:
- Snuba
https://github.com/getsentry/snuba
- Relay
https://github.com/getsentry/relay
- Symbolicator
https://github.com/getsentry/symbolicator
注意:這些構(gòu)建通常是穩(wěn)定的,但您可能偶爾會(huì)遇到損壞的版本,因?yàn)檫@些版本不能保證首先部署到 sentry.io。也不能保證您能夠干凈地升級(jí)到更高版本而不會(huì)丟失任何數(shù)據(jù)。使用每晚構(gòu)建的風(fēng)險(xiǎn)自負(fù)。
自托管備份和恢復(fù)
快速備份
如果您需要一種快速備份和恢復(fù) Sentry 實(shí)例的方法,并且不需要?dú)v史事件數(shù)據(jù), 則可以使用內(nèi)置的 export 和 import 命令。這些命令將保存和加載所有項(xiàng)目和用戶(hù)數(shù)據(jù),但不包含任何事件數(shù)據(jù)。
備份
- docker-compose run --rm -T -e SENTRY_LOG_LEVEL=CRITICAL web export > sentry/backup.json
注意:如果您省略了 -T 或 -e SENTRY_LOG_LEVEL=CRITICAL 部分,您的備份文件將混入日志行,您必須以某種方式將其刪除。
恢復(fù)
使用 export 命令備份后,恢復(fù)它的最簡(jiǎn)單方法是將其放在主 self-hosted 存儲(chǔ)庫(kù)中的 sentry 目錄下,在配置文件旁邊。這個(gè)目錄會(huì)自動(dòng)掛載到 /etc/sentry,所以你可以運(yùn)行以下命令來(lái)恢復(fù)你的備份:
- docker-compose run --rm -T web import /etc/sentry/backup.json
如果您沒(méi)有看到任何錯(cuò)誤并且進(jìn)程以代碼 0 退出,那么恭喜您,您剛剛恢復(fù)了備份。
注意:我們強(qiáng)烈建議您在全新安裝(空數(shù)據(jù)庫(kù)但運(yùn)行遷移)時(shí)在 相同版本的 Sentry 上恢復(fù)備份。否則,您很可能會(huì)遇到錯(cuò)誤并可能損壞您的數(shù)據(jù)庫(kù)。
完整備份
備份和恢復(fù) Sentry 的理想方法是備份和恢復(fù)它使用的所有 Docker 卷。所有保存關(guān)鍵長(zhǎng)期數(shù)據(jù)的卷在安裝時(shí)都已定義為全局卷,并以 sentry- 為前綴:
- sentry-data
- sentry-postgres
- sentry-redis
- sentry-zookeeper
- sentry-kafka
- sentry-clickhouse
- sentry-symbolicator
注意:只有備份和恢復(fù)這些卷才能恢復(fù)所有持久化數(shù)據(jù)。如果您還需要備份運(yùn)行中的數(shù)據(jù),我們建議備份 docker-compose 自動(dòng)創(chuàng)建的任何特定于項(xiàng)目的卷,通常使用 sentry_self_hosted_sentry- 前綴。
Docker 在他們的文檔中記錄了如何備份和恢復(fù)卷。只要可以毫無(wú)問(wèn)題地讀回卷,您就可以使用不同的方法。
https://docs.docker.com/storage/volumes/#backup-restore-or-migrate-data-volumes
自托管的自定義 CA 根
從 Sentry 21.8.0 開(kāi)始,如果您需要沒(méi)有來(lái)自公共信任 CA 根的 TLS 證書(shū)的 Sentry 訪問(wèn)服務(wù),現(xiàn)在可以輕松地將它們添加到容器中。只需將證書(shū)添加到 Sentry 安裝根目錄內(nèi)的 certificates 文件夾中,然后重新啟動(dòng)容器。除了公共信任的 CA 根之外,還將使用您的自定義 CA 根。
注意:雖然您可以在每個(gè)容器中運(yùn)行 update-ca-certificates,但這將更新磁盤(pán)上系統(tǒng)的根包,但不會(huì)對(duì)內(nèi)存中的任何副本執(zhí)行任何操作。重新啟動(dòng)容器將更新包并確保它被使用。
如果給定的證書(shū)有問(wèn)題,容器的日志將在開(kāi)始時(shí)具有 update-ca-certificates 的輸出。
- https://manpages.debian.org/buster/ca-certificates/update-ca-certificates.8.en.html
具有捆綁根的依賴(lài)項(xiàng)
一些依賴(lài)項(xiàng)選擇捆綁自己的 CA 根并忽略系統(tǒng) CA 根。在已知的情況下,它們已被配置為使用系統(tǒng)根。如果某些東西似乎忽略了系統(tǒng)根,請(qǐng)創(chuàng)建一個(gè) issue, 以便對(duì)其進(jìn)行跟蹤和修復(fù)。
- https://github.com/getsentry/self-hosted/issues/new?template=problem-report.yml
覆蓋的捆綁根
- Python
- requests
- botocore
- grpc
自托管 Email
注意:請(qǐng)記住,一旦更改設(shè)置,您就需要重新啟動(dòng)所有 Sentry 服務(wù)。有關(guān)更多信息,請(qǐng)參閱配置部分。
出站 Email
自托管 Sentry 附帶一個(gè)由 exim4 提供支持的內(nèi)置外發(fā) SMTP server。默認(rèn)配置設(shè)置為使用此服務(wù)器。您需要做的就是為 config.yml 中的 mail.from 設(shè)置設(shè)置一個(gè)有效地址, 并為 .env 中的 SENTRY_MAIL_HOST 設(shè)置 Sentry 實(shí)例的 FQDN。請(qǐng)記住,如果您開(kāi)始向公共地址發(fā)送過(guò)多電子郵件,您的新服務(wù)器可能會(huì)被標(biāo)記為垃圾郵件發(fā)送者并被禁止。
- https://hub.docker.com/r/tianon/exim4
- https://en.wikipedia.org/wiki/Fully_qualified_domain_name
如果您想使用外部 SMTP server,您可以在 config.yml 文件中設(shè)置相關(guān)的 mail.* 設(shè)置并忽略?xún)?nèi)置的 SMTP server。有關(guān)每個(gè)設(shè)置的含義和作用的所有詳細(xì)信息,請(qǐng)參閱我們的電子郵件服務(wù)文檔。
由于配置的分層方式,如果您通過(guò) Web 界面更新 mail 設(shè)置,您還需要注釋掉 config.yml 中的 mail.host: 'smtp' 默認(rèn)值,以便選擇所需的設(shè)置。
入站 Email
Sentry 通過(guò) Mailgun 提供的入站 mail 支持非常有限。您可以在我們的入站 email 服務(wù)文檔中找到有關(guān)如何進(jìn)行設(shè)置的所有信息。
https://documentation.mailgun.com/en/latest/quickstart-receiving.html
自托管地理定位
Sentry 可以使用 MaxMind 的免費(fèi) GeoLite2-City 數(shù)據(jù)庫(kù)來(lái)對(duì) IP 地址進(jìn)行地理定位, 為已知最終用戶(hù) IP 地址的錯(cuò)誤事件以及登錄 Sentry 安裝的用戶(hù)的會(huì)話(huà)歷史記錄提供額外的上下文。為此,我們捆綁了 MaxMind 的 geoipupdate 工具。
- https://dev.maxmind.com/geoip/geoip2/geolite2/
- https://hub.docker.com/r/maxmindinc/geoipupdate
為了利用服務(wù)器端 IP 地址地理定位,您必須首先將 IP 地址發(fā)送到 Sentry。 默認(rèn)情況下,較新的 SDK 不會(huì)執(zhí)行此操作。
- https://docs.sentry.io/platforms/python/data-management/sensitive-data/#personally-identifiable-information-pii
要啟用服務(wù)器端 IP 地址地理定位,請(qǐng)注冊(cè)一個(gè)免費(fèi)的 MaxMind 帳戶(hù), 然后通過(guò)將您的 MaxMind 配置文件放在 geoip/GeoIP.conf 來(lái)告訴 Sentry 您的憑據(jù)。
- https://www.maxmind.com/en/geolite2/signup
- AccountID 012345
- LicenseKey foobarbazbuz
- EditionIDs GeoLite2-City
有了這個(gè)配置文件,Sentry 的 install.sh 的后續(xù)運(yùn)行將刷新 IP 地址地理定位數(shù)據(jù)庫(kù)。下次您重新啟動(dòng)自托管的 Sentry 實(shí)例(特別是 relay 和 web 服務(wù))時(shí),您應(yīng)該會(huì)看到最新的數(shù)據(jù)。以下是確認(rèn)它是否正常工作的方法:
- 對(duì)于 relay 服務(wù):Dashboards > Errors by Country 上應(yīng)該有一些紫色。
- 對(duì)于 web 服務(wù):User Settings > Security > Session History 應(yīng)在表中的 IP 地址下方顯示國(guó)家代碼和地區(qū)(例如,"US (CA)")。
啟動(dòng)后不久看到 sentry_self_hosted_geoipupdate_1 容器退出是正常的,因?yàn)楦碌乩矶ㄎ粩?shù)據(jù)庫(kù)是一次性的批處理過(guò)程,而不是長(zhǎng)時(shí)間運(yùn)行的 job。
升級(jí)
使用 GeoLite2-City.mmdb 文件的服務(wù)需要知道在哪里可以找到它。新安裝將自動(dòng)設(shè)置此設(shè)置,但如果您要升級(jí),則需要在重新啟動(dòng) Sentry 之前手動(dòng)設(shè)置以下內(nèi)容。
在 relay/config.yml 中(示例):
- https://github.com/getsentry/self-hosted/blob/master/relay/config.example.yml
- processing:
- geoip_path: "/geoip/GeoLite2-City.mmdb"
在 sentry/sentry.conf.py 中(示例):
- https://github.com/getsentry/self-hosted/blob/master/sentry/sentry.conf.example.py
- GEOIP_PATH_MMDB = '/geoip/GeoLite2-City.mmdb'
自托管單點(diǎn)登錄 (SSO)
Sentry 中的 SSO 以?xún)煞N方式之一處理:
- 通過(guò)處理上游代理的中間件來(lái)指示經(jīng)過(guò)身份驗(yàn)證的用戶(hù)
- 通過(guò)實(shí)現(xiàn)身份驗(yàn)證管道的第三方服務(wù)
使用中間件代理 (SAML2)
從 Sentry 20.6.0 開(kāi)始,自托管 Sentry 內(nèi)置了對(duì) SAML2 和某些身份驗(yàn)證提供程序的支持。對(duì)于舊版本,您需要在運(yùn)行 ./install.sh 之前將以下行添加到 sentry/requirements.txt:
- https://github.com/getsentry/self-hosted/blob/10.0.1/sentry/requirements.example.txt
- sentry-auth-saml2@https://github.com/getsentry/sentry-auth-saml2/archive/master.zip#egg=sentry-auth-saml2
您可以設(shè)置它的方式與 sentry.io 相同,除了您需要為文檔中提到的 URL 使用自己實(shí)例的 url-prefix。
- https://develop.sentry.dev/config/#general
有關(guān)所有詳細(xì)信息,請(qǐng)參閱我們的主要 SAML 文檔。
- https://docs.sentry.io/accounts/sso/#saml2-identity-provider
使用 OAuth 的單點(diǎn)登錄
注意:?jiǎn)⒂?SSO 后,這將是登錄到自托管實(shí)例的唯一方法。如果您需要與 SSO 一起免費(fèi)注冊(cè),您可以在 GitHub PR 上對(duì)此發(fā)表評(píng)論。
- https://github.com/getsentry/sentry/pull/16247
Google Auth
從 Sentry 9.1 開(kāi)始,自托管的 Sentry 帶有內(nèi)置的 Google Auth 支持。要啟用,您需要為您的 Google App 創(chuàng)建一個(gè) client ID 和 secret, 然后將這些值分別輸入到您的 sentry/config.yaml 文件中:
- auth-google.client-id: '<client id>'
- auth-google.client-secret: '<client secret>'
注意:請(qǐng)記住,一旦更改設(shè)置,您就需要重新啟動(dòng)所有 Sentry 服務(wù)。有關(guān)更多信息,請(qǐng)參閱配置部分。
- https://developers.google.com/identity/sign-in/web/server-side-flow#step_1_create_a_client_id_and_client_secret
- https://github.com/getsentry/self-hosted/blob/master/sentry/config.example.yml
GitHub Auth
從 Sentry 10 開(kāi)始, 自托管 Sentry 帶有內(nèi)置的 GitHub Auth 支持。要啟用,您需要在您的組織下創(chuàng)建一個(gè)新的 GitHub App 并安裝它。
為 SSO & integration 創(chuàng)建 GitHub App
GitHub App 名稱(chēng)不得包含任何空格。
如果上面的表單對(duì)您不起作用,您需要為您的 GitHub 應(yīng)用程序進(jìn)行以下設(shè)置:
Setting | Value |
---|---|
Homepage URL | ${urlPrefix} |
User authorization callback URL | ${urlPrefix}/auth/sso/ |
Setup URL (optional) | ${urlPrefix}/extensions/github/setup/ |
Webhook URL | ${urlPrefix}/extensions/github/webhook/ |
不要忘記將所有出現(xiàn)的 {'${urlPrefix}'} 替換為您自己的 url 前綴。
當(dāng)提示輸入權(quán)限時(shí),請(qǐng)選擇以下選項(xiàng):
Permission | Setting |
---|---|
Organization permissions / members | Read-only |
User permissions / Email addresses | Read-only |
Repository administration | Read-only |
Repository contents | Read-only |
Issues | Read & write |
Pull requests | Read & write |
Repository webhooks | Read & write |
使用您的 GitHub App 信息更新您的配置
然后,您需要設(shè)置以下配置值:
在 sentry/sentry.conf.py 中
- GITHUB_APP_ID="<App ID>"
- GITHUB_API_SECRET="<Client secret>"
- GITHUB_REQUIRE_VERIFIED_EMAIL = True # Optional but recommended
- # Only if you are using GitHub Enterprise
- #GITHUB_BASE_DOMAIN = "git.example.com"
- #GITHUB_API_DOMAIN = "api.git.example.com"
在 sentry/config.yaml 中
- # github-app.id: <App ID>
- # github-app.name: '<GitHub App name>'
- # github-app.webhook-secret: '<Webhook secret>' # Use only if configured in GitHub
- # github-app.client-id: '<Client ID>'
- # github-app.client-secret: '<Client secret>'
- # github-app.private-key: |
- # -----BEGIN RSA PRIVATE KEY-----
- # privatekeyprivatekeyprivatekeyprivatekey
- # privatekeyprivatekeyprivatekeyprivatekey
- # privatekeyprivatekeyprivatekeyprivatekey
- # privatekeyprivatekeyprivatekeyprivatekey
- # privatekeyprivatekeyprivatekeyprivatekey
- # -----END RSA PRIVATE KEY-----
這還將為您的實(shí)例啟用 GitHub Integration。
注意:請(qǐng)記住,一旦更改設(shè)置,您就需要重新啟動(dòng)所有 Sentry 服務(wù)。有關(guān)更多信息,請(qǐng)參閱配置部分。
自定義 Provider
目前,API 被認(rèn)為是不穩(wěn)定的,可能會(huì)發(fā)生變化。事情可能不會(huì)有太大變化,但有一些地方需要清理。
考慮到這一點(diǎn),如果您想構(gòu)建自己的,請(qǐng)查看上面的參考實(shí)現(xiàn)之一。
- https://github.com/getsentry/sentry/tree/master/src/sentry/auth/providers
自托管故障排除
請(qǐng)記住,自托管存儲(chǔ)庫(kù)面向中低負(fù)載,并考慮到了簡(jiǎn)單性。需要更大設(shè)置或有事件高峰的人們可以根據(jù)他們的特定需求和環(huán)境從這里擴(kuò)展。
- https://github.com/getsentry/self-hosted
常見(jiàn)
您可以通過(guò)運(yùn)行 docker-compose logs
- https://docs.docker.com/compose/reference/logs/
Kafka
最有可能導(dǎo)致問(wèn)題的事情之一是 Kafka。最常報(bào)告的錯(cuò)誤是
- Exception: KafkaError{code=OFFSET_OUT_OF_RANGE,val=1,str="Broker: Offset out of range"}
這發(fā)生在 Kafka 和 consumer 不同步的地方。可能的原因有:
- 磁盤(pán)空間或內(nèi)存不足
- 持續(xù)的事件峰值會(huì)導(dǎo)致很長(zhǎng)的處理時(shí)間,導(dǎo)致 Kafka 在超過(guò)保留時(shí)間時(shí)丟棄消息
- 由于重新啟動(dòng)或 suspend/resume(暫停/恢復(fù)) 循環(huán)導(dǎo)致的 Date/time(日期/時(shí)間) 不同步問(wèn)題
恢復(fù)
正確的解決方案
正確 的解決方案如下 (reported by @rmisyurev):
接收消費(fèi)者列表:
- docker-compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --list
獲取群組信息:
- docker-compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --group snuba-consumers -describe
使用試運(yùn)行(可選)觀察 offset 會(huì)發(fā)生什么:
- docker-compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --group snuba-consumers --topic events --reset-offsets --to-latest --dry-run
將 offset 設(shè)置為最新并執(zhí)行:
- docker-compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --group snuba-consumers --topic events --reset-offsets --to-latest --execute
您可以在需要時(shí)將 snuba-consumers 替換為其他 consumer groups 或其他 topics 的 events。
- https://github.com/getsentry/self-hosted/issues/478#issuecomment-666254392
硬核選項(xiàng)
硬核選項(xiàng) 是刪除所有與 Kafka 相關(guān)的卷并重新創(chuàng)建它們,這將導(dǎo)致數(shù)據(jù)丟失。刪除這些卷后,任何掛起的數(shù)據(jù)都_將_消失。
停止實(shí)例:
- docker-compose down --volumes
刪除 Kafka & Zookeeper 相關(guān)卷:
- docker volume rm sentry-kafka
- docker volume rm sentry-zookeeper
再次運(yùn)行安裝腳本:
- ./install.sh
啟動(dòng)實(shí)例:
- docker-compose up -d
減少磁盤(pán)使用
如果你想減少 Kafka 使用的磁盤(pán)空間,你需要仔細(xì)計(jì)算你攝取的數(shù)據(jù)量,你可以容忍的數(shù)據(jù)丟失量, 然后按照這個(gè)很棒的 StackOverflow 帖子或 我們社區(qū)論壇上的帖子中的建議進(jìn)行操作。
- https://stackoverflow.com/a/52970982/90297
- https://forum.sentry.io/t/sentry-disk-cleanup-kafka/11337/2?u=byk
Redis
在自托管設(shè)置中,Redis 既用作事務(wù)數(shù)據(jù)存儲(chǔ)又用作 Celery 的工作隊(duì)列。出于這個(gè)原因,它可能會(huì)在事件高峰期間不堪重負(fù)。從版本 20.10.1 開(kāi)始,我們對(duì)此進(jìn)行了一些重大改進(jìn)。如果您仍然遇到問(wèn)題,您可以考慮擴(kuò)展 Redis 本身或切換到不同的 Celery broker,例如 RabbitMQ。
Workers
如果您看到錯(cuò)誤,例如
- Background workers haven’t checked in recently. It seems that you have a backlog of 200 tasks. Either your workers aren’t running or you need more capacity.
您可能會(huì)從使用額外的專(zhuān)職工作人員中受益。這是通過(guò)在 docker-compose.override.yml 中創(chuàng)建新的 worker 服務(wù)并使用 -Q queue_name 參數(shù)將它們綁定到特定隊(duì)列來(lái)實(shí)現(xiàn)的。一個(gè)例子是:
- worker1:
- << : *sentry_defaults
- command: run worker -Q events.process_event
要查看更完整的示例,請(qǐng)參閱我們社區(qū)論壇上的示例解決方案。
- https://forum.sentry.io/t/how-to-clear-backlog-and-monitor-it/10715/14?u=byk
Postgres
Postgres 用于主數(shù)據(jù)存儲(chǔ),以及用于存儲(chǔ) key/value 數(shù)據(jù)的 nodestore。 node_nodestore 表可以快速增長(zhǎng),尤其是在大量使用性能監(jiān)控功能時(shí),因?yàn)楦檾?shù)據(jù)存儲(chǔ)在該表中。
- https://develop.sentry.dev/services/nodestore/
node_nodestore 表作為 cleanup 任務(wù)的一部分被清理, 但是 Postgres 可能沒(méi)有機(jī)會(huì)清理表(尤其是在重載情況下),所以即使行可能被刪除,它們?nèi)匀粫?huì)占用磁盤(pán)空間。
您可以使用 pg-repack,它通過(guò)創(chuàng)建一個(gè)新表并在刪除舊表之前復(fù)制數(shù)據(jù)來(lái)重新打包一個(gè)表。您需要在清理腳本之后運(yùn)行它,并注意它在創(chuàng)建表時(shí),磁盤(pán)使用量會(huì)在回落之前激增。
下面是一個(gè)腳本示例:
- # Only keep the last 7 days of nodestore data. We heavily use performance monitoring.
- docker-compose run -T web cleanup --days 7 -m nodestore -l debug
- # This ensures pg-repack exists before running as the container gets recreated on upgrades
- docker-compose run -T postgres bash -c "apt update && apt install -y --no-install-recommends postgresql-9.6-repack && su postgres -c 'pg_repack -E info -t nodestore_node'"
其他
如果您仍然遇到問(wèn)題,您可以隨時(shí)訪問(wèn)我們的社區(qū)論壇以搜索現(xiàn)有主題或創(chuàng)建新主題并尋求幫助。請(qǐng)記住,我們希望社區(qū)能夠幫助自己,并且 Sentry 員工也會(huì)在有時(shí)間時(shí)嘗試監(jiān)控和回答論壇問(wèn)題。
- https://forum.sentry.io/
在報(bào)告問(wèn)題或在論壇上提問(wèn)時(shí)共享您的安裝日志、服務(wù)日志和 Sentry 版本將為您和試圖幫助您的人節(jié)省時(shí)間和精力。
- https://github.com/getsentry/self-hosted/issues/new/choose