#python #pyo3 #open-telemetry #tracing

macro pyo3-opentelemetry-macros

Macro for passing OpenTelemetry context from Python to Rust

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.0 Nov 30, 2023

#364 in Profiling

Download history 51/week @ 2024-08-26 5/week @ 2024-09-02 13/week @ 2024-09-09 67/week @ 2024-09-16 54/week @ 2024-09-23 257/week @ 2024-10-07 128/week @ 2024-10-14 6/week @ 2024-10-21 2/week @ 2024-11-11 52/week @ 2024-11-18 6/week @ 2024-11-25 16/week @ 2024-12-02 207/week @ 2024-12-09

281 downloads per month
Used in pyo3-opentelemetry

MIT/Apache

25KB
441 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

~225–670KB
~16K SLoC