All Products
Search
Document Center

Application Real-Time Monitoring Service:Laporkan data jejak dari aplikasi Python menggunakan OpenTelemetry

Last Updated:Mar 12, 2026

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.

Penting Tip: Alibaba Cloud menyediakan agen Python khusus dengan observabilitas bawaan untuk framework LLM termasuk LlamaIndex, Dify, LangChain, OpenAI, dan Qwen. Agen ini menghasilkan metrik, jejak, dan data profil berkelanjutan yang lebih kaya dibandingkan agen open-source. Untuk detailnya, lihat Pantau aplikasi Python.

Prasyarat

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.

Catatan Dalam tabel, ~= V.N berarti >= V.N dan == V.*. Misalnya, aiohttp ~= 3.0 berarti versi 3.0 atau lebih baru dalam rentang 3.x.

Klik untuk melihat framework Python yang didukung

Plug-inPaket dan versi yang didukung
opentelemetry-instrumentation-aio-pikaaio_pika - [7.2.0, 10.0.0)
opentelemetry-instrumentation-aiohttp-clientaiohttp ~= 3.0
opentelemetry-instrumentation-aiohttp-serveraiohttp ~= 3.0
opentelemetry-instrumentation-aiopgaiopg - [0.13.0, 2.0.0)
opentelemetry-instrumentation-asgiasgiref ~= 3.0
opentelemetry-instrumentation-asyncpgasyncpg >= 0.12.0
opentelemetry-instrumentation-aws-lambdaaws_lambda
opentelemetry-instrumentation-botoboto ~= 2.0
opentelemetry-instrumentation-boto3sqsboto3 ~= 1.0
opentelemetry-instrumentation-botocorebotocore ~= 1.0
opentelemetry-instrumentation-cassandracassandra-driver ~= 3.25, scylla-driver ~= 3.25
opentelemetry-instrumentation-celerycelery - [4.0, 6.0)
opentelemetry-instrumentation-confluent-kafkaconfluent-kafka - [1.8.2, 2.2.0]
opentelemetry-instrumentation-dbapidbapi
opentelemetry-instrumentation-djangodjango >= 1.10
opentelemetry-instrumentation-elasticsearchelasticsearch >= 2.0
opentelemetry-instrumentation-falconfalcon - [1.4.1, 4.0.0)
opentelemetry-instrumentation-fastapifastapi ~= 0.58
opentelemetry-instrumentation-flaskflask - [1.0, 3.0)
opentelemetry-instrumentation-grpcgrpcio ~= 1.27
opentelemetry-instrumentation-httpxhttpx >= 0.18.0
opentelemetry-instrumentation-jinja2jinja2 - [2.7, 4.0)
opentelemetry-instrumentation-kafka-pythonkafka-python >= 2.0
opentelemetry-instrumentation-logginglogging
opentelemetry-instrumentation-mysqlmysql-connector-python ~= 8.0
opentelemetry-instrumentation-mysqlclientmysqlclient < 3
opentelemetry-instrumentation-pikapika >= 0.12.0
opentelemetry-instrumentation-psycopg2psycopg2 >= 2.7.3.1
opentelemetry-instrumentation-pymemcachepymemcache - [1.3.5, 5)
opentelemetry-instrumentation-pymongopymongo - [3.1, 5.0)
opentelemetry-instrumentation-pymysqlPyMySQL < 2
opentelemetry-instrumentation-pyramidpyramid >= 1.7
opentelemetry-instrumentation-redisredis >= 2.6
opentelemetry-instrumentation-remouladeremoulade >= 0.50
opentelemetry-instrumentation-requestsrequests ~= 2.0
opentelemetry-instrumentation-sqlalchemysqlalchemy
opentelemetry-instrumentation-sqlite3sqlite3
opentelemetry-instrumentation-starlettestarlette ~= 0.13.0
opentelemetry-instrumentation-system-metricspsutil >= 5
opentelemetry-instrumentation-tornadotornado >= 5.1.1
opentelemetry-instrumentation-tortoiseormtortoise-orm >= 0.17.0
opentelemetry-instrumentation-urlliburllib
opentelemetry-instrumentation-urllib3urllib3 - [1.0.0, 3.0.0)
opentelemetry-instrumentation-wsgiwsgi

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.

ProtokolCocok untukCatatan
HTTPSebagian besar lingkunganMudah melewati proxy dan firewall. Tidak memerlukan header autentikasi.
gRPCLingkungan latensi rendah dan throughput tinggiMemerlukan 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:

PlaceholderDeskripsiCara 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 install

opentelemetry-bootstrap mendeteksi library yang terinstal dan secara otomatis menginstal plug-in instrumentasi yang sesuai.

Langkah 2: Buat proyek dan aplikasi Django

  1. Buat proyek AutoAndManualDemo:

       django-admin startproject AutoAndManualDemo
  2. Buat aplikasi HelloWorld dalam proyek tersebut:

       cd AutoAndManualDemo
    
       # Buat aplikasi HelloWorld dalam proyek.
       python manage.py startapp helloworld

Langkah 3: Tambahkan kode aplikasi

  1. 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")
  2. Buat file AutoAndManualDemo/helloworld/urls.py dan tambahkan kode berikut:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  3. 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 --noreload

Jika Anda tidak ingin konsol menampilkan data jejak, atur parameter --traces_exporter menjadi otlp_proto_http.

Catatan
  • Flag --noreload mencegah Django menjalankan metode manage.main dua kali.
  • Jika Anda melihat CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False, atur variabel lingkungan sebelum menjalankan. Kesalahan ini terjadi karena opentelemetry-instrument memuat file pengaturan default Django (django/conf/global_settings.py) alih-alih pengaturan proyek Anda.
  export DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settings

Langkah 5: Verifikasi pelaporan jejak

  1. Buka http://127.0.0.1:8000/helloworld/ di browser. Konsol akan menampilkan data jejak dan melaporkan data tersebut ke Managed Service for OpenTelemetry.

  2. Masuk ke Konsol ARMS.

  3. Di panel navigasi kiri, pilih Application Monitoring > Applications.

  4. Di halaman Applications, temukan aplikasi Anda berdasarkan nama layanan yang telah Anda konfigurasi, lalu klik aplikasi tersebut.

  5. Di halaman detail aplikasi, verifikasi bahwa jejak muncul. Anda akan melihat data rentang yang sesuai dengan permintaan yang telah Anda kirim.

Catatan Jika ikon icon 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-otlp

Langkah 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_ctx

Langkah 6: Jalankan dan verifikasi

python manual.py

Setelah aplikasi dijalankan, verifikasi data jejak di konsol ARMS. Ikuti langkah-langkah pada bagian Verifikasi pelaporan jejak di bawah Instrumentasi Otomatis.

Klik untuk melihat kode contoh lengkap

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, 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>",
    })

    # Ekspor melalui gRPC
    span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
        endpoint="<endpoint>",
        headers=("Authentication=<token>"),
    ))

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


def inner_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("child_span") as child_span:
        print("hello world")


def outer_method():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("parent_span") as parent_span:
        inner_method()


def baggage_and_attribute_usage():
    tracer = trace.get_tracer(__name__)
    global_ctx = baggage.set_baggage("key", "value_from_global_ctx")
    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")

    print(baggage.get_baggage("key", global_ctx))
    print(baggage.get_baggage("key", parent_ctx))
    print(baggage.get_baggage("key", child_ctx))


if __name__ == '__main__':
    init_opentelemetry()
    outer_method()
    baggage_and_attribute_usage()

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-otlp

Langkah 2: Buat proyek dan aplikasi Django

  1. Buat proyek AutoAndManualDemo:

       django-admin startproject AutoAndManualDemo
  2. Buat 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

  1. Buat file helloworld/urls.py dan tambahkan kode berikut:

       from django.urls import path
    
       from . import views
    
       urlpatterns = [
           path('', views.hello_world_view, name='helloworld')
       ]
  2. 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
Catatan
  • Flag --noreload mencegah Django menjalankan metode manage.main dua kali.
  • Jika terjadi kesalahan ImportError(symbol not found in flat namespace '_CFRelease'), instal paket gRPC:
  pip install grpcio

Kirim 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

  1. Masuk ke Konsol ARMS.

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

  3. Di halaman Applications, klik nama aplikasi Anda.

  4. Di halaman detail aplikasi, lihat jejak, topologi aplikasi, transaksi abnormal, transaksi lambat, dan data analisis SQL.

Catatan Jika ikon icon muncul di kolom Language, berarti aplikasi terhubung ke Application Monitoring. Tanda hubung (-) menunjukkan koneksi ke Managed Service for OpenTelemetry.