Skip to content

Commit 4ca9405

Browse files
committed
logger improvements
1 parent a9da97a commit 4ca9405

14 files changed

Lines changed: 496 additions & 90 deletions

File tree

Cargo.lock

Lines changed: 79 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ tracing-subscriber = { version = "0.3.22", features = [
113113
"json",
114114
] }
115115
tracing-tree = "0.4.0"
116+
tracing-appender = "0.2.5"
116117

117118
# Storage
118119
object_store = { version = "0.13.2", features = ["aws"] }

bin/router/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ reqwest = { workspace = true }
3737
sonic-rs = { workspace = true }
3838
tracing = { workspace = true }
3939
tracing-subscriber = { workspace = true }
40-
tracing-tree = { workspace = true }
40+
tracing-appender = { workspace = true }
4141
hyper = { workspace = true, features = ["server", "http1"] }
4242
http = { workspace = true }
4343
http-body-util = { workspace = true }

bin/router/src/lib.rs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,17 @@ use graphql_tools::validation::rules::default_rules_validation_plan;
6060
pub use hive_router_config::humantime_serde;
6161
use hive_router_config::{load_config, subscriptions::CallbackConfig, HiveRouterConfig};
6262
pub use hive_router_internal::background_tasks;
63-
use hive_router_internal::background_tasks::{BackgroundTask, CancellationToken};
6463
use hive_router_internal::telemetry::{
64+
logging::{log_http_request_end, log_http_request_start},
6565
otel::tracing_opentelemetry::OpenTelemetrySpanExt,
66-
traces::spans::http_request::HttpServerRequestSpan, TelemetryContext,
66+
traces::spans::http_request::HttpServerRequestSpan,
67+
TelemetryContext,
6768
};
6869
pub use hive_router_internal::BoxError;
70+
use hive_router_internal::{
71+
background_tasks::{BackgroundTask, CancellationToken},
72+
telemetry::logging::logger_span::LoggerRootSpan,
73+
};
6974
use hive_router_internal::{
7075
http::read_request_body_size, telemetry::metrics::catalog::values::GraphQLResponseStatus,
7176
};
@@ -126,14 +131,37 @@ async fn graphql_endpoint_handler(
126131
schema_state: web::types::State<Arc<SchemaState>>,
127132
app_state: web::types::State<Arc<RouterSharedState>>,
128133
) -> web::HttpResponse {
134+
let parent_ctx = app_state
135+
.telemetry_context
136+
.extract_context(&HeaderExtractor(request.headers()));
137+
let trace_id = app_state
138+
.telemetry_context
139+
.logging_correlation_extractor
140+
.extract_trace_id(&parent_ctx);
141+
let req_id = app_state
142+
.telemetry_context
143+
.logging_correlation_extractor
144+
.extract_req_id(&request);
145+
146+
let root_logging_span = LoggerRootSpan::create(&req_id, &trace_id);
147+
129148
let http_request_capture = app_state
130149
.telemetry_context
131150
.metrics
132151
.http_server
133152
.capture_request(&request);
134153

135-
let response =
136-
graphql_endpoint_dispatch(&mut request, body_stream, schema_state, app_state.clone()).await;
154+
let response = async {
155+
log_http_request_start(&request);
156+
let inner_res =
157+
graphql_endpoint_dispatch(&mut request, body_stream, schema_state, app_state.clone())
158+
.await;
159+
log_http_request_end(&inner_res);
160+
161+
inner_res
162+
}
163+
.instrument(root_logging_span.span)
164+
.await;
137165

138166
let graphql_operation = read_graphql_operation_metric_identity(&request);
139167
let graphql_operation_name = graphql_operation

bin/router/src/telemetry.rs

Lines changed: 50 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
use std::{io::IsTerminal, str::FromStr, sync::Mutex};
2-
3-
use hive_router_config::{log::LogFormat, HiveRouterConfig};
1+
use hive_router_config::{
2+
log::{LogFormat, LoggingConfig},
3+
HiveRouterConfig,
4+
};
45
use hive_router_internal::{
56
http::normalize_route_path,
67
telemetry::{
78
build_otel_layer_from_config, build_resource, build_scope,
89
error::TelemetryError,
10+
logging::utils::{create_ignore_otel_filter, create_targets_filter, DynLayer},
911
metrics::{build_meter_provider_from_config, PrometheusRuntimeConfig},
1012
otel::{
1113
opentelemetry::{
@@ -25,12 +27,11 @@ use hive_router_internal::{
2527
use ntex::web::{self};
2628
use ntex::web::{App, HttpResponse, HttpServer};
2729
use prometheus::{Encoder, TextEncoder};
28-
use tracing_subscriber::{filter::filter_fn, util::SubscriberInitExt, Layer};
29-
use tracing_subscriber::{fmt::time::UtcTime, EnvFilter};
30-
use tracing_subscriber::{
31-
fmt::{self},
32-
layer::SubscriberExt,
33-
};
30+
use std::{io::IsTerminal, sync::Mutex};
31+
use tracing_appender::non_blocking::WorkerGuard;
32+
use tracing_subscriber::Layer;
33+
use tracing_subscriber::{fmt::time::UtcTime, Registry};
34+
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
3435

3536
pub struct HeaderExtractor<'a>(pub &'a ntex::http::HeaderMap);
3637

@@ -62,6 +63,7 @@ pub struct Telemetry {
6263
pub metrics_provider: Option<SdkMeterProvider>,
6364
pub prometheus: Option<PrometheusRuntime>,
6465
pub context: TelemetryContext,
66+
pub logging_writer_guard: tracing_appender::non_blocking::WorkerGuard,
6567
}
6668

6769
pub enum PrometheusRuntime {
@@ -128,11 +130,16 @@ impl Telemetry {
128130
(None, None)
129131
};
130132

131-
let registry = tracing_subscriber::registry().with(otel_layer);
132-
init_logging(config, registry)?;
133+
let (logging_layer, stdout_guard) = init_logging::<Registry>(&config.log);
134+
let registry = tracing_subscriber::registry()
135+
.with(logging_layer)
136+
.with(otel_layer);
137+
138+
registry.init();
133139

134140
let context = TelemetryContext::from_propagation_config_with_meter(
135141
&config.telemetry.tracing.propagation,
142+
&config.log,
136143
metrics_provider
137144
.as_ref()
138145
.map(|provider| provider.meter_with_scope(scope)),
@@ -145,6 +152,7 @@ impl Telemetry {
145152
metrics_provider,
146153
prometheus,
147154
context,
155+
logging_writer_guard: stdout_guard,
148156
})
149157
}
150158

@@ -195,6 +203,7 @@ impl Telemetry {
195203
.map(|setup| setup.provider.meter_with_scope(scope));
196204
let context = TelemetryContext::from_propagation_config_with_meter(
197205
&config.telemetry.tracing.propagation,
206+
&config.log,
198207
meter,
199208
);
200209

@@ -368,62 +377,43 @@ async fn metrics_handler(registry: web::types::State<prometheus::Registry>) -> H
368377
build_metrics_response(&registry)
369378
}
370379

371-
pub fn init_logging<S>(config: &HiveRouterConfig, registry: S) -> Result<(), TelemetryInitError>
380+
pub fn init_logging<S>(config: &LoggingConfig) -> (DynLayer<S>, WorkerGuard)
372381
where
373382
S: tracing::Subscriber
374383
+ for<'span> tracing_subscriber::registry::LookupSpan<'span>
375384
+ Send
376385
+ Sync,
377386
{
387+
let stdout_stream = std::io::stdout();
388+
let is_terminal = stdout_stream.is_terminal();
389+
let (stdout_writer, stdout_guard) = tracing_appender::non_blocking(stdout_stream);
390+
let targets_filter = create_targets_filter(&config.level, config.log_internals);
391+
let ignore_otel_filter = create_ignore_otel_filter();
392+
let stdout_layer = tracing_subscriber::fmt::layer().with_writer(stdout_writer);
378393
let timer = UtcTime::rfc_3339();
379-
let filter = EnvFilter::from_str(config.log.env_filter_str())?;
380-
let is_terminal = std::io::stdout().is_terminal();
381-
382-
let events_only = filter_fn(|m| !m.is_span());
383-
384-
match config.log.format {
385-
LogFormat::PrettyTree => {
386-
registry
387-
.with(
388-
tracing_tree::HierarchicalLayer::new(2)
389-
.with_ansi(is_terminal)
390-
.with_bracketed_fields(true)
391-
.with_deferred_spans(false)
392-
.with_wraparound(25)
393-
.with_indent_lines(true)
394-
.with_timer(tracing_tree::time::Uptime::default())
395-
.with_thread_names(false)
396-
.with_thread_ids(false)
397-
.with_targets(false)
398-
.with_filter(events_only),
399-
)
400-
.with(filter)
401-
.init();
402-
}
403-
LogFormat::Json => {
404-
registry
405-
.with(
406-
fmt::layer()
407-
.json()
408-
.with_timer(timer)
409-
.with_filter(events_only),
410-
)
411-
.with(filter)
412-
.init();
413-
}
414-
LogFormat::PrettyCompact => {
415-
registry
416-
.with(
417-
fmt::layer()
418-
.compact()
419-
.with_ansi(is_terminal)
420-
.with_timer(timer)
421-
.with_filter(events_only),
422-
)
423-
.with(filter)
424-
.init();
425-
}
394+
395+
let layer = match config.format {
396+
LogFormat::Json => stdout_layer
397+
.json()
398+
.with_timer(timer)
399+
.with_thread_ids(false)
400+
.with_target(true)
401+
.with_ansi(is_terminal)
402+
.flatten_event(true)
403+
.with_span_list(false)
404+
.with_filter(targets_filter)
405+
.with_filter(ignore_otel_filter)
406+
.boxed(),
407+
LogFormat::Text => stdout_layer
408+
.compact()
409+
.with_thread_ids(false)
410+
.with_timer(timer)
411+
.with_target(true)
412+
.with_ansi(is_terminal)
413+
.with_filter(targets_filter)
414+
.with_filter(ignore_otel_filter)
415+
.boxed(),
426416
};
427417

428-
Ok(())
418+
(layer, stdout_guard)
429419
}

0 commit comments

Comments
 (0)