Metrics: quick start docs for Prometheus/Grafana (#2795)
This commit is contained in:
parent
9b27d70c8e
commit
f55bd76817
|
|
@ -226,6 +226,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApp.AspNetCore.6.0", "t
|
|||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "source-generation", "docs\logs\source-generation\source-generation.csproj", "{1F6CC903-04C9-4E7C-B388-C215C467BFB9}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started-prometheus-grafana", "docs\metrics\getting-started-prometheus-grafana\getting-started-prometheus-grafana.csproj", "{41B784AA-3301-4126-AF9F-1D59BD04B0BF}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
|
@ -472,6 +474,10 @@ Global
|
|||
{1F6CC903-04C9-4E7C-B388-C215C467BFB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1F6CC903-04C9-4E7C-B388-C215C467BFB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1F6CC903-04C9-4E7C-B388-C215C467BFB9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{41B784AA-3301-4126-AF9F-1D59BD04B0BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{41B784AA-3301-4126-AF9F-1D59BD04B0BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{41B784AA-3301-4126-AF9F-1D59BD04B0BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{41B784AA-3301-4126-AF9F-1D59BD04B0BF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
|||
|
|
@ -0,0 +1,51 @@
|
|||
// <copyright file="Program.cs" company="OpenTelemetry Authors">
|
||||
// Copyright The OpenTelemetry Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
// </copyright>
|
||||
|
||||
using System;
|
||||
using System.Diagnostics.Metrics;
|
||||
using System.Threading;
|
||||
using OpenTelemetry;
|
||||
using OpenTelemetry.Metrics;
|
||||
|
||||
public class Program
|
||||
{
|
||||
private static readonly Meter MyMeter = new Meter("MyCompany.MyProduct.MyLibrary", "1.0");
|
||||
private static readonly Counter<long> MyFruitCounter = MyMeter.CreateCounter<long>("MyFruitCounter");
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
using var meterProvider = Sdk.CreateMeterProviderBuilder()
|
||||
.AddMeter("MyCompany.MyProduct.MyLibrary")
|
||||
.AddPrometheusExporter(opt =>
|
||||
{
|
||||
opt.StartHttpListener = true;
|
||||
opt.HttpListenerPrefixes = new string[] { $"http://localhost:9184/" };
|
||||
})
|
||||
.Build();
|
||||
|
||||
Console.WriteLine("Press any key to exit");
|
||||
while (!Console.KeyAvailable)
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,197 @@
|
|||
# Quick start on exporting metrics to Prometheus/Grafana
|
||||
|
||||
- [Quick start on exporting metrics to Prometheus/Grafana](#quick-start-on-exporting-metrics-to-prometheusgrafana)
|
||||
- [Prerequisite](#prerequisite)
|
||||
- [Introduction](#introduction)
|
||||
- [Configure OpenTelemetry to Expose metrics via Prometheus Endpoint](#configure-opentelemetry-to-expose-metrics-via-prometheus-endpoint)
|
||||
- [Check Results in the browser](#check-results-in-the-browser)
|
||||
- [Download Prometheus](#download-prometheus)
|
||||
- [Prometheus and Grafana](#prometheus-and-grafana)
|
||||
- [Configuration](#configuration)
|
||||
- [Start Prometheus](#start-prometheus)
|
||||
- [View Results in Prometheus](#view-results-in-prometheus)
|
||||
- [View/Query Results with Grafana](#viewquery-results-with-grafana)
|
||||
|
||||
## Prerequisite
|
||||
|
||||
It is highly recommended to go over the [getting-started](../getting-started/README.md)
|
||||
doc before following along this document.
|
||||
|
||||
## Introduction
|
||||
|
||||
- [What is Prometheus?](https://prometheus.io/docs/introduction/overview/)
|
||||
|
||||
- [Grafana support for
|
||||
Prometheus](https://prometheus.io/docs/visualization/grafana/#creating-a-prometheus-graph)
|
||||
|
||||
### Configure OpenTelemetry to Expose metrics via Prometheus Endpoint
|
||||
|
||||
Create a new console application and run it:
|
||||
|
||||
```sh
|
||||
dotnet new console --output prometheus-http-server
|
||||
cd prometheus-http-server
|
||||
dotnet run
|
||||
```
|
||||
|
||||
Add a reference to [prometheus
|
||||
exporter](https://www.nuget.org/packages/opentelemetry.exporter.prometheus) to
|
||||
this application.
|
||||
|
||||
```shell
|
||||
dotnet add package OpenTelemetry.Exporter.Prometheus --version 1.2.0-rc1
|
||||
```
|
||||
|
||||
Now, we are going to make some small tweaks to the example in the
|
||||
getting-started metrics `Program.cs` to make the metrics available via
|
||||
OpenTelemetry Prometheus Exporter.
|
||||
|
||||
First, copy and paste everything from getting-started
|
||||
metrics [example](../getting-started/Program.cs) to the Program.cs file of the
|
||||
new console application (prometheus-http-server) we've created.
|
||||
|
||||
And replace the below line:
|
||||
|
||||
```csharp
|
||||
.AddConsoleExporter()
|
||||
```
|
||||
|
||||
with
|
||||
|
||||
```csharp
|
||||
.AddPrometheusExporter(opt =>
|
||||
{
|
||||
opt.StartHttpListener = true;
|
||||
opt.HttpListenerPrefixes = new string[] { $"http://localhost:9184/" };
|
||||
})
|
||||
```
|
||||
|
||||
With `.AddPrometheusExporter()` function, OpenTelemetry `PrometheusExporter` will
|
||||
export data via the endpoint defined by `HttpListenerPrefixes`.
|
||||
|
||||
Also, for our learning purpose, use a while-loop to keep increasing the counter
|
||||
value until any key is pressed.
|
||||
|
||||
```csharp
|
||||
Console.WriteLine("Press any key to exit");
|
||||
while (!Console.KeyAvailable)
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
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"));
|
||||
...
|
||||
...
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
After the above modifications, now our `Program.cs` should look like [this](./Program.cs).
|
||||
|
||||
### Check Results in the browser
|
||||
|
||||
Start the application and leave the process running. Now we should be able to
|
||||
see the metrics at the endpoint we've defined in `Program.cs`; in this case, the
|
||||
endpoint is: "http://localhost:9184/".
|
||||
|
||||
Check the output metrics with your favorite browser:
|
||||
|
||||

|
||||
|
||||
Now, we understand how we can configure Opentelemetry `PrometheusExporter` to
|
||||
export metrics the endpoint we specified. Next, we are going to learn about how
|
||||
to use Prometheus and Grafana to view/query the metrics
|
||||
visualization.
|
||||
|
||||
## Download Prometheus
|
||||
|
||||
Follow the [first steps]((https://prometheus.io/docs/introduction/first_steps/))
|
||||
to download the [latest release](https://prometheus.io/download/) of Prometheus.
|
||||
|
||||
## Prometheus and Grafana
|
||||
|
||||
### Configuration
|
||||
|
||||
After finished downloading, extract it to a local location that's easy to
|
||||
access. We will find the default Prometheus configuration YAML file in the
|
||||
folder, named `prometheus.yml`.
|
||||
|
||||
Let's create a new file in the same location as where `prometheus.yml` locates,
|
||||
and named the new file as `otel.yml` for this exercise. Then, copy and paste the
|
||||
entire content below into the otel.yml file we have created just now.
|
||||
|
||||
```yaml
|
||||
global:
|
||||
scrape_interval: 10s
|
||||
scrape_timeout: 10s
|
||||
evaluation_interval: 10s
|
||||
scrape_configs:
|
||||
- job_name: MyOpenTelemetryDemo
|
||||
honor_timestamps: true
|
||||
scrape_interval: 1s
|
||||
scrape_timeout: 1s
|
||||
metrics_path: /metrics
|
||||
scheme: http
|
||||
follow_redirects: true
|
||||
static_configs:
|
||||
- targets:
|
||||
# set the target to the location where metrics will be exposed by
|
||||
# the OpenTelemetry Prometheus Exporter
|
||||
- localhost:9184
|
||||
```
|
||||
|
||||
### Start Prometheus
|
||||
|
||||
Follow the instructions from
|
||||
[starting-prometheus](https://prometheus.io/docs/introduction/first_steps/#starting-prometheus)
|
||||
to start the Prometheus server and verify it has been started successfully.
|
||||
|
||||
Please note that we will need pass in otel.yml file as the argument:
|
||||
|
||||
```console
|
||||
./prometheus --config.file=otel.yml
|
||||
```
|
||||
|
||||
### View Results in Prometheus
|
||||
|
||||
To use the graphical interface for viewing our metrics with Prometheus, navigate
|
||||
to "http://localhost:9090/graph", and type `MyFruitCounter` in the expression
|
||||
bar of the UI; finally, click the execute button.
|
||||
|
||||
We should be able to see the following chart from the browser:
|
||||
|
||||

|
||||
|
||||
From the legend, we can see that the `instance` name and the `job` name are the
|
||||
values we have set in `otel.yml`.
|
||||
|
||||
Congratulations!
|
||||
|
||||
Now we know how to configure Prometheus server and deploy OpenTelemetry
|
||||
`PrometheusExporter` to export our metrics. Next, we are going to explore a tool
|
||||
called Grafana, which has powerful visualizations for the metrics.
|
||||
|
||||
### View/Query Results with Grafana
|
||||
|
||||
Please [Install Grafana](https://grafana.com/docs/grafana/latest/installation/).
|
||||
|
||||
For windows users, after finishing installation, start the standalone Grafana
|
||||
server, grafana-server.exe located in the bin folder. Then, use the browser to
|
||||
navigate to the default port of Grafana `3000`. We can confirm the port number
|
||||
with the logs from the command line after starting the Grafana server as well.
|
||||
|
||||
Follow the instructions in the Grafana getting started
|
||||
[doc](https://grafana.com/docs/grafana/latest/getting-started/getting-started/#step-2-log-in)
|
||||
to log in.
|
||||
|
||||
After successfully logging in, click on the explore option on the left panel of
|
||||
the website - we should be able to write some queries to explore our metrics
|
||||
now!
|
||||
|
||||
Feel free to find some handy PromQL
|
||||
[here](https://promlabs.com/promql-cheat-sheet/).
|
||||
|
||||
In the below example, the query targets to find out what is the per-second rate
|
||||
of increace of myFruitCounter over the last 30 minutes:
|
||||
|
||||

|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus\OpenTelemetry.Exporter.Prometheus.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Loading…
Reference in New Issue