From 3b0f2b153956baa7f59616b67ca8f93271ea1374 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 14:16:54 +0000 Subject: [PATCH 1/5] build(deps): bump the opentelemetry group across 1 directory with 6 updates Bumps the opentelemetry group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [opentelemetry-jaeger-propagator](https://github.com/open-telemetry/opentelemetry-rust) | `0.3.0` | `0.27.0` | | [opentelemetry-otlp](https://github.com/open-telemetry/opentelemetry-rust) | `0.17.0` | `0.27.0` | | [opentelemetry-prometheus](https://github.com/open-telemetry/opentelemetry-rust) | `0.17.0` | `0.27.0` | | [opentelemetry-resource-detectors](https://github.com/open-telemetry/opentelemetry-rust-contrib) | `0.3.0` | `0.6.0` | | [opentelemetry-stdout](https://github.com/open-telemetry/opentelemetry-rust) | `0.5.0` | `0.27.0` | | [opentelemetry_sdk](https://github.com/open-telemetry/opentelemetry-rust) | `0.24.1` | `0.27.1` | Updates `opentelemetry-jaeger-propagator` from 0.3.0 to 0.27.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-rust/releases) - [Commits](https://github.com/open-telemetry/opentelemetry-rust/compare/opentelemetry-jaeger-propagator-0.3.0...opentelemetry-jaeger-propagator-0.27.0) Updates `opentelemetry-otlp` from 0.17.0 to 0.27.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-rust/releases) - [Commits](https://github.com/open-telemetry/opentelemetry-rust/compare/opentelemetry-otlp-0.17.0...opentelemetry-otlp-0.27.0) Updates `opentelemetry-prometheus` from 0.17.0 to 0.27.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-rust/releases) - [Commits](https://github.com/open-telemetry/opentelemetry-rust/compare/opentelemetry-prometheus-0.17.0...opentelemetry-prometheus-0.27.0) Updates `opentelemetry-resource-detectors` from 0.3.0 to 0.6.0 - [Commits](https://github.com/open-telemetry/opentelemetry-rust-contrib/compare/opentelemetry-resource-detectors-0.3.0...opentelemetry-resource-detectors-0.6.0) Updates `opentelemetry-stdout` from 0.5.0 to 0.27.0 - [Release notes](https://github.com/open-telemetry/opentelemetry-rust/releases) - [Commits](https://github.com/open-telemetry/opentelemetry-rust/compare/opentelemetry-stdout-0.5.0...opentelemetry-stdout-0.27.0) Updates `opentelemetry_sdk` from 0.24.1 to 0.27.1 - [Release notes](https://github.com/open-telemetry/opentelemetry-rust/releases) - [Commits](https://github.com/open-telemetry/opentelemetry-rust/compare/opentelemetry_sdk-0.24.1...opentelemetry_sdk-0.27.1) --- updated-dependencies: - dependency-name: opentelemetry-jaeger-propagator dependency-type: direct:production update-type: version-update:semver-minor dependency-group: opentelemetry - dependency-name: opentelemetry-otlp dependency-type: direct:production update-type: version-update:semver-minor dependency-group: opentelemetry - dependency-name: opentelemetry-prometheus dependency-type: direct:production update-type: version-update:semver-minor dependency-group: opentelemetry - dependency-name: opentelemetry-resource-detectors dependency-type: direct:production update-type: version-update:semver-minor dependency-group: opentelemetry - dependency-name: opentelemetry-stdout dependency-type: direct:production update-type: version-update:semver-minor dependency-group: opentelemetry - dependency-name: opentelemetry_sdk dependency-type: direct:production update-type: version-update:semver-minor dependency-group: opentelemetry ... Signed-off-by: dependabot[bot] --- Cargo.lock | 142 ++++++++++++++++++++++++++++-------------- crates/cli/Cargo.toml | 12 ++-- 2 files changed, 102 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d9ccd89b..25894d3cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3008,7 +3008,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -3172,15 +3172,15 @@ dependencies = [ "mas-templates", "mas-tower", "oauth2-types", - "opentelemetry", - "opentelemetry-http", + "opentelemetry 0.24.0", + "opentelemetry-http 0.13.0", "opentelemetry-jaeger-propagator", "opentelemetry-otlp", "opentelemetry-prometheus", "opentelemetry-resource-detectors", - "opentelemetry-semantic-conventions", + "opentelemetry-semantic-conventions 0.16.0", "opentelemetry-stdout", - "opentelemetry_sdk", + "opentelemetry_sdk 0.27.1", "prometheus", "rand", "rand_chacha", @@ -3314,8 +3314,8 @@ dependencies = [ "minijinja-contrib", "nonzero_ext", "oauth2-types", - "opentelemetry", - "opentelemetry-semantic-conventions", + "opentelemetry 0.24.0", + "opentelemetry-semantic-conventions 0.16.0", "pbkdf2", "pkcs8", "psl", @@ -3353,9 +3353,9 @@ dependencies = [ "headers", "http", "hyper-util", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-semantic-conventions", + "opentelemetry 0.24.0", + "opentelemetry-http 0.13.0", + "opentelemetry-semantic-conventions 0.16.0", "reqwest", "rustls-platform-verifier", "tokio", @@ -3630,7 +3630,7 @@ dependencies = [ "mas-iana", "mas-jose", "oauth2-types", - "opentelemetry", + "opentelemetry 0.24.0", "rand_core", "serde", "serde_json", @@ -3653,7 +3653,7 @@ dependencies = [ "mas-jose", "mas-storage", "oauth2-types", - "opentelemetry-semantic-conventions", + "opentelemetry-semantic-conventions 0.16.0", "rand", "rand_chacha", "sea-query", @@ -3688,7 +3688,7 @@ dependencies = [ "mas-storage-pg", "mas-templates", "mas-tower", - "opentelemetry", + "opentelemetry 0.24.0", "rand", "rand_chacha", "serde", @@ -3738,9 +3738,9 @@ name = "mas-tower" version = "0.12.0" dependencies = [ "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-semantic-conventions", + "opentelemetry 0.24.0", + "opentelemetry-http 0.13.0", + "opentelemetry-semantic-conventions 0.16.0", "pin-project-lite", "tower", "tracing", @@ -4085,6 +4085,20 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "opentelemetry" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab70038c28ed37b97d8ed414b6429d343a8bbf44c9f79ec854f3a643029ba6d7" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 1.0.69", + "tracing", +] + [[package]] name = "opentelemetry-http" version = "0.13.0" @@ -4094,70 +4108,83 @@ dependencies = [ "async-trait", "bytes", "http", - "opentelemetry", + "opentelemetry 0.24.0", "reqwest", ] +[[package]] +name = "opentelemetry-http" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a8a7f5f6ba7c1b286c2fbca0454eaba116f63bbe69ed250b642d36fbb04d80" +dependencies = [ + "async-trait", + "bytes", + "http", + "opentelemetry 0.27.1", +] + [[package]] name = "opentelemetry-jaeger-propagator" -version = "0.3.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a68a13b92fc708d875ad659b08b35d08b8ef2403e01944b39ca21e5b08b17" +checksum = "4e33208695c9d3049c848d2abf32f7336ec05cb5c02af1b710e89a99500edeb0" dependencies = [ - "opentelemetry", + "opentelemetry 0.27.1", ] [[package]] name = "opentelemetry-otlp" -version = "0.17.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b925a602ffb916fb7421276b86756027b37ee708f9dce2dbdcc51739f07e727" +checksum = "91cf61a1868dacc576bf2b2a1c3e9ab150af7272909e80085c3173384fe11f76" dependencies = [ "async-trait", "futures-core", "http", - "opentelemetry", - "opentelemetry-http", + "opentelemetry 0.27.1", + "opentelemetry-http 0.27.0", "opentelemetry-proto", - "opentelemetry_sdk", + "opentelemetry_sdk 0.27.1", "prost", "thiserror 1.0.69", ] [[package]] name = "opentelemetry-prometheus" -version = "0.17.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4191ce34aa274621861a7a9d68dbcf618d5b6c66b10081631b61fd81fbc015" +checksum = "1b834e966ea5e2d03dfe5f2253f03d22cce21403ee940265070eeee96cee0bcc" dependencies = [ "once_cell", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.27.1", + "opentelemetry_sdk 0.27.1", "prometheus", "protobuf", + "tracing", ] [[package]] name = "opentelemetry-proto" -version = "0.7.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ee9f20bff9c984511a02f082dc8ede839e4a9bf15cc2487c8d6fea5ad850d9" +checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" dependencies = [ - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.27.1", + "opentelemetry_sdk 0.27.1", "prost", "tonic", ] [[package]] name = "opentelemetry-resource-detectors" -version = "0.3.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00a7e965924ad5234917f135243605ef6f2ae3f4da8d3363065d679b2c150f2a" +checksum = "cf6e83d3dca8fe93cfac95cd07313721c9e6e9f8655e7b06d061d4924df1a0cd" dependencies = [ - "opentelemetry", - "opentelemetry-semantic-conventions", - "opentelemetry_sdk", + "opentelemetry 0.27.1", + "opentelemetry-semantic-conventions 0.27.0", + "opentelemetry_sdk 0.27.1", ] [[package]] @@ -4166,17 +4193,23 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cefe0543875379e47eb5f1e68ff83f45cc41366a92dfd0d073d513bf68e9a05" +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc1b6902ff63b32ef6c489e8048c5e253e2e4a803ea3ea7e783914536eb15c52" + [[package]] name = "opentelemetry-stdout" -version = "0.5.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d408d4345b8be6129a77c46c3bfc75f0d3476f3091909c7dd99c1f3d78582287" +checksum = "bc8a298402aa5c260be90d10dc54b5a7d4e1025c354848f8e2c976d761351049" dependencies = [ "async-trait", "chrono", "futures-util", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.27.1", + "opentelemetry_sdk 0.27.1", "ordered-float", "serde", "serde_json", @@ -4193,15 +4226,32 @@ dependencies = [ "futures-channel", "futures-executor", "futures-util", - "glob", "once_cell", - "opentelemetry", + "opentelemetry 0.24.0", + "percent-encoding", + "rand", + "thiserror 1.0.69", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "231e9d6ceef9b0b2546ddf52335785ce41252bc7474ee8ba05bfad277be13ab8" +dependencies = [ + "async-trait", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "opentelemetry 0.27.1", "percent-encoding", "rand", "serde_json", "thiserror 1.0.69", "tokio", "tokio-stream", + "tracing", ] [[package]] @@ -6518,8 +6568,8 @@ checksum = "a9784ed4da7d921bc8df6963f8c80a0e4ce34ba6ba76668acadd3edbd985ff3b" dependencies = [ "js-sys", "once_cell", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.24.0", + "opentelemetry_sdk 0.24.1", "tracing", "tracing-core", "tracing-subscriber", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 45dd9f8c6..7acfda1ba 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -49,17 +49,17 @@ tracing-subscriber = { workspace = true, features = ["env-filter"] } tracing-opentelemetry.workspace = true opentelemetry.workspace = true opentelemetry-http.workspace = true -opentelemetry-jaeger-propagator = "0.3.0" -opentelemetry-otlp = { version = "0.17.0", default-features = false, features = [ +opentelemetry-jaeger-propagator = "0.27.0" +opentelemetry-otlp = { version = "0.27.0", default-features = false, features = [ "trace", "metrics", "http-proto", ] } -opentelemetry-prometheus = "0.17.0" -opentelemetry-resource-detectors = "0.3.0" +opentelemetry-prometheus = "0.27.0" +opentelemetry-resource-detectors = "0.6.0" opentelemetry-semantic-conventions.workspace = true -opentelemetry-stdout = { version = "0.5.0", features = ["trace", "metrics"] } -opentelemetry_sdk = { version = "0.24.1", features = [ +opentelemetry-stdout = { version = "0.27.0", features = ["trace", "metrics"] } +opentelemetry_sdk = { version = "0.27.1", features = [ "trace", "metrics", "rt-tokio", From ec4dbc3542bb04e96f2fc3740daa51980c4d8755 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Dec 2024 11:52:03 +0100 Subject: [PATCH 2/5] Update the rest of the OTEL deps and use the new APIs --- Cargo.lock | 304 ++++++++---------- Cargo.toml | 9 +- crates/cli/src/app_state.rs | 56 ++-- crates/cli/src/commands/server.rs | 2 +- crates/cli/src/server.rs | 4 +- crates/cli/src/telemetry.rs | 69 ++-- .../handlers/src/activity_tracker/worker.rs | 37 ++- crates/http/src/lib.rs | 12 +- crates/http/src/reqwest.rs | 4 +- crates/tower/src/lib.rs | 12 +- crates/tower/src/metrics/duration.rs | 2 +- crates/tower/src/metrics/in_flight.rs | 2 +- deny.toml | 1 - 13 files changed, 227 insertions(+), 287 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 25894d3cc..869662fd8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -95,7 +95,7 @@ dependencies = [ "bytes", "cfg-if", "http", - "indexmap 2.6.0", + "indexmap 2.7.0", "schemars", "serde", "serde_json", @@ -120,9 +120,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -323,7 +323,7 @@ dependencies = [ "futures-util", "handlebars", "http", - "indexmap 2.6.0", + "indexmap 2.7.0", "mime", "multer", "num-traits", @@ -377,7 +377,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef5ec94176a12a8cbe985cd73f2e54dc9c702c88c766bdef12f1f3a67cedbee1" dependencies = [ "bytes", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_json", ] @@ -547,9 +547,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" +checksum = "fe7c2840b66236045acd2607d5866e274380afd87ef99d6226e961e2cb47df45" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -559,9 +559,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" +checksum = "ad3a619a9de81e1d7de1f1186dcba4506ed661a0e483d84410fdef0ee87b2f96" dependencies = [ "bindgen", "cc", @@ -875,9 +875,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" dependencies = [ "jobserver", "libc", @@ -905,6 +905,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chacha20" version = "0.9.1" @@ -1710,9 +1716,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1784,7 +1790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -2056,7 +2062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", - "indexmap 2.6.0", + "indexmap 2.7.0", "stable_deref_trait", ] @@ -2122,7 +2128,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -2738,9 +2744,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2835,9 +2841,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jni" @@ -2870,10 +2876,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -3052,9 +3059,9 @@ dependencies = [ [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "litrs" @@ -3172,15 +3179,15 @@ dependencies = [ "mas-templates", "mas-tower", "oauth2-types", - "opentelemetry 0.24.0", - "opentelemetry-http 0.13.0", + "opentelemetry", + "opentelemetry-http", "opentelemetry-jaeger-propagator", "opentelemetry-otlp", "opentelemetry-prometheus", "opentelemetry-resource-detectors", - "opentelemetry-semantic-conventions 0.16.0", + "opentelemetry-semantic-conventions", "opentelemetry-stdout", - "opentelemetry_sdk 0.27.1", + "opentelemetry_sdk", "prometheus", "rand", "rand_chacha", @@ -3290,7 +3297,7 @@ dependencies = [ "governor", "headers", "hyper", - "indexmap 2.6.0", + "indexmap 2.7.0", "insta", "lettre", "mas-axum-utils", @@ -3314,8 +3321,8 @@ dependencies = [ "minijinja-contrib", "nonzero_ext", "oauth2-types", - "opentelemetry 0.24.0", - "opentelemetry-semantic-conventions 0.16.0", + "opentelemetry", + "opentelemetry-semantic-conventions", "pbkdf2", "pkcs8", "psl", @@ -3353,9 +3360,9 @@ dependencies = [ "headers", "http", "hyper-util", - "opentelemetry 0.24.0", - "opentelemetry-http 0.13.0", - "opentelemetry-semantic-conventions 0.16.0", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-semantic-conventions", "reqwest", "rustls-platform-verifier", "tokio", @@ -3630,7 +3637,7 @@ dependencies = [ "mas-iana", "mas-jose", "oauth2-types", - "opentelemetry 0.24.0", + "opentelemetry", "rand_core", "serde", "serde_json", @@ -3653,7 +3660,7 @@ dependencies = [ "mas-jose", "mas-storage", "oauth2-types", - "opentelemetry-semantic-conventions 0.16.0", + "opentelemetry-semantic-conventions", "rand", "rand_chacha", "sea-query", @@ -3688,7 +3695,7 @@ dependencies = [ "mas-storage-pg", "mas-templates", "mas-tower", - "opentelemetry 0.24.0", + "opentelemetry", "rand", "rand_chacha", "serde", @@ -3738,9 +3745,9 @@ name = "mas-tower" version = "0.12.0" dependencies = [ "http", - "opentelemetry 0.24.0", - "opentelemetry-http 0.13.0", - "opentelemetry-semantic-conventions 0.16.0", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-semantic-conventions", "pin-project-lite", "tower", "tracing", @@ -4014,7 +4021,7 @@ checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "crc32fast", "hashbrown 0.15.2", - "indexmap 2.6.0", + "indexmap 2.7.0", "memchr", ] @@ -4071,20 +4078,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "opentelemetry" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c365a63eec4f55b7efeceb724f1336f26a9cf3427b70e59e2cd2a5b947fba96" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "once_cell", - "pin-project-lite", - "thiserror 1.0.69", -] - [[package]] name = "opentelemetry" version = "0.27.1" @@ -4099,19 +4092,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "opentelemetry-http" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad31e9de44ee3538fb9d64fe3376c1362f406162434609e79aea2a41a0af78ab" -dependencies = [ - "async-trait", - "bytes", - "http", - "opentelemetry 0.24.0", - "reqwest", -] - [[package]] name = "opentelemetry-http" version = "0.27.0" @@ -4121,7 +4101,8 @@ dependencies = [ "async-trait", "bytes", "http", - "opentelemetry 0.27.1", + "opentelemetry", + "reqwest", ] [[package]] @@ -4130,7 +4111,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e33208695c9d3049c848d2abf32f7336ec05cb5c02af1b710e89a99500edeb0" dependencies = [ - "opentelemetry 0.27.1", + "opentelemetry", ] [[package]] @@ -4142,10 +4123,10 @@ dependencies = [ "async-trait", "futures-core", "http", - "opentelemetry 0.27.1", - "opentelemetry-http 0.27.0", + "opentelemetry", + "opentelemetry-http", "opentelemetry-proto", - "opentelemetry_sdk 0.27.1", + "opentelemetry_sdk", "prost", "thiserror 1.0.69", ] @@ -4157,8 +4138,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b834e966ea5e2d03dfe5f2253f03d22cce21403ee940265070eeee96cee0bcc" dependencies = [ "once_cell", - "opentelemetry 0.27.1", - "opentelemetry_sdk 0.27.1", + "opentelemetry", + "opentelemetry_sdk", "prometheus", "protobuf", "tracing", @@ -4170,8 +4151,8 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" dependencies = [ - "opentelemetry 0.27.1", - "opentelemetry_sdk 0.27.1", + "opentelemetry", + "opentelemetry_sdk", "prost", "tonic", ] @@ -4182,17 +4163,11 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf6e83d3dca8fe93cfac95cd07313721c9e6e9f8655e7b06d061d4924df1a0cd" dependencies = [ - "opentelemetry 0.27.1", - "opentelemetry-semantic-conventions 0.27.0", - "opentelemetry_sdk 0.27.1", + "opentelemetry", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", ] -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cefe0543875379e47eb5f1e68ff83f45cc41366a92dfd0d073d513bf68e9a05" - [[package]] name = "opentelemetry-semantic-conventions" version = "0.27.0" @@ -4208,31 +4183,14 @@ dependencies = [ "async-trait", "chrono", "futures-util", - "opentelemetry 0.27.1", - "opentelemetry_sdk 0.27.1", + "opentelemetry", + "opentelemetry_sdk", "ordered-float", "serde", "serde_json", "thiserror 1.0.69", ] -[[package]] -name = "opentelemetry_sdk" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692eac490ec80f24a17828d49b40b60f5aeaccdfe6a503f939713afd22bc28df" -dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "once_cell", - "opentelemetry 0.24.0", - "percent-encoding", - "rand", - "thiserror 1.0.69", -] - [[package]] name = "opentelemetry_sdk" version = "0.27.1" @@ -4244,7 +4202,7 @@ dependencies = [ "futures-executor", "futures-util", "glob", - "opentelemetry 0.27.1", + "opentelemetry", "percent-encoding", "rand", "serde_json", @@ -4668,9 +4626,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.24" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910d41a655dac3b764f1ade94821093d3610248694320cd072303a8eedcf221d" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", "syn", @@ -4696,9 +4654,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -4812,9 +4770,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -4823,34 +4781,38 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror 1.0.69", + "thiserror 2.0.3", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", "rustc-hash 2.0.0", "rustls", + "rustls-pki-types", "slab", - "thiserror 1.0.69", + "thiserror 2.0.3", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -4962,7 +4924,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -4986,9 +4948,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -5107,7 +5069,7 @@ dependencies = [ "base64 0.22.1", "bytes", "form_urlencoded", - "indexmap 2.6.0", + "indexmap 2.7.0", "js_int", "percent-encoding", "regex", @@ -5190,9 +5152,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -5244,6 +5206,9 @@ name = "rustls-pki-types" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-platform-verifier" @@ -5332,7 +5297,7 @@ dependencies = [ "chrono", "dyn-clone", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "schemars_derive", "serde", "serde_json", @@ -5603,7 +5568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de514ef58196f1fc96dcaef80fe6170a1ce6215df9687a93fe8300e773fefc5" dependencies = [ "form_urlencoded", - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -5615,7 +5580,7 @@ version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -5676,7 +5641,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -5702,7 +5667,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -5889,7 +5854,7 @@ dependencies = [ "futures-util", "hashbrown 0.14.5", "hashlink", - "indexmap 2.6.0", + "indexmap 2.7.0", "ipnetwork", "log", "memchr", @@ -6125,9 +6090,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.87" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -6411,7 +6376,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -6562,14 +6527,14 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.25.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9784ed4da7d921bc8df6963f8c80a0e4ce34ba6ba76668acadd3edbd985ff3b" +checksum = "97a971f6058498b5c0f1affa23e7ea202057a7301dbff68e968b2d578bcbd053" dependencies = [ "js-sys", "once_cell", - "opentelemetry 0.24.0", - "opentelemetry_sdk 0.24.1", + "opentelemetry", + "opentelemetry_sdk", "tracing", "tracing-core", "tracing-subscriber", @@ -6657,9 +6622,9 @@ checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -6775,9 +6740,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" [[package]] name = "vcpkg" @@ -6824,9 +6789,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" dependencies = [ "cfg-if", "once_cell", @@ -6835,9 +6800,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" dependencies = [ "bumpalo", "log", @@ -6850,21 +6815,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6872,9 +6838,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" dependencies = [ "proc-macro2", "quote", @@ -6885,9 +6851,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" [[package]] name = "wasm-encoder" @@ -6907,7 +6873,7 @@ dependencies = [ "ahash", "bitflags 2.6.0", "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap 2.7.0", "semver", "serde", ] @@ -6936,7 +6902,7 @@ dependencies = [ "cc", "cfg-if", "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap 2.7.0", "libc", "libm", "log", @@ -7032,7 +6998,7 @@ dependencies = [ "cranelift-bitset", "cranelift-entity", "gimli", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "object", "postcard", @@ -7097,15 +7063,15 @@ checksum = "4bef2a726fd8d1ee9b0144655e16c492dc32eb4c7c9f7e3309fcffe637870933" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "wit-parser", ] [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" dependencies = [ "js-sys", "wasm-bindgen", @@ -7180,7 +7146,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -7427,7 +7393,7 @@ checksum = "0d3d1066ab761b115f97fef2b191090faabcb0f37b555b758d3caf42d4ed9e55" dependencies = [ "anyhow", "id-arena", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "semver", "serde", @@ -7467,9 +7433,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -7479,9 +7445,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", @@ -7512,18 +7478,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index e524d7c74..ec44154f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,6 @@ resolver = "2" # Updated in the CI with a `sed` command package.version = "0.12.0" - package.license = "AGPL-3.0-only" package.authors = ["Element Backend Team"] package.edition = "2021" @@ -337,15 +336,15 @@ version = "0.3.19" # OpenTelemetry [workspace.dependencies.opentelemetry] -version = "0.24.0" +version = "0.27.1" features = ["trace", "metrics"] [workspace.dependencies.opentelemetry-http] -version = "0.13.0" +version = "0.27.0" features = ["reqwest"] [workspace.dependencies.opentelemetry-semantic-conventions] -version = "0.16.0" +version = "0.27.0" [workspace.dependencies.tracing-opentelemetry] -version = "0.25.0" +version = "0.28.0" default-features = false # URL manipulation diff --git a/crates/cli/src/app_state.rs b/crates/cli/src/app_state.rs index 525ec5591..74a0720f7 100644 --- a/crates/cli/src/app_state.rs +++ b/crates/cli/src/app_state.rs @@ -25,10 +25,7 @@ use mas_router::UrlBuilder; use mas_storage::{BoxClock, BoxRepository, BoxRng, SystemClock}; use mas_storage_pg::PgRepository; use mas_templates::Templates; -use opentelemetry::{ - metrics::{Histogram, MetricsError}, - KeyValue, -}; +use opentelemetry::{metrics::Histogram, KeyValue}; use rand::SeedableRng; use sqlx::PgPool; @@ -55,50 +52,45 @@ pub struct AppState { impl AppState { /// Init the metrics for the app state. - /// - /// # Errors - /// - /// Returns an error if the metrics could not be initialized. - pub fn init_metrics(&mut self) -> Result<(), MetricsError> { + pub fn init_metrics(&mut self) { // XXX: do we want to put that somewhere else? - let meter = opentelemetry::global::meter_with_version( - env!("CARGO_PKG_NAME"), - Some(env!("CARGO_PKG_VERSION")), - Some(opentelemetry_semantic_conventions::SCHEMA_URL), - None, - ); + let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) + .with_version(env!("CARGO_PKG_VERSION")) + .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) + .build(); + let meter = opentelemetry::global::meter_with_scope(scope); + let pool = self.pool.clone(); - let usage = meter + meter .i64_observable_up_down_counter("db.connections.usage") .with_description("The number of connections that are currently in `state` described by the state attribute.") .with_unit("{connection}") - .init(); + .with_callback(move |instrument| { + let idle = u32::try_from(pool.num_idle()).unwrap_or(u32::MAX); + let used = pool.size() - idle; + instrument.observe(i64::from(idle), &[KeyValue::new("state", "idle")]); + instrument.observe(i64::from(used), &[KeyValue::new("state", "used")]); + }) + .build(); - let max = meter + let pool = self.pool.clone(); + meter .i64_observable_up_down_counter("db.connections.max") .with_description("The maximum number of open connections allowed.") .with_unit("{connection}") - .init(); - - // Observe the number of active and idle connections in the pool - meter.register_callback(&[usage.as_any(), max.as_any()], move |observer| { - let idle = u32::try_from(pool.num_idle()).unwrap_or(u32::MAX); - let used = pool.size() - idle; - let max_conn = pool.options().get_max_connections(); - observer.observe_i64(&usage, i64::from(idle), &[KeyValue::new("state", "idle")]); - observer.observe_i64(&usage, i64::from(used), &[KeyValue::new("state", "used")]); - observer.observe_i64(&max, i64::from(max_conn), &[]); - })?; + .with_callback(move |instrument| { + let max_conn = pool.options().get_max_connections(); + instrument.observe(i64::from(max_conn), &[]); + }) + .build(); // Track the connection acquisition time let histogram = meter .u64_histogram("db.client.connections.create_time") .with_description("The time it took to create a new connection.") .with_unit("ms") - .init(); + .build(); self.conn_acquisition_histogram = Some(histogram); - - Ok(()) } /// Init the metadata cache. diff --git a/crates/cli/src/commands/server.rs b/crates/cli/src/commands/server.rs index 0b0efdc31..bb607f983 100644 --- a/crates/cli/src/commands/server.rs +++ b/crates/cli/src/commands/server.rs @@ -228,7 +228,7 @@ impl Options { limiter, conn_acquisition_histogram: None, }; - s.init_metrics()?; + s.init_metrics(); // XXX: this might panic s.init_metadata_cache().await; s diff --git a/crates/cli/src/server.rs b/crates/cli/src/server.rs index 23b6d61de..17825f2ac 100644 --- a/crates/cli/src/server.rs +++ b/crates/cli/src/server.rs @@ -248,14 +248,14 @@ pub fn build_router( router .layer( InFlightCounterLayer::new("http.server.active_requests").on_request(( - name.map(|name| MAS_LISTENER_NAME.string(name.to_owned())), + name.map(|name| KeyValue::new(MAS_LISTENER_NAME, name.to_owned())), metrics_attributes_fn(on_http_request_labels), )), ) .layer( DurationRecorderLayer::new("http.server.duration") .on_request(( - name.map(|name| MAS_LISTENER_NAME.string(name.to_owned())), + name.map(|name| KeyValue::new(MAS_LISTENER_NAME, name.to_owned())), metrics_attributes_fn(on_http_request_labels), )) .on_response_fn(on_http_response_labels), diff --git a/crates/cli/src/telemetry.rs b/crates/cli/src/telemetry.rs index 90a19c62d..7afc96b0a 100644 --- a/crates/cli/src/telemetry.rs +++ b/crates/cli/src/telemetry.rs @@ -18,16 +18,13 @@ use opentelemetry::{ global, propagation::{TextMapCompositePropagator, TextMapPropagator}, trace::TracerProvider as _, - KeyValue, + InstrumentationScope, KeyValue, }; -use opentelemetry_otlp::MetricsExporterBuilder; +use opentelemetry_otlp::{WithExportConfig, WithHttpConfig}; use opentelemetry_prometheus::PrometheusExporter; use opentelemetry_sdk::{ self, - metrics::{ - reader::{DefaultAggregationSelector, DefaultTemporalitySelector}, - ManualReader, PeriodicReader, SdkMeterProvider, - }, + metrics::{ManualReader, PeriodicReader, SdkMeterProvider}, propagation::{BaggagePropagator, TraceContextPropagator}, trace::{Sampler, Tracer, TracerProvider}, Resource, @@ -41,16 +38,6 @@ static METER_PROVIDER: OnceCell = OnceCell::const_new(); static PROMETHEUS_REGISTRY: OnceCell = OnceCell::const_new(); pub fn setup(config: &TelemetryConfig) -> anyhow::Result> { - global::set_error_handler(|e| { - // Don't log the propagation errors, else we'll log an error on each request if - // the propagation errors aren't there - if matches!(e, opentelemetry::global::Error::Propagation(_)) { - return; - } - - tracing::error!(error = &e as &dyn std::error::Error); - })?; - let propagator = propagator(&config.tracing.propagators); // The CORS filter needs to know what headers it should whitelist for @@ -96,22 +83,22 @@ fn stdout_tracer_provider() -> TracerProvider { } fn otlp_tracer_provider(endpoint: Option<&Url>) -> anyhow::Result { - use opentelemetry_otlp::WithExportConfig; - - let mut exporter = opentelemetry_otlp::new_exporter() - .http() + let mut exporter = opentelemetry_otlp::SpanExporter::builder() + .with_http() .with_http_client(mas_http::reqwest_client()); if let Some(endpoint) = endpoint { exporter = exporter.with_endpoint(endpoint.to_string()); } - - let tracer = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter(exporter) - .with_trace_config(trace_config()) - .install_batch(opentelemetry_sdk::runtime::Tokio) + let exporter = exporter + .build() .context("Failed to configure OTLP trace exporter")?; + let tracer = opentelemetry_sdk::trace::TracerProvider::builder() + .with_batch_exporter(exporter, opentelemetry_sdk::runtime::Tokio) + .with_resource(resource()) + .with_sampler(Sampler::AlwaysOn) + .build(); + Ok(tracer) } @@ -122,37 +109,35 @@ fn tracer(config: &TracingConfig) -> anyhow::Result> { TracingExporterKind::Otlp => otlp_tracer_provider(config.endpoint.as_ref())?, }; - let tracer = tracer_provider - .tracer_builder(env!("CARGO_PKG_NAME")) + let scope = InstrumentationScope::builder(env!("CARGO_PKG_NAME")) .with_version(env!("CARGO_PKG_VERSION")) .with_schema_url(semcov::SCHEMA_URL) .build(); + let tracer = tracer_provider.tracer_with_scope(scope); + global::set_tracer_provider(tracer_provider); Ok(Some(tracer)) } fn otlp_metric_reader(endpoint: Option<&url::Url>) -> anyhow::Result { - use opentelemetry_otlp::WithExportConfig; - - let mut exporter = opentelemetry_otlp::new_exporter() - .http() + let mut exporter = opentelemetry_otlp::MetricExporter::builder() + .with_http() .with_http_client(mas_http::reqwest_client()); if let Some(endpoint) = endpoint { exporter = exporter.with_endpoint(endpoint.to_string()); } + let exporter = exporter + .build() + .context("Failed to configure OTLP metric exporter")?; - let exporter = MetricsExporterBuilder::from(exporter).build_metrics_exporter( - Box::new(DefaultTemporalitySelector::new()), - Box::new(DefaultAggregationSelector::new()), - )?; - - Ok(PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build()) + let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build(); + Ok(reader) } fn stdout_metric_reader() -> PeriodicReader { - let exporter = opentelemetry_stdout::MetricsExporter::default(); + let exporter = opentelemetry_stdout::MetricExporter::builder().build(); PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio).build() } @@ -230,12 +215,6 @@ fn init_meter(config: &MetricsConfig) -> anyhow::Result<()> { Ok(()) } -fn trace_config() -> opentelemetry_sdk::trace::Config { - opentelemetry_sdk::trace::Config::default() - .with_resource(resource()) - .with_sampler(Sampler::AlwaysOn) -} - fn resource() -> Resource { let resource = Resource::new([ KeyValue::new(semcov::resource::SERVICE_NAME, env!("CARGO_PKG_NAME")), diff --git a/crates/handlers/src/activity_tracker/worker.rs b/crates/handlers/src/activity_tracker/worker.rs index 5f2e1caac..4102c1596 100644 --- a/crates/handlers/src/activity_tracker/worker.rs +++ b/crates/handlers/src/activity_tracker/worker.rs @@ -10,7 +10,7 @@ use chrono::{DateTime, Utc}; use mas_storage::{user::BrowserSessionRepository, RepositoryAccess}; use opentelemetry::{ metrics::{Counter, Histogram}, - Key, + Key, KeyValue, }; use sqlx::PgPool; use tokio_util::sync::CancellationToken; @@ -48,18 +48,17 @@ pub struct Worker { impl Worker { pub(crate) fn new(pool: PgPool) -> Self { - let meter = opentelemetry::global::meter_with_version( - env!("CARGO_PKG_NAME"), - Some(env!("CARGO_PKG_VERSION")), - Some(opentelemetry_semantic_conventions::SCHEMA_URL), - None, - ); + let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) + .with_version(env!("CARGO_PKG_VERSION")) + .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) + .build(); + let meter = opentelemetry::global::meter_with_scope(scope); let message_counter = meter .u64_counter("mas.activity_tracker.messages") .with_description("The number of messages received by the activity tracker") .with_unit("{messages}") - .init(); + .build(); // Record stuff on the counter so that the metrics are initialized for kind in &[ @@ -69,17 +68,20 @@ impl Worker { ] { message_counter.add( 0, - &[TYPE.string("record"), SESSION_KIND.string(kind.as_str())], + &[ + KeyValue::new(TYPE, "record"), + KeyValue::new(SESSION_KIND, kind.as_str()), + ], ); } - message_counter.add(0, &[TYPE.string("flush")]); - message_counter.add(0, &[TYPE.string("shutdown")]); + message_counter.add(0, &[KeyValue::new(TYPE, "flush")]); + message_counter.add(0, &[KeyValue::new(TYPE, "shutdown")]); let flush_time_histogram = meter .u64_histogram("mas.activity_tracker.flush_time") .with_description("The time it took to flush the activity tracker") .with_unit("ms") - .init(); + .build(); Self { pool, @@ -137,7 +139,10 @@ impl Worker { self.message_counter.add( 1, - &[TYPE.string("record"), SESSION_KIND.string(kind.as_str())], + &[ + KeyValue::new(TYPE, "record"), + KeyValue::new(SESSION_KIND, kind.as_str()), + ], ); let record = @@ -153,7 +158,7 @@ impl Worker { } Message::Flush(tx) => { - self.message_counter.add(1, &[TYPE.string("flush")]); + self.message_counter.add(1, &[KeyValue::new(TYPE, "flush")]); self.flush().await; let _ = tx.send(()); @@ -182,11 +187,11 @@ impl Worker { match res { Ok(()) => { self.flush_time_histogram - .record(duration_ms, &[RESULT.string("success")]); + .record(duration_ms, &[KeyValue::new(RESULT, "success")]); } Err(e) => { self.flush_time_histogram - .record(duration_ms, &[RESULT.string("failure")]); + .record(duration_ms, &[KeyValue::new(RESULT, "failure")]); tracing::error!("Failed to flush activity tracker: {}", e); } } diff --git a/crates/http/src/lib.rs b/crates/http/src/lib.rs index c754ec207..be631ff87 100644 --- a/crates/http/src/lib.rs +++ b/crates/http/src/lib.rs @@ -20,10 +20,10 @@ pub use self::{ }; static METER: LazyLock = LazyLock::new(|| { - opentelemetry::global::meter_with_version( - env!("CARGO_PKG_NAME"), - Some(env!("CARGO_PKG_VERSION")), - Some(opentelemetry_semantic_conventions::SCHEMA_URL), - None, - ) + let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) + .with_version(env!("CARGO_PKG_VERSION")) + .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) + .build(); + + opentelemetry::global::meter_with_scope(scope) }); diff --git a/crates/http/src/reqwest.rs b/crates/http/src/reqwest.rs index 24f1b47cb..b8953386b 100644 --- a/crates/http/src/reqwest.rs +++ b/crates/http/src/reqwest.rs @@ -44,7 +44,7 @@ static HTTP_REQUESTS_DURATION_HISTOGRAM: LazyLock> = LazyLock::ne .u64_histogram(HTTP_CLIENT_REQUEST_DURATION) .with_unit("ms") .with_description("Duration of HTTP client requests") - .init() + .build() }); static HTTP_REQUESTS_IN_FLIGHT: LazyLock> = LazyLock::new(|| { @@ -52,7 +52,7 @@ static HTTP_REQUESTS_IN_FLIGHT: LazyLock> = LazyLock::new(|| .i64_up_down_counter(HTTP_CLIENT_ACTIVE_REQUESTS) .with_unit("{requests}") .with_description("Number of HTTP client requests in flight") - .init() + .build() }); struct TracingResolver { diff --git a/crates/tower/src/lib.rs b/crates/tower/src/lib.rs index 518f3109f..fac8379f8 100644 --- a/crates/tower/src/lib.rs +++ b/crates/tower/src/lib.rs @@ -14,10 +14,10 @@ mod utils; pub use self::{metrics::*, trace_context::*, tracing::*, utils::*}; fn meter() -> opentelemetry::metrics::Meter { - opentelemetry::global::meter_with_version( - env!("CARGO_PKG_NAME"), - Some(env!("CARGO_PKG_VERSION")), - Some(opentelemetry_semantic_conventions::SCHEMA_URL), - None, - ) + let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) + .with_version(env!("CARGO_PKG_VERSION")) + .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) + .build(); + + opentelemetry::global::meter_with_scope(scope) } diff --git a/crates/tower/src/metrics/duration.rs b/crates/tower/src/metrics/duration.rs index 1f9cb4cc7..9a33a83bf 100644 --- a/crates/tower/src/metrics/duration.rs +++ b/crates/tower/src/metrics/duration.rs @@ -25,7 +25,7 @@ impl DurationRecorderLayer { /// Create a new [`DurationRecorderLayer`]. #[must_use] pub fn new(name: &'static str) -> Self { - let histogram = crate::meter().u64_histogram(name).init(); + let histogram = crate::meter().u64_histogram(name).build(); Self { histogram, on_request: (), diff --git a/crates/tower/src/metrics/in_flight.rs b/crates/tower/src/metrics/in_flight.rs index f9b5b0dae..5d5bd8676 100644 --- a/crates/tower/src/metrics/in_flight.rs +++ b/crates/tower/src/metrics/in_flight.rs @@ -31,7 +31,7 @@ impl InFlightCounterLayer { .i64_up_down_counter(name) .with_unit("{request}") .with_description("The number of in-flight requests") - .init(); + .build(); Self { counter, diff --git a/deny.toml b/deny.toml index 66da68bb1..92a056233 100644 --- a/deny.toml +++ b/deny.toml @@ -30,7 +30,6 @@ allow = [ "MPL-2.0", "OpenSSL", "Unicode-3.0", - "Unicode-DFS-2016", "Zlib", ] From 3bfab8a8b64fd61f71ffdfc635f6ca0713ef56a6 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Dec 2024 14:35:14 +0100 Subject: [PATCH 3/5] Move all the OTEL dependencies to the workspace --- Cargo.toml | 28 ++++++++++++++++++++++++++++ crates/cli/Cargo.toml | 22 +++++++--------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ec44154f2..5c318b40e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -338,15 +338,43 @@ version = "0.3.19" [workspace.dependencies.opentelemetry] version = "0.27.1" features = ["trace", "metrics"] + [workspace.dependencies.opentelemetry-http] version = "0.27.0" features = ["reqwest"] + +[workspace.dependencies.opentelemetry-jaeger-propagator] +version = "0.27.0" + +[workspace.dependencies.opentelemetry-otlp] +version = "0.27.0" +default-features = false +features = ["trace", "metrics", "http-proto"] + +[workspace.dependencies.opentelemetry-prometheus] +version = "0.27.0" + +[workspace.dependencies.opentelemetry-resource-detectors] +version = "0.6.0" + [workspace.dependencies.opentelemetry-semantic-conventions] version = "0.27.0" + +[workspace.dependencies.opentelemetry-stdout] +version = "0.27.0" +features = ["trace", "metrics"] + +[workspace.dependencies.opentelemetry_sdk] +version = "0.27.1" +features = ["rt-tokio"] + [workspace.dependencies.tracing-opentelemetry] version = "0.28.0" default-features = false +[workspace.dependencies.prometheus] +version = "0.13.4" + # URL manipulation [workspace.dependencies.url] version = "2.5.4" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 7acfda1ba..1a963c900 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -49,22 +49,14 @@ tracing-subscriber = { workspace = true, features = ["env-filter"] } tracing-opentelemetry.workspace = true opentelemetry.workspace = true opentelemetry-http.workspace = true -opentelemetry-jaeger-propagator = "0.27.0" -opentelemetry-otlp = { version = "0.27.0", default-features = false, features = [ - "trace", - "metrics", - "http-proto", -] } -opentelemetry-prometheus = "0.27.0" -opentelemetry-resource-detectors = "0.6.0" +opentelemetry-jaeger-propagator.workspace = true +opentelemetry-otlp.workspace = true +opentelemetry-prometheus.workspace = true +opentelemetry-resource-detectors.workspace = true opentelemetry-semantic-conventions.workspace = true -opentelemetry-stdout = { version = "0.27.0", features = ["trace", "metrics"] } -opentelemetry_sdk = { version = "0.27.1", features = [ - "trace", - "metrics", - "rt-tokio", -] } -prometheus = "0.13.4" +opentelemetry-stdout.workspace = true +opentelemetry_sdk.workspace = true +prometheus.workspace = true sentry.workspace = true sentry-tracing.workspace = true sentry-tower.workspace = true From e80e5302924882f37ada2700f64cd3499880522b Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Dec 2024 15:09:50 +0100 Subject: [PATCH 4/5] Move all the OTEL meters to crate-level statics --- crates/cli/src/app_state.rs | 15 ++-- crates/cli/src/main.rs | 6 +- crates/cli/src/telemetry.rs | 70 +++++++++++-------- .../handlers/src/activity_tracker/worker.rs | 15 ++-- crates/handlers/src/lib.rs | 12 +++- crates/tower/src/lib.rs | 8 ++- crates/tower/src/metrics/duration.rs | 4 +- crates/tower/src/metrics/in_flight.rs | 4 +- 8 files changed, 77 insertions(+), 57 deletions(-) diff --git a/crates/cli/src/app_state.rs b/crates/cli/src/app_state.rs index 74a0720f7..2ec207b0a 100644 --- a/crates/cli/src/app_state.rs +++ b/crates/cli/src/app_state.rs @@ -29,6 +29,8 @@ use opentelemetry::{metrics::Histogram, KeyValue}; use rand::SeedableRng; use sqlx::PgPool; +use crate::telemetry::METER; + #[derive(Clone)] pub struct AppState { pub pool: PgPool, @@ -53,15 +55,8 @@ pub struct AppState { impl AppState { /// Init the metrics for the app state. pub fn init_metrics(&mut self) { - // XXX: do we want to put that somewhere else? - let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) - .with_version(env!("CARGO_PKG_VERSION")) - .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) - .build(); - let meter = opentelemetry::global::meter_with_scope(scope); - let pool = self.pool.clone(); - meter + METER .i64_observable_up_down_counter("db.connections.usage") .with_description("The number of connections that are currently in `state` described by the state attribute.") .with_unit("{connection}") @@ -74,7 +69,7 @@ impl AppState { .build(); let pool = self.pool.clone(); - meter + METER .i64_observable_up_down_counter("db.connections.max") .with_description("The maximum number of open connections allowed.") .with_unit("{connection}") @@ -85,7 +80,7 @@ impl AppState { .build(); // Track the connection acquisition time - let histogram = meter + let histogram = METER .u64_histogram("db.client.connections.create_time") .with_description("The time it took to create a new connection.") .with_unit("ms") diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 220480b93..31583594b 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -119,11 +119,11 @@ async fn try_main() -> anyhow::Result { }); // Setup OpenTelemetry tracing and metrics - let tracer = telemetry::setup(&telemetry_config).context("failed to setup OpenTelemetry")?; + self::telemetry::setup(&telemetry_config).context("failed to setup OpenTelemetry")?; - let telemetry_layer = tracer.map(|tracer| { + let telemetry_layer = self::telemetry::TRACER.get().map(|tracer| { tracing_opentelemetry::layer() - .with_tracer(tracer) + .with_tracer(tracer.clone()) .with_tracked_inactivity(false) .with_filter(LevelFilter::INFO) }); diff --git a/crates/cli/src/telemetry.rs b/crates/cli/src/telemetry.rs index 7afc96b0a..bc9917db2 100644 --- a/crates/cli/src/telemetry.rs +++ b/crates/cli/src/telemetry.rs @@ -4,7 +4,10 @@ // SPDX-License-Identifier: AGPL-3.0-only // Please see LICENSE in the repository root for full details. -use std::time::Duration; +use std::{ + sync::{LazyLock, OnceLock}, + time::Duration, +}; use anyhow::Context as _; use bytes::Bytes; @@ -15,7 +18,7 @@ use mas_config::{ TracingExporterKind, }; use opentelemetry::{ - global, + metrics::Meter, propagation::{TextMapCompositePropagator, TextMapPropagator}, trace::TracerProvider as _, InstrumentationScope, KeyValue, @@ -23,7 +26,6 @@ use opentelemetry::{ use opentelemetry_otlp::{WithExportConfig, WithHttpConfig}; use opentelemetry_prometheus::PrometheusExporter; use opentelemetry_sdk::{ - self, metrics::{ManualReader, PeriodicReader, SdkMeterProvider}, propagation::{BaggagePropagator, TraceContextPropagator}, trace::{Sampler, Tracer, TracerProvider}, @@ -31,29 +33,38 @@ use opentelemetry_sdk::{ }; use opentelemetry_semantic_conventions as semcov; use prometheus::Registry; -use tokio::sync::OnceCell; use url::Url; -static METER_PROVIDER: OnceCell = OnceCell::const_new(); -static PROMETHEUS_REGISTRY: OnceCell = OnceCell::const_new(); +static SCOPE: LazyLock = LazyLock::new(|| { + InstrumentationScope::builder(env!("CARGO_PKG_NAME")) + .with_version(env!("CARGO_PKG_VERSION")) + .with_schema_url(semcov::SCHEMA_URL) + .build() +}); -pub fn setup(config: &TelemetryConfig) -> anyhow::Result> { +pub static METER: LazyLock = + LazyLock::new(|| opentelemetry::global::meter_with_scope(SCOPE.clone())); + +pub static TRACER: OnceLock = OnceLock::new(); +static METER_PROVIDER: OnceLock = OnceLock::new(); +static PROMETHEUS_REGISTRY: OnceLock = OnceLock::new(); + +pub fn setup(config: &TelemetryConfig) -> anyhow::Result<()> { let propagator = propagator(&config.tracing.propagators); // The CORS filter needs to know what headers it should whitelist for // CORS-protected requests. mas_http::set_propagator(&propagator); - global::set_text_map_propagator(propagator); - - let tracer = tracer(&config.tracing).context("Failed to configure traces exporter")?; + opentelemetry::global::set_text_map_propagator(propagator); + init_tracer(&config.tracing).context("Failed to configure traces exporter")?; init_meter(&config.metrics).context("Failed to configure metrics exporter")?; - Ok(tracer) + Ok(()) } pub fn shutdown() { - global::shutdown_tracer_provider(); + opentelemetry::global::shutdown_tracer_provider(); if let Some(meter_provider) = METER_PROVIDER.get() { meter_provider.shutdown().unwrap(); @@ -93,32 +104,30 @@ fn otlp_tracer_provider(endpoint: Option<&Url>) -> anyhow::Result anyhow::Result> { +fn init_tracer(config: &TracingConfig) -> anyhow::Result<()> { let tracer_provider = match config.exporter { - TracingExporterKind::None => return Ok(None), + TracingExporterKind::None => return Ok(()), TracingExporterKind::Stdout => stdout_tracer_provider(), TracingExporterKind::Otlp => otlp_tracer_provider(config.endpoint.as_ref())?, }; - let scope = InstrumentationScope::builder(env!("CARGO_PKG_NAME")) - .with_version(env!("CARGO_PKG_VERSION")) - .with_schema_url(semcov::SCHEMA_URL) - .build(); + let tracer = tracer_provider.tracer_with_scope(SCOPE.clone()); + TRACER + .set(tracer) + .map_err(|_| anyhow::anyhow!("TRACER was set twice"))?; - let tracer = tracer_provider.tracer_with_scope(scope); + opentelemetry::global::set_tracer_provider(tracer_provider); - global::set_tracer_provider(tracer_provider); - - Ok(Some(tracer)) + Ok(()) } fn otlp_metric_reader(endpoint: Option<&url::Url>) -> anyhow::Result { @@ -175,7 +184,7 @@ fn prometheus_service_fn(_req: T) -> PromServiceFuture { } pub fn prometheus_service() -> tower::util::ServiceFn PromServiceFuture> { - if !PROMETHEUS_REGISTRY.initialized() { + if PROMETHEUS_REGISTRY.get().is_none() { tracing::warn!("A Prometheus resource was mounted on a listener, but the Prometheus exporter was not setup in the config"); } @@ -184,7 +193,10 @@ pub fn prometheus_service() -> tower::util::ServiceFn PromServiceFut fn prometheus_metric_reader() -> anyhow::Result { let registry = Registry::new(); - PROMETHEUS_REGISTRY.set(registry.clone())?; + + PROMETHEUS_REGISTRY + .set(registry.clone()) + .map_err(|_| anyhow::anyhow!("PROMETHEUS_REGISTRY was set twice"))?; let exporter = opentelemetry_prometheus::exporter() .with_registry(registry) @@ -209,8 +221,10 @@ fn init_meter(config: &MetricsConfig) -> anyhow::Result<()> { let meter_provider = meter_provider_builder.with_resource(resource()).build(); - METER_PROVIDER.set(meter_provider.clone())?; - global::set_meter_provider(meter_provider.clone()); + METER_PROVIDER + .set(meter_provider.clone()) + .map_err(|_| anyhow::anyhow!("METER_PROVIDER was set twice"))?; + opentelemetry::global::set_meter_provider(meter_provider.clone()); Ok(()) } diff --git a/crates/handlers/src/activity_tracker/worker.rs b/crates/handlers/src/activity_tracker/worker.rs index 4102c1596..6fc3f8a86 100644 --- a/crates/handlers/src/activity_tracker/worker.rs +++ b/crates/handlers/src/activity_tracker/worker.rs @@ -16,7 +16,10 @@ use sqlx::PgPool; use tokio_util::sync::CancellationToken; use ulid::Ulid; -use crate::activity_tracker::{Message, SessionKind}; +use crate::{ + activity_tracker::{Message, SessionKind}, + METER, +}; /// The maximum number of pending activity records before we flush them to the /// database automatically. @@ -48,13 +51,7 @@ pub struct Worker { impl Worker { pub(crate) fn new(pool: PgPool) -> Self { - let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) - .with_version(env!("CARGO_PKG_VERSION")) - .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) - .build(); - let meter = opentelemetry::global::meter_with_scope(scope); - - let message_counter = meter + let message_counter = METER .u64_counter("mas.activity_tracker.messages") .with_description("The number of messages received by the activity tracker") .with_unit("{messages}") @@ -77,7 +74,7 @@ impl Worker { message_counter.add(0, &[KeyValue::new(TYPE, "flush")]); message_counter.add(0, &[KeyValue::new(TYPE, "shutdown")]); - let flush_time_histogram = meter + let flush_time_histogram = METER .u64_histogram("mas.activity_tracker.flush_time") .with_description("The time it took to flush the activity tracker") .with_unit("ms") diff --git a/crates/handlers/src/lib.rs b/crates/handlers/src/lib.rs index 9d0abb93f..10f96ca9b 100644 --- a/crates/handlers/src/lib.rs +++ b/crates/handlers/src/lib.rs @@ -15,7 +15,7 @@ clippy::let_with_type_underscore, )] -use std::{convert::Infallible, time::Duration}; +use std::{convert::Infallible, sync::LazyLock, time::Duration}; use axum::{ extract::{FromRef, FromRequestParts, OriginalUri, RawQuery, State}, @@ -41,6 +41,7 @@ use mas_policy::Policy; use mas_router::{Route, UrlBuilder}; use mas_storage::{BoxClock, BoxRepository, BoxRng}; use mas_templates::{ErrorContext, NotFoundContext, TemplateContext, Templates}; +use opentelemetry::metrics::Meter; use passwords::PasswordManager; use sqlx::PgPool; use tower::util::AndThenLayer; @@ -62,6 +63,15 @@ mod rate_limit; #[cfg(test)] mod test_utils; +static METER: LazyLock = LazyLock::new(|| { + let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) + .with_version(env!("CARGO_PKG_VERSION")) + .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) + .build(); + + opentelemetry::global::meter_with_scope(scope) +}); + /// Implement `From` for `RouteError`, for "internal server error" kind of /// errors. #[macro_export] diff --git a/crates/tower/src/lib.rs b/crates/tower/src/lib.rs index fac8379f8..7c3bd077b 100644 --- a/crates/tower/src/lib.rs +++ b/crates/tower/src/lib.rs @@ -6,6 +6,10 @@ #![allow(clippy::module_name_repetitions)] +use std::sync::LazyLock; + +use opentelemetry::metrics::Meter; + mod metrics; mod trace_context; mod tracing; @@ -13,11 +17,11 @@ mod utils; pub use self::{metrics::*, trace_context::*, tracing::*, utils::*}; -fn meter() -> opentelemetry::metrics::Meter { +static METER: LazyLock = LazyLock::new(|| { let scope = opentelemetry::InstrumentationScope::builder(env!("CARGO_PKG_NAME")) .with_version(env!("CARGO_PKG_VERSION")) .with_schema_url(opentelemetry_semantic_conventions::SCHEMA_URL) .build(); opentelemetry::global::meter_with_scope(scope) -} +}); diff --git a/crates/tower/src/metrics/duration.rs b/crates/tower/src/metrics/duration.rs index 9a33a83bf..fa876fc70 100644 --- a/crates/tower/src/metrics/duration.rs +++ b/crates/tower/src/metrics/duration.rs @@ -10,7 +10,7 @@ use opentelemetry::{metrics::Histogram, KeyValue}; use pin_project_lite::pin_project; use tower::{Layer, Service}; -use crate::{utils::FnWrapper, MetricsAttributes}; +use crate::{utils::FnWrapper, MetricsAttributes, METER}; /// A [`Layer`] that records the duration of requests in milliseconds. #[derive(Clone, Debug)] @@ -25,7 +25,7 @@ impl DurationRecorderLayer { /// Create a new [`DurationRecorderLayer`]. #[must_use] pub fn new(name: &'static str) -> Self { - let histogram = crate::meter().u64_histogram(name).build(); + let histogram = METER.u64_histogram(name).build(); Self { histogram, on_request: (), diff --git a/crates/tower/src/metrics/in_flight.rs b/crates/tower/src/metrics/in_flight.rs index 5d5bd8676..55ebdfe17 100644 --- a/crates/tower/src/metrics/in_flight.rs +++ b/crates/tower/src/metrics/in_flight.rs @@ -10,7 +10,7 @@ use opentelemetry::{metrics::UpDownCounter, KeyValue}; use pin_project_lite::pin_project; use tower::{Layer, Service}; -use crate::MetricsAttributes; +use crate::{MetricsAttributes, METER}; /// A [`Layer`] that records the number of in-flight requests. /// @@ -27,7 +27,7 @@ impl InFlightCounterLayer { /// Create a new [`InFlightCounterLayer`]. #[must_use] pub fn new(name: &'static str) -> Self { - let counter = crate::meter() + let counter = METER .i64_up_down_counter(name) .with_unit("{request}") .with_description("The number of in-flight requests") From bdfcd1000414159064ed410fc517b65b18f0504c Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Thu, 12 Dec 2024 15:14:11 +0100 Subject: [PATCH 5/5] Enable the experimental semantic conventions --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index 5c318b40e..c17c2e09d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -359,6 +359,7 @@ version = "0.6.0" [workspace.dependencies.opentelemetry-semantic-conventions] version = "0.27.0" +features = ["semconv_experimental"] [workspace.dependencies.opentelemetry-stdout] version = "0.27.0"