12 releases
0.3.4 | Oct 7, 2024 |
---|---|
0.3.2-rc.0 | Mar 2, 2024 |
0.3.2-dev.1 | Jun 4, 2024 |
0.3.1 | Dec 18, 2023 |
0.3.0-rc.2 | Nov 30, 2023 |
#158 in FFI
137 downloads per month
14KB
136 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
~5–11MB
~126K SLoC