Ejemplo n.º 1
0
        internal static MeterProviderBuilder AddOtlpExporter(
            MeterProviderBuilder builder,
            OtlpExporterOptions exporterOptions,
            MetricReaderOptions metricReaderOptions,
            Action <OtlpExporterOptions> configureExporter,
            Action <OtlpExporterOptions, MetricReaderOptions> configureExporterAndMetricReader,
            IServiceProvider serviceProvider,
            Func <BaseExporter <Metric>, BaseExporter <Metric> > configureExporterInstance = null)
        {
            if (configureExporterAndMetricReader != null)
            {
                configureExporterAndMetricReader.Invoke(exporterOptions, metricReaderOptions);
            }
            else
            {
                configureExporter?.Invoke(exporterOptions);
            }

            exporterOptions.TryEnableIHttpClientFactoryIntegration(serviceProvider, "OtlpMetricExporter");

            BaseExporter <Metric> metricExporter = new OtlpMetricExporter(exporterOptions);

            if (configureExporterInstance != null)
            {
                metricExporter = configureExporterInstance(metricExporter);
            }

            var metricReader = PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(
                metricExporter,
                metricReaderOptions,
                DefaultExportIntervalMilliseconds,
                DefaultExportTimeoutMilliseconds);

            return(builder.AddReader(metricReader));
        }
        private static MeterProviderBuilder AddConsoleExporter(
            MeterProviderBuilder builder,
            ConsoleExporterOptions exporterOptions,
            MetricReaderOptions metricReaderOptions,
            Action <ConsoleExporterOptions> configureExporter,
            Action <ConsoleExporterOptions, MetricReaderOptions> configureExporterAndMetricReader)
        {
            if (configureExporterAndMetricReader != null)
            {
                configureExporterAndMetricReader.Invoke(exporterOptions, metricReaderOptions);
            }
            else
            {
                configureExporter?.Invoke(exporterOptions);
            }

            var metricExporter = new ConsoleMetricExporter(exporterOptions);

            var metricReader = PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(
                metricExporter,
                metricReaderOptions,
                DefaultExportIntervalMilliseconds,
                DefaultExportTimeoutMilliseconds);

            return(builder.AddReader(metricReader));
        }
        private static MeterProviderBuilder AddInMemoryExporter(
            MeterProviderBuilder builder,
            ICollection <Metric> exportedItems,
            MetricReaderOptions metricReaderOptions,
            Action <MetricReaderOptions> configureMetricReader)
        {
            configureMetricReader?.Invoke(metricReaderOptions);

            var metricExporter = new InMemoryExporter <Metric>(exportedItems);

            var metricReader = PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(
                metricExporter,
                metricReaderOptions,
                DefaultExportIntervalMilliseconds,
                DefaultExportTimeoutMilliseconds);

            return(builder.AddReader(metricReader));
        }
    internal static PeriodicExportingMetricReader CreatePeriodicExportingMetricReader(
        BaseExporter <Metric> exporter,
        MetricReaderOptions options,
        int defaultExportIntervalMilliseconds,
        int defaultExportTimeoutMilliseconds)
    {
        var exportInterval =
            options.PeriodicExportingMetricReaderOptions?.ExportIntervalMilliseconds
            ?? defaultExportIntervalMilliseconds;

        var exportTimeout =
            options.PeriodicExportingMetricReaderOptions?.ExportTimeoutMilliseconds
            ?? defaultExportTimeoutMilliseconds;

        var metricReader = new PeriodicExportingMetricReader(exporter, exportInterval, exportTimeout)
        {
            TemporalityPreference = options.TemporalityPreference,
        };

        return(metricReader);
    }
        public void MetricExportResultIsSuccess(OtlpExportProtocol protocol, string endpoint, bool useManualExport, bool forceFlush)
        {
#if NETCOREAPP3_1
            // Adding the OtlpExporter creates a GrpcChannel.
            // This switch must be set before creating a GrpcChannel when calling an insecure HTTP/2 endpoint.
            // See: https://docs.microsoft.com/aspnet/core/grpc/troubleshoot#call-insecure-grpc-services-with-net-core-client
            if (protocol == OtlpExportProtocol.Grpc)
            {
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            }
#endif
            using EventWaitHandle handle = new ManualResetEvent(false);

            var exporterOptions = new OtlpExporterOptions
            {
                Endpoint = new Uri($"http://{CollectorHostname}{endpoint}"),
                Protocol = protocol,
            };

            DelegatingTestExporter <Metric> delegatingExporter = null;

            var meterName = "otlp.collector.test";

            var builder = Sdk.CreateMeterProviderBuilder()
                          .AddMeter(meterName);

            var readerOptions = new MetricReaderOptions();
            readerOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = useManualExport ? Timeout.Infinite : ExportIntervalMilliseconds;

            OtlpMetricExporterExtensions.AddOtlpExporter(
                builder,
                exporterOptions,
                readerOptions,
                configureExporter: null,
                configureExporterAndMetricReader: null,
                serviceProvider: null,
                configureExporterInstance: otlpExporter =>
            {
                delegatingExporter = new DelegatingTestExporter <Metric>(otlpExporter, onExportAction: () => handle.Set());
                return(delegatingExporter);
            });

            using (var meterProvider = builder.Build())
            {
                using var meter = new Meter(meterName);

                var counter = meter.CreateCounter <int>("test_counter");

                counter.Add(18);

                Assert.NotNull(delegatingExporter);

                if (forceFlush)
                {
                    Assert.True(meterProvider.ForceFlush());
                    Assert.Single(delegatingExporter.ExportResults);
                    Assert.Equal(ExportResult.Success, delegatingExporter.ExportResults[0]);
                }
                else if (!useManualExport)
                {
                    Assert.True(handle.WaitOne(ExportIntervalMilliseconds * 2));
                    Assert.Single(delegatingExporter.ExportResults);
                    Assert.Equal(ExportResult.Success, delegatingExporter.ExportResults[0]);
                }
            }

            if (!forceFlush && useManualExport)
            {
                Assert.Single(delegatingExporter.ExportResults);
                Assert.Equal(ExportResult.Success, delegatingExporter.ExportResults[0]);
            }
        }