Set up Sentry transactions
This commit is contained in:
parent
9b066adcd6
commit
e7323aaaee
4 changed files with 132 additions and 7 deletions
83
Cargo.lock
generated
83
Cargo.lock
generated
|
@ -422,6 +422,40 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "env_logger"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
|
||||||
|
dependencies = [
|
||||||
|
"humantime",
|
||||||
|
"is-terminal",
|
||||||
|
"log",
|
||||||
|
"regex",
|
||||||
|
"termcolor",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "errno"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
|
||||||
|
dependencies = [
|
||||||
|
"errno-dragonfly",
|
||||||
|
"libc",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "errno-dragonfly"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastrand"
|
name = "fastrand"
|
||||||
version = "1.8.0"
|
version = "1.8.0"
|
||||||
|
@ -708,6 +742,12 @@ version = "1.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
|
checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "humantime"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "0.14.23"
|
version = "0.14.23"
|
||||||
|
@ -839,12 +879,34 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "io-lifetimes"
|
||||||
|
version = "1.0.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys 0.42.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ipnet"
|
name = "ipnet"
|
||||||
version = "2.7.0"
|
version = "2.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e"
|
checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "is-terminal"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189"
|
||||||
|
dependencies = [
|
||||||
|
"hermit-abi 0.2.6",
|
||||||
|
"io-lifetimes",
|
||||||
|
"rustix",
|
||||||
|
"windows-sys 0.42.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iso8601"
|
name = "iso8601"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
|
@ -890,6 +952,12 @@ dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linux-raw-sys"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lock_api"
|
name = "lock_api"
|
||||||
version = "0.4.9"
|
version = "0.4.9"
|
||||||
|
@ -1504,6 +1572,7 @@ name = "rooster"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
"env_logger",
|
||||||
"figment",
|
"figment",
|
||||||
"icalendar",
|
"icalendar",
|
||||||
"log",
|
"log",
|
||||||
|
@ -1529,6 +1598,20 @@ dependencies = [
|
||||||
"semver",
|
"semver",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustix"
|
||||||
|
version = "0.36.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"errno",
|
||||||
|
"io-lifetimes",
|
||||||
|
"libc",
|
||||||
|
"linux-raw-sys",
|
||||||
|
"windows-sys 0.42.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls"
|
name = "rustls"
|
||||||
version = "0.20.7"
|
version = "0.20.7"
|
||||||
|
|
|
@ -13,6 +13,7 @@ log = "0.4.17"
|
||||||
serde = "1.0.152"
|
serde = "1.0.152"
|
||||||
figment = "0.10.8"
|
figment = "0.10.8"
|
||||||
anyhow = "1.0.68"
|
anyhow = "1.0.68"
|
||||||
|
env_logger = "0.10.0"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = "thin"
|
lto = "thin"
|
||||||
|
|
|
@ -70,7 +70,7 @@ fn get_event_kind(description: &str) -> &str {
|
||||||
async fn ics(url: &str) -> String {
|
async fn ics(url: &str) -> String {
|
||||||
let source = match Source::from_url(url) {
|
let source = match Source::from_url(url) {
|
||||||
Some(source) => source,
|
Some(source) => source,
|
||||||
None => return "Must be a rooster.utwente.nl or mytimetable.tudelft.nl URL".to_string()
|
None => return "Must be a rooster.utwente.nl or mytimetable.tudelft.nl URL".to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let calendar = get_calendar(url).await.unwrap();
|
let calendar = get_calendar(url).await.unwrap();
|
||||||
|
@ -123,6 +123,7 @@ async fn ics(url: &str) -> String {
|
||||||
|
|
||||||
#[launch]
|
#[launch]
|
||||||
fn rocket() -> _ {
|
fn rocket() -> _ {
|
||||||
|
env_logger::init();
|
||||||
rocket::build()
|
rocket::build()
|
||||||
.attach(sentry::RocketSentry::fairing())
|
.attach(sentry::RocketSentry::fairing())
|
||||||
.mount("/", routes![index, generate_url, ics])
|
.mount("/", routes![index, generate_url, ics])
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
|
// Based on https://github.com/intgr/rocket-sentry (MIT)
|
||||||
// Copyright (c) 2019-2022 Marti Raudsepp
|
// Copyright (c) 2019-2022 Marti Raudsepp
|
||||||
// Taken from https://github.com/intgr/rocket-sentry under MIT
|
|
||||||
|
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use rocket::fairing::{Fairing, Info, Kind};
|
use rocket::fairing::{Fairing, Info, Kind};
|
||||||
use rocket::serde::Deserialize;
|
use rocket::serde::Deserialize;
|
||||||
use rocket::{fairing, Build, Rocket};
|
use rocket::{fairing, Build, Data, Request, Response, Rocket};
|
||||||
use sentry::{ClientInitGuard, ClientOptions};
|
use sentry::{ClientInitGuard, ClientOptions, Transaction};
|
||||||
|
|
||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
|
|
||||||
|
@ -34,6 +34,8 @@ impl RocketSentry {
|
||||||
info!("Sending event to Sentry: {}", event.event_id);
|
info!("Sending event to Sentry: {}", event.event_id);
|
||||||
Some(event)
|
Some(event)
|
||||||
})),
|
})),
|
||||||
|
release: sentry::release_name!(),
|
||||||
|
traces_sample_rate: 1.0,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
|
@ -43,9 +45,9 @@ impl RocketSentry {
|
||||||
let mut self_guard = self.guard.lock().unwrap();
|
let mut self_guard = self.guard.lock().unwrap();
|
||||||
*self_guard = Some(guard);
|
*self_guard = Some(guard);
|
||||||
|
|
||||||
info!("Sentry enabled.");
|
info!("Sentry enabled");
|
||||||
} else {
|
} else {
|
||||||
error!("Sentry did not initialize.");
|
error!("Sentry did not initialize");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +57,7 @@ impl Fairing for RocketSentry {
|
||||||
fn info(&self) -> Info {
|
fn info(&self) -> Info {
|
||||||
Info {
|
Info {
|
||||||
name: "rocket-sentry",
|
name: "rocket-sentry",
|
||||||
kind: Kind::Ignite | Kind::Singleton,
|
kind: Kind::Ignite | Kind::Request | Kind::Response | Kind::Singleton,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,4 +77,42 @@ impl Fairing for RocketSentry {
|
||||||
}
|
}
|
||||||
Ok(rocket)
|
Ok(rocket)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn on_request(&self, request: &mut Request<'_>, _data: &mut Data<'_>) {
|
||||||
|
let name = format!("{} {}", request.method(), request.uri().path());
|
||||||
|
info!("Starting Sentry transaction: {}", name);
|
||||||
|
let context = sentry::TransactionContext::new(&name, "");
|
||||||
|
let transaction = sentry::start_transaction(context);
|
||||||
|
request.local_cache(|| Some(transaction));
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn on_response<'r>(&self, request: &'r Request<'_>, _response: &mut Response<'r>) {
|
||||||
|
let transaction: &Option<Transaction> = request.local_cache(|| None);
|
||||||
|
if let Some(transaction) = transaction {
|
||||||
|
|
||||||
|
let transaction = transaction.clone();
|
||||||
|
|
||||||
|
let mut url = url::Url::parse(&std::env::var("BASE_URL").unwrap()).unwrap();
|
||||||
|
url.set_path(&request.uri().to_string());
|
||||||
|
|
||||||
|
let headers = request
|
||||||
|
.headers()
|
||||||
|
.iter()
|
||||||
|
.map(|header| (header.name().to_string(), header.value().to_string()))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let sentry_request = sentry::protocol::Request {
|
||||||
|
url: Some(url),
|
||||||
|
method: Some(request.method().to_string()),
|
||||||
|
headers,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
transaction.set_request(sentry_request);
|
||||||
|
transaction.finish();
|
||||||
|
|
||||||
|
let name = format!("{} {}", request.method(), request.uri().path());
|
||||||
|
info!("Finished Sentry transaction: {}", name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue