예제 #1
0
        internal static object Run(MetricsOptions options)
        {
            using var meter = new Meter("TestMeter");

            var providerBuilder = Sdk.CreateMeterProviderBuilder()
                                  .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("myservice"))
                                  .AddMeter(meter.Name); // All instruments from this meter are enabled.

            if (options.UseExporter.ToLower() == "otlp")
            {
                /*
                 * Prerequisite to run this example:
                 * Set up an OpenTelemetry Collector to run on local docker.
                 *
                 * Open a terminal window at the examples/Console/ directory and
                 * launch the OpenTelemetry Collector with an OTLP receiver, by running:
                 *
                 *  - On Unix based systems use:
                 *     docker run --rm -it -p 4317:4317 -v $(pwd):/cfg otel/opentelemetry-collector:0.33.0 --config=/cfg/otlp-collector-example/config.yaml
                 *
                 *  - On Windows use:
                 *     docker run --rm -it -p 4317:4317 -v "%cd%":/cfg otel/opentelemetry-collector:0.33.0 --config=/cfg/otlp-collector-example/config.yaml
                 *
                 * Open another terminal window at the examples/Console/ directory and
                 * launch the OTLP example by running:
                 *
                 *     dotnet run metrics --useExporter otlp
                 *
                 * The OpenTelemetry Collector will output all received metrics to the stdout of its terminal.
                 *
                 */

                // Adding the OtlpExporter creates a GrpcChannel.
                // This switch must be set before creating a GrpcChannel/HttpClient when calling an insecure gRPC service.
                // See: https://docs.microsoft.com/aspnet/core/grpc/troubleshoot#call-insecure-grpc-services-with-net-core-client
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

                providerBuilder
                .AddOtlpExporter(o =>
                {
                    o.MetricExportIntervalMilliseconds = options.DefaultCollectionPeriodMilliseconds;
                    o.AggregationTemporality           = options.IsDelta ? AggregationTemporality.Delta : AggregationTemporality.Cumulative;
                });
            }
            else
            {
                providerBuilder
                .AddConsoleExporter(o =>
                {
                    o.MetricExportIntervalMilliseconds = options.DefaultCollectionPeriodMilliseconds;
                    o.AggregationTemporality           = options.IsDelta ? AggregationTemporality.Delta : AggregationTemporality.Cumulative;
                });
            }

            using var provider = providerBuilder.Build();

            Counter <int> counter = null;

            if (options.FlagCounter ?? true)
            {
                counter = meter.CreateCounter <int>("counter", "things", "A count of things");
            }

            Histogram <int> histogram = null;

            if (options.FlagHistogram ?? false)
            {
                histogram = meter.CreateHistogram <int>("histogram");
            }

            if (options.FlagGauge ?? false)
            {
                var observableCounter = meter.CreateObservableGauge("gauge", () =>
                {
                    return(new List <Measurement <int> >()
                    {
                        new Measurement <int>(
                            (int)Process.GetCurrentProcess().PrivateMemorySize64,
                            new KeyValuePair <string, object>("tag1", "value1")),
                    });
                });
            }

            var cts = new CancellationTokenSource();

            var tasks = new List <Task>();

            for (int i = 0; i < options.NumTasks; i++)
            {
                var taskno = i;

                tasks.Add(Task.Run(() =>
                {
                    System.Console.WriteLine($"Task started {taskno + 1}/{options.NumTasks}.");

                    var loops = 0;

                    while (!cts.IsCancellationRequested)
                    {
                        if (options.MaxLoops > 0 && loops >= options.MaxLoops)
                        {
                            break;
                        }

                        histogram?.Record(10);

                        histogram?.Record(
                            100,
                            new KeyValuePair <string, object>("tag1", "value1"));

                        histogram?.Record(
                            200,
                            new KeyValuePair <string, object>("tag1", "value2"),
                            new KeyValuePair <string, object>("tag2", "value2"));

                        histogram?.Record(
                            100,
                            new KeyValuePair <string, object>("tag1", "value1"));

                        histogram?.Record(
                            200,
                            new KeyValuePair <string, object>("tag2", "value2"),
                            new KeyValuePair <string, object>("tag1", "value2"));

                        counter?.Add(10);

                        counter?.Add(
                            100,
                            new KeyValuePair <string, object>("tag1", "value1"));

                        counter?.Add(
                            200,
                            new KeyValuePair <string, object>("tag1", "value2"),
                            new KeyValuePair <string, object>("tag2", "value2"));

                        counter?.Add(
                            100,
                            new KeyValuePair <string, object>("tag1", "value1"));

                        counter?.Add(
                            200,
                            new KeyValuePair <string, object>("tag2", "value2"),
                            new KeyValuePair <string, object>("tag1", "value2"));

                        loops++;
                    }
                }));
            }

            cts.CancelAfter(options.RunTime);
            System.Console.WriteLine($"Wait for {options.RunTime} milliseconds.");
            while (!cts.IsCancellationRequested)
            {
                Task.Delay(1000).Wait();
            }

            Task.WaitAll(tasks.ToArray());

            return(null);
        }
예제 #2
0
        internal static object Run(MetricsOptions options)
        {
            using var meter = new Meter("TestMeter");

            var providerBuilder = Sdk.CreateMeterProviderBuilder()
                                  .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("myservice"))
                                  .AddMeter(meter.Name); // All instruments from this meter are enabled.

            if (options.UseExporter.Equals("otlp", StringComparison.OrdinalIgnoreCase))
            {
                /*
                 * Prerequisite to run this example:
                 * Set up an OpenTelemetry Collector to run on local docker.
                 *
                 * Open a terminal window at the examples/Console/ directory and
                 * launch the OpenTelemetry Collector with an OTLP receiver, by running:
                 *
                 *  - On Unix based systems use:
                 *     docker run --rm -it -p 4317:4317 -v $(pwd):/cfg otel/opentelemetry-collector:0.33.0 --config=/cfg/otlp-collector-example/config.yaml
                 *
                 *  - On Windows use:
                 *     docker run --rm -it -p 4317:4317 -v "%cd%":/cfg otel/opentelemetry-collector:0.33.0 --config=/cfg/otlp-collector-example/config.yaml
                 *
                 * Open another terminal window at the examples/Console/ directory and
                 * launch the OTLP example by running:
                 *
                 *     dotnet run metrics --useExporter otlp
                 *
                 * The OpenTelemetry Collector will output all received metrics to the stdout of its terminal.
                 *
                 */

                // Adding the OtlpExporter creates a GrpcChannel.
                // This switch must be set before creating a GrpcChannel when calling an insecure gRPC service.
                // See: https://docs.microsoft.com/aspnet/core/grpc/troubleshoot#call-insecure-grpc-services-with-net-core-client
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

                providerBuilder
                .AddOtlpExporter((exporterOptions, metricReaderOptions) =>
                {
                    exporterOptions.Protocol = options.UseGrpc ? OtlpExportProtocol.Grpc : OtlpExportProtocol.HttpProtobuf;

                    metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = options.DefaultCollectionPeriodMilliseconds;
                    metricReaderOptions.TemporalityPreference = options.IsDelta ? MetricReaderTemporalityPreference.Delta : MetricReaderTemporalityPreference.Cumulative;
                });
            }
            else
            {
                providerBuilder
                .AddConsoleExporter((exporterOptions, metricReaderOptions) =>
                {
                    exporterOptions.Targets = ConsoleExporterOutputTargets.Console;

                    metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = options.DefaultCollectionPeriodMilliseconds;
                    metricReaderOptions.TemporalityPreference = options.IsDelta ? MetricReaderTemporalityPreference.Delta : MetricReaderTemporalityPreference.Cumulative;
                });
            }

            using var provider = providerBuilder.Build();

            Counter <int> counter = null;

            if (options.FlagCounter ?? true)
            {
                counter = meter.CreateCounter <int>("counter", "things", "A count of things");
            }

            Histogram <int> histogram = null;

            if (options.FlagHistogram ?? false)
            {
                histogram = meter.CreateHistogram <int>("histogram");
            }

            if (options.FlagGauge ?? false)
            {
                var observableCounter = meter.CreateObservableGauge("gauge", () =>
                {
                    return(new List <Measurement <int> >()
                    {
                        new Measurement <int>(
                            (int)Process.GetCurrentProcess().PrivateMemorySize64,
                            new KeyValuePair <string, object>("tag1", "value1")),
                    });
                });
            }

            System.Console.WriteLine("Press any key to exit.");
            while (!System.Console.KeyAvailable)
            {
                histogram?.Record(10);

                histogram?.Record(
                    100,
                    new KeyValuePair <string, object>("tag1", "value1"));

                histogram?.Record(
                    200,
                    new KeyValuePair <string, object>("tag1", "value2"),
                    new KeyValuePair <string, object>("tag2", "value2"));

                histogram?.Record(
                    100,
                    new KeyValuePair <string, object>("tag1", "value1"));

                histogram?.Record(
                    200,
                    new KeyValuePair <string, object>("tag2", "value2"),
                    new KeyValuePair <string, object>("tag1", "value2"));

                counter?.Add(10);

                counter?.Add(
                    100,
                    new KeyValuePair <string, object>("tag1", "value1"));

                counter?.Add(
                    200,
                    new KeyValuePair <string, object>("tag1", "value2"),
                    new KeyValuePair <string, object>("tag2", "value2"));

                counter?.Add(
                    100,
                    new KeyValuePair <string, object>("tag1", "value1"));

                counter?.Add(
                    200,
                    new KeyValuePair <string, object>("tag2", "value2"),
                    new KeyValuePair <string, object>("tag1", "value2"));

                Task.Delay(500).Wait();
            }

            return(null);
        }