Skip to content

Commit db2c6de

Browse files
authored
OTLP HTTP Metrics Exporter (#1020)
* initial changes * changes * changes * changes * changes * changes * changes * changes * changes * fix formatting issues * changes * changes * changes * fix CI and lint * more lint * removed commented code * fix * fix format * review comments
1 parent ecf0dda commit db2c6de

File tree

8 files changed

+262
-41
lines changed

8 files changed

+262
-41
lines changed

examples/basic-otlp-http/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ edition = "2021"
55
publish = false
66

77
[dependencies]
8+
once_cell = "1.17"
89
opentelemetry_api = { path = "../../opentelemetry-api" }
910
opentelemetry_sdk = { path = "../../opentelemetry-sdk", features = ["rt-tokio", "metrics"] }
1011
opentelemetry-otlp = { path = "../../opentelemetry-otlp", features = ["http-proto", "reqwest-client"] }

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

+35-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
use once_cell::sync::Lazy;
12
use opentelemetry_api::global;
23
use opentelemetry_api::trace::TraceError;
34
use opentelemetry_api::{
5+
metrics,
46
trace::{TraceContextExt, Tracer},
5-
Key,
7+
Context, Key, KeyValue,
68
};
79
use opentelemetry_otlp::WithExportConfig;
10+
use opentelemetry_sdk::metrics as sdkmetrics;
811
use opentelemetry_sdk::trace as sdktrace;
912
use std::error::Error;
1013

@@ -19,14 +22,44 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
1922
.install_batch(opentelemetry_sdk::runtime::Tokio)
2023
}
2124

25+
fn init_metrics() -> metrics::Result<sdkmetrics::MeterProvider> {
26+
let export_config = opentelemetry_otlp::ExportConfig {
27+
endpoint: "http://localhost:4318/v1/metrics".to_string(),
28+
..opentelemetry_otlp::ExportConfig::default()
29+
};
30+
opentelemetry_otlp::new_pipeline()
31+
.metrics(opentelemetry_sdk::runtime::Tokio)
32+
.with_exporter(
33+
opentelemetry_otlp::new_exporter()
34+
.http()
35+
.with_export_config(export_config),
36+
)
37+
.build()
38+
}
39+
2240
const LEMONS_KEY: Key = Key::from_static_str("ex.com/lemons");
2341
const ANOTHER_KEY: Key = Key::from_static_str("ex.com/another");
2442

43+
static COMMON_ATTRIBUTES: Lazy<[KeyValue; 4]> = Lazy::new(|| {
44+
[
45+
LEMONS_KEY.i64(10),
46+
KeyValue::new("A", "1"),
47+
KeyValue::new("B", "2"),
48+
KeyValue::new("C", "3"),
49+
]
50+
});
51+
2552
#[tokio::main]
2653
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
2754
let _ = init_tracer()?;
55+
let meter_provider = init_metrics()?;
2856

2957
let tracer = global::tracer("ex.com/basic");
58+
let meter = global::meter("ex.com/basic");
59+
60+
let histogram = meter.f64_histogram("ex.com.two").init();
61+
let cx = Context::new();
62+
histogram.record(&cx, 5.5, COMMON_ATTRIBUTES.as_ref());
3063

3164
tracer.in_span("operation", |cx| {
3265
let span = cx.span();
@@ -44,6 +77,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
4477
});
4578
});
4679

80+
meter_provider.shutdown()?;
4781
global::shutdown_tracer_provider();
4882

4983
Ok(())

opentelemetry-http/src/lib.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
use async_trait::async_trait;
12
use std::fmt::Debug;
23

34
#[doc(no_inline)]
45
pub use bytes::Bytes;
56
#[doc(no_inline)]
67
pub use http::{Request, Response};
7-
8-
use async_trait::async_trait;
98
use opentelemetry_api::{
109
propagation::{Extractor, Injector},
1110
trace::TraceError,

opentelemetry-otlp/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
# Changelog
2+
3+
## Main
4+
5+
### Added
6+
- Add OTLP HTTP Metrics Exporter [#1020](https://github.com/open-telemetry/opentelemetry-rust/pull/1020).
7+
28
## v0.12.0
39

410
### Added

opentelemetry-otlp/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ openssl = ["grpcio/openssl"]
8080
openssl-vendored = ["grpcio/openssl-vendored"]
8181

8282
# http binary
83-
http-proto = ["prost", "opentelemetry-http", "opentelemetry-proto/gen-tonic", "http", "trace"]
83+
http-proto = ["prost", "opentelemetry-http", "opentelemetry-proto/gen-tonic", "http", "trace", "metrics"]
8484
reqwest-blocking-client = ["reqwest/blocking", "opentelemetry-http/reqwest"]
8585
reqwest-client = ["reqwest", "opentelemetry-http/reqwest"]
8686
reqwest-rustls = ["reqwest", "reqwest/rustls-tls-native-roots"]

opentelemetry-otlp/src/lib.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,7 @@ impl OtlpExporterPipeline {
251251
/// Use HTTP as transport layer, return a `HttpExporterBuilder` to config the http transport
252252
/// and build the exporter.
253253
///
254-
/// This exporter can only be used in `tracing` pipeline. Support for `metrics` pipeline will be
255-
/// added in the future.
254+
/// This exporter can be used in both `tracing` and `metrics` pipeline.
256255
#[cfg(feature = "http-proto")]
257256
pub fn http(self) -> HttpExporterBuilder {
258257
HttpExporterBuilder::default()

0 commit comments

Comments
 (0)