全部产品
Search
文档中心

Managed Service for OpenTelemetry:Gunakan Jaeger untuk melaporkan data jejak aplikasi .NET

更新时间:Jul 02, 2025

Setelah Anda menggunakan Jaeger untuk menginstrumentasi aplikasi .NET dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi .NET. Anda dapat melihat data pemantauan aplikasi seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menggunakan komponen OpenTracing, .NET Core, dan gRPC untuk secara otomatis atau manual menginstrumentasi aplikasi .NET dan melaporkan data jejak aplikasi .NET.

Penting

Klien Jaeger untuk C# tidak lagi dipelihara. Kami merekomendasikan Anda menggunakan OpenTelemetry SDK untuk .NET untuk melaporkan data jejak. Untuk informasi lebih lanjut, lihat Gunakan OpenTelemetry untuk Melaporkan Data Jejak Aplikasi .NET.

Prasyarat

Untuk mendapatkan titik akhir Jaeger atau Zipkin, ikuti langkah-langkah berikut:

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Di bilah navigasi sisi kiri, klik Cluster Configurations. Di halaman yang muncul, klik tab Access point information.

  3. Di bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur parameter Client ke Jaeger atau Zipkin. Dalam contoh ini, Jaeger dipilih.

    Dapatkan titik akhir Jaeger atau Zipkin di kolom Related Information tabel di bagian bawah.

    Jaeger/Zipkin接入点信息

    Catatan

    Jika aplikasi Anda diterapkan di lingkungan produksi Alibaba Cloud, gunakan titik akhir VPC. Jika tidak, gunakan titik akhir publik. Secara umum, gunakan titik akhir v2 untuk Zipkin. Gunakan titik akhir v1 hanya jika Anda sangat memahami Zipkin.

Informasi latar belakang

Jaeger adalah sistem pelacakan terdistribusi open source yang dibuat dan digunakan oleh Uber. Jaeger kompatibel dengan API OpenTracing dan merupakan anggota dari Cloud Native Computing Foundation (CNCF). Jaeger mengumpulkan data pemantauan waktu nyata dari berbagai sistem heterogen.

Komunitas OpenTracing menyediakan beberapa komponen yang mendukung kerangka kerja .NET berikut:

Bagaimana Data Dilaporkan?

  • Gambar berikut menunjukkan cara melaporkan data tanpa menggunakan agen Jaeger.

  • Gambar berikut menunjukkan cara melaporkan data dengan menggunakan agen Jaeger.

Kode contoh

Unduh kode contoh dari dotnet-demo.

Instrumentasi aplikasi .NET 6.0

Gunakan komponen OpenTracing untuk secara otomatis menginstrumentasi aplikasi .NET

Untuk menjalankan kode contoh, persyaratan berikut harus dipenuhi:

  • Jaeger 1.0.2 telah diinstal.

  • .NET 6.0 telah diinstal.

  1. Di file dotnet-demo/net6.0/Shared/JaegerServiceCollectionExtensions.cs proyek contoh, tentukan titik akhir Jaeger yang digunakan untuk melaporkan data jejak dan nama aplikasi yang ingin dilaporkan untuk menginisialisasi dan mendaftarkan objek ITracer.

    public static class JaegerServiceCollectionExtensions
    {
        // Tentukan titik akhir Jaeger. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir Jaeger, lihat bagian "Prasyarat" dari topik ini.
        private static readonly Uri _jaegerUri = new Uri("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");
    
        public static IServiceCollection AddJaeger(this IServiceCollection services)
        {
            if (services == null)
                throw new ArgumentNullException(nameof(services));
    
            services.AddSingleton<ITracer>(serviceProvider =>
            {
                // Tentukan nama aplikasi.
                string serviceName = Assembly.GetEntryAssembly().GetName().Name;
    
                ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
    
                ISampler sampler = new ConstSampler(sample: true);
    
                IReporter reporter = new RemoteReporter.Builder()
                    .WithSender(new HttpSender.Builder(_jaegerUri.ToString()).Build())
                    .Build();
    
                ITracer tracer = new Tracer.Builder(serviceName)
                    .WithLoggerFactory(loggerFactory)
                    .WithSampler(sampler)
                    .WithReporter(reporter)
                    .Build();
    
                GlobalTracer.Register(tracer);
    
                return tracer;
            });
    
            // Mencegah loop tak terbatas saat OpenTracing melacak permintaan HTTP ke Jaeger.
            services.Configure<HttpHandlerDiagnosticOptions>(options =>
            {
                options.IgnorePatterns.Add(request => _jaegerUri.IsBaseOf(request.RequestUri));
            });
    
            return services;
        }
    }
  2. Pergi ke direktori dotnet-demo/net6.0/CustomersApi proyek contoh dan jalankan perintah berikut:

    dotnet run --framework:net6.0
  3. Mulai aplikasi Anda dan akses URL berikut:

    http://localhost:5001/health
  4. Di halaman Applications dari Konsol Managed Service for OpenTelemetry, cari aplikasi berdasarkan nama aplikasi untuk melihat data yang dilaporkan.

Instrumentasi aplikasi .NET Core 3.1

Untuk menjalankan kode contoh, persyaratan berikut harus dipenuhi:

  • Jaeger 1.0.2 telah diinstal.

  • .NET Core 3.1 telah diinstal.

Gunakan ASP.NET Core untuk secara otomatis menginstrumentasi aplikasi .NET

  1. Di file dotnet-demo/netcoreapp3.1/Shared/JaegerServiceCollectionExtensions.cs proyek contoh, tentukan titik akhir Jaeger yang digunakan untuk melaporkan data jejak dan nama aplikasi yang ingin dilaporkan untuk menginisialisasi dan mendaftarkan objek ITracer.

    public static class JaegerServiceCollectionExtensions
    {
        // Tentukan titik akhir Jaeger. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir Jaeger, lihat bagian "Prasyarat" dari topik ini.
        private static readonly Uri _jaegerUri = new Uri("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");
    
        public static IServiceCollection AddJaeger(this IServiceCollection services)
        {
            if (services == null)
                throw new ArgumentNullException(nameof(services));
    
            services.AddSingleton<ITracer>(serviceProvider =>
            {
                // Tentukan nama aplikasi.
                string serviceName = Assembly.GetEntryAssembly().GetName().Name;
    
                ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
    
                ISampler sampler = new ConstSampler(sample: true);
    
                IReporter reporter = new RemoteReporter.Builder()
                    .WithSender(new HttpSender.Builder(_jaegerUri.ToString()).Build())
                    .Build();
    
                ITracer tracer = new Tracer.Builder(serviceName)
                    .WithLoggerFactory(loggerFactory)
                    .WithSampler(sampler)
                    .WithReporter(reporter)
                    .Build();
    
                GlobalTracer.Register(tracer);
    
                return tracer;
            });
    
            // Mencegah loop tak terbatas saat OpenTracing melacak permintaan HTTP ke Jaeger.
            services.Configure<HttpHandlerDiagnosticOptions>(options =>
            {
                options.IgnorePatterns.Add(request => _jaegerUri.IsBaseOf(request.RequestUri));
            });
    
            return services;
        }
    }
  2. Pergi ke direktori dotnet-demo/netcoreapp3.1/Shared proyek contoh dan jalankan perintah berikut:

    // Tambahkan middleware ASP.NET Core 3.1.
    dotnet add  package OpenTracing.Contrib.NetCore
  3. Pergi ke direktori dotnet-demo/netcoreapp3.1/CustomersApi proyek contoh dan jalankan perintah berikut:

    // Tambahkan middleware ASP.NET Core 3.1.
    dotnet add  package OpenTracing.Contrib.NetCore
    // Jalankan program demo.
    dotnet run --framework:netcoreapp3.1
  4. Mulai aplikasi Anda dan akses URL berikut:

    http://localhost:5001/health
  5. Di halaman Applications dari Konsol Managed Service for OpenTelemetry, cari aplikasi berdasarkan nama aplikasi untuk melihat data yang dilaporkan.

Gunakan gRPC untuk secara otomatis menginstrumentasi aplikasi .NET

  1. Instal paket NuGet.

    // Tambahkan komponen berikut:
    // OpenTracing.Contrib.Grpc: middleware gRPC.
    // Jaeger: komponen implementasi OpenTracing.
    // Microsoft.Extensions.Logging.Console: komponen log.
    
    dotnet add  package OpenTracing.Contrib.grpc
    dotnet add  package Jaeger
  2. Inisialisasi objek ITracer.

    public static Tracer InitTracer(string serviceName, ILoggerFactory loggerFactory)
            {
                Configuration.SamplerConfiguration samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory)
                    .WithType(ConstSampler.Type)
                    .WithParam(1);
                Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
                        // Tentukan titik akhir Jaeger. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir Jaeger, lihat bagian "Prasyarat" dari topik ini.
                       .WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");
                Configuration.ReporterConfiguration reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory)
                    .WithSender(senderConfiguration);
    
                return (Tracer)new Configuration(serviceName, loggerFactory)
                    .WithSampler(samplerConfiguration)
                    .WithReporter(reporterConfiguration)
                    .GetTracer();
            }
  3. Tambahkan instrumentasi di server. Bangun objek ServerTracingInterceptor dan ikat objek tersebut ke aplikasi.

    ILoggerFactory loggerFactory = new LoggerFactory().AddConsole();
    ITracer tracer = TracingHelper.InitTracer("dotnetGrpcServer", loggerFactory);
    ServerTracingInterceptor tracingInterceptor = new ServerTracingInterceptor(tracer);
    Server server = new Server
     {
        Services = { Greeter.BindService(new GreeterImpl()).Intercept(tracingInterceptor) },
         Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
     };
  4. Tambahkan instrumentasi di klien. Bangun objek ServerTracingInterceptor dan ikat objek tersebut ke saluran tertentu.

    ILoggerFactory loggerFactory = new LoggerFactory().AddConsole();
    ITracer tracer = TracingHelper.InitTracer("dotnetGrpcClient", loggerFactory);
    ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor(tracer);
    Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
    
    var client = new Greeter.GreeterClient(channel.Intercept(tracingInterceptor));
  5. Pergi ke direktori dotnet-demo/netcoreapp3.1/GreeterServer proyek contoh dan jalankan perintah berikut di terminal untuk memulai server gRPC:

    dotnet run --framework:netcoreapp3.1
  6. Pergi ke direktori dotnet-demo/netcoreapp3.1/GreeterClient proyek contoh dan jalankan perintah berikut di terminal lain untuk memulai klien gRPC:

    dotnet run --framework:netcoreapp3.1

    Jika pesan Greeting: Hello you dikembalikan, server dan klien terhubung. Anda dapat melihat data jejak aplikasi contoh yang dilaporkan oleh dotnetGrpcServer dan dotnetGrpcClient di konsol.

Secara manual menginstrumentasi aplikasi .NET

Anda dapat menginstrumentasi aplikasi .NET dengan menggunakan plugin yang ada. Atau, Anda dapat menggunakan Jaeger untuk secara manual menginstrumentasi aplikasi .NET dan melaporkan data jejak aplikasi ke konsol Managed Service for OpenTelemetry.

  1. Instal paket NuGet.

    // Jaeger: komponen implementasi OpenTracing.
    // Microsoft.Extensions.Logging.Console: komponen log.
    
    dotnet add  package Microsoft.Extensions.Logging.Console
    dotnet add  package Jaeger
  2. Bangun objek ITracer. Objek ITracer adalah objek yang didefinisikan oleh OpenTracing. Anda dapat menggunakan Jaeger untuk membangun objek ini. Saat membangun objek ini, Anda dapat mengonfigurasinya untuk menentukan titik akhir Jaeger dan laju sampel.

    public static ITracer InitTracer(string serviceName, ILoggerFactory loggerFactory)
     {
        Configuration.SamplerConfiguration samplerConfiguration = new Configuration.SamplerConfiguration(loggerFactory)
              .WithType(ConstSampler.Type)
              .WithParam(1);
        Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
               // Dapatkan titik akhir Jaeger di konsol Managed Service for OpenTelemetry.
              .WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");
    
       Configuration.ReporterConfiguration reporterConfiguration = new Configuration.ReporterConfiguration(loggerFactory)
              .WithSender(senderConfiguration);
    
       return (Tracer)new Configuration(serviceName, loggerFactory)
              .WithSampler(samplerConfiguration)
              .WithReporter(reporterConfiguration)
            .GetTracer();
    }
  3. Daftarkan objek ITracer dengan GlobalTracer untuk memudahkan pemanggilan kode.

    GlobalTracer.Register(InitTracer("dotnetManualDemo", loggerFactory ));
  4. Catat data permintaan.

    ITracer tracer = GlobalTracer.Instance;
    ISpan span = tracer.BuildSpan("parentSpan").WithTag("mytag","parentSapn").Start();
    tracer.ScopeManager.Activate(span, false);
    // ... lakukan sesuatu
    span.Finish();
    Catatan

    Anda dapat menjalankan kode sebelumnya untuk mencatat operasi root dari permintaan. Jika Anda ingin mencatat operasi sebelum dan sesudah permintaan, panggil metode AsChildOf.

    Berikut ini adalah contoh kode sampel:

    ITracer tracer = GlobalTracer.Instance;
    ISpan parentSpan = tracer.ActiveSpan;
    ISpan childSpan =tracer.BuildSpan("childSpan").AsChildOf(parentSpan).WithTag("mytag", "spanSecond").Start();
    tracer.ScopeManager.Activate(childSpan, false);
    // ... lakukan sesuatu
    childSpan.Finish();
  5. Opsional: Untuk menyelesaikan masalah dengan efisien, Anda dapat menambahkan tag kustom ke catatan. Misalnya, Anda dapat menambahkan tag kustom ke permintaan untuk menunjukkan apakah terjadi kesalahan atau menggambarkan nilai yang dikembalikan oleh permintaan.

    tracer.activeSpan().setTag("http.status_code", "200");
  6. Dalam sistem terdistribusi, permintaan prosedur jarak jauh (RPC) dikirim bersama dengan data jejak. Data jejak berisi nilai-nilai parameter TraceId, ParentSpanId, SpanId, dan Sampled. Anda dapat memanggil metode Extract atau Inject untuk melewati data jejak di header permintaan HTTP. Gambar berikut menunjukkan seluruh proses.

    流程图

    1. Panggil metode Inject di klien untuk menentukan informasi konteks.

      Tracer.Inject(span.Context, BuiltinFormats.HttpHeaders, new HttpHeadersInjectAdapter(request.Headers));
    2. Panggil metode Extract di server untuk mengekstrak informasi konteks.

      ISpanContext extractedSpanContext = _tracer.Extract(BuiltinFormats.HttpHeaders, new RequestHeadersExtractAdapter(request.Headers));
      ISpan childSpan = _tracer.BuildSpan(operationName).AsChildOf(extractedSpanContext);
  7. Pergi ke direktori dotnet-demo/netcoreapp3.1/ManualDemo proyek dan jalankan perintah berikut. Program contoh mulai melaporkan data jejak.

    dotnet run --framework:netcoreapp3.1

    Di konsol Managed Service for OpenTelemetry, Anda dapat melihat data jejak yang dilaporkan dari aplikasi contoh dotnetManualDemo yang diinstrumentasi secara manual.

FAQ

T1: Apa yang harus saya lakukan jika tidak ada data jejak yang dilaporkan ke konsol Managed Service for OpenTelemetry setelah saya menjalankan program demo?

A1: Periksa apakah titik akhir dalam senderConfiguration valid.

Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
           // Dapatkan titik akhir Jaeger di konsol Managed Service for OpenTelemetry.
          .WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");

T2: Bagaimana cara menentukan laju sampel?

A2: Untuk informasi lebih lanjut, kunjungi halaman jaeger-client-csharp di GitHub.