全部产品
Search
文档中心

Application Real-Time Monitoring Service:Gunakan OpenTelemetry untuk melaporkan data jejak aplikasi Python

更新时间:Jul 06, 2025

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.

Catatan

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.

Catatan

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.*.

Kerangka Kerja Python yang Didukung

Plug-in OpenTelemetry

Paket dan versi yang didukung

opentelemetry-instrumentation-aio-pika

aio_pika - [7.2.0, 10.0.0)

opentelemetry-instrumentation-aiohttp-client

aiohttp ~= 3.0

opentelemetry-instrumentation-aiohttp-server

aiohttp ~= 3.0

opentelemetry-instrumentation-aiopg

aiopg - [0.13.0, 2.0.0)

opentelemetry-instrumentation-asgi

asgiref ~= 3.0

opentelemetry-instrumentation-asyncpg

asyncpg ≥ 0.12.0

opentelemetry-instrumentation-aws-lambda

aws_lambda

opentelemetry-instrumentation-boto

boto ~= 2.0

opentelemetry-instrumentation-boto3sqs

boto3 ~= 1.0

opentelemetry-instrumentation-botocore

botocore ~= 1.0

opentelemetry-instrumentation-cassandra

  • cassandra-driver ~= 3.25

  • scylla-driver ~= 3.25

opentelemetry-instrumentation-celery

celery - [4.0, 6.0)

opentelemetry-instrumentation-confluent-kafka

confluent-kafka - [1.8.2, 2.2.0]

opentelemetry-instrumentation-dbapi

dbapi

opentelemetry-instrumentation-django

django ≥ 1.10

opentelemetry-instrumentation-elasticsearch

elasticsearch ≥ 2.0

opentelemetry-instrumentation-falcon

falcon - [1.4.1, 4.0.0)

opentelemetry-instrumentation-fastapi

fastapi ~= 0.58

opentelemetry-instrumentation-flask

flask - [1.0, 3.0)

opentelemetry-instrumentation-grpc

grpcio ~= 1.27

opentelemetry-instrumentation-httpx

httpx ≥ 0.18.0

opentelemetry-instrumentation-jinja2

jinja2 - [2.7, 4.0)

opentelemetry-instrumentation-kafka-python

kafka-python ≥ 2.0

opentelemetry-instrumentation-logging

logging

opentelemetry-instrumentation-mysql

mysql-connector-python ~= 8.0

opentelemetry-instrumentation-mysqlclient

mysqlclient < 3

opentelemetry-instrumentation-pika

pika ≥ 0.12.0

opentelemetry-instrumentation-psycopg2

psycopg2 ≥ 2.7.3.1

opentelemetry-instrumentation-pymemcache

pymemcache - [1.3.5, 5)

opentelemetry-instrumentation-pymongo

pymongo - [3.1, 5.0)

opentelemetry-instrumentation-pymysql

PyMySQL < 2

opentelemetry-instrumentation-pyramid

pyramid ≥ 1.7

opentelemetry-instrumentation-redis

redis ≥ 2.6

opentelemetry-instrumentation-remoulade

remoulade ≥ 0.50

opentelemetry-instrumentation-requests

requests ~= 2.0

opentelemetry-instrumentation-sqlalchemy

sqlalchemy

opentelemetry-instrumentation-sqlite3

sqlite3

opentelemetry-instrumentation-starlette

starlette ~= 0.13.0

opentelemetry-instrumentation-system-metrics

psutil ≥ 5

opentelemetry-instrumentation-tornado

tornado ≥ 5.1.1

opentelemetry-instrumentation-tortoiseorm

tortoise-orm ≥ 0.17.0

opentelemetry-instrumentation-urllib

urllib

opentelemetry-instrumentation-urllib3

urllib3 - [1.0.0, 3.0.0)

opentelemetry-instrumentation-wsgi

wsgi

Kode contoh

Unduh kode contoh dari python-opentelemetry-demo.

Metode 1: Gunakan agen untuk mengonfigurasi instrumentasi otomatis untuk aplikasi

  1. Unduh dan instal paket yang diperlukan.

    pip install django
    pip install requests
    pip install opentelemetry-distro \
    	opentelemetry-exporter-otlp
     
    opentelemetry-bootstrap -a install
  2. Buat proyek AutoAndManualDemo dan buat aplikasi HelloWorld.

    1. Buat proyek AutoAndManualDemo.

      django-admin startproject AutoAndManualDemo
    2. Buat aplikasi HelloWorld di proyek.

      cd AutoAndManualDemo
      
      # Buat aplikasi HelloWorld di proyek.
      python manage.py startapp helloworld
  3. Modifikasi kode aplikasi HelloWorld.

    1. 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")
    2. 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')
      ]
    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')),
      ]
  4. 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 --noreload
    Catatan
    • Parameter --noreload digunakan untuk mencegah metode manage.main berjalan dua kali.

    • Kesalahan CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False mungkin 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 lingkungan export DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settings.

  5. 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_exporter ke --traces_exporter otlp_proto_http.

Metode 2: Instrumentasi manual aplikasi

  1. Unduh dan instal paket yang diperlukan.

    pip install opentelemetry-api
    pip install opentelemetry-sdk
    pip install opentelemetry-exporter-otlp
  2. Tentukan 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)
                            
  3. 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")
  4. 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)
  5. 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))
        

    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, Resource, HOST_NAME
    from opentelemetry.sdk.trace import TracerProvider
    from opentelemetry.sdk.trace.export import BatchSpanProcessor
    
    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")  # 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")
    
        print(baggage.get_baggage("key", global_ctx))
        print(baggage.get_baggage("key", parent_ctx))
        print(baggage.get_baggage("key", child_ctx))
    
    
    
    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)
    
    
    if __name__ == '__main__':
        init_opentelemetry()
        outer_method()
        baggage_and_attribute_usage()
  6. 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:

  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-otlp 
  2. Buat proyek AutoAndManualDemo dan buat aplikasi HelloWorld.

    1. Buat proyek AutoAndManualDemo.

      django-admin startproject AutoAndManualDemo
    2. Buat aplikasi HelloWorld di proyek.

      cd AutoAndManualDemo
      
      # Buat aplikasi HelloWorld di proyek.
      python manage.py startapp helloworld
  3. 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")
  4. Modifikasi file urls.py.

    1. 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')
      ]
    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')),
      ]
  5. 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.

  6. Jalankan proyek.

    python manage.py runserver --noreload
    • Parameter --noreload digunakan 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
  7. Kunjungi 127.0.0.1:8000/helloworld di browser. Data jejak dilaporkan ke konsol Managed Service for OpenTelemetry.

Lihat data pemantauan

Masuk ke Konsol ARMS. Di panel navigasi di sebelah kiri, pilih Application Monitoring > Applications. Di halaman Applications, klik nama aplikasi. Di halaman yang muncul, lihat data jejak.

Catatan

Jika ikon image ditampilkan di kolom Language, aplikasi terhubung ke Pemantauan Aplikasi. Jika tanda hubung (-) ditampilkan, aplikasi terhubung ke Managed Service for OpenTelemetry.