Skip to content

Commit 04a800c

Browse files
authored
test: increase Telemetry resource testing coverage (#1646)
1 parent 278f5c7 commit 04a800c

File tree

5 files changed

+288
-65
lines changed

5 files changed

+288
-65
lines changed

opentelemetry-sdk/src/logs/log_emitter.rs

+132
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,144 @@ impl opentelemetry::logs::Logger for Logger {
239239

240240
#[cfg(test)]
241241
mod tests {
242+
use crate::resource::{
243+
SERVICE_NAME, TELEMETRY_SDK_LANGUAGE, TELEMETRY_SDK_NAME, TELEMETRY_SDK_VERSION,
244+
};
245+
use crate::Resource;
246+
242247
use super::*;
243248
use opentelemetry::global::{logger, set_logger_provider, shutdown_logger_provider};
244249
use opentelemetry::logs::Logger;
250+
use opentelemetry::{Key, KeyValue, Value};
245251
use std::sync::{Arc, Mutex};
246252
use std::thread;
247253

254+
#[test]
255+
fn test_logger_provider_default_resource() {
256+
let assert_resource = |provider: &super::LoggerProvider,
257+
resource_key: &'static str,
258+
expect: Option<&'static str>| {
259+
assert_eq!(
260+
provider
261+
.config()
262+
.resource
263+
.get(Key::from_static_str(resource_key))
264+
.map(|v| v.to_string()),
265+
expect.map(|s| s.to_string())
266+
);
267+
};
268+
let assert_telemetry_resource = |provider: &super::LoggerProvider| {
269+
assert_eq!(
270+
provider
271+
.config()
272+
.resource
273+
.get(TELEMETRY_SDK_LANGUAGE.into()),
274+
Some(Value::from("rust"))
275+
);
276+
assert_eq!(
277+
provider.config().resource.get(TELEMETRY_SDK_NAME.into()),
278+
Some(Value::from("opentelemetry"))
279+
);
280+
assert_eq!(
281+
provider.config().resource.get(TELEMETRY_SDK_VERSION.into()),
282+
Some(Value::from(env!("CARGO_PKG_VERSION")))
283+
);
284+
};
285+
286+
// If users didn't provide a resource and there isn't a env var set. Use default one.
287+
temp_env::with_var_unset("OTEL_RESOURCE_ATTRIBUTES", || {
288+
let default_config_provider = super::LoggerProvider::builder().build();
289+
assert_resource(
290+
&default_config_provider,
291+
SERVICE_NAME,
292+
Some("unknown_service"),
293+
);
294+
assert_telemetry_resource(&default_config_provider);
295+
});
296+
297+
// If user provided a resource, use that.
298+
let custom_config_provider = super::LoggerProvider::builder()
299+
.with_config(Config {
300+
resource: Cow::Owned(Resource::new(vec![KeyValue::new(
301+
SERVICE_NAME,
302+
"test_service",
303+
)])),
304+
})
305+
.build();
306+
assert_resource(&custom_config_provider, SERVICE_NAME, Some("test_service"));
307+
assert_eq!(custom_config_provider.config().resource.len(), 1);
308+
309+
// If `OTEL_RESOURCE_ATTRIBUTES` is set, read them automatically
310+
temp_env::with_var(
311+
"OTEL_RESOURCE_ATTRIBUTES",
312+
Some("key1=value1, k2, k3=value2"),
313+
|| {
314+
let env_resource_provider = super::LoggerProvider::builder().build();
315+
assert_resource(
316+
&env_resource_provider,
317+
SERVICE_NAME,
318+
Some("unknown_service"),
319+
);
320+
assert_resource(&env_resource_provider, "key1", Some("value1"));
321+
assert_resource(&env_resource_provider, "k3", Some("value2"));
322+
assert_telemetry_resource(&env_resource_provider);
323+
assert_eq!(env_resource_provider.config().resource.len(), 6);
324+
},
325+
);
326+
327+
// When `OTEL_RESOURCE_ATTRIBUTES` is set and also user provided config
328+
temp_env::with_var(
329+
"OTEL_RESOURCE_ATTRIBUTES",
330+
Some("my-custom-key=env-val,k2=value2"),
331+
|| {
332+
let user_provided_resource_config_provider = super::LoggerProvider::builder()
333+
.with_config(Config {
334+
resource: Cow::Owned(Resource::default().merge(&mut Resource::new(vec![
335+
KeyValue::new("my-custom-key", "my-custom-value"),
336+
KeyValue::new("my-custom-key2", "my-custom-value2"),
337+
]))),
338+
})
339+
.build();
340+
assert_resource(
341+
&user_provided_resource_config_provider,
342+
SERVICE_NAME,
343+
Some("unknown_service"),
344+
);
345+
assert_resource(
346+
&user_provided_resource_config_provider,
347+
"my-custom-key",
348+
Some("my-custom-value"),
349+
);
350+
assert_resource(
351+
&user_provided_resource_config_provider,
352+
"my-custom-key2",
353+
Some("my-custom-value2"),
354+
);
355+
assert_resource(
356+
&user_provided_resource_config_provider,
357+
"k2",
358+
Some("value2"),
359+
);
360+
assert_telemetry_resource(&user_provided_resource_config_provider);
361+
assert_eq!(
362+
user_provided_resource_config_provider
363+
.config()
364+
.resource
365+
.len(),
366+
7
367+
);
368+
},
369+
);
370+
371+
// If user provided a resource, it takes priority during collision.
372+
let no_service_name = super::LoggerProvider::builder()
373+
.with_config(Config {
374+
resource: Cow::Owned(Resource::empty()),
375+
})
376+
.build();
377+
assert_eq!(no_service_name.config().resource.len(), 0);
378+
}
379+
248380
#[test]
249381
fn shutdown_test() {
250382
// cargo test shutdown_test --features=logs

opentelemetry-sdk/src/metrics/meter_provider.rs

+78-33
Original file line numberDiff line numberDiff line change
@@ -217,42 +217,72 @@ impl fmt::Debug for MeterProviderBuilder {
217217
}
218218
#[cfg(test)]
219219
mod tests {
220+
use crate::resource::{
221+
SERVICE_NAME, TELEMETRY_SDK_LANGUAGE, TELEMETRY_SDK_NAME, TELEMETRY_SDK_VERSION,
222+
};
220223
use crate::testing::metrics::metric_reader::TestMetricReader;
221224
use crate::Resource;
222225
use opentelemetry::global;
223-
use opentelemetry::Key;
224-
use opentelemetry::KeyValue;
226+
use opentelemetry::{Key, KeyValue, Value};
225227
use std::env;
226228

227229
#[test]
228230
fn test_meter_provider_resource() {
229-
// If users didn't provide a resource and there isn't a env var set. Use default one.
230-
let assert_service_name = |provider: super::SdkMeterProvider,
231-
expect: Option<&'static str>| {
231+
let assert_resource = |provider: &super::SdkMeterProvider,
232+
resource_key: &'static str,
233+
expect: Option<&'static str>| {
232234
assert_eq!(
233235
provider.pipes.0[0]
234236
.resource
235-
.get(Key::from_static_str("service.name"))
237+
.get(Key::from_static_str(resource_key))
236238
.map(|v| v.to_string()),
237239
expect.map(|s| s.to_string())
238240
);
239241
};
240-
let reader = TestMetricReader::new();
241-
let default_meter_provider = super::SdkMeterProvider::builder()
242-
.with_reader(reader)
243-
.build();
244-
assert_service_name(default_meter_provider, Some("unknown_service"));
242+
let assert_telemetry_resource = |provider: &super::SdkMeterProvider| {
243+
assert_eq!(
244+
provider.pipes.0[0]
245+
.resource
246+
.get(TELEMETRY_SDK_LANGUAGE.into()),
247+
Some(Value::from("rust"))
248+
);
249+
assert_eq!(
250+
provider.pipes.0[0].resource.get(TELEMETRY_SDK_NAME.into()),
251+
Some(Value::from("opentelemetry"))
252+
);
253+
assert_eq!(
254+
provider.pipes.0[0]
255+
.resource
256+
.get(TELEMETRY_SDK_VERSION.into()),
257+
Some(Value::from(env!("CARGO_PKG_VERSION")))
258+
);
259+
};
260+
261+
// If users didn't provide a resource and there isn't a env var set. Use default one.
262+
temp_env::with_var_unset("OTEL_RESOURCE_ATTRIBUTES", || {
263+
let reader = TestMetricReader::new();
264+
let default_meter_provider = super::SdkMeterProvider::builder()
265+
.with_reader(reader)
266+
.build();
267+
assert_resource(
268+
&default_meter_provider,
269+
SERVICE_NAME,
270+
Some("unknown_service"),
271+
);
272+
assert_telemetry_resource(&default_meter_provider);
273+
});
245274

246275
// If user provided a resource, use that.
247276
let reader2 = TestMetricReader::new();
248277
let custom_meter_provider = super::SdkMeterProvider::builder()
249278
.with_reader(reader2)
250279
.with_resource(Resource::new(vec![KeyValue::new(
251-
"service.name",
280+
SERVICE_NAME,
252281
"test_service",
253282
)]))
254283
.build();
255-
assert_service_name(custom_meter_provider, Some("test_service"));
284+
assert_resource(&custom_meter_provider, SERVICE_NAME, Some("test_service"));
285+
assert_eq!(custom_meter_provider.pipes.0[0].resource.len(), 1);
256286

257287
temp_env::with_var(
258288
"OTEL_RESOURCE_ATTRIBUTES",
@@ -263,17 +293,15 @@ mod tests {
263293
let env_resource_provider = super::SdkMeterProvider::builder()
264294
.with_reader(reader3)
265295
.build();
266-
assert_eq!(
267-
env_resource_provider.pipes.0[0].resource,
268-
Resource::new(vec![
269-
KeyValue::new("telemetry.sdk.name", "opentelemetry"),
270-
KeyValue::new("telemetry.sdk.version", env!("CARGO_PKG_VERSION")),
271-
KeyValue::new("telemetry.sdk.language", "rust"),
272-
KeyValue::new("key1", "value1"),
273-
KeyValue::new("k3", "value2"),
274-
KeyValue::new("service.name", "unknown_service"),
275-
])
296+
assert_resource(
297+
&env_resource_provider,
298+
SERVICE_NAME,
299+
Some("unknown_service"),
276300
);
301+
assert_resource(&env_resource_provider, "key1", Some("value1"));
302+
assert_resource(&env_resource_provider, "k3", Some("value2"));
303+
assert_telemetry_resource(&env_resource_provider);
304+
assert_eq!(env_resource_provider.pipes.0[0].resource.len(), 6);
277305
},
278306
);
279307

@@ -287,18 +315,35 @@ mod tests {
287315
.with_reader(reader4)
288316
.with_resource(Resource::default().merge(&mut Resource::new(vec![
289317
KeyValue::new("my-custom-key", "my-custom-value"),
318+
KeyValue::new("my-custom-key2", "my-custom-value2"),
290319
])))
291320
.build();
321+
assert_resource(
322+
&user_provided_resource_config_provider,
323+
SERVICE_NAME,
324+
Some("unknown_service"),
325+
);
326+
assert_resource(
327+
&user_provided_resource_config_provider,
328+
"my-custom-key",
329+
Some("my-custom-value"),
330+
);
331+
assert_resource(
332+
&user_provided_resource_config_provider,
333+
"my-custom-key2",
334+
Some("my-custom-value2"),
335+
);
336+
assert_resource(
337+
&user_provided_resource_config_provider,
338+
"k2",
339+
Some("value2"),
340+
);
341+
assert_telemetry_resource(&user_provided_resource_config_provider);
292342
assert_eq!(
293-
user_provided_resource_config_provider.pipes.0[0].resource,
294-
Resource::new(vec![
295-
KeyValue::new("telemetry.sdk.name", "opentelemetry"),
296-
KeyValue::new("telemetry.sdk.version", env!("CARGO_PKG_VERSION")),
297-
KeyValue::new("telemetry.sdk.language", "rust"),
298-
KeyValue::new("my-custom-key", "my-custom-value"),
299-
KeyValue::new("k2", "value2"),
300-
KeyValue::new("service.name", "unknown_service"),
301-
])
343+
user_provided_resource_config_provider.pipes.0[0]
344+
.resource
345+
.len(),
346+
7
302347
);
303348
},
304349
);
@@ -310,7 +355,7 @@ mod tests {
310355
.with_resource(Resource::empty())
311356
.build();
312357

313-
assert_service_name(no_service_name, None);
358+
assert_eq!(no_service_name.pipes.0[0].resource.len(), 0)
314359
}
315360

316361
#[test]

opentelemetry-sdk/src/trace/id_generator/aws.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::time::{Duration, UNIX_EPOCH};
2626
/// use opentelemetry_sdk::trace::{self, TracerProvider, XrayIdGenerator};
2727
///
2828
/// let _provider: TracerProvider = TracerProvider::builder()
29-
/// .with_config(trace::config().with_id_generator(XrayIdGenerator::default()))
29+
/// .with_config(trace::Config::default().with_id_generator(XrayIdGenerator::default()))
3030
/// .build();
3131
/// ```
3232
///

opentelemetry-sdk/src/trace/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ mod tests {
244244
fn trace_state_for_dropped_sampler() {
245245
let exporter = InMemorySpanExporterBuilder::new().build();
246246
let provider = TracerProvider::builder()
247-
.with_config(config().with_sampler(Sampler::AlwaysOff))
247+
.with_config(Config::default().with_sampler(Sampler::AlwaysOff))
248248
.with_span_processor(SimpleSpanProcessor::new(Box::new(exporter.clone())))
249249
.build();
250250

@@ -297,7 +297,7 @@ mod tests {
297297
fn trace_state_for_record_only_sampler() {
298298
let exporter = InMemorySpanExporterBuilder::new().build();
299299
let provider = TracerProvider::builder()
300-
.with_config(config().with_sampler(TestRecordOnlySampler::default()))
300+
.with_config(Config::default().with_sampler(TestRecordOnlySampler::default()))
301301
.with_span_processor(SimpleSpanProcessor::new(Box::new(exporter.clone())))
302302
.build();
303303

0 commit comments

Comments
 (0)