mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-17 07:41:23 +01:00
Make observability more configurable
The following are now configurable: - the OpenTelemetry endpoint, - the tracing-flame filename, and - whether the log output should include timestamps (useful to disable if it goes straight into journald).
This commit is contained in:
parent
df571818f1
commit
e0e7d8fd91
2 changed files with 40 additions and 3 deletions
|
|
@ -185,6 +185,7 @@ pub(crate) struct MetricsConfig {
|
||||||
pub(crate) struct OtelTraceConfig {
|
pub(crate) struct OtelTraceConfig {
|
||||||
pub(crate) enable: bool,
|
pub(crate) enable: bool,
|
||||||
pub(crate) filter: EnvFilterClone,
|
pub(crate) filter: EnvFilterClone,
|
||||||
|
pub(crate) endpoint: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for OtelTraceConfig {
|
impl Default for OtelTraceConfig {
|
||||||
|
|
@ -192,6 +193,7 @@ impl Default for OtelTraceConfig {
|
||||||
Self {
|
Self {
|
||||||
enable: false,
|
enable: false,
|
||||||
filter: default_tracing_filter(),
|
filter: default_tracing_filter(),
|
||||||
|
endpoint: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -201,6 +203,7 @@ impl Default for OtelTraceConfig {
|
||||||
pub(crate) struct FlameConfig {
|
pub(crate) struct FlameConfig {
|
||||||
pub(crate) enable: bool,
|
pub(crate) enable: bool,
|
||||||
pub(crate) filter: EnvFilterClone,
|
pub(crate) filter: EnvFilterClone,
|
||||||
|
pub(crate) filename: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for FlameConfig {
|
impl Default for FlameConfig {
|
||||||
|
|
@ -208,6 +211,7 @@ impl Default for FlameConfig {
|
||||||
Self {
|
Self {
|
||||||
enable: false,
|
enable: false,
|
||||||
filter: default_tracing_filter(),
|
filter: default_tracing_filter(),
|
||||||
|
filename: "./tracing.folded".to_owned(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -218,6 +222,7 @@ pub(crate) struct LogConfig {
|
||||||
pub(crate) filter: EnvFilterClone,
|
pub(crate) filter: EnvFilterClone,
|
||||||
pub(crate) colors: bool,
|
pub(crate) colors: bool,
|
||||||
pub(crate) format: LogFormat,
|
pub(crate) format: LogFormat,
|
||||||
|
pub(crate) timestamp: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for LogConfig {
|
impl Default for LogConfig {
|
||||||
|
|
@ -226,6 +231,7 @@ impl Default for LogConfig {
|
||||||
filter: default_tracing_filter(),
|
filter: default_tracing_filter(),
|
||||||
colors: true,
|
colors: true,
|
||||||
format: LogFormat::default(),
|
format: LogFormat::default(),
|
||||||
|
timestamp: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ use opentelemetry::{
|
||||||
metrics::{MeterProvider, Unit},
|
metrics::{MeterProvider, Unit},
|
||||||
KeyValue,
|
KeyValue,
|
||||||
};
|
};
|
||||||
|
use opentelemetry_otlp::WithExportConfig;
|
||||||
use opentelemetry_sdk::{
|
use opentelemetry_sdk::{
|
||||||
metrics::{new_view, Aggregation, Instrument, SdkMeterProvider, Stream},
|
metrics::{new_view, Aggregation, Instrument, SdkMeterProvider, Stream},
|
||||||
Resource,
|
Resource,
|
||||||
|
|
@ -118,13 +119,17 @@ pub(crate) fn init(config: &Config) -> Result<Guard, error::Observability> {
|
||||||
opentelemetry::global::set_text_map_propagator(
|
opentelemetry::global::set_text_map_propagator(
|
||||||
opentelemetry_jaeger_propagator::Propagator::new(),
|
opentelemetry_jaeger_propagator::Propagator::new(),
|
||||||
);
|
);
|
||||||
|
let mut exporter = opentelemetry_otlp::new_exporter().tonic();
|
||||||
|
if let Some(endpoint) = &config.observability.traces.endpoint {
|
||||||
|
exporter = exporter.with_endpoint(endpoint);
|
||||||
|
}
|
||||||
let tracer = opentelemetry_otlp::new_pipeline()
|
let tracer = opentelemetry_otlp::new_pipeline()
|
||||||
.tracing()
|
.tracing()
|
||||||
.with_trace_config(
|
.with_trace_config(
|
||||||
opentelemetry_sdk::trace::config()
|
opentelemetry_sdk::trace::config()
|
||||||
.with_resource(standard_resource()),
|
.with_resource(standard_resource()),
|
||||||
)
|
)
|
||||||
.with_exporter(opentelemetry_otlp::new_exporter().tonic())
|
.with_exporter(exporter)
|
||||||
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
|
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
|
||||||
Ok((tracing_opentelemetry::layer().with_tracer(tracer), ()))
|
Ok((tracing_opentelemetry::layer().with_tracer(tracer), ()))
|
||||||
},
|
},
|
||||||
|
|
@ -135,15 +140,41 @@ pub(crate) fn init(config: &Config) -> Result<Guard, error::Observability> {
|
||||||
&config.observability.flame.filter,
|
&config.observability.flame.filter,
|
||||||
|| {
|
|| {
|
||||||
let (flame_layer, guard) =
|
let (flame_layer, guard) =
|
||||||
FlameLayer::with_file("./tracing.folded")?;
|
FlameLayer::with_file(&config.observability.flame.filename)?;
|
||||||
Ok((flame_layer.with_empty_samples(false), guard))
|
Ok((flame_layer.with_empty_samples(false), guard))
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let (fmt_layer, _) =
|
let (fmt_layer, _) =
|
||||||
make_backend(true, &config.observability.logs.filter, || {
|
make_backend(true, &config.observability.logs.filter, || {
|
||||||
|
/// Time format selection for `tracing_subscriber` at runtime
|
||||||
|
#[allow(clippy::missing_docs_in_private_items)]
|
||||||
|
enum TimeFormat {
|
||||||
|
SystemTime,
|
||||||
|
NoTime,
|
||||||
|
}
|
||||||
|
impl tracing_subscriber::fmt::time::FormatTime for TimeFormat {
|
||||||
|
fn format_time(
|
||||||
|
&self,
|
||||||
|
w: &mut tracing_subscriber::fmt::format::Writer<'_>,
|
||||||
|
) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
TimeFormat::SystemTime => {
|
||||||
|
tracing_subscriber::fmt::time::SystemTime
|
||||||
|
.format_time(w)
|
||||||
|
}
|
||||||
|
TimeFormat::NoTime => Ok(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let fmt_layer = tracing_subscriber::fmt::Layer::new()
|
let fmt_layer = tracing_subscriber::fmt::Layer::new()
|
||||||
.with_ansi(config.observability.logs.colors);
|
.with_ansi(config.observability.logs.colors)
|
||||||
|
.with_timer(if config.observability.logs.timestamp {
|
||||||
|
TimeFormat::SystemTime
|
||||||
|
} else {
|
||||||
|
TimeFormat::NoTime
|
||||||
|
});
|
||||||
let fmt_layer = match config.observability.logs.format {
|
let fmt_layer = match config.observability.logs.format {
|
||||||
LogFormat::Pretty => fmt_layer.pretty().boxed(),
|
LogFormat::Pretty => fmt_layer.pretty().boxed(),
|
||||||
LogFormat::Full => fmt_layer.boxed(),
|
LogFormat::Full => fmt_layer.boxed(),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue