Skip to content

Commit 5c49d18

Browse files
committed
editoast: setup tracing with opentelemetry for TestApp
Signed-off-by: hamz2a <atrari.hamza@gmail.com>
1 parent 5af6621 commit 5c49d18

File tree

4 files changed

+63
-22
lines changed

4 files changed

+63
-22
lines changed

editoast/src/client/telemetry_config.rs

+10
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ pub struct TelemetryConfig {
1717
pub telemetry_endpoint: Url,
1818
}
1919

20+
#[cfg(test)]
21+
impl From<crate::views::test_app::OpentelemetryConfig> for TelemetryConfig {
22+
fn from(_value: crate::views::test_app::OpentelemetryConfig) -> Self {
23+
Self {
24+
telemetry_kind: TelemetryKind::Opentelemetry,
25+
..Default::default()
26+
}
27+
}
28+
}
29+
2030
#[derive(Default, ValueEnum, Debug, Derivative, Clone, strum::Display)]
2131
#[strum(serialize_all = "lowercase")]
2232
pub enum TelemetryKind {

editoast/src/main.rs

+30-12
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,18 @@ use client::user::UserCommand;
3030
use client::Client;
3131
use client::Color;
3232
use client::Commands;
33+
use client::TelemetryConfig;
3334
use editoast_models::DbConnectionPoolV2;
3435
use models::RollingStockModel;
3536
use opentelemetry::trace::TracerProvider as _;
37+
use opentelemetry_sdk::export::trace::SpanExporter;
3638
use opentelemetry_sdk::propagation::TraceContextPropagator;
3739
use opentelemetry_sdk::resource::EnvResourceDetector;
3840
use opentelemetry_sdk::resource::SdkProvidedResourceDetector;
3941
use opentelemetry_sdk::resource::TelemetryResourceDetector;
42+
use tracing_subscriber::layer::SubscriberExt;
43+
use tracing_subscriber::util::SubscriberInitExt;
44+
use tracing_subscriber::Layer;
4045
pub use views::AppState;
4146

4247
use models::prelude::*;
@@ -50,9 +55,6 @@ use std::sync::Arc;
5055
use std::time::Duration;
5156
use thiserror::Error;
5257
use tracing::error;
53-
use tracing_subscriber::layer::SubscriberExt as _;
54-
use tracing_subscriber::util::SubscriberInitExt as _;
55-
use tracing_subscriber::Layer as _;
5658
pub use valkey_utils::ValkeyClient;
5759
pub use valkey_utils::ValkeyConnection;
5860

@@ -66,12 +68,23 @@ pub use valkey_utils::ValkeyConnection;
6668
/// - we *expect* a webserver to output logging information, so since it's an expected
6769
/// output (and not extra information), it should be on stdout
6870
#[derive(Debug, PartialEq)]
69-
enum EditoastMode {
71+
pub enum EditoastMode {
7072
Webservice,
7173
Cli,
7274
}
7375

74-
fn init_tracing(mode: EditoastMode, telemetry_config: &client::TelemetryConfig) {
76+
#[cfg(test)]
77+
impl From<views::test_app::WebserviceMode> for EditoastMode {
78+
fn from(_value: views::test_app::WebserviceMode) -> Self {
79+
Self::Webservice
80+
}
81+
}
82+
83+
pub fn create_tracing_subscriber<T: SpanExporter + 'static>(
84+
mode: EditoastMode,
85+
telemetry_config: TelemetryConfig,
86+
exporter: T,
87+
) -> impl tracing::Subscriber {
7588
let env_filter_layer = tracing_subscriber::EnvFilter::builder()
7689
// Set the default log level to 'info'
7790
.with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())
@@ -89,11 +102,6 @@ fn init_tracing(mode: EditoastMode, telemetry_config: &client::TelemetryConfig)
89102
let telemetry_layer = match telemetry_config.telemetry_kind {
90103
client::TelemetryKind::None => None,
91104
client::TelemetryKind::Opentelemetry => {
92-
let exporter = opentelemetry_otlp::SpanExporter::builder()
93-
.with_tonic()
94-
.with_endpoint(telemetry_config.telemetry_endpoint.as_str())
95-
.build()
96-
.expect("failed to build a span exporter");
97105
let resource = Resource::new(vec![KeyValue::new(
98106
opentelemetry_semantic_conventions::resource::SERVICE_NAME,
99107
telemetry_config.service_name.clone(),
@@ -116,11 +124,11 @@ fn init_tracing(mode: EditoastMode, telemetry_config: &client::TelemetryConfig)
116124
Some(layer)
117125
}
118126
};
127+
119128
tracing_subscriber::registry()
120129
.with(telemetry_layer)
121130
.with(env_filter_layer)
122131
.with(fmt_layer)
123-
.init();
124132
}
125133

126134
impl EditoastMode {
@@ -151,7 +159,17 @@ async fn main() {
151159

152160
async fn run() -> Result<(), Box<dyn Error + Send + Sync>> {
153161
let client = Client::parse();
154-
init_tracing(EditoastMode::from_client(&client), &client.telemetry_config);
162+
let exporter = opentelemetry_otlp::SpanExporter::builder()
163+
.with_tonic()
164+
.with_endpoint(client.telemetry_config.telemetry_endpoint.as_str())
165+
.build()
166+
.expect("failed to build a span exporter");
167+
create_tracing_subscriber(
168+
EditoastMode::from_client(&client),
169+
client.telemetry_config,
170+
exporter,
171+
)
172+
.init();
155173

156174
let pg_config = client.postgres_config;
157175
let db_pool =

editoast/src/views/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub mod train_schedule;
2222
pub mod work_schedules;
2323

2424
#[cfg(test)]
25-
mod test_app;
25+
pub mod test_app;
2626

2727
use ::core::str;
2828
use std::collections::HashSet;

editoast/src/views/test_app.rs

+22-9
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@ use axum_tracing_opentelemetry::middleware::OtelAxumLayer;
99
use dashmap::DashMap;
1010
use editoast_models::DbConnectionPoolV2;
1111
use editoast_osrdyne_client::OsrdyneClient;
12+
use futures::future::BoxFuture;
13+
use opentelemetry_sdk::export::trace::ExportResult;
14+
use opentelemetry_sdk::export::trace::SpanData;
15+
use opentelemetry_sdk::export::trace::SpanExporter;
1216
use serde::de::DeserializeOwned;
1317
use tower_http::trace::TraceLayer;
1418
use url::Url;
1519

1620
use crate::{
1721
core::{mocking::MockingClient, CoreClient},
22+
create_tracing_subscriber,
1823
generated_data::speed_limit_tags_config::SpeedLimitTagIds,
1924
infra_cache::InfraCache,
2025
map::MapLayers,
@@ -26,6 +31,15 @@ use axum_test::TestServer;
2631

2732
use super::{authentication_middleware, CoreConfig, OsrdyneConfig, PostgresConfig, ServerConfig};
2833

34+
#[derive(Debug)]
35+
pub struct NoopSpanExporter;
36+
37+
impl SpanExporter for NoopSpanExporter {
38+
fn export(&mut self, _: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
39+
Box::pin(std::future::ready(Ok(())))
40+
}
41+
}
42+
2943
/// A builder interface for [TestApp]
3044
///
3145
/// It allows configuring some parameters for the app service.
@@ -106,15 +120,11 @@ impl TestAppBuilder {
106120
};
107121

108122
// Setup tracing
109-
let sub = tracing_subscriber::fmt()
110-
.pretty()
111-
.with_env_filter(
112-
tracing_subscriber::EnvFilter::builder()
113-
.with_default_directive(tracing_subscriber::filter::LevelFilter::DEBUG.into())
114-
.from_env_lossy(),
115-
)
116-
.with_span_events(tracing_subscriber::fmt::format::FmtSpan::CLOSE)
117-
.finish();
123+
let sub = create_tracing_subscriber(
124+
WebserviceMode.into(),
125+
OpentelemetryConfig.into(),
126+
NoopSpanExporter,
127+
);
118128
let tracing_guard = tracing::subscriber::set_default(sub);
119129

120130
// Config valkey
@@ -180,6 +190,9 @@ impl TestAppBuilder {
180190
}
181191
}
182192

193+
pub(crate) struct WebserviceMode;
194+
pub(crate) struct OpentelemetryConfig;
195+
183196
/// Wraps an underlying, fully configured, actix service
184197
///
185198
/// It also holds a reference to the database connection pool and the core client,

0 commit comments

Comments
 (0)