diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e68bbb2..40a32bd7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: name: Build and Test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v5 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 @@ -22,15 +22,15 @@ jobs: - run: cargo clippy --features=metrics-0_24,prometheus-exporter - run: cargo clippy --features=prometheus-0_14 - run: cargo clippy --features=prometheus-client-0_22 - - run: cargo clippy --features=opentelemetry-0_24 + - run: cargo clippy --features=opentelemetry-0_30 # Run the tests with each of the different metrics libraries - run: cargo test --features=prometheus-exporter - run: cargo test --features=prometheus-exporter,metrics-0_24 - run: cargo test --features=prometheus-exporter,prometheus-0_14 - run: cargo test --features=prometheus-exporter,prometheus-client-0_22,exemplars-tracing - - run: cargo test --features=prometheus-exporter,prometheus-client-0_22,exemplars-tracing-opentelemetry-0_25 - - run: cargo test --features=prometheus-exporter,opentelemetry-0_24 + - run: cargo test --features=prometheus-client-0_22,exemplars-tracing-opentelemetry-0_31 # no prometheus-exporter anymore with otlp + - run: cargo test --features=opentelemetry-0_30 # no prometheus-exporter anymore with otlp # Build the crate using the other optional features - run: cargo build --features=metrics-0_24,custom-objective-percentile,custom-objective-latency @@ -43,7 +43,7 @@ jobs: - run: cargo build --package example-axum - run: cargo build --package example-custom-metrics - run: cargo build --package example-exemplars-tracing - - run: cargo build --package example-exemplars-tracing-opentelemetry + # - run: cargo build --package example-exemplars-tracing-opentelemetry # removed, no more prometheus-exporter in otlp - run: cargo build --package example-full-api - run: cargo build --package example-grpc-http - run: cargo build --package example-opentelemetry-push diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b7addba..4abdff4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `prometheus` has been updated to v0.14 (#187) New feature flag: `prometheus-0_14` Removed feature flag: `prometheus-0_13` +- No more `prometheus-exporter` with `opentelemetry`, use standard otlp exporter (see ) +- Update `opentelemetry` to v0.30 ## [2.0.0](https://github.com/autometrics-dev/autometrics-rs/releases/tag/v2.0.0) - 2024-07-25 diff --git a/Cargo.toml b/Cargo.toml index f18ade74..3ce36ca3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ keywords = ["metrics", "prometheus", "opentelemetry"] categories = ["development-tools::debugging", "development-tools::profiling"] [workspace] +resolver = "2" default-members = ["autometrics", "autometrics-cli", "autometrics-macros"] members = [ "autometrics", diff --git a/autometrics/Cargo.toml b/autometrics/Cargo.toml index 1db50b22..24dc2504 100644 --- a/autometrics/Cargo.toml +++ b/autometrics/Cargo.toml @@ -15,23 +15,23 @@ readme = "README.md" [features] # Metrics backends metrics-0_24 = ["dep:metrics"] -opentelemetry-0_24 = ["opentelemetry/metrics", "dep:prometheus"] +opentelemetry-0_30 = ["opentelemetry/metrics", "dep:prometheus"] prometheus-0_14 = ["dep:prometheus"] prometheus-client-0_22 = ["dep:prometheus-client"] # Deprecated feature flags metrics = ["metrics-0_24"] -opentelemetry = ["opentelemetry-0_24"] +opentelemetry = ["opentelemetry-0_30"] prometheus = ["prometheus-0_14"] prometheus-client = ["prometheus-client-0_22"] -exemplars-tracing-opentelemetry = ["exemplars-tracing-opentelemetry-0_25"] +exemplars-tracing-opentelemetry = ["exemplars-tracing-opentelemetry-0_31"] # Misc prometheus-exporter = [ "http", "metrics-exporter-prometheus", - "opentelemetry-prometheus", "opentelemetry_sdk", + "opentelemetry_sdk/spec_unstable_metrics_views", "dep:prometheus", "dep:prometheus-client", ] @@ -65,18 +65,13 @@ otel-push-exporter-tokio-current-thread = [ "opentelemetry_sdk/rt-tokio-current-thread" ] -otel-push-exporter-async-std = [ - "otel-push-exporter", - "opentelemetry_sdk/rt-async-std" -] - # Exemplars exemplars-tracing = ["tracing", "tracing-subscriber"] -exemplars-tracing-opentelemetry-0_25 = [ +exemplars-tracing-opentelemetry-0_31 = [ "dep:opentelemetry", "opentelemetry_sdk/trace", "tracing", - "dep:tracing-opentelemetry", + "dep:tracing-opentelemetry" ] # Custom objectives @@ -91,20 +86,19 @@ spez = "0.1.2" thiserror = "1" # Used for opentelemetry feature -opentelemetry = { version = "0.24", default-features = false, optional = true } +opentelemetry = { version = "0.30", default-features = false, optional = true } # Use for metrics feature metrics = { version = "0.24", default-features = false, optional = true } # Used for prometheus-exporter feature http = { version = "1.0.0", optional = true } -metrics-exporter-prometheus = { version = "0.16", default-features = false, optional = true } -opentelemetry-prometheus = { version = "0.17", optional = true } -opentelemetry_sdk = { version = "0.24.1", default-features = false, features = [ +metrics-exporter-prometheus = { version = "0.17", default-features = false, optional = true } +opentelemetry_sdk = { version = "0.30.0", default-features = false, features = [ "metrics", ], optional = true } -opentelemetry-otlp = { version = "0.17", default-features = false, optional = true } -prometheus = { version = "0.13", default-features = false, optional = true } +opentelemetry-otlp = { version = "0.30", default-features = false, optional = true } +prometheus = { version = "0.14", default-features = false, optional = true } # Used for prometheus-client feature prometheus-client = { version = "0.22", optional = true } @@ -116,15 +110,15 @@ tracing-subscriber = { version = "0.3", default-features = false, features = [ ], optional = true } # Used for exemplars-tracing-opentelemetry feature -tracing-opentelemetry = { version = "0.25", default-features = false, optional = true } +tracing-opentelemetry = { version = "0.31", default-features = false, optional = true } [dev-dependencies] async-trait = "0.1.74" axum = { version = "0.7.2", features = ["tokio"] } criterion = "0.5" http = "1.0.0" -opentelemetry = "0.24" -opentelemetry-stdout = { version = "0.5", features = ["trace"] } +opentelemetry = "0.30" +opentelemetry-stdout = { version = "0.30", features = ["trace"] } prometheus-client = "0.22" tokio = { version = "1", features = ["full"] } tracing = "0.1" diff --git a/autometrics/build.rs b/autometrics/build.rs index 6a3ab113..0772005a 100644 --- a/autometrics/build.rs +++ b/autometrics/build.rs @@ -6,18 +6,18 @@ pub fn main() { #[cfg(feature = "metrics")] println!("cargo:warning=The `metrics` feature is deprecated and will be removed in the next version. Please use `metrics-0_24` instead."); #[cfg(feature = "opentelemetry")] - println!("cargo:warning=The `opentelemetry` feature is deprecated and will be removed in the next version. Please use `opentelemetry-0_24` instead."); + println!("cargo:warning=The `opentelemetry` feature is deprecated and will be removed in the next version. Please use `opentelemetry-0_30` instead."); #[cfg(feature = "prometheus")] println!("cargo:warning=The `prometheus` feature is deprecated and will be removed in the next version. Please use `prometheus-0_14` instead."); #[cfg(feature = "prometheus-client")] println!("cargo:warning=The `prometheus-client` feature is deprecated and will be removed in the next version. Please use `prometheus-client-0_22` instead."); #[cfg(feature = "exemplars-tracing-opentelemetry")] - println!("cargo:warning=The `exemplars-tracing-opentelemetry` feature is deprecated and will be removed in the next version. Please use `exemplars-tracing-opentelemetry-0_25` instead."); + println!("cargo:warning=The `exemplars-tracing-opentelemetry` feature is deprecated and will be removed in the next version. Please use `exemplars-tracing-opentelemetry-0_31` instead."); cfg_aliases! { // Backends metrics: { any(feature = "metrics", feature = "metrics-0_24") }, - opentelemetry: { any(feature = "opentelemetry", feature = "opentelemetry-0_24") }, + opentelemetry: { any(feature = "opentelemetry", feature = "opentelemetry-0_30") }, prometheus: { any(feature = "prometheus", feature = "prometheus-0_14") }, prometheus_client_feature: { any(feature = "prometheus-client", feature = "prometheus-client-0_22") }, default_backend: { all( @@ -32,7 +32,7 @@ pub fn main() { // Exemplars exemplars: { any(exemplars_tracing, exemplars_tracing_opentelemetry) }, exemplars_tracing: { feature = "exemplars-tracing" }, - exemplars_tracing_opentelemetry: { any(feature = "exemplars-tracing-opentelemetry-0_25", feature = "exemplars-tracing-opentelemetry") }, + exemplars_tracing_opentelemetry: { any(feature = "exemplars-tracing-opentelemetry-0_31", feature = "exemplars-tracing-opentelemetry") }, // Custom objectives custom_objective_percentile: { feature = "custom-objective-percentile" }, diff --git a/autometrics/src/lib.rs b/autometrics/src/lib.rs index bf6bf0d5..db7f3fdb 100644 --- a/autometrics/src/lib.rs +++ b/autometrics/src/lib.rs @@ -9,7 +9,7 @@ mod constants; #[cfg(any( feature = "exemplars-tracing", feature = "exemplars-tracing-opentelemetry", - feature = "exemplars-tracing-opentelemetry-0_25", + feature = "exemplars-tracing-opentelemetry-0_31", ))] pub mod exemplars; mod labels; diff --git a/autometrics/src/otel_push_exporter.rs b/autometrics/src/otel_push_exporter.rs index b1819640..d8c87a5d 100644 --- a/autometrics/src/otel_push_exporter.rs +++ b/autometrics/src/otel_push_exporter.rs @@ -1,7 +1,8 @@ -use opentelemetry::metrics::MetricsError; -use opentelemetry_otlp::{ExportConfig, Protocol, WithExportConfig}; -use opentelemetry_otlp::{OtlpMetricPipeline, OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT}; -use opentelemetry_sdk::metrics::SdkMeterProvider; +use opentelemetry_otlp::{ + ExportConfig, ExporterBuildError, MetricExporter, Protocol, WithExportConfig, + OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT, +}; +use opentelemetry_sdk::metrics::{MeterProviderBuilder, PeriodicReader, SdkMeterProvider}; use std::ops::Deref; use std::time::Duration; @@ -32,7 +33,7 @@ impl Drop for OtelMeterProvider { /// to configure the timeout and interval respectively. If you want to customize those /// from within code, consider using [`init_http_with_timeout_period`]. #[cfg(feature = "otel-push-exporter-http")] -pub fn init_http(url: impl Into) -> Result { +pub fn init_http(url: impl Into) -> Result { let (timeout, period) = timeout_and_period_from_env_or_default(); init_http_with_timeout_period(url, timeout, period) } @@ -43,21 +44,22 @@ pub fn init_http_with_timeout_period( url: impl Into, timeout: Duration, period: Duration, -) -> Result { - runtime() - .with_exporter( - opentelemetry_otlp::new_exporter() - .http() - .with_export_config(ExportConfig { - endpoint: url.into(), - protocol: Protocol::HttpBinary, - timeout, - ..Default::default() - }), - ) - .with_period(period) - .build() - .map(OtelMeterProvider) +) -> Result { + let exporter = MetricExporter::builder() + .with_http() + .with_export_config(ExportConfig { + endpoint: Some(url.into()), + protocol: Protocol::HttpBinary, + timeout: Some(timeout), + ..Default::default() + }) + .build()?; + + let reader = PeriodicReader::builder(exporter) + .with_interval(period) + .build(); + + Ok(OtelMeterProvider(runtime().with_reader(reader).build())) } /// Initialize the OpenTelemetry push exporter using gRPC transport. @@ -67,7 +69,7 @@ pub fn init_http_with_timeout_period( /// to configure the timeout and interval respectively. If you want to customize those /// from within code, consider using [`init_grpc_with_timeout_period`]. #[cfg(feature = "otel-push-exporter-grpc")] -pub fn init_grpc(url: impl Into) -> Result { +pub fn init_grpc(url: impl Into) -> Result { let (timeout, period) = timeout_and_period_from_env_or_default(); init_grpc_with_timeout_period(url, timeout, period) } @@ -78,21 +80,22 @@ pub fn init_grpc_with_timeout_period( url: impl Into, timeout: Duration, period: Duration, -) -> Result { - runtime() - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_export_config(ExportConfig { - endpoint: url.into(), - protocol: Protocol::Grpc, - timeout, - ..Default::default() - }), - ) - .with_period(period) - .build() - .map(OtelMeterProvider) +) -> Result { + let exporter = MetricExporter::builder() + .with_tonic() + .with_export_config(ExportConfig { + endpoint: Some(url.into()), + protocol: Protocol::HttpBinary, + timeout: Some(timeout), + ..Default::default() + }) + .build()?; + + let reader = PeriodicReader::builder(exporter) + .with_interval(period) + .build(); + + Ok(OtelMeterProvider(runtime().with_reader(reader).build())) } /// returns timeout and period from their respective environment variables @@ -105,7 +108,7 @@ fn timeout_and_period_from_env_or_default() -> (Duration, Duration) { std::env::var_os(OTEL_EXPORTER_TIMEOUT_ENV) .and_then(|os_string| os_string.into_string().ok()) .and_then(|str| str.parse().ok()) - .unwrap_or(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT), + .unwrap_or(OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT.as_secs()), ); let period = Duration::from_secs( @@ -118,51 +121,6 @@ fn timeout_and_period_from_env_or_default() -> (Duration, Duration) { (timeout, period) } -#[cfg(all( - feature = "otel-push-exporter-tokio", - not(any( - feature = "otel-push-exporter-tokio-current-thread", - feature = "otel-push-exporter-async-std" - )) -))] -fn runtime( -) -> OtlpMetricPipeline { - return opentelemetry_otlp::new_pipeline().metrics(opentelemetry_sdk::runtime::Tokio); -} - -#[cfg(all( - feature = "otel-push-exporter-tokio-current-thread", - not(any( - feature = "otel-push-exporter-tokio", - feature = "otel-push-exporter-async-std" - )) -))] -fn runtime() -> OtlpMetricPipeline< - opentelemetry_sdk::runtime::TokioCurrentThread, - opentelemetry_otlp::NoExporterConfig, -> { - return opentelemetry_otlp::new_pipeline() - .metrics(opentelemetry_sdk::runtime::TokioCurrentThread); -} - -#[cfg(all( - feature = "otel-push-exporter-async-std", - not(any( - feature = "otel-push-exporter-tokio", - feature = "otel-push-exporter-tokio-current-thread" - )) -))] -fn runtime( -) -> OtlpMetricPipeline -{ - return opentelemetry_otlp::new_pipeline().metrics(opentelemetry_sdk::runtime::AsyncStd); -} - -#[cfg(not(any( - feature = "otel-push-exporter-tokio", - feature = "otel-push-exporter-tokio-current-thread", - feature = "otel-push-exporter-async-std" -)))] -fn runtime() -> ! { - compile_error!("select your runtime (`otel-push-exporter-tokio`, `otel-push-exporter-tokio-current-thread` or `otel-push-exporter-async-std`) for the autometrics push exporter or use the custom push exporter if none fit") +fn runtime() -> MeterProviderBuilder { + SdkMeterProvider::builder() } diff --git a/autometrics/src/prometheus_exporter.rs b/autometrics/src/prometheus_exporter.rs index 3e292432..4b048ffa 100644 --- a/autometrics/src/prometheus_exporter.rs +++ b/autometrics/src/prometheus_exporter.rs @@ -27,10 +27,6 @@ use http::{header::CONTENT_TYPE, Response}; #[cfg(metrics)] use metrics_exporter_prometheus::{BuildError, PrometheusBuilder, PrometheusHandle}; use once_cell::sync::OnceCell; -#[cfg(opentelemetry)] -use opentelemetry::metrics::MetricsError; -#[cfg(opentelemetry)] -use opentelemetry_sdk::metrics::SdkMeterProvider; #[cfg(any(opentelemetry, prometheus))] use prometheus::TextEncoder; use thiserror::Error; @@ -65,10 +61,6 @@ pub enum ExporterInitializationError { #[error("Prometheus exporter has already been initialized")] AlreadyInitialized, - #[cfg(opentelemetry)] - #[error(transparent)] - OpenTelemetryExporter(#[from] MetricsError), - #[cfg(metrics)] #[error(transparent)] MetricsExporter(#[from] BuildError), @@ -210,50 +202,49 @@ impl GlobalPrometheus { fn initialize_prometheus_exporter() -> Result { let settings = get_settings(); - #[cfg(opentelemetry)] - { - use opentelemetry::global; - use opentelemetry_prometheus::exporter; - use opentelemetry_sdk::metrics::reader::AggregationSelector; - use opentelemetry_sdk::metrics::{Aggregation, InstrumentKind}; + // opentelemetry-prometheus is no longer maintained and stops at 0.29.1 + // this config works with latest 0.29.1, but prometheus dependency was updated at 0.30 version + // so this is now useless + // #[cfg(opentelemetry)] + // { + // use opentelemetry_sdk::metrics::SdkMeterProvider; + // use opentelemetry::global; + // use opentelemetry_prometheus::exporter; + // use opentelemetry_sdk::metrics::{Aggregation, Stream}; + // use opentelemetry_sdk::metrics::{Instrument, InstrumentKind}; - /// A custom aggregation selector that uses the configured histogram buckets, - /// along with the other default aggregation settings. - struct AggregationSelectorWithHistogramBuckets { - histogram_buckets: Vec, - } + // let view = move |i: &Instrument| match i.kind() { + // InstrumentKind::Counter + // | InstrumentKind::UpDownCounter + // | InstrumentKind::ObservableCounter + // | InstrumentKind::ObservableUpDownCounter => Stream::builder() + // .with_aggregation(Aggregation::Sum) + // .build() + // .ok(), + // InstrumentKind::ObservableGauge | InstrumentKind::Gauge => Stream::builder() + // .with_aggregation(Aggregation::LastValue) + // .build() + // .ok(), + // InstrumentKind::Histogram => Stream::builder() + // .with_aggregation(Aggregation::ExplicitBucketHistogram { + // boundaries: settings.histogram_buckets.clone(), + // record_min_max: false, + // }) + // .build() + // .ok(), + // }; - impl AggregationSelector for AggregationSelectorWithHistogramBuckets { - fn aggregation(&self, kind: InstrumentKind) -> Aggregation { - match kind { - InstrumentKind::Counter - | InstrumentKind::UpDownCounter - | InstrumentKind::ObservableCounter - | InstrumentKind::ObservableUpDownCounter => Aggregation::Sum, - InstrumentKind::ObservableGauge | InstrumentKind::Gauge => { - Aggregation::LastValue - } - InstrumentKind::Histogram => Aggregation::ExplicitBucketHistogram { - boundaries: self.histogram_buckets.clone(), - record_min_max: false, - }, - } - } - } + // let exporter: opentelemetry_prometheus::PrometheusExporter = exporter() + // .with_registry(settings.prometheus_registry.clone()) + // .without_scope_info() + // .without_target_info() + // .build() + // .unwrap(); - let exporter = exporter() - .with_registry(settings.prometheus_registry.clone()) - .with_aggregation_selector(AggregationSelectorWithHistogramBuckets { - histogram_buckets: settings.histogram_buckets.clone(), - }) - .without_scope_info() - .without_target_info() - .build()?; + // let meter_provider = SdkMeterProvider::builder().with_reader(exporter).with_view(view).build(); - let meter_provider = SdkMeterProvider::builder().with_reader(exporter).build(); - - global::set_meter_provider(meter_provider); - } + // global::set_meter_provider(meter_provider); + // } Ok(GlobalPrometheus { #[cfg(metrics)] diff --git a/autometrics/src/tracker/opentelemetry.rs b/autometrics/src/tracker/opentelemetry.rs index 0fa30832..4d030306 100644 --- a/autometrics/src/tracker/opentelemetry.rs +++ b/autometrics/src/tracker/opentelemetry.rs @@ -13,7 +13,7 @@ static COUNTER: Lazy> = Lazy::new(|| { global::meter(METER_NAME) .u64_counter(COUNTER_NAME) .with_description(COUNTER_DESCRIPTION) - .init() + .build() }); static HISTOGRAM: Lazy> = Lazy::new(|| { // Note that the unit needs to be written as "s" rather than "seconds" @@ -23,13 +23,13 @@ static HISTOGRAM: Lazy> = Lazy::new(|| { .f64_histogram(HISTOGRAM_NAME) .with_unit("s") .with_description(HISTOGRAM_DESCRIPTION) - .init() + .build() }); static GAUGE: Lazy> = Lazy::new(|| { global::meter(METER_NAME) .i64_up_down_counter(GAUGE_NAME) .with_description(GAUGE_DESCRIPTION) - .init() + .build() }); /// Tracks the number of function calls, concurrent calls, and latency @@ -78,7 +78,7 @@ impl TrackMetrics for OpenTelemetryTracker { let build_info = global::meter(METER_NAME) .f64_up_down_counter(BUILD_INFO_NAME) .with_description(BUILD_INFO_DESCRIPTION) - .init(); + .build(); build_info.add(1.0, &build_info_labels); }); } diff --git a/autometrics/tests/exemplars_test.rs b/autometrics/tests/exemplars_test.rs index b28119dc..e4c15d98 100644 --- a/autometrics/tests/exemplars_test.rs +++ b/autometrics/tests/exemplars_test.rs @@ -56,7 +56,7 @@ fn multiple_fields() { #[test] fn tracing_opentelemetry_context() { use opentelemetry::trace::TracerProvider as _; - use opentelemetry_sdk::trace::TracerProvider; + use opentelemetry::trace::TracerProvider; use opentelemetry_stdout::SpanExporter; use std::io; use tracing_subscriber::{layer::SubscriberExt, Registry}; @@ -70,7 +70,7 @@ fn tracing_opentelemetry_context() { let tracer = provider.tracer("test"); // This adds the OpenTelemetry Context to every tracing Span - #[cfg(feature = "exemplars-tracing-opentelemetry-0_25")] + #[cfg(feature = "exemplars-tracing-opentelemetry-0_31")] let otel_layer = tracing_opentelemetry::layer().with_tracer(tracer); let subscriber = Registry::default().with(otel_layer); diff --git a/autometrics/tests/settings_custom_registry.rs b/autometrics/tests/settings_custom_registry.rs index 70dc9c9d..81b77aa8 100644 --- a/autometrics/tests/settings_custom_registry.rs +++ b/autometrics/tests/settings_custom_registry.rs @@ -104,7 +104,7 @@ fn custom_opentelemetry_registry() { .prometheus_registry(registry) .init(); - let custom_metric = global::meter("foo").u64_counter("custom_metric").init(); + let custom_metric = global::meter("foo").u64_counter("custom_metric").build(); #[autometrics] fn hello_world() -> &'static str { diff --git a/examples/custom-metrics/Cargo.toml b/examples/custom-metrics/Cargo.toml index 29e6e595..f7f94748 100644 --- a/examples/custom-metrics/Cargo.toml +++ b/examples/custom-metrics/Cargo.toml @@ -13,7 +13,6 @@ prometheus-client = ["autometrics/prometheus-client", "dep:prometheus-client"] [dependencies] autometrics = { path = "../../autometrics", features = ["prometheus-exporter"] } metrics = { version = "0.21.1", optional = true } -once_cell = "1.17" opentelemetry = { version = "0.20", features = ["metrics"], optional = true } prometheus = { version = "0.13", optional = true } prometheus-client = { version = "0.21.2", optional = true } diff --git a/examples/custom-metrics/src/main.rs b/examples/custom-metrics/src/main.rs index 03a4d192..0777889c 100644 --- a/examples/custom-metrics/src/main.rs +++ b/examples/custom-metrics/src/main.rs @@ -1,5 +1,4 @@ use autometrics::{autometrics, prometheus_exporter}; -use once_cell::sync::{Lazy, OnceCell}; #[cfg(feature = "prometheus-client")] use prometheus_client::metrics::{counter::Counter, family::Family}; @@ -18,7 +17,7 @@ pub fn function_with_custom_metrics_metric() { } // Run the example with `--features=opentelemetry` to use the `opentelemetry` crate to define additional metrics. -#[cfg(feature = "openetelemetry")] +#[cfg(feature = "opentelemetry")] pub fn function_with_custom_opentelemetry_metric() { use once_cell::sync::Lazy; use opentelemetry::{global, metrics::Counter, KeyValue}; diff --git a/examples/exemplars-tracing-opentelemetry/Cargo.toml b/examples/exemplars-tracing-opentelemetry/Cargo.toml deleted file mode 100644 index 136f645c..00000000 --- a/examples/exemplars-tracing-opentelemetry/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "example-exemplars-tracing-opentelemetry" -version = "0.0.0" -publish = false -edition = "2021" - -[dependencies] -autometrics = { path = "../../autometrics", features = [ - "prometheus-client-0_22", - "prometheus-exporter", - "exemplars-tracing-opentelemetry-0_25", -] } -autometrics-example-util = { path = "../util" } -axum = { version = "0.7.2", features = ["json"] } -opentelemetry = "0.24" -opentelemetry_sdk = "0.24" -opentelemetry-stdout = { version = "0.5", features = ["trace"] } -reqwest = { version = "0.11", features = ["json"] } -tokio = { version = "1", features = ["full"] } -tracing = "0.1" -tracing-opentelemetry = "0.25" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/examples/exemplars-tracing-opentelemetry/README.md b/examples/exemplars-tracing-opentelemetry/README.md deleted file mode 100644 index 8d2a915f..00000000 --- a/examples/exemplars-tracing-opentelemetry/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Tracing + OpenTelemetry Exemplars Example - -This example demonstrates how Autometrics can create exemplars with the `trace_id` and `span_id` from the [`opentelemetry::Context`](https://docs.rs/opentelemetry/latest/opentelemetry/struct.Context.html), which is created by the [`tracing_opentelemetry::OpenTelemetryLayer`](https://docs.rs/tracing-opentelemetry/latest/tracing_opentelemetry/struct.OpenTelemetryLayer.html) and propagated by the `tracing` library. - -> **Note** -> -> Prometheus must be [specifically configured](https://prometheus.io/docs/prometheus/latest/feature_flags/#exemplars-storage) to enable the experimental exemplars feature. diff --git a/examples/exemplars-tracing-opentelemetry/src/main.rs b/examples/exemplars-tracing-opentelemetry/src/main.rs deleted file mode 100644 index 24981bde..00000000 --- a/examples/exemplars-tracing-opentelemetry/src/main.rs +++ /dev/null @@ -1,80 +0,0 @@ -use autometrics::{autometrics, prometheus_exporter}; -use autometrics_example_util::run_prometheus; -use axum::{routing::get, Router}; -use opentelemetry::trace::TracerProvider as _; -use opentelemetry_sdk::trace::TracerProvider; -use opentelemetry_stdout::SpanExporter; -use std::error::Error; -use std::net::Ipv4Addr; -use std::{io, net::SocketAddr, time::Duration}; -use tokio::net::TcpListener; -use tracing::{instrument, trace}; -use tracing_opentelemetry::OpenTelemetryLayer; -use tracing_subscriber::{layer::SubscriberExt, prelude::*, Registry}; - -// The instrument macro creates a new span for every call to this function, -// and the OpenTelemetryLayer added below attaches the OpenTelemetry Context -// to every span. -// -// Autometrics will pick up that Context and create exemplars from it. -#[autometrics] -#[instrument] -async fn outer_function() { - inner_function(); -} - -// This function will also have exemplars because it is called within -// the span of the outer_function -#[autometrics] -fn inner_function() { - trace!("Inner function called"); -} - -#[tokio::main] -async fn main() -> Result<(), Box> { - // Run Prometheus with flag --enable-feature=exemplars-storage - let _prometheus = run_prometheus(true); - tokio::spawn(generate_random_traffic()); - - // This exporter will discard the spans but you can use the other to see them - let exporter = SpanExporter::builder().with_writer(io::sink()).build(); - // let exporter = SpanExporter::default(); - - let provider = TracerProvider::builder() - .with_simple_exporter(exporter) - .build(); - let tracer = provider.tracer("example"); - - // This adds the OpenTelemetry Context to every tracing Span - let otel_layer = OpenTelemetryLayer::new(tracer); - Registry::default().with(otel_layer).init(); - - prometheus_exporter::init(); - - let app = Router::new().route("/", get(outer_function)).route( - "/metrics", - // Expose the metrics to Prometheus in the OpenMetrics format - get(|| async { prometheus_exporter::encode_http_response() }), - ); - - println!("\nVisit the following URL to see one of the charts along with the exemplars:"); - println!("http://localhost:9090/graph?g0.expr=%23%20Rate%20of%20calls%20to%20the%20%60outer_function%60%20function%20per%20second%2C%20averaged%20over%205%20minute%20windows%0A%0Asum%20by%20(function%2C%20module%2C%20commit%2C%20version)%20(rate(%7B__name__%3D~%22function_calls(_count)%3F(_total)%3F%22%2Cfunction%3D%22outer_function%22%7D%5B5m%5D)%20*%20on%20(instance%2C%20job)%20group_left(version%2C%20commit)%20last_over_time(build_info%5B1s%5D))&g0.tab=0&g0.stacked=0&g0.show_exemplars=1&g0.range_input=1h"); - - let listener = TcpListener::bind((Ipv4Addr::from([127, 0, 0, 1]), 3000)).await?; - axum::serve( - listener, - app.into_make_service_with_connect_info::(), - ) - .await?; - - opentelemetry::global::shutdown_tracer_provider(); - Ok(()) -} - -pub async fn generate_random_traffic() { - let client = reqwest::Client::new(); - loop { - client.get("http://localhost:3000").send().await.ok(); - tokio::time::sleep(Duration::from_millis(100)).await - } -} diff --git a/examples/exemplars-tracing/src/main.rs b/examples/exemplars-tracing/src/main.rs index 3093f3b4..77b35944 100644 --- a/examples/exemplars-tracing/src/main.rs +++ b/examples/exemplars-tracing/src/main.rs @@ -2,10 +2,10 @@ use autometrics::{ autometrics, exemplars::tracing::AutometricsExemplarExtractor, prometheus_exporter, }; use autometrics_example_util::run_prometheus; -use axum::{http::header::CONTENT_TYPE, response::Response, routing::get, Router}; +use axum::{routing::get, Router}; use std::error::Error; use std::net::Ipv4Addr; -use std::{net::SocketAddr, time::Duration}; +use std::time::Duration; use tokio::net::TcpListener; use tracing::{instrument, trace}; use tracing_subscriber::{prelude::*, EnvFilter}; diff --git a/examples/full-api/src/main.rs b/examples/full-api/src/main.rs index aea2be10..9cb6c28b 100644 --- a/examples/full-api/src/main.rs +++ b/examples/full-api/src/main.rs @@ -5,7 +5,7 @@ use autometrics_example_util::run_prometheus; use axum::routing::{get, post}; use axum::Router; use std::error::Error; -use std::net::{Ipv4Addr, SocketAddr}; +use std::net::Ipv4Addr; use tokio::net::TcpListener; mod database; diff --git a/examples/full-api/src/routes.rs b/examples/full-api/src/routes.rs index c8677b6f..f3321270 100644 --- a/examples/full-api/src/routes.rs +++ b/examples/full-api/src/routes.rs @@ -1,6 +1,6 @@ use autometrics::{autometrics, objectives::*}; use autometrics_example_util::sleep_random_duration; -use axum::{extract::State, http::StatusCode, Json}; +use axum::{extract::State, Json}; use rand::{thread_rng, Rng}; use serde::{Deserialize, Serialize}; diff --git a/examples/opentelemetry-push-custom/Cargo.toml b/examples/opentelemetry-push-custom/Cargo.toml index 08e20d4c..64a6a117 100644 --- a/examples/opentelemetry-push-custom/Cargo.toml +++ b/examples/opentelemetry-push-custom/Cargo.toml @@ -5,12 +5,12 @@ publish = false edition = "2021" [dependencies] -autometrics = { path = "../../autometrics", features = ["opentelemetry-0_24"] } +autometrics = { path = "../../autometrics", features = ["opentelemetry-0_30"] } autometrics-example-util = { path = "../util" } # Note that the version of the opentelemetry crate MUST match # the version used by autometrics -opentelemetry = { version = "0.24", features = ["metrics"] } -opentelemetry_sdk = { version = "0.24", features = ["metrics", "rt-tokio"] } -opentelemetry-otlp = { version = "0.17", features = ["tonic", "metrics"] } -opentelemetry-semantic-conventions = { version = "0.16.0" } +opentelemetry = { version = "0.30", features = ["metrics"] } +opentelemetry_sdk = { version = "0.30", features = ["metrics", "rt-tokio"] } +opentelemetry-otlp = { version = "0.30", features = ["tonic", "metrics"] } +opentelemetry-semantic-conventions = { version = "0.30.0" } tokio = { version = "1", features = ["full"] } diff --git a/examples/opentelemetry-push/Cargo.toml b/examples/opentelemetry-push/Cargo.toml index b045c93c..9a47a367 100644 --- a/examples/opentelemetry-push/Cargo.toml +++ b/examples/opentelemetry-push/Cargo.toml @@ -5,6 +5,6 @@ publish = false edition = "2021" [dependencies] -autometrics = { path = "../../autometrics", features = ["opentelemetry-0_24", "otel-push-exporter-http", "otel-push-exporter-tokio"] } +autometrics = { path = "../../autometrics", features = ["opentelemetry-0_30", "otel-push-exporter-http", "otel-push-exporter-tokio"] } autometrics-example-util = { path = "../util" } tokio = { version = "1", features = ["full"] }