improve metrics tutorial (#2453)
This commit is contained in:
parent
f05b058613
commit
b52d85c820
|
|
@ -0,0 +1,32 @@
|
|||
// <copyright file="MyExporterExtensions.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 OpenTelemetry;
|
||||
using OpenTelemetry.Metrics;
|
||||
|
||||
internal static class MyExporterExtensions
|
||||
{
|
||||
public static MeterProviderBuilder AddMyExporter(this MeterProviderBuilder builder)
|
||||
{
|
||||
if (builder == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(builder));
|
||||
}
|
||||
|
||||
return builder.AddReader(new BaseExportingMetricReader(new MyExporter()));
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,7 @@
|
|||
// </copyright>
|
||||
|
||||
using System;
|
||||
using System.Text;
|
||||
using OpenTelemetry;
|
||||
using OpenTelemetry.Metrics;
|
||||
|
||||
|
|
@ -29,7 +30,18 @@ internal class MyReader : MetricReader
|
|||
|
||||
protected override bool ProcessMetrics(Batch<Metric> metrics, int timeoutMilliseconds)
|
||||
{
|
||||
Console.WriteLine($"{this.name}.ProcessMetrics(metrics={metrics}, timeoutMilliseconds={timeoutMilliseconds})");
|
||||
var sb = new StringBuilder();
|
||||
foreach (var record in metrics)
|
||||
{
|
||||
if (sb.Length > 0)
|
||||
{
|
||||
sb.Append(", ");
|
||||
}
|
||||
|
||||
sb.Append($"{record}");
|
||||
}
|
||||
|
||||
Console.WriteLine($"{this.name}.ProcessMetrics(metrics=[{sb}], timeoutMilliseconds={timeoutMilliseconds})");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,29 +24,36 @@ 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");
|
||||
|
||||
static Program()
|
||||
{
|
||||
var process = Process.GetCurrentProcess();
|
||||
|
||||
MyMeter.CreateObservableGauge<long>(
|
||||
"MyProcessWorkingSetGauge",
|
||||
() => new List<Measurement<long>>()
|
||||
{
|
||||
new(process.WorkingSet64, new("process.id", process.Id), new("process.bitness", IntPtr.Size << 3)),
|
||||
});
|
||||
}
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
using var meterProvider = Sdk.CreateMeterProviderBuilder()
|
||||
.AddSource("MyCompany.MyProduct.MyLibrary")
|
||||
.AddReader(new MyReader())
|
||||
/** /
|
||||
/*
|
||||
TODO: revisit once this exception is removed "System.InvalidOperationException: Only one Metricreader is allowed.".
|
||||
.AddReader(new BaseExportingMetricReader(new MyExporter()))
|
||||
/**/
|
||||
.AddReader(new MyReader())
|
||||
*/
|
||||
.AddMyExporter()
|
||||
.Build();
|
||||
|
||||
var process = Process.GetCurrentProcess();
|
||||
MyMeter.CreateObservableGauge<long>(
|
||||
"MyGauge",
|
||||
() => new List<Measurement<long>>()
|
||||
{
|
||||
new(process.WorkingSet64, new("process.id", process.Id), new("process.bitness", IntPtr.Size << 3)),
|
||||
});
|
||||
|
||||
var counter = MyMeter.CreateCounter<long>("MyCounter");
|
||||
|
||||
counter.Add(1, new("tag1", "value1"), new("tag2", "value2"));
|
||||
counter.Add(2, new("tag1", "value1"), new("tag2", "value2"));
|
||||
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"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ using OpenTelemetry.Metrics;
|
|||
public class Program
|
||||
{
|
||||
private static readonly Meter MyMeter = new Meter("MyCompany.MyProduct.MyLibrary", "1.0");
|
||||
private static readonly Counter<long> MyCounter = MyMeter.CreateCounter<long>("MyFruitCounter");
|
||||
private static readonly Counter<long> MyFruitCounter = MyMeter.CreateCounter<long>("MyFruitCounter");
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
|
|
@ -30,11 +30,11 @@ public class Program
|
|||
.AddConsoleExporter()
|
||||
.Build();
|
||||
|
||||
MyCounter.Add(1, new("name", "apple"), new("color", "red"));
|
||||
MyCounter.Add(2, new("name", "lemon"), new("color", "yellow"));
|
||||
MyCounter.Add(1, new("name", "lemon"), new("color", "yellow"));
|
||||
MyCounter.Add(2, new("name", "apple"), new("color", "green"));
|
||||
MyCounter.Add(5, new("name", "apple"), new("color", "red"));
|
||||
MyCounter.Add(4, new("name", "lemon"), new("color", "yellow"));
|
||||
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"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,16 @@ using OpenTelemetry.Metrics;
|
|||
public class Program
|
||||
{
|
||||
private static readonly Meter MyMeter = new Meter("MyCompany.MyProduct.MyLibrary", "1.0");
|
||||
private static readonly Histogram<long> MyHistogram = MyMeter.CreateHistogram<long>("MyHistogram");
|
||||
|
||||
static Program()
|
||||
{
|
||||
var process = Process.GetCurrentProcess();
|
||||
|
||||
MyMeter.CreateObservableCounter<double>("Thread.CpuTime", () => GetThreadCpuTime(process), "seconds");
|
||||
|
||||
MyMeter.CreateObservableGauge<int>("Thread.State", () => GetThreadState(process));
|
||||
}
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
|
|
@ -32,17 +42,10 @@ public class Program
|
|||
.AddConsoleExporter()
|
||||
.Build();
|
||||
|
||||
var process = Process.GetCurrentProcess();
|
||||
|
||||
MyMeter.CreateObservableCounter<double>("Thread.CpuTime", () => GetThreadCpuTime(process), "seconds");
|
||||
|
||||
MyMeter.CreateObservableGauge<int>("Thread.State", () => GetThreadState(process));
|
||||
|
||||
var random = new Random();
|
||||
var histogram = MyMeter.CreateHistogram<long>("MyHistogram");
|
||||
for (int i = 0; i < 1000; i++)
|
||||
{
|
||||
histogram.Record(random.Next(1, 1000));
|
||||
MyHistogram.Record(random.Next(1, 1000));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue