Skip to content

Commit 0742311

Browse files
authored
Merge branch 'main' into cijothomas/meter-tests-1
2 parents 84331bc + 19d3223 commit 0742311

File tree

24 files changed

+612
-512
lines changed

24 files changed

+612
-512
lines changed

examples/metrics-basic/src/main.rs

+43-52
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,21 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
4343
);
4444

4545
// Create a ObservableCounter instrument and register a callback that reports the measurement.
46-
let observable_counter = meter
46+
let _observable_counter = meter
4747
.u64_observable_counter("my_observable_counter")
4848
.with_description("My observable counter example description")
4949
.with_unit(Unit::new("myunit"))
50+
.with_callback(|observer| {
51+
observer.observe(
52+
100,
53+
&[
54+
KeyValue::new("mykey1", "myvalue1"),
55+
KeyValue::new("mykey2", "myvalue2"),
56+
],
57+
)
58+
})
5059
.init();
5160

52-
meter.register_callback(&[observable_counter.as_any()], move |observer| {
53-
observer.observe_u64(
54-
&observable_counter,
55-
100,
56-
&[
57-
KeyValue::new("mykey1", "myvalue1"),
58-
KeyValue::new("mykey2", "myvalue2"),
59-
],
60-
)
61-
})?;
62-
6361
// Create a UpCounter Instrument.
6462
let updown_counter = meter.i64_up_down_counter("my_updown_counter").init();
6563

@@ -73,23 +71,21 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
7371
);
7472

7573
// Create a Observable UpDownCounter instrument and register a callback that reports the measurement.
76-
let observable_up_down_counter = meter
74+
let _observable_up_down_counter = meter
7775
.i64_observable_up_down_counter("my_observable_updown_counter")
7876
.with_description("My observable updown counter example description")
7977
.with_unit(Unit::new("myunit"))
78+
.with_callback(|observer| {
79+
observer.observe(
80+
100,
81+
&[
82+
KeyValue::new("mykey1", "myvalue1"),
83+
KeyValue::new("mykey2", "myvalue2"),
84+
],
85+
)
86+
})
8087
.init();
8188

82-
meter.register_callback(&[observable_up_down_counter.as_any()], move |observer| {
83-
observer.observe_i64(
84-
&observable_up_down_counter,
85-
100,
86-
&[
87-
KeyValue::new("mykey1", "myvalue1"),
88-
KeyValue::new("mykey2", "myvalue2"),
89-
],
90-
)
91-
})?;
92-
9389
// Create a Histogram Instrument.
9490
let histogram = meter
9591
.f64_histogram("my_histogram")
@@ -108,41 +104,36 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
108104
// Note that there is no ObservableHistogram instrument.
109105

110106
// Create a Gauge Instrument.
111-
{
112-
let gauge = meter
113-
.f64_gauge("my_gauge")
114-
.with_description("A gauge set to 1.0")
115-
.with_unit(Unit::new("myunit"))
116-
.init();
117-
118-
gauge.record(
119-
1.0,
120-
&[
121-
KeyValue::new("mykey1", "myvalue1"),
122-
KeyValue::new("mykey2", "myvalue2"),
123-
],
124-
);
125-
}
107+
let gauge = meter
108+
.f64_gauge("my_gauge")
109+
.with_description("A gauge set to 1.0")
110+
.with_unit(Unit::new("myunit"))
111+
.init();
112+
113+
gauge.record(
114+
1.0,
115+
&[
116+
KeyValue::new("mykey1", "myvalue1"),
117+
KeyValue::new("mykey2", "myvalue2"),
118+
],
119+
);
126120

127121
// Create a ObservableGauge instrument and register a callback that reports the measurement.
128-
let observable_gauge = meter
122+
let _observable_gauge = meter
129123
.f64_observable_gauge("my_observable_gauge")
130124
.with_description("An observable gauge set to 1.0")
131125
.with_unit(Unit::new("myunit"))
126+
.with_callback(|observer| {
127+
observer.observe(
128+
1.0,
129+
&[
130+
KeyValue::new("mykey1", "myvalue1"),
131+
KeyValue::new("mykey2", "myvalue2"),
132+
],
133+
)
134+
})
132135
.init();
133136

134-
// Register a callback that reports the measurement.
135-
meter.register_callback(&[observable_gauge.as_any()], move |observer| {
136-
observer.observe_f64(
137-
&observable_gauge,
138-
1.0,
139-
&[
140-
KeyValue::new("mykey1", "myvalue1"),
141-
KeyValue::new("mykey2", "myvalue2"),
142-
],
143-
)
144-
})?;
145-
146137
// Metrics are exported by default every 30 seconds when using stdout exporter,
147138
// however shutting down the MeterProvider here instantly flushes
148139
// the metrics, instead of waiting for the 30 sec interval.

opentelemetry-appender-log/src/lib.rs

+8-11
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
9797
use log::{Level, Metadata, Record};
9898
use opentelemetry::{
99-
logs::{AnyValue, LogRecordBuilder, Logger, LoggerProvider, Severity},
99+
logs::{AnyValue, LogRecord, Logger, LoggerProvider, Severity},
100100
Key,
101101
};
102102
use std::borrow::Cow;
@@ -126,16 +126,13 @@ where
126126

127127
fn log(&self, record: &Record) {
128128
if self.enabled(record.metadata()) {
129-
self.logger.emit(
130-
LogRecordBuilder::new()
131-
.with_severity_number(severity_of_level(record.level()))
132-
.with_severity_text(record.level().as_str())
133-
// Not populating ObservedTimestamp, instead relying on OpenTelemetry
134-
// API to populate it with current time.
135-
.with_body(AnyValue::from(record.args().to_string()))
136-
.with_attributes(log_attributes(record.key_values()))
137-
.build(),
138-
);
129+
let mut log_record = self.logger.create_log_record();
130+
log_record.set_severity_number(severity_of_level(record.level()));
131+
log_record.set_severity_text(record.level().as_str().into());
132+
log_record.set_body(AnyValue::from(record.args().to_string()));
133+
log_record.add_attributes(log_attributes(record.key_values()));
134+
135+
self.logger.emit(log_record);
139136
}
140137
}
141138

opentelemetry-appender-tracing/src/layer.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ impl EventVisitor {
7171
}
7272
}
7373

74-
fn push_to_otel_log_record(self, log_record: &mut LogRecord) {
75-
log_record.body = self.log_record_body;
76-
log_record.attributes = Some(self.log_record_attributes);
74+
fn push_to_otel_log_record<LR: LogRecord>(self, log_record: &mut LR) {
75+
if let Some(body) = self.log_record_body {
76+
log_record.set_body(body);
77+
}
78+
log_record.add_attributes(self.log_record_attributes);
7779
}
7880
}
7981

@@ -166,12 +168,10 @@ where
166168
#[cfg(not(feature = "experimental_metadata_attributes"))]
167169
let meta = event.metadata();
168170

169-
let mut log_record: LogRecord = LogRecord::default();
170-
log_record.severity_number = Some(severity_of_level(meta.level()));
171-
log_record.severity_text = Some(meta.level().to_string().into());
172-
173-
// Not populating ObservedTimestamp, instead relying on OpenTelemetry
174-
// API to populate it with current time.
171+
//let mut log_record: LogRecord = LogRecord::default();
172+
let mut log_record = self.logger.create_log_record();
173+
log_record.set_severity_number(severity_of_level(meta.level()));
174+
log_record.set_severity_text(meta.level().to_string().into());
175175

176176
let mut visitor = EventVisitor::default();
177177
visitor.visit_metadata(meta);

opentelemetry-otlp/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
### Fixed
66

77
- URL encoded values in `OTEL_EXPORTER_OTLP_HEADERS` are now correctly decoded. [#1578](https://github.com/open-telemetry/opentelemetry-rust/pull/1578)
8+
- OTLP exporter will not change the URL added through `ExportConfig` [#1706](https://github.com/open-telemetry/opentelemetry-rust/pull/1706)
9+
- Default grpc endpoint will not have path based on signal(e.g `/v1/traces`) [#1706](https://github.com/open-telemetry/opentelemetry-rust/pull/1706)
810

911
### Added
1012

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

+2-5
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,12 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
115115
let tracer = global::tracer("ex.com/basic");
116116
let meter = global::meter("ex.com/basic");
117117

118-
let gauge = meter
118+
let _gauge = meter
119119
.f64_observable_gauge("ex.com.one")
120120
.with_description("A gauge set to 1.0")
121+
.with_callback(|observer| observer.observe(1.0, COMMON_ATTRIBUTES.as_ref()))
121122
.init();
122123

123-
meter.register_callback(&[gauge.as_any()], move |observer| {
124-
observer.observe_f64(&gauge, 1.0, COMMON_ATTRIBUTES.as_ref())
125-
})?;
126-
127124
let histogram = meter.f64_histogram("ex.com.two").init();
128125
histogram.record(5.5, COMMON_ATTRIBUTES.as_ref());
129126

opentelemetry-otlp/src/exporter/http/mod.rs

+65-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use super::{default_headers, default_protocol, parse_header_string};
1+
use super::{
2+
default_headers, default_protocol, parse_header_string,
3+
OTEL_EXPORTER_OTLP_HTTP_ENDPOINT_DEFAULT,
4+
};
25
use crate::{
36
ExportConfig, Protocol, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_HEADERS,
47
OTEL_EXPORTER_OTLP_TIMEOUT,
@@ -150,7 +153,7 @@ impl HttpExporterBuilder {
150153
signal_timeout_var: &str,
151154
signal_http_headers_var: &str,
152155
) -> Result<OtlpHttpClient, crate::Error> {
153-
let endpoint = resolve_endpoint(
156+
let endpoint = resolve_http_endpoint(
154157
signal_endpoint_var,
155158
signal_endpoint_path,
156159
self.exporter_config.endpoint.as_str(),
@@ -373,10 +376,10 @@ fn build_endpoint_uri(endpoint: &str, path: &str) -> Result<Uri, crate::Error> {
373376
}
374377

375378
// see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#endpoint-urls-for-otlphttp
376-
fn resolve_endpoint(
379+
fn resolve_http_endpoint(
377380
signal_endpoint_var: &str,
378381
signal_endpoint_path: &str,
379-
provided_or_default_endpoint: &str,
382+
provided_endpoint: &str,
380383
) -> Result<Uri, crate::Error> {
381384
// per signal env var is not modified
382385
if let Some(endpoint) = env::var(signal_endpoint_var)
@@ -394,8 +397,14 @@ fn resolve_endpoint(
394397
return Ok(endpoint);
395398
}
396399

397-
// if neither works, we use the one provided in pipeline. If user never provides one, we will use the default one
398-
build_endpoint_uri(provided_or_default_endpoint, signal_endpoint_path)
400+
if provided_endpoint.is_empty() {
401+
build_endpoint_uri(
402+
OTEL_EXPORTER_OTLP_HTTP_ENDPOINT_DEFAULT,
403+
signal_endpoint_path,
404+
)
405+
} else {
406+
provided_endpoint.parse().map_err(From::from)
407+
}
399408
}
400409

401410
#[allow(clippy::mutable_key_type)] // http headers are not mutated
@@ -411,16 +420,19 @@ fn add_header_from_string(input: &str, headers: &mut HashMap<HeaderName, HeaderV
411420
#[cfg(test)]
412421
mod tests {
413422
use crate::exporter::tests::run_env_test;
414-
use crate::{OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_ENDPOINT};
423+
use crate::{
424+
new_exporter, WithExportConfig, OTEL_EXPORTER_OTLP_ENDPOINT,
425+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
426+
};
415427

416-
use super::build_endpoint_uri;
428+
use super::{build_endpoint_uri, resolve_http_endpoint};
417429

418430
#[test]
419431
fn test_append_signal_path_to_generic_env() {
420432
run_env_test(
421433
vec![(OTEL_EXPORTER_OTLP_ENDPOINT, "http://example.com")],
422434
|| {
423-
let endpoint = super::resolve_endpoint(
435+
let endpoint = resolve_http_endpoint(
424436
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
425437
"/v1/traces",
426438
"http://localhost:4317",
@@ -436,7 +448,7 @@ mod tests {
436448
run_env_test(
437449
vec![(OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, "http://example.com")],
438450
|| {
439-
let endpoint = super::resolve_endpoint(
451+
let endpoint = super::resolve_http_endpoint(
440452
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
441453
"/v1/traces",
442454
"http://localhost:4317",
@@ -455,7 +467,7 @@ mod tests {
455467
(OTEL_EXPORTER_OTLP_ENDPOINT, "http://wrong.com"),
456468
],
457469
|| {
458-
let endpoint = super::resolve_endpoint(
470+
let endpoint = super::resolve_http_endpoint(
459471
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
460472
"/v1/traces",
461473
"http://localhost:4317",
@@ -469,10 +481,13 @@ mod tests {
469481
#[test]
470482
fn test_use_provided_or_default_when_others_missing() {
471483
run_env_test(vec![], || {
472-
let endpoint =
473-
super::resolve_endpoint("NON_EXISTENT_VAR", "/v1/traces", "http://localhost:4317")
474-
.unwrap();
475-
assert_eq!(endpoint, "http://localhost:4317/v1/traces");
484+
let endpoint = super::resolve_http_endpoint(
485+
"NON_EXISTENT_VAR",
486+
"/v1/traces",
487+
"http://localhost:4317",
488+
)
489+
.unwrap();
490+
assert_eq!(endpoint, "http://localhost:4317/");
476491
});
477492
}
478493

@@ -501,7 +516,7 @@ mod tests {
501516
(OTEL_EXPORTER_OTLP_ENDPOINT, "http://example.com"),
502517
],
503518
|| {
504-
let endpoint = super::resolve_endpoint(
519+
let endpoint = super::resolve_http_endpoint(
505520
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
506521
"/v1/traces",
507522
"http://localhost:4317",
@@ -515,7 +530,7 @@ mod tests {
515530
#[test]
516531
fn test_all_invalid_urls_falls_back_to_error() {
517532
run_env_test(vec![], || {
518-
let result = super::resolve_endpoint(
533+
let result = super::resolve_http_endpoint(
519534
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
520535
"/v1/traces",
521536
"-*/*-/*-//-/-/yet-another-invalid-uri",
@@ -610,4 +625,37 @@ mod tests {
610625
}
611626
}
612627
}
628+
629+
#[test]
630+
fn test_http_exporter_endpoint() {
631+
// default endpoint should add signal path
632+
run_env_test(vec![], || {
633+
let exporter = new_exporter().http();
634+
635+
let url = resolve_http_endpoint(
636+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
637+
"/v1/traces",
638+
exporter.exporter_config.endpoint.as_str(),
639+
)
640+
.unwrap();
641+
642+
assert_eq!(url, "http://localhost:4318/v1/traces");
643+
});
644+
645+
// if builder endpoint is set, it should not add signal path
646+
run_env_test(vec![], || {
647+
let exporter = new_exporter()
648+
.http()
649+
.with_endpoint("http://localhost:4318/v1/tracesbutnotreally");
650+
651+
let url = resolve_http_endpoint(
652+
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
653+
"/v1/traces",
654+
exporter.exporter_config.endpoint.as_str(),
655+
)
656+
.unwrap();
657+
658+
assert_eq!(url, "http://localhost:4318/v1/tracesbutnotreally");
659+
});
660+
}
613661
}

0 commit comments

Comments
 (0)