Skip to content

Commit 9aeae0f

Browse files
pitoniak32lalitb
andauthored
Feat/add resource builder (#2322)
Co-authored-by: Lalit Kumar Bhasin <lalit_fin@yahoo.com>
1 parent 15d69b1 commit 9aeae0f

File tree

35 files changed

+420
-208
lines changed

35 files changed

+420
-208
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
Cargo.lock
66
/.idea/
77

8-
.cosine
8+
.cosine
9+
10+
opentelemetry-otlp/tests/integration_test/result.json

examples/logs-basic/src/main.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use opentelemetry::KeyValue;
21
use opentelemetry_appender_tracing::layer;
32
use opentelemetry_sdk::logs::LoggerProvider;
43
use opentelemetry_sdk::Resource;
@@ -8,10 +7,11 @@ use tracing_subscriber::prelude::*;
87
fn main() {
98
let exporter = opentelemetry_stdout::LogExporter::default();
109
let provider: LoggerProvider = LoggerProvider::builder()
11-
.with_resource(Resource::new(vec![KeyValue::new(
12-
"service.name",
13-
"log-appender-tracing-example",
14-
)]))
10+
.with_resource(
11+
Resource::builder()
12+
.with_service_name("log-appender-tracing-example")
13+
.build(),
14+
)
1515
.with_simple_exporter(exporter)
1616
.build();
1717
let layer = layer::OpenTelemetryTracingBridge::new(&provider);

examples/metrics-advanced/src/main.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,14 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
5050
.build();
5151

5252
let reader = PeriodicReader::builder(exporter).build();
53+
54+
let resource = Resource::builder()
55+
.with_service_name("metrics-advanced-example")
56+
.build();
57+
5358
let provider = SdkMeterProvider::builder()
5459
.with_reader(reader)
55-
.with_resource(Resource::new([KeyValue::new(
56-
"service.name",
57-
"metrics-advanced-example",
58-
)]))
60+
.with_resource(resource)
5961
.with_view(my_view_rename_and_unit)
6062
.with_view(my_view_drop_attributes)
6163
.with_view(my_view_change_aggregation)

examples/metrics-basic/src/main.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
1212
let reader = PeriodicReader::builder(exporter).build();
1313
let provider = SdkMeterProvider::builder()
1414
.with_reader(reader)
15-
.with_resource(Resource::new([KeyValue::new(
16-
"service.name",
17-
"metrics-basic-example",
18-
)]))
15+
.with_resource(
16+
Resource::builder()
17+
.with_service_name("metrics-basic-example")
18+
.build(),
19+
)
1920
.build();
2021
global::set_meter_provider(provider.clone());
2122
provider

examples/tracing-jaeger/src/main.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use opentelemetry::{
55
};
66
use opentelemetry_sdk::trace::TracerProvider;
77
use opentelemetry_sdk::{runtime, Resource};
8-
use opentelemetry_semantic_conventions::resource::SERVICE_NAME;
98

109
use std::error::Error;
1110

@@ -16,10 +15,11 @@ fn init_tracer_provider() -> Result<opentelemetry_sdk::trace::TracerProvider, Tr
1615

1716
Ok(TracerProvider::builder()
1817
.with_batch_exporter(exporter, runtime::Tokio)
19-
.with_resource(Resource::new(vec![KeyValue::new(
20-
SERVICE_NAME,
21-
"tracing-jaeger",
22-
)]))
18+
.with_resource(
19+
Resource::builder()
20+
.with_service_name("tracing-jaeger")
21+
.build(),
22+
)
2323
.build())
2424
}
2525

opentelemetry-appender-tracing/benches/logs.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
use async_trait::async_trait;
1717
use criterion::{criterion_group, criterion_main, Criterion};
18-
use opentelemetry::{InstrumentationScope, KeyValue};
18+
use opentelemetry::InstrumentationScope;
1919
use opentelemetry_appender_tracing::layer as tracing_layer;
2020
use opentelemetry_sdk::export::logs::{LogBatch, LogExporter};
2121
use opentelemetry_sdk::logs::LogResult;
@@ -126,10 +126,11 @@ fn benchmark_with_ot_layer(c: &mut Criterion, enabled: bool, bench_name: &str) {
126126
let exporter = NoopExporter { enabled };
127127
let processor = NoopProcessor::new(Box::new(exporter));
128128
let provider = LoggerProvider::builder()
129-
.with_resource(Resource::new(vec![KeyValue::new(
130-
"service.name",
131-
"benchmark",
132-
)]))
129+
.with_resource(
130+
Resource::builder_empty()
131+
.with_service_name("benchmark")
132+
.build(),
133+
)
133134
.with_log_processor(processor)
134135
.build();
135136
let ot_layer = tracing_layer::OpenTelemetryTracingBridge::new(&provider);

opentelemetry-appender-tracing/examples/basic.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! run with `$ cargo run --example basic
22
3-
use opentelemetry::KeyValue;
43
use opentelemetry_appender_tracing::layer;
54
use opentelemetry_sdk::{logs::LoggerProvider, Resource};
65
use tracing::error;
@@ -9,10 +8,11 @@ use tracing_subscriber::prelude::*;
98
fn main() {
109
let exporter = opentelemetry_stdout::LogExporter::default();
1110
let provider: LoggerProvider = LoggerProvider::builder()
12-
.with_resource(Resource::new(vec![KeyValue::new(
13-
"service.name",
14-
"log-appender-tracing-example",
15-
)]))
11+
.with_resource(
12+
Resource::builder()
13+
.with_service_name("log-appender-tracing-example")
14+
.build(),
15+
)
1616
.with_simple_exporter(exporter)
1717
.build();
1818
let layer = layer::OpenTelemetryTracingBridge::new(&provider);

opentelemetry-otlp/examples/basic-otlp-http/src/main.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ use tracing_subscriber::prelude::*;
2424
use tracing_subscriber::EnvFilter;
2525

2626
static RESOURCE: Lazy<Resource> = Lazy::new(|| {
27-
Resource::new(vec![KeyValue::new(
28-
opentelemetry_semantic_conventions::resource::SERVICE_NAME,
29-
"basic-otlp-example",
30-
)])
27+
Resource::builder()
28+
.with_service_name("basic-otlp-example")
29+
.build()
3130
});
3231

3332
fn init_logs() -> Result<sdklogs::LoggerProvider, opentelemetry_sdk::logs::LogError> {

opentelemetry-otlp/examples/basic-otlp/src/main.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ use tracing_subscriber::prelude::*;
1515
use tracing_subscriber::EnvFilter;
1616

1717
static RESOURCE: Lazy<Resource> = Lazy::new(|| {
18-
Resource::new(vec![KeyValue::new(
19-
opentelemetry_semantic_conventions::resource::SERVICE_NAME,
20-
"basic-otlp-example",
21-
)])
18+
Resource::builder()
19+
.with_service_name("basic-otlp-example")
20+
.build()
2221
});
2322

2423
fn init_traces() -> Result<sdktrace::TracerProvider, TraceError> {

opentelemetry-otlp/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@
162162
//! .with_max_events_per_span(64)
163163
//! .with_max_attributes_per_span(16)
164164
//! .with_max_events_per_span(16)
165-
//! .with_resource(Resource::new(vec![KeyValue::new("service.name", "example")])),
165+
//! .with_resource(Resource::builder_empty().with_attributes(vec![KeyValue::new("service.name", "example")]).build()),
166166
//! ).build();
167167
//! global::set_tracer_provider(tracer_provider);
168168
//! let tracer = global::tracer("tracer-name");
@@ -186,7 +186,7 @@
186186
//!
187187
//! let provider = opentelemetry_sdk::metrics::SdkMeterProvider::builder()
188188
//! .with_reader(reader)
189-
//! .with_resource(Resource::new(vec![KeyValue::new("service.name", "example")]))
189+
//! .with_resource(Resource::builder_empty().with_attributes(vec![KeyValue::new("service.name", "example")]).build())
190190
//! .build();
191191
//! # }
192192
//!

opentelemetry-otlp/tests/integration_test/tests/logs.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
use integration_test_runner::logs_asserter::{read_logs_from_json, LogsAsserter};
44
use log::{info, Level};
5-
use opentelemetry::KeyValue;
65
use opentelemetry_appender_log::OpenTelemetryLogBridge;
76
use opentelemetry_otlp::LogExporter;
87
use opentelemetry_sdk::logs::{LogError, LoggerProvider};
@@ -27,10 +26,11 @@ fn init_logs() -> Result<sdklogs::LoggerProvider, LogError> {
2726

2827
Ok(LoggerProvider::builder()
2928
.with_batch_exporter(exporter, runtime::Tokio)
30-
.with_resource(Resource::new(vec![KeyValue::new(
31-
opentelemetry_semantic_conventions::resource::SERVICE_NAME,
32-
"logs-integration-test",
33-
)]))
29+
.with_resource(
30+
Resource::builder_empty()
31+
.with_service_name("logs-integration-test")
32+
.build(),
33+
)
3434
.build())
3535
}
3636

opentelemetry-otlp/tests/integration_test/tests/traces.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ fn init_tracer_provider() -> Result<sdktrace::TracerProvider, TraceError> {
3232

3333
Ok(opentelemetry_sdk::trace::TracerProvider::builder()
3434
.with_batch_exporter(exporter, runtime::Tokio)
35-
.with_resource(Resource::new(vec![KeyValue::new(
36-
opentelemetry_semantic_conventions::resource::SERVICE_NAME,
37-
"basic-otlp-tracing-example",
38-
)]))
35+
.with_resource(
36+
Resource::builder_empty()
37+
.with_service_name("basic-otlp-tracing-example")
38+
.build(),
39+
)
3940
.build())
4041
}
4142

opentelemetry-proto/src/transform/logs.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ mod tests {
252252

253253
#[test]
254254
fn test_group_logs_by_resource_and_scope_single_scope() {
255-
let resource = Resource::default();
255+
let resource = Resource::builder().build();
256256
let (log_record1, instrum_lib1) = create_test_log_data("test-lib", "Log 1");
257257
let (log_record2, instrum_lib2) = create_test_log_data("test-lib", "Log 2");
258258

@@ -273,7 +273,7 @@ mod tests {
273273

274274
#[test]
275275
fn test_group_logs_by_resource_and_scope_multiple_scopes() {
276-
let resource = Resource::default();
276+
let resource = Resource::builder().build();
277277
let (log_record1, instrum_lib1) = create_test_log_data("lib1", "Log 1");
278278
let (log_record2, instrum_lib2) = create_test_log_data("lib2", "Log 2");
279279

opentelemetry-proto/src/transform/trace.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,9 @@ mod tests {
231231

232232
#[test]
233233
fn test_group_spans_by_resource_and_scope_single_scope() {
234-
let resource = Resource::new(vec![KeyValue::new("resource_key", "resource_value")]);
234+
let resource = Resource::builder_empty()
235+
.with_attribute(KeyValue::new("resource_key", "resource_value"))
236+
.build();
235237
let span_data = create_test_span_data("lib1");
236238

237239
let spans = vec![span_data.clone()];
@@ -276,7 +278,9 @@ mod tests {
276278

277279
#[test]
278280
fn test_group_spans_by_resource_and_scope_multiple_scopes() {
279-
let resource = Resource::new(vec![KeyValue::new("resource_key", "resource_value")]);
281+
let resource = Resource::builder_empty()
282+
.with_attribute(KeyValue::new("resource_key", "resource_value"))
283+
.build();
280284
let span_data1 = create_test_span_data("lib1");
281285
let span_data2 = create_test_span_data("lib1");
282286
let span_data3 = create_test_span_data("lib2");

opentelemetry-sdk/CHANGELOG.md

+16-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,22 @@
1414
[#2338](https://github.com/open-telemetry/opentelemetry-rust/pull/2338)
1515
- `ResourceDetector.detect()` no longer supports timeout option.
1616
- `opentelemetry::global::shutdown_tracer_provider()` Removed from the API, should now use `tracer_provider.shutdown()` see [#2369](https://github.com/open-telemetry/opentelemetry-rust/pull/2369) for a migration example. "Tracer provider" is cheaply cloneable, so users are encouraged to set a clone of it as the global (ex: `global::set_tracer_provider(provider.clone()))`, so that instrumentations and other components can obtain tracers from `global::tracer()`. The tracer_provider must be kept around to call shutdown on it at the end of application (ex: `tracer_provider.shutdown()`)
17-
17+
- *Feature*: Add `ResourceBuilder` for an easy way to create new `Resource`s
18+
- *Breaking*: Remove `Resource::{new,empty,from_detectors,new_with_defaults,from_schema_url,merge,default}` from public api. To create Resources you should only use `Resource::builder()` or `Resource::builder_empty()`. See [#2322](https://github.com/open-telemetry/opentelemetry-rust/pull/2322) for a migration guide.
19+
Example Usage:
20+
```rust
21+
// old
22+
Resource::default().with_attributes([
23+
KeyValue::new("service.name", "test_service"),
24+
KeyValue::new("key", "value"),
25+
]);
26+
27+
// new
28+
Resource::builder()
29+
.with_service_name("test_service")
30+
.with_attribute(KeyValue::new("key", "value"))
31+
.build();
32+
```
1833
- *Breaking* The LogExporter::export() method no longer requires a mutable reference to self.:
1934
Before:
2035
async fn export(&mut self, _batch: LogBatch<'_>) -> LogResult<()>

opentelemetry-sdk/benches/metric.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ fn counters(c: &mut Criterion) {
241241

242242
let (rdr, cntr) = bench_counter(None, "cumulative");
243243
let mut rm = ResourceMetrics {
244-
resource: Resource::empty(),
244+
resource: Resource::builder_empty().build(),
245245
scope_metrics: Vec::new(),
246246
};
247247

@@ -338,7 +338,7 @@ fn benchmark_collect_histogram(b: &mut Bencher, n: usize) {
338338
}
339339

340340
let mut rm = ResourceMetrics {
341-
resource: Resource::empty(),
341+
resource: Resource::builder_empty().build(),
342342
scope_metrics: Vec::new(),
343343
};
344344

opentelemetry-sdk/src/logs/log_emitter.rs

+14-9
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ impl Builder {
221221

222222
/// Create a new provider from this configuration.
223223
pub fn build(self) -> LoggerProvider {
224-
let resource = self.resource.unwrap_or_default();
224+
let resource = self.resource.unwrap_or(Resource::builder().build());
225225

226226
let logger_provider = LoggerProvider {
227227
inner: Arc::new(LoggerProviderInner {
@@ -413,10 +413,11 @@ mod tests {
413413

414414
// If user provided a resource, use that.
415415
let custom_config_provider = super::LoggerProvider::builder()
416-
.with_resource(Resource::new(vec![KeyValue::new(
417-
SERVICE_NAME,
418-
"test_service",
419-
)]))
416+
.with_resource(
417+
Resource::builder_empty()
418+
.with_service_name("test_service")
419+
.build(),
420+
)
420421
.build();
421422
assert_resource(&custom_config_provider, SERVICE_NAME, Some("test_service"));
422423
assert_eq!(custom_config_provider.resource().len(), 1);
@@ -445,10 +446,14 @@ mod tests {
445446
Some("my-custom-key=env-val,k2=value2"),
446447
|| {
447448
let user_provided_resource_config_provider = super::LoggerProvider::builder()
448-
.with_resource(Resource::default().merge(&mut Resource::new(vec![
449-
KeyValue::new("my-custom-key", "my-custom-value"),
450-
KeyValue::new("my-custom-key2", "my-custom-value2"),
451-
])))
449+
.with_resource(
450+
Resource::builder()
451+
.with_attributes(vec![
452+
KeyValue::new("my-custom-key", "my-custom-value"),
453+
KeyValue::new("my-custom-key2", "my-custom-value2"),
454+
])
455+
.build(),
456+
)
452457
.build();
453458
assert_resource(
454459
&user_provided_resource_config_provider,

opentelemetry-sdk/src/logs/log_processor.rs

+22-14
Original file line numberDiff line numberDiff line change
@@ -767,13 +767,17 @@ mod tests {
767767
let processor = SimpleLogProcessor::new(exporter.clone());
768768
let _ = LoggerProvider::builder()
769769
.with_log_processor(processor)
770-
.with_resource(Resource::new(vec![
771-
KeyValue::new("k1", "v1"),
772-
KeyValue::new("k2", "v3"),
773-
KeyValue::new("k3", "v3"),
774-
KeyValue::new("k4", "v4"),
775-
KeyValue::new("k5", "v5"),
776-
]))
770+
.with_resource(
771+
Resource::builder_empty()
772+
.with_attributes(vec![
773+
KeyValue::new("k1", "v1"),
774+
KeyValue::new("k2", "v3"),
775+
KeyValue::new("k3", "v3"),
776+
KeyValue::new("k4", "v4"),
777+
KeyValue::new("k5", "v5"),
778+
])
779+
.build(),
780+
)
777781
.build();
778782
assert_eq!(exporter.get_resource().unwrap().into_iter().count(), 5);
779783
}
@@ -790,13 +794,17 @@ mod tests {
790794
);
791795
let provider = LoggerProvider::builder()
792796
.with_log_processor(processor)
793-
.with_resource(Resource::new(vec![
794-
KeyValue::new("k1", "v1"),
795-
KeyValue::new("k2", "v3"),
796-
KeyValue::new("k3", "v3"),
797-
KeyValue::new("k4", "v4"),
798-
KeyValue::new("k5", "v5"),
799-
]))
797+
.with_resource(
798+
Resource::builder_empty()
799+
.with_attributes(vec![
800+
KeyValue::new("k1", "v1"),
801+
KeyValue::new("k2", "v3"),
802+
KeyValue::new("k3", "v3"),
803+
KeyValue::new("k4", "v4"),
804+
KeyValue::new("k5", "v5"),
805+
])
806+
.build(),
807+
)
800808
.build();
801809
tokio::time::sleep(Duration::from_secs(2)).await; // set resource in batch span processor is not blocking. Should we make it blocking?
802810
assert_eq!(exporter.get_resource().unwrap().into_iter().count(), 5);

0 commit comments

Comments
 (0)