Linux下部署Sentry服務


Ubuntu下Sentry部署

Sentry作為一款常見以及使用人數較多的監控服務,在接口監控、錯誤捕捉、錯誤報警等方面是非常不錯的,在此之前我也用過Prometheus監控,各有各的好處,有興趣的同學可以對這些都了解一下。

安裝docker

apt install curl -y
sh -c "$(curl -fsSL https://get.docker.com)"
systemctl start docker
systemctl enable docker

安裝docker-compose

# 下載 docker-compose 
wget https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64
# 移到 /usr/local/bin/docker-compose
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
# 給 docker-compose 執行權限
sudo chmod +x /usr/local/bin/docker-compose

下載安裝sentry

wget https://github.com/getsentry/onpremise/archive/refs/tags/21.4.1.tar.gz

tar -zxvf 21.4.1.tar.gz

cd onpremise-21.4.1/

修改 /sentry/config.yml,注意郵箱的tls和ssl只能一個為true

mail.host: 'smtp.exmail.qq.com'
mail.port: 465
mail.username: 'xxx@xxx.com'
mail.password: 'xxx'
mail.use-tls: false
mail.use-ssl: true
#The email address to send on behalf of
mail.from: 'xxx@xxx.com'

修改.env文件,在末尾添加數據自動清理時間,默認90天太長了,不設置也沒關系

SENTRY_EVENT_RETENTION_DAYS=14

執行 :

./install.sh

中途會讓創建用戶

然后執行:

docker-compose up -d

如果想停止sentry服務,執行:

docker-compose down

sentry數據清理

sentry服務部署一段時間后發現剩余磁盤空間越來越小,尋找了很多解決方案,以下兩個方案供參考。

方法一

實際上最大的數據是postgres里一個不斷增長的表public.nodestore_node,一般發現的時候磁盤基本都被它滿了,所以百度到的通用解決方案可能並沒有辦法執行,所以我們直接將它TRUNCATE掉即可,清空后不會影響后續的業務就行。

#首先進入postgres容器
docker exec -it sentry_onpremise_postgres_1  /bin/bash

#切換用戶
su postgres

#進入postgres
psql

#清空這個害人的表
TRUNCATE public.nodestore_node;

#在清理前后可以查看下這個表占用的空間
SELECT
    table_schema || '.' || table_name AS table_full_name,
    pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC limit 20;

方法二

下方是百度到排名靠前的解決方案,在執行第二步時剩余磁盤空間不足會出現問題,在此記錄作為參考。

1、SENTRY數據軟清理 (清理完不會釋放磁盤,如果很長時間沒有運行,清理時間會很長)

#登錄worker容器
docker exec -it sentry_onpremise_worker_1 /bin/bash 

#保留多少天的數據,cleanup使用delete命令刪除postgresql數據,但對於delete,update等操作,只是將對應行標志為DEAD,並沒有真正釋放磁盤空間
sentry cleanup --days 7

2、POSTGRES數據清理 (清理完后會釋放磁盤空間)

 #登錄postgres容器
docker exec -it sentry_onpremise_postgres_1  /bin/bash

#運行清理
vacuumdb -U postgres -d postgres -v -f --analyze
vacuumdb -U postgres -d postgres -t nodestore_node -v -f --analyze

3、定時清理腳本

0 1 * * * cd /data1/onpremise && { time docker-compose run --rm worker cleanup --days 7; } &> /var/log/cleanup.log
0 8 * * * { time docker exec -i $(docker ps --format "table {{.Names}}"|grep postgres) vacuumdb -U postgres -d postgres -v -f --analyze; } &> /data1/logs/vacuumdb.log

4、異常處理

因為磁盤已經被占滿,所以上面的清理命令也執行不動了,沒辦法只能自己尋找大文件臨時刪除一些,於是找到了下面的大文件

/var/lib/docker/volumes/sentry-kafka/_data/events-0/*.log

看着是 .log結尾的文件,而且很大,就直接刪除了,結果發現重啟后,sentry無法正常收到上報了。

參考:https://forum.sentry.io/t/sentry-disk-cleanup-kafka/11337

沒辦法,只能重新安裝

cd /data1/onpremise
./install.sh
重新啟動生效,重新安裝不會清理原有數據,所以不備份也沒關系

docker-compose down
docker-compose build
docker-compose up -d

5、清理kafka占用磁盤過大的問題
清理kafka占用磁盤過大的問題搜到可以配置 .env,如下,但是我的沒有效果

KAFKA_LOG_RETENTION_HOURS=24
KAFKA_LOG_RETENTION_BYTES=53687091200 #50G
KAFKA_LOG_SEGMENT_BYTES=1073741824 #1G
KAFKA_LOG_RETENTION_CHECK_INTERVAL_MS=300000
KAFKA_LOG_SEGMENT_DELETE_DELAY_MS=60000
於是自己研究,首先進入kafka的容器

docker exec -it sentry_onpremise_kafka_1 /bin/bash

查看topics

kafka-topics --list --zookeeper zookeeper:2181

修改kafka配置文件

vi server.propertyies

修改為7小時 默認168

log.retention.hours=7
log.cleaner.enable=true
log.cleanup.policy=delete
log.cleanup.interval.mins=1

重啟

kafka-server-stop
kafka-server-start -daemon
重啟后過了一會也沒效果,第二天才看到效果,具體原因有待研究,再去查看目錄的大小,發小從20G下降到12G左右

cd /var/lib/docker/volumes/sentry-kafka/_data/events-0
du -h --max-depth=1
ls -alh # 日期最小的是3天前的日志:00000000000000146071.log
docker容器沒有vi命令的解決方案

apt-get update
apt-get install vim

6、官方解決方案
其實官方已經提供了解決方案,修改 .env文件的以下配置

SENTRY_EVENT_RETENTION_DAYS=7
重新安裝即可

詳情參考:https://github.com/getsentry/onpremise

后記

安裝報錯

如果安裝遇到了如下報錯:

...
Creating network "sentry_onpremise_default" with the default driver
Cannot create container for service zookeeper: open /mnt/docker/volumes/sentry_onpremise_sentry-zookeeper-log/_data: no such file or directory
An error occurred, caught SIGERR on line 3
Cleaning up...
...

解決思路:

  1. 先查看是否有文件操作的權限,可切換root用戶重試。

  2. 有權限還出現這樣問題,如果不是文件缺失,那可能就是掛載卷出了問題

    # 查看docker掛載卷
    docker volume ls
    # 刪除無主掛載卷
    docker volume prune
    

    然后重新安裝即可。

數據備份

上方有數據清理的方案,但只是本機操作,如果想從一台機器遷移到另一台機器還是有着不小的麻煩,直接拷貝掛載卷或許是一個可行的辦法(我一開始就是這么干的),但實際上官方提供了更為簡潔的數據備份方案,有興趣可查看[說明文檔](Self-Hosted Backup & Restore | Sentry Developer Documentation):

  • 快速備份:使用sentry提供的export命令,備份只包括配置數據,而不包括歷史event數據
  • 完整備份:將’sentry-'開頭的所有容器進行備份,這種備份方式能備份所有歷史event數據

一般來說,歷史數據基本沒有什么用,除非還要往前追責什么的,所以我們選擇快速備份即可,生成的備份文件也非常地小。

到處配置

# 生成備份文件
docker-compose run --rm -T -e SENTRY_LOG_LEVEL=CRITICAL web export > /home/backup.json
# 將文件保存或發送到另一個服務器

導入配置

# 將配置文件導入容器內
docker cp /home/backup.json sentry_onpremise_web_1:/home/backup.json
# 進入容器
docker exec -it sentry_onpremise_web_1 /bin/bash
# 執行sentry命令
sentry import /home/backup.json


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM