应用性能监控

接入Python应用

2024-07-16 03:05:57

通过OpenTelemetry上报Python应用数据

在监控Python应用之前,您需要通过客户端将应用数据上报至APM服务端。本小节介绍如何通过OpenTelemetry Python SDK上报Python应用数据。

前提条件

完成vpce接入。

python版本不低于3.8。

接入步骤

1.  下载所需包。

pip install opentelemetry-api
 pip install opentelemetry-sdk
 pip install opentelemetry-exporter-otlp
 pip install flask
 pip install requests

2.  查看接入点信息。

应用列表的接入指引会根据您所在资源池提供“通过 HTTP 上报数据”和“通过 gRPC 上报数据”的ENDPOINT(天翼云vpc网络接入点)、鉴权TOKEN信息。

3.  创建服务端。

 请将代码中的<token>和<endpoint>替换成前提条件中获取的接入点信息。

 请根据实际情况替换代码中的<service-name>(服务名)和<host-name>(主机名)。

# server.py
 from flask import Flask
 from opentelemetry import trace, baggage
 from opentelemetry.trace import SpanKind
 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
 
 app = Flask(__name__)
 
 def init_opentelemetry():
   resource = Resource(attributes={
     SERVICE_NAME: "<service_name>",
     HOST_NAME: "<host_name>"
   })
 
   span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
     endpoint="<endpoint>",
     headers=[("x-ctg-authorization", "<endpoint>")]
   ))
 
   trace_provider = TracerProvider(resource=resource, active_span_processor=span_processor)
   trace.set_tracer_provider(trace_provider)
 
 @app.route('/trace_demo')
 def trace_demo():
   tracer = trace.get_tracer(__name__)
   with tracer.start_as_current_span("server_span", kind=SpanKind.SERVER):
     return "Server traced this request."
 
 @app.route('/baggage_demo')
 def baggage_demo():
   tracer = trace.get_tracer(__name__)
   with tracer.start_as_current_span("server_span_baggage", kind=SpanKind.SERVER):
     baggage = baggage.set_baggage("key", "value_from_server")
     return f"Server traced this request with baggage: {baggage.get_baggage('key', baggage)}"
 
 if __name__ == '__main__':
   init_opentelemetry()
   app.run(port=5000, debug=True)

4.  创建客户端。

 请将代码中的<token>和<endpoint>替换成前提条件中获取的接入点信息。

 请根据实际情况替换代码中的<service-name>(服务名)和<host-name>(主机名)。

# client.py
 import requests
 from opentelemetry import trace
 from opentelemetry.sdk.resources import SERVICE_NAME, Resource, HOST_NAME
 from opentelemetry.sdk.trace import TracerProvider
 from opentelemetry.sdk.trace.export import BatchSpanProcessor
 from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter as OTLPSpanGrpcExporter
 
 def init_opentelemetry():
   resource = Resource(attributes={
     SERVICE_NAME: "<service_name>",
     HOST_NAME: "<host_name>"
   })
 
   span_processor = BatchSpanProcessor(OTLPSpanGrpcExporter(
     endpoint="<endpoint>",
     headers=[("x-ctg-authorization", "<token>")]
   ))
 
   trace_provider = TracerProvider(resource=resource, active_span_processor=span_processor)
   trace.set_tracer_provider(trace_provider)
 
 def make_request(path):
   tracer = trace.get_tracer(__name__)
   with tracer.start_as_current_span("client_span"):
     response = requests.get(f"http://localhost:5000{path}")
     print(f"Response from server: {response.text}")
 
 if __name__ == '__main__':
   init_opentelemetry()
   make_request('/trace_demo')
   make_request('/baggage_demo')

5.  运行项目。

python server.py
 python client.py

6.  通过以上步骤,最后就在APM控制台的应用列表页面选择目标应用,查看监控数据。


JLkIx8Fb9i8T