导出到 Prometheus 和 Grafana

了解如何将指标导出到 Prometheus 并在 Grafana 中进行可视化

本指南将向您展示如何将 OpenTelemetry 指标导出到 Prometheus 并在 Grafana 中进行可视化。

先决条件

  • 在您的计算机上安装了 .NET SDK
  • 下载了 Prometheus(我们将介绍安装过程)
  • 下载了 Grafana(我们将介绍安装过程)

使用 OTLP 导出创建 .NET 应用程序

首先,请按照 控制台入门 指南了解指标收集的基础知识。

创建一个新的控制台应用程序

dotnet new console --output getting-started-prometheus-grafana
cd getting-started-prometheus-grafana

安装 OpenTelemetry OTLP Exporter 包

dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol

使用以下代码更新 Program.cs 文件

using System;
using System.Diagnostics.Metrics;
using System.Threading;
using OpenTelemetry;
using OpenTelemetry.Exporter;
using OpenTelemetry.Metrics;

// Define a meter
var myMeter = new Meter("MyCompany.MyProduct.MyLibrary", "1.0");

// Create a counter instrument
var myFruitCounter = myMeter.CreateCounter<long>("MyFruitCounter");

// Configure the OpenTelemetry MeterProvider with OTLP export
using var meterProvider = Sdk.CreateMeterProviderBuilder()
    .AddMeter("MyCompany.MyProduct.MyLibrary")
    .AddOtlpExporter((exporterOptions, metricReaderOptions) =>
    {
        exporterOptions.Endpoint = new Uri("https://:9090/api/v1/otlp/v1/metrics");
        exporterOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
        metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
    })
    .Build();

Console.WriteLine("Press any key to exit");

// Keep generating metrics until user presses a key
while (!Console.KeyAvailable)
{
    myFruitCounter.Add(1, new("name", "apple"), new("color", "red"));
    myFruitCounter.Add(2, new("name", "lemon"), new("color", "yellow"));
    myFruitCounter.Add(1, new("name", "lemon"), new("color", "yellow"));
    myFruitCounter.Add(2, new("name", "apple"), new("color", "green"));
    myFruitCounter.Add(5, new("name", "apple"), new("color", "red"));
    myFruitCounter.Add(4, new("name", "lemon"), new("color", "yellow"));

    Thread.Sleep(300);
}

// Dispose meter provider before the application ends.
// This will flush the remaining metrics and shutdown the metrics pipeline.
meterProvider.Dispose();

运行此应用程序时,它将尝试将指标导出到 Prometheus,地址为 https://:9090/api/v1/otlp/v1/metrics。一开始,这将失败,因为我们还没有设置 Prometheus,我们将在下一步进行。

设置 Prometheus

Prometheus 是一个开源的监控和告警系统,可以抓取和存储指标。

安装和运行 Prometheus

  1. 官方网站 下载 Prometheus
  2. 将其解压到您机器上的某个位置
  3. 运行 Prometheus 并启用 OTLP 接收器
./prometheus --web.enable-otlp-receiver

在 Prometheus 中查看指标

  1. 运行您的 .NET 应用程序(现在应该可以成功将指标导出到 Prometheus)
  2. 打开 Web 浏览器并导航到 https://:9090/graph
  3. 在表达式栏中,输入 MyFruitCounter_total 并单击“执行”

您应该会看到一个图表,显示每个水果名称和颜色组合的计数器值的增加情况。

设置 Grafana

Grafana 提供了比 Prometheus 的基本 UI 更强大的可视化功能。

安装和运行 Grafana

  1. 按照 官方说明 安装 Grafana
  2. 启动 Grafana 服务器(命令因操作系统而异)
  3. 在浏览器中导航到 https://:3000
  4. 使用默认凭据(用户名:admin,密码:admin)登录,并在提示时设置新密码

将 Prometheus 配置为数据源

  1. 在 Grafana 中,将鼠标悬停在左侧边栏的“配置”(齿轮)图标上,然后单击“数据源”
  2. 单击“添加数据源”
  3. 选择“Prometheus”
  4. 将 URL 设置为 https://:9090
  5. 单击底部的“保存并测试”

创建仪表板

  1. 单击左侧边栏的“+”图标,然后选择“仪表板”
  2. 单击“添加新面板”
  3. 在查询编辑器中,输入 PromQL 查询,例如 rate(MyFruitCounter_total[5m]),以查看过去 5 分钟内每秒的增长率
  4. 单击“应用”将面板添加到您的仪表板
  5. 通过单击右上角的保存图标来保存您的仪表板

理解指标流

flowchart LR
    App[.NET App] --> Exporter[OTLP Exporter]
    Exporter --> Prometheus[Prometheus Server]
    Prometheus --> Grafana[Grafana Dashboard]
  1. 您的 .NET 应用程序使用 OpenTelemetry 仪器收集指标
  2. OTLP Exporter 使用 OTLP 协议将这些指标发送到 Prometheus
  3. Prometheus 将指标存储在其时序数据库中
  4. Grafana 查询 Prometheus 并在仪表板中可视化指标

了解更多