通過OpenTelemetry為應用埋點並上報鏈路資料至Managed Service for OpenTelemetry後,Managed Service for OpenTelemetry即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控資料。本文介紹如何使用OpenTelemetry Python Agent/SDK進行自動或手動埋點並上報資料。
前提條件
背景資訊
OpenTelemetry提供了若干自動埋點外掛程式,支援為常見架構自動建立Span,支援的架構列表如下,完整資訊請參見OpenTelemetry官方文檔。
版本~= V.N
表示≥ V.N
且== V.*
,例如,aiohttp ~= 3.0
表示aiohttp版本要求aiohttp ≥ 3.0
且aiohttp == 3.*
。
樣本Demo
範例程式碼倉庫地址:python-opentelemetry-demo
方法一:通過Agent自動埋點並上報
下載所需包。
pip install django pip install requests pip install opentelemetry-distro \ opentelemetry-exporter-otlp opentelemetry-bootstrap -a install
建立AutoAndManualDemo專案並建立HelloWorld應用。
建立AutoAndManualDemo專案。
django-admin startproject AutoAndManualDemo
在專案中建立HelloWorld應用。
cd AutoAndManualDemo # 在專案中建立helloworld app python manage.py startapp helloworld
修改HelloWorld應用代碼。
在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")
建立AutoAndManualDemo/helloworld/urls.py檔案,並在urls.py檔案中添加以下代碼。
from django.urls import path from . import views urlpatterns = [ path('', views.hello_world_view, name='helloworld') ]
修改AutoAndManualDemo/AutoAndManualDemo/urls.py檔案,添加helloworld的URL。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('helloworld/', include('helloworld.urls')), ]
運行專案。
通過HTTP上報,請將
<your-service-name>
替換為您的應用程式名稱,將<http-endpoint>
替換為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
說明--noreload
:避免manage.main方法執行兩次。如果運行報錯
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
,但AutoAndManualDemo/AutoAndManualDemo/settings.py中的DEBUG和ALLOWED_HOSTS均已配置正確,這是因為使用opentelemetry-instrument啟動時使用了Django架構的預設設定檔(django/conf/global_settings.py), 因此需要添加export DJANGO_SETTINGS_MODULE=AutoAndManualDemo.settings
環境變數。
在瀏覽器中訪問
http://127.0.0.1:8000/helloworld/
,控制台會列印Trace,同時也會將Trace上報至阿里雲Managed Service for OpenTelemetry。如需關閉控制台列印Trace,只需將
--traces_exporter
參數配置為--traces_exporter otlp_proto_http
。
方法二:手動埋點並上報
下載所需包。
pip install opentelemetry-api pip install opentelemetry-sdk pip install opentelemetry-exporter-otlp
在manual.py檔案中設定OpenTelemetry初始化代碼。
請將代碼中的
<token>
的<endpoint>
替換成前提條件中擷取的存取點資訊。請根據實際情況替換代碼中的
<service-name>
(服務名)和<host-name>
(主機名稱)。
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(): # 設定服務名、主機名稱 resource = Resource(attributes={ SERVICE_NAME: "<service-name>", HOST_NAME: "<host-name>" }) # 使用GRPC協議上報 span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter( endpoint="<endpoint>", headers=("Authentication=<token>") )) # 使用HTTP協議上報 # span_processor = BatchSpanProcessor(OTLPSpanHttpExporter( # endpoint="<endpoint>", # )) trace_provider = TracerProvider(resource=resource, active_span_processor=span_processor) trace.set_tracer_provider(trace_provider)
建立Span。
tracer = trace.get_tracer(__name__) # 擷取tracer with tracer.start_as_current_span("child_span") as child_span: # 建立名為child_span的span print("hello world")
擷取TraceID和SpanID。
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)
使用OpenTelemetry Baggage API透傳業務自訂標籤。
建立baggage_parent_span時通過指定attributes參數來設定屬性。
def baggage_and_attribute_usage(): tracer = trace.get_tracer(__name__) global_ctx = baggage.set_baggage("key", "value_from_global_ctx") # 使用baggage api,在不同span之間傳遞資料 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") # 擷取不同contex下key對應的值 print(baggage.get_baggage("key", global_ctx)) print(baggage.get_baggage("key", parent_ctx)) print(baggage.get_baggage("key", child_ctx))
運行程式。
python manual.py
方法三:在自動埋點基礎上手動埋點
如果您需要在使用OpenTelemetry獲得自動埋點能力的同時,添加自訂業務埋點,請在方法一的基礎上完成以下操作。
下載包。
pip install django pip install requests pip install opentelemetry-sdk pip install opentelemetry-instrumentation-django pip install opentelemetry-exporter-otlp
建立AutoAndManualDemo專案並建立HelloWorld應用。
建立AutoAndManualDemo專案。
django-admin startproject AutoAndManualDemo
在專案中建立HelloWorld應用。
cd AutoAndManualDemo # 在專案中建立helloworld app python manage.py startapp helloworld
修改helloworld/views.py檔案代碼。
擷取tracer並手動建立span,同時設定span名稱。
from django.http import HttpResponse from opentelemetry import trace from datetime import datetime # Create your views here. 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__) # 建立新的span with tracer.start_as_current_span("time_span") as time_span: return now.strftime("%H:%M:%S")
修改urls.py檔案。
建立helloworld/urls.py檔案,在urls.py中添加以下代碼。
from django.urls import path from . import views urlpatterns = [ path('', views.hello_world_view, name='helloworld') ]
修改AutoAndManualDemo/AutoAndManualDemo/urls.py檔案,添加helloworld的URL。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('helloworld/', include('helloworld.urls')), ]
修改manage.py檔案代碼,在應用初始化的代碼中添加以下內容。
from opentelemetry import trace from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter # 通過gRPC接入 # from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter # 通過HTTP接入 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>" # 通過gRPC接入時需要headers參數,通過HTTP接入時不需要此參數 ))) # 通過 OTLPSpanExporter 上報Trace trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter())) # 在控制台輸出Trace
請替換以下內容,並根據接入方式(gRPC或者HTTP)修改代碼:
<service-name>
: 需要上報的服務名<host-name>
:主機名稱<endpoint>
:通過HTTP/gRPC上報資料的存取點<token>
:通過gRPC上報資料的鑒權Token
運行專案。
python manage.py runserver --noreload
--noreload
防止manage.main方法執行兩次。如果運行時出現
ImportError(symbol not found in flat namespace '_CFRelease')
,請下載並安裝grpcio包。pip install grpcio
在瀏覽器中訪問
127.0.0.1:8000/helloworld
,鏈路資料便會上報至Managed Service for OpenTelemetry控制台。
查看監控資料
登入ARMS控制台後,在 頁面選擇目標應用,查看鏈路資料。
語言列顯示表徵圖的應用為接入應用監控的應用,顯示-表徵圖的應用為接入可觀測鏈路 OpenTelemetry 版的應用。