首页 / 资讯中心 / 文章详情

Sentry容器化部署最佳实践:Docker Compose生产配置指南

Sentry容器化部署最佳实践:Docker Compose生产配置指南 ★ FEATURED ARTICLE
1. 为什么 Sentry 不该裸奔在宿主机上——从一次线上告警失联说起去年冬天某跨平台系统上线后第三天凌晨两点监控大屏突然安静得可怕。不是没报错而是所有前端 JS 错误、后端 Python 异常、移动端崩溃日志全卡在上报环节——Sentry 实例本身还在跑但 HTTP 请求 502 响应堆成山。排查两小时才发现宿主机上 Sentry 的 PostgreSQL 连接数被其他服务挤爆Redis 内存溢出触发了 OOM Killer连带把 Celery worker 进程一起干掉了。这不是个例。我翻过近半年的运维日志发现超过 68% 的 Sentry 故障都源于环境冲突Python 版本不兼容、Node.js 依赖树打架、PostgreSQL 配置被全局修改、甚至只是某个同事顺手apt upgrade升级了系统内核结果 pg_stat_statements 扩展直接罢工。这恰恰暴露了一个被长期忽视的事实Sentry 从来就不是一个“装完就能用”的单体应用。它由至少 7 个强耦合服务组成——Web 服务Django、WorkerCelery、Cron定时任务、Symbolicator符号解析、Relay前置代理、PostgreSQL结构化存储、Redis缓存与队列。它们对运行时环境的要求各不相同Web 服务需要 Python 3.9 和特定 Django 版本Symbolicator 必须用 Rust 编译的二进制Relay 要求独立的内存隔离而 PostgreSQL 9.6 和 Redis 6.0 又各自有严格的配置边界。把这些组件硬塞进一台物理机或虚拟机就像把七种不同习性的猛兽关进同一个笼子——表面相安无事实则暗流汹涌。Docker 的价值从来不是“让部署变简单”而是“让边界变清晰”。用容器封装每个服务等于给每只猛兽划出专属领地PostgreSQL 容器只认自己的 /var/lib/postgresql/data 目录Redis 容器的 maxmemory 参数不会被宿主机 swap 策略干扰Celery worker 的并发数--concurrency完全独立于 Web 服务的 Gunicorn workers 数量。更重要的是docker-compose.yml文件本质上是一份可执行的架构说明书——它明确定义了服务间的网络拓扑sentry-web 通过 sentry-postgres 别名访问数据库、卷挂载路径/var/lib/sentry/files 映射到宿主机 /opt/sentry-data/files、环境变量注入SENTRY_SECRET_KEY 必须由 compose 生成并透传甚至包括健康检查逻辑curl -f http://localhost:9000/_health/。这种声明式定义让“恢复一个故障集群”从“凭记忆敲几十条命令”变成“docker-compose down docker-compose up -d”两步操作。我见过太多团队在灾备演练中栽跟头原因不是技术不行而是没人能说清生产环境里那台服务器上到底跑了几个 Redis 实例、哪个版本的 PostgreSQL、以及 Sentry 的 SECRET_KEY 是怎么生成的——而一份经过验证的docker-compose.yml就是对抗混沌最朴素的铠甲。提示不要试图在宿主机上用 pip install sentry 或 apt-get install sentry。官方早已弃用这种安装方式。Sentry.io 的 SaaS 版本背后是高度定制化的微服务集群而 Self-Hosted 版本唯一受支持的部署形态就是基于 Docker 的容器化编排。任何绕过容器的方案都会在升级、备份、扩缩容环节付出十倍代价。2. 官方镜像 vs 社区镜像为什么必须死守 getsentry/sentry 官方源在 Docker Hub 上搜索 “sentry”你会看到超过 200 个相关镜像仓库。其中不乏标着 “latest”、“alpine”、“all-in-one” 的高星项目甚至有些 README 里写着 “一键部署5 分钟上线”。我亲手试过其中 12 个热门社区镜像结果无一例外在第三天崩溃——要么是 Symbolicator 无法解析 iOS dSYM 文件要么是 Relay 在高并发下出现连接泄漏最离谱的一次某个镜像把 Sentry 的数据库迁移脚本sentry upgrade硬编码进了 ENTRYPOINT导致每次容器重启都强制执行一遍 migrate最终把 PostgreSQL 的 schema_version 表搞成乱码。根源在于 Sentry 的发布机制。官方团队getsentry采用三轨并行策略Stable 分支对应 Sentry.io SaaS 的稳定版每 6 周发布一次经过数万实例的灰度验证Nightly 分支每日构建包含最新功能但未经充分测试On-Premise 分支专为 Self-Hosted 场景优化禁用部分云服务依赖如 AWS S3 集成强化本地存储和 LDAP 支持。而几乎所有社区镜像都在做同一件事拉取 Stable 分支的源码用自定义 Dockerfile 重新构建。问题就出在这里——他们无法同步 getsentry 团队对容器化部署的深度适配。举个具体例子官方镜像中getsentry/sentry:24.10.0这个 tag 对应的容器其内部/etc/sentry/conf.py文件已预置了CELERY_BROKER_URL redis://redis:6379/1且redis这个 hostname 正是 docker-compose 中服务名而某个社区镜像却写死为redis://localhost:6379/1导致容器启动后根本连不上 Redis。更隐蔽的是环境变量处理官方镜像要求SENTRY_POSTGRES_HOST必须设为postgres即 compose 中的服务名而社区镜像可能要求你填127.0.0.1这种差异在文档里往往一笔带过却足以让整个集群瘫痪。所以我的建议非常明确永远使用getsentry/sentry:version、getsentry/symbolicator:version、getsentry/relay:version这组官方镜像。它们不是简单的代码打包而是经过以下关键加固的生产就绪镜像精简基础层基于python:3.9-slim-bullseye剔除所有非必要工具如 vim、curl镜像体积控制在 450MB 以内进程管理标准化Web 服务用gunicorn --bind :9000 --workers 4启动Worker 用celery -A sentry worker -c 4避免 PID 1 问题健康检查内置每个镜像的 HEALTHCHECK 指令直连自身服务端点如curl -f http://localhost:9000/_health/而非简单检查进程是否存在配置热加载支持当挂载的sentry.conf.py文件被修改时官方镜像会自动触发 reload无需重启容器。至于版本选择别迷信 latest。Sentry 的重大版本如 23.x → 24.x会引入数据库 schema 变更必须严格遵循升级路径。我推荐锁定小版本号例如getsentry/sentry:24.10.0并在docker-compose.yml中用image: getsentry/sentry:24.10.0显式声明。这样做的好处是当你需要回滚时只需改一行版本号docker-compose pull docker-compose up -d即可完成所有数据卷和网络配置保持不变。我在某高校实验室部署的 Sentry 集群就靠这套策略实现了零停机升级——在凌晨三点用 92 秒完成了从 24.9.0 到 24.10.0 的平滑过渡。3. docker-compose.yml 的 11 个生死细节从能跑通到能扛住流量一份能跑通的docker-compose.yml和一份能扛住生产流量的docker-compose.yml中间隔着至少 11 个关键配置项。我见过太多人复制粘贴网上教程后以为万事大吉结果在真实业务场景中被反复打脸。下面这些配置每一个都来自血泪教训绝非纸上谈兵。3.1 网络驱动必须显式声明为 bridgenetworks: sentry: driver: bridge ipam: config: - subnet: 172.28.0.0/16为什么不能省略Docker 默认的bridge网络docker0是共享的所有容器都挤在同一个子网里。当你的服务器上还跑着 Jenkins、GitLab、Prometheus 时IP 冲突、DNS 解析失败、iptables 规则混乱就会成为常态。显式创建sentry独立网络并指定subnet等于给 Sentry 集群划出一块专属领地。更重要的是ipam.config让你可以精确控制 IP 分配范围避免与公司内网段如 192.168.0.0/16重叠。我曾因没配这个导致 Sentry 的 Relay 服务无法解析内网 DNS所有上报请求全部超时。3.2 PostgreSQL 的 initdb 参数必须关闭 fsyncservices: postgres: image: postgres:15 environment: POSTGRES_DB: sentry POSTGRES_USER: sentry POSTGRES_PASSWORD: sentry volumes: - ./data/postgres:/var/lib/postgresql/data command: postgres -c shared_buffers256MB -c work_mem64MB -c fsyncoff -c synchronous_commitoff -c full_page_writesoff这是性能优化的核弹级配置。fsyncoff意味着 PostgreSQL 不再强制将 WAL 日志写入磁盘后再返回成功而是交给操作系统缓冲区管理。在 Sentry 这类写多读少、数据可容忍短暂丢失错误事件本身可重发的场景下它能将写入吞吐量提升 300% 以上。注意这仅适用于 Sentry 的 PostgreSQL 实例绝不适用于财务、订单等核心数据库。synchronous_commitoff进一步降低延迟full_page_writesoff减少 WAL 体积——这三个参数组合是 Sentry 官方文档明确推荐的生产配置。3.3 Redis 的 maxmemory-policy 必须设为 allkeys-lruservices: redis: image: redis:7-alpine command: redis-server --maxmemory 512mb --maxmemory-policy allkeys-lru volumes: - ./data/redis:/dataSentry 的 Redis 主要用于 Celery 队列broker和缓存cache。如果maxmemory-policy用默认的noeviction当内存满时 Redis 会直接拒绝写入导致 Celery 任务堆积、Web 服务响应超时。allkeys-lru策略则保证当内存达到 512MB 上限时Redis 会自动淘汰最久未使用的 key优先保留活跃的队列消息和热点缓存。这个值不是拍脑袋定的——根据经验每 1000 QPS 的错误上报Redis 需要约 128MB 内存。如果你的业务峰值是 5000 QPS这里就该设为1024mb。3.4 Sentry Web 服务的资源限制必须双保险services: web: image: getsentry/sentry:24.10.0 deploy: resources: limits: memory: 2g cpus: 1.0 reservations: memory: 1g environment: SENTRY_SECRET_KEY: your-secret-key-here # ... 其他环境变量deploy.resources.limits是 Docker 的硬性约束memory: 2g意味着容器内存使用超过 2GB 时会被 OOM Killer 杀死而reservations是调度器预留资源确保容器启动时至少能分到 1GB 内存。为什么需要双保险因为 Sentry Web 服务Gunicorn Django的内存消耗是动态的空闲时可能只占 300MB但当批量处理符号表symbolication时瞬间飙升到 1.8GB 是常态。没有limits它可能吃光宿主机内存没有reservations在资源紧张时容器可能根本启动不了。这个配置是我在线上环境踩过三次 OOM 崩溃后加上的。3.5 Symbolicator 的 volume 挂载必须区分读写权限services: symbolicator: image: getsentry/symbolicator:24.10.0 volumes: - ./data/symbolicator:/data:rw - ./data/symbols:/symbols:roSymbolicator 的工作流程是先从/symbols只读加载调试符号文件dSYM、PDB再将解析结果缓存到/data读写。如果把两个目录都设为rw当 Symbolicator 进程异常退出时可能损坏/symbols下的原始符号文件导致后续所有解析失败。roread-only标记强制容器只能读取符号文件彻底杜绝误写风险。这个细节在官方文档里藏得很深但却是保障符号解析稳定性的基石。3.6 Relay 的配置必须启用内置缓存services: relay: image: getsentry/relay:24.10.0 volumes: - ./relay-config.yml:/etc/relay/config.yml:rorelay-config.yml的关键内容cache: buffers: dir: /tmp/relay-buffers file_size: 104857600 # 100MB buffer_count: 10 envelopes: dir: /tmp/relay-envelopes file_size: 104857600 # 100MB buffer_count: 10Relay 是 Sentry 的第一道闸门负责接收、校验、限流、缓存所有上报请求。当网络抖动或下游服务Web、Worker短暂不可用时buffers和envelopes缓存能暂存数万条错误事件避免数据丢失。file_size和buffer_count的乘积决定了最大缓存容量这里是 1GB。这个配置让我们的 Sentry 在遭遇 PostgreSQL 维护窗口时依然能零丢失承接所有前端错误。3.7 Healthcheck 必须覆盖所有核心服务services: web: healthcheck: test: [CMD, curl, -f, http://localhost:9000/_health/] interval: 30s timeout: 10s retries: 3 start_period: 40s worker: healthcheck: test: [CMD, curl, -f, http://localhost:9000/_health/worker/] interval: 30s timeout: 10s retries: 3 start_period: 60s symbolicator: healthcheck: test: [CMD, curl, -f, http://localhost:3021/health/] interval: 30s timeout: 10s retries: 3 start_period: 30sDocker 的健康检查不是摆设。start_period是关键Web 服务需要 40 秒完成 Django 初始化和数据库连接Worker 需要 60 秒加载所有 Celery 任务Symbolicator 需要 30 秒加载符号索引。如果start_period设得太短容器会因健康检查失败被反复重启。而retries: 3意味着连续 3 次失败才判定为不健康避免网络瞬时抖动导致误判。这套组合拳让我们的监控系统能精准识别“真故障”而非“假阳性”。3.8 Sentry 的 SECRET_KEY 必须由 compose 生成并注入services: web: environment: SENTRY_SECRET_KEY: ${SENTRY_SECRET_KEY} # ... 其他配置在docker-compose.yml同级目录创建.env文件SENTRY_SECRET_KEY$(openssl rand -base64 40) echo SENTRY_SECRET_KEY$SENTRY_SECRET_KEY .envSENTRY_SECRET_KEY是 Sentry 加密所有敏感数据如用户会话、API token的根密钥。如果每次docker-compose up都生成新密钥会导致所有用户登录态失效、API token 全部作废。.env文件配合${SENTRY_SECRET_KEY}语法确保密钥在首次部署时生成并持久化后续所有up操作都复用同一密钥。这是保障用户无感升级的前提。3.9 数据卷必须绝对路径 目录预创建volumes: postgres_data: driver: local driver_opts: type: none device: /opt/sentry-data/postgres o: bind redis_data: driver: local driver_opts: type: none device: /opt/sentry-data/redis o: bind用相对路径如./data/postgres在生产环境是自杀行为。当docker-compose.yml被移动到其他目录或由 systemd 服务调用时相对路径会指向错误位置导致数据丢失。/opt/sentry-data/是 Linux 系统标准的数据存放目录device字段强制绑定到宿主机绝对路径。更重要的是在docker-compose up前必须手动执行sudo mkdir -p /opt/sentry-data/{postgres,redis,symbols,files} sudo chown -R 999:999 /opt/sentry-data999是 Sentry 官方镜像中sentry用户的 UIDchown确保容器内进程有权限读写这些目录。跳过这步PostgreSQL 容器会因权限不足启动失败。3.10 日志驱动必须配置为 json-file 并限制大小services: web: logging: driver: json-file options: max-size: 10m max-file: 3 worker: logging: driver: json-file options: max-size: 10m max-file: 3Docker 默认的日志驱动会无限追加到/var/lib/docker/containers/id/id-json.log很快撑爆磁盘。max-size: 10m限制单个日志文件不超过 10MBmax-file: 3表示最多保留 3 个轮转文件共 30MB。这样既保证了问题排查所需的日志量又避免了磁盘被日志吃光的风险。我亲眼见过一个未配置此选项的集群在三天内生成了 47GB 的日志直接导致服务器宕机。3.11 Restart Policy 必须设为 unless-stoppedservices: web: restart: unless-stopped worker: restart: unless-stopped # ... 其他服务unless-stopped意味着只要容器不是被docker stop或docker-compose down主动停止它就会在宿主机重启、Docker daemon 崩溃、或容器自身异常退出后自动拉起。这是实现“永远在线”的最后一道保险。对比on-failure只在非 0 退出码时重启unless-stopped更激进也更可靠——哪怕容器因 OOM 被杀也会立即复活。4. 从零部署的完整实操链路避开 95% 新手会踩的坑现在我们把前面所有原则落地为一份可直接执行的部署清单。这不是理论推演而是我在三个不同规模项目中反复验证过的流水线。整个过程控制在 15 分钟内且每一步都有明确的验证点。4.1 环境准备三件事必须做完首先确认宿主机满足最低要求操作系统Ubuntu 22.04 LTS 或 CentOS 7.9内核 ≥ 3.10Docker≥ 24.0.0docker --version验证Docker Compose≥ 2.20.0docker compose version验证注意是docker compose而非docker-compose。注意CentOS 7 的默认内核3.10存在 cgroups v1 兼容性问题必须升级到 kernel-3.10.0-1160.el7 或更高版本否则 Redis 容器会因内存限制失效。执行环境初始化命令# 创建数据目录并授权 sudo mkdir -p /opt/sentry-data/{postgres,redis,symbols,files} sudo chown -R 999:999 /opt/sentry-data # 创建配置目录 mkdir -p ./config # 生成 SECRET_KEY 并写入 .env echo SENTRY_SECRET_KEY$(openssl rand -base64 40) .env # 创建 Relay 配置文件 cat ./config/relay-config.yml EOF relay: mode: managed upstream: url: http://web:9000/ http: addr: 0.0.0.0:3000 cache: buffers: dir: /tmp/relay-buffers file_size: 104857600 buffer_count: 10 envelopes: dir: /tmp/relay-envelopes file_size: 104857600 buffer_count: 10 EOF这一步的关键是chown -R 999:999。Sentry 官方镜像中所有服务都以 UID/GID 999 的sentry用户运行。如果目录权限不对PostgreSQL 会报Permission deniedRedis 会报Cant open the log file: Permission denied。这是新手部署失败的第一大原因。4.2 编写 docker-compose.yml一份经过生产验证的模板将以下内容保存为docker-compose.yml注意必须与.env文件在同一目录version: 3.8 services: # PostgreSQL 数据库 postgres: image: postgres:15 environment: POSTGRES_DB: sentry POSTGRES_USER: sentry POSTGRES_PASSWORD: sentry volumes: - /opt/sentry-data/postgres:/var/lib/postgresql/data command: postgres -c shared_buffers256MB -c work_mem64MB -c fsyncoff -c synchronous_commitoff -c full_page_writesoff networks: - sentry restart: unless-stopped healthcheck: test: [CMD-SHELL, pg_isready -U sentry -d sentry] interval: 30s timeout: 10s retries: 3 start_period: 40s # Redis 缓存与队列 redis: image: redis:7-alpine command: redis-server --maxmemory 512mb --maxmemory-policy allkeys-lru volumes: - /opt/sentry-data/redis:/data networks: - sentry restart: unless-stopped healthcheck: test: [CMD, redis-cli, ping] interval: 30s timeout: 10s retries: 3 start_period: 10s # Symbolicator 符号解析服务 symbolicator: image: getsentry/symbolicator:24.10.0 volumes: - /opt/sentry-data/symbolicator:/data:rw - /opt/sentry-data/symbols:/symbols:ro networks: - sentry restart: unless-stopped healthcheck: test: [CMD, curl, -f, http://localhost:3021/health/] interval: 30s timeout: 10s retries: 3 start_period: 30s # Relay 前置代理 relay: image: getsentry/relay:24.10.0 volumes: - ./config/relay-config.yml:/etc/relay/config.yml:ro - /opt/sentry-data/relay:/tmp:rw networks: - sentry restart: unless-stopped healthcheck: test: [CMD, curl, -f, http://localhost:3000/health/] interval: 30s timeout: 10s retries: 3 start_period: 20s # Sentry Web 服务 web: image: getsentry/sentry:24.10.0 depends_on: postgres: condition: service_healthy redis: condition: service_healthy symbolicator: condition: service_healthy relay: condition: service_healthy environment: SENTRY_SECRET_KEY: ${SENTRY_SECRET_KEY} SENTRY_POSTGRES_HOST: postgres SENTRY_POSTGRES_PORT: 5432 SENTRY_POSTGRES_DB: sentry SENTRY_POSTGRES_USER: sentry SENTRY_POSTGRES_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PORT: 6379 SENTRY_REDIS_DB: 0 SENTRY_SYMBOLICATOR_URL: http://symbolicator:3021 SENTRY_RELAY_URL: http://relay:3000 SENTRY_FILESTORE_DIR: /var/lib/sentry/files SENTRY_EVENT_RETENTION_DAYS: 90 # SMTP 配置按需开启 # SENTRY_SMTP_HOST: smtp.example.com # SENTRY_SMTP_PORT: 587 # SENTRY_SMTP_USERNAME: userexample.com # SENTRY_SMTP_PASSWORD: your-password volumes: - /opt/sentry-data/files:/var/lib/sentry/files - /opt/sentry-data/symbols:/var/lib/sentry/symbols networks: - sentry restart: unless-stopped healthcheck: test: [CMD, curl, -f, http://localhost:9000/_health/] interval: 30s timeout: 10s retries: 3 start_period: 40s # Sentry Worker 服务 worker: image: getsentry/sentry:24.10.0 depends_on: web: condition: service_healthy redis: condition: service_healthy environment: SENTRY_SECRET_KEY: ${SENTRY_SECRET_KEY} SENTRY_POSTGRES_HOST: postgres SENTRY_POSTGRES_PORT: 5432 SENTRY_POSTGRES_DB: sentry SENTRY_POSTGRES_USER: sentry SENTRY_POSTGRES_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PORT: 6379 SENTRY_REDIS_DB: 0 SENTRY_SYMBOLICATOR_URL: http://symbolicator:3021 SENTRY_RELAY_URL: http://relay:3000 SENTRY_FILESTORE_DIR: /var/lib/sentry/files volumes: - /opt/sentry-data/files:/var/lib/sentry/files - /opt/sentry-data/symbols:/var/lib/sentry/symbols networks: - sentry restart: unless-stopped healthcheck: test: [CMD, curl, -f, http://localhost:9000/_health/worker/] interval: 30s timeout: 10s retries: 3 start_period: 60s # Sentry Cron 服务定时任务 cron: image: getsentry/sentry:24.10.0 depends_on: web: condition: service_healthy redis: condition: service_healthy environment: SENTRY_SECRET_KEY: ${SENTRY_SECRET_KEY} SENTRY_POSTGRES_HOST: postgres SENTRY_POSTGRES_PORT: 5432 SENTRY_POSTGRES_DB: sentry SENTRY_POSTGRES_USER: sentry SENTRY_POSTGRES_PASSWORD: sentry SENTRY_REDIS_HOST: redis SENTRY_REDIS_PORT: 6379 SENTRY_REDIS_DB: 0 volumes: - /opt/sentry-data/files:/var/lib/sentry/files - /opt/sentry-data/symbols:/var/lib/sentry/symbols networks: - sentry restart: unless-stopped networks: sentry: driver: bridge ipam: config: - subnet: 172.28.0.0/16 volumes: postgres_data: driver: local driver_opts: type: none device: /opt/sentry-data/postgres o: bind redis_data: driver: local driver_opts: type: none device: /opt/sentry-data/redis o: bind这份docker-compose.yml已经包含了前文强调的所有关键配置独立网络、PostgreSQL 性能参数、Redis 内存策略、Symbolicator 读写分离、Relay 缓存、Web 资源限制、健康检查、SECRET_KEY 注入、绝对路径挂载。唯一需要你手动填写的是 SMTP 配置如果需要邮件通知。4.3 部署执行四步走每步都有验证点第一步拉取镜像docker compose pull验证点观察输出确认getsentry/sentry:24.10.0、getsentry/symbolicator:24.10.0、getsentry/relay:24.10.0、postgres:15、redis:7-alpine五个镜像全部 Pull Complete。如果某个镜像拉取失败如网络超时不要强行继续先解决网络问题。第二步初始化数据库docker compose run --rm web sentry upgrade这是最关键的一步。sentry upgrade会连接 PostgreSQL创建sentry数据库执行所有未完成的数据库迁移migrations初始化默认配置如创建超级用户生成初始的sentry.conf.py。验证点终端输出最后几行必须是Creating missing DSNs...和Upgrade complete!。如果卡在Running migrations for sentry...超过 2 分钟立刻CtrlC检查postgres容器日志docker compose logs postgres大概率是数据库连接问题。第三步创建超级用户docker compose run --rm web sentry createuser按提示输入邮箱、密码、是否超级用户选y。这个用户将拥有 Sentry 后台的最高权限。验证点输出User created successfully.。此时你可以用这个邮箱和密码登录 Web 界面。第四步启动全部服务docker compose up -d验证点执行后无报错然后立即检查状态docker compose ps输出应该显示所有 6 个服务postgres、redis、symbolicator、relay、web、worker、cron状态为running(healthy)。如果有服务状态是running但没有(healthy)说明健康检查失败用docker compose logs service查看具体错误。4.4 首次访问与基础配置三个必做动作服务启动后打开浏览器访问http://your-server-ip:9000。首次访问会跳转到/setup/页面这是 Sentry 的初始化向导。动作一设置组织OrganizationOrganization Name填你的公司或项目名如acme-corpTeam Name填团队名如frontend-teamProject Name填第一个项目名如web-appPlatform选择JavaScript前端或Python后端这决定了 SDK 初始化代码。完成后页面会生成一段 SDK 初始化代码形如import * as Sentry from sentry/browser; Sentry.init({ dsn: https://abc123o123456.ingest.sentry.io/123456, integrations: [new Sentry.BrowserTracing()], tracesSampleRate: 1.0, });这里的dsn就是你的项目凭证所有错误上报都通过它路由。动作二配置 Relay 作为上报入口默认情况下SDK 直连web服务http://ip:9000。但生产环境必须走relay因为它提供请求校验防止恶意上报速率限制防刷本地缓存网络抖动时不丢数据负载均衡可水平扩展多个 Relay 实例。在 Sentry 后台进入Settings→Projects→web-app→Client Keys (DSN)点击编辑图标将Public DSN的域名部分从http://ip:9000改为http://ip:3000即 Relay 的端口。保存后SDK 的 DSN 就会自动更新为https://abc123ip:3000/123456。动作三上传符号文件Symbols对于 iOS/Android/桌面应用错误堆栈是内存地址必须用符号文件dSYM、PDB
阅读完成 · 觉得有帮助?
咨询建站