乐趣区

关于sentry:使用-Sentry-对应用进行监控少-bug-少加班

为什么咱们须要利用监控

大家是否有过这样的体验:

产品新性能上线几周后,客户提工单反馈问题。研发同学经排查确认是 bug,且会产生脏数据。最终,修复 bug + 上线花了大半天,而编写修复脚本 + 修复数据消耗了一周。

如果发现 bug 的机会越早,那么修复老本就越低

通过对利用中的谬误或异样进行监控和主动反馈,有助于咱们尽早发现荫蔽的问题,晋升产品质量和研发效率。

日志零碎不等同利用监控零碎

可能有同学会说:程序的谬误和异样在咱们的日志零碎外面都有呀,为什么还须要专门的利用监控零碎?

的确,日志中事无巨细地记录了大量的运行过程和异样信息。不过,这些信息可能也存在反复、有效、不足分割的弊病。而且,日志次要是在研发同学排查问题时应用,很少被用于被动监控和告警,日常存在着大量的错误信息始终未被关注和解决。

Sentry:一款受欢迎的利用监控产品

Sentry 是一款开源的利用监控产品,应用 Python、JavaScript、HTML、CSS 打造。在 GitHub 上有 29k Stars,是利用监控畛域 Stars 数排行最高的开源我的项目,其官网声称有 1 百万名开发者和 7 万个组织在应用 Sentry。除了提供开源产品外,其幕后的公司也提供付费的 SaaS 服务:sentry.io。2021 年该公司发表取得了 6000 万美元的 D 轮融资,该轮融资使 Sentry 的总资金达到 1.27 亿美元,融资后估值为 10 亿美元。的确是一款值得关注的产品。

Sentry 有以下重要特点:

  • 产品体验好,功能完善

  • 接入工作量少

    官网和开源社区提供了各种支流开发语言和框架的 SDK,便于开发者接入,大多几十行代码内即可实现。

  • Sentry 专一于 Error、Exception、Crash

    能够查看到具体的错误信息和调用栈,能疾速定位问题代码。

  • 提供丰盛的上下文信息

    SDK 会主动上报根底信息,也反对上报自定义的信息,便于排查问题。

  • 主动合并反复问题

    反复的报错被主动合并且累计次数,防止开发者在大量反复冗余的信息寻找 bug 的蛛丝马迹。

  • 被动邮件告警

    不必再等“客户告警”后才开始排查问题。

自部署 Sentry 的毛病

  • 部署依赖繁多

    利用官网的提供的 Github 仓库,基于 Docker 和 Docker Compose 的确能够一键部署、开箱即用。不过,当看到 30 个容器列在背后时,还是会感觉迟疑。

  • 需自行保障高可用

    如上,Sentry 应用了泛滥组件,比方:ZooKeeper、Nginx、Redis、Memcached、Kafka、PostgreSql、ClickHouse 等,要自行运维这些组件并保障高可用,并不是容易的事件。

防止 Sentry 引发雪崩

引入新的技术或者工具,或多或少都会减少零碎的复杂度和运行危险。

咱们之前出过一次重大问题:某个日均三千万接口申请量的服务产生故障,大量的错误信息涌向 Sentry 服务器,导致 Sentry 响应重大提早,其 Redis 队列内存容量靠近占满,而 Nginx 也全都响应 504 Gateway Timeout。恰好该故障的服务因为申请 Sentry 服务端未设置超时工夫,导致 HTTP 申请同步阻塞,反倒拖垮了服务自身。

为了躲避此类问题,有以下做法:

  • 保障 Sentry 服务端高可用

    这点最重要,但理论咱们并未做好。目前咱们自部署的 Sentry 是一个单点,并没有集群或冗余。如果要实现高可用,那么付出的金钱老本会较高,甚至可能超过了应用 Sentry SaaS 付费服务的老本。因为 Sentry 官网并未提供中国区的服务,HTTP 申请到国外的速度并不现实,应用官网 SaaS 服务也不见得是太好的抉择。

  • 设置 timeout

    应用 Sentry SDK 时,肯定要设置向 Sentry 服务器发送申请的超时工夫,倡议 3 秒以下。

  • 设置 sample_rate

    应用 Sentry SDK 时,能够设置 采样率0.00 示意回绝发送任何事件,1.00 示意发送全副事件。倡议后期设置较小的值,而后视利用的 PV 大小进行调整。应用采样率可能会带来这样的负面影响:零星的谬误可能未上报,导致始终未被发现。

  • 及时熔断
    如果当 Sentry 服务器不堪重负时,应该防止利用持续申请 Sentry 了。比方:能够手动将采样率设置为 0.00
  • 应用异步形式(async)发送申请

    如果 SDK 反对异步发送申请,那就应用,防止同步阻塞。

  • 隔离生产环境的 Sentry

    运维共事隔离部署了两套 Sentry,一套是体验环境,供开发环境 / 测试环境 / 预公布环境的利用接入应用;另外一套是正式环境,供生产环境 / 私有化环境的利用接入应用。如果要试验 Sentry 的性能或调整 Sentry 的配置,那咱们会先在体验环境的 Sentry 中进行,确认没有问题后,才会调整生产环境的 Sentry,借此保障生产环境 Sentry 的稳定性。

  • 通过队列来缓冲申请至 Sentry 的并发压力

    假如利用的申请量和并发量都微小,当呈现重大故障时每个申请解决都产生谬误,那么即便在 SDK 中设置了较低的采样率(比方:0.01),可能申请到 Sentry 的并发量仍旧超过其无限承载。为了防止这个问题,咱们在流量最大的服务中做了如下尝试:咱们减少了一个队列,将服务的谬误事件先入列,启动了大量的生产过程去生产该队列缓缓上报谬误至 Sentry 服务端。并且应用程序中做了解决,即便该队列容量占满也不会影响失常业务(只是抛弃谬误事件)。实践证明,这种直达缓冲的形式十分无效,不过也减少了接入 Sentry 工作量,大家可自行取舍。

Sentry 应用小技巧

  • 上报 Environment

    在不同环境通过 SDK 配置不同的标识,比方:Development、Test、Release、Production、Privatisation,这样不便的辨认和过滤问题。

  • 自定义 Tags

    SDK 会主动帮忙上报一些根底的 Tag,同时咱们也能增加一些自定义的 Tag(比方:租户、我的项目等业务信息),利于排查问题。

    Tag 可用于过滤:

    Tag 可用于统计:

  • 主动标记已解决

    有些 bug 已修复并上线,然而研发同学个别都不记得在 Sentry 手动标记已解决;还存在第三方服务异样等不须要解决的问题,也不太会去手动标记。应用“Auto Resolve”性能,当多久内未再呈现该问题后,零碎会主动帮忙标记为已解决,很不便。

  • 合并问题

    绝大多数反复问题,Sentry 都能自动识别并合并。不过偶然还是存在例外,比方:错误信息中存在一些随机的内容,那么 Sentry 可能会认为是不同类型的谬误,进而未合并,导致反复的问题始终邮件告警,很是烦人。通过设置“Fingerprint Rules”,强制指定同类谬误的“指纹”,这样就能让这些谬误进行合并了。

  • 辨认并解决真正的问题,防止“狼来了”

    别动不动就抛异样或者记 error。举个例子:“您上传的文件格式不正确,请按要求上传正确格局的文件。”,其实这是一个失常的业务提醒,如果将它作为谬误上报到 Sentry,那并没有什么意义,最终也不会进行解决。如果这样的“乐音”越积越多,那么会升高研发同学对真正问题的敏感度。邮件天天收到一堆假的“狼来了”,当“狼”真来了时,咱们可能未采取行动,导致引发事变。当你听到假的“狼来了”时,正确的做法是让它闭嘴,而不是捂住本人的耳朵。比方:批改代码,不要抛异样,或者将 error 改为 warning。总之,别让它上报至 Sentry,别让它烦扰咱们辨认真正的问题。

Sentry 还提供了“性能剖析”、“面包屑”、“辨认可疑提交”等泛滥有用的性能,值得大家去摸索和应用。

咱们部门半年来应用 Sentry 的状况

  • 已接入 9 个利用或服务
  • 累计辨认出数十个荫蔽问题(去重后)
  • 已有 3 个服务达成零问题
  • 2 次辨认到了第三方服务商的异样,并及时反馈给对方解决
  • 2 次及时发现了公布故障并紧急解决

总结

对利用进行监控能够被动发现荫蔽的问题,晋升产品质量。Sentry 是一款受欢迎的利用监控开源产品,领有丰盛且有用的个性,咱们抉择应用它的同时,也采取了很多措施,防止因为引入它导致产生负面影响。咱们在应用过程中积攒了一点心得,最初也取得了不错的应用成果,分享给大家,祝大家 bug 少少,效率高高。

退出移动版