在之前的工作中,Prometheus和Grafana这两个工具被频繁使用,它们构成了系统监控的骨干。向这些工具中投入了大量的指标数据,如果没有这些工具,可能无法获得对软件性能问题/瓶颈的深刻洞察。这两个工具确实为提供了巨大的帮助。
但是,这些工具究竟是什么呢?
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/
并构建一个简单的图表。
正如刚才看到的,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代码中使用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