Prometheus与Grafana在监控系统中的运用

在之前的工作中,Prometheus和Grafana这两个工具被频繁使用,它们构成了系统监控的骨干。向这些工具中投入了大量的指标数据,如果没有这些工具,可能无法获得对软件性能问题/瓶颈的深刻洞察。这两个工具确实为提供了巨大的帮助。

但是,这些工具究竟是什么呢?

Prometheus简介

Prometheus是一个指标收集引擎,它内置了一种查询语言PromQL。Prometheus被设置为从应用程序中抓取指标。这是通过一个配置文件来实现的,可以设置这个文件来抓取选择的应用程序。可以在这里阅读入门指南:,以及查询基础:。

正如刚才提到的,可以配置Prometheus使用一个配置文件来抓取应用程序。这个文件叫做prometheus.yml,下面是一个示例,这个示例设置为抓取Prometheus自己的指标,以及运行在端口9000上的另一个应用程序。稍后会展示这个应用程序。

global: scrape_interval: 15s evaluation_interval: 15s alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 rule_files: - "first_rules.yml" - "second_rules.yml" scrape_configs: - job_name: 'prometheus' metrics_path: '/metrics' scheme: 'http' static_configs: - targets: - 'localhost:9090' - 'localhost:9000'

假设已经设置了类似的东西,应该能够使用如下命令启动Prometheus:

prometheus.exe –config.file=prometheus.yml

然后可以导航到以下URL来测试Prometheus的设置:

http://localhost:9090/

这应该会显示类似于以下的内容。

从这里,可以尝试访问这个URL,它将显示一些内置的Prometheus指标:

http://localhost:9090/metrics

假设取其中一个指标,比如go_memstats_alloc_bytes,可以回到http://localhost:9090/并构建一个简单的图表。

Grafana简介

正如刚才看到的,Prometheus提供了相当基础的图表功能。然而,Grafana提供了一种更丰富的图表设置方式,并且它内置了对Prometheus作为数据源的支持。可以从这里下载:。要启动Grafana,只需要启动bin\grafana-server.exe,但请确保也按照前一步所示运行了Prometheus。一旦同时运行了Prometheus和Grafana,可以从http://localhost:3000/启动Grafana UI。

然后可以在Grafana中将Prometheus添加为数据源,操作步骤如下:

一旦完成了这个步骤,可以将注意力转向添加一个新的图表,这可以通过使用“添加查询”按钮来完成。

如果继续使用Prometheus内置的指标作为示例,可以使用go_memstats_alloc_bytes,并添加一个新的面板,使用“添加查询”按钮,可以输入以下指标:

go_memstats_alloc_bytes{instance="localhost:9090",job="prometheus"}

一旦配置完成,应该会看到一个漂亮的小图表,类似于这样:

不会详细介绍如何在Grafana中创建图表的每一个选项,但可以告诉一个非常有用的特性,那就是能够获取一个图表的JSON表示,并用它来创建其他图表。或者也可以复制这个图表,这两个操作都可以通过使用图表顶部的下拉菜单来完成。

这将节省很多时间,当尝试创建自己的面板时。

标签

还想花一点时间谈谈Grafana和Prometheus中的标签。标签允许将项目组合在一个图表上,但根据标签值以某种方式区分它们。例如,假设想要监控某个API的GET和PUT的数量,可以有一个单一的指标,但可以以某种方式应用一些标签值。将在下一节中看到如何使用自己的.NET代码来实现这一点,但目前这就是可以用标签得到的东西。

这个设置类似于Grafana中的这样:

将在下一节中看到如何做到这一点的。

自定义指标在.NET应用中的使用

在自己.NET代码中使用Prometheus实际上是相当简单的,这要归功于Prometheus.NET,这是一个很好的Nuget包,可以在提供的链接中阅读更多:。一旦安装了Nuget,只需要设置想要的指标,并将应用程序添加到Prometheus抓取的应用程序列表中,就像在文章开头的Yaml文件中看到的那样。本质上,Prometheus.NET会在选择的端口上暴露一个web服务器,然后可以配置它被抓取。

让看一个配置指标的示例。将使用一个Gauge类型,这是一个可以上升和下降的指标。还将使用标签,这就是驱动上面图表的原因。

using Prometheus; using System; using System.Threading; namespace PrometheusDemo { class Program { private static readonly Gauge _gauge = Metrics.CreateGauge( "sampleapp_ticks_total", "Just keeps on ticking", new string[1] { "operation" }); private static double _gaugeValue = 0; private static Random _rand = new Random(); static void Main(string[] args) { var server = new MetricServer(hostname: "localhost", port: 9000); server.Start(); while (true) { if (_gaugeValue > 100) { _gaugeValue = 0; _gauge.Set(0); } _gaugeValue = _gaugeValue + 1; if (_rand.NextDouble() > 0.5) { _gauge.WithLabels("PUT").Set(_gaugeValue); } else { _gauge.WithLabels("GET").Set(_gaugeValue); } Console.WriteLine($"Setting gauge value to {_gaugeValue}"); Thread.Sleep(TimeSpan.FromSeconds(1)); } Console.ReadLine(); } } }

这就是整个列表,这足以让暴露一个带有2个标签的单个指标sampleapp_ticks_total

POST GET

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485