コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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();
                }
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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)));
        }
コード例 #7
0
        /// <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)));
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        /// <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);
            }));
        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        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();
        }