Instrumentasikan aplikasi Python Anda dengan OpenTelemetry untuk melaporkan data jejak ke Managed Service for OpenTelemetry. Setelah terhubung, Application Real-Time Monitoring Service (ARMS) akan menampilkan topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL.
Topik ini mencakup tiga pendekatan instrumentasi:
Instrumentasi Otomatis — Tanpa perubahan kode. Agen OpenTelemetry melakukan instrumentasi framework yang didukung saat runtime.
Instrumentasi Manual — Kontrol penuh. Tambahkan rentang (spans), atribut, dan baggage melalui SDK OpenTelemetry.
Instrumentasi Gabungan — Tambahkan rentang kustom di atas instrumentasi otomatis untuk visibilitas yang ditargetkan.
Prasyarat
Titik akhir dan token otentikasi dari konsol Managed Service for OpenTelemetry. Lihat Dapatkan informasi titik akses.
Framework yang didukung
OpenTelemetry menyediakan plug-in instrumentasi otomatis untuk framework Python umum. Tabel berikut mencantumkan framework yang didukung beserta persyaratan versinya. Untuk daftar lengkapnya, lihat opentelemetry-python-contrib.
~= V.N berarti >= V.N dan == V.*. Misalnya, aiohttp ~= 3.0 berarti versi 3.0 atau lebih baru dalam rentang 3.x.Kode contoh
Unduh kode contoh lengkap dari python-opentelemetry-demo.
Pilih protokol transport
Managed Service for OpenTelemetry menerima data jejak melalui HTTP dan gRPC. Pilih berdasarkan lingkungan jaringan Anda.
| Protokol | Cocok untuk | Catatan |
|---|---|---|
| HTTP | Sebagian besar lingkungan | Mudah melewati proxy dan firewall. Tidak memerlukan header autentikasi. |
| gRPC | Lingkungan latensi rendah dan throughput tinggi | Memerlukan paket grpcio. Menggunakan header Authentication. |
Kedua opsi muncul dalam contoh di bawah. Pilih salah satu sesuai kebutuhan jaringan Anda.
Referensi placeholder
Ganti placeholder berikut dalam contoh dengan nilai aktual Anda:
| Placeholder | Deskripsi | Cara mendapatkannya |
|---|---|---|
<your-service-name> | Mengidentifikasi aplikasi Anda di konsol ARMS. | Anda yang menentukan. Contoh: my-python-app |
<host-name> | Hostname mesin yang menjalankan aplikasi Anda. | Jalankan hostname di terminal Anda. |
<endpoint> | Titik akhir untuk melaporkan data jejak (HTTP atau gRPC). | Konsol Managed Service for OpenTelemetry. Lihat Dapatkan informasi titik akses. |
<token> | Token otentikasi (hanya untuk gRPC). | Konsol Managed Service for OpenTelemetry. Lihat Dapatkan informasi titik akses. |
Instrumentasi Otomatis
Instrumentasi otomatis adalah cara tercepat untuk pelacakan terdistribusi. Agen OpenTelemetry melakukan instrumentasi framework yang didukung saat runtime tanpa perubahan kode.
Langkah 1: Instal dependensi
pip install django
pip install requests
pip install opentelemetry-distro \
opentelemetry-exporter-otlp
opentelemetry-bootstrap -a installopentelemetry-bootstrap mendeteksi library yang terinstal dan secara otomatis menginstal plug-in instrumentasi yang sesuai.
Langkah 2: Buat proyek dan aplikasi Django
Buat proyek AutoAndManualDemo:
django-admin startproject AutoAndManualDemoBuat aplikasi HelloWorld dalam proyek tersebut:
cd AutoAndManualDemo # Buat aplikasi HelloWorld dalam proyek. python manage.py startapp helloworld
Langkah 3: Tambahkan kode aplikasi
Tambahkan kode berikut ke file
AutoAndManualDemo/helloworld/views.py:from django.http import HttpResponse from datetime import datetime # Create your views here. def hello_world_view(request): result = "Hello World! Current Time =" + str(get_time()) return HttpResponse(result) def get_time(): now = datetime.now() return now.strftime("%H:%M:%S")Buat file
AutoAndManualDemo/helloworld/urls.pydan tambahkan kode berikut:from django.urls import path from . import views urlpatterns = [ path('', views.hello_world_view, name='helloworld') ]Tambahkan pola URL ke file
AutoAndManualDemo/AutoAndManualDemo/urls.py:from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('helloworld/', include('helloworld.urls')), ]
Langkah 4: Jalankan aplikasi Anda
Tambahkan awalan perintah start Anda dengan opentelemetry-instrument dan sertakan konfigurasi eksporter.
Laporkan melalui HTTP
opentelemetry-instrument \
--traces_exporter console,otlp_proto_http \
--metrics_exporter none \
--service_name <your-service-name> \
--exporter_otlp_traces_endpoint <endpoint> \
python manage.py runserver --noreloadJika Anda tidak ingin konsol menampilkan data jejak, atur parameter --traces_exporter menjadi otlp_proto_http.
- Flag
--noreloadmencegah Django menjalankan metodemanage.maindua kali. - Jika Anda melihat
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False, atur variabel lingkungan sebelum menjalankan. Kesalahan ini terjadi karenaopentelemetry-instrumentmemuat file pengaturan default Django (django/conf/global_settings.py) alih-alih pengaturan proyek Anda.
export DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settingsLangkah 5: Verifikasi pelaporan jejak
Buka
http://127.0.0.1:8000/helloworld/di browser. Konsol akan menampilkan data jejak dan melaporkan data tersebut ke Managed Service for OpenTelemetry.Masuk ke Konsol ARMS.
Di panel navigasi kiri, pilih Application Monitoring > Applications.
Di halaman Applications, temukan aplikasi Anda berdasarkan nama layanan yang telah Anda konfigurasi, lalu klik aplikasi tersebut.
Di halaman detail aplikasi, verifikasi bahwa jejak muncul. Anda akan melihat data rentang yang sesuai dengan permintaan yang telah Anda kirim.
muncul di kolom Language, berarti aplikasi terhubung ke Application Monitoring. Tanda hubung (-) menunjukkan koneksi ke Managed Service for OpenTelemetry.Instrumentasi Manual
Gunakan instrumentasi manual untuk kontrol detail halus atas rentang, atribut, dan propagasi konteks. Pendekatan ini menambahkan panggilan SDK OpenTelemetry langsung ke kode Anda.
Langkah 1: Instal dependensi
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlpLangkah 2: Inisialisasi OpenTelemetry
Buat modul inisialisasi (misalnya, manual.py) yang mengonfigurasi penyedia tracer dan eksporter.
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
OTLPSpanExporter as OTLPSpanGrpcExporter,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import (
OTLPSpanExporter as OTLPSpanHttpExporter,
)
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
def init_opentelemetry():
resource = Resource(attributes={
SERVICE_NAME: "<your-service-name>",
HOST_NAME: "<host-name>",
})
# Opsi A: Ekspor melalui gRPC
span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
endpoint="<endpoint>",
headers=("Authentication=<token>"),
))
# Opsi B: Ekspor melalui HTTP (hapus komentar untuk menggunakan)
# span_processor = BatchSpanProcessor(OTLPSpanHttpExporter(
# endpoint="<endpoint>",
# ))
trace_provider = TracerProvider(
resource=resource,
active_span_processor=span_processor,
)
trace.set_tracer_provider(trace_provider)Langkah 3: Buat rentang
Setelah inisialisasi, ambil tracer dan buat rentang untuk melacak operasi.
tracer = trace.get_tracer(__name__)
# Pola context manager
with tracer.start_as_current_span("child_span") as child_span:
print("hello world")Sarangkan rentang untuk merepresentasikan hubungan induk-anak:
def outer_method():
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("parent_span") as parent_span:
inner_method()
def inner_method():
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("child_span") as child_span:
print("hello world")Langkah 4: Ambil ID jejak dan ID rentang
Ambil ID jejak dan ID rentang dari konteks rentang saat ini. ID ini berguna untuk mengorelasikan log dengan jejak.
ctx = trace.get_current_span().get_span_context()
trace_id = '{trace:032x}'.format(trace=ctx.trace_id)
span_id = '{span:016x}'.format(span=ctx.span_id)
print(trace_id)
print(span_id)Langkah 5: Propagasikan metadata kustom dengan API Baggage
API Baggage OpenTelemetry mempropagasikan pasangan kunci-nilai di seluruh rentang dalam satu jejak. Gunakan baggage untuk meneruskan metadata—seperti ID pengguna, ID penyewa, atau konteks permintaan—antar layanan.
from opentelemetry import trace, baggage
def baggage_and_attribute_usage():
tracer = trace.get_tracer(__name__)
# Atur baggage di tingkat global
global_ctx = baggage.set_baggage("key", "value_from_global_ctx")
# Buat rentang dengan atribut kustom
with tracer.start_as_current_span(
name='baggage_parent_span',
attributes={'attribute_key': 'value'},
) as baggage_parent_span:
# Atur baggage dalam konteks induk
parent_ctx = baggage.set_baggage("key", "value_from_parent_ctx")
with tracer.start_as_current_span(
name='baggage_child_span',
context=parent_ctx,
) as baggage_child_span:
# Atur baggage dalam konteks anak
child_ctx = baggage.set_baggage("key", "value_from_child_ctx")
# Baca nilai baggage dari setiap konteks
print(baggage.get_baggage("key", global_ctx)) # value_from_global_ctx
print(baggage.get_baggage("key", parent_ctx)) # value_from_parent_ctx
print(baggage.get_baggage("key", child_ctx)) # value_from_child_ctxLangkah 6: Jalankan dan verifikasi
python manual.pySetelah aplikasi dijalankan, verifikasi data jejak di konsol ARMS. Ikuti langkah-langkah pada bagian Verifikasi pelaporan jejak di bawah Instrumentasi Otomatis.
Instrumentasi Gabungan
Gabungkan instrumentasi otomatis dan manual untuk mendapatkan cakupan luas framework dari agen sekaligus menambahkan rentang kustom untuk operasi penting bisnis. Pendekatan ini menggunakan agen instrumentasi otomatis untuk pelacakan tingkat framework, dan menambahkan panggilan SDK untuk rentang spesifik aplikasi.
Langkah 1: Instal dependensi
pip install django
pip install requests
pip install opentelemetry-sdk
pip install opentelemetry-instrumentation-django
pip install opentelemetry-exporter-otlpLangkah 2: Buat proyek dan aplikasi Django
Buat proyek AutoAndManualDemo:
django-admin startproject AutoAndManualDemoBuat aplikasi HelloWorld dalam proyek tersebut:
cd AutoAndManualDemo # Buat aplikasi HelloWorld dalam proyek. python manage.py startapp helloworld
Langkah 3: Tambahkan rentang kustom ke kode Anda
Impor API trace OpenTelemetry dan buat rentang di sekitar operasi yang ingin Anda lacak.
Contoh view Django berikut menambahkan dua rentang kustom (hello_world_span dan time_span) di atas rentang yang dibuat secara otomatis oleh plug-in instrumentasi Django. Modifikasi file helloworld/views.py:
from django.http import HttpResponse
from opentelemetry import trace
from datetime import datetime
def hello_world_view(request):
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("hello_world_span") as hello_world_span:
result = "Hello World! Current Time =" + str(get_time())
return HttpResponse(result)
def get_time():
now = datetime.now()
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("time_span") as time_span:
return now.strftime("%H:%M:%S")Langkah 4: Modifikasi file urls.py
Buat file
helloworld/urls.pydan tambahkan kode berikut:from django.urls import path from . import views urlpatterns = [ path('', views.hello_world_view, name='helloworld') ]Tambahkan pola URL ke file
AutoAndManualDemo/AutoAndManualDemo/urls.py:from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('helloworld/', include('helloworld.urls')), ]
Langkah 5: Konfigurasikan penyedia tracer
Buat modul inisialisasi yang menyiapkan eksporter dan penyedia tracer. Tambahkan kode berikut ke kode inisialisasi OpenTelemetry dalam file manual.py. Impor modul ini di awal startup aplikasi Anda (misalnya, di manage.py atau titik masuk WSGI/ASGI Anda).
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# Untuk menggunakan HTTP, hapus komentar baris berikut dan beri komentar pada impor gRPC:
# from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import SERVICE_NAME, HOST_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
resource = Resource(attributes={
SERVICE_NAME: "<your-service-name>",
HOST_NAME: "<host-name>",
})
trace.set_tracer_provider(TracerProvider(resource=resource))
# Ekspor jejak melalui gRPC
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(OTLPSpanExporter(
endpoint="<endpoint>",
headers="Authentication=<token>", # Hanya diperlukan untuk gRPC
))
)
# Juga cetak jejak ke konsol (berguna untuk debugging)
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(ConsoleSpanExporter())
)Langkah 6: Jalankan dan verifikasi
python manage.py runserver --noreload- Flag
--noreloadmencegah Django menjalankan metodemanage.maindua kali. - Jika terjadi kesalahan
ImportError(symbol not found in flat namespace '_CFRelease'), instal paket gRPC:
pip install grpcioKirim permintaan ke http://127.0.0.1:8000/helloworld/ dan verifikasi data jejak di konsol ARMS. Ikuti langkah-langkah pada bagian Verifikasi pelaporan jejak di bawah Instrumentasi Otomatis.
Lihat data pemantauan
Masuk ke Konsol ARMS.
Di panel navigasi kiri, pilih Application Monitoring > Applications.
Di halaman Applications, klik nama aplikasi Anda.
Di halaman detail aplikasi, lihat jejak, topologi aplikasi, transaksi abnormal, transaksi lambat, dan data analisis SQL.
muncul di kolom Language, berarti aplikasi terhubung ke Application Monitoring. Tanda hubung (-) menunjukkan koneksi ke Managed Service for OpenTelemetry.