sentry常见运维问题

1,090 阅读4分钟

sentry常见运维问题

sentry简介

sentry-self-hosted目录概览

├─.env                                 # 环境变量配置文件,用于设置环境变量。
├─README.md                            # 项目的主要说明文档,包含安装、配置和使用说明。
├─docker-compose.yml                   # Docker Compose 配置文件,用于定义和运行多个 Docker 容器服务。
├─install.sh                           # 安装脚本,用于初始化和安装 Sentry。
├─sentry-admin.sh                      # Sentry 管理脚本,用于执行常见管理任务。
├─symbolicator                         # Symbolicator 目录,用于处理原始符号化文件(debug symbols)。
├─sentry                               # Sentry 服务相关的目录,包含构建文件和配置文件。
|   ├─Dockerfile                       # Sentry 的 Docker 镜像定义文件。
|   ├─config.example.yml               # Sentry 的示例配置文件。
|   ├─enhance-image.example.sh         # 示例脚本,用于增强 Docker 镜像。
|   ├─entrypoint.sh                    # 容器入口脚本,用于初始化 Sentry 容器。
|   ├─requirements.example.txt         # 示例依赖文件,列出了需要安装的 Python 库。
|   └sentry.conf.example.py            # Sentry 的示例 Python 配置文件。
├─scripts                              # 管理和维护脚本的目录。
|    ├─_lib.sh                         # 常用函数库脚本。
|    ├─backup.sh                       # 备份脚本,用于备份 Sentry 数据。
|    ├─bump-version.sh                 # 版本更新脚本,用于更新项目版本。
|    ├─post-release.sh                 # 发布后脚本,用于发布后的处理。
|    ├─reset.sh                        # 重置脚本,用于重置 Sentry 环境。
|    └restore.sh                       # 恢复脚本,用于恢复 Sentry 数据。
├─relay                                # Relay 服务相关的目录,包含配置文件。
├─postgres                             # Postgres 数据库相关的目录,包含初始化和入口脚本。
|    ├─init_hba.sh                     # 初始化 HBA (Host-Based Authentication) 配置的脚本。
|    └postgres-entrypoint.sh           # Postgres 容器入口脚本。
├─nginx                                # Nginx 服务相关的目录,包含配置文件。
├─jq                                   # JQ 工具相关的目录,用于处理 JSON 数据。
|   └Dockerfile                        # 用于构建 JQ 工具的 Dockerfile。
├─install                              # 安装和设置脚本的目录。
|    ├─_lib.sh                         # 安装相关的函数库脚本。
|    ├─_min-requirements.sh            # 最低要求检查脚本。
|    ├─bootstrap-snuba.sh              # 初始化 Snuba 的脚本。
|    ├─build-docker-images.sh          # 构建 Docker 镜像的脚本。
|    ├─check-latest-commit.sh          # 检查最新提交的脚本。
|    ├─check-minimum-requirements.sh   # 检查最低要求的脚本。
|    ├─create-docker-volumes.sh        # 创建 Docker 卷的脚本。
|    ├─create-kafka-topics.sh          # 创建 Kafka 主题的脚本。
|    ├─dc-detect-version.sh            # 检测 Docker Compose 版本的脚本。
|    ├─detect-platform.sh              # 检测平台的脚本。
|    ├─ensure-files-from-examples.sh   # 确保示例文件存在的脚本。
|    ├─ensure-relay-credentials.sh     # 确保 Relay 凭证存在的脚本。
|    ├─error-handling.sh               # 错误处理脚本。
|    ├─generate-secret-key.sh          # 生成秘密密钥的脚本。
|    ├─geoip.sh                        # GeoIP 数据库处理脚本。
|    ├─install-wal2json.sh             # 安装 wal2json 的脚本。
|    ├─parse-cli.sh                    # 解析 CLI 参数的脚本。
|    ├─set-up-and-migrate-database.sh  # 设置和迁移数据库的脚本。
|    ├─turn-things-off.sh              # 关闭服务的脚本。
|    ├─update-docker-images.sh         # 更新 Docker 镜像的脚本。
|    ├─upgrade-postgres.sh             # 升级 Postgres 的脚本。
|    └wrap-up.sh                       # 安装结束后的处理脚本。
├─geoip                                # GeoIP 数据库相关的目录。
├─cron                                 # Cron 服务相关的目录,包含构建文件和脚本。
|    ├─Dockerfile                      # 用于构建 Cron 容器的 Dockerfile。
|    ├─entrypoint.sh                   # Cron 容器入口脚本。
|    └sources.list                     # 用于 Cron 容器的源列表。
├─clickhouse                           # Clickhouse 服务相关的目录,包含构建文件和配置文件。
|    ├─Dockerfile                      # 用于构建 Clickhouse 容器的 Dockerfile。
|    └config.xml                       # Clickhouse 的配置文件。
├─certificates                         # 证书相关的目录。
|    └.gitignore                       # 忽略证书文件的 Git 配置。

二 : sentry的服务器垃圾清理

2.1 常规日志清理

常规日志清理 : 运行查看每个服务的日志docker compose logs <service_name>。您可以使用-f标志“跟踪”日志的传入,并使用标志-t获取时间戳。如果您不传递任何服务名称,您将获得所有正在运行的服务的日志。

2.2 设置容器日志大小

如果你怀疑 Docker 容器日志的持久化日志占用了大量磁盘空间,你可以通过配置文件来配置 Docker 上持久化日志的数量/etc/docker/daemon.json。如果该文件不存在,你可以自行创建。

{
  "log-driver": "local",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

要应用新的 Docker 守护程序配置,请使用 重新启动 Docker 服务systemctl restart docker

如果您想要删除即时 Docker 日志,您可以以root用户身份执行此操作:

truncate -s 0 /var/lib/docker/containers/**/*-json.log

2.3 容器健康检查

Docker 容器的健康检查

在某些情况下,您可能希望根据自己的需求增加或减少健康检查间隔、超时或重试次数。这可以通过编辑中的HEALTHCHECK_INTERVALHEALTHCHECK_TIMEOUTHEALTHCHECK_RETRIES变量的值来实现.env

有时,你可能会看到这样的错误

container for service "${servicename}" is unhealthy

2.4 清理database

Postgres

Postgres 用于主数据存储,以及用于存储键/值数据的节点存储nodestore_node。该表可以快速增长,尤其是在大量使用性能监控功能时,因为跟踪数据存储在此表中。

作为任务的一部分,表格nodestore_node被清理cleanup,但是 Postgres 可能没有机会清理表格(特别是在重负载下),因此即使行可能被删除,它们仍然会占用磁盘空间。

您可以使用pg-repack它来实时重新打包表,方法是创建新表并复制数据,然后再删除旧表。您需要在清理脚本之后运行它,并注意,在它创建表时,磁盘使用率会激增,然后才会下降

以下是示例脚本:

# Only keep the last 7 days of nodestore data. We heavily use performance monitoring.
docker compose run --rm -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 --rm -T postgres bash -c "apt update && apt install -y --no-install-recommends postgresql-14-repack && su postgres -c 'pg_repack -E info -t nodestore_node'"

如果上述脚本仍未清理出足够的磁盘空间,您可以在 Postgres 中尝试以下操作。这将导致事件详细信息中的数据丢失。SENTRY_RETENTION_DAYS需要手动填写。

DELETE FROM public.nodestore_node WHERE "timestamp" < NOW() - INTERVAL '[SENTRY_RETENTION_DAYS]';
VACUUM FULL public.nodestore_node;

VACUUM FULL 会主动压缩表,方法是写入一个完整的新版本的表文件,其中没有死空间。这可以最小化表的大小,但可能需要很长时间。它还需要额外的磁盘空间来存储表的新副本,直到操作完成。

2.5 清理kafka

出现kafka问题的原因有

  1. 磁盘空间或内存不足
  2. 持续的事件高峰导致非常长的处理时间,从而导致 Kafka 在消息超过保留时间时丢弃消息
  3. 由于重启或暂停/恢复循环导致日期/时间不同步问题

比如:

Exception: KafkaError{code=OFFSET_OUT_OF_RANGE,val=1,str="Broker: Offset out of range"}

解决 :

获取消费者list

docker compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --list

获取群组info

docker compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --group snuba-consumers --describe

重新指针偏移为空

docker compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --group snuba-consumers --topic events --reset-offsets --to-latest --dry-run

指针设置成最新

docker compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --group snuba-consumers --topic events --reset-offsets --to-latest --execute

如果上述解决不了问题尝试重新安装kafka

将偏移量设置为最新并执行

docker compose run --rm kafka kafka-consumer-groups --bootstrap-server kafka:9092 --all-groups --all-topics --reset-offsets --to-latest --execute

0. 停止实例:

    docker compose down --volumes
  1. 删除 Kafka 和 Zookeeper 相关卷:

    docker volume rm sentry-kafka
    docker volume rm sentry-zookeeper
    
  2. 再次运行安装脚本:

    ./install.sh
    
  3. 启动实例:

    docker compose up -d
    

2.6 自动清理脚本

一个自动清理日志脚本(不包含数据库和docker) 定时运行即可

#!/bin/bash# Get all container IDs
container_ids=$(docker ps -a --format "{{.ID}}")
​
# Function to clean logs for a container
clean_logs() {
    container_id=$1
    echo "Cleaning logs for container ID: $container_id"
    
    # Get log path
    log_path=$(docker inspect --format='{{.LogPath}}' $container_id)
    
    # Check if log file exists
    if [ -f "$log_path" ]; then
        # Get log file size
        log_size=$(du -h "$log_path" | awk '{print $1}')
        echo "Log file size for container ID $container_id: $log_size"
        
        # Remove log file
        # sudo rm "$log_path"
        echo "Log file for container ID $container_id deleted."
    else
        echo "Log file for container ID $container_id not found."
    fi
}
​
# Loop through each container ID and clean its logs
for container_id in $container_ids
do
    clean_logs $container_id
done

三. sentry接入流程

3.1 clone代码到服务器

在sentry官网下载下面的压缩包传递到服务器

github.com/getsentry/s…

改少量配置即可使用

./self-hosted/cron

image-20240605102856179

目前下面的镜像源是修改后可用的

deb http://mirrors.163.com/debian/ buster main non-free contrib
deb http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb http://mirrors.163.com/debian/ oldstable-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
deb http://mirrors.163.com/debian/ bookworm main non-free contrib
deb http://mirrors.163.com/debian/ bookworm-updates main non-free contrib
deb http://mirrors.163.com/debian-security/ bookworm-security main non-free contrib
​
deb-src http://mirrors.163.com/debian/ buster main non-free contrib
deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ oldstable-backports main non-free contrib
deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
deb-src http://mirrors.163.com/debian/ bookworm main non-free contrib
deb-src http://mirrors.163.com/debian/ bookworm-updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ bookworm-security main non-free contrib

./self-hosted/jq

deb http://mirrors.163.com/debian/ buster main non-free contrib
deb http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb http://mirrors.163.com/debian/ oldstable-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
deb http://mirrors.163.com/debian/ bookworm main non-free contrib
deb http://mirrors.163.com/debian/ bookworm-updates main non-free contrib
deb http://mirrors.163.com/debian-security/ bookworm-security main non-free contrib
​
deb-src http://mirrors.163.com/debian/ buster main non-free contrib
deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ oldstable-backports main non-free contrib
deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
deb-src http://mirrors.163.com/debian/ bookworm main non-free contrib
deb-src http://mirrors.163.com/debian/ bookworm-updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ bookworm-security main non-free contrib

执行install.sh即可安装