Apa itu pelacakan terdistribusi dan korelasi telemetri?
Perhatian
Kami merekomendasikan Distro OpenTelemetry Azure Monitor untuk aplikasi atau pelanggan baru untuk mendukung Azure Monitor Application Insights. Distro OpenTelemetry Azure Monitor memberikan fungsionalitas dan pengalaman serupa seperti Application Insights SDK. Dimungkinkan untuk bermigrasi dari Application Insights SDK menggunakan panduan migrasi untuk .NET, Node.js, dan Python, tetapi kami masih berupaya menambahkan beberapa fitur lagi untuk kompatibilitas mundur.
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.
-
Tambahkan konfigurasi berikut:
distributedTracingMode: DistributedTracingModes.W3C
Penyiapan berbasis Skrip Pemuat SDK JavaScript (Web)
Tambahkan konfigurasi berikut:
distributedTracingMode: 2 // DistributedTracingModes.W3C
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.
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
, , spanId
dan 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.
- Application Insights untuk aplikasi ASP.NET Core
- Mengonfigurasi Application Insights untuk situs web ASP.NET Anda
- Application Insights untuk aplikasi Layanan Pekerja (aplikasi non-HTTP)
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:<?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
- Peta aplikasi
- Tulis telemetri kustom.
- Untuk skenario korelasi tingkat lanjut ASP.NET Core dan ASP.NET, lihat Melacak operasi kustom.
- Pelajari selengkapnya tentang pengaturan cloud_RoleName untuk SDK lainnya.
- Onboard semua komponen layanan mikro Anda di Application Insights. Lihat platform yang didukung.
- Lihat model data untuk jenis Application Insights.
- Pelajari cara memperluas dan memfilter telemetri.
- Tinjau referensi konfigurasi Application Insights.