抓 Bug 神器的工作原理——聊聊 Sentry 的架构

Sentry 是什么?这是一个服务中心,用于错误报告,使用几乎一致 API 设计统一了不同语言生产环境代码异常报告的问题。

抓 Bug 神器的工作原理——聊聊 Sentry 的架构

图片来自 Sentry.io2020年2月,领导让我负责公司内部的测试和使用 Sentry,彼时 Sentry 文档还不完善,我也只是初步接触基础服务的建设,Sentry 对我来说是个黑盒子。

2016年,Sentry 开发者回答说,目前还没有任何关于它的问题 Sentry 结构公开信息的最佳方式是阅读源代码:)这个工程量真的很大,我个人在使用它 Docker-compose 搭建 Sentry 借用一系列日志输出观察整个数据流,只能根据服务间的依赖猜测一般架构。

2020年下半年,Sentry 结合其他文档,开始陆续补充文档,本项目的架构图终于公开,Sentry 数据流出水面。

架构概述

下图是基于的 Sentry 官方文档重绘后,我用紫色图形区分了所有与存储相关的组件,其他的 Sentry 蓝色表示服务组件(顶部应用除外)。

抓 Bug 神器的工作原理——聊聊 Sentry 的架构

SentryArchitecture这样画下来后,服务基本上是分层完成的:

1.Loadbalancer(负载均衡器)负责路由转发(此服务由用户构建),错误报告转发到/api/d+/store ,其他项目、成员和错误管理功能由其他项目、成员和错误管理 Sentry Web 负责。这一层承担数据入口和显示功能2.Relay 负责新闻中继转发,首先收集数据 Kafka;Snuba 负责接收 SentryWeb 数据聚合和搜索的请求;Sentry Worker 主要负责数据存储的队列服务。3.Kafka 作为消息队列,ClickHouse 负责接近实时数据分析,Redis(主要)和 Memcached 负责存储和统计项目配置和错误的基本信息。Postgres 承担基础数据持久化(主要是项目、用户权限管理等)。)Symbolicator 主要用于错误信息的格式化。4.最底下的 Zookeeper 是 Kafka 如果我们设置多个节点信息同步, ClickHouse 节点也可用于保存主从同步信息或制作分布式表。

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

抓 Bug 神器的工作原理——聊聊 Sentry 的架构

RelayRelay 收到原始数据后,主要做这些事情。

1.验证其格式的有效性。2.查询内存或从 Redis 拉取缓存获取项目配置信息,验证请求是否合法(项目是否存在或触发限流,不触发限流 API 积累金额,写入 Redis)3.发起异步请求给定时任务(SentryWorker,postprocess-event)下一步处理

Kafka 和 Celery ——应用程序解耦和异步保存数据

Relay 数据转发到 Kafka 的 ingest-events Topic(Ingest 即摄入),消费者消费后将消息放入 postprocess-event 这个 Celery 定期任务服务排队处理。队列所做的如下

1.Symbolicate-event,在 iOS 上有个叫 symbolicate-crash 这里的工具是将机器的崩溃日志转换为可读的崩溃代码定位日志 Symbolicator 还承担类似的功能,通过它处理的消息,我们可以在页面上看到代码出了什么问题。2.process-event,字面意思是处理消息 Sentry 上启用的插件(Plugins or Integration)这一步将应用于消息体,例如,集成一个 Slack bot(机器人),将在此步骤中发出报警。3.save-event,简化后,将消息保存到数据库中,同时再次发送 Kafka,但这次换到 event Topic,Snuba 在这个搜索组件中,会有一个消费者批量将这部分数据写入 ClickHouse。你可能会好奇为什么不直接存起来,算了算,还要多做这一步。这是因为 ClickHouse 虽然大数据处理能力很强,但频繁写入的能力是真正的菜鸡(假设是主从,那就更灾难性了,把从库和 Zookeeper 一起拉下水),所以需要 Snuba 限制写入频率。

Sentry Web

抓 Bug 神器的工作原理——聊聊 Sentry 的架构

SentryDashboard -来自 Sentry 官网

抓 Bug 神器的工作原理——聊聊 Sentry 的架构

实时查询Sentry Web 这里主要处理配置等持久数据,负责创建项目、权限控制、限流分配等。查询错误的搜索信息,Dashboard 聚合等功能是 Snuba 承担,作为翻译,将用户查询条件转化为 SQL 语句发给 ClickHouse。

题外话-为什么? Sentry 适合商用

以往的开源项目大多可以看作是单个组件,升级修复的工作量对于普通工程师来说是可以接受的。但是 Sentry 这一错误报告服务背后由十几二十个微服务组成。服务升级可能涉及多个微服务和存储服务,无法立即依赖爆炸和测试。

对于小公司,如果不使用, Docker,搭建一个 Sentry 服务需要很多服务器。如果你想做出决定,你需要乘以集群 N,如果要做 TLS,你得花很多钱买证书。本来想节省代码查错的时间成本,但最后可能在部署和运维上花了更多的钱。

单租户隔离(Single Tenant Isolation)、持续集成测试,TLS 加密、容灾都交给了 Sentry 来做吧,给它钱自然成了最划算的计划,不得不说,真羡慕这种站着赚钱的项目:)。

参考资料

1.[Question] Sentry Architecture #3419(https://github.com/getsentry/sentry/issues/3419#issuecomment-224006919)2. Path of an Event through Relay (https://getsentry.github.io/relay/relayserver/index.html#path-of-an-event-through-relay)3. Sentry: Event Ingestion Pipeline(https://getsentry.github.io/event-ingestion-graph/)4. Introducing Snuba: Sentrys New Search Infrastructure (https://blog.sentry.io/2019/05/16/introducing-snuba-sentrys-new-search-infrastructure)5. The Architecture Of Sentry (https://develop.sentry.dev/architecture/)

(0)
上一篇 2023年1月31日 下午5:47
下一篇 2023年1月31日 下午5:52

相关推荐

wx