internal static object Run() { var zpagesOptions = new ZPagesExporterOptions() { Url = "http://localhost:7284/rpcz/" }; var zpagesExporter = new ZPagesExporter(zpagesOptions); var spanProcessor = new SimpleSpanProcessor(zpagesExporter); var httpServer = new ZPagesExporterStatsHttpServer(zpagesExporter, spanProcessor); // Start the server httpServer.Start(); // Configure exporter using (var tracerFactory = TracerFactory.Create(builder => builder .AddProcessorPipeline(b => b .SetExporter(zpagesExporter) .SetExportingProcessor(e => spanProcessor)))) { var tracer = tracerFactory.GetTracer("zpages-test"); while (true) { // Create a scoped span. It will end automatically when using statement ends using (tracer.WithSpan(tracer.StartSpan("Main"))) { Console.WriteLine("Starting Span"); } Thread.Sleep(500); } } }
public void ZPagesExporter_ZPagesProcessor() { const string ActivitySourceName = "zpages.test"; Guid requestId = Guid.NewGuid(); ZPagesExporterOptions options = new ZPagesExporterOptions { RetentionTime = 100_000, Url = "http://localhost:7284/rpcz/", }; ZPagesExporter exporter = new ZPagesExporter(options); var zpagesProcessor = new ZPagesProcessor(exporter); using var openTelemetrySdk = Sdk.CreateTracerProviderBuilder() .AddSource(ActivitySourceName) .AddProcessor(zpagesProcessor) .AddZPagesExporter() .Build(); var source = new ActivitySource(ActivitySourceName); var activity0 = source.StartActivity("Test Zipkin Activity"); // checking size of dictionaries from ZPagesActivityTracker Assert.Equal(1, ZPagesActivityTracker.ProcessingList.First().Value); Assert.Equal(1, ZPagesActivityTracker.TotalCount.First().Value); Assert.Single(ZPagesActivityTracker.TotalEndedCount); Assert.Single(ZPagesActivityTracker.TotalErrorCount); Assert.Single(ZPagesActivityTracker.TotalLatency); var activity1 = source.StartActivity("Test Zipkin Activity"); // checking size of dictionaries from ZPagesActivityTracker Assert.Equal(2, ZPagesActivityTracker.ProcessingList.First().Value); Assert.Equal(2, ZPagesActivityTracker.TotalCount.First().Value); Assert.Single(ZPagesActivityTracker.TotalEndedCount); Assert.Single(ZPagesActivityTracker.TotalErrorCount); Assert.Single(ZPagesActivityTracker.TotalLatency); var activity2 = source.StartActivity("Test Zipkin Activity 2"); // checking size of dictionaries from ZPagesActivityTracker Assert.Equal(2, ZPagesActivityTracker.ProcessingList.Count); Assert.Equal(2, ZPagesActivityTracker.TotalCount.Count); Assert.Equal(2, ZPagesActivityTracker.TotalEndedCount.Count); Assert.Equal(2, ZPagesActivityTracker.TotalErrorCount.Count); Assert.Equal(2, ZPagesActivityTracker.TotalLatency.Count); activity0?.Stop(); activity1?.Stop(); activity2?.Stop(); // checking if activities were processed Assert.Equal(0, ZPagesActivityTracker.ProcessingList.First().Value); Assert.Equal(0, ZPagesActivityTracker.ProcessingList.Last().Value); Assert.Empty(ZPagesActivityTracker.ZQueue); }
internal static object Run() { var zpagesOptions = new ZPagesExporterOptions() { Url = "http://localhost:7284/rpcz/" }; var zpagesExporter = new ZPagesExporter(zpagesOptions); var spanProcessor = new ZPagesSpanProcessor(zpagesExporter); ZPagesSpans.RetentionTime = 3600000; var httpServer = new ZPagesExporterStatsHttpServer(zpagesExporter, spanProcessor); // Start the server httpServer.Start(); // Configure exporter using (var tracerFactory = TracerFactory.Create(builder => builder .AddProcessorPipeline(b => b .SetExporter(zpagesExporter) .SetExportingProcessor(e => spanProcessor)))) { var tracer = tracerFactory.GetTracer("zpages-test"); while (true) { // Create a scoped span. TelemetrySpan telemetrySpan = tracer.StartSpan("Main"); telemetrySpan.Status = Status.Unavailable; using (tracer.WithSpan(telemetrySpan)) { Console.WriteLine("Starting Span"); } Thread.Sleep(3000); telemetrySpan.End(); // Create a scoped span. TelemetrySpan telemetrySpan2 = tracer.StartSpan("TestSpan"); telemetrySpan2.Status = Status.Ok; using (tracer.WithSpan(telemetrySpan2)) { Console.WriteLine("Starting Span2"); } Thread.Sleep(5000); telemetrySpan2.End(); } } }
public void CheckingCustomOptions() { ZPagesExporterOptions options = new ZPagesExporterOptions { RetentionTime = 100_000, Url = "http://localhost:7284/rpcz/", }; ZPagesExporter exporter = new ZPagesExporter(options); Assert.Equal(options.Url, exporter.Options.Url); Assert.Equal(options.RetentionTime, exporter.Options.RetentionTime); }
public async Task ZPagesExporter_Integration() { var batchActivity = new List <Activity> { CreateTestActivity() }; ZPagesExporter exporter = new ZPagesExporter(new ZPagesExporterOptions()); var exportResult = await exporter.ExportAsync(batchActivity, CancellationToken.None).ConfigureAwait(false); Assert.Equal(ExportResult.Success, exportResult); await exporter.ShutdownAsync(CancellationToken.None).ConfigureAwait(false); }
public static TracerProviderBuilder AddZPagesExporter( this TracerProviderBuilder builder, Action <ZPagesExporterOptions> configure = null) { Guard.ThrowIfNull(builder); var exporterOptions = new ZPagesExporterOptions(); configure?.Invoke(exporterOptions); var zpagesExporter = new ZPagesExporter(exporterOptions); // TODO: Pick Simple vs Batching based on ZipkinExporterOptions return(builder.AddProcessor(new ZPagesProcessor(zpagesExporter))); }
/// <summary> /// Registers a Zipkin exporter that will receive <see cref="System.Diagnostics.Activity"/> instances. /// </summary> /// <param name="builder"><see cref="TracerProviderBuilder"/> builder to use.</param> /// <param name="configure">Exporter configuration options.</param> /// <returns>The instance of <see cref="TracerProviderBuilder"/> to chain the calls.</returns> public static TracerProviderBuilder AddZPagesExporter( this TracerProviderBuilder builder, Action <ZPagesExporterOptions> configure = null) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } var exporterOptions = new ZPagesExporterOptions(); configure?.Invoke(exporterOptions); var zpagesExporter = new ZPagesExporter(exporterOptions); // TODO: Pick Simple vs Batching based on ZipkinExporterOptions return(builder.AddProcessor(new ZPagesProcessor(zpagesExporter))); }
internal static object Run() { var zpagesOptions = new ZPagesExporterOptions() { Url = "http://localhost:7284/rpcz/", RetentionTime = 3600000 }; var zpagesExporter = new ZPagesExporter(zpagesOptions); var httpServer = new ZPagesExporterStatsHttpServer(zpagesExporter); // Start the server httpServer.Start(); using var openTelemetry = OpenTelemetrySdk.CreateTracerProviderBuilder() .AddSource("zpages-test") .AddZPagesExporter(o => { o.Url = zpagesOptions.Url; o.RetentionTime = zpagesOptions.RetentionTime; }) .Build(); ActivitySource activitySource = new ActivitySource("zpages-test"); while (true) { // Create a scoped activity. It will end automatically when using statement ends using (activitySource.StartActivity("Main")) { System.Console.WriteLine("About to do a busy work in Main"); } Thread.Sleep(3000); // Create a scoped activity. It will end automatically when using statement ends using (activitySource.StartActivity("Test")) { System.Console.WriteLine("About to do a busy work in Test"); } Thread.Sleep(5000); } }
/// <summary> /// Registers a Zipkin exporter that will receive <see cref="System.Diagnostics.Activity"/> instances. /// </summary> /// <param name="builder"><see cref="TracerProviderBuilder"/> builder to use.</param> /// <param name="configure">Exporter configuration options.</param> /// <param name="processorConfigure">Activity processor configuration.</param> /// <returns>The instance of <see cref="TracerProviderBuilder"/> to chain the calls.</returns> public static TracerProviderBuilder UseZPagesExporter( this TracerProviderBuilder builder, Action <ZPagesExporterOptions> configure = null, Action <ActivityProcessorPipelineBuilder> processorConfigure = null) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } return(builder.AddProcessorPipeline(pipeline => { var options = new ZPagesExporterOptions(); configure?.Invoke(options); var exporter = new ZPagesExporter(options); processorConfigure?.Invoke(pipeline); pipeline.SetExporter(exporter); })); }
internal static object Run() { var zpagesOptions = new ZPagesExporterOptions() { Url = "http://localhost:7284/rpcz/", RetentionTime = 3600000 }; var zpagesExporter = new ZPagesExporter(zpagesOptions); var zpagesProcessor = new ZPagesProcessor(zpagesExporter); var httpServer = new ZPagesExporterStatsHttpServer(zpagesExporter); // Start the server httpServer.Start(); using var openTelemetry = Sdk.CreateTracerProvider( builder => builder .AddActivitySource("zpages-test") .UseZPagesExporter( processorConfigure: processor => processor .AddProcessor((next) => zpagesProcessor))); ActivitySource activitySource = new ActivitySource("zpages-test"); while (true) { // Create a scoped activity. It will end automatically when using statement ends using (activitySource.StartActivity("Main")) { System.Console.WriteLine("About to do a busy work in Main"); } Thread.Sleep(3000); // Create a scoped activity. It will end automatically when using statement ends using (activitySource.StartActivity("Test")) { System.Console.WriteLine("About to do a busy work in Test"); } Thread.Sleep(5000); } }
public async Task CheckingZPagesProcessor() { const string ActivitySourceName = "zpages.test"; ZPagesExporterOptions options = new ZPagesExporterOptions { RetentionTime = 100_000, Url = "http://localhost:7284/rpcz/", }; ZPagesExporter exporter = new ZPagesExporter(options); var zpagesProcessor = new ZPagesProcessor(exporter); var source = new ActivitySource(ActivitySourceName); var activity0 = source.StartActivity("Test Zipkin Activity 1"); zpagesProcessor.OnStart(activity0); // checking size of dictionaries from ZPagesActivityTracker Assert.Equal(1, ZPagesActivityTracker.ProcessingList.First().Value); Assert.Equal(1, ZPagesActivityTracker.TotalCount.First().Value); Assert.Single(ZPagesActivityTracker.TotalEndedCount); Assert.Single(ZPagesActivityTracker.TotalErrorCount); Assert.Single(ZPagesActivityTracker.TotalLatency); var activity1 = source.StartActivity("Test Zipkin Activity 1"); zpagesProcessor.OnStart(activity1); // checking size of dictionaries from ZPagesActivityTracker Assert.Equal(2, ZPagesActivityTracker.ProcessingList.First().Value); Assert.Equal(2, ZPagesActivityTracker.TotalCount.First().Value); Assert.Single(ZPagesActivityTracker.TotalEndedCount); Assert.Single(ZPagesActivityTracker.TotalErrorCount); Assert.Single(ZPagesActivityTracker.TotalLatency); var activity2 = source.StartActivity("Test Zipkin Activity 2"); zpagesProcessor.OnStart(activity2); // checking size of dictionaries from ZPagesActivityTracker Assert.Equal(2, ZPagesActivityTracker.ProcessingList.Count); Assert.Equal(2, ZPagesActivityTracker.TotalCount.Count); Assert.Equal(2, ZPagesActivityTracker.TotalEndedCount.Count); Assert.Equal(2, ZPagesActivityTracker.TotalErrorCount.Count); Assert.Equal(2, ZPagesActivityTracker.TotalLatency.Count); activity0?.Stop(); activity1?.Stop(); activity2?.Stop(); zpagesProcessor.OnEnd(activity0); zpagesProcessor.OnEnd(activity1); zpagesProcessor.OnEnd(activity2); // checking if activities were processed Assert.Equal(0, ZPagesActivityTracker.ProcessingList.First().Value); Assert.Equal(0, ZPagesActivityTracker.ProcessingList.Last().Value); Assert.Empty(ZPagesActivityTracker.ZQueue); var zpagesServer = new ZPagesExporterStatsHttpServer(exporter); zpagesServer.Start(); using var httpResponseMessage = await HttpClient.GetAsync("http://localhost:7284/rpcz/"); Assert.True(httpResponseMessage.IsSuccessStatusCode); var content = await httpResponseMessage.Content.ReadAsStringAsync(); Assert.Contains($"<td>Test Zipkin Activity 1</td>", content); Assert.Contains($"<td>Test Zipkin Activity 2</td>", content); zpagesProcessor.Dispose(); zpagesServer.Stop(); zpagesServer.Dispose(); exporter.Dispose(); }