Setelah Anda menggunakan OpenTelemetry untuk menginstrumentasikan aplikasi dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi. Anda dapat melihat data pemantauan aplikasi seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menggunakan agen atau OpenTelemetry SDK untuk Python untuk secara otomatis atau manual menginstrumentasikan aplikasi Python dan melaporkan data jejak.
Dibandingkan dengan agen sumber terbuka, kami merekomendasikan agar Anda menginstal agen Python yang dikembangkan oleh Alibaba Cloud. Agen ini mendukung observabilitas untuk kerangka kerja model bahasa besar seperti LlamaIndex, Dify, LangChain, OpenAI, dan Qwen, serta menyediakan metrik, jejak, dan data profil berkelanjutan yang lebih kaya. Untuk informasi lebih lanjut, lihat Pemantauan Aplikasi Python.
Informasi latar belakang
OpenTelemetry menyediakan beberapa plug-in instrumentasi otomatis yang dapat digunakan untuk secara otomatis membuat rentang untuk kerangka kerja umum. Tabel berikut menjelaskan kerangka kerja yang didukung. Untuk informasi lebih lanjut, kunjungi GitHub.
Di tabel berikut, Nomor versi ~= V.N menunjukkan Nomor versi ≥ V.N dan Nomor versi == V.*. Sebagai contoh, aiohttp ~= 3.0 menunjukkan bahwa versi aiohttp harus memenuhi persyaratan berikut: Nomor versi ≥ 3.0 dan Nomor versi == 3.*.
Kode contoh
Unduh kode contoh dari python-opentelemetry-demo.
Metode 1: Gunakan agen untuk mengonfigurasi instrumentasi otomatis untuk aplikasi
Unduh dan instal paket yang diperlukan.
pip install django pip install requests pip install opentelemetry-distro \ opentelemetry-exporter-otlp opentelemetry-bootstrap -a installBuat proyek AutoAndManualDemo dan buat aplikasi HelloWorld.
Buat proyek AutoAndManualDemo.
django-admin startproject AutoAndManualDemoBuat aplikasi HelloWorld di proyek.
cd AutoAndManualDemo # Buat aplikasi HelloWorld di proyek. python manage.py startapp helloworld
Modifikasi kode aplikasi HelloWorld.
Tambahkan kode berikut ke file AutoAndManualDemo/helloworld/views.py:
from django.http import HttpResponse from datetime import datetime # Buat tampilan Anda di sini. def hello_world_view(request): result = "Hello World! Waktu Saat Ini =" + str(get_time()) return HttpResponse(result) def get_time(): now = datetime.now() return now.strftime("%H:%M:%S")Buat file AutoAndManualDemo/helloworld/urls.py dan tambahkan kode berikut ke file tersebut:
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')), ]
Jalankan proyek.
Untuk melaporkan data jejak melalui HTTP, ganti
<your-service-name>dengan nama aplikasi Anda dan<http-endpoint>dengan titik akhir HTTP.opentelemetry-instrument \ --traces_exporter console,otlp_proto_http \ --metrics_exporter none \ --service_name <your-service-name> \ --exporter_otlp_traces_endpoint <http-endpoint> \ python manage.py runserver --noreloadCatatanParameter
--noreloaddigunakan untuk mencegah metode manage.main berjalan dua kali.Kesalahan
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is Falsemungkin terjadi meskipun baik DEBUG maupun ALLOWED_HOSTS di file AutoAndManualDemo/AutoAndManualDemo/settings.py telah ditentukan dengan benar. Hal ini karena file konfigurasi default django/conf/global_settings.py dari Django digunakan saat Anda memulai proyek menggunakan opentelemetry-instrument. Dalam kasus ini, Anda harus menambahkan variabel lingkunganexport DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settings.
Kunjungi
http://127.0.0.1:8000/helloworld/di browser. Konsol menampilkan data jejak dan melaporkan data jejak ke Managed Service for OpenTelemetry.Jika Anda tidak ingin konsol menampilkan data jejak, atur parameter
--traces_exporterke--traces_exporter otlp_proto_http.
Metode 2: Instrumentasi manual aplikasi
Unduh dan instal paket yang diperlukan.
pip install opentelemetry-api pip install opentelemetry-sdk pip install opentelemetry-exporter-otlpTentukan kode inisialisasi OpenTelemetry di file manual.py.
Ganti
<endpoint>di bagian<token>kode dengan titik akhir OpenTelemetry yang Anda peroleh.Ganti
<service-name>dan<host-name>di kode dengan nama aplikasi dan hostname sebenarnya.
from opentelemetry import trace, baggage 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, Resource, HOST_NAME from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor def init_opentelemetry(): # Tentukan nama aplikasi dan hostname. resource = Resource(attributes={ SERVICE_NAME: "<service-name>", HOST_NAME: "<host-name>" }) # Gunakan protokol gRPC untuk melaporkan data jejak. span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter( endpoint="<endpoint>", headers=("Authentication=<token>") )) # Gunakan protokol HTTP untuk melaporkan data jejak. # span_processor = BatchSpanProcessor(OTLPSpanHttpExporter( # endpoint="<endpoint>", # )) trace_provider = TracerProvider(resource=resource, active_span_processor=span_processor) trace.set_tracer_provider(trace_provider)Buat rentang.
tracer = trace.get_tracer(__name__) # Dapatkan tracer. with tracer.start_as_current_span("child_span") as child_span: # Buat rentang bernama child_span. print("hello world")Dapatkan ID jejak dan ID rentang.
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)Gunakan API Baggage OpenTelemetry untuk melewatkan tag kustom.
Saat membuat rentang baggage_parent_span, tentukan parameter attributes untuk mengonfigurasi atribut.
def baggage_and_attribute_usage(): tracer = trace.get_tracer(__name__) global_ctx = baggage.set_baggage("key", "value_from_global_ctx") # Gunakan API Baggage OpenTelemetry untuk mentransfer data antara rentang yang berbeda. with tracer.start_as_current_span(name='baggage_parent_span', attributes={'attribute_key': 'value'}) as baggage_parent_span: 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: child_ctx = baggage.set_baggage("key", "value_from_child_ctx") # Dapatkan nilai kunci dalam konteks yang berbeda. print(baggage.get_baggage("key", global_ctx)) print(baggage.get_baggage("key", parent_ctx)) print(baggage.get_baggage("key", child_ctx))Jalankan aplikasi.
python manual.py
Metode 3: Gabungkan instrumentasi otomatis dengan instrumentasi manual
Jika Anda ingin menambahkan instrumentasi manual berdasarkan persyaratan bisnis Anda setelah menggunakan OpenTelemetry untuk secara otomatis menginstrumentasikan aplikasi, lakukan langkah-langkah berikut setelah menggunakan Metode 1:
Unduh dan instal paket yang diperlukan.
pip install django pip install requests pip install opentelemetry-sdk pip install opentelemetry-instrumentation-django pip install opentelemetry-exporter-otlpBuat proyek AutoAndManualDemo dan buat aplikasi HelloWorld.
Buat proyek AutoAndManualDemo.
django-admin startproject AutoAndManualDemoBuat aplikasi HelloWorld di proyek.
cd AutoAndManualDemo # Buat aplikasi HelloWorld di proyek. python manage.py startapp helloworld
Modifikasi kode file helloworld/views.py.
Dapatkan tracer. Buat rentang dan atur nama rentang.
from django.http import HttpResponse from opentelemetry import trace from datetime import datetime # Buat tampilan Anda di sini. 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! Waktu Saat Ini =" + str(get_time()) return HttpResponse(result) def get_time(): now = datetime.now() tracer = trace.get_tracer(__name__) # Buat rentang. with tracer.start_as_current_span("time_span") as time_span: return now.strftime("%H:%M:%S")Modifikasi file urls.py.
Buat file helloworld/urls.py dan tambahkan kode berikut ke file tersebut:
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')), ]
Tambahkan kode berikut ke kode inisialisasi OpenTelemetry di file manual.py:
from opentelemetry import trace from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter # Gunakan protokol gRPC untuk melaporkan data jejak. # from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter # Gunakan protokol HTTP untuk melaporkan data jejak. from opentelemetry.sdk.resources import SERVICE_NAME, Resource, HOST_NAME from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter resource = Resource(attributes={ SERVICE_NAME: "<service-name>", HOST_NAME: "<host-name>" }) trace.set_tracer_provider(TracerProvider(resource=resource)) trace.get_tracer_provider().add_span_processor( BatchSpanProcessor(OTLPSpanExporter( endpoint="<endpoint>", headers="Authentication=<token>" # Parameter headers hanya diperlukan untuk protokol gRPC. ))) # Gunakan OTLPSpanExporter untuk melaporkan data jejak. trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter())) # Dapatkan data jejak di konsol Managed Service for OpenTelemetry.Ganti konten berikut dengan nilai sebenarnya dan modifikasi kode berdasarkan protokol yang Anda gunakan:
<service-name>: nama aplikasi Anda.<host-name>: nama host.<endpoint>: titik akhir yang digunakan untuk melaporkan data jejak melalui HTTP atau gRPC.<token>: token otentikasi yang digunakan untuk melaporkan data jejak melalui gRPC.
Jalankan proyek.
python manage.py runserver --noreloadParameter
--noreloaddigunakan untuk mencegah metode manage.main berjalan dua kali.Jika terjadi kesalahan
ImportError(symbol not found in flat namespace '_CFRelease'), jalankan perintah berikut untuk mengunduh dan menginstal paket Grpcio:pip install grpcio
Kunjungi
127.0.0.1:8000/helloworlddi browser. Data jejak dilaporkan ke konsol Managed Service for OpenTelemetry.
Lihat data pemantauan
Di halaman Applications pada Konsol Managed Service for OpenTelemetry, klik nama aplikasi. Di halaman yang muncul, lihat data jejak.