继续我们对 Prometheus 用户的一系列访谈,ShuttleCloud 讲述了他们如何开始使用 Prometheus。ShuttleCloud 的 Ignacio 还在 2016 年的 PromCon 大会上解释了Prometheus 如何对小型初创公司有益。
ShuttleCloud 是做什么的?
ShuttleCloud 是世界上最具可扩展性的电子邮件和联系人数据导入系统。我们通过自动化数据导入切换体验,帮助包括 Google 和 Comcast 在内的一些领先的电子邮件和地址簿提供商增加用户增长和参与度。
通过将我们的 API 集成到他们的产品中,我们的客户允许他们的用户轻松地将他们的电子邮件和联系人从一个参与的提供商迁移到另一个提供商,从而减少用户切换到新提供商时面临的摩擦。支持的 24/7 电子邮件提供商包括所有主要的美国互联网服务提供商:Comcast、Time Warner Cable、AT&T、Verizon 等。
通过为最终用户提供迁移电子邮件的简单途径(同时保持对导入工具 UI 的完全控制),我们的客户显著提高了用户激活和入门率。
ShuttleCloud 与 Google 的 Gmail 平台的集成。 Gmail 通过我们的 API 为 300 万用户导入了数据。
ShuttleCloud 的技术会对处理导入所需的所有数据进行加密,此外还遵循最安全的标准(SSL、oAuth),以确保 API 请求的机密性和完整性。我们的技术使我们能够保证平台的高可用性,正常运行时间高达 99.5%。
您在使用 Prometheus 之前的监控体验是什么?
起初,为我们的基础设施建立一个合适的监控系统不是我们的主要优先事项之一。我们当时的项目和实例不像现在这么多,所以我们使用其他简单的系统来提醒我们是否有任何问题,并将其控制住。
- 我们有一组自动脚本来监控机器的大部分操作指标。这些脚本是基于 cron 的,并使用来自中心机器的 Ansible 执行。警报是以电子邮件的形式直接发送给整个开发团队。
- 我们信任 Pingdom 进行外部黑盒监控,并检查我们所有的前端是否正常运行。他们提供了一个简单的界面和警报系统,以防我们的任何外部服务无法访问。
幸运的是,大客户来了,服务级别协议(SLA)开始变得更加苛刻。因此,我们需要其他东西来衡量我们的表现,并确保我们遵守所有 SLA。我们所需的功能之一是获得关于我们的性能和业务指标(即,有多少迁移正确完成)的准确统计数据,因此报告比监控更让我们在意。
我们开发了以下系统
所有必要数据的来源是 CouchDB 中的一个状态数据库。在那里,每个文档代表一个操作的状态。此信息由状态导入器处理,并以关系方式存储在 MySQL 数据库中。
-
一个组件从该数据库中收集数据,这些信息被聚合并后处理成几个视图。
- 其中一个视图是电子邮件报告,我们需要它用于报告目的。这是通过电子邮件发送的。
- 另一个视图将数据推送到仪表板,可以在那里轻松控制。我们使用的仪表板服务是外部的。我们信任 Ducksboard,不仅因为仪表板易于设置并且看起来很漂亮,还因为它们在达到阈值时提供自动警报。
有了这一切,我们很快意识到,随着项目数量开始增加,我们将需要一个合适的指标、监控和警报系统。
我们当时拥有的系统的一些缺点是
- 没有集中的监控系统。每种指标类型都有一个不同的监控系统
- 系统指标 → Ansible 运行的脚本。
- 业务指标 → Ducksboard 和电子邮件报告。
- 黑盒指标 → Pingdom。
- 没有标准的警报系统。每种指标类型都有不同的警报(电子邮件、推送通知等)。
- 一些业务指标没有警报。这些都是手动审查的。
您为什么决定研究 Prometheus?
我们分析了几个监控和警报系统。我们渴望亲自动手,看看解决方案是成功还是失败。我们决定进行测试的系统是 Prometheus,原因如下
- 首先,您不必定义固定的指标系统就可以开始使用它;指标可以在未来添加或更改。当您还不知道要监控的所有指标时,这提供了宝贵的灵活性。
- 如果您了解 Prometheus,您就会知道指标可以具有标签,从而使我们免于考虑不同的时间序列。这与它的查询语言一起,提供了更大的灵活性和强大的工具。例如,我们可以为不同的环境或项目定义相同的指标,并获得特定的时间序列或使用适当的标签聚合某些指标
-
http_requests_total{job="my_super_app_1",environment="staging"}
- 对应于应用程序“my_super_app_1”的暂存环境的时间序列。 -
http_requests_total{job="my_super_app_1"}
- 对应于应用程序“my_super_app_1”的所有环境的时间序列。 -
http_requests_total{environment="staging"}
- 对应于所有作业的所有暂存环境的时间序列。
-
- Prometheus 支持 DNS 服务进行服务发现。我们碰巧已经有一个内部 DNS 服务。
- 不需要安装任何外部服务(例如,不像 Sensu,它需要 Redis 之类的数据存储服务和 RabbitMQ 之类的消息总线)。这可能不是一个决定因素,但它绝对使测试更容易执行、部署和维护。
- Prometheus 非常容易安装,因为您只需要下载一个可执行的 Go 文件。Docker 容器也运行良好,并且很容易启动。
您如何使用 Prometheus?
最初,我们只使用 node_exporter 提供的一些开箱即用指标,包括
- 硬盘使用率。
- 内存使用率。
- 实例是否启动或关闭。
我们的内部 DNS 服务已集成用于服务发现,因此每个新实例都会自动监控。
我们使用 node_exporter textfile collector 功能导出了默认情况下 node_exporter 未提供的一些指标。我们在 Prometheus Alertmanager 上声明的第一个警报主要与上面提到的操作指标有关。
我们后来开发了一个操作导出器,使我们几乎可以实时了解系统的状态。它公开了业务指标,即所有操作的状态、传入的迁移数量、完成的迁移数量以及错误数量。我们可以在 Prometheus 端对其进行聚合,并让其计算不同的速率。
我们决定导出并监控以下指标
operation_requests_total
operation_statuses_total
operation_errors_total
我们的大部分服务在两个 Google Cloud Platform 可用区中都是重复的。这包括监控系统。在两个或多个不同的区域中拥有多个操作导出器非常简单,因为 Prometheus 可以聚合来自所有导出器的数据并生成一个指标(即,所有导出器的最大值)。我们目前没有高可用的 Prometheus 或 Alertmanager - 只有一个元监控实例 - 但我们正在努力。
对于外部黑盒监控,我们使用 Prometheus Blackbox Exporter。除了检查我们的外部前端是否启动之外,它对于获取 SSL 证书到期日期的指标特别有用。它甚至会检查整个证书链。感谢 Robust Perception 在他们的博客文章中完美地解释了这一点。
我们在 Grafana 中设置了一些图表,以便在一些仪表板中进行可视化监控,并且与 Prometheus 的集成非常简单。用于定义图表的查询语言与 Prometheus 中的相同,这大大简化了它们的创建。
我们还将 Prometheus 与 Pagerduty 集成,并为关键警报创建了值班人员的日程安排。对于那些不被认为是关键的警报,我们只发送电子邮件。
Prometheus 如何使您的工作变得更好?
我们无法将 Prometheus 与我们之前的解决方案进行比较,因为我们之前没有解决方案,但我们可以谈谈 Prometheus 的哪些功能对我们来说是亮点
- 它的维护要求非常少。
- 它很高效:一台机器可以处理整个集群的监控。
- 社区很友好 - 开发人员和用户都是如此。此外,Brian 的博客是一个非常好的资源。
- 它没有第三方要求;它只是服务器和导出器。(无需维护 RabbitMQ 或 Redis。)
- Go 应用程序的部署非常容易。
您认为 ShuttleCloud 和 Prometheus 的未来会怎样?
我们对 Prometheus 非常满意,但我们一直欢迎新的导出器(例如 Celery 或 Spark)。
每次我们添加新警报时都会面临一个问题:我们如何测试警报是否按预期工作?如果能有一种方法来注入虚假指标以引发警报来测试它,那就太好了。