Skip to content

Commit cb6a6b2

Browse files
authored
Merge branch 'main' into build-profiles
2 parents aa20cab + 7cfe8cd commit cb6a6b2

File tree

14 files changed

+117
-137
lines changed

14 files changed

+117
-137
lines changed

examples/metrics-advanced/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ bench = false
1313

1414
[dependencies]
1515
opentelemetry = { path = "../../opentelemetry", features = ["metrics"] }
16-
opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["spec_unstable_metrics_views"] }
16+
opentelemetry_sdk = { path = "../../opentelemetry-sdk" }
1717
opentelemetry-stdout = { workspace = true, features = ["metrics"] }
1818
tokio = { workspace = true, features = ["full"] }

examples/metrics-advanced/src/main.rs

Lines changed: 20 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use opentelemetry::global;
2-
use opentelemetry::Key;
32
use opentelemetry::KeyValue;
4-
use opentelemetry_sdk::metrics::{Aggregation, Instrument, SdkMeterProvider, Stream, Temporality};
3+
use opentelemetry_sdk::metrics::{Instrument, SdkMeterProvider, Stream, Temporality};
54
use opentelemetry_sdk::Resource;
65
use std::error::Error;
76

@@ -20,23 +19,9 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
2019
};
2120

2221
// for example 2
23-
let my_view_drop_attributes = |i: &Instrument| {
24-
if i.name == "my_counter" {
25-
Some(Stream::new().allowed_attribute_keys(vec![Key::from("mykey1")]))
26-
} else {
27-
None
28-
}
29-
};
30-
31-
// for example 3
32-
let my_view_change_aggregation = |i: &Instrument| {
22+
let my_view_change_cardinality = |i: &Instrument| {
3323
if i.name == "my_second_histogram" {
34-
Some(
35-
Stream::new().aggregation(Aggregation::ExplicitBucketHistogram {
36-
boundaries: vec![0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5],
37-
record_min_max: false,
38-
}),
39-
)
24+
Some(Stream::new().cardinality_limit(2))
4025
} else {
4126
None
4227
}
@@ -55,8 +40,7 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
5540
.with_periodic_exporter(exporter)
5641
.with_resource(resource)
5742
.with_view(my_view_rename_and_unit)
58-
.with_view(my_view_drop_attributes)
59-
.with_view(my_view_change_aggregation)
43+
.with_view(my_view_change_cardinality)
6044
.build();
6145
global::set_meter_provider(provider.clone());
6246
provider
@@ -88,65 +72,31 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
8872
],
8973
);
9074

91-
// Example 2 - Drop unwanted attributes using view.
92-
let counter = meter.u64_counter("my_counter").build();
93-
94-
// Record measurements using the Counter instrument.
95-
// Though we are passing 4 attributes here, only 1 will be used
96-
// for aggregation as view is configured to use only "mykey1"
97-
// attribute.
98-
counter.add(
99-
10,
100-
&[
101-
KeyValue::new("mykey1", "myvalue1"),
102-
KeyValue::new("mykey2", "myvalue2"),
103-
KeyValue::new("mykey3", "myvalue3"),
104-
KeyValue::new("mykey4", "myvalue4"),
105-
],
106-
);
107-
108-
// Example 3 - Change Aggregation configuration using View.
109-
// Histograms are by default aggregated using ExplicitBucketHistogram
110-
// with default buckets. The configured view will change the aggregation to
111-
// use a custom set of boundaries, and min/max values will not be recorded.
75+
// Example 2 - Change cardinality using View.
11276
let histogram2 = meter
11377
.f64_histogram("my_second_histogram")
11478
.with_unit("ms")
11579
.with_description("My histogram example description")
11680
.build();
11781

11882
// Record measurements using the histogram instrument.
119-
// The values recorded are in the range of 1.2 to 1.5, warranting
120-
// the change of boundaries.
121-
histogram2.record(
122-
1.5,
123-
&[
124-
KeyValue::new("mykey1", "myvalue1"),
125-
KeyValue::new("mykey2", "myvalue2"),
126-
KeyValue::new("mykey3", "myvalue3"),
127-
KeyValue::new("mykey4", "myvalue4"),
128-
],
129-
);
83+
// This metric will have a cardinality limit of 2,
84+
// as set in the view. Because of this, only the first two
85+
// measurements will be recorded, and the rest will be folded
86+
// into the overflow attribute.
87+
histogram2.record(1.5, &[KeyValue::new("mykey1", "v1")]);
13088

131-
histogram2.record(
132-
1.2,
133-
&[
134-
KeyValue::new("mykey1", "myvalue1"),
135-
KeyValue::new("mykey2", "myvalue2"),
136-
KeyValue::new("mykey3", "myvalue3"),
137-
KeyValue::new("mykey4", "myvalue4"),
138-
],
139-
);
89+
histogram2.record(1.2, &[KeyValue::new("mykey1", "v2")]);
14090

141-
histogram2.record(
142-
1.23,
143-
&[
144-
KeyValue::new("mykey1", "myvalue1"),
145-
KeyValue::new("mykey2", "myvalue2"),
146-
KeyValue::new("mykey3", "myvalue3"),
147-
KeyValue::new("mykey4", "myvalue4"),
148-
],
149-
);
91+
histogram2.record(1.23, &[KeyValue::new("mykey1", "v3")]);
92+
93+
histogram2.record(1.4, &[KeyValue::new("mykey1", "v4")]);
94+
95+
histogram2.record(1.6, &[KeyValue::new("mykey1", "v5")]);
96+
97+
histogram2.record(1.7, &[KeyValue::new("mykey1", "v6")]);
98+
99+
histogram2.record(1.8, &[KeyValue::new("mykey1", "v7")]);
150100

151101
// Metrics are exported by default every 30 seconds when using stdout exporter,
152102
// however shutting down the MeterProvider here instantly flushes

opentelemetry-otlp/CHANGELOG.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
- Update `tonic` dependency version to 0.13
66
- Re-export `tonic` types under `tonic_types`
77
[2898](https://github.com/open-telemetry/opentelemetry-rust/pull/2898)
8-
- It is now possible to add links to a `Span` via the `SpanRef` that you get from
9-
a `Context`. [2959](https://github.com/open-telemetry/opentelemetry-rust/pull/2959)
8+
- Publicly re-exported `MetricExporterBuilder`, `SpanExporterBuilder`, and
9+
`LogExporterBuilder` types, enabling users to directly reference and use these
10+
builder types for metrics, traces, and logs exporters.
11+
[2966](https://github.com/open-telemetry/opentelemetry-rust/pull/2966)
1012

1113
## 0.29.0
1214

opentelemetry-otlp/src/lib.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -374,22 +374,25 @@ pub use crate::exporter::ExporterBuildError;
374374
#[cfg(feature = "trace")]
375375
#[cfg(any(feature = "http-proto", feature = "http-json", feature = "grpc-tonic"))]
376376
pub use crate::span::{
377-
SpanExporter, OTEL_EXPORTER_OTLP_TRACES_COMPRESSION, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
378-
OTEL_EXPORTER_OTLP_TRACES_HEADERS, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,
377+
SpanExporter, SpanExporterBuilder, OTEL_EXPORTER_OTLP_TRACES_COMPRESSION,
378+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_HEADERS,
379+
OTEL_EXPORTER_OTLP_TRACES_TIMEOUT,
379380
};
380381

381382
#[cfg(feature = "metrics")]
382383
#[cfg(any(feature = "http-proto", feature = "http-json", feature = "grpc-tonic"))]
383384
pub use crate::metric::{
384-
MetricExporter, OTEL_EXPORTER_OTLP_METRICS_COMPRESSION, OTEL_EXPORTER_OTLP_METRICS_ENDPOINT,
385-
OTEL_EXPORTER_OTLP_METRICS_HEADERS, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT,
385+
MetricExporter, MetricExporterBuilder, OTEL_EXPORTER_OTLP_METRICS_COMPRESSION,
386+
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, OTEL_EXPORTER_OTLP_METRICS_HEADERS,
387+
OTEL_EXPORTER_OTLP_METRICS_TIMEOUT,
386388
};
387389

388390
#[cfg(feature = "logs")]
389391
#[cfg(any(feature = "http-proto", feature = "http-json", feature = "grpc-tonic"))]
390392
pub use crate::logs::{
391-
LogExporter, OTEL_EXPORTER_OTLP_LOGS_COMPRESSION, OTEL_EXPORTER_OTLP_LOGS_ENDPOINT,
392-
OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT,
393+
LogExporter, LogExporterBuilder, OTEL_EXPORTER_OTLP_LOGS_COMPRESSION,
394+
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, OTEL_EXPORTER_OTLP_LOGS_HEADERS,
395+
OTEL_EXPORTER_OTLP_LOGS_TIMEOUT,
393396
};
394397

395398
#[cfg(any(feature = "http-proto", feature = "http-json"))]

opentelemetry-otlp/src/logs.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,20 @@ pub const OTEL_EXPORTER_OTLP_LOGS_TIMEOUT: &str = "OTEL_EXPORTER_OTLP_LOGS_TIMEO
3131
/// Note: this is only supported for HTTP.
3232
pub const OTEL_EXPORTER_OTLP_LOGS_HEADERS: &str = "OTEL_EXPORTER_OTLP_LOGS_HEADERS";
3333

34+
/// Builder for creating a new [LogExporter].
3435
#[derive(Debug, Default, Clone)]
3536
pub struct LogExporterBuilder<C> {
3637
client: C,
3738
endpoint: Option<String>,
3839
}
3940

4041
impl LogExporterBuilder<NoExporterBuilderSet> {
42+
/// Create a new [LogExporterBuilder] with default settings.
4143
pub fn new() -> Self {
4244
LogExporterBuilder::default()
4345
}
4446

47+
/// With the gRPC Tonic transport.
4548
#[cfg(feature = "grpc-tonic")]
4649
pub fn with_tonic(self) -> LogExporterBuilder<TonicExporterBuilderSet> {
4750
LogExporterBuilder {
@@ -50,6 +53,7 @@ impl LogExporterBuilder<NoExporterBuilderSet> {
5053
}
5154
}
5255

56+
/// With the HTTP transport.
5357
#[cfg(any(feature = "http-proto", feature = "http-json"))]
5458
pub fn with_http(self) -> LogExporterBuilder<HttpExporterBuilderSet> {
5559
LogExporterBuilder {
@@ -61,6 +65,7 @@ impl LogExporterBuilder<NoExporterBuilderSet> {
6165

6266
#[cfg(feature = "grpc-tonic")]
6367
impl LogExporterBuilder<TonicExporterBuilderSet> {
68+
/// Build the [LogExporter] with the gRPC Tonic transport.
6469
pub fn build(self) -> Result<LogExporter, ExporterBuildError> {
6570
let result = self.client.0.build_log_exporter();
6671
otel_debug!(name: "LogExporterBuilt", result = format!("{:?}", &result));
@@ -70,6 +75,7 @@ impl LogExporterBuilder<TonicExporterBuilderSet> {
7075

7176
#[cfg(any(feature = "http-proto", feature = "http-json"))]
7277
impl LogExporterBuilder<HttpExporterBuilderSet> {
78+
/// Build the [LogExporter] with the HTTP transport.
7379
pub fn build(self) -> Result<LogExporter, ExporterBuildError> {
7480
self.client.0.build_log_exporter()
7581
}

opentelemetry-otlp/src/metric.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,22 @@ pub const OTEL_EXPORTER_OTLP_METRICS_COMPRESSION: &str = "OTEL_EXPORTER_OTLP_MET
3737
/// Note: this is only supported for HTTP.
3838
pub const OTEL_EXPORTER_OTLP_METRICS_HEADERS: &str = "OTEL_EXPORTER_OTLP_METRICS_HEADERS";
3939

40+
/// A builder for creating a new [MetricExporter].
4041
#[derive(Debug, Default, Clone)]
4142
pub struct MetricExporterBuilder<C> {
4243
client: C,
4344
temporality: Temporality,
4445
}
4546

4647
impl MetricExporterBuilder<NoExporterBuilderSet> {
48+
/// Create a new [MetricExporterBuilder] with default settings.
4749
pub fn new() -> Self {
4850
MetricExporterBuilder::default()
4951
}
5052
}
5153

5254
impl<C> MetricExporterBuilder<C> {
55+
/// With the gRPC Tonic transport.
5356
#[cfg(feature = "grpc-tonic")]
5457
pub fn with_tonic(self) -> MetricExporterBuilder<TonicExporterBuilderSet> {
5558
MetricExporterBuilder {
@@ -58,6 +61,7 @@ impl<C> MetricExporterBuilder<C> {
5861
}
5962
}
6063

64+
/// With the HTTP transport.
6165
#[cfg(any(feature = "http-proto", feature = "http-json"))]
6266
pub fn with_http(self) -> MetricExporterBuilder<HttpExporterBuilderSet> {
6367
MetricExporterBuilder {
@@ -66,6 +70,7 @@ impl<C> MetricExporterBuilder<C> {
6670
}
6771
}
6872

73+
/// Set the temporality for the metrics.
6974
pub fn with_temporality(self, temporality: Temporality) -> MetricExporterBuilder<C> {
7075
MetricExporterBuilder {
7176
client: self.client,
@@ -76,6 +81,7 @@ impl<C> MetricExporterBuilder<C> {
7681

7782
#[cfg(feature = "grpc-tonic")]
7883
impl MetricExporterBuilder<TonicExporterBuilderSet> {
84+
/// Build the [MetricExporter] with the gRPC Tonic transport.
7985
pub fn build(self) -> Result<MetricExporter, ExporterBuildError> {
8086
let exporter = self.client.0.build_metrics_exporter(self.temporality)?;
8187
opentelemetry::otel_debug!(name: "MetricExporterBuilt");
@@ -85,6 +91,7 @@ impl MetricExporterBuilder<TonicExporterBuilderSet> {
8591

8692
#[cfg(any(feature = "http-proto", feature = "http-json"))]
8793
impl MetricExporterBuilder<HttpExporterBuilderSet> {
94+
/// Build the [MetricExporter] with the HTTP transport.
8895
pub fn build(self) -> Result<MetricExporter, ExporterBuildError> {
8996
let exporter = self.client.0.build_metrics_exporter(self.temporality)?;
9097
Ok(exporter)

opentelemetry-otlp/src/span.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,23 +36,27 @@ pub const OTEL_EXPORTER_OTLP_TRACES_COMPRESSION: &str = "OTEL_EXPORTER_OTLP_TRAC
3636
/// Note: this is only supported for HTTP.
3737
pub const OTEL_EXPORTER_OTLP_TRACES_HEADERS: &str = "OTEL_EXPORTER_OTLP_TRACES_HEADERS";
3838

39+
/// OTLP span exporter builder
3940
#[derive(Debug, Default, Clone)]
4041
pub struct SpanExporterBuilder<C> {
4142
client: C,
4243
}
4344

4445
impl SpanExporterBuilder<NoExporterBuilderSet> {
46+
/// Create a new [SpanExporterBuilder] with default settings.
4547
pub fn new() -> Self {
4648
SpanExporterBuilder::default()
4749
}
4850

51+
/// With the gRPC Tonic transport.
4952
#[cfg(feature = "grpc-tonic")]
5053
pub fn with_tonic(self) -> SpanExporterBuilder<TonicExporterBuilderSet> {
5154
SpanExporterBuilder {
5255
client: TonicExporterBuilderSet(TonicExporterBuilder::default()),
5356
}
5457
}
5558

59+
/// With the HTTP transport.
5660
#[cfg(any(feature = "http-proto", feature = "http-json"))]
5761
pub fn with_http(self) -> SpanExporterBuilder<HttpExporterBuilderSet> {
5862
SpanExporterBuilder {
@@ -63,6 +67,7 @@ impl SpanExporterBuilder<NoExporterBuilderSet> {
6367

6468
#[cfg(feature = "grpc-tonic")]
6569
impl SpanExporterBuilder<TonicExporterBuilderSet> {
70+
/// Build the [SpanExporter] with the gRPC Tonic transport.
6671
pub fn build(self) -> Result<SpanExporter, ExporterBuildError> {
6772
let span_exporter = self.client.0.build_span_exporter()?;
6873
opentelemetry::otel_debug!(name: "SpanExporterBuilt");
@@ -72,6 +77,7 @@ impl SpanExporterBuilder<TonicExporterBuilderSet> {
7277

7378
#[cfg(any(feature = "http-proto", feature = "http-json"))]
7479
impl SpanExporterBuilder<HttpExporterBuilderSet> {
80+
/// Build the [SpanExporter] with the HTTP transport.
7581
pub fn build(self) -> Result<SpanExporter, ExporterBuildError> {
7682
let span_exporter = self.client.0.build_span_exporter()?;
7783
Ok(span_exporter)

opentelemetry-sdk/CHANGELOG.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## vNext
44

5+
- It is now possible to add links to a `Span` via the `SpanRef` that you get from
6+
a `Context`. [2959](https://github.com/open-telemetry/opentelemetry-rust/pull/2959)
57
- **Feature**: Added context based telemetry suppression. [#2868](https://github.com/open-telemetry/opentelemetry-rust/pull/2868)
68
- `SdkLogger`, `SdkTracer` modified to respect telemetry suppression based on
79
`Context`. In other words, if the current context has telemetry suppression
@@ -43,8 +45,13 @@ also modified to suppress telemetry before invoking exporters.
4345
[#2928](https://github.com/open-telemetry/opentelemetry-rust/pull/2928)
4446

4547
- TODO: Placeholder for View related changelog. Polish this after all
46-
changes are done.
47-
Hide public fields from `Stream` struct.
48+
- The `Stream` struct now has its public fields hidden.
49+
- Core view functionality is now available by default—users can change the
50+
name, unit, description, and cardinality limit of a metric via views without
51+
enabling the `spec_unstable_metrics_views` feature flag. Advanced view
52+
features, such as custom aggregation or attribute filtering, still require
53+
the `spec_unstable_metrics_views` feature.
54+
- TODO: Add Stream::builder() pattern change, validation when done.
4855

4956
- *Breaking* `Aggregation` enum moved behind feature flag
5057
"spec_unstable_metrics_views". This was only required when using Views.

opentelemetry-sdk/src/metrics/aggregation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ impl Aggregation {
150150

151151
#[cfg(test)]
152152
mod tests {
153+
use super::Aggregation;
153154
use crate::metrics::error::{MetricError, MetricResult};
154155
use crate::metrics::internal::{EXPO_MAX_SCALE, EXPO_MIN_SCALE};
155-
use crate::metrics::Aggregation;
156156

157157
#[test]
158158
fn validate_aggregation() {

opentelemetry-sdk/src/metrics/instrument.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ impl InstrumentKind {
8383
/// ```
8484
#[derive(Clone, Default, Debug, PartialEq)]
8585
#[non_exhaustive]
86-
#[allow(unreachable_pub)]
8786
pub struct Instrument {
8887
/// The human-readable identifier of the instrument.
8988
pub name: Cow<'static, str>,
@@ -208,7 +207,6 @@ pub struct Stream {
208207
pub(crate) cardinality_limit: Option<usize>,
209208
}
210209

211-
#[cfg(feature = "spec_unstable_metrics_views")]
212210
impl Stream {
213211
/// Create a new stream with empty values.
214212
pub fn new() -> Self {
@@ -233,12 +231,14 @@ impl Stream {
233231
self
234232
}
235233

234+
#[cfg(feature = "spec_unstable_metrics_views")]
236235
/// Set the stream aggregation.
237236
pub fn aggregation(mut self, aggregation: Aggregation) -> Self {
238237
self.aggregation = Some(aggregation);
239238
self
240239
}
241240

241+
#[cfg(feature = "spec_unstable_metrics_views")]
242242
/// Set the stream allowed attribute keys.
243243
///
244244
/// Any attribute recorded for the stream with a key not in this set will be

0 commit comments

Comments
 (0)