diff --git a/Cargo.lock b/Cargo.lock index bcc4f1d05..3f48ce9a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1073,6 +1073,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" +dependencies = [ + "serde", + "uuid 1.4.1", +] + [[package]] name = "deranged" version = "0.3.7" @@ -1446,6 +1456,18 @@ dependencies = [ "nom_locate", ] +[[package]] +name = "findshlibs" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b9e59cd0f7e0806cca4be089683ecb6434e602038df21fe6bf6711b2f07f64" +dependencies = [ + "cc", + "lazy_static", + "libc", + "winapi", +] + [[package]] name = "flate2" version = "1.0.26" @@ -1794,6 +1816,17 @@ dependencies = [ "digest", ] +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + [[package]] name = "http" version = "0.2.9" @@ -2491,6 +2524,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + [[package]] name = "md5" version = "0.7.0" @@ -2571,6 +2610,8 @@ dependencies = [ "rustls 0.20.8", "rustls-pemfile", "segment", + "sentry", + "sentry-actix", "serde", "serde_json", "serde_urlencoded", @@ -2890,6 +2931,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "os_info" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +dependencies = [ + "log", + "serde", + "winapi", +] + [[package]] name = "page_size" version = "0.4.2" @@ -3612,6 +3664,126 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +[[package]] +name = "sentry" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e95efd0cefa32028cdb9766c96de71d96671072f9fb494dc9fb84c0ef93e52b" +dependencies = [ + "httpdate", + "reqwest", + "rustls 0.21.6", + "sentry-backtrace", + "sentry-contexts", + "sentry-core", + "sentry-debug-images", + "sentry-panic", + "sentry-tracing", + "tokio", + "ureq", + "webpki-roots 0.25.2", +] + +[[package]] +name = "sentry-actix" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "795851be3047d9be16ea8a808383f89e75d2aebc9b53d25fe708c27bc56b4488" +dependencies = [ + "actix-web", + "futures-util", + "sentry-core", +] + +[[package]] +name = "sentry-backtrace" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac2bac6f310c4c4c4bb094d1541d32ae497f8c5c23405e85492cefdfe0971a9" +dependencies = [ + "backtrace", + "once_cell", + "regex", + "sentry-core", +] + +[[package]] +name = "sentry-contexts" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c3e17295cecdbacf66c5bd38d6e1147e09e1e9d824d2d5341f76638eda02a3a" +dependencies = [ + "hostname", + "libc", + "os_info", + "rustc_version", + "sentry-core", + "uname", +] + +[[package]] +name = "sentry-core" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8339474f587f36cb110fa1ed1b64229eea6d47b0b886375579297b7e47aeb055" +dependencies = [ + "once_cell", + "rand", + "sentry-types", + "serde", + "serde_json", +] + +[[package]] +name = "sentry-debug-images" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c11e7d2b809b06497a18a2e60f513206462ae2db27081dfb7be9ade1f329cc8" +dependencies = [ + "findshlibs", + "once_cell", + "sentry-core", +] + +[[package]] +name = "sentry-panic" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875b69f506da75bd664029eafb05f8934297d2990192896d17325f066bd665b7" +dependencies = [ + "sentry-backtrace", + "sentry-core", +] + +[[package]] +name = "sentry-tracing" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89feead9bdd116f8035e89567651340fc382db29240b6c55ef412078b08d1aa3" +dependencies = [ + "sentry-backtrace", + "sentry-core", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "sentry-types" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99dc599bd6646884fc403d593cdcb9816dd67c50cff3271c01ff123617908dcd" +dependencies = [ + "debugid", + "getrandom", + "hex", + "serde", + "serde_json", + "thiserror", + "time", + "url", + "uuid 1.4.1", +] + [[package]] name = "serde" version = "1.0.183" @@ -4160,6 +4332,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "tracing-core", ] [[package]] @@ -4180,6 +4362,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +[[package]] +name = "uname" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" +dependencies = [ + "libc", +] + [[package]] name = "unicase" version = "2.6.0" @@ -4252,6 +4443,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -4291,6 +4483,12 @@ dependencies = [ "serde", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" @@ -4459,6 +4657,12 @@ dependencies = [ "rustls-webpki 0.100.1", ] +[[package]] +name = "webpki-roots" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" + [[package]] name = "whatlang" version = "0.16.2" diff --git a/meilisearch/Cargo.toml b/meilisearch/Cargo.toml index a2536a52f..7836197b1 100644 --- a/meilisearch/Cargo.toml +++ b/meilisearch/Cargo.toml @@ -83,6 +83,16 @@ rustls-pemfile = "1.0.2" segment = { version = "0.2.2", optional = true } serde = { version = "1.0.160", features = ["derive"] } serde_json = { version = "1.0.95", features = ["preserve_order"] } +sentry = { version = "0.31.6", default-features = false, features = [ + "backtrace", + "contexts", + "debug-images", + "panic", + "reqwest", + "rustls", +] } +sentry-actix = "0.31.6" +serde_urlencoded = "0.7.1" sha2 = "0.10.6" siphasher = "0.3.10" slice-group-by = "0.3.0" @@ -90,6 +100,7 @@ static-files = { version = "0.2.3", optional = true } sysinfo = "0.29.7" tar = "0.4.38" tempfile = "3.5.0" +termcolor = "1.2.0" thiserror = "1.0.40" time = { version = "0.3.20", features = [ "serde-well-known", @@ -103,8 +114,6 @@ toml = "0.7.3" uuid = { version = "1.3.1", features = ["serde", "v4"] } walkdir = "2.3.3" yaup = "0.2.1" -serde_urlencoded = "0.7.1" -termcolor = "1.2.0" [dev-dependencies] actix-rt = "2.8.0" @@ -136,17 +145,7 @@ zip = { version = "0.6.4", optional = true } default = ["analytics", "meilisearch-types/all-tokenizations", "mini-dashboard"] analytics = ["segment"] profile-with-puffin = ["dep:puffin_http"] -mini-dashboard = [ - "actix-web-static-files", - "static-files", - "anyhow", - "cargo_toml", - "hex", - "reqwest", - "sha-1", - "tempfile", - "zip", -] +mini-dashboard = ["actix-web-static-files", "static-files", "anyhow", "cargo_toml", "hex", "reqwest", "sha-1", "tempfile", "zip"] chinese = ["meilisearch-types/chinese"] hebrew = ["meilisearch-types/hebrew"] japanese = ["meilisearch-types/japanese"] diff --git a/meilisearch/src/lib.rs b/meilisearch/src/lib.rs index ef821f49f..d5afff0d2 100644 --- a/meilisearch/src/lib.rs +++ b/meilisearch/src/lib.rs @@ -101,7 +101,7 @@ pub fn create_app( InitError = (), >, > { - let app = actix_web::App::new() + actix_web::App::new() .configure(|s| { configure_data( s, @@ -112,23 +112,23 @@ pub fn create_app( ) }) .configure(routes::configure) - .configure(|s| dashboard(s, enable_dashboard)); - - let app = app.wrap(actix_web::middleware::Condition::new( - opt.experimental_enable_metrics, - middleware::RouteMetrics, - )); - app.wrap( - Cors::default() - .send_wildcard() - .allow_any_header() - .allow_any_origin() - .allow_any_method() - .max_age(86_400), // 24h - ) - .wrap(actix_web::middleware::Logger::default()) - .wrap(actix_web::middleware::Compress::default()) - .wrap(actix_web::middleware::NormalizePath::new(actix_web::middleware::TrailingSlash::Trim)) + .configure(|s| dashboard(s, enable_dashboard)) + .wrap(sentry_actix::Sentry::new()) + .wrap(actix_web::middleware::Condition::new( + opt.experimental_enable_metrics, + middleware::RouteMetrics, + )) + .wrap( + Cors::default() + .send_wildcard() + .allow_any_header() + .allow_any_origin() + .allow_any_method() + .max_age(86_400), // 24h + ) + .wrap(actix_web::middleware::Logger::default()) + .wrap(actix_web::middleware::Compress::default()) + .wrap(actix_web::middleware::NormalizePath::new(actix_web::middleware::TrailingSlash::Trim)) } enum OnFailure { diff --git a/meilisearch/src/main.rs b/meilisearch/src/main.rs index a3905d451..83c07d3e3 100644 --- a/meilisearch/src/main.rs +++ b/meilisearch/src/main.rs @@ -30,6 +30,13 @@ fn setup(opt: &Opt) -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> { let (opt, config_read_from) = Opt::try_build()?; + let _sentry = sentry::init(sentry::ClientOptions { + release: sentry::release_name!(), + session_mode: sentry::SessionMode::Request, + auto_session_tracking: true, + ..Default::default() + }); + #[cfg(feature = "profile-with-puffin")] let _server = puffin_http::Server::new(&format!("0.0.0.0:{}", puffin_http::DEFAULT_PORT))?; puffin::set_scopes_on(cfg!(feature = "profile-with-puffin"));