Python 语言快速开始
快速开始
本文将描述您如何在 Python 中开始使用 OpenTelemetry即OTel。您将学习如何对一个简单的Python应用程序进行观测,并向控制台上报trace、log、metrics数据
前置条件
请确保您已经安装
Demo示例
下文将展示以一个简单的 Flask 应用程序接入OTel Python 探针的过程。当然,OTel Python 探针也支持Django、FastAPI等框架。有关支持框架的库的完整列表,详见:OTel Python探针插件支持列表
环境准备
首先,我们创建一个新的目录,并设置新的python环境
使用pip安装Flask:
创建并启动一个HTTP服务器
新建一个名为app.py
的文件, 具体代码如下:
使用以下命令运行应用程序,并在您的网页浏览器中打开 http://localhost:8080/rolldice以确保它正常工作。
接入OTel Python探针
使用无侵入方式接入OTel Python探针,您不需要更改任何代码既可拥有完整的可观测数据,详见: 无侵入注入原理.
首先需要安装opentelemetry-distro
、opentelemetry-bootstrap
、opentelemetry-instrument
三个package,具体的
Step 1. 安装opentelemetry-distro
Step 2. 使用 opentelemetry-bootstrap
命令安装观测应用所需的埋点插件
在本示例中这将会安装观测Flask的插件。
Run 使用OTel Python探针来启动应用
在您的网页浏览器中打开 http://localhost:8080/rolldice,并多次刷新页面。过一段时间后,您应该会在控制台中看到打印出的spans,如下所示:
生成的 span 是对 /rolldice 路由的请求生命周期。在请求期间发出的调用链中包含相同的Trace ID 和 span ID,并通过Span Exporter导出到控制台。
发送几条请求到该端点,然后稍等片刻或终止应用程序,你将会在控制台输出中看到一些指标,例如以下内容:
手动埋点与自动埋点联动
自动埋点主要用于采集一些常用组件的观测数据,如HTTP请求的信息,但是没法自动观测应用业务的数据。如果需要采集业务的观测数据,需要手动埋点,以上是进行手动埋点和自动埋点联动的例子:
手动埋点采集日志
首先更改上文中的app.py代码,获取当前trace实例,tracer,并使用tracer来新建一条新的trace。
重新使用OTel Python探针启动应用:
这时在向Flask Web服务器发送请求时,您将看到两个Span,如下所示:
roll Span的的parent_id与/rolldice的span_id相同,这表明了其父子关系。
手动采集指标
修改 app.py
文件,在代码中初始化一个meter,并使用meter创建一个Counter类型的指标,用于统计每个可能请求数量。
重新启动应用:
当你向服务器发送请求时,你将在控制台看到请求roll的计数指标被输出,并且每次请求roll都有单独的计数:
将观测数据发往 OTel Collector
OTel Collector 是大多数生产部署中一个关键的组件。以下是一些使用OTel Collector的优势:
● 一个由多个服务共享的单一可观测数据收集器,以减少切换Exporter的开销
- 在发往服务端之前可以集中处理trace,避免重复处理操作
● 可以聚合多个服务、多个主机上的Trace
除非您只有一个服务或正在进行测试,否则在生产部署中,推荐您使用收集器
配置并启动一个本地的OTel Collector
首先,将以下OTel Collector配置代码保存到 /tmp/ 目录中的文件中:
以上配置将使用otlp 协议来接收用户的输入,即OTel Python探针与OTel Collector之间使用otlp 协议进行通信。并将数据最终打印在OTel Collector控制台。您也可以将数据上报至于Prometheus 或者Jaeger中,详细的配置信息见:OTel Collector配置
然后运行 Docker 命令,根据此配置获取并运行OTel Collector:
您现在将在本地运行一个OTel Collector实例,该实例监听4317端口。
修改OTel Python 探针的启动命令,使用OTLP上报Trace和Metrics
下一步是修改命令,使其通过 OTLP 将Trace和Metrics发送到OTel Collector中,而不是打印到控制台。
首先安装OTLP exporter :
opentelemetry-instrument 将会检测到您刚刚安装的包,并在下次运行时默认为 OTLP 导出。
启动应用
像之前一样运行应用程序,但不要打印到控制台:
默认情况下,opentelemetry-instrument 通过 OTLP/gRPC 导出追踪和指标,并将它们发送到 localhost:4317,即发送到上文启动的OTel Collector中,
此时再访问 /rolldice 地址时,你会在OTel Collector 进程中看到输出,而不是在 Flask 进程中:
如果OTel Collector配置为上报至jaeger,将会出现如下记录: