Apa itu pelacakan terdistribusi dan korelasi telemetri?

Catatan

Dokumentasi berikut bergantung pada API klasik Application Insights. Rencana jangka panjang untuk Application Insights adalah mengumpulkan data menggunakan OpenTelemetry. Untuk informasi selengkapnya, lihat Mengaktifkan Azure Monitor OpenTelemetry untuk aplikasi .NET, Node.js, Python, dan Java.

Arsitektur cloud dan layanan mikro modern telah mengaktifkan layanan sederhana dan dapat disebarkan secara independen yang mengurangi biaya sekaligus meningkatkan ketersediaan dan throughput. Namun, itu telah membuat sistem keseluruhan lebih sulit untuk alasan dan debug. Pelacakan terdistribusi memecahkan masalah ini dengan menyediakan profiler performa yang berfungsi seperti tumpukan panggilan untuk arsitektur cloud dan layanan mikro.

Azure Monitor menyediakan dua pengalaman untuk menggunakan data pelacakan terdistribusi: tampilan diagnostik transaksi untuk satu transaksi/permintaan dan tampilan peta aplikasi untuk menunjukkan cara sistem berinteraksi.

Application Insights dapat memantau setiap komponen secara terpisah dan mendeteksi komponen mana yang bertanggung jawab atas kegagalan atau penurunan performa dengan menggunakan korelasi telemetri terdistribusi. Artikel ini menjelaskan model data, teknik penyebaran konteks, protokol, dan implementasi taktik korelasi pada berbagai bahasa dan platform yang digunakan oleh Application Insights.

Mengaktifkan pelacakan terdistribusi

Untuk mengaktifkan pelacakan terdistribusi untuk aplikasi, tambahkan agen, SDK, atau pustaka yang tepat ke setiap layanan berdasarkan bahasa pemrogramannya.

Mengaktifkan melalui Application Insights melalui autoinstrumentation atau SDK

Agen Application Insights dan SDK untuk .NET, .Net Core, Java, Node.Js, dan JavaScript mendukung pelacakan terdistribusi secara natif. Instruksi penginstalan dan konfigurasi SDK Application Insights tersedia untuk:

Dengan SDK Application Insights yang tepat yang diinstal dan dikonfigurasi, informasi pelacakan secara otomatis dikumpulkan untuk kerangka kerja, pustaka, dan teknologi populer oleh autocollector dependensi SDK. Daftar lengkap teknologi yang didukung tersedia dalam dokumentasi autocollection Dependensi.

Semua teknologi juga dapat dilacak secara manual dengan panggilan ke TrackDependency pada TelemetryClient.

Aktifkan melalui OpenTelemetry

Application Insights sekarang mendukung penelusuran terdistribusi melalui OpenTelemetry. OpenTelemetry menyediakan instrumentasi vendor-netral untuk mengirim jejak, metrik, dan log ke Application Insights. Awalnya komunitas OpenTelemetry menggunakan Pelacakan Terdistribusi. Metrik dan log masih dalam proses.

Cerita pengamatan lengkap mencakup ketiga pilar. Periksa status penawaran berbasis OpenTelemetry Azure Monitor kami untuk melihat status terbaru tentang apa yang disertakan, penawaran mana yang tersedia secara umum, dan opsi dukungan.

Halaman berikut terdiri dari panduan bahasa demi bahasa untuk mengaktifkan dan mengonfigurasi penawaran berbasis OpenTelemetry Microsoft. Yang penting, kami berbagi fungsionalitas dan batasan yang tersedia dari setiap penawaran sehingga Anda dapat menentukan apakah OpenTelemetry tepat untuk proyek Anda.

Mengaktifkan melalui OpenCensus

Selain SDK Application Insights, Application Insights juga mendukung pelacakan terdistribusi melalui OpenCensus. OpenCensus adalah distribusi tunggal pustaka sumber terbuka dan vendor-agnostic untuk menyediakan pengumpulan metrik dan pelacakan terdistribusi untuk layanan. OpenCensus juga memungkinkan komunitas sumber terbuka mengaktifkan pelacakan terdistribusi dengan teknologi populer seperti Redis, Memcached, atau MongoDB. Microsoft berkolaborasi pada OpenCensus dengan beberapa mitra pemantauan dan cloud lainnya.

Untuk informasi selengkapnya tentang OpenCensus for Python, lihat Menyiapkan Azure Monitor untuk aplikasi Python Anda.

Situs web OpenCensus memelihara dokumentasi referensi API untuk Python, Go, dan berbagai panduan penggunaan OpenCensus.

Model data untuk korelasi telemetri

Application Insights menentukan model data untuk korelasi telemetri terdistribusi. Untuk mengaitkan telemetri dengan operasi logis, setiap item telemetri memiliki bidang konteks yang disebut operation_Id. Setiap item telemetri dalam pelacakan terdistribusi berbagi pengidentifikasi ini. Jadi, bahkan jika Anda kehilangan telemetri dari sebuah lapisan, Anda masih dapat mengaitkan telemetri yang dilaporkan oleh komponen lain.

Operasi logis terdistribusi biasanya terdiri dari serangkaian operasi yang lebih kecil yang merupakan permintaan yang diproses oleh salah satu komponen. Telemetri permintaan mendefinisikan operasi ini. Setiap item telemetri permintaan memiliki id sendiri yang mengidentifikasinya secara unik dan global. Dan semua item telemetri (seperti pelacakan dan pengecualian) yang terkait dengan permintaan harus menetapkan operation_parentId ke nilai permintaan id.

Telemetri dependensi mewakili setiap operasi keluar, seperti panggilan HTTP ke komponen lain. Ini juga mendefinisikan sendiri id yang unik secara global. Telemetri permintaan, yang dimulai oleh panggilan dependensi ini, menggunakan id ini sebagai operation_parentId.

Anda dapat membangun tampilan operasi logika terdistribusi dengan menggunakan operation_Id, operation_parentId, dan request.id dengan dependency.id. Bidang-bidang ini juga menentukan urutan kausalitas panggilan telemetri.

Dalam lingkungan layanan mikro, jejak dari komponen dapat menuju ke item penyimpanan yang berbeda. Setiap komponen bisa memiliki string koneksi sendiri dalam Application Insights. Agar mendapatkan telemetri untuk operasi logis, Application Insights meminta data dari setiap item penyimpanan.

Ketika jumlah item penyimpanan besar, Anda memerlukan petunjuk tentang tempat untuk melihat berikutnya. Model data Application Insights menentukan dua bidang untuk menyelesaikan masalah ini: request.source dan dependency.target. Bidang pertama mengidentifikasi komponen yang memulai permintaan dependensi. Bidang kedua mengidentifikasi komponen yang mengembalikan respons panggilan dependensi.

Untuk informasi tentang mengkueri dari beberapa instans yang berbeda menggunakan ekspresi kueri app, lihat ekspresi app() di kueri Azure Monitor.

Contoh

Mari lihat contohnya. Aplikasi bernama Stock Prices menunjukkan harga pasar saham saat ini dengan menggunakan API eksternal yang disebut Stock. Aplikasi Stock Prices memiliki halaman yang disebut halaman Stock yang dibuka oleh browser web klien dengan menggunakan GET /Home/Stock. Aplikasi meminta API Stock dengan menggunakan panggilan HTTP GET /api/stock/value.

Anda dapat menganalisis telemetri yang dihasilkan dengan menjalankan kueri:

(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id

Di dalam hasil, semua item telemetri berbagi akar operation_Id. Ketika panggilan Ajax dibuat dari halaman, ID unik baru (qJSXU) ditetapkan ke telemetri dependensi, dan ID pageView digunakan sebagai operation_ParentId. Permintaan server kemudian menggunakan ID Ajax sebagai operation_ParentId.

itemType nama ID operation_ParentId operation_Id
pageView Halaman Stock STYz STYz
dependensi GET /Home/Stock qJSXU STYz STYz
permintaan GET Home/Stock KqKwlrSt9PA= qJSXU STYz
dependensi GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= STYz

Ketika panggilan GET /api/stock/value dilakukan ke layanan eksternal, Anda perlu mengetahui identitas server tersebut sehingga Anda dapat mengatur bidang dependency.target dengan tepat. Ketika layanan eksternal tidak mendukung pemantauan, target diatur ke nama host layanan. Contohnya stock-prices-api.com. Tetapi jika layanan mengidentifikasi dirinya dengan mengembalikan header HTTP yang telah ditentukan sebelumnya, target berisi identitas layanan yang memungkinkan Application Insights untuk membangun pelacakan terdistribusi dengan meminta telemetri dari layanan tersebut.

Header korelasi menggunakan W3C TraceContext

Application Insights beralih ke W3C Trace-Context, yang menentukan:

  • traceparent: Membawa ID operasi dan pengidentifikasi yang unik secara global dari panggilan.
  • tracestate: Membawa konteks pelacakan khusus sistem.

Versi terbaru dari SDK Application Insights mendukung protokol Trace-Context, tetapi Anda mungkin perlu memilih untuk mengikutinya. (Kompatibilitas mundur dengan protokol korelasi sebelumnya yang didukung oleh SDK Application Insights dipertahankan.)

Protokol HTTP korelasi, juga disebut Request-Id, tidak digunakan lagi. Protokol ini mendefinisikan dua header:

  • Request-Id: Membawa ID panggilan yang unik secara global.
  • Correlation-Context: Membawa kumpulan pasangan nilai-nama dari properti pelacakan terdistribusi.

Application Insights juga mendefinisikan ekstensi protokol HTTP korelasi. Ektensi ini menggunakan Request-Context pasangan nilai-nama untuk menyebarluaskan kumpulan properti yang digunakan oleh penelepon atau penerima panggilan langsung. SDK Application Insights menggunakan header ini untuk mengatur bidang dependency.target dan request.source.

Model data W3C Trace-Context and Application Insights memetakan dengan cara berikut:

Application Insights W3C TraceContext
Id dari Request dan Dependency parent-id
Operation_Id trace-id
Operation_ParentId parent-id dari rentang induk rentang ini. Bidang ini harus kosong jika berupa rentang akar.

Untuk informasi selengkapnya, lihat Model data telemetri di Application Insights.

Aktifkan dukungan pelacakan terdistribusi W3C untuk aplikasi .NET

Pelacakan terdistribusi berbasis W3C TraceContext diaktifkan secara default di semua SDK .NET Framework/.NET Core terbaru, bersama dengan kompatibilitas mundur dengan protokol Request-Id lama.

Aktifkan dukungan pelacakan terdistribusi W3C untuk aplikasi Java

Agen Java 3.0

Agen Java 3.0 mendukung W3C di luar kotak dan tidak perlu dikonfigurasi lagi.

Java SDK

  • Konfigurasi masuk

    Untuk aplikasi Java EE, tambahkan kode berikut ke tag <TelemetryModules> di ApplicationInsights.xml:

    <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule>
       <Param name = "W3CEnabled" value ="true"/>
       <Param name ="enableW3CBackCompat" value = "true" />
    </Add>
    

    Untuk aplikasi Spring Boot, tambahkan properti ini:

    • azure.application-insights.web.enable-W3C=true
    • azure.application-insights.web.enable-W3C-backcompat-mode=true
  • Konfigurasi keluar

    Tambahkan kode berikut ke AI-Agent.xml:

    <Instrumentation>
      <BuiltIn enabled="true">
        <HTTP enabled="true" W3C="true" enableW3CBackCompat="true"/>
      </BuiltIn>
    </Instrumentation>
    

    Catatan

    Mode kompatibilitas mundur diaktifkan secara default, dan enableW3CBackCompat parameternya bersifat opsional. Gunakan hanya saat Anda ingin menonaktifkan kompatibilitas mundur.

    Idealnya, Anda akan mematikan mode ini ketika semua layanan Anda telah diperbarui ke versi SDK yang lebih baru yang mendukung protokol W3C. Kami sangat menyarankan Anda berpindah ke SDK yang lebih baru ini sesegera mungkin.

Penting untuk memastikan konfigurasi masuk dan keluar sama persis.

Aktifkan dukungan pelacakan terdistribusi W3C untuk aplikasi Web

Fitur ini diaktifkan secara default untuk JavaScript dan header secara otomatis disertakan ketika domain halaman hosting sama dengan domain tempat permintaan dikirim (misalnya, halaman hosting adalah example.com dan permintaan Ajax dikirim ke example.com). Untuk mengubah mode pelacakan terdistribusi, gunakan distributedTracingMode bidang konfigurasi. AI_AND_W3C disediakan secara default untuk kompatibilitas mundur dengan layanan warisan apa pun yang diinstrumentasikan oleh Application Insights.

Jika permintaan XMLHttpRequest atau Fetch Ajax dikirim ke host domain lain, termasuk subdomain, header korelasi tidak disertakan secara default. Untuk mengaktifkan fitur ini, atur enableCorsCorrelation bidang konfigurasi ke true. Jika Anda mengatur enableCorsCorrelation ke true, semua permintaan XMLHttpRequest dan Fetch Ajax menyertakan header korelasi. Akibatnya, jika aplikasi di server yang dipanggil tidak mendukung traceparent header, permintaan mungkin gagal, tergantung pada apakah browser / versi dapat memvalidasi permintaan berdasarkan header mana yang diterima server. Anda dapat menggunakan correlationHeaderExcludedDomains bidang konfigurasi untuk mengecualikan domain server dari injeksi header korelasi lintas komponen. Misalnya, Anda dapat menggunakan correlationHeaderExcludedDomains: ['*.auth0.com'] untuk mengecualikan header korelasi dari permintaan yang dikirim ke IdP Auth0.

Penting

Untuk melihat semua konfigurasi yang diperlukan guna mengaktifkan korelasi, lihat dokumentasi korelasi JavaScript.

Korelasi telemetri di OpenCensus Python

OpenCensus Python mendukung W3C Trace-Context tanpa memerlukan konfigurasi tambahan.

Untuk referensi, Anda dapat menemukan model data OpenCensus di halaman GitHub ini.

Korelasi permintaan masuk

OpenCensus Python mengkorelasikan header W3C Trace-Context dari permintaan masuk ke rentang yang dihasilkan dari permintaan itu sendiri. OpenCensus berkorelasi secara otomatis dengan integrasi untuk kerangka kerja aplikasi web populer ini: Flask, Django, dan Pyramid. Anda hanya perlu mengisi header W3C Trace-Context dengan format yang benar dan mengirimkannya dengan permintaan.

Jelajahi contoh aplikasi Flask ini. Instal Flask, OpenCensus, dan ekstensi untuk Flask dan Azure.


pip install flask opencensus opencensus-ext-flask opencensus-ext-azure

Anda perlu menambahkan string koneksi Application Insights ke variabel lingkungan.

APPLICATIONINSIGHTS_CONNECTION_STRING=<appinsights-connection-string>

Aplikasi Flask Sampel

from flask import Flask
from opencensus.ext.azure.trace_exporter import AzureExporter
from opencensus.ext.flask.flask_middleware import FlaskMiddleware
from opencensus.trace.samplers import ProbabilitySampler

app = Flask(__name__)
middleware = FlaskMiddleware(
    app,
    exporter=AzureExporter(
        connection_string='<appinsights-connection-string>', # or set environment variable APPLICATION_INSIGHTS_CONNECTION_STRING
    ), 
    sampler=ProbabilitySampler(rate=1.0),
)

@app.route('/')
def hello():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host='localhost', port=8080, threaded=True)

Kode ini menjalankan contoh aplikasi Flask di komputer lokal Anda, mendengarkan port 8080. Untuk menghubungkan konteks pelacakan, kirimkan permintaan ke titik akhir. Dalam contoh ini, Anda dapat menggunakan perintah curl:

curl --header "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" localhost:8080

Dengan melihat format header Trace-Context, Anda bisa mendapatkan informasi berikut:

version: 00

trace-id: 4bf92f3577b34da6a3ce929d0e0e4736

parent-id/span-id: 00f067aa0ba902b7

trace-flags: 01

Jika Anda melihat entri permintaan yang dikirim ke Azure Monitor, Anda bisa melihat bidang yang diisi dengan informasi header pelacakan. Anda dapat menemukan data di Log (Analitik) di sumber daya Application Insights Azure Monitor.

Screenshot that shows Request telemetry in Logs (Analytics).

Bidang id berada dalam format <trace-id>.<span-id>, di mana trace-id diambil dari header pelacakan yang diteruskan dalam permintaan dan span-id adalah array 8-byte yang dihasilkan untuk rentang ini.

Bidang operation_ParentId berada dalam format <trace-id>.<parent-id>, di mana trace-id dan parent-id diambil dari header pelacakan yang diteruskan dalam permintaan.

Korelasi log

OpenCensus Python memungkinkan Anda untuk menghubungkan log dengan menambahkan ID pelacakan, ID rentang, dan bendera pengambilan sampel ke baris log. Anda menambahkan atribut ini dengan memasang integrasi pengelogan OpenCensus. Atribut berikut ditambahkan ke objek Python LogRecord : traceId, , spanIddan traceSampled (hanya berlaku untuk pencatat yang dibuat setelah integrasi).

Instal integrasi pengelogan OpenCensus:

python -m pip install opencensus-ext-logging

Aplikasi sampel

import logging

from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer

config_integration.trace_integrations(['logging'])
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
tracer = Tracer(sampler=AlwaysOnSampler())

logger = logging.getLogger(__name__)
logger.warning('Before the span')
with tracer.span(name='hello'):
    logger.warning('In the span')
logger.warning('After the span')

Saat kode ini berjalan, hal berikut ini akan dicetak di konsol:

2019-10-17 11:25:59,382 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=0000000000000000 Before the span
2019-10-17 11:25:59,384 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=70da28f5a4831014 In the span
2019-10-17 11:25:59,385 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=0000000000000000 After the span

Perhatikan bahwa terdapat spanId untuk pesan log yang berada dalam rentang tersebut. spanId sama dengan yang berada dalam rentang bernama hello.

Anda dapat mengekspor data log dengan menggunakan AzureLogHandler. Untuk informasi selengkapnya, lihat Menyiapkan Azure Monitor untuk aplikasi Python Anda.

Kita juga dapat meneruskan informasi pelacakan dari satu komponen ke komponen lain untuk korelasi yang tepat. Misalnya, pikirkan skenario di mana terdapat dua komponen, module1 dan module2. Modul 1 memanggil fungsi di Modul 2. Untuk mendapatkan log dari module1 dan module2 dalam satu pelacakan, kita dapat menggunakan pendekatan berikut:

# module1.py
import logging

from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer
from module_2 import function_1

config_integration.trace_integrations(["logging"])
logging.basicConfig(
    format="%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s"
)
tracer = Tracer(sampler=AlwaysOnSampler())

logger = logging.getLogger(__name__)
logger.warning("Before the span")

with tracer.span(name="hello"):
    logger.warning("In the span")
    function_1(logger, tracer)
logger.warning("After the span")
# module_2.py
import logging

from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer

config_integration.trace_integrations(["logging"])
logging.basicConfig(
    format="%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s"
)
logger = logging.getLogger(__name__)
tracer = Tracer(sampler=AlwaysOnSampler())


def function_1(logger=logger, parent_tracer=None):
    if parent_tracer is not None:
        tracer = Tracer(
            span_context=parent_tracer.span_context,
            sampler=AlwaysOnSampler(),
        )
    else:
        tracer = Tracer(sampler=AlwaysOnSampler())

    with tracer.span("function_1"):
        logger.info("In function_1")

Korelasi telemetri di .NET

Korelasi ditangani secara default saat onboarding aplikasi. Tidak perlu tindakan khusus.

Dukungan runtime .NET didistribusikan dengan bantuan Aktivitas and DiagnosticSource

Application Insights .NET SDK menggunakan DiagnosticSource dan Activity untuk mengumpulkan dan menghubungkan telemetri.

Korelasi telemetri di Java

Agen Java mendukung korelasi telemetri otomatis. Agen ini secara otomatis mengisi operation_id untuk semua telemetri (seperti pelacakan, pengecualian, dan kejadian kustom) yang dikeluarkan dalam cakupan permintaan. Agen ini juga menyebarkan header korelasi yang dijelaskan sebelumnya untuk panggilan layanan-ke-layanan melalui HTTP, jika agen SDK Java dikonfigurasi.

Catatan

Agen Java Application Insights secara otomatis mengumpulkan permintaan dan dependensi untuk JMS, Kafka, Netty/Webflux, dan banyak lagi. Untuk SDK Java, hanya panggilan yang dilakukan melalui Apache HttpClient yang didukung untuk fitur korelasi. Propagasi konteks otomatis di seluruh teknologi perpesanan seperti Kafka, RabbitMQ, dan Azure Service Bus tidak didukung di SDK.

Untuk mengumpulkan telemetri kustom, Anda perlu melengkapi aplikasi dengan SDK Java 2.6.

Nama peran

Anda mungkin ingin mengkustomisasi cara nama komponen ditampilkan di Peta Aplikasi. Anda dapat mengatur cloud_RoleName secara manual dengan melakukan salah satu dari tindakan berikut:

  • Untuk Application Insights Java, tetapkan nama peran cloud sebagai berikut:

    {
      "role": {
        "name": "my cloud role name"
      }
    }
    

    Anda juga dapat mengatur nama peran cloud menggunakan variabel lingkungan APPLICATIONINSIGHTS_ROLE_NAME.

  • Dengan SDK Java 2.5.0 Application Insights dan yang lebih baru, Anda dapat menentukan cloud_RoleName dengan menambahkan <RoleName> ke file ApplicationInsights.xml Anda:

    Screenshot that shows Application Insights overview and connection string.

    <?xml version="1.0" encoding="utf-8"?>
    <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30">
       <ConnectionString>InstrumentationKey=00000000-0000-0000-0000-000000000000</ConnectionString>
       <RoleName>** Your role name **</RoleName>
       ...
    </ApplicationInsights>
    
  • Jika Anda menggunakan Spring Boot dengan Application Insights Spring Boot Starter, atur nama kustom Anda untuk aplikasi dalam file application.properties:

    spring.application.name=<name-of-app>

Anda juga dapat mengatur nama peran cloud melalui variabel lingkungan atau properti sistem. Lihat Mengonfigurasi nama peran cloud untuk detailnya.

Langkah berikutnya