Skip to content

Commit f3e57db

Browse files
authored
Merge branch 'main' into batch-span-processor-dedicated-thread
2 parents b15b124 + 80629c8 commit f3e57db

File tree

17 files changed

+266
-82
lines changed

17 files changed

+266
-82
lines changed

examples/tracing-grpc/src/client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn init_tracer() -> sdktrace::TracerProvider {
2222

2323
struct MetadataMap<'a>(&'a mut tonic::metadata::MetadataMap);
2424

25-
impl<'a> Injector for MetadataMap<'a> {
25+
impl Injector for MetadataMap<'_> {
2626
/// Set a key and value in the MetadataMap. Does nothing if the key or value are not valid inputs
2727
fn set(&mut self, key: &str, value: String) {
2828
if let Ok(key) = tonic::metadata::MetadataKey::from_bytes(key.as_bytes()) {

examples/tracing-grpc/src/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub mod hello_world {
2929

3030
struct MetadataMap<'a>(&'a tonic::metadata::MetadataMap);
3131

32-
impl<'a> Extractor for MetadataMap<'a> {
32+
impl Extractor for MetadataMap<'_> {
3333
/// Get a value for a key from the MetadataMap. If the value can't be converted to &str, returns None
3434
fn get(&self, key: &str) -> Option<&str> {
3535
self.0.get(key).and_then(|metadata| metadata.to_str().ok())

opentelemetry-appender-log/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ mod any_value {
239239
pub(crate) fn serialize(value: log::kv::Value) -> Option<AnyValue> {
240240
struct ValueVisitor(Option<AnyValue>);
241241

242-
impl<'kvs> log::kv::VisitValue<'kvs> for ValueVisitor {
242+
impl log::kv::VisitValue<'_> for ValueVisitor {
243243
fn visit_any(&mut self, value: log::kv::Value) -> Result<(), log::kv::Error> {
244244
self.0 = Some(AnyValue::String(StringValue::from(value.to_string())));
245245

opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ license = "Apache-2.0"
66
publish = false
77

88
[features]
9-
default = ["reqwest", "experimental_metrics_periodicreader_with_async_runtime"]
10-
reqwest = ["opentelemetry-otlp/reqwest-client"]
9+
default = ["reqwest-blocking"]
10+
reqwest-blocking = ["opentelemetry-otlp/reqwest-blocking-client"]
1111
hyper = ["opentelemetry-otlp/hyper-client"]
12-
experimental_metrics_periodicreader_with_async_runtime = ["opentelemetry_sdk/experimental_metrics_periodicreader_with_async_runtime"]
13-
1412

1513
[dependencies]
1614
once_cell = { workspace = true }

opentelemetry-otlp/examples/basic-otlp-http/README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@ applications, these filters should be adjusted appropriately.
1313

1414
The example employs a `BatchExporter` for logs and traces, which is the
1515
recommended approach when using OTLP exporters. While it can be modified to use
16-
a `SimpleExporter`, this requires enabling feature flag `reqwest-blocking-client` and
17-
making the `main()` a normal main and *not* `tokio::main`
16+
a `SimpleExporter`, this requires making the main function a regular main and
17+
*not* tokio main.
1818

19-
// TODO: Metrics does not work with non tokio main when using `reqwest-blocking-client` today, fix that when switching
20-
// default to use own thread.
2119
// TODO: Document `hyper` feature flag when using SimpleProcessor.
2220

2321
## Usage

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

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use opentelemetry_otlp::{LogExporter, MetricExporter, Protocol, SpanExporter};
1111
use opentelemetry_sdk::{
1212
logs::LoggerProvider,
1313
metrics::{MetricError, SdkMeterProvider},
14-
runtime,
1514
trace::{self as sdktrace, TracerProvider},
1615
};
1716
use opentelemetry_sdk::{
@@ -50,7 +49,9 @@ fn init_traces() -> Result<sdktrace::TracerProvider, TraceError> {
5049
.build()?;
5150

5251
Ok(TracerProvider::builder()
53-
.with_batch_exporter(exporter, runtime::Tokio)
52+
// TODO: Enable BatchExporter after
53+
// https://github.com/open-telemetry/opentelemetry-rust/pull/2456
54+
.with_simple_exporter(exporter)
5455
.with_resource(RESOURCE.clone())
5556
.build())
5657
}
@@ -62,15 +63,6 @@ fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, Metric
6263
.with_endpoint("http://localhost:4318/v1/metrics")
6364
.build()?;
6465

65-
#[cfg(feature = "experimental_metrics_periodicreader_with_async_runtime")]
66-
let reader =
67-
opentelemetry_sdk::metrics::periodic_reader_with_async_runtime::PeriodicReader::builder(
68-
exporter,
69-
runtime::Tokio,
70-
)
71-
.build();
72-
// TODO: This does not work today. See https://github.com/open-telemetry/opentelemetry-rust/issues/2400
73-
#[cfg(not(feature = "experimental_metrics_periodicreader_with_async_runtime"))]
7466
let reader = opentelemetry_sdk::metrics::PeriodicReader::builder(exporter).build();
7567

7668
Ok(SdkMeterProvider::builder()
@@ -79,8 +71,10 @@ fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, Metric
7971
.build())
8072
}
8173

82-
#[tokio::main]
83-
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
74+
// #[tokio::main]
75+
// TODO: Re-enable tokio::main, if needed, after
76+
// https://github.com/open-telemetry/opentelemetry-rust/pull/2456
77+
fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
8478
let logger_provider = init_logs()?;
8579

8680
// Create a new OpenTelemetryTracingBridge using the above LoggerProvider.

opentelemetry-otlp/tests/integration_test/src/logs_asserter.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use anyhow::Result;
12
use opentelemetry_proto::tonic::logs::v1::{LogRecord, LogsData, ResourceLogs};
23
use std::fs::File;
34

@@ -96,9 +97,9 @@ impl std::fmt::Debug for LogRecordWrapper {
9697
}
9798

9899
// read a file contains ResourceSpans in json format
99-
pub fn read_logs_from_json(file: File) -> Vec<ResourceLogs> {
100+
pub fn read_logs_from_json(file: File) -> Result<Vec<ResourceLogs>> {
100101
let reader = std::io::BufReader::new(file);
101102

102-
let log_data: LogsData = serde_json::from_reader(reader).unwrap();
103-
log_data.resource_logs
103+
let log_data: LogsData = serde_json::from_reader(reader)?;
104+
Ok(log_data.resource_logs)
104105
}

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

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,33 @@ fn init_logs() -> Result<sdklogs::LoggerProvider> {
3838
mod logtests {
3939
use super::*;
4040
use integration_test_runner::logs_asserter::{read_logs_from_json, LogsAsserter};
41+
use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge;
4142
use std::{fs::File, time::Duration};
43+
use tracing::info;
44+
use tracing_subscriber::layer::SubscriberExt;
45+
4246
#[test]
4347
#[should_panic(expected = "assertion `left == right` failed: body does not match")]
4448
pub fn test_assert_logs_eq_failure() {
45-
let left = read_logs_from_json(File::open("./expected/logs.json").unwrap());
46-
let right = read_logs_from_json(File::open("./expected/failed_logs.json").unwrap());
49+
let left = read_logs_from_json(
50+
File::open("./expected/logs.json").expect("failed to open expected file"),
51+
)
52+
.expect("Failed to read logs from expected file");
53+
54+
let right = read_logs_from_json(
55+
File::open("./expected/failed_logs.json")
56+
.expect("failed to open expected failed log file"),
57+
)
58+
.expect("Failed to read logs from expected failed log file");
4759
LogsAsserter::new(right, left).assert();
4860
}
4961

5062
#[test]
51-
pub fn test_assert_logs_eq() {
52-
let logs = read_logs_from_json(File::open("./expected/logs.json").unwrap());
63+
pub fn test_assert_logs_eq() -> Result<()> {
64+
let logs = read_logs_from_json(File::open("./expected/logs.json")?)?;
5365
LogsAsserter::new(logs.clone(), logs).assert();
66+
67+
Ok(())
5468
}
5569

5670
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
@@ -84,15 +98,44 @@ mod logtests {
8498

8599
Ok(())
86100
}
101+
102+
#[test]
103+
#[cfg(any(feature = "tonic-client", feature = "reqwest-blocking-client"))]
104+
pub fn logs_batch_non_tokio_main() -> Result<()> {
105+
// Initialize the logger provider inside a tokio runtime
106+
// as this allows tonic client to capture the runtime,
107+
// but actual export occurs from the dedicated std::thread
108+
// created by BatchLogProcessor.
109+
let rt = tokio::runtime::Runtime::new()?;
110+
let logger_provider = rt.block_on(async {
111+
// While we're here setup our collector container too, as this needs tokio to run
112+
test_utils::start_collector_container().await?;
113+
init_logs()
114+
})?;
115+
116+
info!("LoggerProvider created");
117+
let layer = OpenTelemetryTracingBridge::new(&logger_provider);
118+
let subscriber = tracing_subscriber::registry().with(layer);
119+
{
120+
let _guard = tracing::subscriber::set_default(subscriber);
121+
info!(target: "my-target", "hello from {}. My price is {}.", "banana", 2.99);
122+
}
123+
let _ = logger_provider.shutdown();
124+
// tokio::time::sleep(Duration::from_secs(10)).await;
125+
assert_logs_results(test_utils::LOGS_FILE, "expected/logs.json");
126+
127+
Ok(())
128+
}
87129
}
88130

89-
pub fn assert_logs_results(result: &str, expected: &str) {
90-
let left = read_logs_from_json(File::open(expected).unwrap());
91-
let right = read_logs_from_json(File::open(result).unwrap());
131+
pub fn assert_logs_results(result: &str, expected: &str) -> Result<()> {
132+
let left = read_logs_from_json(File::open(expected)?)?;
133+
let right = read_logs_from_json(File::open(result)?)?;
92134

93135
LogsAsserter::new(left, right).assert();
94136

95-
assert!(File::open(result).unwrap().metadata().unwrap().size() > 0)
137+
assert!(File::open(result).unwrap().metadata().unwrap().size() > 0);
138+
Ok(())
96139
}
97140

98141
///

opentelemetry-sdk/CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@
9292
`experimental_metrics_periodicreader_with_async_runtime`.
9393
- Continue enabling one of the async runtime feature flags: `rt-tokio`,
9494
`rt-tokio-current-thread`, or `rt-async-std`.
95-
95+
96+
Feature flag "experimental_metrics_periodic_reader_no_runtime" is removed as the PeriodicReader
97+
offered under that feature flag is now the default.
98+
9699
- Bump msrv to 1.75.0.
97100

98101
- *Breaking* : [#2314](https://github.com/open-telemetry/opentelemetry-rust/pull/2314)

opentelemetry-sdk/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ rt-tokio = ["tokio", "tokio-stream"]
5353
rt-tokio-current-thread = ["tokio", "tokio-stream"]
5454
rt-async-std = ["async-std"]
5555
internal-logs = ["tracing"]
56-
experimental_metrics_periodic_reader_no_runtime = ["metrics"]
5756
experimental_metrics_periodicreader_with_async_runtime = ["metrics"]
5857
spec_unstable_metrics_views = ["metrics"]
5958
experimental_logs_batch_log_processor_with_async_runtime = ["logs"]

0 commit comments

Comments
 (0)