mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-19 06:00:38 +00:00
compute_ctl is mostly written in synchronous fashion, intended to run in a single thread. However various parts had become async, and they launched their own tokio runtimes to run the async code. For example, VM monitor ran in its own multi-threaded runtime, and apply_spec_sql() launched another multi-threaded runtime to run the per-database SQL commands in parallel. In addition to that, a few places used a current-thread runtime to run async code in the main thread, or launched a current-thread runtime in a *different* thread to run background tasks. Unify the runtimes so that there is only one tokio runtime. It's created very early at process startup, and the main thread "enters" the runtime, so that it's always available for tokio::spawn() and runtime.block_on() calls. All code that needs to run async code uses the same runtime. The main thread still mostly runs in a synchronous fashion. When it needs to run async code, it uses rt.block_on(). Spawn fewer additional threads, prefer to spawn tokio tasks instead. Convert some code that ran synchronously in background threads into async. I didn't go all the way, though, some background threads are still spawned.
45 lines
1.5 KiB
Rust
45 lines
1.5 KiB
Rust
use tracing_subscriber::layer::SubscriberExt;
|
|
use tracing_subscriber::prelude::*;
|
|
|
|
/// Initialize logging to stderr, and OpenTelemetry tracing and exporter.
|
|
///
|
|
/// Logging is configured using either `default_log_level` or
|
|
/// `RUST_LOG` environment variable as default log level.
|
|
///
|
|
/// OpenTelemetry is configured with OTLP/HTTP exporter. It picks up
|
|
/// configuration from environment variables. For example, to change the destination,
|
|
/// set `OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318`. See
|
|
/// `tracing-utils` package description.
|
|
///
|
|
pub async fn init_tracing_and_logging(default_log_level: &str) -> anyhow::Result<()> {
|
|
// Initialize Logging
|
|
let env_filter = tracing_subscriber::EnvFilter::try_from_default_env()
|
|
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new(default_log_level));
|
|
|
|
let fmt_layer = tracing_subscriber::fmt::layer()
|
|
.with_ansi(false)
|
|
.with_target(false)
|
|
.with_writer(std::io::stderr);
|
|
|
|
// Initialize OpenTelemetry
|
|
let otlp_layer = tracing_utils::init_tracing("compute_ctl").await;
|
|
|
|
// Put it all together
|
|
tracing_subscriber::registry()
|
|
.with(env_filter)
|
|
.with(otlp_layer)
|
|
.with(fmt_layer)
|
|
.init();
|
|
tracing::info!("logging and tracing started");
|
|
|
|
utils::logging::replace_panic_hook_with_tracing_panic_hook().forget();
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Replace all newline characters with a special character to make it
|
|
/// easier to grep for log messages.
|
|
pub fn inlinify(s: &str) -> String {
|
|
s.replace('\n', "\u{200B}")
|
|
}
|