public void TraceFactory_SetDefault()
        {
            var factory = TracerFactory.Create(b => { });

            TracerFactoryBase.SetDefault(factory);

            var defaultTracer = TracerFactoryBase.Default.GetTracer("");

            Assert.NotNull(defaultTracer);
            Assert.IsType <TracerSdk>(defaultTracer);

            Assert.NotSame(defaultTracer, TracerFactoryBase.Default.GetTracer("named tracerSdk"));

            var span = defaultTracer.StartSpan("foo");

            Assert.IsType <SpanSdk>(span);
        }
Пример #2
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, TracerFactory factory)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMiddleware <CallbackMiddleware>();
            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
        public void TraceFactory_UpdateDefault_CachedTracer()
        {
            var defaultTracer = TracerFactoryBase.Default.GetTracer("");
            var noopSpan      = defaultTracer.StartSpan("foo");

            Assert.IsType <BlankSpan>(noopSpan);

            TracerFactoryBase.SetDefault(TracerFactory.Create(b => { }));
            var span = defaultTracer.StartSpan("foo");

            Assert.IsType <SpanSdk>(span);

            var newDefaultTracer = TracerFactoryBase.Default.GetTracer("");

            Assert.NotSame(defaultTracer, newDefaultTracer);
            Assert.IsType <TracerSdk>(newDefaultTracer);
        }
Пример #4
0
        public void CreateFactory_DefaultBuilder()
        {
            var tracerFactory = TracerFactory.Create(b => { });
            var tracer        = tracerFactory.GetTracer("");

            Assert.NotNull(tracer);
            Assert.IsType <TracerSdk>(tracer);

            var span = tracer.StartSpan("foo");

            Assert.NotNull(span);
            Assert.IsType <SpanSdk>(span);

            // default sampler is always sample
            Assert.True(span.IsRecording);
            Assert.Equal(Resource.Empty, ((SpanSdk)span).LibraryResource);
        }
Пример #5
0
        public void GetTracerReturnsTracerWithResourceOverriddenBySetResource()
        {
            var tracerFactory = TracerFactory.Create(b =>
            {
                b.SetResource(new Resource(new Dictionary <string, object>()
                {
                    { "a", "b" }
                }))
                .SetResource(new Resource(new Dictionary <string, object>()
                {
                    { "a", "c" }
                }));
            });
            var tracer = (TracerSdk)tracerFactory.GetTracer("foo", "semver:1.2.3");

            Assert.Equal("c", tracer.LibraryResource.Attributes.Single(kvp => kvp.Key == "a").Value);
        }
        public void BroadcastProcessor_CallsAllProcessorSequentially()
        {
            bool start1Called = false;
            bool start2Called = false;
            bool end1Called   = false;
            bool end2Called   = false;
            var  processor1   = new TestProcessor(ss =>
            {
                start1Called = true;
                Assert.False(start2Called);
                Assert.False(end1Called);
                Assert.False(end2Called);
            }, se =>
            {
                end1Called = true;
                Assert.True(start1Called);
                Assert.True(start2Called);
                Assert.False(end2Called);
            });
            var processor2 = new TestProcessor(ss =>
            {
                start2Called = true;
                Assert.True(start1Called);
                Assert.False(end1Called);
                Assert.False(end2Called);
            }, se =>
            {
                end2Called = true;
                Assert.True(start1Called);
                Assert.True(start2Called);
                Assert.True(end1Called);
            });

            var broadcastProcessor = new BroadcastProcessor(new [] { processor1, processor2 });

            var tracer = TracerFactory.Create(_ => { }).GetTracer(null);
            var span   = (Span)tracer.StartSpan("foo");

            broadcastProcessor.OnStart(span);
            Assert.True(start1Called);
            Assert.True(start2Called);

            broadcastProcessor.OnEnd(span);
            Assert.True(end1Called);
            Assert.True(end2Called);
        }
Пример #7
0
        public async Task CustomTextFormat()
        {
            var spanProcessor = new Mock <SpanProcessor>();

            var expectedTraceId = ActivityTraceId.CreateRandom();
            var expectedSpanId  = ActivitySpanId.CreateRandom();

            var textFormat = new Mock <ITextFormat>();

            textFormat.Setup(m => m.Extract <HttpRequest>(It.IsAny <HttpRequest>(), It.IsAny <Func <HttpRequest, string, IEnumerable <string> > >())).Returns(new SpanContext(
                                                                                                                                                                  expectedTraceId,
                                                                                                                                                                  expectedSpanId,
                                                                                                                                                                  ActivityTraceFlags.Recorded,
                                                                                                                                                                  true));

            // Arrange
            using (var testFactory = this.factory
                                     .WithWebHostBuilder(builder =>
                                                         builder.ConfigureTestServices(services =>
            {
                services.AddSingleton <TracerFactory>(_ =>
                                                      TracerFactory.Create(b => b
                                                                           .SetTextFormat(textFormat.Object)
                                                                           .AddProcessorPipeline(p => p.AddProcessor(n => spanProcessor.Object))
                                                                           .AddRequestCollector()));
            })))
                using (var client = testFactory.CreateClient())
                {
                    var response = await client.GetAsync("/api/values/2");

                    response.EnsureSuccessStatusCode(); // Status Code 200-299

                    WaitForProcessorInvocations(spanProcessor, 2);
                }

            Assert.Equal(2, spanProcessor.Invocations.Count); // begin and end was called
            var span = (SpanData)spanProcessor.Invocations[1].Arguments[0];

            Assert.Equal(SpanKind.Server, span.Kind);
            Assert.Equal("api/Values/{id}", span.Name);
            Assert.Equal("/api/values/2", span.Attributes.GetValue("http.path"));

            Assert.Equal(expectedTraceId, span.Context.TraceId);
            Assert.Equal(expectedSpanId, span.ParentSpanId);
        }
        public async void ProfilerSessionUsesTheSameDefault()
        {
            var spanProcessor = new Mock <SpanProcessor>();
            var tracer        = TracerFactory.Create(b => b
                                                     .AddProcessorPipeline(p => p.AddProcessor(_ => spanProcessor.Object)))
                                .GetTracer(null);

            using var instrumentation = new StackExchangeRedisCallsInstrumentation(tracer);
            var profilerFactory = instrumentation.GetProfilerSessionsFactory();
            var first           = profilerFactory();
            var second          = profilerFactory();

            ProfilingSession third = null;
            await Task.Delay(1).ContinueWith((t) => { third = profilerFactory(); });

            Assert.Equal(first, second);
            Assert.Equal(second, third);
        }
Пример #9
0
        /// <summary>
        /// Ons the window event.
        /// </summary>
        private void onWindowEvent()
        {
            debug("MainWindow.onWindowEvent()");

            if (comportWindow.hasChanged())
            {
                if (comportWindow.isValid())
                {
                    startNewTrace();
                }
            }

            if (progressTraceWindow.hasChanged())
            {
                TracerFactory.getInstance().getInterface().stopTracing();
                loadTracesIntoList();
            }
        }
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddOpenTelemetry((svcProvider, tracerBuilder) =>
            {
                // Make the logger factory available to the dependency injection
                // container so that it may be injected into the OpenTelemetry Tracer.
                var loggerFactory = svcProvider.GetRequiredService <ILoggerFactory>();

                // Adds the New Relic Exporter loading settings from the appsettings.json
                var tracerFactory = TracerFactory.Create(b => b.UseNewRelic(Configuration, loggerFactory)
                                                         .SetSampler(Samplers.AlwaysSample));

                var dependenciesCollector = new DependenciesCollector(new HttpClientCollectorOptions(), tracerFactory);
                var aspNetCoreCollector   = new AspNetCoreCollector(tracerFactory.GetTracer(null));
            });
        }
Пример #11
0
        public async Task SuccessfulTemplateControllerCallUsesParentContext()
        {
            var spanProcessor = new Mock <SpanProcessor>(new NoopSpanExporter());

            var expectedTraceId = ActivityTraceId.CreateRandom();
            var expectedSpanId  = ActivitySpanId.CreateRandom();

            var tf = new Mock <ITextFormat>();

            tf.Setup(m => m.Extract <HttpRequest>(It.IsAny <HttpRequest>(), It.IsAny <Func <HttpRequest, string, IEnumerable <string> > >())).Returns(new SpanContext(
                                                                                                                                                          expectedTraceId,
                                                                                                                                                          expectedSpanId,
                                                                                                                                                          ActivityTraceFlags.Recorded));

            var tracerFactory = new TracerFactory(spanProcessor.Object, null, tf.Object);

            // Arrange
            using (var client = this.factory
                                .WithWebHostBuilder(builder =>
                                                    builder.ConfigureTestServices(services =>
            {
                services.AddSingleton <ITracer>(tracerFactory.GetTracer(null));
            }))
                                .CreateClient())
            {
                // Act
                var response = await client.GetAsync("/api/values/2");

                // Assert
                response.EnsureSuccessStatusCode(); // Status Code 200-299

                WaitForProcessorInvocations(spanProcessor, 2);
            }

            Assert.Equal(2, spanProcessor.Invocations.Count); // begin and end was called
            var span = ((Span)spanProcessor.Invocations[1].Arguments[0]);

            Assert.Equal(SpanKind.Server, span.Kind);
            Assert.Equal("api/Values/{id}", span.Name);
            Assert.Equal("/api/values/2", span.Attributes.GetValue("http.path"));

            Assert.Equal(expectedTraceId, span.Context.TraceId);
            Assert.Equal(expectedSpanId, span.ParentSpanId);
        }
Пример #12
0
        public void Merge_DoesNotDuplicateMethodMatchers_WhenContextSame()
        {
            TracerFactory first      = new TracerFactory();
            Match         firstMatch = new Match()
            {
                AssemblyName = "Test", ClassName = "TestClass"
            };

            firstMatch.Matches.Add(new ExactMethodMatcher("TestMethod1", new[] { "ParamType1", "ParamType2" }));
            first.MatchDefinitions.Add(firstMatch);

            TracerFactory second      = new TracerFactory();
            Match         secondMatch = new Match()
            {
                AssemblyName = firstMatch.AssemblyName, ClassName = firstMatch.ClassName
            };

            secondMatch.Matches.Add(new ExactMethodMatcher("TestMethod1", new[] { "ParamType1", "ParamType2" }));
            second.MatchDefinitions.Add(secondMatch);

            Extension firstExtension = new Extension();

            firstExtension.Instrumentation.TracerFactories.Add(first);

            Extension secondExtension = new Extension();

            secondExtension.Instrumentation.TracerFactories.Add(second);

            Extension merged = Extension.Merge(firstExtension, secondExtension);

            Assert.AreEqual(1, merged.Instrumentation.TracerFactories.Count());
            Assert.IsTrue(string.IsNullOrWhiteSpace(merged.Instrumentation.TracerFactories.First().MetricName));
            Assert.AreEqual(Metric.Unspecified, merged.Instrumentation.TracerFactories.First().Metric);
            Assert.AreEqual(1, merged.Instrumentation.TracerFactories.First().MatchDefinitions.Count);

            var firstMergedMatch = merged.Instrumentation.TracerFactories.First().MatchDefinitions.First();

            Assert.AreEqual("Test", firstMergedMatch.AssemblyName);
            Assert.AreEqual("TestClass", firstMergedMatch.ClassName);
            Assert.AreEqual(1, firstMergedMatch.Matches.Count);

            Assert.AreEqual("TestMethod1", firstMergedMatch.Matches.First().MethodName);
            Assert.AreEqual("ParamType1,ParamType2", string.Join(",", firstMergedMatch.Matches.First().ParameterTypes));
        }
Пример #13
0
        internal static object Run(string projectId)
        {
            var spanExporter = new StackdriverTraceExporter(projectId);

            var metricExporter = new StackdriverMetricExporter(
                projectId,
                Stats.ViewManager);

            metricExporter.Start();

            using (var tracerFactory = TracerFactory.Create(builder => builder.SetExporter(spanExporter)))
            {
                var tracer = tracerFactory.GetTracer("stackdriver-test");

                var tagContextBuilder = Tagger.CurrentBuilder.Put(FrontendKey, TagValue.Create("mobile-ios9.3.5"));

                Stats.ViewManager.RegisterView(VideoSizeView);

                using (tagContextBuilder.BuildScoped())
                {
                    using (tracer.WithSpan(tracer.StartSpan("incoming request")))
                    {
                        tracer.CurrentSpan.AddEvent("Processing video.");
                        Thread.Sleep(TimeSpan.FromMilliseconds(10));

                        StatsRecorder.NewMeasureMap()
                        .Put(VideoSize, 25 * MiB)
                        .Record();
                    }
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(5100));

                var viewData = Stats.ViewManager.GetView(VideoSizeViewName);

                Console.WriteLine(viewData);

                Console.WriteLine("Done... wait for events to arrive to backend!");
                Console.ReadLine();

                metricExporter.Stop();
                return(null);
            }
        }
Пример #14
0
        public async Task <IEnumerable <MeteoriteLanding> > Get(int skip, int take)
        {
            var cacheKey = "meteorite-landings";
            var tracer   = TracerFactory.GetTracer("meteorites-controller-tracer");

            using (tracer.StartActiveSpan("starts calling to gRPC service span", out var rootSpan))
            {
                var headers = new Metadata();

                var outgoingSpan = tracer.StartSpan($"get meteorite-data span", rootSpan, SpanKind.Client);

                if (outgoingSpan.Context.IsValid)
                {
                    tracer.TextFormat.Inject(outgoingSpan.Context, headers, (headers, name, value) => headers.Add(name, value));
                }

                var result = await MeteoriteClient.GetMeteoriteLandingsAsync(
                    new MeteoriteLandingsRequest
                {
                    Skip = skip,
                    Take = take
                }, headers);

                outgoingSpan.End();

                var reply      = result.MeteoriteLandings.ToList();
                var returnData = new List <MeteoriteLanding>();

                var getCacheSpan = tracer.StartSpan("get data from Redis Cache span", rootSpan);
                var cacheResult  = await RedisStore.RedisCache.StringGetAsync(cacheKey);

                if (cacheResult.HasValue)
                {
                    getCacheSpan.AddEvent("on get data from cache event");
                    returnData = JsonConvert.DeserializeObject <List <MeteoriteLanding> >(cacheResult.ToString());
                }

                getCacheSpan.End();
                rootSpan.End();

                return(returnData.Count <= 0 ? returnData : returnData.Skip(skip).Take(take));
            }
        }
        public void ProxyTracer_UpdateTracer_StartRootSpanFrom_Kind_Timestamp_Links()
        {
            var proxyTracer = new ProxyTracer();
            var realTracer  = TracerFactory.Create(b => { }).GetTracer(null);

            proxyTracer.UpdateTracer(realTracer);
            var linkContext = new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded);

            var startTimestamp = DateTimeOffset.UtcNow.AddSeconds(-10);
            var span           = (SpanSdk)proxyTracer.StartRootSpan("foo", SpanKind.Server, new SpanCreationOptions
            {
                StartTimestamp = startTimestamp,
                LinksFactory   = () => new[] { new Link(linkContext) },
            });

            Assert.True(span.Context.IsValid);
            Assert.Equal(span.Activity.TraceId, span.Context.TraceId);
            Assert.Equal(span.Activity.SpanId, span.Context.SpanId);
            Assert.Equal(default, span.ParentSpanId);
        internal static object Run()
        {
            Console.WriteLine("Hello World!");

            using var tracerFactory = TracerFactory.Create(builder => builder
                                                           .UseZipkin(o => o.ServiceName = "http-client-test")
                                                           .AddDependencyAdapter());
            var tracer = tracerFactory.GetTracer("http-client-test");

            using (tracer.StartActiveSpan("incoming request", out _))
            {
                using var client = new HttpClient();
                client.GetStringAsync("http://bing.com").GetAwaiter().GetResult();
            }

            Console.ReadLine();

            return(null);
        }
Пример #17
0
 public async Task Advise(MethodAsyncAdviceContext context)
 {
     using (var t = TracerFactory.StartTracer(context.TargetType, context.TargetMethod.Name))
     {
         if (info.ContainsCharacters())
         {
             t.SetAdidtionalInformation(info);
         }
         try
         {
             if (!context.IsTargetMethodAsync)
             {
                 Task.Run(() => context.ProceedAsync()).Wait();
             }
             else
             {
                 await context.ProceedAsync();
             }
         }
         catch (AggregateException aex)
         {
             if (aex.InnerExceptions == null)
             {
                 SetErrorInfo(t, aex.Flatten());
                 throw aex.Flatten();
             }
             ;
             if (aex.InnerExceptions.Count > 1)
             {
                 SetErrorInfo(t, aex.Flatten());
                 throw aex.Flatten();
             }
             var ex = aex.InnerException;
             SetErrorInfo(t, ex);
             throw ex;
         }
         catch (Exception ex)
         {
             SetErrorInfo(t, ex);
             throw;
         }
     }
 }
Пример #18
0
        protected void Application_Start()
        {
            this.tracerFactory = TracerFactory.Create(builder =>
            {
                builder
                .UseJaeger(c =>
                {
                    c.AgentHost = "localhost";
                    c.AgentPort = 6831;
                })
                .AddRequestAdapter()
                .AddDependencyAdapter();
            });

            GlobalConfiguration.Configure(WebApiConfig.Register);

            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
Пример #19
0
        public void UseApplicationInsights_ConfiguresExporter()
        {
            var sentItems = new ConcurrentQueue <ITelemetry>();

            ITelemetryChannel channel = new StubTelemetryChannel
            {
                OnSend          = t => sentItems.Enqueue(t),
                EndpointAddress = "http://foo",
            };

            var tracer = TracerFactory.Create(b => b
                                              .SetProcessor(e => new SimpleSpanProcessor(e))
                                              .UseApplicationInsights(o => o.TelemetryChannel = channel))
                         .GetTracer(null);

            tracer.StartSpan("foo").End();

            Assert.Single(sentItems);
        }
        /// <summary>add MagicOnion Telemetry.</summary>
        public static IServiceCollection AddMagicOnionOpenTelemetry(this IServiceCollection services,
                                                                    MagicOnionOpenTelemetryOptions options,
                                                                    Action <MagicOnionOpenTelemetryOptions, MagicOnionOpenTelemetryMeterFactoryOption> configureMeterFactory,
                                                                    Action <MagicOnionOpenTelemetryOptions, TracerBuilder> configureTracerFactory)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (string.IsNullOrEmpty(options.ServiceName))
            {
                throw new ArgumentNullException($"{nameof(options)}.{nameof(options.ServiceName)}");
            }

            services.AddSingleton(options);

            // configure MeterFactory
            if (configureMeterFactory != null)
            {
                var meterFactoryOption = new MagicOnionOpenTelemetryMeterFactoryOption();
                configureMeterFactory(options, meterFactoryOption);

                var meterFactory = MeterFactory.Create(mb =>
                {
                    mb.SetMetricProcessor(meterFactoryOption.MetricProcessor);
                    mb.SetMetricExporter(meterFactoryOption.MetricExporter);
                    mb.SetMetricPushInterval(meterFactoryOption.MetricPushInterval);
                });

                services.AddSingleton(meterFactoryOption.MetricExporter);
                services.AddSingleton(meterFactory);
            }

            // configure TracerFactory
            if (configureTracerFactory != null)
            {
                var tracerFactory = TracerFactory.Create(tracerBuilder => configureTracerFactory(options, tracerBuilder));
                services.AddSingleton(tracerFactory);
            }

            return(services);
        }
Пример #21
0
        public async void ProfilerSessionUsesTheSameDefault()
        {
            var spanProcessor = new Mock <SpanProcessor>(new NoopSpanExporter());
            var tracer        = TracerFactory.Create(b => b
                                                     .SetProcessor(_ => spanProcessor.Object))
                                .GetTracer(null);

            using (var collector = new StackExchangeRedisCallsCollector(tracer))
            {
                var profilerFactory = collector.GetProfilerSessionsFactory();
                var first           = profilerFactory();
                var second          = profilerFactory();

                ProfilingSession third = null;
                await Task.Delay(1).ContinueWith((t) => { third = profilerFactory(); });

                Assert.Equal(first, second);
                Assert.Equal(second, third);
            }
        }
        /// <summary>
        /// Creates a tracer object for the child process, based on the command line arguments received from the parent process.
        /// </summary>
        /// <param name="args">The command line arguments.</param>
        /// <returns>The tracer instance</returns>
        public ITracer CreateTracerForChildProcess(string[] args)
        {
            ChildProcessArguments arguments = ChildProcessArguments.FromCommandLineArguments(args);

            // Get sessionId from the arguments and create tracer
            ITracer tracerForChildProcess = TracerFactory.Create(arguments.SessionId, null, true);

            // Get custom dimensions from the arguments - do not override existing properties
            IReadOnlyDictionary <string, string> existingProperties = tracerForChildProcess.GetCustomProperties();

            foreach (var kv in arguments.CustomTracerProperties)
            {
                if (!existingProperties.ContainsKey(kv.Key))
                {
                    tracerForChildProcess.AddCustomProperty(kv.Key, kv.Value);
                }
            }

            return(tracerForChildProcess);
        }
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);

            // Obtain the API Key from the Web.Config file
            var apiKey = ConfigurationManager.AppSettings["NewRelic.Telemetry.ApiKey"];

            // Create the tracer factory registering New Relic as the Data Exporter
            var tracerFactory = TracerFactory.Create((b) =>
            {
                b.UseNewRelic(apiKey)
                .AddDependencyCollector()
                .SetSampler(Samplers.AlwaysSample);
            });

            var dependenciesCollector = new DependenciesCollector(new HttpClientCollectorOptions(), tracerFactory);

            // Make the tracer available to the application
            OTTracer = tracerFactory.GetTracer("SampleAspNetFrameworkApp");
        }
Пример #24
0
        public void FactoryReturnsSameTracerForGivenNameAndVersion()
        {
            var tracerFactory = TracerFactory.Create(b => { });
            var tracer1       = tracerFactory.GetTracer("foo", "semver:1.2.3");
            var tracer2       = tracerFactory.GetTracer("foo");
            var tracer3       = tracerFactory.GetTracer("foo", "semver:2.3.4");
            var tracer4       = tracerFactory.GetTracer("bar", "semver:1.2.3");
            var tracer5       = tracerFactory.GetTracer("foo", "semver:1.2.3");
            var tracer6       = tracerFactory.GetTracer(string.Empty);
            var tracer7       = tracerFactory.GetTracer(null);
            var tracer8       = tracerFactory.GetTracer(null, "semver:1.2.3");

            Assert.NotEqual(tracer1, tracer2);
            Assert.NotEqual(tracer1, tracer3);
            Assert.NotEqual(tracer1, tracer4);
            Assert.Equal(tracer1, tracer5);
            Assert.NotEqual(tracer5, tracer6);
            Assert.Equal(tracer6, tracer7);
            Assert.Equal(tracer7, tracer8);
        }
Пример #25
0
 public bool TryUpdateCache(string configSet, string environment)
 {
     using (TracerFactory.StartTracer(this, "TryUpdateCache"))
     {
         var  config = configSetTask.GetConfigSet(configSet);
         bool doSave;
         var  raw = config.GetRawConfigData(environment, out doSave);
         var  environmentSettings = GetEnvironmentSettings(config, environment);
         if (doSave)
         {
             environmentTask.UpdateEnvironment(environmentSettings);
         }
         if (realtimeNotificationService != null)
         {
             realtimeNotificationService(configSet, environment);
         }
         var wrapper = Runtime.CreateRuntimeTask <ICacheManagementWrapper>(environmentSettings.CacheType.CacheType);
         return(wrapper.UpdateCache(environmentSettings, raw));
     }
 }
Пример #26
0
        internal static object Run()
        {
            var metricExporter = new ApplicationInsightsMetricExporter(Stats.ViewManager, new TelemetryConfiguration("instrumentation-key"));

            metricExporter.Start();

            var tagContextBuilder = Tagger.CurrentBuilder.Put(FrontendKey, TagValue.Create("mobile-ios9.3.5"));

            using (var tracerFactory = TracerFactory.Create(builder => builder
                                                            .UseApplicationInsights(config => config.InstrumentationKey = "instrumentation-key")))
            {
                var tracer = tracerFactory.GetTracer("application-insights-test");

                var span = tracer.StartSpan("incoming request");
                Stats.ViewManager.RegisterView(VideoSizeView);

                using (tagContextBuilder.BuildScoped())
                {
                    using (tracer.WithSpan(span))
                    {
                        tracer.CurrentSpan.AddEvent("Start processing video.");
                        Thread.Sleep(TimeSpan.FromMilliseconds(10));
                        StatsRecorder.NewMeasureMap().Put(VideoSize, 25 * MiB).Record();
                        tracer.CurrentSpan.AddEvent("Finished processing video.");
                    }
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(5100));

                var viewData = Stats.ViewManager.GetView(VideoSizeViewName);

                Console.WriteLine(viewData);

                Console.WriteLine("Done... wait for events to arrive to backend!");
                Console.ReadLine();

                metricExporter.Stop();

                return(null);
            }
        }
Пример #27
0
        public async Task SuccessfulTemplateControllerCallUsesParentContext()
        {
            var spanProcessor = new Mock <SpanProcessor>();

            var expectedTraceId = ActivityTraceId.CreateRandom();
            var expectedSpanId  = ActivitySpanId.CreateRandom();

            // Arrange
            using (var testFactory = this.factory
                                     .WithWebHostBuilder(builder =>
                                                         builder.ConfigureTestServices(services =>
            {
                services.AddSingleton <TracerFactory>(_ =>
                                                      TracerFactory.Create(b => b
                                                                           .AddProcessorPipeline(p => p.AddProcessor(n => spanProcessor.Object))
                                                                           .AddRequestCollector()));
            })))
                using (var client = testFactory.CreateClient())
                {
                    var request = new HttpRequestMessage(HttpMethod.Get, "/api/values/2");
                    request.Headers.Add("traceparent", $"00-{expectedTraceId}-{expectedSpanId}-01");

                    // Act
                    var response = await client.SendAsync(request);

                    // Assert
                    response.EnsureSuccessStatusCode(); // Status Code 200-299

                    WaitForProcessorInvocations(spanProcessor, 2);
                }

            Assert.Equal(2, spanProcessor.Invocations.Count); // begin and end was called
            var span = (SpanData)spanProcessor.Invocations[1].Arguments[0];

            Assert.Equal(SpanKind.Server, span.Kind);
            Assert.Equal("api/Values/{id}", span.Name);
            Assert.Equal("/api/values/2", span.Attributes.GetValue("http.path"));

            Assert.Equal(expectedTraceId, span.Context.TraceId);
            Assert.Equal(expectedSpanId, span.ParentSpanId);
        }
Пример #28
0
        public async Task SuccessfulTemplateControllerCallGeneratesASpan()
        {
            var spanProcessor = new Mock <SpanProcessor>(new NoopSpanExporter());
            var tracerFactory = new TracerFactory(spanProcessor.Object);

            void ConfigureTestServices(IServiceCollection services) =>
            services.AddSingleton <ITracerFactory>(tracerFactory);

            // Arrange
            using (var client = this.factory
                                .WithWebHostBuilder(builder =>
                                                    builder.ConfigureTestServices(ConfigureTestServices))
                                .CreateClient())
            {
                // Act
                var response = await client.GetAsync("/api/values");

                // Assert
                response.EnsureSuccessStatusCode(); // Status Code 200-299

                for (var i = 0; i < 10; i++)
                {
                    if (spanProcessor.Invocations.Count == 2)
                    {
                        break;
                    }

                    // We need to let End callback execute as it is executed AFTER response was returned.
                    // In unit tests environment there may be a lot of parallel unit tests executed, so
                    // giving some breezing room for the End callback to complete
                    await Task.Delay(TimeSpan.FromSeconds(1));
                }
            }


            Assert.Equal(2, spanProcessor.Invocations.Count); // begin and end was called
            var span = ((Span)spanProcessor.Invocations[1].Arguments[0]);

            Assert.Equal(SpanKind.Server, span.Kind);
            Assert.Equal("/api/values", span.Attributes.GetValue("http.path"));
        }
Пример #29
0
        public void SimpleTraceTest()
        {
            ITracer tracer;

            using (tracer = TracerFactory.StartTracer(this, "Test", "Test"))
            {
                using (TracerFactory.StartTracer(this, "Inner1", "test"))
                {
                    var item = new InnerTracerTest();
                    item.SomeMethod();
                }
                using (TracerFactory.StartTracer(this, "Inner2", "test"))
                {
                    var item = new InnerTracerTest();
                    item.SomeMethod();
                }
                Assert.IsNull(tracer.ParentItem);
                Assert.IsNotNull(tracer.GetCallstack());
                Assert.IsNotNull(tracer.GetCallstack().CallStack.FirstOrDefault());
            }
        }
Пример #30
0
 /// <summary>
 /// Implements advice logic.
 ///             Usually, advice must invoke context.Proceed()
 /// </summary>
 /// <param name="context">The method advice context.</param>
 public void Advise(MethodAdviceContext context)
 {
     using (var t = TracerFactory.StartTracer(context.TargetType, context.TargetMethod.Name))
     {
         try
         {
             context.Proceed();
         }
         catch (Exception ex)
         {
             if (TreatExceptionAsInformational)
             {
                 t.SetException(ex);
             }
             else
             {
                 t.SetErrorState(ex);
             }
         }
     }
 }