·
隆重推出 Upright:一款开源合成监测系统
我们将 Upright 开源,Upright 是我们构建的用于监控 Basecamp、HEY、Fizzy 和我们许多其他服务的合成监控系统。
我们将 Upright 开源,Upright 是我们构建的用于监控 Basecamp、HEY、Fizzy 和我们许多其他服务的合成监控系统。
Upright 从多个地理位置运行健康检查,并在出现故障时通知我们。它是一个 #Rails 引擎,您可以使用 Kamal 将其部署到世界各地的低成本 VPS 节点上。每个节点都会对您的服务运行探测,并通过 Prometheus 指标报告结果,因此您可以使用 AlertManager 发出警报,并使用 Grafana 进行可视化。
网站概览及世界地图
30 天正常运行时间历史记录
所有站点的探测状态
剧作家调查视频录像
我们为什么建造它
我们使用 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 部署、警报规则和身份验证配置。
试试看
作者 Lewis Buckley
來源 https://dev.37signals.com/introducing-upright/
轉發此貼文?
與您的關注者分享。
回覆