diff --git a/.github/workflows/pr_naming.yml b/.github/workflows/pr_naming.yml new file mode 100644 index 0000000000..809955198d --- /dev/null +++ b/.github/workflows/pr_naming.yml @@ -0,0 +1,15 @@ +name: PR Conventional Commit Validation + +on: + pull_request: + types: [opened, synchronize, reopened, edited] + +jobs: + validate-pr-title: + runs-on: ubuntu-latest + steps: + - name: PR Conventional Commit Validation + uses: ytanikin/pr-conventional-commits@1.4.0 + with: + task_types: '["build","chore","ci","docs","feat","fix","perf","refactor","revert","test"]' + add_label: 'false' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 746e34806a..c3317b983d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,6 +78,11 @@ Open a pull request against the main [opentelemetry-rust](https://github.com/open-telemetry/opentelemetry-rust) repo. +Your pull request should be named according to the +[conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) standard. This ensures that +when the PR is squashed into `main`, the resulting commit message is consistent and makes it easier +for us to generate a changelog standard. + > **Note** > It is recommended to run [pre-commit script](scripts/precommit.sh) to catch any issues locally. diff --git a/Cargo.toml b/Cargo.toml index 717871ea14..2ff8573004 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,31 @@ tracing = { version = ">=0.1.40", default-features = false } tracing-core = { version = ">=0.1.33", default-features = false } tracing-subscriber = { version = "0.3", default-features = false } url = { version = "2.5", default-features = false } +anyhow = "1.0.94" +base64 = "0.22.1" +chrono = { version = "0.4.34", default-features = false } +ctor = "0.2.9" +ctrlc = "3.2.5" +futures-channel = "0.3" +futures-sink = "0.3" +glob = "0.3.1" +hex = "0.4.3" +lazy_static = "1.4.0" +num-format = "0.4.4" +num_cpus = "1.15.0" +opentelemetry-appender-tracing = { path = "opentelemetry-appender-tracing", default-features = false } +opentelemetry-otlp = { path = "opentelemetry-otlp" } +opentelemetry-stdout = { path = "opentelemetry-stdout" } +percent-encoding = "2.0" +rstest = "0.23.0" +schemars = "0.8" +sysinfo = "0.32" +tempfile = "3.3.0" +testcontainers = "0.23.1" +tracing-log = "0.2" +tracing-opentelemetry = "0.29" +typed-builder = "0.20" +uuid = "1.3" # Aviod use of crates.io version of these crates through the tracing-opentelemetry dependencies [patch.crates-io] diff --git a/examples/logs-basic/Cargo.toml b/examples/logs-basic/Cargo.toml index 275dbea8a3..669dba1500 100644 --- a/examples/logs-basic/Cargo.toml +++ b/examples/logs-basic/Cargo.toml @@ -7,7 +7,7 @@ publish = false [dependencies] opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["logs"] } -opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["logs"]} -opentelemetry-appender-tracing = { path = "../../opentelemetry-appender-tracing", default-features = false} +opentelemetry-stdout = { workspace = true, features = ["logs"] } +opentelemetry-appender-tracing = { workspace = true } tracing = { workspace = true, features = ["std"]} tracing-subscriber = { workspace = true, features = ["env-filter","registry", "std", "fmt"] } diff --git a/examples/metrics-advanced/Cargo.toml b/examples/metrics-advanced/Cargo.toml index 31cdf73a89..572a35762a 100644 --- a/examples/metrics-advanced/Cargo.toml +++ b/examples/metrics-advanced/Cargo.toml @@ -8,5 +8,5 @@ publish = false [dependencies] opentelemetry = { path = "../../opentelemetry", features = ["metrics"] } opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["spec_unstable_metrics_views", "rt-tokio"] } -opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["metrics"] } +opentelemetry-stdout = { workspace = true, features = ["metrics"] } tokio = { workspace = true, features = ["full"] } diff --git a/examples/metrics-basic/Cargo.toml b/examples/metrics-basic/Cargo.toml index 69a8fc8628..c8c6854fde 100644 --- a/examples/metrics-basic/Cargo.toml +++ b/examples/metrics-basic/Cargo.toml @@ -8,6 +8,6 @@ publish = false [dependencies] opentelemetry = { path = "../../opentelemetry", features = ["metrics"] } opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["metrics", "rt-tokio"] } -opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["metrics"]} +opentelemetry-stdout = { workspace = true, features = ["metrics"] } tokio = { workspace = true, features = ["full"] } diff --git a/examples/tracing-grpc/Cargo.toml b/examples/tracing-grpc/Cargo.toml index 1f3ade0c87..7ab0ac9fda 100644 --- a/examples/tracing-grpc/Cargo.toml +++ b/examples/tracing-grpc/Cargo.toml @@ -16,7 +16,7 @@ path = "src/client.rs" [dependencies] opentelemetry = { path = "../../opentelemetry" } opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio"] } -opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["trace"] } +opentelemetry-stdout = { workspace = true, features = ["trace"] } prost = { workspace = true } tokio = { workspace = true, features = ["full"] } tonic = { workspace = true, features = ["server"] } diff --git a/examples/tracing-http-propagator/Cargo.toml b/examples/tracing-http-propagator/Cargo.toml index 7d13e666ed..9aa47859b7 100644 --- a/examples/tracing-http-propagator/Cargo.toml +++ b/examples/tracing-http-propagator/Cargo.toml @@ -23,5 +23,5 @@ tokio = { workspace = true, features = ["full"] } opentelemetry = { path = "../../opentelemetry" } opentelemetry_sdk = { path = "../../opentelemetry-sdk" } opentelemetry-http = { path = "../../opentelemetry-http" } -opentelemetry-stdout = { path = "../../opentelemetry-stdout", features = ["trace"] } +opentelemetry-stdout = { workspace = true, features = ["trace"] } opentelemetry-semantic-conventions = { path = "../../opentelemetry-semantic-conventions" } diff --git a/examples/tracing-jaeger/Cargo.toml b/examples/tracing-jaeger/Cargo.toml index 6257f0ebf0..566df46e64 100644 --- a/examples/tracing-jaeger/Cargo.toml +++ b/examples/tracing-jaeger/Cargo.toml @@ -8,5 +8,5 @@ publish = false [dependencies] opentelemetry = { path = "../../opentelemetry" } opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio"] } -opentelemetry-otlp = { path = "../../opentelemetry-otlp", features = ["tonic"] } +opentelemetry-otlp = { workspace = true, features = ["tonic"] } tokio = { workspace = true, features = ["full"] } diff --git a/opentelemetry-appender-log/Cargo.toml b/opentelemetry-appender-log/Cargo.toml index bd66ac3fa4..85d80df5e5 100644 --- a/opentelemetry-appender-log/Cargo.toml +++ b/opentelemetry-appender-log/Cargo.toml @@ -30,7 +30,7 @@ opentelemetry_sdk = { path = "../opentelemetry-sdk", features = [ "testing", "spec_unstable_logs_enabled", ] } -opentelemetry-stdout = { path = "../opentelemetry-stdout", features = ["logs"] } +opentelemetry-stdout = { workspace = true, features = ["logs"] } log = { workspace = true, features = ["kv_serde"] } tokio = { workspace = true } serde = { workspace = true, features = ["std", "derive"] } diff --git a/opentelemetry-appender-tracing/Cargo.toml b/opentelemetry-appender-tracing/Cargo.toml index dee03e5199..c49d690669 100644 --- a/opentelemetry-appender-tracing/Cargo.toml +++ b/opentelemetry-appender-tracing/Cargo.toml @@ -15,17 +15,17 @@ log = { workspace = true, optional = true } opentelemetry = { version = "0.28", path = "../opentelemetry", features = ["logs"] } tracing = { workspace = true, features = ["std"]} tracing-core = { workspace = true } -tracing-log = { version = "0.2", optional = true } +tracing-log = { workspace = true, optional = true } tracing-subscriber = { workspace = true, features = ["registry", "std"] } -tracing-opentelemetry = { version = "0.29", optional = true } +tracing-opentelemetry = { workspace = true, optional = true } [dev-dependencies] log = { workspace = true } -opentelemetry-stdout = { path = "../opentelemetry-stdout", features = ["logs"] } +opentelemetry-stdout = { workspace = true, features = ["logs"] } opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["logs", "testing"] } tracing = { workspace = true, features = ["std"]} tracing-subscriber = { workspace = true, features = ["env-filter","registry", "std", "fmt"] } -tracing-log = "0.2" +tracing-log = { workspace = true } criterion = { workspace = true } tokio = { workspace = true, features = ["full"]} @@ -44,5 +44,8 @@ name = "logs" harness = false required-features = ["spec_unstable_logs_enabled"] +[lib] +bench = false + [lints] workspace = true diff --git a/opentelemetry-otlp/CHANGELOG.md b/opentelemetry-otlp/CHANGELOG.md index dc859dd542..311a8a4bfc 100644 --- a/opentelemetry-otlp/CHANGELOG.md +++ b/opentelemetry-otlp/CHANGELOG.md @@ -3,6 +3,7 @@ ## vNext - The `OTEL_EXPORTER_OTLP_TIMEOUT`, `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`, `OTEL_EXPORTER_OTLP_METRICS_TIMEOUT` and `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` are changed from seconds to miliseconds. +- Fixed `.with_headers()` in `HttpExporterBuilder` to correctly support multiple key/value pairs. [#2699](https://github.com/open-telemetry/opentelemetry-rust/pull/2699) ## 0.28.0 @@ -41,7 +42,7 @@ Released 2024-Nov-11 - Update `opentelemetry-http` dependency version to 0.27 - Update `opentelemetry-proto` dependency version to 0.27 -- **BREAKING**: +- **BREAKING**: - ([#2217](https://github.com/open-telemetry/opentelemetry-rust/pull/2217)) **Replaced**: The `MetricsExporterBuilder` interface is modified from `with_temporality_selector` to `with_temporality` example can be seen below: Previous Signature: ```rust @@ -88,9 +89,9 @@ Released 2024-Nov-11 - `MetricsExporterBuilder` -> `MetricExporterBuilder` - [#2263](https://github.com/open-telemetry/opentelemetry-rust/pull/2263) - Support `hyper` client for opentelemetry-otlp. This can be enabled using flag `hyper-client`. + Support `hyper` client for opentelemetry-otlp. This can be enabled using flag `hyper-client`. Refer example: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-otlp/examples/basic-otlp-http - + ## v0.26.0 Released 2024-Sep-30 diff --git a/opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml b/opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml index 12ea5766b6..ea2a01cb94 100644 --- a/opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml +++ b/opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml @@ -12,8 +12,8 @@ reqwest-blocking = ["opentelemetry-otlp/reqwest-blocking-client"] [dependencies] opentelemetry = { path = "../../../opentelemetry" } opentelemetry_sdk = { path = "../../../opentelemetry-sdk" } -opentelemetry-otlp = { path = "../.."} -opentelemetry-appender-tracing = { path = "../../../opentelemetry-appender-tracing"} +opentelemetry-otlp = { workspace = true } +opentelemetry-appender-tracing = { workspace = true } tokio = { workspace = true, features = ["full"] } tracing = { workspace = true, features = ["std"]} diff --git a/opentelemetry-otlp/examples/basic-otlp/Cargo.toml b/opentelemetry-otlp/examples/basic-otlp/Cargo.toml index c2b785a499..bc068d0a44 100644 --- a/opentelemetry-otlp/examples/basic-otlp/Cargo.toml +++ b/opentelemetry-otlp/examples/basic-otlp/Cargo.toml @@ -8,9 +8,9 @@ publish = false [dependencies] opentelemetry = { path = "../../../opentelemetry" } opentelemetry_sdk = { path = "../../../opentelemetry-sdk" } -opentelemetry-otlp = { path = "../../../opentelemetry-otlp", features = ["grpc-tonic"] } -tokio = { version = "1.0", features = ["full"] } -opentelemetry-appender-tracing = { path = "../../../opentelemetry-appender-tracing"} +opentelemetry-otlp = { workspace = true, features = ["grpc-tonic"] } +tokio = { workspace = true, features = ["full"] } +opentelemetry-appender-tracing = { workspace = true } tracing = { workspace = true, features = ["std"]} tracing-subscriber = { workspace = true, features = ["env-filter","registry", "std", "fmt"] } diff --git a/opentelemetry-otlp/src/exporter/http/mod.rs b/opentelemetry-otlp/src/exporter/http/mod.rs index f1b982511e..537d41d108 100644 --- a/opentelemetry-otlp/src/exporter/http/mod.rs +++ b/opentelemetry-otlp/src/exporter/http/mod.rs @@ -449,13 +449,13 @@ impl WithHttpConfig for B { fn with_headers(mut self, headers: HashMap) -> Self { // headers will be wrapped, so we must do some logic to unwrap first. - self.http_client_config() + let http_client_headers = self + .http_client_config() .headers - .iter_mut() - .zip(headers) - .for_each(|(http_client_headers, (key, value))| { - http_client_headers.insert(key, super::url_decode(&value).unwrap_or(value)); - }); + .get_or_insert(HashMap::new()); + headers.into_iter().for_each(|(key, value)| { + http_client_headers.insert(key, super::url_decode(&value).unwrap_or(value)); + }); self } } @@ -671,11 +671,14 @@ mod tests { } #[test] - fn test_http_exporter_builder_with_header() { + fn test_http_exporter_builder_with_headers() { use std::collections::HashMap; // Arrange let initial_headers = HashMap::from([("k1".to_string(), "v1".to_string())]); - let extra_headers = HashMap::from([("k2".to_string(), "v2".to_string())]); + let extra_headers = HashMap::from([ + ("k2".to_string(), "v2".to_string()), + ("k3".to_string(), "v3".to_string()), + ]); let expected_headers = initial_headers.iter().chain(extra_headers.iter()).fold( HashMap::new(), |mut acc, (k, v)| { diff --git a/opentelemetry-otlp/tests/integration_test/Cargo.toml b/opentelemetry-otlp/tests/integration_test/Cargo.toml index 25743be4c4..8091dd9978 100644 --- a/opentelemetry-otlp/tests/integration_test/Cargo.toml +++ b/opentelemetry-otlp/tests/integration_test/Cargo.toml @@ -8,13 +8,13 @@ publish = false opentelemetry = { path = "../../../opentelemetry", features = [] } opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "testing"] } opentelemetry-proto = { path = "../../../opentelemetry-proto", features = ["gen-tonic-messages", "trace", "logs", "metrics", "with-serde"] } -tokio = { version = "1.0", features = ["full"] } -serde_json = "1" -testcontainers = { version = "0.23.1", features = ["http_wait"]} +tokio = { workspace = true, features = ["full"] } +serde_json = { workspace = true } +testcontainers = { workspace = true, features = ["http_wait"] } once_cell.workspace = true -anyhow = "1.0.94" -ctor = "0.2.9" -uuid = { version = "1.3", features = ["v4"] } +anyhow = { workspace = true } +ctor = { workspace = true } +uuid = { workspace = true, features = ["v4"] } tracing-subscriber = { workspace = true, features = ["env-filter","registry", "std", "fmt"] } tracing = {workspace = true} diff --git a/opentelemetry-proto/Cargo.toml b/opentelemetry-proto/Cargo.toml index dffabb7a02..415a61b88e 100644 --- a/opentelemetry-proto/Cargo.toml +++ b/opentelemetry-proto/Cargo.toml @@ -53,17 +53,17 @@ tonic = { workspace = true, optional = true, features = ["codegen", "prost"] } prost = { workspace = true, optional = true } opentelemetry = { version = "0.28", default-features = false, path = "../opentelemetry" } opentelemetry_sdk = { version = "0.28", default-features = false, path = "../opentelemetry-sdk" } -schemars = { version = "0.8", optional = true } +schemars = { workspace = true, optional = true } serde = { workspace = true, optional = true, features = ["serde_derive"] } -hex = { version = "0.4.3", optional = true } +hex = { workspace = true, optional = true } tracing = {workspace = true, optional = true} # optional for opentelemetry internal logging -base64 = { version = "0.22.1", optional = true } +base64 = { workspace = true, optional = true } [dev-dependencies] opentelemetry = { features = ["testing"], path = "../opentelemetry" } tonic-build = { workspace = true } prost-build = { workspace = true } -tempfile = "3.3.0" +tempfile = { workspace = true } serde_json = { workspace = true } [lints] diff --git a/opentelemetry-sdk/CHANGELOG.md b/opentelemetry-sdk/CHANGELOG.md index 4011544db4..9c503dbfc9 100644 --- a/opentelemetry-sdk/CHANGELOG.md +++ b/opentelemetry-sdk/CHANGELOG.md @@ -36,15 +36,12 @@ - **Breaking** The SpanExporter::export() method no longer requires a mutable reference to self. Before: - ```rust - async fn export(&mut self, batch: Vec) -> OTelSdkResult + async fn export(&mut self, batch: Vec) -> OTelSdkResult ``` - After: - ```rust - async fn export(&self, batch: Vec) -> OTelSdkResult + async fn export(&self, batch: Vec) -> OTelSdkResult ``` Custom exporters will need to internally synchronize any mutable state, if applicable. @@ -52,6 +49,8 @@ - Bug Fix: `BatchLogProcessor` now correctly calls `shutdown` on the exporter when its `shutdown` is invoked. +- Reduced some info level logs to debug + ## 0.28.0 Released 2025-Feb-10 @@ -93,7 +92,7 @@ field as metadata, a feature introduced in version 0.1.40. - `Resource::{new,empty,from_detectors,new_with_defaults,from_schema_url,merge,default}`. 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. - + Example Usage: ```rust @@ -181,7 +180,7 @@ field as metadata, a feature introduced in version 0.1.40. - Does not support `hyper`, `reqwest` HTTP Clients - Does not support multiple concurrent exports (`with_max_concurrent_exports` is not supported). This existed only for traces. - + If this applies to you, you can get the old behavior back by following steps below: - Enable one or more of the feature flag from below @@ -249,7 +248,7 @@ limit. - *Breaking*: Rename namespaces for InMemoryExporters. (The module is still under "testing" feature flag) before: - + ```rust opentelemetry_sdk::testing::logs::{InMemoryLogExporter, InMemoryLogExporterBuilder}; @@ -260,7 +259,7 @@ limit. ``` now: - + ```rust opentelemetry_sdk::logs::{InMemoryLogExporter, InMemoryLogExporterBuilder}; opentelemetry_sdk::trace::{InMemorySpanExporter, diff --git a/opentelemetry-sdk/Cargo.toml b/opentelemetry-sdk/Cargo.toml index 819e0b4ca2..45819b89c0 100644 --- a/opentelemetry-sdk/Cargo.toml +++ b/opentelemetry-sdk/Cargo.toml @@ -13,12 +13,12 @@ rust-version = "1.75.0" opentelemetry = { version = "0.28", path = "../opentelemetry/" } opentelemetry-http = { version = "0.28", path = "../opentelemetry-http", optional = true } async-std = { workspace = true, features = ["unstable"], optional = true } -futures-channel = "0.3" +futures-channel = { workspace = true } futures-executor = { workspace = true } futures-util = { workspace = true, features = ["std", "sink", "async-await-macro"] } -percent-encoding = { version = "2.0", optional = true } +percent-encoding = { workspace = true, optional = true } rand = { workspace = true, features = ["std", "std_rng", "small_rng", "os_rng", "thread_rng"], optional = true } -glob = { version = "0.3.1", optional =true} +glob = { workspace = true, optional = true } serde = { workspace = true, features = ["derive", "rc"], optional = true } serde_json = { workspace = true, optional = true } thiserror = { workspace = true } @@ -34,7 +34,7 @@ rustdoc-args = ["--cfg", "docsrs"] [dev-dependencies] criterion = { workspace = true, features = ["html_reports"] } -rstest = "0.23.0" +rstest = { workspace = true } temp-env = { workspace = true } [target.'cfg(not(target_os = "windows"))'.dev-dependencies] @@ -108,5 +108,8 @@ name = "log" harness = false required-features = ["logs"] +[lib] +bench = false + [lints] workspace = true diff --git a/opentelemetry-sdk/src/logs/batch_log_processor.rs b/opentelemetry-sdk/src/logs/batch_log_processor.rs index 8834009d29..cb475a7574 100644 --- a/opentelemetry-sdk/src/logs/batch_log_processor.rs +++ b/opentelemetry-sdk/src/logs/batch_log_processor.rs @@ -23,7 +23,7 @@ use crate::{ }; use std::sync::mpsc::{self, RecvTimeoutError, SyncSender}; -use opentelemetry::{otel_debug, otel_error, otel_info, otel_warn, InstrumentationScope}; +use opentelemetry::{otel_debug, otel_error, otel_warn, InstrumentationScope}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::{cmp::min, env, sync::Mutex}; @@ -342,7 +342,7 @@ impl BatchLogProcessor { let handle = thread::Builder::new() .name("OpenTelemetry.Logs.BatchProcessor".to_string()) .spawn(move || { - otel_info!( + otel_debug!( name: "BatchLogProcessor.ThreadStarted", interval_in_millisecs = config.scheduled_delay.as_millis(), max_export_batch_size = config.max_export_batch_size, @@ -476,7 +476,7 @@ impl BatchLogProcessor { } } } - otel_info!( + otel_debug!( name: "BatchLogProcessor.ThreadStopped" ); }) @@ -902,8 +902,7 @@ mod tests { ) .build(); - // wait for the batch processor to process the resource. - tokio::time::sleep(Duration::from_millis(100)).await; + provider.force_flush().unwrap(); assert_eq!(exporter.get_resource().unwrap().into_iter().count(), 5); let _ = provider.shutdown(); diff --git a/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs b/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs index 1c9403ca81..bb7f7fa2ea 100644 --- a/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs +++ b/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs @@ -525,8 +525,7 @@ mod tests { ) .build(); - // wait for the batch processor to process the resource. - tokio::time::sleep(Duration::from_millis(100)).await; + provider.force_flush().unwrap(); assert_eq!(exporter.get_resource().unwrap().into_iter().count(), 5); let _ = provider.shutdown(); @@ -788,7 +787,7 @@ mod tests { KeyValue::new("k5", "v5"), ])) .build(); - tokio::time::sleep(Duration::from_millis(500)).await; // set resource in batch log processor is not blocking. Should we make it blocking? + provider.force_flush().unwrap(); assert_eq!(exporter.get_resource().unwrap().into_iter().count(), 5); let _ = provider.shutdown(); } diff --git a/opentelemetry-sdk/src/metrics/meter_provider.rs b/opentelemetry-sdk/src/metrics/meter_provider.rs index 2c76dba3a6..1e38f627ce 100644 --- a/opentelemetry-sdk/src/metrics/meter_provider.rs +++ b/opentelemetry-sdk/src/metrics/meter_provider.rs @@ -110,7 +110,7 @@ impl SdkMeterProvider { /// There is no guaranteed that all telemetry be flushed or all resources have /// been released on error. pub fn shutdown(&self) -> OTelSdkResult { - otel_info!( + otel_debug!( name: "MeterProvider.Shutdown", message = "User initiated shutdown of MeterProvider." ); @@ -164,7 +164,7 @@ impl Drop for SdkMeterProviderInner { reason = format!("{}", err) ); } else { - otel_info!( + otel_debug!( name: "MeterProvider.Drop.ShutdownCompleted", ); } @@ -310,7 +310,7 @@ impl MeterProviderBuilder { }), }; - otel_info!( + otel_debug!( name: "MeterProvider.Built", ); meter_provider diff --git a/opentelemetry-sdk/src/metrics/periodic_reader.rs b/opentelemetry-sdk/src/metrics/periodic_reader.rs index 79f4e9e802..1e9f5bd16f 100644 --- a/opentelemetry-sdk/src/metrics/periodic_reader.rs +++ b/opentelemetry-sdk/src/metrics/periodic_reader.rs @@ -160,7 +160,7 @@ impl PeriodicReader { .spawn(move || { let mut interval_start = Instant::now(); let mut remaining_interval = interval; - otel_info!( + otel_debug!( name: "PeriodReaderThreadStarted", interval_in_millisecs = interval.as_millis(), ); @@ -190,16 +190,16 @@ impl PeriodicReader { if export_result.is_err() { if response_sender.send(false).is_err() { - otel_info!( + otel_debug!( name: "PeriodReader.Flush.ResponseSendError", - message = "PeriodicReader's flush has failed, but unable to send this info back to caller. + message = "PeriodicReader's flush has failed, but unable to send this info back to caller. This occurs when the caller has timed out waiting for the response. If you see this occuring frequently, consider increasing the flush timeout." ); } } else if response_sender.send(true).is_err() { - otel_info!( + otel_debug!( name: "PeriodReader.Flush.ResponseSendError", - message = "PeriodicReader's flush has completed successfully, but unable to send this info back to caller. + message = "PeriodicReader's flush has completed successfully, but unable to send this info back to caller. This occurs when the caller has timed out waiting for the response. If you see this occuring frequently, consider increasing the flush timeout." ); } @@ -253,14 +253,14 @@ impl PeriodicReader { if response_sender.send(false).is_err() { otel_info!( name: "PeriodReaderThreadShutdown.ResponseSendError", - message = "PeriodicReader's shutdown has failed, but unable to send this info back to caller. + message = "PeriodicReader's shutdown has failed, but unable to send this info back to caller. This occurs when the caller has timed out waiting for the response. If you see this occuring frequently, consider increasing the shutdown timeout." ); } } else if response_sender.send(true).is_err() { - otel_info!( + otel_debug!( name: "PeriodReaderThreadShutdown.ResponseSendError", - message = "PeriodicReader completed its shutdown, but unable to send this info back to caller. + message = "PeriodicReader completed its shutdown, but unable to send this info back to caller. This occurs when the caller has timed out waiting for the response. If you see this occuring frequently, consider increasing the shutdown timeout." ); } @@ -312,7 +312,7 @@ impl PeriodicReader { } } } - otel_info!( + otel_debug!( name: "PeriodReaderThreadStopped" ); }); @@ -499,7 +499,7 @@ impl MetricReader for PeriodicReader { /// This function SHOULD be obtained from the exporter. /// /// If not configured, the Cumulative temporality SHOULD be used. - /// + /// /// [metric-reader]: https://github.com/open-telemetry/opentelemetry-specification/blob/0a78571045ca1dca48621c9648ec3c832c3c541c/specification/metrics/sdk.md#metricreader fn temporality(&self, kind: InstrumentKind) -> Temporality { kind.temporality_preference(self.inner.temporality(kind)) diff --git a/opentelemetry-sdk/src/trace/span_processor.rs b/opentelemetry-sdk/src/trace/span_processor.rs index bb7b59d3f4..8e70e8b220 100644 --- a/opentelemetry-sdk/src/trace/span_processor.rs +++ b/opentelemetry-sdk/src/trace/span_processor.rs @@ -39,8 +39,7 @@ use crate::resource::Resource; use crate::trace::Span; use crate::trace::{SpanData, SpanExporter}; use opentelemetry::Context; -use opentelemetry::{otel_debug, otel_warn}; -use opentelemetry::{otel_error, otel_info}; +use opentelemetry::{otel_debug, otel_error, otel_warn}; use std::cmp::min; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; @@ -317,7 +316,7 @@ impl BatchSpanProcessor { let handle = thread::Builder::new() .name("OpenTelemetry.Traces.BatchProcessor".to_string()) .spawn(move || { - otel_info!( + otel_debug!( name: "BatchSpanProcessor.ThreadStarted", interval_in_millisecs = config.scheduled_delay.as_millis(), max_export_batch_size = config.max_export_batch_size, @@ -413,7 +412,7 @@ impl BatchSpanProcessor { } } } - otel_info!( + otel_debug!( name: "BatchSpanProcessor.ThreadStopped" ); }) @@ -1241,7 +1240,6 @@ mod tests { let config = BatchConfigBuilder::default() .with_max_queue_size(5) .with_max_export_batch_size(3) - .with_scheduled_delay(Duration::from_millis(50)) .build(); let processor = BatchSpanProcessor::new(exporter, config); @@ -1251,7 +1249,7 @@ mod tests { processor.on_end(span); } - tokio::time::sleep(Duration::from_millis(1000)).await; + processor.force_flush().unwrap(); let exported_spans = exporter_shared.lock().unwrap(); assert_eq!(exported_spans.len(), 4); @@ -1265,7 +1263,6 @@ mod tests { let config = BatchConfigBuilder::default() .with_max_queue_size(5) .with_max_export_batch_size(3) - .with_scheduled_delay(Duration::from_millis(50)) .build(); let processor = BatchSpanProcessor::new(exporter, config); @@ -1275,7 +1272,7 @@ mod tests { processor.on_end(span); } - tokio::time::sleep(Duration::from_millis(1000)).await; + processor.force_flush().unwrap(); let exported_spans = exporter_shared.lock().unwrap(); assert_eq!(exported_spans.len(), 4); @@ -1289,7 +1286,6 @@ mod tests { let config = BatchConfigBuilder::default() .with_max_queue_size(20) .with_max_export_batch_size(5) - .with_scheduled_delay(Duration::from_millis(50)) .build(); // Create the processor with the thread-safe exporter @@ -1309,8 +1305,7 @@ mod tests { handle.await.unwrap(); } - // Allow time for batching and export - tokio::time::sleep(Duration::from_millis(1000)).await; + processor.force_flush().unwrap(); // Verify exported spans let exported_spans = exporter_shared.lock().unwrap(); diff --git a/opentelemetry-stdout/Cargo.toml b/opentelemetry-stdout/Cargo.toml index c30f7c5df4..364a28a3ed 100644 --- a/opentelemetry-stdout/Cargo.toml +++ b/opentelemetry-stdout/Cargo.toml @@ -26,7 +26,7 @@ metrics = ["opentelemetry/metrics", "opentelemetry_sdk/metrics"] logs = ["opentelemetry/logs", "opentelemetry_sdk/logs", "opentelemetry_sdk/spec_unstable_logs_enabled"] [dependencies] -chrono = { version = "0.4.34", default-features = false, features = ["now"] } +chrono = { workspace = true, features = ["now"] } futures-util = { workspace = true, optional = true } opentelemetry = { version = "0.28", path = "../opentelemetry" } opentelemetry_sdk = { version = "0.28", path = "../opentelemetry-sdk" } @@ -34,7 +34,7 @@ opentelemetry_sdk = { version = "0.28", path = "../opentelemetry-sdk" } [dev-dependencies] opentelemetry = { path = "../opentelemetry", features = ["metrics"] } opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["rt-tokio", "metrics"] } -opentelemetry-appender-tracing = { path = "../opentelemetry-appender-tracing"} +opentelemetry-appender-tracing = { workspace = true } tracing = { workspace = true, features = ["std"]} tracing-subscriber = { workspace = true, features = ["registry", "std"] } tokio = { workspace = true, features = ["full"] } diff --git a/opentelemetry-zipkin/Cargo.toml b/opentelemetry-zipkin/Cargo.toml index c40059e7de..440b22888e 100644 --- a/opentelemetry-zipkin/Cargo.toml +++ b/opentelemetry-zipkin/Cargo.toml @@ -32,7 +32,7 @@ opentelemetry_sdk = { version = "0.28", path = "../opentelemetry-sdk", features opentelemetry-http = { version = "0.28", path = "../opentelemetry-http" } serde_json = { workspace = true } serde = { workspace = true, features = ["derive"] } -typed-builder = "0.20" +typed-builder = { workspace = true } http = { workspace = true } reqwest = { workspace = true, optional = true } thiserror = { workspace = true } diff --git a/opentelemetry/Cargo.toml b/opentelemetry/Cargo.toml index 6dd6dcc863..064d5004b3 100644 --- a/opentelemetry/Cargo.toml +++ b/opentelemetry/Cargo.toml @@ -22,7 +22,7 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] futures-core = { workspace = true, optional = true } -futures-sink = { version = "0.3", optional = true } +futures-sink = { workspace = true, optional = true } pin-project-lite = { workspace = true, optional = true } thiserror = { workspace = true, optional = true} tracing = {workspace = true, optional = true} # optional for opentelemetry internal logging @@ -57,5 +57,8 @@ harness = false name = "anyvalue" harness = false +[lib] +bench = false + [lints] workspace = true diff --git a/stress/Cargo.toml b/stress/Cargo.toml index 4691def67f..bc666a6769 100644 --- a/stress/Cargo.toml +++ b/stress/Cargo.toml @@ -40,17 +40,17 @@ path = "src/random.rs" doc = false [dependencies] -ctrlc = "3.2.5" -lazy_static = "1.4.0" -num_cpus = "1.15.0" +ctrlc = { workspace = true } +lazy_static = { workspace = true } +num_cpus = { workspace = true } opentelemetry = { path = "../opentelemetry", features = ["metrics", "logs", "trace", "spec_unstable_logs_enabled"] } opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["metrics", "logs", "trace", "spec_unstable_logs_enabled"] } -opentelemetry-appender-tracing = { path = "../opentelemetry-appender-tracing"} +opentelemetry-appender-tracing = { workspace = true } rand = { workspace = true, features = ["small_rng", "os_rng"] } tracing = { workspace = true, features = ["std"]} tracing-subscriber = { workspace = true, features = ["registry", "std"] } -num-format = "0.4.4" -sysinfo = { version = "0.32", optional = true } +num-format = { workspace = true } +sysinfo = { workspace = true, optional = true } futures-executor = { workspace = true } [features]