Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://github.com/open-telemetry/opentelemetry-rust/pull/2831>)
- Update `opentelemetry` to v0.30

## [2.0.0](https://github.com/autometrics-dev/autometrics-rs/releases/tag/v2.0.0) - 2024-07-25

Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
34 changes: 14 additions & 20 deletions autometrics/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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",
]
Expand Down Expand Up @@ -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
Expand All @@ -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 }
Expand All @@ -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"
Expand Down
8 changes: 4 additions & 4 deletions autometrics/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand 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" },
Expand Down
2 changes: 1 addition & 1 deletion autometrics/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
126 changes: 42 additions & 84 deletions autometrics/src/otel_push_exporter.rs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -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<String>) -> Result<OtelMeterProvider, MetricsError> {
pub fn init_http(url: impl Into<String>) -> Result<OtelMeterProvider, ExporterBuildError> {
let (timeout, period) = timeout_and_period_from_env_or_default();
init_http_with_timeout_period(url, timeout, period)
}
Expand All @@ -43,21 +44,22 @@ pub fn init_http_with_timeout_period(
url: impl Into<String>,
timeout: Duration,
period: Duration,
) -> Result<OtelMeterProvider, MetricsError> {
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<OtelMeterProvider, ExporterBuildError> {
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.
Expand All @@ -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<String>) -> Result<OtelMeterProvider, MetricsError> {
pub fn init_grpc(url: impl Into<String>) -> Result<OtelMeterProvider, ExporterBuildError> {
let (timeout, period) = timeout_and_period_from_env_or_default();
init_grpc_with_timeout_period(url, timeout, period)
}
Expand All @@ -78,21 +80,22 @@ pub fn init_grpc_with_timeout_period(
url: impl Into<String>,
timeout: Duration,
period: Duration,
) -> Result<OtelMeterProvider, MetricsError> {
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<OtelMeterProvider, ExporterBuildError> {
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
Expand All @@ -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(
Expand All @@ -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<opentelemetry_sdk::runtime::Tokio, opentelemetry_otlp::NoExporterConfig> {
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<opentelemetry_sdk::runtime::AsyncStd, opentelemetry_otlp::NoExporterConfig>
{
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()
}
Loading