Skip to content

从自研到开源:使用 Prometheus 实现可扩展的网络探测与 HTTP/3 就绪

Published: at 08:00 AM

原文:From Custom to Open: Scalable Network Probing and HTTP/3 Readiness with Prometheus 作者:Amir Reza Asadi 日期:2025 年 3 月 18 日

引言

在 Slack,我们依赖强大的网络基础设施为数百万用户提供无缝的实时通信服务。监控网络的健康状况和性能至关重要,多年来我们一直使用自研的网络探测系统来实现这一目标。然而,随着基础设施的不断扩展,我们需要一个更具可扩展性、更易维护且更加开放的解决方案。

在这篇博文中,我们将分享从自研网络探测系统迁移到 Prometheus Blackbox Exporter 的历程,以及我们如何扩展它以支持 HTTP/3 (QUIC) 探测——这是我们 HTTP/3 就绪计划中的关键一步。

旧系统

我们之前的网络探测系统是一个自研方案,用于对基础设施进行健康检查。虽然它在初期表现良好,但存在以下几个局限性:

为什么选择 Prometheus Blackbox Exporter?

我们选择 Prometheus Blackbox Exporter 有以下几个原因:

  1. 开源且社区驱动: 活跃的社区支持和定期更新。
  2. 原生 Prometheus 集成: 与我们现有的 Prometheus 监控体系无缝集成。
  3. 多协议支持: 内置 HTTP、TCP、DNS、ICMP 和 gRPC 探测支持。
  4. 可扩展性: 模块化架构使得添加 HTTP/3 支持成为可能。
  5. 经过大规模验证: 被许多大型组织用于网络监控。

迁移策略

我们的迁移采用了分阶段的方式:

第一阶段:并行运行

我们同时运行旧系统和 Blackbox Exporter,对比结果以确保一致性。这让我们确信新系统能够满足需求。

第二阶段:配置迁移

我们将现有的探测配置转换为 Blackbox Exporter 基于 YAML 的配置格式。以下是一个基本 HTTP 探测配置的示例:

modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
      valid_status_codes: []  # 默认为 2xx
      method: GET
      follow_redirects: true
      preferred_ip_protocol: "ip4"

第三阶段:切换

在验证结果之后,我们逐步将流量从旧系统转移到 Blackbox Exporter,最终下线了旧系统。

添加 HTTP/3 支持

基础迁移完成后,我们将注意力转向 HTTP/3 就绪。HTTP/3 基于 QUIC 构建,提供了显著的性能改进,包括减少连接建立时间和更好地处理丢包。

挑战

Prometheus Blackbox Exporter 原生不支持 HTTP/3 探测。我们需要对其进行扩展以实现:

  1. 与目标端点建立 QUIC 连接。
  2. 执行 HTTP/3 请求并验证响应。
  3. 暴露相关指标(连接时间、TLS 握手时长等)。

我们的实现

我们利用 quic-go 库为 Blackbox Exporter 贡献了 HTTP/3 支持。主要变更包括:

以下是 HTTP/3 探测的配置示例:

modules:
  http3_2xx:
    prober: http
    timeout: 5s
    http:
      valid_http_versions: ["HTTP/3.0"]
      valid_status_codes: []
      method: GET
      preferred_ip_protocol: "ip4"

暴露的指标

HTTP/3 探测暴露了以下几个有用的指标:

扩展方案

为了应对 Slack 的规模,我们实施了以下几项优化:

成果

此次迁移带来了显著的改进:

结论

从自研网络探测系统迁移到 Prometheus Blackbox Exporter,并扩展 HTTP/3 支持,对 Slack 的基础设施团队来说是一次重大胜利。通过拥抱开源工具,我们降低了维护负担,提升了可观测性,并为 Web 协议的未来做好了准备。

我们鼓励面临类似挑战的其他组织考虑为开源项目做贡献,而不是构建自研方案。社区协作的收益远远超过初始投入。