Add Opentelemetry tracing
This commit is contained in:
parent
7dd317512d
commit
95dc469e4b
5 changed files with 993 additions and 24 deletions
955
Cargo.lock
generated
955
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -10,3 +10,10 @@ reqwest = { version = "0.11", default-features = false, features = ["json", "rus
|
|||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
eyre = "0.6"
|
||||
|
||||
# Insights
|
||||
tower-http = { version = "0.4", features = ["trace"] }
|
||||
tracing = "0.1"
|
||||
axum-tracing-opentelemetry = { version = "0.10", features = ["otlp", "tracing_subscriber_ext"] }
|
||||
opentelemetry = { version = "0.19", features = ["rt-tokio"] }
|
||||
tracing-opentelemetry = "0.18"
|
||||
|
|
1
src/lifecycle/mod.rs
Normal file
1
src/lifecycle/mod.rs
Normal file
|
@ -0,0 +1 @@
|
|||
pub mod shutdown;
|
26
src/lifecycle/shutdown.rs
Normal file
26
src/lifecycle/shutdown.rs
Normal file
|
@ -0,0 +1,26 @@
|
|||
pub async fn shutdown_signal() {
|
||||
let ctrl_c = async {
|
||||
tokio::signal::ctrl_c()
|
||||
.await
|
||||
.expect("failed to install Ctrl+C handler");
|
||||
};
|
||||
|
||||
#[cfg(unix)]
|
||||
let terminate = async {
|
||||
tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
|
||||
.expect("failed to install signal handler")
|
||||
.recv()
|
||||
.await;
|
||||
};
|
||||
|
||||
#[cfg(not(unix))]
|
||||
let terminate = std::future::pending::<()>();
|
||||
|
||||
tokio::select! {
|
||||
_ = ctrl_c => {},
|
||||
_ = terminate => {},
|
||||
}
|
||||
|
||||
tracing::warn!("signal received, starting graceful shutdown");
|
||||
opentelemetry::global::shutdown_tracer_provider();
|
||||
}
|
26
src/main.rs
26
src/main.rs
|
@ -1,10 +1,13 @@
|
|||
mod collectors;
|
||||
mod lifecycle;
|
||||
|
||||
use axum::routing::get;
|
||||
use axum::Router;
|
||||
use axum::{Router, BoxError};
|
||||
use axum::extract::Path;
|
||||
use axum::http::StatusCode;
|
||||
use axum::response::IntoResponse;
|
||||
use axum::response::{IntoResponse};
|
||||
use axum::routing::get;
|
||||
use axum_tracing_opentelemetry::{response_with_trace_layer, opentelemetry_tracing_layer};
|
||||
use std::net::SocketAddr;
|
||||
use collectors::PromMetric;
|
||||
|
||||
fn convert_into_metrics(data: Vec<impl PromMetric>) -> String {
|
||||
|
@ -36,15 +39,22 @@ async fn stats(Path(rsn): Path<String>) -> impl IntoResponse {
|
|||
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
async fn main() -> Result<(), BoxError> {
|
||||
axum_tracing_opentelemetry::tracing_subscriber_ext::init_subscribers()?;
|
||||
|
||||
let app = Router::new()
|
||||
.route("/worlds", get(worlds))
|
||||
.route("/stats/:rsn", get(stats));
|
||||
.route("/stats/:rsn", get(stats))
|
||||
.layer(response_with_trace_layer())
|
||||
.layer(opentelemetry_tracing_layer());
|
||||
|
||||
println!("Starting...");
|
||||
let addr = SocketAddr::from(([0, 0, 0, 0], 3030));
|
||||
|
||||
tracing::warn!("listening on {}", addr);
|
||||
axum::Server::bind(&"0.0.0.0:3030".parse().unwrap())
|
||||
.serve(app.into_make_service())
|
||||
.await
|
||||
.unwrap();
|
||||
.with_graceful_shutdown(lifecycle::shutdown::shutdown_signal())
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue