All Products
Search
Document Center

Application Real-Time Monitoring Service:Kirim data jejak .NET dengan Jaeger

Last Updated:May 28, 2026
Penting

Klien Jaeger untuk C# tidak lagi dipelihara. Gunakan OpenTelemetry SDK untuk .NET sebagai gantinya. Petunjuk di bawah ini hanya berlaku untuk implementasi berbasis Jaeger yang sudah ada.

Instrumentasikan aplikasi .NET dengan Jaeger untuk mengirim data jejak ke Managed Service for OpenTelemetry. Setelah data tiba, konsol akan menampilkan topologi aplikasi, jejak, transaksi abnormal dan lambat, serta analisis SQL.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Jaeger 1.0.2

  • .NET 6.0 atau .NET Core 3.1

  • Titik akhir Jaeger dari konsol Managed Service for OpenTelemetry (lihat bagian "Dapatkan titik akhir Jaeger" di bawah)

  • Proyek contoh dotnet-demo yang telah dikloning secara lokal

Arsitektur pelaporan

Tersedia dua metode untuk melaporkan data jejak:

  • Pelaporan langsung (tanpa Jaeger Agent):

不通过Jaeger Agent而直接上报
  • Pelaporan berbasis agen (melalui Jaeger Agent):

通过Jaeger Agent上报数据

Informasi latar belakang

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

Komunitas OpenTracing menyediakan komponen yang mendukung framework .NET berikut:

Dapatkan titik akhir Jaeger

  1. Masuk ke konsol Managed Service for OpenTelemetry.

  2. Di panel navigasi sebelah kiri, klik Cluster Configurations. Lalu, klik tab Access point information.

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

  4. Di bagian Client, klik Jaeger atau Zipkin.

  5. Salin titik akhir dari kolom Related Information.

Jaeger/Zipkin access point information
Catatan

Jika aplikasi Anda berjalan di lingkungan produksi Alibaba Cloud, gunakan titik akhir VPC. Jika tidak, gunakan titik akhir publik. Untuk Zipkin, gunakan titik akhir v2 kecuali Anda memiliki alasan khusus untuk menggunakan v1.

Instrumentasi aplikasi .NET 6.0

Persyaratan:

  • Jaeger 1.0.2

  • .NET 6.0

Konfigurasikan tracer dan jalankan contoh

Langkah 1: Konfigurasikan tracer Jaeger.

Buka dotnet-demo/net6.0/Shared/JaegerServiceCollectionExtensions.cs dan atur titik akhir Jaeger serta nama aplikasi:

public static class JaegerServiceCollectionExtensions
{
    // Ganti dengan titik akhir Jaeger Anda. Lihat bagian "Dapatkan titik akhir Jaeger" di atas.
    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 =>
        {
            // Menggunakan nama assembly sebagai nama layanan.
            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 berujung saat OpenTracing melacak permintaan HTTP ke Jaeger.
        services.Configure<HttpHandlerDiagnosticOptions>(options =>
        {
            options.IgnorePatterns.Add(request => _jaegerUri.IsBaseOf(request.RequestUri));
        });

        return services;
    }
}

Langkah 2: Jalankan aplikasi contoh.

cd dotnet-demo/net6.0/CustomersApi
dotnet run --framework:net6.0

Langkah 3: Hasilkan data jejak.

Buka http://localhost:5001/health di browser.

Langkah 4: Verifikasi.

Ikuti langkah-langkah pada bagian "Verifikasi pelaporan data jejak" di bawah.

Instrumentasi aplikasi .NET Core 3.1

Persyaratan:

  • Jaeger 1.0.2

  • .NET Core 3.1

Tersedia tiga metode instrumentasi untuk .NET Core 3.1:

MetodeKapan digunakan
Middleware ASP.NET CoreAplikasi web berbasis ASP.NET Core
Middleware gRPCAplikasi yang menggunakan gRPC untuk komunikasi layanan
Instrumentasi manualKebutuhan pelacakan kustom atau framework tanpa plugin yang tersedia

Auto-instrumentasi dengan ASP.NET Core

Langkah 1: Konfigurasikan tracer Jaeger.

Buka dotnet-demo/netcoreapp3.1/Shared/JaegerServiceCollectionExtensions.cs dan atur titik akhir Jaeger. Konfigurasinya identik dengan versi .NET 6.0 di atas.

Langkah 2: Instal middleware ASP.NET Core.

cd dotnet-demo/netcoreapp3.1/Shared
dotnet add package OpenTracing.Contrib.NetCore

Langkah 3: Instal middleware di proyek aplikasi dan jalankan.

cd dotnet-demo/netcoreapp3.1/CustomersApi
dotnet add package OpenTracing.Contrib.NetCore
dotnet run --framework:netcoreapp3.1

Langkah 4: Hasilkan data jejak.

Buka http://localhost:5001/health di browser.

Langkah 5: Verifikasi.

Ikuti langkah-langkah pada bagian "Verifikasi pelaporan data jejak" di bawah.

Auto-instrumentasi dengan gRPC

Instrumentasi gRPC menambahkan pelacakan pada sisi server dan klien panggilan gRPC.

Langkah 1: Instal paket NuGet.

dotnet add package OpenTracing.Contrib.grpc
dotnet add package Jaeger

Langkah 2: Inisialisasi tracer.

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)
        // Ganti dengan titik akhir Jaeger Anda. Lihat bagian "Dapatkan titik akhir Jaeger" di atas.
        .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();
}

Langkah 3: Tambahkan instrumentasi sisi server.

Buat ServerTracingInterceptor dan bind ke layanan gRPC:

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));

Langkah 4: Tambahkan instrumentasi sisi klien.

Buat ClientTracingInterceptor dan bind ke channel:

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));

Langkah 5: Jalankan server dan klien.

Jalankan server gRPC di satu terminal:

cd dotnet-demo/netcoreapp3.1/GreeterClient
dotnet run --framework:netcoreapp3.1

Jalankan klien gRPC di terminal lain:

cd dotnet-demo/netcoreapp3.1/GreeterClient
dotnet run --framework:netcoreapp3.1

Jika muncul Greeting: Hello you, koneksi berhasil. Data jejak dari dotnetGrpcServer dan dotnetGrpcClient kini sedang dilaporkan.

Instrumentasi manual aplikasi .NET

Gunakan instrumentasi manual ketika plugin yang tersedia tidak mencakup kasus penggunaan Anda atau ketika Anda membutuhkan kontrol detail halus terhadap operasi mana yang dilacak.

Langkah 1: Instal paket NuGet.

dotnet add package Microsoft.Extensions.Logging.Console
dotnet add package Jaeger

Langkah 2: Buat objek ITracer.

Antarmuka ITracer didefinisikan oleh OpenTracing. Gunakan library Jaeger untuk membuat implementasi yang menentukan titik akhir dan konfigurasi pengambilan 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)
        // Ganti dengan titik akhir Jaeger Anda. Lihat bagian "Dapatkan titik akhir Jaeger" di atas.
        .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();
}

Langkah 3: Daftarkan tracer secara global.

GlobalTracer.Register(InitTracer("dotnetManualDemo", loggerFactory));

Langkah 4: Buat rentang untuk mencatat operasi.

Buat rentang root untuk permintaan:

ITracer tracer = GlobalTracer.Instance;
ISpan span = tracer.BuildSpan("parentSpan").WithTag("mytag", "parentSpan").Start();
tracer.ScopeManager.Activate(span, false);
// ... logika bisnis Anda di sini
span.Finish();

Untuk mencatat operasi bersarang dalam permintaan yang sama, buat rentang anak dengan AsChildOf:

ITracer tracer = GlobalTracer.Instance;
ISpan parentSpan = tracer.ActiveSpan;
ISpan childSpan = tracer.BuildSpan("childSpan").AsChildOf(parentSpan).WithTag("mytag", "spanSecond").Start();
tracer.ScopeManager.Activate(childSpan, false);
// ... logika bisnis Anda di sini
childSpan.Finish();

Langkah 5 (opsional): Tambahkan tag kustom.

Lampirkan metadata ke rentang untuk penyaringan dan debugging:

tracer.activeSpan().setTag("http.status_code", "200");

Langkah 6: Sebarkan konteks lintas layanan.

Dalam sistem terdistribusi, konteks jejak (TraceId, ParentSpanId, SpanId, Sampled) ikut dalam setiap permintaan prosedur panggilan jarak jauh (RPC). Gunakan Inject di sisi klien dan Extract di sisi server untuk meneruskan konteks melalui Header HTTP.

Context propagation flow

Inject konteks di sisi klien:

Tracer.Inject(span.Context, BuiltinFormats.HttpHeaders, new HttpHeadersInjectAdapter(request.Headers));

Extract konteks di sisi server:

ISpanContext extractedSpanContext = _tracer.Extract(BuiltinFormats.HttpHeaders, new RequestHeadersExtractAdapter(request.Headers));
ISpan childSpan = _tracer.BuildSpan(operationName).AsChildOf(extractedSpanContext);

Langkah 7: Jalankan contoh.

cd dotnet-demo/netcoreapp3.1/ManualDemo
dotnet run --framework:netcoreapp3.1

Data jejak dari dotnetManualDemo muncul di konsol Managed Service for OpenTelemetry.

Verifikasi pelaporan data jejak

  1. Masuk ke konsol ARMS.

  2. Di panel navigasi sebelah kiri, pilih Application Monitoring > Applications.

  3. Cari aplikasi Anda berdasarkan nama.

Catatan

Jika ikon Java图标 muncul di kolom Language, aplikasi tersebut terhubung ke Application Monitoring. Tanda hubung (-) menunjukkan koneksi ke Managed Service for OpenTelemetry.

FAQ

Tidak ada data jejak yang muncul setelah menjalankan demo

Periksa apakah titik akhir di senderConfiguration benar dan dapat dijangkau dari lingkungan Anda:

Configuration.SenderConfiguration senderConfiguration = new Configuration.SenderConfiguration(loggerFactory)
    // Pastikan titik akhir ini sesuai dengan yang ada di konsol.
    .WithEndpoint("http://tracing-analysis-dc-sz.aliyuncs.com/adapt_your_token/api/traces");

Jika aplikasi Anda berjalan di dalam VPC, pastikan Anda menggunakan titik akhir VPC, bukan titik akhir publik.

Bagaimana cara mengonfigurasi laju sampel?

Untuk informasi lebih lanjut, lihat dokumentasi sampler jaeger-client-csharp.

Langkah selanjutnya