Skip to content

Commit 9e50f84

Browse files
authored
Merge branch 'main' into cijothomas/release-may-2024
2 parents da4d9c7 + de3147a commit 9e50f84

File tree

10 files changed

+78
-25
lines changed

10 files changed

+78
-25
lines changed

examples/metrics-advanced/src/main.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use opentelemetry_sdk::metrics::{
88
use opentelemetry_sdk::{runtime, Resource};
99
use std::error::Error;
1010

11-
fn init_meter_provider() {
11+
fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
1212
// for example 1
1313
let my_view_rename_and_unit = |i: &Instrument| {
1414
if i.name == "my_histogram" {
@@ -61,12 +61,13 @@ fn init_meter_provider() {
6161
.with_view(my_view_drop_attributes)
6262
.with_view(my_view_change_aggregation)
6363
.build();
64-
global::set_meter_provider(provider);
64+
global::set_meter_provider(provider.clone());
65+
provider
6566
}
6667

6768
#[tokio::main]
6869
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
69-
init_meter_provider();
70+
let meter_provider = init_meter_provider();
7071
let meter = global::meter("mylibraryname");
7172

7273
// Example 1 - Rename metric using View.
@@ -153,6 +154,6 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
153154
// Metrics are exported by default every 30 seconds when using stdout exporter,
154155
// however shutting down the MeterProvider here instantly flushes
155156
// the metrics, instead of waiting for the 30 sec interval.
156-
global::shutdown_meter_provider();
157+
meter_provider.shutdown()?;
157158
Ok(())
158159
}

examples/metrics-basic/src/main.rs

-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
138138
// Metrics are exported by default every 30 seconds when using stdout exporter,
139139
// however shutting down the MeterProvider here instantly flushes
140140
// the metrics, instead of waiting for the 30 sec interval.
141-
// global::shutdown_meter_provider();
142141
meter_provider.shutdown()?;
143142
Ok(())
144143
}

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

+8-3
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
4444
.install_batch(opentelemetry_sdk::runtime::Tokio)
4545
}
4646

47-
fn init_metrics() -> Result<(), MetricsError> {
47+
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
4848
let export_config = opentelemetry_otlp::ExportConfig {
4949
endpoint: "http://localhost:4318/v1/metrics".to_string(),
5050
..opentelemetry_otlp::ExportConfig::default()
@@ -57,7 +57,10 @@ fn init_metrics() -> Result<(), MetricsError> {
5757
.with_export_config(export_config),
5858
)
5959
.build();
60-
provider.map(|_| ())
60+
match provider {
61+
Ok(provider) => Ok(provider),
62+
Err(err) => Err(err),
63+
}
6164
}
6265

6366
const LEMONS_KEY: Key = Key::from_static_str("ex.com/lemons");
@@ -88,6 +91,8 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
8891
result.err()
8992
);
9093

94+
let meter_provider = result.unwrap();
95+
9196
// Opentelemetry will not provide a global API to manage the logger provider. Application users must manage the lifecycle of the logger provider on their own. Dropping logger providers will disable log emitting.
9297
let logger_provider = init_logs().unwrap();
9398

@@ -120,7 +125,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
120125

121126
global::shutdown_tracer_provider();
122127
logger_provider.shutdown();
123-
global::shutdown_meter_provider();
128+
meter_provider.shutdown()?;
124129

125130
Ok(())
126131
}

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

+5-4
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
3131
.install_batch(runtime::Tokio)
3232
}
3333

34-
fn init_metrics() -> Result<(), MetricsError> {
34+
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
3535
let export_config = ExportConfig {
3636
endpoint: "http://localhost:4317".to_string(),
3737
..ExportConfig::default()
@@ -49,7 +49,7 @@ fn init_metrics() -> Result<(), MetricsError> {
4949
)]))
5050
.build();
5151
match provider {
52-
Ok(_provider) => Ok(()),
52+
Ok(provider) => Ok(provider),
5353
Err(err) => Err(err),
5454
}
5555
}
@@ -103,8 +103,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
103103
"Init metrics failed with error: {:?}",
104104
result.err()
105105
);
106+
let meter_provider = result.unwrap();
106107

107-
// Initialize logs, which sets the global loggerprovider.
108+
// Initialize logs and save the logger_provider.
108109
let logger_provider = init_logs().unwrap();
109110

110111
// Create a new OpenTelemetryLogBridge using the above LoggerProvider.
@@ -148,7 +149,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
148149

149150
global::shutdown_tracer_provider();
150151
logger_provider.shutdown();
151-
global::shutdown_meter_provider();
152+
meter_provider.shutdown()?;
152153

153154
Ok(())
154155
}

opentelemetry-sdk/src/logs/mod.rs

+32-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ mod tests {
2020
use opentelemetry::logs::LogRecord;
2121
use opentelemetry::logs::{Logger, LoggerProvider as _, Severity};
2222
use opentelemetry::{logs::AnyValue, Key, KeyValue};
23+
use std::collections::HashMap;
2324

2425
#[test]
2526
fn logging_sdk_test() {
@@ -34,10 +35,32 @@ mod tests {
3435
let mut log_record = logger.create_log_record();
3536
log_record.set_severity_number(Severity::Error);
3637
log_record.set_severity_text("Error".into());
38+
39+
// Adding attributes using a vector with explicitly constructed Key and AnyValue objects.
3740
log_record.add_attributes(vec![
38-
(Key::new("key1"), "value1".into()),
39-
(Key::new("key2"), "value2".into()),
41+
(Key::new("key1"), AnyValue::from("value1")),
42+
(Key::new("key2"), AnyValue::from("value2")),
43+
]);
44+
45+
// Adding attributes using an array with explicitly constructed Key and AnyValue objects.
46+
log_record.add_attributes([
47+
(Key::new("key3"), AnyValue::from("value3")),
48+
(Key::new("key4"), AnyValue::from("value4")),
4049
]);
50+
51+
// Adding attributes using a vector with tuple auto-conversion to Key and AnyValue.
52+
log_record.add_attributes(vec![("key5", "value5"), ("key6", "value6")]);
53+
54+
// Adding attributes using an array with tuple auto-conversion to Key and AnyValue.
55+
log_record.add_attributes([("key7", "value7"), ("key8", "value8")]);
56+
57+
// Adding Attributes from a HashMap
58+
let mut attributes_map = HashMap::new();
59+
attributes_map.insert("key9", "value9");
60+
attributes_map.insert("key10", "value10");
61+
62+
log_record.add_attributes(attributes_map);
63+
4164
logger.emit(log_record);
4265

4366
// Assert
@@ -55,7 +78,13 @@ mod tests {
5578
.attributes
5679
.clone()
5780
.expect("Attributes are expected");
58-
assert_eq!(attributes.len(), 2);
81+
assert_eq!(attributes.len(), 10);
82+
for i in 1..=10 {
83+
assert!(log.record.attributes.clone().unwrap().contains(&(
84+
Key::new(format!("key{}", i)),
85+
AnyValue::String(format!("value{}", i).into())
86+
)));
87+
}
5988
}
6089

6190
#[test]

opentelemetry-sdk/src/logs/record.rs

+9-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,15 @@ impl opentelemetry::logs::LogRecord for LogRecord {
6262
self.body = Some(body);
6363
}
6464

65-
fn add_attributes(&mut self, attributes: Vec<(Key, AnyValue)>) {
66-
self.attributes = Some(attributes);
65+
fn add_attributes<I, K, V>(&mut self, attributes: I)
66+
where
67+
I: IntoIterator<Item = (K, V)>,
68+
K: Into<Key>,
69+
V: Into<AnyValue>,
70+
{
71+
for (key, value) in attributes.into_iter() {
72+
self.add_attribute(key, value);
73+
}
6774
}
6875

6976
fn add_attribute<K, V>(&mut self, key: K, value: V)

opentelemetry-sdk/src/metrics/meter_provider.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -397,13 +397,13 @@ mod tests {
397397
let provider = super::SdkMeterProvider::builder()
398398
.with_reader(reader.clone())
399399
.build();
400-
global::set_meter_provider(provider);
400+
global::set_meter_provider(provider.clone());
401401
assert!(!reader.is_shutdown());
402402
// create a meter and an instrument
403403
let meter = global::meter("test");
404404
let counter = meter.u64_counter("test_counter").init();
405405
// no need to drop a meter for meter_provider shutdown
406-
global::shutdown_meter_provider();
406+
provider.shutdown().unwrap();
407407
assert!(reader.is_shutdown());
408408
// TODO Fix: the instrument is still available, and can be used.
409409
// While the reader is shutdown, and no collect is happening

opentelemetry-stdout/examples/basic.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ fn init_trace() {
2424
}
2525

2626
#[cfg(feature = "metrics")]
27-
fn init_metrics() {
27+
fn init_metrics() -> opentelemetry_sdk::metrics::SdkMeterProvider {
2828
let exporter = opentelemetry_stdout::MetricsExporter::default();
2929
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
3030
let provider = SdkMeterProvider::builder().with_reader(reader).build();
31-
global::set_meter_provider(provider);
31+
global::set_meter_provider(provider.clone());
32+
provider
3233
}
3334

3435
#[cfg(feature = "logs")]
@@ -77,7 +78,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
7778
init_trace();
7879

7980
#[cfg(feature = "metrics")]
80-
init_metrics();
81+
let meter_provider = init_metrics();
8182

8283
#[cfg(feature = "logs")]
8384
let logger_provider = init_logs();
@@ -103,7 +104,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
103104
global::shutdown_tracer_provider();
104105

105106
#[cfg(feature = "metrics")]
106-
global::shutdown_meter_provider();
107+
meter_provider.shutdown()?;
107108

108109
#[cfg(feature = "logs")]
109110
drop(logger_provider);

opentelemetry/src/logs/noop.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,13 @@ impl LogRecord for NoopLogRecord {
5757
#[inline]
5858
fn set_body(&mut self, _body: AnyValue) {}
5959
#[inline]
60-
fn add_attributes(&mut self, _attributes: Vec<(Key, AnyValue)>) {}
60+
fn add_attributes<I, K, V>(&mut self, _attributes: I)
61+
where
62+
I: IntoIterator<Item = (K, V)>,
63+
K: Into<Key>,
64+
V: Into<AnyValue>,
65+
{
66+
}
6167
#[inline]
6268
fn add_attribute<K, V>(&mut self, _key: K, _value: V)
6369
where

opentelemetry/src/logs/record.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ pub trait LogRecord {
2626
fn set_body(&mut self, body: AnyValue);
2727

2828
/// Adds multiple attributes.
29-
fn add_attributes(&mut self, attributes: Vec<(Key, AnyValue)>);
29+
fn add_attributes<I, K, V>(&mut self, attributes: I)
30+
where
31+
I: IntoIterator<Item = (K, V)>,
32+
K: Into<Key>,
33+
V: Into<AnyValue>;
3034

3135
/// Adds a single attribute.
3236
fn add_attribute<K, V>(&mut self, key: K, value: V)

0 commit comments

Comments
 (0)