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

pyo3-opentelemetry

Macro and utilities for passing OpenTelemetry context from Python to Rust

9 releases

0.3.2-rc.0 Mar 2, 2024
0.3.1 Dec 18, 2023
0.3.0-rc.2 Nov 30, 2023
0.2.0 Nov 29, 2023
0.1.0 Sep 7, 2023

#426 in Procedural macros

21 downloads per month

Apache-2.0

14KB
138 lines

PyO3 OpenTelemetry

Background

What this is

pyo3_opentelemetry provides a macro to simply and easily instrument your PyO3 bindings so that OpenTelemetry contexts can be easily passed from a Python caller into a Rust library. The #[pypropagate] macro instruments your Rust functions for you so that the global Python OpenTelemetry context is shared across the FFI boundary.

What this is not

  • This (currently) does not support propagating an OpenTelemetry context from Rust into Python.
  • This does not "magically" instrument Rust code. Without the #[pypropagate] attribute, Rust code is unaffected and will not attach the Python OpenTelemetry context.
  • This does not facilitate the processing or collection of OpenTelemetry spans; you still need to initialize and flush tracing providers and subscribers separately in Python and Rust. For more information, please see the respective OpenTelemetry documentation for Python and Rust.

Usage

For a complete functioning example, see the examples/pyo3-opentelemetry-lib/src/lib.rs example within this crate's repository.

From Rust:

use pyo3_opentelemetry::prelude::*;
use pyo3::prelude::*;
use tracing::instrument;

#[pypropagate]
#[pyfunction]
#[instrument]
fn my_function() {
  println!("span \"my_function\" is active and will share the Python OpenTelemetry context");
}

#[pymodule]
fn my_module(_py: Python, m: &PyModule) -> PyResult<()> {
   m.add_function(wrap_pyfunction!(my_function, m)?)?;
   Ok(())
}

These features require no Python code changes, however, opentelemetry-api must be installed.

Dependencies

~6–14MB
~142K SLoC