private TelemetryItem RunActivityTest(Action <ActivitySource> testScenario) { // SETUP var ActivitySourceName = "MyCompany.MyProduct.MyLibrary"; using var activitySource = new ActivitySource(ActivitySourceName); var transmitter = new MockTransmitter(); var processor = new BatchExportProcessor <Activity>(new AzureMonitorTraceExporter( options: new AzureMonitorExporterOptions { ConnectionString = EmptyConnectionString, }, transmitter: transmitter)); Sdk.CreateTracerProviderBuilder() .SetSampler(new AlwaysOnSampler()) .AddSource(ActivitySourceName) .AddProcessor(processor) .Build(); // ACT testScenario(activitySource); // CLEANUP processor.ForceFlush(); Task.Delay(100).Wait(); //TODO: HOW TO REMOVE THIS WAIT? Assert.True(transmitter.TelemetryItems.Any(), "test project did not capture telemetry"); return(transmitter.TelemetryItems.Single()); }
public void CheckShutdownExport(int timeout) { var exportedItems = new List <Activity>(); using var exporter = new InMemoryExporter <Activity>(exportedItems); using var processor = new BatchExportProcessor <Activity>( exporter, maxQueueSize: 3, maxExportBatchSize: 3, exporterTimeoutMilliseconds: 30000); var activity = new Activity("start"); activity.ActivityTraceFlags = ActivityTraceFlags.Recorded; processor.OnEnd(activity); processor.Shutdown(timeout); if (timeout == 0) { // ForceFlush(0) will trigger flush and return immediately, so let's sleep for a while Thread.Sleep(1_000); } Assert.Single(exportedItems); Assert.Equal(1, processor.ProcessedCount); Assert.Equal(1, processor.ReceivedCount); Assert.Equal(0, processor.DroppedCount); }
public void CheckForceFlushExport(int timeout) { var exportedItems = new List <Activity>(); using var exporter = new InMemoryExporter <Activity>(exportedItems); using var processor = new BatchExportProcessor <Activity>( exporter, maxQueueSize: 3, maxExportBatchSize: 3, exporterTimeoutMilliseconds: 30000); processor.OnEnd(new Activity("start1")); processor.OnEnd(new Activity("start2")); Assert.Equal(0, processor.ProcessedCount); // waiting to see if time is triggering the exporter Thread.Sleep(1_000); Assert.Empty(exportedItems); // forcing flush processor.ForceFlush(timeout); if (timeout == 0) { // ForceFlush(0) will trigger flush and return immediately, so let's sleep for a while Thread.Sleep(1_000); } Assert.Equal(2, exportedItems.Count); Assert.Equal(2, processor.ProcessedCount); Assert.Equal(2, processor.ReceivedCount); Assert.Equal(0, processor.DroppedCount); }
private TelemetryItem RunActivityTest(Action <ActivitySource> testScenario) { // SETUP var ActivitySourceName = $"{nameof(TelemetryItemTests)}.{nameof(RunActivityTest)}"; using var activitySource = new ActivitySource(ActivitySourceName); var mockTransmitter = new MockTransmitter(); var processor = new BatchExportProcessor <Activity>(new AzureMonitorTraceExporter( options: new AzureMonitorExporterOptions { ConnectionString = EmptyConnectionString, }, transmitter: mockTransmitter)); using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetSampler(new AlwaysOnSampler()) .AddSource(ActivitySourceName) .AddProcessor(processor) .Build(); // ACT testScenario(activitySource); // CLEANUP processor.ForceFlush(); Assert.True(mockTransmitter.TelemetryItems.Any(), "test project did not capture telemetry"); return(mockTransmitter.TelemetryItems.Single()); }
private TelemetryItem RunLoggerTest(Action <ILogger <TelemetryItemTests> > testScenario) { // SETUP var mockTransmitter = new MockTransmitter(); var processor = new BatchExportProcessor <LogRecord>(new AzureMonitorLogExporter( options: new AzureMonitorExporterOptions { ConnectionString = EmptyConnectionString, }, transmitter: mockTransmitter)); var serviceCollection = new ServiceCollection().AddLogging(builder => { builder.SetMinimumLevel(LogLevel.Trace) .AddOpenTelemetry(options => options .AddProcessor(processor)); }); using var serviceProvider = serviceCollection.BuildServiceProvider(); var logger = serviceProvider.GetRequiredService <ILogger <TelemetryItemTests> >(); // ACT testScenario(logger); // CLEANUP processor.ForceFlush(); Assert.True(mockTransmitter.TelemetryItems.Any(), "test project did not capture telemetry"); return(mockTransmitter.TelemetryItems.Single()); }
public void CheckForceFlushWithInvalidTimeout() { var exportedItems = new List <Activity>(); using var exporter = new InMemoryExporter <Activity>(exportedItems); using var processor = new BatchExportProcessor <Activity>(exporter, maxQueueSize: 2, maxExportBatchSize: 1); Assert.Throws <ArgumentOutOfRangeException>(() => processor.ForceFlush(-2)); }
// TODO: ADD THIS TEST AFTER IMPLEMENTING ILOGGER EXPORTER //public void VerifyILoggerAsTelemetryItem private void Setup(out BatchExportProcessor <Activity> processor, out MockTransmitter transmitter) { transmitter = new MockTransmitter(); processor = new BatchExportProcessor <Activity>(new AzureMonitorTraceExporter( options: new AzureMonitorExporterOptions { ConnectionString = EmptyConnectionString, }, transmitter: transmitter)); Sdk.CreateTracerProviderBuilder() .SetSampler(new AlwaysOnSampler()) .AddSource(ActivitySourceName) .AddProcessor(processor) .Build(); }
public void CheckExportForRecordingButNotSampledActivity() { var exportedItems = new List <Activity>(); using var exporter = new InMemoryExporter <Activity>(exportedItems); using var processor = new BatchExportProcessor <Activity>( exporter, maxQueueSize: 1, maxExportBatchSize: 1); var activity = new Activity("start"); activity.ActivityTraceFlags = ActivityTraceFlags.None; processor.OnEnd(activity); processor.Shutdown(); Assert.Empty(exportedItems); Assert.Equal(0, processor.ProcessedCount); }
public void StackdriverExporter_TraceClientThrows_ExportResultFailure() { Exception exception = null; ExportResult result = ExportResult.Success; const string ActivitySourceName = "stackdriver.test"; var source = new ActivitySource(ActivitySourceName); var traceClientMock = new Mock <TraceServiceClient>(MockBehavior.Strict); traceClientMock.Setup(x => x.BatchWriteSpans(It.IsAny <BatchWriteSpansRequest>(), It.IsAny <CallSettings>())) .Throws(new RpcException(Status.DefaultCancelled)) .Verifiable($"{nameof(TraceServiceClient.BatchWriteSpans)} was never called"); var activityExporter = new StackdriverTraceExporter("test", traceClientMock.Object); var testExporter = new TestExporter <Activity>(RunTest); var processor = new BatchExportProcessor <Activity>(testExporter); for (int i = 0; i < 10; i++) { using Activity activity = source.StartActivity("Test Activity"); processor.OnEnd(activity); } processor.Shutdown(); void RunTest(Batch <Activity> batch) { exception = Record.Exception(() => { result = activityExporter.Export(batch); }); } Assert.Null(exception); Assert.StrictEqual(ExportResult.Failure, result); traceClientMock.VerifyAll(); }
public void CheckShutdownExport(int timeout) { using var exporter = new TestActivityExporter(); using var processor = new BatchExportProcessor <Activity>( exporter, maxQueueSize: 3, maxExportBatchSize: 3, exporterTimeoutMilliseconds: 30000); processor.OnEnd(new Activity("start")); processor.Shutdown(timeout); if (timeout == 0) { // ForceFlush(0) will trigger flush and return immediately, so let's sleep for a while Thread.Sleep(1_000); } Assert.Single(exporter.Exported); Assert.Equal(1, processor.ProcessedCount); Assert.Equal(1, processor.ReceivedCount); Assert.Equal(0, processor.DroppedCount); }
public void ToOtlpResourceSpansTest(bool addResource, string optionsServiceName) { var evenTags = new[] { new KeyValuePair <string, object>("k0", "v0") }; var oddTags = new[] { new KeyValuePair <string, object>("k1", "v1") }; var sources = new[] { new ActivitySource("even", "2.4.6"), new ActivitySource("odd", "1.3.5"), }; var builder = Sdk.CreateTracerProviderBuilder() .AddSource(sources[0].Name) .AddSource(sources[1].Name); Resources.Resource resource = null; if (addResource) { resource = new Resources.Resource( new List <KeyValuePair <string, object> > { new KeyValuePair <string, object>(Resources.Resource.ServiceNameKey, "service-name"), new KeyValuePair <string, object>(Resources.Resource.ServiceNamespaceKey, "ns1"), }); builder.SetResource(resource); } using var openTelemetrySdk = builder.Build(); var processor = new BatchExportProcessor <Activity>(new TestExporter <Activity>(RunTest)); const int numOfSpans = 10; bool isEven; for (var i = 0; i < numOfSpans; i++) { isEven = i % 2 == 0; var source = sources[i % 2]; var activityKind = isEven ? ActivityKind.Client : ActivityKind.Server; var activityTags = isEven ? evenTags : oddTags; using Activity activity = source.StartActivity($"span-{i}", activityKind, parentContext: default, activityTags); processor.OnEnd(activity); } processor.Shutdown(); void RunTest(Batch <Activity> batch) { var request = new OtlpCollector.ExportTraceServiceRequest(); request.AddBatch( new OtlpExporter( new OtlpExporterOptions { ServiceName = optionsServiceName, }, new NoopTraceServiceClient()), batch); Assert.Single(request.ResourceSpans); var oltpResource = request.ResourceSpans.First().Resource; if (addResource) { Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.Resource.ServiceNameKey && kvp.Value.StringValue == "service-name"); Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.Resource.ServiceNamespaceKey && kvp.Value.StringValue == "ns1"); } else { Assert.Contains(oltpResource.Attributes, (kvp) => kvp.Key == Resources.Resource.ServiceNameKey && kvp.Value.StringValue == optionsServiceName); } foreach (var instrumentationLibrarySpans in request.ResourceSpans.First().InstrumentationLibrarySpans) { Assert.Equal(numOfSpans / 2, instrumentationLibrarySpans.Spans.Count); Assert.NotNull(instrumentationLibrarySpans.InstrumentationLibrary); var expectedSpanNames = new List <string>(); var start = instrumentationLibrarySpans.InstrumentationLibrary.Name == "even" ? 0 : 1; for (var i = start; i < numOfSpans; i += 2) { expectedSpanNames.Add($"span-{i}"); } var otlpSpans = instrumentationLibrarySpans.Spans; Assert.Equal(expectedSpanNames.Count, otlpSpans.Count); var kv0 = new OtlpCommon.KeyValue { Key = "k0", Value = new OtlpCommon.AnyValue { StringValue = "v0" } }; var kv1 = new OtlpCommon.KeyValue { Key = "k1", Value = new OtlpCommon.AnyValue { StringValue = "v1" } }; var expectedTag = instrumentationLibrarySpans.InstrumentationLibrary.Name == "even" ? kv0 : kv1; foreach (var otlpSpan in otlpSpans) { Assert.Contains(otlpSpan.Name, expectedSpanNames); Assert.Contains(expectedTag, otlpSpan.Attributes); } } } }
public void VerifyLoggerWithActivity() { // SETUP var ActivitySourceName = $"{nameof(TelemetryItemTests)}.{nameof(VerifyLoggerWithActivity)}"; using var activitySource = new ActivitySource(ActivitySourceName); var mockTransmitter = new MockTransmitter(); var azureMonitorExporterOptions = new AzureMonitorExporterOptions { ConnectionString = EmptyConnectionString, }; var processor1 = new BatchExportProcessor <Activity>(new AzureMonitorTraceExporter( options: azureMonitorExporterOptions, transmitter: mockTransmitter)); var processor2 = new BatchExportProcessor <LogRecord>(new AzureMonitorLogExporter( options: azureMonitorExporterOptions, transmitter: mockTransmitter)); using var tracerProvider = Sdk.CreateTracerProviderBuilder() .SetSampler(new AlwaysOnSampler()) .AddSource(ActivitySourceName) .AddProcessor(processor1) .Build(); var serviceCollection = new ServiceCollection().AddLogging(builder => { builder.SetMinimumLevel(LogLevel.Trace) .AddOpenTelemetry(options => options .AddProcessor(processor2)); }); using var serviceProvider = serviceCollection.BuildServiceProvider(); var logger = serviceProvider.GetRequiredService <ILogger <TelemetryItemTests> >(); // ACT using (var activity = activitySource.StartActivity(name: "test activity", kind: ActivityKind.Server)) { activity.SetTag("message", "hello activity!"); logger.LogWarning("hello ilogger"); } // CLEANUP processor1.ForceFlush(); processor2.ForceFlush(); // VERIFY Assert.True(mockTransmitter.TelemetryItems.Any(), "test project did not capture telemetry"); Assert.Equal(2, mockTransmitter.TelemetryItems.Count); var logTelemetry = mockTransmitter.TelemetryItems.Single(x => x.Name == "Message"); var activityTelemetry = mockTransmitter.TelemetryItems.Single(x => x.Name == "Request"); var activityId = ((RequestData)activityTelemetry.Data.BaseData).Id; var operationId = activityTelemetry.Tags["ai.operation.id"]; Assert.Equal(activityId, logTelemetry.Tags["ai.operation.parentId"]); Assert.Equal(operationId, logTelemetry.Tags["ai.operation.id"]); }