日志自动仪器示例

本页面演示了如何在 OpenTelemetry 中使用 Python 日志自动仪器。

与跟踪和指标不同,没有等效的日志 API。只有一个 SDK。对于 Python,您可以使用 Python的 logger 库,然后 OTel SDK 会将一个 OTLP 处理程序附加到根记录器,将 Python 记录器转换为 OTLP 记录器。实现这一点的一种方法记录在 OpenTelemetry Python 存储库的日志示例中。

另一种实现方式是通过 Python 对日志进行自动仪器支持。下面的示例基于 OpenTelemetry Python 存储库中的日志示例。

有一个日志桥接 API;然而,它与跟踪和指标 API 不同,因为它不被应用程序开发人员用于创建日志。相反,他们会使用此桥接 API 来设置标准语言特定日志库中的日志附加器。有关更多信息,请参阅 日志 API

首先创建示例目录和示例 Python 文件

mkdir python-logs-example
cd python-logs-example
touch example.py

将以下内容粘贴到 example.py

import logging

from opentelemetry import trace

tracer = trace.get_tracer_provider().get_tracer(__name__)

# Trace context correlation
with tracer.start_as_current_span("foo"):
    # Do something
    current_span = trace.get_current_span()
    current_span.add_event("This is a span event")
    logging.getLogger().error("This is a log message")

打开并复制 otel-collector-config.yaml 示例,并将其保存到 python-logs-example/otel-collector-config.yaml

准备

执行以下示例,我们建议使用虚拟环境来执行此操作。运行以下命令准备日志自动仪器

mkdir python_logs_example
virtualenv python_logs_example
source python_logs_example/bin/activate

安装

以下命令安装了相应的包。opentelemetry-distro 包依赖于其他一些包,例如用于自定义仪器代码的 opentelemetry-sdkopentelemetry-instrumentation,后者提供了帮助自动仪器程序的几个命令。

pip install opentelemetry-distro
pip install opentelemetry-exporter-otlp

接下来的示例将仪器结果发送到控制台。了解更多关于安装和配置 OpenTelemetry Distro 以将遥测数据发送到其他目的地(如 OpenTelemetry Collector)。

注意:要通过 opentelemetry-instrument 使用自动仪器,您必须通过环境变量或命令行进行配置。该代理程序创建了一个遥测管道,除了通过这些方式外,无法对其进行修改。如果您需要为遥测管道进行更多自定义,那么您需要放弃代理程序,并将 OpenTelemetry SDK 和仪器库导入到您的代码中并在那里进行配置。您也可以通过导入 OpenTelemetry API 来扩展自动仪器。有关更多详细信息,请参阅 API 参考

执行

本节将指导您完成执行自动仪器日志的过程。

打开一个新的终端窗口并启动 OTel Collector

docker run -it --rm -p 4317:4317 -p 4318:4318 \
  -v $(pwd)/otel-collector-config.yaml:/etc/otelcol-config.yml \
  --name otelcol \
  otel/opentelemetry-collector:0.142.0 \
  "--config=/etc/otelcol-config.yml"

打开另一个终端并运行 Python 程序

source python_logs_example/bin/activate

export OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true
opentelemetry-instrument \
  --traces_exporter console,otlp \
  --metrics_exporter console,otlp \
  --logs_exporter console,otlp \
  --service_name python-logs-example \
  python $(pwd)/example.py

示例输出

...
ScopeSpans #0
ScopeSpans SchemaURL:
InstrumentationScope __main__
Span #0
    Trace ID       : 389d4ac130a390d3d99036f9cd1db75e
    Parent ID      :
    ID             : f318281c4654edc5
    Name           : foo
    Kind           : Internal
    Start time     : 2023-08-18 17:04:05.982564 +0000 UTC
    End time       : 2023-08-18 17:04:05.982667 +0000 UTC
    Status code    : Unset
    Status message :
Events:
SpanEvent #0
     -> Name: This is a span event
     -> Timestamp: 2023-08-18 17:04:05.982586 +0000 UTC

...

ScopeLogs #0
ScopeLogs SchemaURL:
InstrumentationScope opentelemetry.sdk._logs._internal
LogRecord #0
ObservedTimestamp: 1970-01-01 00:00:00 +0000 UTC
Timestamp: 2023-08-18 17:04:05.982605056 +0000 UTC
SeverityText: ERROR
SeverityNumber: Error(17)
Body: Str(This is a log message)
Attributes:
     -> otelSpanID: Str(f318281c4654edc5)
     -> otelTraceID: Str(389d4ac130a390d3d99036f9cd1db75e)
     -> otelTraceSampled: Bool(true)
     -> otelServiceName: Str(python-logs-example)
Trace ID: 389d4ac130a390d3d99036f9cd1db75e
Span ID: f318281c4654edc5
...

请注意,Span 事件和日志具有相同的 SpanID (f318281c4654edc5)。日志 SDK 将当前 Span 的 SpanID 追加到任何日志事件中,以提高遥测数据关联能力。