pict-rs-aggregator/src/main.rs

131 lines
3.8 KiB
Rust
Raw Normal View History

2021-09-19 19:32:04 +00:00
use actix_web::{App, HttpServer};
2021-03-10 02:24:04 +00:00
use awc::Client;
2022-05-28 16:53:46 +00:00
use clap::Parser;
use console_subscriber::ConsoleLayer;
2021-09-19 19:32:04 +00:00
use opentelemetry::{
sdk::{propagation::TraceContextPropagator, Resource},
KeyValue,
};
use opentelemetry_otlp::WithExportConfig;
use std::time::Duration;
2021-09-19 19:32:04 +00:00
use tracing::subscriber::set_global_default;
use tracing_actix_web::TracingLogger;
2021-12-03 20:51:14 +00:00
use tracing_awc::Tracing;
2021-09-19 19:32:04 +00:00
use tracing_error::ErrorLayer;
use tracing_log::LogTracer;
use tracing_subscriber::{
2022-03-23 15:02:17 +00:00
filter::Targets, fmt::format::FmtSpan, layer::SubscriberExt, registry::LookupSpan, Layer,
Registry,
};
2021-09-19 19:32:04 +00:00
use url::Url;
2020-12-08 21:59:55 +00:00
2022-02-04 17:45:14 +00:00
#[actix_rt::main]
2021-09-06 20:44:01 +00:00
async fn main() -> Result<(), Box<dyn std::error::Error>> {
2022-05-28 16:53:46 +00:00
let config = pict_rs_aggregator::Config::parse();
2020-12-08 21:59:55 +00:00
2022-03-23 15:02:17 +00:00
init_logger(
config.opentelemetry_url(),
config.console_event_buffer_size(),
)?;
2020-12-08 21:59:55 +00:00
let mut db_path = config.db_path().to_owned();
db_path.push("sled");
db_path.push("db-0-34");
2022-03-23 15:02:17 +00:00
let db = sled::Config::new()
.path(db_path)
.cache_capacity(config.sled_cache_capacity())
.open()?;
2020-12-08 21:59:55 +00:00
let bind_address = config.bind_address();
let state = pict_rs_aggregator::state(config, "", db)?;
HttpServer::new(move || {
let client = Client::builder()
2021-12-03 20:51:14 +00:00
.wrap(Tracing)
.timeout(Duration::from_secs(30))
.add_default_header(("User-Agent", "pict_rs_aggregator-v0.5.0-alpha.1"))
.disable_redirects()
2020-12-08 21:59:55 +00:00
.finish();
App::new()
2021-09-19 19:32:04 +00:00
.wrap(TracingLogger::default())
.configure(|cfg| pict_rs_aggregator::configure(cfg, state.clone(), client))
2020-12-08 21:59:55 +00:00
})
.bind(bind_address)?
.run()
.await?;
Ok(())
}
2021-09-19 19:32:04 +00:00
2022-03-23 15:02:17 +00:00
fn init_logger(
opentelemetry_url: Option<&Url>,
console_event_buffer_size: Option<usize>,
) -> Result<(), Box<dyn std::error::Error>> {
2021-09-19 19:32:04 +00:00
LogTracer::init()?;
opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new());
let targets: Targets = std::env::var("RUST_LOG")
.unwrap_or_else(|_| "info".into())
.parse()?;
2021-09-19 19:32:04 +00:00
let format_layer = tracing_subscriber::fmt::layer()
.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
.with_filter(targets.clone());
2021-09-19 19:32:04 +00:00
let subscriber = Registry::default()
.with(format_layer)
.with(ErrorLayer::default());
2022-03-23 15:02:17 +00:00
if let Some(buffer_size) = console_event_buffer_size {
let console_layer = ConsoleLayer::builder()
.with_default_env()
.server_addr(([0, 0, 0, 0], 6669))
.event_buffer_capacity(buffer_size)
.spawn();
let subscriber = subscriber.with(console_layer);
init_subscriber(subscriber, targets, opentelemetry_url)
} else {
init_subscriber(subscriber, targets, opentelemetry_url)
}
}
2022-01-30 23:07:41 +00:00
2022-03-23 15:02:17 +00:00
fn init_subscriber<S>(
subscriber: S,
targets: Targets,
opentelemetry_url: Option<&Url>,
) -> Result<(), Box<dyn std::error::Error>>
where
S: SubscriberExt + Send + Sync,
for<'a> S: LookupSpan<'a>,
{
2021-09-19 19:32:04 +00:00
if let Some(url) = opentelemetry_url {
let tracer =
opentelemetry_otlp::new_pipeline()
.tracing()
.with_trace_config(opentelemetry::sdk::trace::config().with_resource(
Resource::new(vec![KeyValue::new("service.name", "pict-rs-aggregator")]),
))
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint(url.as_str()),
)
.install_batch(opentelemetry::runtime::Tokio)?;
let otel_layer = tracing_opentelemetry::layer()
.with_tracer(tracer)
.with_filter(targets);
2021-09-19 19:32:04 +00:00
let subscriber = subscriber.with(otel_layer);
set_global_default(subscriber)?;
} else {
set_global_default(subscriber)?;
}
Ok(())
}