术→技巧, 研发

集中式日志管理系统Sentry

钱魏Way · · 18 次浏览

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,开发者可以快速识别和解决生产环境中的问题,提高应用的可靠性和用户满意度。

参考链接:

发表回复

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