From ed51ff4661e6f7463bf614fdc64e3d4c8b3e97d0 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Wed, 8 Feb 2023 10:15:07 -0500 Subject: [PATCH 1/2] fix: logging --- .github/workflows/ci.yml | 5 + .github/workflows/release.yml | 5 + Cargo.lock | 773 ++++++++++++++++++++-------------- Cargo.toml | 17 +- Dockerfile | 6 + docker-compose.yml | 10 +- src/config.rs | 4 +- src/error.rs | 36 ++ src/handlers/metrics.rs | 15 + src/handlers/mod.rs | 91 ++++ src/lib.rs | 118 ++---- src/log.rs | 100 +++++ src/main.rs | 10 +- src/metrics.rs | 73 ++++ src/state.rs | 17 +- terraform/ecs/main.tf | 25 +- terraform/ecs/variables.tf | 16 + terraform/main.tf | 35 +- tests/context/server.rs | 4 +- 19 files changed, 907 insertions(+), 453 deletions(-) create mode 100644 src/handlers/metrics.rs create mode 100644 src/log.rs create mode 100644 src/metrics.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 057cfc9..e84081b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,6 +117,11 @@ jobs: sccache --stop-server || true sccache --start-server + # TODO: Remove once https://crates.io/crates/opentelemetry-otlp is updated + # and no longer has a build requirement of `protoc``. + - name: Install Protoc + uses: arduino/setup-protoc@v1 + - name: "Task ${{ matrix.cargo.name }}" uses: actions-rs/cargo@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ccb73a7..1edd18d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,6 +19,11 @@ jobs: with: fetch-depth: 0 + # TODO: Remove once https://crates.io/crates/opentelemetry-otlp is updated + # and no longer has a build requirement of `protoc``. + - name: Install Protoc + uses: arduino/setup-protoc@v1 + - name: "Cocogitto release" id: release uses: cocogitto/cocogitto-action@v3 diff --git a/Cargo.lock b/Cargo.lock index bb5a01f..7fc6ca8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,15 +13,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - [[package]] name = "android_system_properties" version = "0.1.5" @@ -33,9 +24,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" [[package]] name = "async-stream" @@ -60,9 +51,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.58" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" +checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" dependencies = [ "proc-macro2", "quote", @@ -78,6 +69,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -86,9 +88,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744864363a200a5e724a7e61bc8c11b6628cf2e3ec519c8a1a48e609a8156b40" +checksum = "e5694b64066a2459918d8074c2ce0d5a88f409431994c2356617c8ae0c4721fc" dependencies = [ "async-trait", "axum-core", @@ -119,9 +121,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b8558f5a0581152dc94dcd289132a1d377494bdeafcd41869b3258e3e2ad92" +checksum = "1cae3e661676ffbacb30f1a824089a8c9150e71017f7e1e38f2aa32009188d34" dependencies = [ "async-trait", "bytes", @@ -140,6 +142,18 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + [[package]] name = "bincode" version = "1.3.3" @@ -166,9 +180,9 @@ dependencies = [ [[package]] name = "build-info" -version = "0.0.28" +version = "0.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bf06a3b4e5e41d1b016947db0c6511dbff1c223781eba90ad641389a861756" +checksum = "e2915568baa77be2c38f1d7594d1d7ceecc1012ab1ffdf8ddc9d0210596ee23e" dependencies = [ "build-info-common", "build-info-proc", @@ -177,12 +191,12 @@ dependencies = [ [[package]] name = "build-info-build" -version = "0.0.28" +version = "0.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6913fd408c46e00eba9db2181a3bf6feee014723d2ce61bff7a25a7692dae27b" +checksum = "562a39027834eae2be534ab5079440cfaa4ce9ca769646e72b1c734236205f16" dependencies = [ "anyhow", - "base64", + "base64 0.20.0", "bincode", "build-info-common", "cargo_metadata", @@ -198,9 +212,9 @@ dependencies = [ [[package]] name = "build-info-common" -version = "0.0.28" +version = "0.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cad3b1f4d64cc596ffcb198d651ccdab0e182b55af86a6849cb0ab69f72e681" +checksum = "401a9dafdaa6855a7f66fb38f11627f606bce40fb782d124d4d058aec51188de" dependencies = [ "chrono", "derive_more", @@ -210,12 +224,12 @@ dependencies = [ [[package]] name = "build-info-proc" -version = "0.0.28" +version = "0.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ad667c0029e6482c7f2a74e456392b9a442ea8d85b16a945d24569bdc0e2cd" +checksum = "6d2c40d327e9d58c805c3154cfc7ecc5cb917c1e214fb3d37367540b4b7a9fcf" dependencies = [ "anyhow", - "base64", + "base64 0.20.0", "bincode", "build-info-common", "chrono", @@ -231,9 +245,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byteorder" @@ -243,15 +257,15 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "camino" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad0e1e3e88dd237a156ab9f571021b8a158caa0ae44b1968a241efb5144c1e" +checksum = "c77df041dc383319cc661b428b6961a005db4d6808d5e12536931b1ca9556055" dependencies = [ "serde", ] @@ -267,9 +281,9 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982a0cf6a99c350d7246035613882e376d58cebe571785abc5da4f648d53ac0a" +checksum = "08a1ec454bc3eead8719cb56e15dbbfecdbc14e4b3a3ae4936cc6e31f5fc0d07" dependencies = [ "camino", "cargo-platform", @@ -281,9 +295,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.77" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" dependencies = [ "jobserver", ] @@ -350,18 +364,18 @@ dependencies = [ [[package]] name = "crc" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" [[package]] name = "crossbeam-channel" @@ -414,9 +428,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.82" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a41a86530d0fe7f5d9ea779916b7cadd2d4f9add748b99c2c029cbbdfaf453" +checksum = "bc831ee6a32dd495436e317595e639a587aa9907bef96fe6e6abc290ab6204e9" dependencies = [ "cc", "cxxbridge-flags", @@ -426,9 +440,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.82" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06416d667ff3e3ad2df1cd8cd8afae5da26cf9cec4d0825040f88b5ca659a2f0" +checksum = "94331d54f1b1a8895cd81049f7eaaaef9d05a7dcb4d1fd08bf3ff0806246789d" dependencies = [ "cc", "codespan-reporting", @@ -441,15 +455,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.82" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "820a9a2af1669deeef27cb271f476ffd196a2c4b6731336011e0ba63e2c7cf71" +checksum = "48dcd35ba14ca9b40d6e4b4b39961f23d835dbb8eed74565ded361d93e1feb8a" [[package]] name = "cxxbridge-macro" -version = "1.0.82" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08a6e2fcc370a089ad3b4aaf54db3b1b4cee38ddabce5896b33eb693275f470" +checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2" dependencies = [ "proc-macro2", "quote", @@ -458,12 +472,15 @@ dependencies = [ [[package]] name = "dashmap" -version = "4.0.2" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if", - "num_cpus", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core 0.9.7", ] [[package]] @@ -530,15 +547,15 @@ checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] @@ -605,9 +622,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" dependencies = [ "futures-channel", "futures-core", @@ -620,9 +637,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" dependencies = [ "futures-core", "futures-sink", @@ -630,15 +647,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" dependencies = [ "futures-core", "futures-task", @@ -658,15 +675,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" dependencies = [ "proc-macro2", "quote", @@ -675,21 +692,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" dependencies = [ "futures-channel", "futures-core", @@ -739,9 +756,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" @@ -758,7 +775,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.4", + "tokio-util", "tracing", ] @@ -782,27 +799,27 @@ dependencies = [ [[package]] name = "heck" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" dependencies = [ "unicode-segmentation", ] [[package]] -name = "heck" -version = "0.4.0" +name = "hermit-abi" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ - "unicode-segmentation", + "libc", ] [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" dependencies = [ "libc", ] @@ -873,9 +890,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" dependencies = [ "bytes", "futures-channel", @@ -975,9 +992,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec947b7a4ce12e3b87e353abae7ce124d025b6c7d6c5aea5cc0bcf92e9510ded" +checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" [[package]] name = "itertools" @@ -990,9 +1007,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "jobserver" @@ -1005,9 +1022,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -1020,15 +1037,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.137" +version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" [[package]] name = "libgit2-sys" -version = "0.14.0+1.5.0" +version = "0.14.2+1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a00859c70c8a4f7218e6d1cc32875c4b55f6799445b842b0d8ed5e4c3d959b" +checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4" dependencies = [ "cc", "libc", @@ -1050,9 +1067,9 @@ dependencies = [ [[package]] name = "link-cplusplus" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" dependencies = [ "cc", ] @@ -1087,11 +1104,20 @@ 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", +] + [[package]] name = "matchit" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfc802da7b1cf80aefffa0c7b2f77247c8b32206cc83c270b61264f5b360a80" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" [[package]] name = "md-5" @@ -1158,9 +1184,9 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", @@ -1208,25 +1234,25 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "once_cell" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" [[package]] name = "openssl" -version = "0.10.43" +version = "0.10.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020433887e44c27ff16365eaa2d380547a94544ad509aff6eb5b6e3e0b27b376" +checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" dependencies = [ "bitflags", "cfg-if", @@ -1256,9 +1282,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.78" +version = "0.9.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d5c8cb6e57b3a3612064d7b18b117912b4ce70955c2504d4b741c9e244b132" +checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" dependencies = [ "autocfg", "cc", @@ -1269,45 +1295,95 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +checksum = "69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e" dependencies = [ - "async-trait", - "crossbeam-channel", - "dashmap", - "fnv", - "futures-channel", - "futures-executor", - "futures-util", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand", - "thiserror", - "tokio", - "tokio-stream", + "opentelemetry_api", + "opentelemetry_sdk", ] [[package]] name = "opentelemetry-otlp" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1a6ca9de4c8b00aa7f1a153bd76cb263287155cec642680d79d98706f3d28a" +checksum = "d1c928609d087790fc936a1067bdc310ae702bdf3b090c3f281b713622c8bbde" dependencies = [ "async-trait", "futures", "futures-util", "http", "opentelemetry", + "opentelemetry-proto", "prost", "thiserror", "tokio", "tonic", +] + +[[package]] +name = "opentelemetry-prometheus" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c3d833835a53cf91331d2cfb27e9121f5a95261f31f08a1f79ab31688b8da8" +dependencies = [ + "opentelemetry", + "prometheus", + "protobuf", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61a2f56df5574508dd86aaca016c917489e589ece4141df1b5e349af8d66c28" +dependencies = [ + "futures", + "futures-util", + "opentelemetry", + "prost", + "tonic", "tonic-build", ] +[[package]] +name = "opentelemetry_api" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22" +dependencies = [ + "fnv", + "futures-channel", + "futures-util", + "indexmap", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113" +dependencies = [ + "async-trait", + "crossbeam-channel", + "dashmap", + "fnv", + "futures-channel", + "futures-executor", + "futures-util", + "once_cell", + "opentelemetry_api", + "percent-encoding", + "rand", + "thiserror", + "tokio", + "tokio-stream", +] + [[package]] name = "output_vt100" version = "0.1.3" @@ -1331,7 +1407,7 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core 0.8.5", + "parking_lot_core 0.8.6", ] [[package]] @@ -1341,14 +1417,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.4", + "parking_lot_core 0.9.7", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if", "instant", @@ -1360,22 +1436,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.4" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] name = "paste" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" +checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" [[package]] name = "percent-encoding" @@ -1385,9 +1461,9 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "petgraph" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset", "indexmap", @@ -1449,6 +1525,16 @@ dependencies = [ "yansi", ] +[[package]] +name = "prettyplease" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -1475,18 +1561,33 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] +[[package]] +name = "prometheus" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot 0.12.1", + "protobuf", + "thiserror", +] + [[package]] name = "prost" -version = "0.9.0" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +checksum = "21dc42e00223fc37204bd4aa177e69420c604ca4a183209a8f9de30c6d934698" dependencies = [ "bytes", "prost-derive", @@ -1494,29 +1595,31 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.9.0" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" +checksum = "a3f8ad728fb08fe212df3c05169e940fbb6d9d16a877ddde14644a983ba2012e" dependencies = [ "bytes", - "heck 0.3.3", + "heck", "itertools", "lazy_static", "log", "multimap", "petgraph", + "prettyplease", "prost", "prost-types", "regex", + "syn", "tempfile", "which", ] [[package]] name = "prost-derive" -version = "0.9.0" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +checksum = "8bda8c0881ea9f722eb9629376db3d0b903b462477c1aafcb0566610ac28ac5d" dependencies = [ "anyhow", "itertools", @@ -1527,19 +1630,25 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.9.0" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +checksum = "a5e0526209433e96d83d750dd81a99118edbc55739e7e61a46764fd2ad537788" dependencies = [ "bytes", "prost", ] +[[package]] +name = "protobuf" +version = "2.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" + [[package]] name = "quote" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" dependencies = [ "proc-macro2", ] @@ -1596,12 +1705,19 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "aho-corasick", - "memchr", "regex-syntax", ] @@ -1622,11 +1738,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" +checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" dependencies = [ - "base64", + "base64 0.21.0", "bytes", "encoding_rs", "futures-core", @@ -1662,6 +1778,7 @@ name = "rust-http-starter" version = "0.1.0" dependencies = [ "async-trait", + "atty", "axum", "build-info", "build-info-build", @@ -1671,8 +1788,11 @@ dependencies = [ "log", "opentelemetry", "opentelemetry-otlp", + "opentelemetry-prometheus", + "prometheus", "reqwest", "serde", + "serde_json", "sqlx", "test-context", "thiserror", @@ -1680,6 +1800,7 @@ dependencies = [ "tower", "tower-http", "tracing", + "tracing-appender", "tracing-opentelemetry", "tracing-subscriber", ] @@ -1695,24 +1816,23 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" +checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "lazy_static", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] @@ -1723,15 +1843,15 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "scratch" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" +checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" [[package]] name = "security-framework" -version = "2.7.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ "bitflags", "core-foundation", @@ -1742,9 +1862,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" dependencies = [ "core-foundation-sys", "libc", @@ -1752,27 +1872,27 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" +checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.147" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.147" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", @@ -1781,9 +1901,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" +checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a" dependencies = [ "itoa", "ryu", @@ -1792,9 +1912,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184c643044780f7ceb59104cef98a5a6f12cb2288a7bc701ab93a362b49fd47d" +checksum = "26b04f22b563c91331a10074bda3dd5492e3cc39d56bd557e91c0af42b6c7341" dependencies = [ "serde", ] @@ -1878,9 +1998,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87e292b4291f154971a43c3774364e2cbcaec599d3f5bf6fa9d122885dbc38a" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" dependencies = [ "itertools", "nom", @@ -1905,7 +2025,7 @@ checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" dependencies = [ "ahash", "atoi", - "base64", + "base64 0.13.1", "bitflags", "byteorder", "bytes", @@ -1956,7 +2076,7 @@ checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" dependencies = [ "dotenvy", "either", - "heck 0.4.0", + "heck", "once_cell", "proc-macro2", "quote", @@ -1998,9 +2118,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.103" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ "proc-macro2", "quote", @@ -2009,9 +2129,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "tempfile" @@ -2029,9 +2149,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -2059,18 +2179,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", @@ -2086,6 +2206,33 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2097,15 +2244,15 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.22.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76ce4a75fb488c605c54bf610f221cea8b0dafb53333c1a67e8ee199dcd2ae3" +checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" dependencies = [ "autocfg", "bytes", @@ -2118,7 +2265,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "winapi", + "windows-sys 0.42.0", ] [[package]] @@ -2133,9 +2280,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", @@ -2144,9 +2291,9 @@ dependencies = [ [[package]] name = "tokio-native-tls" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", @@ -2163,20 +2310,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.4" @@ -2193,13 +2326,14 @@ dependencies = [ [[package]] name = "tonic" -version = "0.6.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" dependencies = [ "async-stream", "async-trait", - "base64", + "axum", + "base64 0.13.1", "bytes", "futures-core", "futures-util", @@ -2214,7 +2348,7 @@ dependencies = [ "prost-derive", "tokio", "tokio-stream", - "tokio-util 0.6.10", + "tokio-util", "tower", "tower-layer", "tower-service", @@ -2224,10 +2358,11 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.6.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" +checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" dependencies = [ + "prettyplease", "proc-macro2", "prost-build", "quote", @@ -2248,7 +2383,7 @@ dependencies = [ "rand", "slab", "tokio", - "tokio-util 0.7.4", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -2256,9 +2391,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" dependencies = [ "bitflags", "bytes", @@ -2299,6 +2434,17 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" +dependencies = [ + "crossbeam-channel", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.23" @@ -2343,9 +2489,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.17.4" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +checksum = "21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de" dependencies = [ "once_cell", "opentelemetry", @@ -2361,37 +2507,42 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "parking_lot 0.12.1", + "regex", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", ] [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-normalization" @@ -2404,9 +2555,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -2467,9 +2618,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2477,9 +2628,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", @@ -2492,9 +2643,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if", "js-sys", @@ -2504,9 +2655,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2514,9 +2665,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -2527,15 +2678,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", @@ -2543,9 +2694,9 @@ dependencies = [ [[package]] name = "which" -version = "4.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", "libc", @@ -2554,11 +2705,10 @@ dependencies = [ [[package]] name = "whoami" -version = "1.2.3" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6631b6a2fd59b1841b622e8f1a7ad241ef0a46f2d580464ce8140ac94cbd571" +checksum = "45dbc71f0cdca27dc261a9bd37ddec174e4a0af2b900b890f378460f745426e3" dependencies = [ - "bumpalo", "wasm-bindgen", "web-sys", ] @@ -2594,19 +2744,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", -] - [[package]] name = "windows-sys" version = "0.42.0" @@ -2614,85 +2751,79 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", + "windows_x86_64_msvc", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.0" +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" +name = "windows-targets" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.42.0" +name = "windows_aarch64_gnullvm" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] -name = "windows_i686_gnu" -version = "0.36.1" +name = "windows_aarch64_msvc" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "winreg" diff --git a/Cargo.toml b/Cargo.toml index 5382cb8..257692d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,18 +24,25 @@ serde = { version = "1.0", features = ["derive"] } dotenv = "0.15" envy = "0.4" -# Telemetry -opentelemetry = { version = "0.17", features = ["trace", "metrics", "rt-tokio"] } -opentelemetry-otlp = { version = "0.10", features = ["metrics", "trace"] } +# Metrics & Traces +prometheus-core = { package = "prometheus", version = "0.13" } +opentelemetry = { version = "0.18", features = ["metrics", "rt-tokio"] } +opentelemetry-prometheus = "0.11" +opentelemetry-otlp = "0.11" + +# Logging tracing = "0.1" -tracing-subscriber = "0.3" -tracing-opentelemetry = "0.17" +tracing-subscriber = { version = "0.3", features = ["env-filter", "parking_lot"] } +tracing-appender = "0.2" +tracing-opentelemetry = "0.18" +atty = "0.2" # Misc build-info = "0.0" log = "0.4" thiserror = "1.0" async-trait = "0.1" +serde_json = "1.0.92" [dev-dependencies] test-context = "0.1" diff --git a/Dockerfile b/Dockerfile index 9ad000a..09384e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,6 +43,12 @@ FROM chef AS build ARG release ENV RELEASE=${release:+--release} +# This is a build requirement of `opentelemetry-otlp`. Once the new version +# is rolled out, which no longer requires the `protoc`, we'll be able to +# get rid of this. +RUN apt-get update \ + && apt-get install -y --no-install-recommends protobuf-compiler + WORKDIR /app # Cache dependancies COPY --from=plan /app/recipe.json recipe.json diff --git a/docker-compose.yml b/docker-compose.yml index 05f7b02..97523a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -47,10 +47,14 @@ services: - "3000:3000" environment: - PORT=3000 - - LOG_LEVEL=INFO + - LOG_LEVEL=info,rust_http_starter=trace + - LOG_LEVEL_OTEL=info,rust_http_starter=trace + - OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4317 + - TELEMETRY_PROMETHEUS_PORT=3002 + - OTEL_SERVICE_NAME=rust-http-starter + - OTEL_RESOURCE_ATTRIBUTES=environment=dev,region=local,version=0.11.5 + - OTEL_TRACES_SAMPLER=always_on - DATABASE_URL=postgres://postgres:root@postgres:5432/postgres - - TELEMETRY_ENABLED=true - - TELEMETRY_GRPC_URL=http://jaeger:4317 - ATTESTATION_CACHE_URL=redis://redis:6379/0 volumes: - ./:/rust-http-starter/ diff --git a/src/config.rs b/src/config.rs index a28be4c..b5d6965 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,8 +12,8 @@ pub struct Configuration { pub is_test: bool, // TELEMETRY - pub telemetry_enabled: Option, - pub telemetry_grpc_url: Option, + pub otel_exporter_otlp_endpoint: Option, + pub telemetry_prometheus_port: Option, } impl Configuration { diff --git a/src/error.rs b/src/error.rs index 1896aba..8f64269 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,12 @@ +use { + crate::handlers::ResponseError, + axum::response::{IntoResponse, Response}, + hyper::StatusCode, + tracing::error, +}; + +pub type Result = std::result::Result; + #[derive(Debug, thiserror::Error)] pub enum Error { #[error(transparent)] @@ -9,6 +18,9 @@ pub enum Error { #[error(transparent)] Metrics(#[from] opentelemetry::metrics::MetricsError), + #[error(transparent)] + Prometheus(#[from] prometheus_core::Error), + #[error(transparent)] Database(#[from] sqlx::Error), @@ -18,3 +30,27 @@ pub enum Error { #[error(transparent)] Store(#[from] crate::stores::StoreError), } + +impl IntoResponse for Error { + fn into_response(self) -> Response { + error!("responding with error ({:?})", self); + match self { + Error::Database(e) => crate::handlers::Response::new_failure(StatusCode::INTERNAL_SERVER_ERROR, vec![ + ResponseError { + name: "sqlx".to_string(), + message: e.to_string(), + } + ], vec![]), + e => crate::handlers::Response::new_failure(StatusCode::INTERNAL_SERVER_ERROR, vec![ + ResponseError { + name: "unknown_error".to_string(), + message: "This error should not have occurred. Please file an issue at: https://github.com/walletconnect/rust-http-starter".to_string(), + }, + ResponseError { + name: "dbg".to_string(), + message: format!("{e:?}"), + } + ], vec![]) + }.into_response() + } +} diff --git a/src/handlers/metrics.rs b/src/handlers/metrics.rs new file mode 100644 index 0000000..966d47e --- /dev/null +++ b/src/handlers/metrics.rs @@ -0,0 +1,15 @@ +use { + crate::{error::Result, state::AppState}, + axum::{extract::State, http::StatusCode}, + std::sync::Arc, +}; + +pub async fn handler(State(state): State>) -> Result<(StatusCode, String)> { + if let Some(metrics) = &state.metrics { + let exported = metrics.export()?; + Ok((StatusCode::OK, exported)) + } else { + // No Metrics! + Ok((StatusCode::BAD_REQUEST, "Metrics not enabled.".to_string())) + } +} diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 43a7c76..5489149 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -1 +1,92 @@ pub mod health; +pub mod metrics; + +use { + axum::{response::IntoResponse, Json}, + hyper::StatusCode, + serde_json::{json, Value}, +}; + +#[derive(serde::Serialize)] +#[serde(rename_all = "lowercase")] +pub enum ErrorLocation { + Body, + // Note (Harry): Spec supports this but it currently isn't used + // Query, + Header, + Path, +} + +#[derive(serde::Serialize)] +#[serde(rename_all = "UPPERCASE")] +pub enum ResponseStatus { + Success, + Failure, +} + +#[derive(serde::Serialize)] +pub struct ErrorField { + pub field: String, + pub description: String, + pub location: ErrorLocation, +} + +#[derive(serde::Serialize)] +pub struct ResponseError { + pub name: String, + pub message: String, +} + +#[derive(serde::Serialize)] +pub struct Response { + pub status: ResponseStatus, + #[serde(skip_serializing)] + pub status_code: StatusCode, + pub errors: Option>, + pub fields: Option>, +} + +impl Response { + pub fn new_success(status: StatusCode) -> Self { + Response { + status: ResponseStatus::Success, + status_code: status, + errors: None, + fields: None, + } + } + + pub fn new_failure( + status: StatusCode, + errors: Vec, + fields: Vec, + ) -> Self { + Response { + status: ResponseStatus::Failure, + status_code: status, + errors: Some(errors), + fields: Some(fields), + } + } +} + +impl IntoResponse for Response { + fn into_response(self) -> axum::response::Response { + let status = self.status_code; + let json: Json = self.into(); + + (status, json).into_response() + } +} + +impl From for Json { + fn from(value: Response) -> Self { + Json(json!(value)) + } +} + +impl Default for Response { + fn default() -> Self { + Response::new_success(StatusCode::OK) + } +} diff --git a/src/lib.rs b/src/lib.rs index bcdbf7c..8fe006a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,26 +1,19 @@ pub mod config; pub mod error; mod handlers; +pub mod log; +mod metrics; mod state; mod stores; use { - crate::{ - config::Configuration, - state::{AppState, Metrics}, - }, + crate::{config::Configuration, state::AppState}, axum::{routing::get, Router}, - log::LevelFilter, opentelemetry::{ - sdk::{ - metrics::selectors, - trace::{self, IdGenerator, Sampler}, - Resource, - }, - util::tokio_interval_stream, + sdk::Resource, + // util::tokio_interval_stream, KeyValue, }, - opentelemetry_otlp::{Protocol, WithExportConfig}, sqlx::{ postgres::{PgConnectOptions, PgPoolOptions}, ConnectOptions, @@ -28,8 +21,10 @@ use { std::{net::SocketAddr, str::FromStr, sync::Arc, time::Duration}, tokio::{select, sync::broadcast}, tower::ServiceBuilder, + tower_http::trace::{DefaultMakeSpan, DefaultOnRequest, DefaultOnResponse, TraceLayer}, tracing::info, - tracing_subscriber::fmt::format::FmtSpan, + tracing::log::LevelFilter, + tracing::Level, }; build_info::build_info!(fn build_info); @@ -49,90 +44,51 @@ pub async fn bootstap(mut shutdown: broadcast::Receiver<()>, config: Configurati sqlx::migrate!("./migrations").run(&store).await?; - let mut state = AppState::new(config, Arc::new(store.clone()))?; - - // Telemetry - if state.config.telemetry_enabled.unwrap_or(false) { - let grpc_url = state - .config - .telemetry_grpc_url - .clone() - .unwrap_or_else(|| "http://localhost:4317".to_string()); - - let tracing_exporter = opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(grpc_url.clone()) - .with_timeout(Duration::from_secs(5)) - .with_protocol(Protocol::Grpc); - - let tracer = opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter(tracing_exporter) - .with_trace_config( - trace::config() - .with_sampler(Sampler::AlwaysOn) - .with_id_generator(IdGenerator::default()) - .with_max_events_per_span(64) - .with_max_attributes_per_span(16) - .with_max_events_per_span(16) - .with_resource(Resource::new(vec![ - KeyValue::new("service.name", state.build_info.crate_info.name.clone()), - KeyValue::new( - "service.version", - state.build_info.crate_info.version.clone().to_string(), - ), - ])), - ) - .install_batch(opentelemetry::runtime::Tokio)?; - - let metrics_exporter = opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(grpc_url) - .with_timeout(Duration::from_secs(5)) - .with_protocol(Protocol::Grpc); - - let meter_provider = opentelemetry_otlp::new_pipeline() - .metrics(tokio::spawn, tokio_interval_stream) - .with_exporter(metrics_exporter) - .with_period(Duration::from_secs(3)) - .with_timeout(Duration::from_secs(10)) - .with_aggregator_selector(selectors::simple::Selector::Exact) - .build()?; - - opentelemetry::global::set_meter_provider(meter_provider.provider()); - - let meter = opentelemetry::global::meter("rust-http-starter"); - let example_counter = meter - .i64_up_down_counter("example") - .with_description("This is an example counter") - .init(); - - state.set_telemetry(tracer, Metrics { - example: example_counter, - }) - } else if !state.config.is_test { - // Only log to console if telemetry disabled - tracing_subscriber::fmt() - .with_max_level(state.config.log_level()) - .with_span_events(FmtSpan::CLOSE) - .init(); + let mut state = AppState::new(config.clone(), Arc::new(store.clone()))?; + + if state.config.telemetry_prometheus_port.is_some() { + state.set_metrics(metrics::Metrics::new(Resource::new(vec![ + KeyValue::new("service_name", "rust-http-starter"), + KeyValue::new( + "service_version", + state.build_info.crate_info.version.clone().to_string(), + ), + ]))?); } let port = state.config.port; let state_arc = Arc::new(state); - let global_middleware = ServiceBuilder::new(); + let global_middleware = ServiceBuilder::new().layer( + TraceLayer::new_for_http() + .make_span_with(DefaultMakeSpan::new().include_headers(true)) + .on_request(DefaultOnRequest::new().level(Level::INFO)) + .on_response( + DefaultOnResponse::new() + .level(Level::INFO) + .include_headers(true), + ), + ); let app = Router::new() .route("/health", get(handlers::health::handler)) .layer(global_middleware) + .with_state(state_arc.clone()); + + let private_app = Router::new() + .route("/metrics", get(handlers::metrics::handler)) .with_state(state_arc); let addr = SocketAddr::from(([0, 0, 0, 0], port)); + let private_addr = SocketAddr::from(( + [0, 0, 0, 0], + config.telemetry_prometheus_port.unwrap_or(3001), + )); select! { _ = axum::Server::bind(&addr).serve(app.into_make_service()) => info!("Server terminating"), + _ = axum::Server::bind(&private_addr).serve(private_app.into_make_service()) => info!("Internal Server terminating"), _ = shutdown.recv() => info!("Shutdown signal received, killing servers"), } diff --git a/src/log.rs b/src/log.rs new file mode 100644 index 0000000..aa3761d --- /dev/null +++ b/src/log.rs @@ -0,0 +1,100 @@ +//! This library serves as a thin, opinionated wrapper over the underlying +//! logger apparatus. By default, this crate only exports the various macros, +//! traits and types used in library logging. +//! +//! However, the top level binary may enable the "logger" feature to gain access +//! to the machinery for initializing the global logger. +//! +//! There also some other utility functions that may be accessed by their +//! feature gate. See the [features] section of Cargo.toml for more. +pub use tracing::{debug, error, info, trace, warn}; +use { + opentelemetry::sdk::trace, + opentelemetry_otlp::WithExportConfig, + tracing_appender::non_blocking::WorkerGuard, + tracing_subscriber::{prelude::*, EnvFilter}, +}; + +pub mod prelude { + //! Reexport of the most common macros and traits used for logging. + //! + //! Typically you may simply add `use log::prelude::*` and get access to all + //! of the usual macros (info!, error!, debug!, etc). + + pub use tracing::{debug, error, info, trace, warn}; +} + +/// The default log level for the stderr logger, which is used as a fallback if +/// no other can be found. +const DEFAULT_LOG_LEVEL_STDERR: tracing::Level = tracing::Level::WARN; + +/// The default log level for the telemetry logger, which is used as a fallback +/// if no other can be found. +const DEFAULT_LOG_LEVEL_OTEL: tracing::Level = tracing::Level::WARN; + +/// The environment variable used to control the stderr logger. +const ENV_LOG_LEVEL_STDERR: &str = "LOG_LEVEL"; + +/// The environment variable used to control the telemetry logger. +const ENV_LOG_LEVEL_OTEL: &str = "LOG_LEVEL_OTEL"; + +/// The endpoint for the OpenTelemetry gRPC collector, e.g. "localhost:4317". +const OTEL_EXPORTER_OTLP_ENDPOINT: &str = "OTEL_EXPORTER_OTLP_ENDPOINT"; + +pub struct Logger { + _guard: WorkerGuard, +} + +impl Logger { + pub fn init() -> crate::error::Result { + let stderr_filter = EnvFilter::try_from_env(ENV_LOG_LEVEL_STDERR) + .unwrap_or_else(|_| EnvFilter::new(DEFAULT_LOG_LEVEL_STDERR.to_string())); + + let (writer, guard) = tracing_appender::non_blocking(std::io::stderr()); + + let logger = tracing_subscriber::fmt::layer() + .with_target(false) + .with_ansi(atty::is(atty::Stream::Stderr)) + .with_writer(writer) + .with_filter(stderr_filter) + .boxed(); + + let subscriber = tracing_subscriber::registry().with(logger); + + if std::env::var(OTEL_EXPORTER_OTLP_ENDPOINT).is_ok() { + let telemetry = { + let tracer = opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter(opentelemetry_otlp::new_exporter().tonic().with_env()) + .with_trace_config( + trace::config().with_id_generator(trace::XrayIdGenerator::default()), + ) + .install_batch(opentelemetry::runtime::Tokio)?; + + tracing_opentelemetry::layer() + .with_tracer(tracer) + .with_filter( + EnvFilter::try_from_env(ENV_LOG_LEVEL_OTEL) + .unwrap_or_else(|_| EnvFilter::new(DEFAULT_LOG_LEVEL_OTEL.to_string())), + ) + .boxed() + }; + + subscriber.with(telemetry).init(); + } else { + subscriber.init(); + }; + + Ok(Self { _guard: guard }) + } + + pub fn stop(self) { + // Consume self to trigger drop. + } +} + +impl Drop for Logger { + fn drop(&mut self) { + opentelemetry::global::shutdown_tracer_provider(); + } +} diff --git a/src/main.rs b/src/main.rs index 238831c..e967db1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,20 @@ use { dotenv::dotenv, - rust_http_starter::{config::Configuration, Result}, + rust_http_starter::{config::Configuration, log, Result}, tokio::sync::broadcast, }; #[tokio::main] async fn main() -> Result<()> { + let logger = log::Logger::init().expect("Failed to start logging"); + let (_signal, shutdown) = broadcast::channel(1); dotenv().ok(); let config = Configuration::new().expect("Failed to load config!"); - rust_http_starter::bootstap(shutdown, config).await + let result = rust_http_starter::bootstap(shutdown, config).await; + + logger.stop(); + + result } diff --git a/src/metrics.rs b/src/metrics.rs new file mode 100644 index 0000000..61fc2e3 --- /dev/null +++ b/src/metrics.rs @@ -0,0 +1,73 @@ +use { + crate::error::{Error, Result}, + opentelemetry::{ + metrics::{Counter, UpDownCounter}, + sdk::{ + self, + export::metrics::aggregation, + metrics::{processors, selectors}, + Resource, + }, + }, + opentelemetry_prometheus::PrometheusExporter, + prometheus_core::TextEncoder, +}; + +#[derive(Clone)] +pub struct Metrics { + pub prometheus_exporter: PrometheusExporter, + pub registered_clients: UpDownCounter, + pub received_notifications: Counter, + pub sent_notifications: Counter, +} + +impl Metrics { + pub fn new(resource: Resource) -> Result { + let controller = sdk::metrics::controllers::basic( + processors::factory( + selectors::simple::histogram(vec![]), + aggregation::cumulative_temporality_selector(), + ) + .with_memory(true), + ) + .with_resource(resource) + .build(); + + let prometheus_exporter = opentelemetry_prometheus::exporter(controller).init(); + + let meter = prometheus_exporter.meter_provider().unwrap(); + + opentelemetry::global::set_meter_provider(meter); + + let meter = opentelemetry::global::meter("echo-server"); + + let clients_counter = meter + .i64_up_down_counter("registered_clients") + .with_description("The number of currently registered clients") + .init(); + + let received_notification_counter = meter + .u64_counter("received_notifications") + .with_description("The number of notification received") + .init(); + + let sent_notification_counter = meter + .u64_counter("received_notifications") + .with_description("The number of notification received") + .init(); + + Ok(Metrics { + prometheus_exporter, + registered_clients: clients_counter, + received_notifications: received_notification_counter, + sent_notifications: sent_notification_counter, + }) + } + + pub fn export(&self) -> Result { + let data = self.prometheus_exporter.registry().gather(); + TextEncoder::new() + .encode_to_string(&data) + .map_err(Error::Prometheus) + } +} diff --git a/src/state.rs b/src/state.rs index 6d2add7..6407119 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,15 +1,8 @@ use { - crate::{stores::example::ExampleStoreArc, Configuration}, + crate::{metrics::Metrics, stores::example::ExampleStoreArc, Configuration}, build_info::BuildInfo, - opentelemetry::{metrics::UpDownCounter, sdk::trace::Tracer}, - tracing_subscriber::prelude::*, }; -#[derive(Clone)] -pub struct Metrics { - pub example: UpDownCounter, -} - #[derive(Clone)] pub struct AppState { pub config: Configuration, @@ -32,13 +25,7 @@ impl AppState { }) } - pub fn set_telemetry(&mut self, tracer: Tracer, metrics: Metrics) { - let otel_tracing_layer = tracing_opentelemetry::layer().with_tracer(tracer); - - tracing_subscriber::registry() - .with(otel_tracing_layer) - .init(); - + pub fn set_metrics(&mut self, metrics: Metrics) { self.metrics = Some(metrics); } } diff --git a/terraform/ecs/main.tf b/terraform/ecs/main.tf index 6ef08a1..aed62b4 100644 --- a/terraform/ecs/main.tf +++ b/terraform/ecs/main.tf @@ -1,6 +1,11 @@ locals { file_descriptor_soft_limit = pow(2, 18) file_descriptor_hard_limit = local.file_descriptor_soft_limit * 2 + + prometheus_port = "8081" + + otel_collector_image_tag = "v0.2.0" + otel_collector_image = "${var.aws_otel_collector_ecr_repository_url}:${local.otel_collector_image_tag}" } # Log Group for our App @@ -60,11 +65,15 @@ resource "aws_ecs_task_definition" "app_task_definition" { ], environment = [ { name = "PORT", value = "8080" }, - { name = "LOG_LEVEL", value = "INFO" }, + { name = "LOG_LEVEL", value = "INFO,rust_http_starter=TRACE" }, + { name = "LOG_LEVEL_OTEL", value = "INFO,rust_http_starter=TRACE" }, + { name = "TELEMETRY_PROMETHEUS_PORT", value = local.prometheus_port }, + { name = "OTEL_SERVICE_NAME", value = var.app_name }, + { name = "OTEL_RESOURCE_ATTRIBUTES", value = "environment=${var.environment},region=${var.region},version=${var.image_version}" }, + { name = "OTEL_EXPORTER_OTLP_ENDPOINT", value = "http://localhost:4317" }, + { name = "OTEL_TRACES_SAMPLER", value = "traceidratio" }, + { name = "OTEL_TRACES_SAMPLER_ARG", value = tostring(var.telemetry_sample_ratio) }, { name = "DATABASE_URL", value = var.database_url }, - { name = "TELEMETRY_ENABLED", value = "true" }, - { name = "TELEMETRY_GRPC_URL", value = "http://localhost:4317" }, - { name = "TELEMETRY_PROMETHEUS_PORT", value = "8081" } ], dependsOn = [ { containerName = "aws-otel-collector", condition = "START" } @@ -80,17 +89,17 @@ resource "aws_ecs_task_definition" "app_task_definition" { }, { name = "aws-otel-collector", - image = "public.ecr.aws/aws-observability/aws-otel-collector:latest", + image = local.otel_collector_image, cpu = 128, memory = 128, environment = [ - { "name" : "AWS_PROMETHEUS_SCRAPING_ENDPOINT", "value" : "0.0.0.0:8081" }, + { name = "AWS_PROMETHEUS_SCRAPING_ENDPOINT", value = "0.0.0.0:${local.prometheus_port}" }, { name = "AWS_PROMETHEUS_ENDPOINT", value = "${var.prometheus_endpoint}api/v1/remote_write" }, - { name = "AWS_REGION", value = "eu-central-1" } + { name = "AWS_REGION", value = var.region }, ], essential = true, command = [ - "--config=/etc/ecs/ecs-amp-xray-prometheus.yaml" + "--config=/walletconnect/relay.yaml" ], logConfiguration = { logDriver = "awslogs", diff --git a/terraform/ecs/variables.tf b/terraform/ecs/variables.tf index 50d500c..6996550 100644 --- a/terraform/ecs/variables.tf +++ b/terraform/ecs/variables.tf @@ -6,10 +6,22 @@ variable "app_name" { type = string } +variable "environment" { + type = string +} + variable "image" { type = string } +variable "image_version" { + type = string +} + +variable "aws_otel_collector_ecr_repository_url" { + type = string +} + variable "database_url" { type = string sensitive = true @@ -54,3 +66,7 @@ variable "cpu" { variable "memory" { type = number } + +variable "telemetry_sample_ratio" { + type = number +} diff --git a/terraform/main.tf b/terraform/main.tf index 7daefe7..ba666ea 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -101,21 +101,28 @@ data "aws_ecr_repository" "repository" { name = "http-starter" } +data "aws_ecr_repository" "aws_otel_collector" { + name = "aws-otel-collector" +} + module "ecs" { source = "./ecs" - app_name = "${terraform.workspace}-${local.app_name}" - prometheus_endpoint = aws_prometheus_workspace.prometheus.prometheus_endpoint - database_url = "postgres://${module.database_cluster.cluster_master_username}:${module.database_cluster.cluster_master_password}@${module.database_cluster.cluster_endpoint}:${module.database_cluster.cluster_port}/postgres" - image = "${data.aws_ecr_repository.repository.repository_url}:${local.version}" - acm_certificate_arn = module.dns.certificate_arn - cpu = 512 - fqdn = local.fqdn - memory = 1024 - private_subnets = module.vpc.private_subnets - public_subnets = module.vpc.public_subnets - region = var.region - route53_zone_id = module.dns.zone_id - vpc_cidr = module.vpc.vpc_cidr_block - vpc_id = module.vpc.vpc_id + app_name = "${terraform.workspace}-${local.app_name}" + prometheus_endpoint = aws_prometheus_workspace.prometheus.prometheus_endpoint + telemetry_sample_ratio = terraform.workspace == "prod" ? 0.25 : 1.0 + database_url = "postgres://${module.database_cluster.cluster_master_username}:${module.database_cluster.cluster_master_password}@${module.database_cluster.cluster_endpoint}:${module.database_cluster.cluster_port}/postgres" + image = "${data.aws_ecr_repository.repository.repository_url}:${local.version}" + image_version = local.version + aws_otel_collector_ecr_repository_url = data.aws_ecr_repository.aws_otel_collector.repository_url + acm_certificate_arn = module.dns.certificate_arn + cpu = 512 + fqdn = local.fqdn + memory = 1024 + private_subnets = module.vpc.private_subnets + public_subnets = module.vpc.public_subnets + region = var.region + route53_zone_id = module.dns.zone_id + vpc_cidr = module.vpc.vpc_cidr_block + vpc_id = module.vpc.vpc_id } diff --git a/tests/context/server.rs b/tests/context/server.rs index a7e0e9b..8c2c2ae 100644 --- a/tests/context/server.rs +++ b/tests/context/server.rs @@ -31,8 +31,8 @@ impl RustHttpStarter { port: public_port, log_level: "INFO".into(), database_url: "postgres://postgres@localhost:5432/postgres".into(), - telemetry_enabled: None, - telemetry_grpc_url: None, + otel_exporter_otlp_endpoint: None, + telemetry_prometheus_port: Some(get_random_port()), is_test: true, }; From 6e59d9bdc62ac2a81fbcba9d9301d1ef2c15a1b1 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Wed, 8 Feb 2023 10:49:35 -0500 Subject: [PATCH 2/2] fix: meter name --- src/metrics.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metrics.rs b/src/metrics.rs index 61fc2e3..3022d9d 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -39,7 +39,7 @@ impl Metrics { opentelemetry::global::set_meter_provider(meter); - let meter = opentelemetry::global::meter("echo-server"); + let meter = opentelemetry::global::meter("rust-http-starter"); let clients_counter = meter .i64_up_down_counter("registered_clients")