术→技巧, 研发

集中式日志管理系统Sentry

钱魏Way · · 273 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

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架构概述

  • Load balancer(负载均衡器)负责路由转发(这一服务由用户搭建),错误上报转发到api+store,其他项目、成员、错误管理功能由Sentry Web负责。这一层的承担数据入口、展示的作用
  • Relay负责消息中继转发,并把数据先汇集到Kafka;Snuba负责接收Sentry Web的请求,进行数据的聚合、搜索;Sentry Worker则是一个队列服务,主要负责数据的存储。
  • Kafka作为消息队列,ClickHouse负责接近实时的数据分析,Redis(主要)和Memcached负责项目配置、错误基础信息的存储和统计。Postgres承担基础数据持久化(主要是项目、用户权限管理等)Symbolicator主要用于错误信息格式化。
  • 最底下的Zookeeper是Kafka用于节点信息同步的,如果我们设置了多个ClickHouse节点,也可以用它来保存主从同步信息或者做分布式表。

Relay——错误信息处理的中转站

Relay收到原始数据后,主要做这几件事。

  • 对其格式进行有效性校验
  • 查询内存或者从Redis拉取缓存得到项目配置信息,校验请求是否合法(项目是否存在或者有没有触发限流,没触发限流则会对API额度进行累计,写入Redis)
  • 发起一个异步请求给定时任务(Sentry Worker,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)会在这个步骤中应用到消息体上,例如,整合了一个Slackbot(机器人),就会在这个步骤发送告警。
  • save-event,消息经过简化,保存到数据库,同时再次发到Kafka,但这次换到eventTopic,Snuba这个搜索组件内部会有一个消费者,对这部分数据批量写入到ClickHouse。你可能好奇为什么不直接存进去算了还要搞多这一步,这是因为ClickHouse虽然大数据量处理能力很强,但频繁写入能力是真的菜(假设做了主从,那就更灾难了,把从库和Zookeeper都一起拉下水),所以需要Snuba来限制写入频率。

SentryWeb

SentryWeb这边主要跟配置等持久化数据打交道,创建项目、权限控制、限流分配等都是它负责。查询搜索错误消息、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,开发者可以快速识别和解决生产环境中的问题,提高应用的可靠性和用户满意度。

参考链接:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注