Skip to content

Commit ac64b3a

Browse files
committed
feat: instrument request counter metrics
1 parent bcf864b commit ac64b3a

File tree

8 files changed

+85
-16
lines changed

8 files changed

+85
-16
lines changed

.dev/otelcol-config.yaml

+6-8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ receivers:
33
protocols:
44
grpc:
55
endpoint: localhost:4317
6-
76
processors:
87
resource/loki:
98
attributes:
@@ -13,7 +12,6 @@ processors:
1312
- action: insert
1413
key: loki.format
1514
value: logfmt # logfmt | json raw
16-
1715
exporters:
1816
loki:
1917
endpoint: ${env:LOKI_ENDPOINT}
@@ -22,14 +20,14 @@ exporters:
2220
job: false
2321
instance: false
2422
level: false
25-
2623
debug:
2724
verbosity: detailed
28-
2925
service:
3026
pipelines:
31-
logs:
27+
# logs:
28+
# receivers: [otlp]
29+
# processors: [resource/loki]
30+
# exporters: [debug]
31+
metrics:
3232
receivers: [otlp]
33-
processors: [resource/loki]
34-
exporters: [debug,loki]
35-
33+
exporters: [debug]

crates/synd_api/src/main.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use synd_api::{
66
config,
77
dependency::Dependency,
88
repository::kvsd::ConnectKvsdFailed,
9-
serve::listen_and_serve,
9+
serve::{layer::request_metrics::METRICS_TARGET, listen_and_serve},
1010
shutdown::Shutdown,
1111
};
12+
use tracing_subscriber::filter::filter_fn;
1213

1314
fn init_tracing() -> Option<OpenTelemetryGuard> {
1415
use synd_o11y::{
@@ -35,6 +36,8 @@ fn init_tracing() -> Option<OpenTelemetryGuard> {
3536
let resource =
3637
synd_o11y::opentelemetry::resource(config::NAME, config::VERSION, "local");
3738

39+
tracing::info!(endpoint, ?resource, "Export opentelemetry signals");
40+
3841
let trace_layer = otel_trace::layer(resource.clone());
3942
let log_layer = otel_log::layer(endpoint, resource.clone());
4043
let metrics_layer = otel_metrics::layer(resource);
@@ -55,6 +58,7 @@ fn init_tracing() -> Option<OpenTelemetryGuard> {
5558
.with_file(show_src)
5659
.with_line_number(show_src)
5760
.with_target(show_target)
61+
.with_filter(filter_fn(|metadata| metadata.target() != METRICS_TARGET))
5862
.and_then(opentelemetry_layers)
5963
.with_filter(
6064
EnvFilter::try_from_default_env()
+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pub mod authenticate;
2+
pub mod request_metrics;
23
pub mod trace;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use std::{
2+
convert::Infallible,
3+
pin::Pin,
4+
task::{Context, Poll},
5+
};
6+
7+
use axum::{extract::Request, response::Response};
8+
use futures_util::Future;
9+
use tower::{Layer, Service};
10+
use tracing::Level;
11+
12+
pub const METRICS_TARGET: &str = "metrics";
13+
14+
#[derive(Clone)]
15+
pub struct RequestMetricsLayer {}
16+
17+
impl RequestMetricsLayer {
18+
pub fn new() -> Self {
19+
Self {}
20+
}
21+
}
22+
23+
impl<S> Layer<S> for RequestMetricsLayer {
24+
type Service = RequestMetricsService<S>;
25+
26+
fn layer(&self, inner: S) -> Self::Service {
27+
RequestMetricsService { inner }
28+
}
29+
}
30+
31+
#[derive(Clone)]
32+
pub struct RequestMetricsService<S> {
33+
inner: S,
34+
}
35+
36+
impl<S> Service<Request> for RequestMetricsService<S>
37+
where
38+
S: Service<Request, Response = Response, Error = Infallible> + Clone + Send + 'static,
39+
S::Future: Send,
40+
{
41+
type Response = Response;
42+
type Error = Infallible;
43+
type Future =
44+
Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send + 'static>>;
45+
46+
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
47+
self.inner.poll_ready(cx)
48+
}
49+
50+
fn call(&mut self, req: Request) -> Self::Future {
51+
let path = req.uri().path().to_owned();
52+
53+
let mut this = self.clone();
54+
Box::pin(async move {
55+
let response = this.inner.call(req).await.unwrap();
56+
let status = response.status().as_u16();
57+
58+
tracing::event!(target: METRICS_TARGET, Level::INFO, monotonic_counter.request = 1, path, status);
59+
60+
Ok(response)
61+
})
62+
}
63+
}

crates/synd_api/src/serve/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::{
1717
config,
1818
dependency::Dependency,
1919
gql,
20-
serve::layer::{authenticate, trace},
20+
serve::layer::{authenticate, request_metrics::RequestMetricsLayer, trace},
2121
shutdown::Shutdown,
2222
};
2323

@@ -68,7 +68,8 @@ pub async fn serve(
6868
.layer(RequestBodyLimitLayer::new(2048))
6969
.layer(CorsLayer::new()),
7070
)
71-
.route("/healthcheck", get(probe::healthcheck));
71+
.route("/healthcheck", get(probe::healthcheck))
72+
.layer(RequestMetricsLayer::new());
7273

7374
axum_server::from_tcp_rustls(listener.into_std()?, tls_config)
7475
.handle(shutdown.into_handle())
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use opentelemetry::KeyValue;
22
use opentelemetry_sdk::Resource;
3-
use opentelemetry_semantic_conventions::resource::{
4-
DEPLOYMENT_ENVIRONMENT, SERVICE_NAME, SERVICE_NAMESPACE, SERVICE_VERSION,
3+
use opentelemetry_semantic_conventions::{
4+
resource::{DEPLOYMENT_ENVIRONMENT, SERVICE_NAME, SERVICE_NAMESPACE, SERVICE_VERSION},
5+
SCHEMA_URL,
56
};
67
use std::borrow::Cow;
78

@@ -10,7 +11,7 @@ pub fn resource(
1011
service_version: impl Into<Cow<'static, str>>,
1112
deployment_environment: impl Into<Cow<'static, str>>,
1213
) -> Resource {
13-
Resource::new(
14+
Resource::from_schema_url(
1415
[
1516
(SERVICE_NAME, service_name.into()),
1617
(SERVICE_VERSION, service_version.into()),
@@ -19,5 +20,6 @@ pub fn resource(
1920
]
2021
.into_iter()
2122
.map(|(key, value)| KeyValue::new(key, value)),
23+
SCHEMA_URL,
2224
)
2325
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fn init_meter_provider(resource: Resource) -> MeterProvider {
1717
.metrics(runtime::Tokio)
1818
.with_resource(resource)
1919
.with_exporter(opentelemetry_otlp::new_exporter().tonic())
20-
.with_period(Duration::from_secs(60 * 3))
20+
.with_period(Duration::from_secs(60))
2121
.build()
2222
.unwrap();
2323

justfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ api *flags:
9292

9393
# Run term
9494
term *flags:
95-
cd crates/synd_term; cargo run -- --log /tmp/syndterm.log {{flags}}
95+
cd crates/synd_term; cargo run -- --log /tmp/syndterm.log --endpoint https://localhost:5959/graphql {{flags}}
9696

9797
# Run opentelemetry-collector-contrib
9898
@otelcol:

0 commit comments

Comments
 (0)