Skip to content

Commit 14e0926

Browse files
committed
feat: configure endpoint
1 parent 8a7395f commit 14e0926

File tree

4 files changed

+88
-30
lines changed

4 files changed

+88
-30
lines changed

crates/synd_o11y/src/opentelemetry/resource.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ pub fn resource(
1010
service_name: impl Into<Cow<'static, str>>,
1111
service_version: impl Into<Cow<'static, str>>,
1212
) -> Resource {
13-
Resource::from_detectors(
14-
Duration::from_millis(200),
15-
// Detect "OTEL_RESOURCE_ATTRIBUTES" environment variables
16-
vec![Box::new(EnvResourceDetector::new())],
17-
)
18-
.merge(&Resource::from_schema_url(
13+
Resource::from_schema_url(
1914
[
2015
(SERVICE_NAME, service_name.into()),
2116
(SERVICE_VERSION, service_version.into()),
@@ -24,5 +19,10 @@ pub fn resource(
2419
.into_iter()
2520
.map(|(key, value)| KeyValue::new(key, value)),
2621
SCHEMA_URL,
22+
)
23+
.merge(&Resource::from_detectors(
24+
Duration::from_millis(200),
25+
// Detect "OTEL_RESOURCE_ATTRIBUTES" environment variables
26+
vec![Box::new(EnvResourceDetector::new())],
2727
))
2828
}

crates/synd_o11y/src/tracing_subscriber/otel_log/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge;
2-
use opentelemetry_otlp::WithExportConfig;
2+
use opentelemetry_otlp::WithExportConfig as _;
33
use opentelemetry_sdk::{runtime, Resource};
44
use tracing::Subscriber;
55
use tracing_subscriber::{registry::LookupSpan, Layer};
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
use std::time::Duration;
22

3-
use opentelemetry_sdk::{metrics::MeterProvider, runtime, Resource};
3+
use opentelemetry::{
4+
global,
5+
metrics::{MeterProvider, Unit},
6+
};
7+
use opentelemetry_otlp::WithExportConfig as _;
8+
use opentelemetry_sdk::{
9+
metrics::{
10+
reader::{DefaultAggregationSelector, DefaultTemporalitySelector},
11+
Instrument, MeterProvider as SdkMeterProvider, PeriodicReader, Stream, View,
12+
},
13+
runtime, Resource,
14+
};
415
use tracing::{Metadata, Subscriber};
516
use tracing_opentelemetry::MetricsLayer;
617
use tracing_subscriber::{filter::filter_fn, layer::Filter, registry::LookupSpan, Layer};
@@ -13,23 +24,68 @@ pub fn metrics_event_filter<S: Subscriber>() -> impl Filter<S> {
1324
filter_fn(|metadata: &Metadata<'_>| metadata.target() != METRICS_EVENT_TARGET)
1425
}
1526

16-
pub fn layer<S>(resource: Resource) -> impl Layer<S>
27+
pub fn layer<S>(endpoint: impl Into<String>, resource: Resource) -> impl Layer<S>
1728
where
1829
S: Subscriber + for<'span> LookupSpan<'span>,
1930
{
20-
MetricsLayer::new(init_meter_provider(resource))
31+
MetricsLayer::new(init_meter_provider(endpoint, resource))
2132
}
2233

23-
fn init_meter_provider(resource: Resource) -> MeterProvider {
24-
let provider = opentelemetry_otlp::new_pipeline()
25-
.metrics(runtime::Tokio)
26-
.with_resource(resource)
27-
.with_exporter(opentelemetry_otlp::new_exporter().tonic())
28-
.with_period(Duration::from_secs(60))
29-
.build()
34+
fn init_meter_provider(endpoint: impl Into<String>, resource: Resource) -> impl MeterProvider {
35+
// Currently OtelpMetricPipeline does not provide a way to set up views.
36+
let exporter = opentelemetry_otlp::new_exporter()
37+
.tonic()
38+
.with_endpoint(endpoint)
39+
.build_metrics_exporter(
40+
Box::new(DefaultAggregationSelector::new()),
41+
Box::new(DefaultTemporalitySelector::new()),
42+
)
3043
.unwrap();
3144

32-
opentelemetry::global::set_meter_provider(provider.clone());
45+
let reader = PeriodicReader::builder(exporter, runtime::Tokio)
46+
.with_interval(Duration::from_secs(60))
47+
.build();
48+
49+
let view = view();
50+
51+
let meter_provider = SdkMeterProvider::builder()
52+
.with_resource(resource)
53+
.with_reader(reader)
54+
.with_view(view)
55+
.build();
56+
57+
global::set_meter_provider(meter_provider.clone());
58+
59+
meter_provider
60+
}
61+
62+
fn view() -> impl View {
63+
|instrument: &Instrument| -> Option<Stream> {
64+
tracing::debug!("{instrument:?}");
3365

34-
provider
66+
match instrument.name.as_ref() {
67+
"graphql.duration" => Some(
68+
Stream::new()
69+
.name(instrument.name.clone())
70+
.description("graphql response duration")
71+
// Currently we could not ingest metrics with Arregation::Base2ExponentialHistogram in grafanacloud
72+
.aggregation(
73+
opentelemetry_sdk::metrics::Aggregation::ExplicitBucketHistogram {
74+
// https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#http-server
75+
boundaries: vec![
76+
0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5,
77+
5.0, 7.5, 10.0,
78+
],
79+
record_min_max: false,
80+
},
81+
)
82+
// https://opentelemetry.io/docs/specs/semconv/general/metrics/#instrument-units
83+
.unit(Unit::new("s")),
84+
),
85+
name => {
86+
tracing::info!(name, "There is no explicit view");
87+
None
88+
}
89+
}
90+
}
3591
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use opentelemetry_otlp::WithExportConfig;
12
use opentelemetry_sdk::{
23
runtime,
34
trace::{BatchConfig, Sampler, Tracer},
@@ -7,21 +8,18 @@ use tracing::Subscriber;
78
use tracing_opentelemetry::OpenTelemetryLayer;
89
use tracing_subscriber::{registry::LookupSpan, Layer};
910

10-
pub fn layer<S>(resource: Resource) -> impl Layer<S>
11+
pub fn layer<S>(
12+
endpoint: impl Into<String>,
13+
resource: Resource,
14+
sampler_ratio: f64,
15+
) -> impl Layer<S>
1116
where
1217
S: Subscriber + for<'span> LookupSpan<'span>,
1318
{
14-
OpenTelemetryLayer::new(init_tracer(resource))
19+
OpenTelemetryLayer::new(init_tracer(endpoint, resource, sampler_ratio))
1520
}
1621

17-
fn init_tracer(resource: Resource) -> Tracer {
18-
// https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/
19-
let sampler_ratio = std::env::var("OTEL_TRACES_SAMPLER_ARG")
20-
.ok()
21-
.and_then(|v| v.parse::<f64>().ok())
22-
.unwrap_or(0.);
23-
24-
// TODO: construct tonic transport channel
22+
fn init_tracer(endpoint: impl Into<String>, resource: Resource, sampler_ratio: f64) -> Tracer {
2523
opentelemetry_otlp::new_pipeline()
2624
.tracing()
2725
.with_trace_config(
@@ -32,7 +30,11 @@ fn init_tracer(resource: Resource) -> Tracer {
3230
.with_resource(resource),
3331
)
3432
.with_batch_config(BatchConfig::default())
35-
.with_exporter(opentelemetry_otlp::new_exporter().tonic())
33+
.with_exporter(
34+
opentelemetry_otlp::new_exporter()
35+
.tonic()
36+
.with_endpoint(endpoint),
37+
)
3638
.install_batch(runtime::Tokio)
3739
.unwrap()
3840
}

0 commit comments

Comments
 (0)