Sentry简介
Sentry 是一个流行的开源实时错误监控工具,主要用于应用程序的日志监控和错误跟踪。它能够帮助开发者快速识别、诊断和修复在生产环境中出现的问题。
以下是 Sentry 的一些主要特点和功能:
- 错误捕获和跟踪:
- Sentry 可以自动捕获应用程序中的异常和错误,并提供详细的上下文信息,如堆栈跟踪、错误信息、用户信息和环境数据。
- 支持多种编程语言和框架,包括 JavaScript、Python、Java、Ruby、PHP、js、Go 等。
- 实时通知:
- 支持通过电子邮件、Slack、PagerDuty 等多种渠道发送实时通知,确保开发团队能够在问题发生时立即得到警报。
- 问题聚合和去重:
- Sentry 会自动对类似的错误进行聚合,避免重复报告相同的问题,帮助开发者更好地管理和优先处理问题。
- 丰富的上下文信息:
- 提供详细的错误上下文,包括请求数据、用户信息、设备信息等,帮助开发者更快地找到问题的根本原因。
- 版本控制集成:
- 可以与 GitHub、GitLab、Bitbucket 等版本控制系统集成,直接链接到相关的代码行,方便开发者快速定位和修复问题。
- 性能监控:
- 除了错误跟踪,Sentry 还提供性能监控功能,帮助开发者识别应用程序中的性能瓶颈。
- 自定义过滤和规则:
- 支持自定义过滤规则和警报条件,开发者可以根据应用的需求调整监控策略。
- 易于集成:
- Sentry 提供了丰富的 SDK 和插件,可以轻松集成到各种应用程序中。
- 开源和商业版本:
- Sentry 提供开源版本,用户可以自行部署;同时也提供托管的商业版本,提供额外的功能和支持服务。
Sentry的商业托管服务
Sentry 的收费模式通常基于其提供的功能和使用量,具体的定价可能会随着时间的推移而有所变化。一般来说,Sentry 提供多种定价计划,以适应不同规模和需求的团队。以下是一些常见的收费模式和定价计划:
- 免费计划:Sentry 通常提供一个免费计划,适合个人开发者或小型项目使用。免费计划通常包括基本的错误跟踪和性能监控功能,但可能对事件数量和数据保留时间有所限制。
- 团队计划:适用于小型到中型团队。团队计划通常包括更高的事件配额、更长的数据保留时间以及一些高级功能,比如团队协作工具、基本的性能监控等。
- 商业计划:面向大型企业和高需求团队,商业计划通常提供无限制的事件数量、更长的数据保留时间和更高级的功能,如高级性能监控、专用支持、SAML SSO(单点登录)等。
- 自定义计划:对于有特定需求的企业,Sentry 可能提供定制化的计划。客户可以根据自身需求与 Sentry 团队协商,制定符合其业务需求的定价和功能组合。
计费方式
- 事件数量:许多定价计划基于每月的事件数量。超过计划内的事件数量可能需要额外付费。
- 数据保留时间:不同的计划提供不同的数据保留时间,数据保留时间越长,价格可能越高。
- 用户数量:某些计划可能根据使用 Sentry 的用户数量进行计费。
其他费用
- 高级功能:某些高级功能可能需要额外付费,如更高级的性能监控、专用支持服务等。
- 支持和服务:企业级计划通常提供高级支持选项,可能需要额外的费用。
Sentry 的私有化部署
Sentry 提供了私有化部署的选项,使得企业可以在自己的基础设施上运行 Sentry,以满足特定的安全、合规和性能需求。这种部署方式特别适合需要更高数据控制和隐私保护的组织。以下是关于 Sentry 私有化部署的一些详细信息:
私有化部署的优势
- 数据控制:企业可以完全控制数据的存储和处理方式,确保敏感信息不离开内部网络。
- 安全性:通过在受控环境中运行 Sentry,可以实施更严格的安全措施,如网络隔离、访问控制和自定义安全策略。
- 合规性:满足特定行业或地区的合规要求,例如 GDPR、HIPAA 等,通过自托管来确保符合相关法规。
- 性能优化:根据自身的基础设施和需求,优化 Sentry 的性能,包括调整资源分配、缩短数据传输延迟等。
- 自定义功能:可以根据业务需求自定义 Sentry 的功能和配置,以更好地集成到现有的 IT 生态系统中。
Sentry架构概述
- Loadbalancer(负载均衡器)负责路由转发(这一服务由用户搭建),错误上报转发到 api+store ,其他项目、成员、错误管理功能由 Sentry Web 负责。这一层的承担数据入口、展示的作用
- Relay 负责消息中继转发,并把数据先汇集到 Kafka;Snuba 负责接收 SentryWeb 的请求,进行数据的聚合、搜索;Sentry Worker 则是一个队列服务,主要负责数据的存储。
- Kafka 作为消息队列,ClickHouse 负责接近实时的数据分析,Redis(主要) 和 Memcached 负责项目配置、错误基础信息的存储和统计。Postgres 承担基础数据持久化(主要是项目、用户权限管理等)Symbolicator 主要用于错误信息格式化。
- 最底下的 Zookeeper 是 Kafka 用于节点信息同步的,如果我们设置了多个 ClickHouse 节点,也可以用它来保存主从同步信息或者做分布式表。
Relay —— 错误信息处理的中转站
Relay 收到原始数据后,主要做这几件事。
- 对其格式进行有效性校验
- 查询内存或者从 Redis 拉取缓存得到项目配置信息,校验请求是否合法(项目是否存在或者有没有触发限流,没触发限流则会对 API 额度进行累计,写入 Redis)
- 发起一个异步请求给定时任务(SentryWorker,postprocess-event)做下一步处理
Kafka 和 Celery —— 应用解耦和异步保存数据
Relay 数据转发到 Kafka 的 ingest-events Topic(Ingest 即摄取),消费者消费后把消息放入 postprocess-event 这个 Celery 定时任务服务排队处理。队列做的事情如下
- Symbolicate-event,在 iOS 上有个叫 symbolicate-crash 的工具,是将机器的崩溃日志转化为可读的崩溃代码定位日志,这里的 Symbolicator 同样承担类似的职能,由它经手的消息,我们就可以在页面上看到代码在哪里出错了。
- process-event,字面含义就是处理消息,在 Sentry 上启用的插件(Plugins or Integration)会在这个步骤中应用到消息体上,例如,整合了一个 Slack bot(机器人),就会在这个步骤发送告警。
- save-event,消息经过简化,保存到数据库,同时再次发到 Kafka,但这次换到 event Topic,Snuba 这个搜索组件内部会有一个消费者,对这部分数据批量写入到 ClickHouse。你可能好奇为什么不直接存进去算了还要搞多这一步,这是因为 ClickHouse 虽然大数据量处理能力很强,但频繁写入能力是真的菜(假设做了主从,那就更灾难了,把从库和 Zookeeper 都一起拉下水),所以需要 Snuba 来限制写入频率。
Sentry Web
Sentry Web 这边主要跟配置等持久化数据打交道,创建项目、权限控制、限流分配等都是它负责。查询搜索错误消息、Dashboard 聚合等功能则是 Snuba 承担,由它来当翻译官,把用户查询条件转化为 SQL 语句发给 ClickHouse。
Sentry的私有化部署
Sentry 私有化部署通常通过 Docker 和 Kubernetes 等现代容器化技术来实现,这使得部署过程更加简便和灵活。以下是一些关键步骤:
- 环境准备:
- 确保服务器或集群满足 Sentry 的系统要求,包括 CPU、内存、存储和网络配置。
- 安装并配置 Docker 和 Docker Compose,或 Kubernetes 环境。
- 获取 Sentry 镜像:
- 从 Sentry 官方 Docker 镜像库中拉取最新的 Sentry 镜像。
- 配置 Sentry:
- 使用 Docker Compose 文件或 Kubernetes 配置文件设置 Sentry 的服务,包括 Web 服务器、数据库(PostgreSQL)、缓存(Redis)等。
- 配置环境变量和密钥,确保 Sentry 正确连接到所需的服务。
- 启动服务:
- 使用 Docker Compose 或 Kubernetes 命令启动 Sentry 服务,并确保所有组件正常运行。
- 监控和维护:
- 部署后,定期监控 Sentry 的性能和资源使用情况。
- 及时更新和维护 Sentry 及其依赖服务,应用安全补丁和版本更新。
资源需求
- 数据库:Sentry 需要 PostgreSQL 作为其主数据库。
- 缓存:Redis 用于缓存和任务队列。
- 对象存储:可选的对象存储(如 AWS S3)用于存储大型文件和附件。
Sentry的接入使用(Python)
是 Sentry 的 Python SDK,允许 Python 应用程序将错误和性能数据发送到 Sentry 服务。
安装
可以通过 pip 安装 sentry-sdk:pip install sentry-sdk
初始化
在应用程序启动时初始化 Sentry,使用从 Sentry 项目中获取的 DSN(Data Source Name):
import sentry_sdk sentry_sdk.init( dsn="https://your-dsn@sentry.io/project-id", traces_sample_rate=1.0 # 设置性能监控的采样率 )
集成框架
对于 Django 项目,可以通过中间件集成:
import sentry_sdk from sentry_sdk.integrations.django import DjangoIntegration sentry_sdk.init( dsn="https://your-dsn@sentry.io/project-id", integrations=[DjangoIntegration()], traces_sample_rate=1.0 )
对于 Flask 项目,可以通过扩展集成:
import sentry_sdk from sentry_sdk.integrations.flask import FlaskIntegration sentry_sdk.init( dsn="https://your-dsn@sentry.io/project-id", integrations=[FlaskIntegration()], traces_sample_rate=1.0 )
对于 Celery,可以通过 Celery 集成:
import sentry_sdk from sentry_sdk.integrations.celery import CeleryIntegration sentry_sdk.init( dsn="https://your-dsn@sentry.io/project-id", integrations=[CeleryIntegration()], traces_sample_rate=1.0 )
错误捕获
自动捕获
Sentry 会自动捕获未处理的异常并将其发送到 Sentry 仪表板。
可以使用 capture_exception 或 capture_message 手动记录错误和消息:
from sentry_sdk import capture_exception, capture_message try: 1 / 0 except ZeroDivisionError as e: capture_exception(e) capture_message("Something went wrong!")
性能监控
通过设置 traces_sample_rate,可以启用性能监控,帮助识别应用程序中的性能瓶颈。
上下文信息
可以通过 set_user 和 set_context 设置用户信息和其他上下文信息:
from sentry_sdk import set_user, set_context set_user({"id": "123", "email": "user@example.com"}) set_context("character", {"name": "Mighty Fighter", "age": 19})
实践中的一些建议
- 设置适当的采样率:在生产环境中,设置合理的traces_sample_rate 以控制数据量。
- 使用版本管理:在部署新版本时更新 Sentry 的版本信息,以便更好地跟踪错误。
- 自定义标签和上下文:使用标签和上下文功能来丰富错误信息,有助于快速诊断问题。
- 监控性能:使用性能监控功能识别和优化应用程序的性能瓶颈。
Sentry-Python 是一个功能强大且易于使用的工具,能够帮助开发者更好地监控和维护 Python 应用程序的健康状态。通过集成 Sentry,开发者可以快速识别和解决生产环境中的问题,提高应用的可靠性和用户满意度。
参考链接: