// // 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. // using System; using System.Collections.Generic; using System.Diagnostics.Metrics; using System.Threading; using System.Threading.Tasks; using OpenTelemetry; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; namespace Examples.Console { internal class TestPrometheusExporter { private static readonly Meter MyMeter = new Meter("TestMeter", "0.0.1"); private static readonly Counter Counter = MyMeter.CreateCounter("myCounter"); private static readonly Histogram MyHistogram = MyMeter.CreateHistogram("myHistogram"); private static readonly Random RandomGenerator = new Random(); internal static object Run(int port, int totalDurationInMins) { /* Following is sample prometheus.yml config. Adjust port,interval as needed. scrape_configs: # The job name is added as a label `job=` to any timeseries scraped from this config. - job_name: 'OpenTelemetryTest' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9184'] */ using var meterProvider = Sdk.CreateMeterProviderBuilder() .AddSource("TestMeter") .AddPrometheusExporter(opt => { opt.StartHttpListener = true; opt.HttpListenerPrefixes = new string[] { $"http://*:{port}/" }; }) .Build(); ObservableGauge gauge = MyMeter.CreateObservableGauge( "Gauge", () => { var tag1 = new KeyValuePair("tag1", "value1"); var tag2 = new KeyValuePair("tag2", "value2"); return new List>() { new Measurement(RandomGenerator.Next(1, 1000), tag1, tag2), }; }); using var token = new CancellationTokenSource(); Task writeMetricTask = new Task(() => { while (!token.IsCancellationRequested) { Counter.Add( 10, new KeyValuePair("tag1", "value1"), new KeyValuePair("tag2", "value2")); Counter.Add( 100, new KeyValuePair("tag1", "anothervalue"), new KeyValuePair("tag2", "somethingelse")); MyHistogram.Record( RandomGenerator.Next(1, 1500), new KeyValuePair("tag1", "value1"), new KeyValuePair("tag2", "value2")); Task.Delay(10).Wait(); } }); writeMetricTask.Start(); token.CancelAfter(totalDurationInMins * 60 * 1000); System.Console.WriteLine($"OpenTelemetry Prometheus Exporter is making metrics available at http://localhost:{port}/metrics/"); System.Console.WriteLine($"Press Enter key to exit now or will exit automatically after {totalDurationInMins} minutes."); System.Console.ReadLine(); token.Cancel(); System.Console.WriteLine("Exiting..."); return null; } } }