using System.Diagnostics; using System.Diagnostics.Metrics; var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); var probe = new TelemetryProbe(); using var source = new ActivitySource("SharpRune.WebLab"); using var meter = new Meter("SharpRune.WebLab"); var requests = meter.CreateCounter("lab.quote.count"); using var activities = new ActivityListener { ShouldListenTo = s => s.Name == "SharpRune.WebLab", Sample = (ref ActivityCreationOptions _) => ActivitySamplingResult.AllDataAndRecorded, ActivityStopped = _ => probe.StopActivity() }; ActivitySource.AddActivityListener(activities); using var measurements = new MeterListener(); measurements.InstrumentPublished = (instrument, listener) => { if (instrument.Meter.Name == "SharpRune.WebLab" && instrument.Name == "lab.quote.count") listener.EnableMeasurementEvents(instrument); }; measurements.SetMeasurementEventCallback((instrument, value, tags, state) => probe.Measure(value)); measurements.Start(); app.MapGet("/quote", () => { using var activity = source.StartActivity("quote"); activity?.SetTag("lab.category", "catalog"); requests.Add(1, new KeyValuePair("operation", "quote")); return TypedResults.Ok(new { amount = 12.5m }); }); app.MapGet("/telemetry", () => new { activities = probe.Activities, measurements = probe.Measurements }); app.Run(); public sealed class TelemetryProbe { private int activities; private long measurements; public int Activities => Volatile.Read(ref activities); public long Measurements => Interlocked.Read(ref measurements); public void StopActivity() => Interlocked.Increment(ref activities); public void Measure(long value) => Interlocked.Add(ref measurements, value); }