opentelemetry

This commit is contained in:
Robin Appelman 2024-01-17 22:31:00 +01:00
commit 62acb3692a
5 changed files with 289 additions and 25 deletions

237
Cargo.lock generated
View file

@ -896,6 +896,9 @@ dependencies = [
"include_dir", "include_dir",
"itertools 0.12.0", "itertools 0.12.0",
"maud", "maud",
"opentelemetry",
"opentelemetry-otlp",
"opentelemetry_sdk",
"quick-xml", "quick-xml",
"rand", "rand",
"reqwest", "reqwest",
@ -912,6 +915,7 @@ dependencies = [
"toml 0.8.8", "toml 0.8.8",
"tower-http", "tower-http",
"tracing", "tracing",
"tracing-opentelemetry",
"tracing-subscriber", "tracing-subscriber",
] ]
@ -1500,6 +1504,18 @@ dependencies = [
"want", "want",
] ]
[[package]]
name = "hyper-timeout"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
dependencies = [
"hyper",
"pin-project-lite",
"tokio",
"tokio-io-timeout",
]
[[package]] [[package]]
name = "hyper-tls" name = "hyper-tls"
version = "0.5.0" version = "0.5.0"
@ -1688,9 +1704,9 @@ checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.61" version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"
dependencies = [ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
@ -2336,6 +2352,93 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "opentelemetry"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a"
dependencies = [
"futures-core",
"futures-sink",
"indexmap 2.1.0",
"js-sys",
"once_cell",
"pin-project-lite",
"thiserror",
"urlencoding",
]
[[package]]
name = "opentelemetry-otlp"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f24cda83b20ed2433c68241f918d0f6fdec8b1d43b7a9590ab4420c5095ca930"
dependencies = [
"async-trait",
"futures-core",
"http",
"opentelemetry",
"opentelemetry-proto",
"opentelemetry-semantic-conventions",
"opentelemetry_sdk",
"prost",
"thiserror",
"tokio",
"tonic",
]
[[package]]
name = "opentelemetry-proto"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2e155ce5cc812ea3d1dffbd1539aed653de4bf4882d60e6e04dcf0901d674e1"
dependencies = [
"opentelemetry",
"opentelemetry_sdk",
"prost",
"tonic",
]
[[package]]
name = "opentelemetry-semantic-conventions"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84"
dependencies = [
"opentelemetry",
]
[[package]]
name = "opentelemetry_sdk"
version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f16aec8a98a457a52664d69e0091bac3a0abd18ead9b641cb00202ba4e0efe4"
dependencies = [
"async-trait",
"crossbeam-channel",
"futures-channel",
"futures-executor",
"futures-util",
"glob",
"once_cell",
"opentelemetry",
"ordered-float",
"percent-encoding",
"rand",
"thiserror",
"tokio",
"tokio-stream",
]
[[package]]
name = "ordered-float"
version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e"
dependencies = [
"num-traits 0.2.15",
]
[[package]] [[package]]
name = "ordered-multimap" name = "ordered-multimap"
version = "0.4.3" version = "0.4.3"
@ -2718,6 +2821,29 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "prost"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd"
dependencies = [
"bytes",
"prost-derive",
]
[[package]]
name = "prost-derive"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4"
dependencies = [
"anyhow",
"itertools 0.10.5",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "psm" name = "psm"
version = "0.1.21" version = "0.1.21"
@ -4930,6 +5056,16 @@ dependencies = [
"windows-sys 0.45.0", "windows-sys 0.45.0",
] ]
[[package]]
name = "tokio-io-timeout"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
dependencies = [
"pin-project-lite",
"tokio",
]
[[package]] [[package]]
name = "tokio-macros" name = "tokio-macros"
version = "2.0.0" version = "2.0.0"
@ -5019,6 +5155,34 @@ dependencies = [
"winnow", "winnow",
] ]
[[package]]
name = "tonic"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a"
dependencies = [
"async-trait",
"axum",
"base64 0.21.0",
"bytes",
"futures-core",
"futures-util",
"h2",
"http",
"http-body",
"hyper",
"hyper-timeout",
"percent-encoding",
"pin-project",
"prost",
"tokio",
"tokio-stream",
"tower",
"tower-layer",
"tower-service",
"tracing",
]
[[package]] [[package]]
name = "tower" name = "tower"
version = "0.4.13" version = "0.4.13"
@ -5027,9 +5191,13 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-util", "futures-util",
"indexmap 1.9.3",
"pin-project", "pin-project",
"pin-project-lite", "pin-project-lite",
"rand",
"slab",
"tokio", "tokio",
"tokio-util",
"tower-layer", "tower-layer",
"tower-service", "tower-service",
"tracing", "tracing",
@ -5117,6 +5285,35 @@ dependencies = [
"tracing-core", "tracing-core",
] ]
[[package]]
name = "tracing-log"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [
"log",
"once_cell",
"tracing-core",
]
[[package]]
name = "tracing-opentelemetry"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596"
dependencies = [
"js-sys",
"once_cell",
"opentelemetry",
"opentelemetry_sdk",
"smallvec",
"tracing",
"tracing-core",
"tracing-log 0.2.0",
"tracing-subscriber",
"web-time",
]
[[package]] [[package]]
name = "tracing-subscriber" name = "tracing-subscriber"
version = "0.3.17" version = "0.3.17"
@ -5132,7 +5329,7 @@ dependencies = [
"thread_local", "thread_local",
"tracing", "tracing",
"tracing-core", "tracing-core",
"tracing-log", "tracing-log 0.1.3",
] ]
[[package]] [[package]]
@ -5331,9 +5528,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.84" version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"serde", "serde",
@ -5343,16 +5540,16 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.84" version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"log", "log",
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "syn 2.0.39",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -5370,9 +5567,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.84" version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -5380,22 +5577,22 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.84" version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "syn 2.0.39",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.84" version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
[[package]] [[package]]
name = "web-sys" name = "web-sys"
@ -5407,6 +5604,16 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "web-time"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]] [[package]]
name = "webpki-roots" name = "webpki-roots"
version = "0.25.3" version = "0.25.3"

View file

@ -6,6 +6,10 @@ edition = "2021"
[dependencies] [dependencies]
tracing = "0.1.37" tracing = "0.1.37"
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
tracing-opentelemetry = "0.22.0"
opentelemetry = { version = "0.21.0" }
opentelemetry_sdk = { version = "0.21.2", features = ["rt-tokio"] }
opentelemetry-otlp = { version = "0.14.0" }
serde = { version = "1.0.159", features = ["derive"] } serde = { version = "1.0.159", features = ["derive"] }
toml = "0.8.8" toml = "0.8.8"
sqlx = { version = "0.7.3", features = ["postgres", "time", "runtime-tokio-rustls"] } sqlx = { version = "0.7.3", features = ["postgres", "time", "runtime-tokio-rustls"] }

View file

@ -1,3 +1,4 @@
use crate::error::SetupError;
use crate::Result; use crate::Result;
use config::{Environment, File}; use config::{Environment, File};
use serde::Deserialize; use serde::Deserialize;
@ -15,7 +16,7 @@ pub struct Config {
} }
impl Config { impl Config {
pub fn load(path: &str) -> Result<Self> { pub fn load(path: &str) -> Result<Self, SetupError> {
let s = config::Config::builder() let s = config::Config::builder()
.add_source(File::with_name(path)) .add_source(File::with_name(path))
.add_source(Environment::default().separator("_")) .add_source(Environment::default().separator("_"))

View file

@ -1,14 +1,14 @@
use axum::http::StatusCode; use axum::http::StatusCode;
use axum::response::{IntoResponse, Response}; use axum::response::{IntoResponse, Response};
use config::ConfigError; use config::ConfigError;
use opentelemetry::trace::TraceError;
use tracing_subscriber::util::TryInitError;
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
pub enum Error { pub enum Error {
#[error(transparent)] #[error(transparent)]
Sqlx(#[from] sqlx::Error), Sqlx(#[from] sqlx::Error),
#[error(transparent)] #[error(transparent)]
Config(#[from] ConfigError),
#[error(transparent)]
Hyper(#[from] hyper::Error), Hyper(#[from] hyper::Error),
#[error(transparent)] #[error(transparent)]
Io(#[from] std::io::Error), Io(#[from] std::io::Error),
@ -22,6 +22,20 @@ pub enum Error {
Xml(#[from] quick_xml::de::DeError), Xml(#[from] quick_xml::de::DeError),
#[error(transparent)] #[error(transparent)]
Session(#[from] async_session::Error), Session(#[from] async_session::Error),
#[error(transparent)]
Setup(#[from] SetupError),
}
#[derive(Debug, thiserror::Error)]
pub enum SetupError {
#[error("no config file or env provided")]
NoConfigProvided,
#[error(transparent)]
Tracing(#[from] TraceError),
#[error(transparent)]
TracingSubscriber(#[from] TryInitError),
#[error(transparent)]
Config(#[from] ConfigError),
} }
impl IntoResponse for Error { impl IntoResponse for Error {

View file

@ -13,6 +13,7 @@ use crate::data::demo::{Demo, Filter, ListDemo};
use crate::data::maps::map_list; use crate::data::maps::map_list;
use crate::data::steam_id::SteamId; use crate::data::steam_id::SteamId;
use crate::data::user::User; use crate::data::user::User;
use crate::error::SetupError;
use crate::fragments::demo_list::DemoList; use crate::fragments::demo_list::DemoList;
use crate::pages::about::AboutPage; use crate::pages::about::AboutPage;
use crate::pages::api::ApiPage; use crate::pages::api::ApiPage;
@ -38,6 +39,9 @@ use hyper::header::CACHE_CONTROL;
use hyperlocal::UnixServerExt; use hyperlocal::UnixServerExt;
use include_dir::{include_dir, Dir}; use include_dir::{include_dir, Dir};
use maud::{Markup, Render}; use maud::{Markup, Render};
use opentelemetry::KeyValue;
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::{runtime, trace, Resource};
use sqlx::PgPool; use sqlx::PgPool;
use std::env::{args, var}; use std::env::{args, var};
use std::fs::{remove_file, set_permissions, Permissions}; use std::fs::{remove_file, set_permissions, Permissions};
@ -72,6 +76,46 @@ struct LogoSvg;
static KILL_ICONS: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/images/kill_icons"); static KILL_ICONS: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/images/kill_icons");
fn setup() -> Result<Config, SetupError> {
let open_telemetry = if let Some(tracing_endpoint) = var("TRACING_ENDPOINT")
.ok()
.filter(|endpoint| !endpoint.is_empty())
{
let otlp_exporter = opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint(tracing_endpoint);
let tracer =
opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(otlp_exporter)
.with_trace_config(trace::config().with_resource(Resource::new(vec![
KeyValue::new("service.name", "drops.tf"),
])))
.install_batch(runtime::Tokio)?;
Some(tracing_opentelemetry::layer().with_tracer(tracer))
} else {
None
};
tracing_subscriber::registry()
.with(EnvFilter::new(var("RUST_LOG").unwrap_or_else(|_| {
"demostf_frontend=debug,tower_http=debug,sqlx=debug".into()
})))
.with(open_telemetry)
.with(tracing_subscriber::fmt::layer().with_filter(EnvFilter::new(
var("RUST_LOG").unwrap_or_else(|_| "warn,demostf_frontend=info".into()),
)))
.try_init()?;
args()
.nth(1)
.as_deref()
.map(Config::load)
.transpose()?
.or_else(Config::env)
.ok_or(SetupError::NoConfigProvided)
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<()> { async fn main() -> Result<()> {
tracing_subscriber::registry() tracing_subscriber::registry()
@ -81,13 +125,7 @@ async fn main() -> Result<()> {
.try_init() .try_init()
.expect("Failed to init tracing"); .expect("Failed to init tracing");
let config = args() let config = setup()?;
.nth(1)
.as_deref()
.map(Config::load)
.transpose()?
.or_else(Config::env)
.expect("no config file or env provided");
let connection = config.database.connect().await?; let connection = config.database.connect().await?;
let map_list = map_list(&connection).await?.collect(); let map_list = map_list(&connection).await?.collect();