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]); } }