vlambda博客
学习文章列表

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》普罗米修斯生态系统概述

An Overview of the Prometheus Ecosystem

有如此庞大的组件可供使用,选择解决给定监控差距所需的组件可能会令人生畏。在本章中,我们将回顾 Prometheus 生态系统,哪些组件执行哪些工作,并了解一切如何在逻辑上协同工作。

力求简单并清楚地了解 Prometheus 堆栈的所有移动部分对于保持事情的可管理性和可靠性非常宝贵。

简而言之,本章将涵盖以下主题:

  • Metrics collection with Prometheus
  • Exposing internal state with exporters
  • Alert routing and management with Alertmanager
  • Visualizing your data

Metrics collection with Prometheus

Prometheus 是一个基于时间序列的开源监控系统。它通过向指标端点上的主机和服务发送 HTTP 请求来收集数据,然后使用强大的查询语言将其用于分析和警报。

尽管 Prometheus 通过展示稳定性、成熟度和可靠的治理而毕业于 Cloud Native Computing Foundation (CNCF),但它仍在以非常快的速度发展。在撰写本文时,Prometheus 当前的稳定版本是 2.9.2,将要讨论的每个组件或功能都将基于此版本。虽然版本 2 中不应该有重大的架构更改,但在将从本书中学到的特定配置应用到更早甚至更高版本时应该小心。

High-level overview of the Prometheus architecture

Prometheus 生态系统由几个组件组成,每个组件都有自己的职责和明确定义的范围。 Prometheus 本身是必不可少的,因为它位于大多数交互的中间,但实际上许多组件是可选的,具体取决于您的监控需求。

如下图所示,Prometheus 生态系统中的主要组件如下:

  • The Prometheus server collects time series data, stores it, makes it available for querying, and sends alerts based on it.
  • The Alertmanager receives alert triggers from Prometheus and handles routing and dispatching of alerts.
  • The Pushgateway handles the exposition of metrics that have been pushed from short-lived jobs such as cron or batch jobs.
  • Applications that support the Prometheus exposition format make internal state available through an HTTP endpoint.
  • Community-driven exporters expose metrics from applications that do not support Prometheus natively.
  • First-party and third-party dashboarding solutions provide a visualization of collected data.

本书后面将深入探讨每一个:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》普罗米修斯生态系统概述
Figure 2.1: High-level overview of the main components in the Prometheus ecosystem
Prometheus 服务器有自己的内部流程,比如记录规则和服务发现,在中有详细的解释 第 9 章定义警报和记录规则 <跨度> 第十二章选择正确的服务发现 , 分别。

Prometheus 最初是由 Matt T. Proud 和 Julius Volz 在 SoundCloud 工作时创建的。它的灵感来自 Google 的 Borgmon,它影响了它早期的许多设计:从指标端点抓取纯文本;出口商作为指标收集的代理;时间序列作为多维向量,然后可以对其进行转换和过滤;以及使用规则集评估来记录和警报,以及其他功能。

您可能很想尝试使 Prometheus 适合基于推送的指标收集模型,但这是不明智的。 Prometheus 的核心设计是围绕拉动,所以在从推向拉动转换时,许多假设自然会被打破。这将在我们接近 Pushgateway 时进一步解释。

Prometheus 的一个独特属性是它毫不掩饰地不尝试进行任何类型的聚类。通过不依赖网络进行协调和存储(尽管远程写入是可能的,正如我们将在本书末尾看到的那样),它为可靠性和易用性提供了一个很好的论据。只需选择适当的 Prometheus 二进制发行版并在您的计算机上本地运行它是微不足道的,但相同的二进制文件可能能够处理数千个抓取目标和每秒在服务器硬件上摄取数百万个样本。

Exposing internal state with exporters

并非所有应用程序都使用与 Prometheus 兼容的仪器构建。有时,根本没有公开任何指标。在这些情况下,我们可以依赖出口商。下图显示了它们的工作原理:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》普罗米修斯生态系统概述
Figure 2.2: A high-level overview of an exporter

导出器只不过是一个从服务或应用程序收集数据并通过 HTTP 以 Prometheus 格式公开数据的软件。每个出口商通常针对特定的服务或应用程序,因此,他们的部署反映了这种一对一的协同作用。

如今,您几乎可以为您需要的任何服务找到导出器,如果某个特定的第三方服务没有可用的导出器,则构建自己的导出器非常简单。

Exporter fundamentals

当导出器启动时,它会绑定到配置的端口并公开在您选择的 HTTP 端点中收集的任何内容的内部状态(默认为 /metrics)。当向配置的端点发出 HTTP GET 请求时,将收集检测数据。例如,节点导出器是最常用的导出器之一,它依赖于许多内核统计数据来呈现数据,例如磁盘 I/O、CPU、内存、网络、文件系统使用情况等等。每次抓取该端点时,信息都会快速收集并在同步操作中公开。

Prometheus 服务器向被观察系统发出的用于度量收集的 HTTP GET 请求称为 刮。

如果您是编写服务的人,最好的选择是直接使用 Prometheus 客户端库来检测代码。有可用于以下编程语言的官方客户端库:

  • Go
  • Java/JVM
  • Python
  • Ruby

以下编程语言有社区驱动的客户端库:

  • Bash
  • C++
  • Common Lisp
  • Elixir
  • Erlang
  • Haskell
  • Lua for NGINX
  • Lua for Tarantool
  • .NET
  • C#
  • Node.js
  • Perl
  • PHP
  • Rust

由于围绕 Prometheus 的社区不断发展壮大,这个列表也在不断扩大。

通常,出口商很轻,性能足迹几乎可以忽略不计,但与往常一样,这条规则也有例外,我们将在本书后面详细介绍。

Alert routing and management with Alertmanager

Alertmanager 是 Prometheus 生态系统中的组件,负责由 Prometheus 服务器生成的警报触发的通知。因此,它的可用性至关重要,设计选择反映了这种需求。它是唯一真正设计用于高可用集群设置的组件,并使用 gossip 作为通信协议:

读书笔记《hands-on-infrastructure-monitoring-with-prometheus》普罗米修斯生态系统概述
Figure 2.3: A high-level overview of Alertmanager

在非常高的级别上,Alertmanager 是一种服务,它通过其 API 接收来自 Prometheus 服务器的 HTTP POST 请求,然后按照预定义的一组路由对其进行重复数据删除和操作。

Alertmanager 还公开了一个 Web 界面,例如,允许对触发警报进行可视化和静音或为它们应用禁止规则。

核心设计选择之一是重视交付而不是重复数据删除。这意味着如果在 Alertmanager 实例集群之间发生网络分区,则会从分区的两侧发送通知。

Alerting routes

一条路线本质上可以看作是一个树状结构。如果传入警报具有触发特定路由(分支)的特定负载,则将调用预定义的集成。

有多种开箱即用的集成可用于最常见的用例,例如:

  • Email
  • Hipchat
  • PagerDuty
  • Slack
  • Opsgenie
  • VictorOps
  • WeChat

还有一个 webhook 集成,它向您选择的端点发出带有触发警报的 JSON 有效负载的 HTTP POST 请求,从而为自定义集成打开了无限可能。

Visualizing your data

数据可视化是生产或消费信息的最简单方法之一。 Prometheus 公开了一个定义良好的 API,PromQL 查询可以在其中生成用于可视化的原始数据。

目前最好的可视化外部软件是Grafana,我们将在第 10 章发现和创建 Grafana 仪表板。 Grafana 团队已将其与 Prometheus 无缝集成,从而带来令人愉悦的用户体验。

Prometheus 服务器还附带两个内部可视化组件:

  • Expression browser: Here, you can run PromQL directly to quickly query data and visualize it instantly:
读书笔记《hands-on-infrastructure-monitoring-with-prometheus》普罗米修斯生态系统概述
Figure 2.4: The Prometheus expression browser interface
  • Consoles: These are web pages that are built using the Golang templating language and are served by the Prometheus server itself. This approach allows you to have pre-defined data visualization interfaces without you having to constantly type PromQL:
读书笔记《hands-on-infrastructure-monitoring-with-prometheus》普罗米修斯生态系统概述
Figure 2.5: The Prometheus console interface

Summary

为了更好地理解 Prometheus 的理念,即使是高水平的洞察力,也必须深入了解 Prometheus 生态系统的主要组成部分,从通过导出器收集数据到使用 Alertmanager 的可靠警报,以及可用的可视化选项。这就是我们在本章中介绍的内容。

在下一章中,我们将开始构建一个测试环境,以便我们目前讨论的所有概念都可以开始实现。

Questions

  1. What are the main components of the Prometheus ecosystem?
  2. Which components are essential and which are optional for a Prometheus deployment?
  3. Why are out-of-process exporters needed?
  4. When an HTTP GET request hits the metrics endpoint of an exporter, what ensues?
  5. What happens to a triggering alert in an Alertmanager cluster if a network partition occurs?
  6. You realize you need to integrate Alertmanager with a custom-made API. What would be your quickest option?
  7. What visualizations options are included in a standard Prometheus server installation?

Further reading