diff --git a/Cargo.lock b/Cargo.lock index a674000..3046e53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,7 +135,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a941c39708478e8eea39243b5983f1c42d2717b3620ee91f4a52115fd02ac43f" dependencies = [ - "itertools", + "itertools 0.9.0", "proc-macro-error", "proc-macro2", "quote", @@ -167,6 +167,28 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "async-trait" version = "0.1.77" @@ -184,6 +206,34 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core 0.3.4", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "itoa 1.0.10", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "axum" version = "0.7.4" @@ -191,7 +241,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.4.3", "bytes", "futures-util", "http 1.1.0", @@ -218,6 +268,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.12", + "http-body 0.4.6", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "axum-core" version = "0.4.3" @@ -323,7 +390,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", - "regex-automata", + "regex-automata 0.4.6", "serde", ] @@ -346,11 +413,11 @@ dependencies = [ "gix", "gix-features", "jsonwebtoken", - "log", "octocrab", "reqwest", "thiserror", "tokio", + "tracing", "walkdir", ] @@ -911,8 +978,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.6", + "regex-syntax 0.8.2", ] [[package]] @@ -1624,6 +1691,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "h2" version = "0.3.24" @@ -1839,6 +1912,18 @@ dependencies = [ "tower-service", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper 0.14.28", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "hyper-timeout" version = "0.5.1" @@ -1984,6 +2069,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -2132,6 +2226,15 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matchit" version = "0.7.3" @@ -2331,7 +2434,7 @@ dependencies = [ "http-body-util", "hyper 1.2.0", "hyper-rustls", - "hyper-timeout", + "hyper-timeout 0.5.1", "hyper-util", "jsonwebtoken", "once_cell", @@ -2409,6 +2512,95 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "opentelemetry" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d57987be3f2aeb70d385fff9b27fb74c5723cc9a52d904d4f9c807a0667bf" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", +] + +[[package]] +name = "opentelemetry-http" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cbfa5308166ca861434f0b0913569579b8e587430a3d6bcd7fd671921ec145a" +dependencies = [ + "async-trait", + "bytes", + "http 0.2.12", + "opentelemetry", + "reqwest", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" +dependencies = [ + "async-trait", + "futures-core", + "http 0.2.12", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-proto", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "prost", + "reqwest", + "thiserror", + "tokio", + "tonic", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost", + "tonic", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" + +[[package]] +name = "opentelemetry_sdk" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e90c7113be649e31e9a0f8b5ee24ed7a16923b322c3c5ab6367469c049d6b7e" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "once_cell", + "opentelemetry", + "ordered-float 4.2.0", + "percent-encoding", + "rand", + "thiserror", + "tokio", + "tokio-stream", +] + [[package]] name = "ordered-float" version = "2.10.1" @@ -2418,6 +2610,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ordered-float" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" +dependencies = [ + "num-traits", +] + [[package]] name = "overload" version = "0.1.1" @@ -2555,6 +2756,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "pq-sys" version = "0.4.8" @@ -2603,6 +2810,29 @@ version = "28.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79" +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.52", +] + [[package]] name = "quote" version = "1.0.35" @@ -2623,6 +2853,36 @@ dependencies = [ "scheduled-thread-pool", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "rayon" version = "1.9.0" @@ -2680,8 +2940,17 @@ checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.6", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -2692,9 +2961,15 @@ checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.2", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -3013,7 +3288,7 @@ name = "server" version = "0.1.0" dependencies = [ "anyhow", - "axum", + "axum 0.7.4", "bigdecimal", "buildit-utils", "chrono", @@ -3028,6 +3303,9 @@ dependencies = [ "jsonwebtoken", "octocrab", "once_cell", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", "reqwest", "serde", "serde_json", @@ -3037,6 +3315,7 @@ dependencies = [ "tokio", "tower-http", "tracing", + "tracing-opentelemetry", "tracing-subscriber", ] @@ -3485,6 +3764,16 @@ dependencies = [ "windows-sys 0.48.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]] name = "tokio-macros" version = "2.2.0" @@ -3542,6 +3831,33 @@ dependencies = [ "tracing", ] +[[package]] +name = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.6.20", + "base64 0.21.7", + "bytes", + "h2 0.3.24", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "hyper-timeout 0.4.1", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" @@ -3550,8 +3866,11 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", + "indexmap 1.9.3", "pin-project", "pin-project-lite", + "rand", + "slab", "tokio", "tokio-util", "tower-layer", @@ -3642,16 +3961,38 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-opentelemetry" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry", + "opentelemetry_sdk", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time", +] + [[package]] name = "tracing-subscriber" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", ] @@ -3743,6 +4084,12 @@ dependencies = [ "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8parse" version = "0.2.1" @@ -3774,7 +4121,7 @@ dependencies = [ "itoa 0.4.8", "leb128", "log", - "ordered-float", + "ordered-float 2.10.1", "partial_ref", "rustc-hash", "serde", @@ -3999,6 +4346,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/buildit-utils/Cargo.toml b/buildit-utils/Cargo.toml index da11084..13f0c11 100644 --- a/buildit-utils/Cargo.toml +++ b/buildit-utils/Cargo.toml @@ -10,7 +10,6 @@ octocrab = "0.35.0" jsonwebtoken = "9" anyhow = "1" tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread", "process", "sync", "fs"] } -log = "0.4" gix = { version = "0.58", default-features = false, features = ["max-performance-safe", "revision"] } gix-features = { version = "0.38.0", optional = true } walkdir = "2.4.0" @@ -18,6 +17,7 @@ abbs-meta-apml = { git = "https://github.com/AOSC-Dev/abbs-meta-rs", package = " fancy-regex = "0.13" reqwest = "0.11.24" thiserror ="1.0" +tracing = "0.1.40" [features] default = ["gix-max-perf"] diff --git a/buildit-utils/src/github.rs b/buildit-utils/src/github.rs index 09e08ca..eeeacb1 100644 --- a/buildit-utils/src/github.rs +++ b/buildit-utils/src/github.rs @@ -4,7 +4,6 @@ use gix::{ prelude::ObjectIdExt, sec, sec::trust::DefaultForLevel, Repository, ThreadSafeRepository, }; use jsonwebtoken::EncodingKey; -use log::{debug, error, info}; use octocrab::{models::pulls::PullRequest, params}; use std::{ borrow::Cow, @@ -15,6 +14,7 @@ use std::{ process::Output, }; use tokio::{process, task}; +use tracing::{debug, error, info}; use walkdir::WalkDir; use crate::{ @@ -269,6 +269,7 @@ fn get_commits(path: &Path) -> anyhow::Result> { } /// Update ABBS tree commit logs +#[tracing::instrument(skip(abbs_path))] pub async fn update_abbs>(git_ref: &str, abbs_path: P) -> anyhow::Result<()> { info!("Running git checkout -b stable ..."); diff --git a/server/Cargo.toml b/server/Cargo.toml index 31ecec2..dec197b 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -27,8 +27,12 @@ jsonwebtoken = "9.2.0" size = "0.4.1" dickens = { git = "https://github.com/AOSC-Dev/dickens.git", version = "0.1.0" } axum = "0.7.4" -tracing-subscriber = "0.3.18" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } tracing = "0.1.40" tower-http = { version = "0.5.2", features = ["trace", "fs", "cors"] } diesel = { version = "2.1.4", features = ["postgres", "chrono", "r2d2", "bigdecimal", "numeric"] } bigdecimal = { version = "0.4.3", features = ["serde"] } +opentelemetry = "0.22.0" +tracing-opentelemetry = "0.23.0" +opentelemetry-otlp = { version = "0.15.0", features = ["http-proto", "reqwest-client"] } +opentelemetry_sdk = { version = "0.22.1", features = ["rt-tokio"] } diff --git a/server/src/api.rs b/server/src/api.rs index 6559794..9bde017 100644 --- a/server/src/api.rs +++ b/server/src/api.rs @@ -23,6 +23,7 @@ pub enum JobSource { Manual, } +#[tracing::instrument(skip(pool))] pub async fn pipeline_new( pool: DbPool, git_branch: &str, diff --git a/server/src/bot.rs b/server/src/bot.rs index 0378dd0..366499b 100644 --- a/server/src/bot.rs +++ b/server/src/bot.rs @@ -10,7 +10,7 @@ use buildit_utils::github::{get_archs, OpenPRError, OpenPRRequest}; use chrono::Local; use diesel::{Connection, ExpressionMethods, OptionalExtension, QueryDsl, RunQueryDsl}; use serde::Deserialize; -use tracing::warn; +use tracing::{info_span, warn}; use std::borrow::Cow; use teloxide::{ diff --git a/server/src/lib.rs b/server/src/lib.rs index 11a4c4f..721fbe7 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -48,6 +48,10 @@ pub struct Args { /// Development mode #[arg(env = "BUILDIT_DEVELOPMENT")] pub development_mode: Option, + + /// OpenTelemetry + #[arg(env = "BUILDIT_OTLP")] + pub otlp_url: Option, } pub static ARGS: Lazy = Lazy::new(Args::parse); diff --git a/server/src/main.rs b/server/src/main.rs index 730f49f..9bca9db 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -5,6 +5,10 @@ use axum::{routing::get, Router}; use diesel::pg::PgConnection; use diesel::r2d2::ConnectionManager; use diesel::r2d2::Pool; +use opentelemetry::KeyValue; +use opentelemetry_otlp::WithExportConfig; +use opentelemetry_sdk::trace; +use opentelemetry_sdk::Resource; use server::bot::{answer, Command}; use server::recycler::recycler_worker; use server::routes::{ @@ -17,12 +21,43 @@ use server::{DbPool, ARGS}; use teloxide::prelude::*; use tower_http::cors::{Any, CorsLayer}; use tower_http::services::{ServeDir, ServeFile}; -use tracing::info_span; +use tracing::{info_span, Instrument}; +use tracing_subscriber::prelude::*; +use tracing_subscriber::EnvFilter; +use tracing_subscriber::Registry; #[tokio::main] async fn main() -> anyhow::Result<()> { dotenv::dotenv()?; - tracing_subscriber::fmt::init(); + // setup opentelemetry + if let Some(otlp_url) = &ARGS.otlp_url { + // setup otlp + let exporter = opentelemetry_otlp::new_exporter() + .http() + .with_endpoint(otlp_url); + let otlp_tracer = + opentelemetry_otlp::new_pipeline() + .tracing() + .with_trace_config(trace::config().with_resource(Resource::new(vec![ + KeyValue::new("service.name", "buildit"), + ]))) + .with_exporter(exporter) + .install_batch(opentelemetry_sdk::runtime::Tokio)?; + + // let tracing crate output to opentelemetry + let tracing_leyer = tracing_opentelemetry::layer().with_tracer(otlp_tracer); + let subscriber = Registry::default(); + // respect RUST_LOG + let env_filter = EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("INFO")); + subscriber + .with(env_filter) + .with(tracing_leyer) + .with(tracing_subscriber::fmt::Layer::default()) + .init(); + } else { + // fallback to stdout + tracing_subscriber::fmt::init(); + } tracing::info!("Connecting to database"); let manager = ConnectionManager::::new(&ARGS.database_url); @@ -36,7 +71,9 @@ async fn main() -> anyhow::Result<()> { let handler = Update::filter_message().branch(dptree::entry().filter_command::().endpoint( |bot: Bot, pool: DbPool, msg: Message, cmd: Command| async move { - answer(bot, msg, cmd, pool).await + answer(bot, msg, cmd, pool) + .instrument(info_span!("answer_telegram_message")) + .await }, ));