Skip to content

Commit d962e11

Browse files
authored
Merge branch 'main' into cijothomas/029doc
2 parents a8445ed + 36c48db commit d962e11

File tree

11 files changed

+446
-51
lines changed

11 files changed

+446
-51
lines changed

opentelemetry-otlp/src/lib.rs

+55-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,61 @@
103103
//! After running your application configured with the OTLP exporter, view traces at:
104104
//! `http://localhost:16686`
105105
//!
106-
//! ## Using with Prometheus (TODO)
106+
//! ## Using with Prometheus
107+
//!
108+
//! Prometheus natively supports accepting metrics via the OTLP protocol
109+
//! (HTTP/protobuf). You can [run
110+
//! Prometheus](https://prometheus.io/docs/prometheus/latest/installation/) with
111+
//! the following command:
112+
//!
113+
//! ```shell
114+
//! docker run -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-otlp-receiver
115+
//! ```
116+
//!
117+
//! (An empty prometheus.yml file is sufficient for this example.)
118+
//!
119+
//! Modify your application to export metrics via OTLP:
120+
//!
121+
//! ```no_run
122+
//! # #[cfg(all(feature = "metrics", feature = "http-proto"))]
123+
//! # {
124+
//! use opentelemetry::global;
125+
//! use opentelemetry::metrics::Meter;
126+
//! use opentelemetry::KeyValue;
127+
//! use opentelemetry_otlp::Protocol;
128+
//! use opentelemetry_otlp::WithExportConfig;
129+
//!
130+
//! fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
131+
//! // Initialize OTLP exporter using HTTP binary protocol
132+
//! let exporter = opentelemetry_otlp::MetricExporter::builder()
133+
//! .with_http()
134+
//! .with_protocol(Protocol::HttpBinary)
135+
//! .with_endpoint("http://localhost:9090/api/v1/otlp/v1/metrics")
136+
//! .build()?;
137+
//!
138+
//! // Create a meter provider with the OTLP Metric exporter
139+
//! let meter_provider = opentelemetry_sdk::metrics::SdkMeterProvider::builder()
140+
//! .with_periodic_exporter(exporter)
141+
//! .build();
142+
//! global::set_meter_provider(meter_provider.clone());
143+
//!
144+
//! // Get a meter
145+
//! let meter = global::meter("my_meter");
146+
//!
147+
//! // Create a metric
148+
//! let counter = meter.u64_counter("my_counter").build();
149+
//! counter.add(1, &[KeyValue::new("key", "value")]);
150+
//!
151+
//! // Shutdown the meter provider. This will trigger an export of all metrics.
152+
//! meter_provider.shutdown()?;
153+
//!
154+
//! Ok(())
155+
//! # }
156+
//! }
157+
//! ```
158+
//!
159+
//! After running your application configured with the OTLP exporter, view metrics at:
160+
//! `http://localhost:9090`
107161
//! ## Show Logs, Metrics too (TODO)
108162
//!
109163
//! ## Performance

opentelemetry-prometheus/README.md

+13-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,19 @@
66

77
[`Prometheus`] integration for applications instrumented with [`OpenTelemetry`].
88

9-
**The development of prometheus exporter has halt until the Opentelemetry metrics API and SDK reaches 1.0. Current
10-
implementation is based on Opentelemetry API and SDK 0.27**.
9+
**Warning: This crate is no longer recommended for use.**
10+
11+
Development of the Prometheus exporter has been discontinued. See the related
12+
[issue](https://github.com/open-telemetry/opentelemetry-rust/issues/2451). This
13+
crate depends on the unmaintained `protobuf` crate and has unresolved security
14+
vulnerabilities. Version 0.29 will be the final release.
15+
16+
For Prometheus integration, we strongly recommend using the [OTLP] exporter
17+
instead. Prometheus [natively supports
18+
OTLP](https://prometheus.io/docs/guides/opentelemetry/#enable-the-otlp-receiver),
19+
providing a more stable and actively maintained solution.
20+
21+
[OTLP]: https://docs.rs/opentelemetry-otlp/latest/opentelemetry_otlp/
1122

1223
[![Crates.io: opentelemetry-prometheus](https://img.shields.io/crates/v/opentelemetry-prometheus.svg)](https://crates.io/crates/opentelemetry-prometheus)
1324
[![Documentation](https://docs.rs/opentelemetry-prometheus/badge.svg)](https://docs.rs/opentelemetry-prometheus)

opentelemetry-prometheus/src/lib.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
//! An OpenTelemetry exporter for [Prometheus] metrics.
22
//!
3-
//! <div class="warning"> The development of prometheus exporter has halt until the Opentelemetry metrics API and SDK reaches 1.0. Current
4-
//! implementation is based on Opentelemetry API and SDK 0.23.</div>
3+
//! <div class="warning">
4+
//! <strong>Warning: This crate is no longer recommended for use.</strong><br><br>
5+
//! Development of the Prometheus exporter has been discontinued. See the related
6+
//! [issue](https://github.com/open-telemetry/opentelemetry-rust/issues/2451).
7+
//! This crate depends on the unmaintained `protobuf` crate and has unresolved
8+
//! security vulnerabilities. Version 0.29 will be the final release.
9+
//!
10+
//! For Prometheus integration, we strongly recommend using the [OTLP] exporter instead.
11+
//! Prometheus [natively supports OTLP](https://prometheus.io/docs/guides/opentelemetry/#enable-the-otlp-receiver),
12+
//! providing a more stable and actively maintained solution.
13+
//! </div>
514
//!
615
//! [Prometheus]: https://prometheus.io
16+
//! [OTLP]: https://docs.rs/opentelemetry-otlp/latest/opentelemetry_otlp/
717
//!
818
//! ```
919
//! use opentelemetry::{metrics::MeterProvider, KeyValue};

opentelemetry-zipkin/CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
## vNext
44

5+
- **Breaking** The `ZipkinExporterBuilder::build()` method now returns a
6+
`Result<ZipkinExporter, ExporterBuildError>`. The `ExporterBuildError` enum
7+
lists possible failures specific to the Zipkin exporter and was renamed from
8+
`opentelemetry_zipkin::Error`. Previously, this method returned a `TraceError`
9+
from the `opentelemetry_sdk` crate, which was unrelated to Zipkin builder
10+
failures.
11+
[2839](https://github.com/open-telemetry/opentelemetry-rust/pull/2839)
12+
513
## 0.28.0
614

715
Released 2025-Feb-10

opentelemetry-zipkin/examples/zipkin.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@ use opentelemetry::{
33
trace::{Span, Tracer},
44
InstrumentationScope, KeyValue,
55
};
6-
use opentelemetry_sdk::{
7-
trace::{SdkTracerProvider, TraceError},
8-
Resource,
9-
};
10-
use opentelemetry_zipkin::ZipkinExporter;
6+
use opentelemetry_sdk::{trace::SdkTracerProvider, Resource};
7+
use opentelemetry_zipkin::{ExporterBuildError, ZipkinExporter};
118
use std::thread;
129
use std::time::Duration;
1310

@@ -18,7 +15,7 @@ fn bar() {
1815
span.end()
1916
}
2017

21-
fn init_traces() -> Result<SdkTracerProvider, TraceError> {
18+
fn init_traces() -> Result<SdkTracerProvider, ExporterBuildError> {
2219
let exporter = ZipkinExporter::builder().build()?;
2320

2421
Ok(SdkTracerProvider::builder()

opentelemetry-zipkin/src/exporter/env.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const DEFAULT_COLLECTOR_ENDPOINT: &str = "http://127.0.0.1:9411/api/v2/spans";
66

77
/// HTTP endpoint for Zipkin collector.
88
/// e.g. "http://localhost:9411/api/v2/spans"
9-
const ENV_ENDPOINT: &str = "OTEL_EXPORTER_ZIPKIN_ENDPOINT";
9+
pub(crate) const ENV_ENDPOINT: &str = "OTEL_EXPORTER_ZIPKIN_ENDPOINT";
1010

1111
/// Maximum time the Zipkin exporter will wait for each batch export
1212
const ENV_TIMEOUT: &str = "OTEL_EXPORTER_ZIPKIN_TIMEOUT";

opentelemetry-zipkin/src/exporter/mod.rs

+35-17
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ use http::Uri;
66
use model::endpoint::Endpoint;
77
use opentelemetry_http::HttpClient;
88
use opentelemetry_sdk::error::OTelSdkResult;
9-
use opentelemetry_sdk::trace::TraceError;
10-
use opentelemetry_sdk::{trace, ExportError};
9+
use opentelemetry_sdk::trace;
1110
use std::net::{AddrParseError, SocketAddr};
1211
use std::sync::Arc;
1312

@@ -75,7 +74,7 @@ impl ZipkinExporterBuilder {
7574
/// Creates a new [ZipkinExporter] from this configuration.
7675
///
7776
/// Returns error if the endpoint is not valid or if no http client is provided.
78-
pub fn build(self) -> Result<ZipkinExporter, TraceError> {
77+
pub fn build(self) -> Result<ZipkinExporter, ExporterBuildError> {
7978
let endpoint = Endpoint::new(self.service_addr);
8079

8180
if let Some(client) = self.client {
@@ -84,15 +83,19 @@ impl ZipkinExporterBuilder {
8483
client,
8584
self.collector_endpoint
8685
.parse()
87-
.map_err::<Error, _>(Into::into)?,
86+
.map_err(ExporterBuildError::InvalidUri)?,
8887
);
8988
Ok(exporter)
9089
} else {
91-
Err(Error::NoHttpClient.into())
90+
Err(ExporterBuildError::NoHttpClient)
9291
}
9392
}
9493

9594
/// Assign client implementation
95+
///
96+
/// When using this method, the export timeout will depend on the provided
97+
/// client implementation and may not respect the timeout set via the
98+
/// environment variable `OTEL_EXPORTER_ZIPKIN_TIMEOUT`.
9699
pub fn with_http_client<T: HttpClient + 'static>(mut self, client: T) -> Self {
97100
self.client = Some(Arc::new(client));
98101
self
@@ -105,6 +108,9 @@ impl ZipkinExporterBuilder {
105108
}
106109

107110
/// Assign the Zipkin collector endpoint
111+
///
112+
/// Note: Programmatically setting this will override any value
113+
/// set via the environment variable `OTEL_EXPORTER_ZIPKIN_ENDPOINT`.
108114
pub fn with_collector_endpoint<T: Into<String>>(mut self, endpoint: T) -> Self {
109115
self.collector_endpoint = endpoint.into();
110116
self
@@ -134,30 +140,42 @@ impl trace::SpanExporter for ZipkinExporter {
134140
/// Wrap type for errors from opentelemetry zipkin
135141
#[derive(thiserror::Error, Debug)]
136142
#[non_exhaustive]
137-
pub enum Error {
143+
pub enum ExporterBuildError {
138144
/// No http client implementation found. User should provide one or enable features.
139145
#[error("http client must be set, users can enable reqwest feature to use http client implementation within create")]
140146
NoHttpClient,
141147

142-
/// Http requests failed
143-
#[error("http request failed with {0}")]
144-
RequestFailed(#[from] http::Error),
145-
146148
/// The uri provided is invalid
147149
#[error("invalid uri")]
148150
InvalidUri(#[from] http::uri::InvalidUri),
149151

150152
/// The IP/socket address provided is invalid
151153
#[error("invalid address")]
152154
InvalidAddress(#[from] AddrParseError),
153-
154-
/// Other errors
155-
#[error("export error: {0}")]
156-
Other(String),
157155
}
158156

159-
impl ExportError for Error {
160-
fn exporter_name(&self) -> &'static str {
161-
"zipkin"
157+
#[cfg(test)]
158+
mod tests {
159+
use super::*;
160+
use crate::exporter::env::ENV_ENDPOINT;
161+
162+
#[test]
163+
fn test_priority_of_code_based_config_over_envs_for_endpoint() {
164+
temp_env::with_vars([(ENV_ENDPOINT, Some("http://127.0.0.1:1234"))], || {
165+
let builder =
166+
ZipkinExporterBuilder::default().with_collector_endpoint("http://127.0.0.1:2345");
167+
assert_eq!(builder.collector_endpoint, "http://127.0.0.1:2345");
168+
});
169+
}
170+
171+
#[test]
172+
fn test_use_default_when_others_missing_for_endpoint() {
173+
temp_env::with_vars([(ENV_ENDPOINT, None::<&str>)], || {
174+
let builder = ZipkinExporterBuilder::default();
175+
assert_eq!(
176+
builder.collector_endpoint,
177+
"http://127.0.0.1:9411/api/v2/spans"
178+
);
179+
});
162180
}
163181
}

opentelemetry-zipkin/src/lib.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
//! use opentelemetry::global;
2525
//! use opentelemetry::trace::Tracer;
2626
//! use opentelemetry_sdk::{trace::{SdkTracerProvider, TraceError}, Resource};
27-
//! use opentelemetry_zipkin::ZipkinExporter;
27+
//! use opentelemetry_zipkin::{ExporterBuildError,ZipkinExporter};
2828
//!
29-
//! fn main() -> Result<(), TraceError> {
29+
//! fn main() -> Result<(), ExporterBuildError> {
3030
//! global::set_text_map_propagator(opentelemetry_zipkin::Propagator::new());
3131
//!
3232
//! let exporter = ZipkinExporter::builder()
@@ -68,9 +68,9 @@
6868
//! },
6969
//! Resource,
7070
//! };
71-
//! use opentelemetry_zipkin::ZipkinExporter;
71+
//! use opentelemetry_zipkin::{ExporterBuildError,ZipkinExporter};
7272
//!
73-
//! fn main() -> Result<(), opentelemetry_sdk::trace::TraceError> {
73+
//! fn main() -> Result<(), ExporterBuildError> {
7474
//! let exporter = ZipkinExporter::builder()
7575
//! .build()?;
7676
//!
@@ -116,7 +116,7 @@
116116
//! use opentelemetry::{global, InstrumentationScope, KeyValue, trace::Tracer};
117117
//! use opentelemetry_sdk::{trace::{self, RandomIdGenerator, Sampler, TraceError}, Resource};
118118
//! use opentelemetry_http::{HttpClient, HttpError};
119-
//! use opentelemetry_zipkin::{Error as ZipkinError, ZipkinExporter};
119+
//! use opentelemetry_zipkin::{ExporterBuildError, ZipkinExporter};
120120
//! use async_trait::async_trait;
121121
//! use bytes::Bytes;
122122
//! use futures_util::io::AsyncReadExt as _;
@@ -157,7 +157,7 @@
157157
//! }
158158
//! }
159159
//!
160-
//! fn init_traces() -> Result<trace::SdkTracerProvider, TraceError> {
160+
//! fn init_traces() -> Result<trace::SdkTracerProvider, ExporterBuildError> {
161161
//! let exporter = ZipkinExporter::builder()
162162
//! .with_http_client(
163163
//! HyperClient(
@@ -168,7 +168,7 @@
168168
//! .with_service_address(
169169
//! "127.0.0.1:8080"
170170
//! .parse()
171-
//! .map_err::<ZipkinError, _>(Into::into)?
171+
//! .map_err::<ExporterBuildError, _>(Into::into)?
172172
//! )
173173
//! .with_collector_endpoint("http://localhost:9411/api/v2/spans")
174174
//! .build()?;
@@ -257,5 +257,5 @@ extern crate typed_builder;
257257
mod exporter;
258258
mod propagator;
259259

260-
pub use exporter::{Error, ZipkinExporter, ZipkinExporterBuilder};
260+
pub use exporter::{ExporterBuildError, ZipkinExporter, ZipkinExporterBuilder};
261261
pub use propagator::{B3Encoding, Propagator};

opentelemetry/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ internal-logs = ["tracing"]
4343
opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["spec_unstable_logs_enabled"]} # for documentation tests
4444
criterion = { workspace = true }
4545
rand = { workspace = true, features = ["os_rng", "thread_rng"] }
46+
tokio = { version = "1.0", features = ["full"] }
47+
futures = "0.3"
4648

4749
[[bench]]
4850
name = "metrics"

0 commit comments

Comments
 (0)