Skip to content

Instantly share code, notes, and snippets.

@Tirael
Last active July 2, 2020 08:21
Show Gist options
  • Save Tirael/16be34de10ed5fd88882716f5a47ca22 to your computer and use it in GitHub Desktop.
Save Tirael/16be34de10ed5fd88882716f5a47ca22 to your computer and use it in GitHub Desktop.
using Jaeger.Reporters;
using Jaeger.Samplers;
using Jaeger.Senders;
using Jaeger.Senders.Thrift;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using OpenTracing;
using OpenTracing.Util;
// Use "OpenTracing.Contrib.NetCore" to automatically generate spans for ASP.NET Core, Entity Framework Core, ...
// See https://github.com/opentracing-contrib/csharp-netcore for details.
services.AddOpenTracing();
// Adds the Jaeger Tracer.
services.AddSingleton<ITracer>(serviceProvider =>
{
string serviceName = serviceProvider
.GetRequiredService<IWebHostEnvironment>()
.ApplicationName;
ISender udpSender = new UdpSender("localhost", 5775, maxPacketSize: 0);
ISender httpSender = new HttpSender("http://localhost:14268/api/traces");
IReporter reporter = new RemoteReporter.Builder()
.WithSender(udpSender)
.WithMaxQueueSize(maxQueueSize: 100)
.Build();
// This will log to a default localhost installation of Jaeger.
var tracer = new Tracer.Builder(serviceName)
.WithSampler(new ConstSampler(true))
.WithReporter(reporter)
.Build();
// Allows code that can't use DI to also access the tracer.
GlobalTracer.Register(tracer);
return tracer;
});
// *****************
// ServiceCollectionExtensions.cs
using System;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using OpenTracing;
using OpenTracing.Contrib.NetCore;
using OpenTracing.Contrib.NetCore.Configuration;
using OpenTracing.Contrib.NetCore.Internal;
using OpenTracing.Util;
namespace Microsoft.Extensions.DependencyInjection
{
public static class ServiceCollectionExtensions
{
/// <summary>
/// Adds OpenTracing instrumentation for ASP.NET Core, CoreFx (BCL), Entity Framework Core.
/// </summary>
public static IServiceCollection AddOpenTracing(this IServiceCollection services, Action<IOpenTracingBuilder> builder = null)
{
if (services == null)
throw new ArgumentNullException(nameof(services));
return services.AddOpenTracingCoreServices(otBuilder =>
{
otBuilder.AddAspNetCore()
.AddCoreFx()
.AddEntityFrameworkCore()
.AddLoggerProvider();
builder?.Invoke(otBuilder);
});
}
/// <summary>
/// Adds the core services required for OpenTracing without any actual instrumentations.
/// </summary>
public static IServiceCollection AddOpenTracingCoreServices(this IServiceCollection services, Action<IOpenTracingBuilder> builder = null)
{
if (services == null)
throw new ArgumentNullException(nameof(services));
services.TryAddSingleton<ITracer>(GlobalTracer.Instance);
services.TryAddSingleton<IGlobalTracerAccessor, GlobalTracerAccessor>();
services.TryAddSingleton<DiagnosticManager>();
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, InstrumentationService>());
var builderInstance = new OpenTracingBuilder(services);
builder?.Invoke(builderInstance);
return services;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment