Skip to content

Commit ded54a8

Browse files
committed
feat: use QCS core-deps; update OTEL version
1 parent 11d08c4 commit ded54a8

26 files changed

Lines changed: 475 additions & 187 deletions

File tree

Cargo.lock

Lines changed: 339 additions & 106 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,34 @@ members = ["crates/*", "examples/*"]
44
resolver = "2"
55

66
[workspace.dependencies]
7-
# All OTEL packages must have the same version number.
7+
qcs-dependencies-client = { version = "0.3.1" }
8+
# opentelemetry, opentelemetry_sdk, tracing-opentelemetry: use qcs-dependencies-client
89
# When updating the OTEL version, be sure to update these optional dependencies in `tracing-subscriber` as well:
910
# * opentelemetry-otlp
1011
# * opentelemetry-proto
11-
opentelemetry = "0.30.0"
12-
opentelemetry_sdk = "0.30.0"
1312
pyo3 = { version = "0.27.2", features = ["macros"] }
1413
pyo3-async-runtimes = { version = "0.27", features = ["tokio-runtime"] }
1514
pyo3-build-config = "0.27.2"
16-
rigetti-pyo3 = "0.5.0"
15+
rigetti-pyo3 = { version = "0.5.5" }
1716
rstest = "0.17.0"
1817
serde = { version = "1.0.145", features = ["derive"] }
1918
thiserror = "2.0.17"
2019
tokio = { version = "1.36.0", features = [] }
2120
tracing = { version = "0.1.41", features = ["log"] }
2221
# Despite how close the version numbers are, this package's release numbers *do
2322
# not* match the OTEL SDK version that it requires.
24-
tracing-opentelemetry = "0.31.0"
2523
tracing-subscriber = "0.3.19"
24+
futures-core = "0.3.30"
25+
futures-util = "0.3.31"
26+
handlebars = "6.4.0"
27+
once_cell = "1.17.1"
28+
opentelemetry-otlp = "0.31.0"
29+
opentelemetry-proto = "0.31.0"
30+
proc-macro2 = "1.0.58"
31+
pyo3-opentelemetry = { path = "crates/opentelemetry" }
32+
pyo3-opentelemetry-macros = { version = "0.6.0", path = "crates/opentelemetry-macros" }
33+
pyo3-tracing-subscriber = { path = "crates/tracing-subscriber", default-features = false }
34+
quote = "1.0.26"
35+
serde_json = "1.0.128"
36+
syn = "2.0.14"
37+
# tonic: use qcs-dependencies-client (grpc feature)

crates/opentelemetry-macros/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ rust-version = "1.83.0"
1616
proc-macro = true
1717

1818
[dependencies]
19-
proc-macro2 = "1.0.58"
20-
quote = "1.0.26"
21-
syn = { version = "2.0.14", features = ["full", "derive"] }
19+
proc-macro2 = { workspace = true }
20+
quote = { workspace = true }
21+
syn = { workspace = true, features = ["full", "derive"] }
2222

2323
[dev-dependencies]
2424
rstest = { workspace = true }

crates/opentelemetry-macros/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ fn wrap_block_in_current_context(
211211
let error_handler: proc_macro2::TokenStream = match config.on_context_extraction_failure {
212212
RuntimeErrorHandler::Trace => syn::parse_quote! {
213213
if let Err(e) = #context_guard_name {
214-
use opentelemetry::trace::TraceContextExt;
215-
let ctx = opentelemetry::Context::current();
214+
use ::pyo3_opentelemetry::__opentelemetry::trace::TraceContextExt;
215+
let ctx = ::pyo3_opentelemetry::__opentelemetry::Context::current();
216216
ctx.span().record_error(&e);
217217
}
218218
},

crates/opentelemetry/Cargo.toml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,16 @@ repository = "https://github.com/rigetti/pyo3-opentelemetry"
1111
rust-version = "1.83.0"
1212

1313
[dependencies]
14-
opentelemetry = { workspace = true }
15-
opentelemetry_sdk = { workspace = true }
14+
qcs-dependencies-client = { workspace = true }
1615
pyo3 = { workspace = true }
17-
pyo3-opentelemetry-macros = { path = "../opentelemetry-macros", version = "0.6.0" }
16+
pyo3-opentelemetry-macros = { workspace = true }
1817

1918
[dev-dependencies]
20-
futures-util = "0.3.31"
21-
once_cell = "1.17.1"
22-
opentelemetry = { workspace = true, features = ["trace"] }
19+
futures-util = { workspace = true }
20+
once_cell = { workspace = true }
21+
qcs-dependencies-client = { workspace = true }
2322
tokio = { workspace = true, features = ["sync", "parking_lot", "macros"] }
2423
tracing = { workspace = true }
25-
tracing-opentelemetry = { workspace = true }
2624
tracing-subscriber = { workspace = true }
2725

2826
[features]

crates/opentelemetry/src/lib.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,13 @@ use std::collections::HashMap;
9797

9898
use pyo3::{prelude::*, types::IntoPyDict};
9999

100-
use opentelemetry::{propagation::Extractor, Context};
100+
use qcs_dependencies_client::opentelemetry::{propagation::Extractor, Context};
101101

102102
pub use pyo3_opentelemetry_macros::pypropagate;
103103

104+
#[doc(hidden)]
105+
pub use qcs_dependencies_client::opentelemetry as __opentelemetry;
106+
104107
/// A context carrier for propagating `OpenTelemetry` context from Python to Rust.
105108
#[derive(Default, Clone, Debug, FromPyObject)]
106109
struct Carrier {
@@ -142,10 +145,11 @@ impl Carrier {
142145
/// When a `Propagator` is passed to a function or method, this method should be called
143146
/// at the beginning of the function or method to attach the context. This should not be used with
144147
/// async functions.
145-
fn attach(&self) -> opentelemetry::ContextGuard {
146-
use opentelemetry::propagation::TextMapPropagator;
148+
fn attach(&self) -> qcs_dependencies_client::opentelemetry::ContextGuard {
149+
use qcs_dependencies_client::opentelemetry::propagation::TextMapPropagator;
147150

148-
let propagator = opentelemetry_sdk::propagation::TraceContextPropagator::new();
151+
let propagator =
152+
qcs_dependencies_client::opentelemetry_sdk::propagation::TraceContextPropagator::new();
149153
Context::attach(propagator.extract(self))
150154
}
151155
}
@@ -177,7 +181,9 @@ impl Carrier {
177181
/// Any Python error that occurs while trying to get the current context from Python will
178182
/// be returned; this includes import errors when importing `opentelemetry.context` and
179183
/// `opentelemetry.propagate`.
180-
pub fn attach_otel_context_from_python(py: Python<'_>) -> PyResult<opentelemetry::ContextGuard> {
184+
pub fn attach_otel_context_from_python(
185+
py: Python<'_>,
186+
) -> PyResult<qcs_dependencies_client::opentelemetry::ContextGuard> {
181187
let get_current_context = py.import("opentelemetry.context")?.getattr("get_current")?;
182188
let inject = py.import("opentelemetry.propagate")?.getattr("inject")?;
183189

crates/tracing-subscriber/Cargo.toml

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,27 @@ repository = "https://github.com/rigetti/pyo3-opentelemetry"
1111
rust-version = "1.83.0"
1212

1313
[dependencies]
14-
handlebars = { version = "6.4.0", optional = true }
14+
handlebars = { workspace = true, optional = true }
1515
pyo3 = { workspace = true, optional = true }
16-
opentelemetry = { workspace = true }
16+
qcs-dependencies-client = { workspace = true }
1717
# These packages *MUST* be kept in sync with the OTEL package versions; but
1818
# since they are optional, they cannot be workspace dependencies.
19-
opentelemetry-otlp = { version = "0.30.0", features = ["grpc-tonic", "trace", "tls-roots"], optional = true }
20-
opentelemetry-proto = { version = "0.30.0", optional = true, features = ["tonic"] }
21-
opentelemetry_sdk = { workspace = true, features = ["rt-tokio", "rt-tokio-current-thread"] }
19+
# opentelemetry-otlp: grpc-tonic and tls-roots features provided by qcs-dependencies-client
20+
opentelemetry-otlp = { workspace = true, features = ["trace"], optional = true }
21+
opentelemetry-proto = { workspace = true, features = ["tonic"], optional = true }
22+
opentelemetry_sdk = { version = "0.31.0", features = ["rt-tokio", "rt-tokio-current-thread"] }
2223
pyo3-async-runtimes = { workspace = true, features = ["tokio-runtime"], optional = true }
2324
rigetti-pyo3 = { workspace = true, features = [ "async-tokio", "opentelemetry" ] }
2425
serde = { workspace = true }
2526
thiserror = { workspace = true }
2627
tokio = { workspace = true, features = ["rt-multi-thread"] }
27-
tonic = { version = "0.13.1", features = ["tls-aws-lc", "tls-native-roots"], optional = true }
2828
tracing = { workspace = true }
29-
tracing-opentelemetry = { workspace = true }
3029
tracing-subscriber = { workspace = true, features = ["env-filter", "fmt", "json"] }
31-
futures-core = "0.3.30"
32-
serde_json = "1.0.128"
30+
futures-core = { workspace = true }
31+
serde_json = { workspace = true }
3332

3433
[features]
35-
layer-otel-otlp = ["layer-otel-otlp-file", "dep:tonic"]
34+
layer-otel-otlp = ["layer-otel-otlp-file", "qcs-dependencies-client/grpc"]
3635
layer-otel-otlp-file = ["dep:opentelemetry-otlp", "dep:opentelemetry-proto"]
3736
stubs = ["dep:handlebars"]
3837
pyo3 = ["dep:pyo3", "dep:pyo3-async-runtimes"]

crates/tracing-subscriber/src/common.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::borrow::Cow;
22
use std::collections::HashMap;
33

4-
use opentelemetry::InstrumentationScope;
54
use pyo3::prelude::*;
5+
use qcs_dependencies_client::opentelemetry::InstrumentationScope;
66
use rigetti_pyo3::create_init_submodule;
77

88
#[pyclass(name = "InstrumentationLibrary")]
@@ -45,9 +45,9 @@ impl From<PyInstrumentationLibrary> for InstrumentationScope {
4545
}
4646
let mut attributes = Vec::new();
4747
for (key, value) in py_instrumentation_library.attributes {
48-
let kv = opentelemetry::KeyValue::new(
49-
opentelemetry::Key::new(key),
50-
opentelemetry::Value::from(value),
48+
let kv = qcs_dependencies_client::opentelemetry::KeyValue::new(
49+
qcs_dependencies_client::opentelemetry::Key::new(key),
50+
qcs_dependencies_client::opentelemetry::Value::from(value),
5151
);
5252
attributes.push(kv);
5353
}

crates/tracing-subscriber/src/layers/otel_otlp.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@
1414

1515
use std::{collections::HashMap, time::Duration};
1616

17-
use opentelemetry::{trace::TracerProvider, InstrumentationScope};
1817
use opentelemetry_otlp::{WithExportConfig, WithTonicConfig};
1918
use opentelemetry_sdk::{
2019
trace::{Sampler, SpanLimits},
2120
Resource,
2221
};
2322
use pyo3::prelude::*;
23+
use qcs_dependencies_client::opentelemetry::{trace::TracerProvider, InstrumentationScope};
2424
use tracing_subscriber::Layer;
2525

2626
use crate::create_init_submodule;
27-
use tonic::metadata::{
27+
use qcs_dependencies_client::tonic::metadata::{
2828
errors::{InvalidMetadataKey, InvalidMetadataValue},
2929
MetadataKey,
3030
};
@@ -41,13 +41,13 @@ pub(crate) struct Config {
4141
/// OpenTelemetry resource attributes describing the entity that produced the telemetry.
4242
resource: Resource,
4343
/// The metadata map to use for requests to the remote collector.
44-
metadata_map: Option<tonic::metadata::MetadataMap>,
44+
metadata_map: Option<qcs_dependencies_client::tonic::metadata::MetadataMap>,
4545
/// The sampler to use for the [`opentelemetry_sdk::trace::SdkTracerProvider`].
4646
sampler: Sampler,
4747
/// The endpoint to which the exporter will send trace data. If not set, this must be set by
4848
/// OTLP environment variables.
4949
endpoint: Option<String>,
50-
/// Timeout applied the [`tonic::transport::Channel`] used to send trace data to the remote collector.
50+
/// Timeout applied the [`qcs_dependencies_client::tonic::transport::Channel`] used to send trace data to the remote collector.
5151
timeout: Option<Duration>,
5252
/// A timeout applied to the shutdown of the [`crate::contextmanager::Tracing`] context
5353
/// manager upon exiting, before the underlying [`opentelemetry_sdk::trace::SdkTracerProvider`]
@@ -110,7 +110,7 @@ impl Config {
110110
|instrumentation_library| provider.tracer_with_scope(instrumentation_library.clone()),
111111
);
112112

113-
let layer = tracing_opentelemetry::layer()
113+
let layer = qcs_dependencies_client::tracing_opentelemetry::layer()
114114
.with_tracer(tracer)
115115
.with_filter(env_filter);
116116
Ok(WithShutdown {
@@ -303,7 +303,7 @@ impl From<PyResource> for Resource {
303303
let kvs = resource
304304
.attrs
305305
.into_iter()
306-
.map(|(k, v)| opentelemetry::KeyValue::new(k, v));
306+
.map(|(k, v)| qcs_dependencies_client::opentelemetry::KeyValue::new(k, v));
307307

308308
if let Some(schema_url) = resource.schema_url {
309309
Self::builder().with_schema_url(kvs, schema_url)
@@ -340,7 +340,7 @@ pub(crate) enum PyResourceValueArray {
340340
String(Vec<String>),
341341
}
342342

343-
impl From<PyResourceValueArray> for opentelemetry::Array {
343+
impl From<PyResourceValueArray> for qcs_dependencies_client::opentelemetry::Array {
344344
fn from(py_resource_value_array: PyResourceValueArray) -> Self {
345345
match py_resource_value_array {
346346
PyResourceValueArray::Bool(b) => Self::Bool(b),
@@ -353,7 +353,7 @@ impl From<PyResourceValueArray> for opentelemetry::Array {
353353
}
354354
}
355355

356-
impl From<PyResourceValue> for opentelemetry::Value {
356+
impl From<PyResourceValue> for qcs_dependencies_client::opentelemetry::Value {
357357
fn from(py_resource_value: PyResourceValue) -> Self {
358358
match py_resource_value {
359359
PyResourceValue::Bool(b) => Self::Bool(b),
@@ -393,7 +393,8 @@ impl From<PySampler> for Sampler {
393393
const OTEL_EXPORTER_OTLP_HEADERS: &str = "OTEL_EXPORTER_OTLP_HEADERS";
394394
const OTEL_EXPORTER_OTLP_TRACES_HEADERS: &str = "OTEL_EXPORTER_OTLP_TRACES_HEADERS";
395395

396-
fn get_metadata_from_environment() -> Result<tonic::metadata::MetadataMap, ConfigError> {
396+
fn get_metadata_from_environment(
397+
) -> Result<qcs_dependencies_client::tonic::metadata::MetadataMap, ConfigError> {
397398
[
398399
OTEL_EXPORTER_OTLP_HEADERS,
399400
OTEL_EXPORTER_OTLP_TRACES_HEADERS,
@@ -411,7 +412,7 @@ fn get_metadata_from_environment() -> Result<tonic::metadata::MetadataMap, Confi
411412
.collect::<Vec<(String, String)>>()
412413
})
413414
.try_fold(
414-
tonic::metadata::MetadataMap::new(),
415+
qcs_dependencies_client::tonic::metadata::MetadataMap::new(),
415416
|mut metadata, (k, v)| {
416417
let key = k.parse::<MetadataKey<_>>().map_err(ConfigError::from)?;
417418
metadata.insert(key, v.parse().map_err(ConfigError::from)?);
@@ -428,7 +429,7 @@ impl TryFrom<PyConfig> for Config {
428429
let metadata_map = match config.metadata_map {
429430
Some(m) => Some(m.into_iter().try_fold(
430431
env_metadata_map,
431-
|mut metadata_map: tonic::metadata::MetadataMap,
432+
|mut metadata_map: qcs_dependencies_client::tonic::metadata::MetadataMap,
432433
(k, v)|
433434
-> Result<_, Self::Error> {
434435
let key = k.parse::<MetadataKey<_>>().map_err(ConfigError::from)?;

crates/tracing-subscriber/src/layers/otel_otlp_file.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ impl crate::layers::Config for Config {
151151
}
152152

153153
fn build(&self, batch: bool) -> LayerBuildResult<WithShutdown> {
154-
use opentelemetry::trace::TracerProvider as _;
154+
use qcs_dependencies_client::opentelemetry::trace::TracerProvider as _;
155155
let file = self
156156
.file_path
157157
.as_ref()
@@ -176,7 +176,7 @@ impl crate::layers::Config for Config {
176176
},
177177
);
178178
let env_filter = build_env_filter(self.filter.clone())?;
179-
let layer = tracing_opentelemetry::layer()
179+
let layer = qcs_dependencies_client::tracing_opentelemetry::layer()
180180
.with_tracer(tracer)
181181
.with_filter(env_filter);
182182
Ok(WithShutdown {

0 commit comments

Comments
 (0)