【详细解说】Prometheus导出器

创造Prometheus Exporter可能会很复杂,但并非必要如此。本文介绍了学习Prometheus基础知识以及实现基于Python的Exporter的两个逐步指南。第一个指南涉及独立公开与监视应用程序相关的度量标准的第三方Exporter。第二个则涵盖公开嵌入式应用程序度量标准的Exporter。
普罗米修斯简介
自2012年推出以来,Prometheus一直是一个应用独特概念的时序指标主要监控工具。具体而言,Prometheus的数据收集采用拉取方法,与其他常见监控工具如Graphite和InfluxDB相比,Prometheus具有出色的可视化和灵活性。
数据收集的拉取方式
数据收集的Pull方法是由服务器组件(Prometheus服务器)定期从客户端组件获取指标来构成的。在Prometheus世界中,这个获取过程通常被称为“scrape”。通过scrape,客户端组件只负责生成和提供可供scrape使用的指标。
很多工具,如Graphique、InfluxDB和其他许多工具,都采用客户端组件生成指标并将其推送到服务器组件的推送方法。因此,客户端决定何时推送数据,而不管服务器是否需要数据或者准备好收集数据。
普罗米修斯的拉取方法非常创新。通过向服务器而不是客户端请求抓取数据,只有在服务器运行并准备好数据时才收集指标。在这种方法中,每个客户端组件都需要启用一个称为普罗米修斯导出器的特定功能。
普罗米修斯出口器
输出器是 Prometheus 监控环境中不可或缺的组成部分。每个充当 Prometheus 客户端功能的程序都将输出器作为其核心。输出器由生成指标数据的软件功能和通过特定端点可访问的生成的指标的HTTP服务器组成。指标按照特定格式公开,以供 Prometheus 服务器读取和采集(抓取)。本文后半部分将详细介绍指标的生成方式、格式以及如何使其可供抓取使用。
柔软的可视化
当Prometheus服务器获取并保存度量时,下一步将对其进行可视化,有多种方法可用。最简单的方法是使用Prometheus Expression Browser。然而,由于它只具备基本的可视化功能,因此表达式浏览器主要用于调试目的(以检查特定度量的可用性或最后一个值)。为了获得更好的高级可视化,用户通常选择其他工具,如Grafana[https://grafana.com/]。此外,在某些情况下,用户可能有自定义的可视化系统,需要直接查询Prometheus API才能获取需要可视化的度量。
当 Prometheus 服务器获取并保存指标后,接下来就要对这些指标进行可视化处理,而有多种方法可供选择。最简单的方法是使用 Prometheus 表达式浏览器。然而,由于它只具备基本的可视化功能,因此该表达式浏览器主要用于调试目的(用于检查特定指标的可用性或最后一个值)。为了获得更好的高级可视化效果,用户通常会选择其他工具,如 Grafana [https://grafana.com/]。此外,在某些上下文中,用户可能会拥有自定义的可视化系统,该系统通过直接查询 Prometheus API 来获取需要进行可视化的指标。
下图展示了Prometheus环境的基本架构,包括服务器组件、两个客户端组件和外部可视化系统。

Prometheus导出器的实现。
从应用程序的角度来看,可以实现Prometheus Exporter的情况有两种,一种是导出内置应用程序度量,另一种是通过独立的工具或第三方工具导出度量。
应用程序嵌入式导出器
在系统或应用程序以本机方式公开主要指标时,通常会发生这种情况。最有趣的例子是应用程序从零开始构建的情况。这是因为可以通过设计进行调查和整合以满足充当Prometheus客户端所需的所有要求。在某些情况下,需要将导出器集成到现有应用程序中。这需要更新代码(甚至设计)以添加充当Prometheus客户端所需的功能。将导出器集成到现有应用程序中可能存在风险,因为需要谨慎进行,以避免对应用程序的核心功能进行回归。如果需要执行此操作,请进行足够的测试,以确保不会引起应用程序的回归(例如,由于代码或设计更改而导致的错误或性能开销)。
独立/第三方出口商
有时需要在外部收集或计算必要的度量。一个例子是当应用程序提供API或日志以获取度量数据时。这些数据可以直接使用,但有时还需要进行额外的处理以生成度量(例如MySQL导出器)。
如果需要在专用系统的整个汇总流程中计算度量标准,可能还需要外部导出器。例如,我们可以考虑一个需要度量标准来显示由标记分组的Pod集使用的CPU资源的Kubernetes集群。这样的导出器可能依赖于Kubernetes API,并且可以按以下方式工作。
-
- 获取当前CPU使用率和每个Pod的标签
-
- 根据Pod的标签汇总使用量
- 使结果可用于网络爬取
Python 實現的 Exporter 實例
在这一部分,我们将逐步介绍如何使用Python实现Prometheus导出器。我们将展示两个例子,涵盖以下指标类型。
-
- カウンター:値が時間の経過とともにのみ増加できるメトリックを表します。 この値は再起動時にゼロにリセットされます。 このようなメトリックは、システムの稼働時間(そのシステムの最後の再起動からの経過時間)をエクスポートするために使用できます。
- ゲージ:値が時間の経過とともに任意に増減できるメトリックを表します。 時間の経過とともにメモリとCPUの使用状況を公開するために使用できます。
我们将考虑两种方案。第一种方案是考虑独立的出口商公开系统的CPU和内存使用情况。第二种方案是通过Flask Web应用程序公开请求的响应时间和运行时间。
独立/第三方的出口商
这个场景展示了一个专用的Python导出程序,它定期收集并公开系统CPU和内存的使用情况。
在这个程序中,需要安装Python用的Prometheus客户端库。
$ pip install prometheus_client
另外,为了提取系统资源的消耗情况,需要安装一个强大的库psutil。
$ pip install psutil
最终的出口商代码将如下所示(请参阅源代码摘要)。

您可以下载代码并保存到文件中。
$ curl -o prometheus_exporter_cpu_memory_usage.py \
-s -L https://git.io/Jesvq
使用以下命令可以启动导出器。
$ python ./prometheus_exporter_cpu_memory_usage.py
通过本地浏览器 http://127.0.0.1:9999 可以检查到由Prometheus库启用的其他内置指标以外,下面的指标需要由导出器提供(值可能根据计算机负载而异)。

太棒了。这是基于Golang、Java、Python和Ruby的Prometheus官方可用客户端库所带来的魔法。它们隐藏了模板代码并使实施导出器变得容易。我们的导出器的基本原理可以在下面的条目中得到概括。
-
- PrometheusクライアントPythonライブラリをインポートします(1行目)。
-
- HTTPサーバーをインスタンス化して、ポート9999(行10)でメトリックを公開します。
-
- ゲージメトリックを宣言し、system_usageという名前を付けます(6行目)。
-
- メトリックの値を設定します(13行目と14行目)。
- メトリックは、多次元データモデルの概念を利用して、ラベル(resource_type、6行目)で宣言されます。 これにより、単一のメトリック名を保持し、ラベルを使用してCPUとメモリのメトリックを区別できます。 ラベルを使用する代わりに、2つのメトリックを宣言することもできます。 どちらの方法でも、メトリックの名前とラベルに関するベストプラクティスを読むことを強くお勧めします。
Flask应用程序的导出器
在这个场景中,我们展示了一个用于Flask网络应用程序的Prometheus导出器。与独立的导出器不同,Flask网络应用程序的导出器具有一个WSGI调度应用程序,它作为一个网关,将请求路由到Flask客户端和Prometheus客户端。这是因为不能将使用Flask启用的HTTP服务器一贯地用作Prometheus客户端。此外,由Prometheus客户端库启用的HTTP服务器不会处理Flask请求。
为了与WSGI包装应用程序进行集成,Prometheus提供了特定的库方法(make_wsgi_app)来创建提供指标的WSGI应用程序。
以下是一个对Flask hello-world应用程序的略微更改的例子(源码要点)- 它展示了如何在Flask应用程序中运行Prometheus Exporter(参考第18行的hello方法)。Flask应用程序可以通过根上下文(/端点)访问,但Prometheus Exporter是通过/metrics端点启用的(请参考第23行创建的WSGI调度应用程序)。关于Prometheus Exporter,有两个指标被公开。
-
- 最後のリクエストの応答時間:これはゲージ(10行目)で、前の例のようにsetメソッドを使用する代わりに、ビジネスコードをクリーンに保ちながら同じ仕事をするPrometheusデコレーター関数(17行目)を導入しました。
- サービス稼働時間:これは、アプリケーションの最後の起動以降に経過した時間を公開するカウンター(8行目)です。専用スレッド(33行目)により、カウンターは毎秒更新されます。

为了使程序运行正常,需要安装额外的依赖关系。
$ pip install uwsgi
接下来,使用WGSI启动程序。
$ curl -o prometheus_exporter_flask.py \
-s -L https://git.io/Jesvh
接下来,我们将服务作为WSGI应用程序启动。
$ uwsgi --http 127.0.0.1:9999 \
--wsgi-file prometheus_exporter_flask.py \
--callable app_dispatch
-wsgi-file需要指定为Python程序文件,而-callable选项的值应该与程序中声明的WSGI应用程序的名称相匹配(第23行)。
您可以在这里通过本地浏览器查看公开的指标:http://127.0.0.1:9999/metrics
在Prometheus库公开的其他内置指标中,您需要找到由出口器公开的以下指标(其值可能因计算机负载而异)。

现在,各种出口器已经准备好通过Prometheus服务器进行爬取。有关更多详细信息,请查看这里。
总结
在这篇文章中,首先解释了Prometheus Exporter的基本概念,然后介绍了使用Python进行两个文档化实现的例子。这些例子利用了Prometheus的最佳实践,可作为构建自定义Exporter的起点,以满足特定应用程序的需求。本文未深入讨论与Prometheus服务器集成或可在工具如Grafana中进行可视化处理的话题。如果您对这些主题感兴趣,请查阅相关链接。
如果您希望尝试 Prometheus,但又不想考虑设置和维护的麻烦,或者不想花费太多时间,那么请务必试试由 MetricFire 提供的托管 Prometheus 的免费试用。您也可以预订演示,并直接咨询 Prometheus 监控解决方案的相关问题。
好的,我们下次再见!