Skip to main content

Moon

 · 

隆重推出 Upright:一款开源合成监测系统

我们将 Upright 开源,Upright 是我们构建的用于监控 Basecamp、HEY、Fizzy 和我们许多其他服务的合成监控系统。

我们将 Upright 开源,Upright 是我们构建的用于监控 Basecamp、HEY、Fizzy 和我们许多其他服务的合成监控系统。

Upright 从多个地理位置运行健康检查,并在出现故障时通知我们。它是一个 #Rails 引擎,您可以使用 Kamal 将其部署到世界各地的低成本 VPS 节点上。每个节点都会对您的服务运行探测,并通过 Prometheus 指标报告结果,因此您可以使用 AlertManager 发出警报,并使用 Grafana 进行可视化。

Site overview with world map

网站概览及世界地图

30-day uptime history

30 天正常运行时间历史记录

Probe status across all sites

所有站点的探测状态

Playwright probe video recording

剧作家调查视频录像


我们为什么建造它

我们使用 Pingdom 好几年了,它总体上运行良好,但有点像个黑匣子。我们无法自定义检查,无法在不额外付费的情况下运行经过身份验证的浏览器流程,也无法控制检查的具体执行位置。偶尔,探测会失败并触发页面,但问题会在我们来得及调查之前自行解决。

我们想要一些我们自己拥有的、可以扩展的、并且能够融入我们已经使用的开源可观测性堆栈的东西。

Upright 最初是我们用于补充现有监测系统的内部工具。现在,它负责我们遍布全球五个站点的全部合成监测工作。


它的作用

立式支架支持四种类型的探针:

Playwright 探针是其核心功能。这些探针是真正的浏览器检查,可以登录您的应用程序,遍历整个流程,并验证端到端功能是否正常运行。当检查失败时,Upright 会录制视频并记录日志,以便您准确了解出错原因。您可以使用 Playwright API 以 Ruby 类的形式编写这些探针。

HTTP 探测是一种简单的健康检查——访问一个 URL,检查状态码。每个站点每 30 秒运行一次探测。日志采用常见的 cURL 格式。

SMTP 探测验证 EHLO 响应性、STARTTLS 支持和 SSL 证书有效性。

Traceroute 探测利用 MTR 报告,逐跳延迟跟踪来映射到您的服务的网络路径。

所有探测程序都会从​​您部署的每个站点运行,您可以选择错开几秒钟运行。Upright 利用这种多站点数据来区分真正的服务中断和区域性波动。如果阿姆斯特丹的一个站点无法访问您的应用程序,而其他四个站点可以访问,则这是一个区域性问题,而不是全面服务中断。


它是如何建造的

Upright 是一个 Rails 引擎。你创建一个新的 Rails 应用,添加该 gem,运行安装生成器,即可拥有一个可用的监控系统。它使用:

  • 用于存储探测结果的 SQLite
  • 后台和重复性任务的稳定队列
  • Kamal 用于多服务器部署
  • Prometheus 用于指标和正常运行时间查询
  • AlertManager 用于通知
  • OpenTelemetry 用于跟踪和日志记录
  • 仪表盘用户界面的深色和浅色模式

架构很简单:将 Upright 部署到几个廉价的 VPS 节点(例如 DigitalOcean、Hetzner 等),将 DNS 子域名指向每个节点,然后配置探测。我们的设置运行在五个站点上——四个 DigitalOcean 服务器(2 个 vCPU,4GB 内存,每个每月约 24 美元)和一个 Hetzner 服务器(3 个 vCPU,4GB 内存)——总成本约为每月 110 美元。您也可以仅使用 Hetzner 服务器运行一个包含两个站点的最小设置,每月成本不到 20 美元。

每个节点通过环境变量识别自身并独立运行探测程序。指标数据通过 OpenTelemetry 收集器在本地抓取,然后反馈到运行 Prometheus 和 Alertmanager 的主站点。

实际上,我们将指标发送到三个 Prometheus 实例,每个数据中心一个实例,以及一个主 Upright 实例,从而提供完全冗余。


入门

rails new my-upright --database=sqlite3 --skip-test
cd my-upright
bundle add upright
bin/rails generate upright:install
bin/rails db:migrate
bin/dev

安装生成器会创建您需要的一切:Prometheus 和 AlertManager 配置、OpenTelemetry 收集器配置、探测目录、Kamal 部署模板以及用于本地开发服务的 Docker Compose 文件。

在 probes/http_probes.yml 中定义 HTTP 探测:

- name: "37signals.com"
url: "https://37signals.com/"

- name: "Help Ticket Creation"
url: "https://help.37signals.com/billing/tickets/new"
expected_status: 301

或者编写一个 Playwright 探针,登录到您的应用程序并检查真实的用户流程:

class Probes::Playwright::Bc4ProjectProbe < Upright::Probes::Playwright::Base
authenticate_with_form :bc4

def probe_name = "Basecamp 4: view project"

def check
page.goto("https://3.basecamp.com/5228151")

page.get_by_text("37s Monitoring HQ").visible?
end
end

请查看 README 文件以获取完整的设置指南,包括多站点 #Kamal 部署、警报规则和身份验证配置。


试试看

#Upright 现已在 RubyGems 和 GitHub 上发布,采用 MIT 许可证。

作者 Lewis Buckley

來源 https://dev.37signals.com/introducing-upright/

Download Pickful App

Better experience on mobile

iOS QR

iOS

Android QR

Android

APK QR

APK