#tracing #pyo3 #open-telemetry #python-module #python-bindings #python

pyo3-tracing-subscriber

一个用于从 Python 配置和初始化跟踪订阅者的 Python 模块

10 个版本

0.2.0-rc.02023 年 11 月 14 日
0.1.2-rc.02024 年 3 月 2 日
0.1.2-dev.12024 年 6 月 4 日
0.1.2-dev.02024 年 5 月 31 日
0.1.0-rc.12023 年 11 月 30 日

#242 in 调试

Download history 147/week @ 2024-05-30 46/week @ 2024-06-06 26/week @ 2024-06-13 10/week @ 2024-06-20 36/week @ 2024-06-27 132/week @ 2024-07-04 246/week @ 2024-07-11 95/week @ 2024-07-18 126/week @ 2024-07-25 313/week @ 2024-08-01 39/week @ 2024-08-08 133/week @ 2024-08-15

631 每月下载量

Apache-2.0

110KB
1.5K SLoC

PyO3 跟踪订阅者

背景

这是什么

pyo3_tracing_subscriber 提供了一个 PyModule,可以添加到上游 pyo3 扩展模块中,以便从 Python 支持配置和初始化 Rust 跟踪订阅者。

这不是什么

  • 从您的上游包中导入的任何初始化过的跟踪订阅者 不会 从任何其他 pyo3 扩展模块收集跟踪。换句话说,任何 pyo3 扩展模块都需要分别导出跟踪配置和上下文管理器,而它们又必须分别初始化,以便从相应的 pyo3 扩展模块捕获 Rust 跟踪。
  • 目前,仅支持三个跟踪订阅者层
    • tracing_subscriber::fmt,它以人类可读的格式将跟踪写入文件(或 stdout)。
    • opentelemetry-stdout,它以 OTLP 格式将跟踪写入文件(或 stdout)。仅在 layer-otel-otlp-file 功能可用。
    • opentelemetry-otlp,它将跟踪发送到 OpenTelemetry OTLP 终端点。仅在 layer-otel-otlp 功能可用。
  • 这不会从 Python 将 OpenTelemetry 上下文传播到 Rust(或反之亦然)。使用 pyo3-opentelemetry 包来实现该功能。

用法

有关完整功能的示例,请参阅此包仓库中的 examples/pyo3-opentelemetry-lib/src/lib.rs 示例。

假设有一个名为 "my_module" 的 pyo3 扩展模块,它希望从 "my_module._tracing_subscriber" 中公开跟踪订阅者配置和上下文管理器类,从 Rust

use pyo3::prelude::*;

#[pymodule]
fn my_module(py: Python, m: &PyModule) -> PyResult<()> {
    // Add your own Python classes, functions and modules.

    let tracing_subscriber = PyModule::new(py, "_tracing_subscriber")?;
    pyo3_tracing_subscriber::add_submodule(
        "my_module._tracing_subscriber",
        py,
        tracing_subscriber,
    )?;
    m.add_submodule(tracing_subscriber)?;
    Ok(())
}

然后用户可以从 Python 初始化一个将日志记录到 stdout 的跟踪订阅者

import my_module
from my_module._tracing_subscriber import (
    GlobalTracingConfig,
    SimpleConfig,
    Tracing,
    subscriber,
)
from pyo3_opentelemetry_lib._tracing_subscriber.layers import file


def main():
    tracing_configuration = GlobalTracingConfig(
        export_process=SimpleConfig(
            subscriber=subscriber.Config(
                layer=file.Config()
            )
        )
    )
    with Tracing(config=config):
        result = my_module.example_function()
        my_module.other_example_function(result)

if __name__ == '__main__':
    main()

构建 Python 模拟文件

此包提供了一个方便的方法,使用 stubs 功能将模拟文件添加到您的 Python 源代码中。

给定一个名为 "my_module" 的 pyo3 扩展模块,该模块使用 pyo3-tracing-subscriber crate 来公开来自 "my_module._tracing_subscriber" 的跟踪订阅者配置和上下文管理器类,在上游 build.rs 文件中

use pyo3_tracing_subscriber_stubs::write_stub_files;

fn main() {
    let target_dir = std::path::Path::new("./my_module/_tracing_subscriber");
    std::fs::remove_dir_all(target_dir).unwrap();
    write_stub_files(
        "my_module",
        "_tracing_subscriber",
        target_dir,
        true, // layer_otel_otlp_file feature enabled
        true, // layer_otel_otlp feature enabled
    )
    .unwrap();
}

依赖项

约17-26MB
约365K SLoC