diff --git a/Cargo.lock b/Cargo.lock index e9b3879..cfa3970 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,14 +136,37 @@ dependencies = [ ] [[package]] -name = "async-trait" -version = "0.1.79" +name = "async-broadcast" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -153,14 +176,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "backoff" -version = "0.4.0" +name = "backon" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +checksum = "302eaff5357a264a2c42f127ecb8bac761cf99749fc3dc95677e2743991f99e7" dependencies = [ - "getrandom", - "instant", - "rand", + "fastrand", + "gloo-timers", + "tokio", ] [[package]] @@ -186,9 +209,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" @@ -198,9 +221,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "block-buffer" @@ -219,9 +242,9 @@ checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytes" -version = "1.6.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" @@ -256,6 +279,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -266,6 +298,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -281,6 +323,12 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "crypto-common" version = "0.1.6" @@ -312,7 +360,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -323,18 +371,27 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "derive_more" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.104", ] [[package]] @@ -353,12 +410,44 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "either" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "env_filter" version = "0.1.2" @@ -388,12 +477,45 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -411,7 +533,6 @@ checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", - "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -434,17 +555,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.30" @@ -459,7 +569,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -519,14 +629,57 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "hashbrown" version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64 0.22.1", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http", ] [[package]] @@ -544,6 +697,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "hostname" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" +dependencies = [ + "cfg-if", + "libc", + "windows-link", +] + [[package]] name = "http" version = "1.1.0" @@ -557,9 +721,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -567,9 +731,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", @@ -580,9 +744,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -592,9 +762,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.2.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -609,6 +779,26 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-http-proxy" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad4b0a1e37510028bc4ba81d0e38d239c39671b0f0ce9e02dfa93a8133f7c08" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http", + "hyper", + "hyper-rustls 0.27.7", + "hyper-util", + "pin-project-lite", + "rustls-native-certs 0.7.0", + "tokio", + "tokio-rustls 0.26.2", + "tower-service", +] + [[package]] name = "hyper-rustls" version = "0.26.0" @@ -616,15 +806,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", + "http", + "hyper", + "hyper-util", + "rustls 0.22.3", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ "http", "hyper", "hyper-util", "log", - "rustls", - "rustls-native-certs", + "rustls 0.23.29", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.2", "tower-service", ] @@ -643,20 +849,21 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] @@ -707,16 +914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", + "hashbrown 0.14.3", ] [[package]] @@ -748,49 +946,56 @@ dependencies = [ [[package]] name = "json-patch" -version = "1.2.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +checksum = "159294d661a039f7644cea7e4d844e6b25aaf71c1ffe9d73a96d768c24b0faf4" dependencies = [ + "jsonptr", "serde", "serde_json", - "thiserror", - "treediff", + "thiserror 1.0.58", ] [[package]] name = "jsonpath-rust" -version = "0.5.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0268078319393f8430e850ee9d4706aeced256d34cf104d216bb496777137162" +checksum = "0c00ae348f9f8fd2d09f82a98ca381c60df9e0820d8d79fce43e649b4dc3128b" dependencies = [ - "lazy_static", - "once_cell", "pest", "pest_derive", "regex", "serde_json", - "thiserror", + "thiserror 2.0.12", +] + +[[package]] +name = "jsonptr" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe" +dependencies = [ + "serde", + "serde_json", ] [[package]] name = "k8s-openapi" -version = "0.21.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550f99d93aa4c2b25de527bce492d772caf5e21d7ac9bd4b508ba781c8d91e30" +checksum = "aa60a41b57ae1a0a071af77dbcf89fc9819cfe66edaf2beeb204c34459dcf0b2" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "chrono", "serde", - "serde-value", "serde_json", ] [[package]] name = "kube" -version = "0.89.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92cd10d00ad38b2f72a5223cd8f2827968466a5d32ae89672d2b0df06488c499" +checksum = "778f98664beaf4c3c11372721e14310d1ae00f5e2d9aabcf8906c881aa4e9f51" dependencies = [ "k8s-openapi", "kube-client", @@ -801,11 +1006,11 @@ dependencies = [ [[package]] name = "kube-client" -version = "0.89.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b4ee4e409c9afb4e38a30802875acb108902387a41346bbc2fd8610df5f729" +checksum = "7cb276b85b6e94ded00ac8ea2c68fcf4697ea0553cb25fddc35d4a0ab718db8d" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "bytes", "chrono", "either", @@ -815,21 +1020,20 @@ dependencies = [ "http-body", "http-body-util", "hyper", - "hyper-rustls", + "hyper-http-proxy", + "hyper-rustls 0.27.7", "hyper-timeout", "hyper-util", "jsonpath-rust", "k8s-openapi", "kube-core", "pem", - "pin-project", - "rustls", - "rustls-pemfile 2.1.1", + "rustls 0.23.29", "secrecy", "serde", "serde_json", "serde_yaml", - "thiserror", + "thiserror 2.0.12", "tokio", "tokio-util", "tower", @@ -839,47 +1043,51 @@ dependencies = [ [[package]] name = "kube-core" -version = "0.89.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beab9186726ed0c2420ff8a37b02f26dc62b3c33330ac60d0cc7605e1a6f6678" +checksum = "e3c56ff45deb0031f2a476017eed60c06872251f271b8387ad8020b8fef60960" dependencies = [ "chrono", + "derive_more", "form_urlencoded", "http", "json-patch", "k8s-openapi", - "once_cell", "schemars", "serde", + "serde-value", "serde_json", - "thiserror", + "thiserror 2.0.12", ] [[package]] name = "kube-derive" -version = "0.89.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b62b967344f8b961583480e4173b7c55bd448c700c71b0b780abbfc2dcda31" +checksum = "079fc8c1c397538628309cfdee20696ebdcc26745f9fb17f89b78782205bd995" dependencies = [ "darling", "proc-macro2", "quote", + "serde", "serde_json", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] name = "kube-runtime" -version = "0.89.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f0c0463270c844ff08e8a674777289afdb4cc6063036bed5dc35107f135808" +checksum = "2f1326e946fadf6248febdf8a1c001809c3899ccf48cb9768cbc536b741040dc" dependencies = [ "ahash", - "async-trait", - "backoff", - "derivative", + "async-broadcast", + "async-stream", + "backon", + "educe", "futures", - "hashbrown", + "hashbrown 0.15.4", + "hostname", "json-patch", "k8s-openapi", "kube-client", @@ -887,24 +1095,17 @@ dependencies = [ "pin-project", "serde", "serde_json", - "smallvec", - "thiserror", + "thiserror 2.0.12", "tokio", "tokio-util", "tracing", ] -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" -version = "0.2.153" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "lock_api" @@ -1003,6 +1204,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1049,7 +1256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.58", "ucd-trie", ] @@ -1073,7 +1280,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -1104,7 +1311,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -1119,17 +1326,11 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -1149,36 +1350,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -1231,7 +1402,7 @@ dependencies = [ "http-body", "http-body-util", "hyper", - "hyper-rustls", + "hyper-rustls 0.26.0", "hyper-util", "ipnet", "js-sys", @@ -1240,15 +1411,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", + "rustls 0.22.3", "rustls-pemfile 1.0.4", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "tokio", - "tokio-rustls", + "tokio-rustls 0.25.0", "tower-service", "url", "wasm-bindgen", @@ -1288,7 +1459,22 @@ dependencies = [ "log", "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.102.2", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls" +version = "0.23.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -1303,7 +1489,19 @@ dependencies = [ "rustls-pemfile 2.1.1", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.9.2", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", ] [[package]] @@ -1327,9 +1525,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.4.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868e20fada228fefaf6b652e00cc73623d54f8171e7352c18bb281571f2d92da" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" @@ -1342,6 +1543,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "ryu" version = "1.0.17" @@ -1389,11 +1601,10 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "secrecy" -version = "0.8.0" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" dependencies = [ - "serde", "zeroize", ] @@ -1404,7 +1615,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -1412,9 +1636,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -1422,9 +1646,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -1441,13 +1665,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -1463,11 +1687,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -1497,6 +1722,17 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1534,9 +1770,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1573,9 +1809,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -1588,13 +1824,28 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + [[package]] name = "thiserror" version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.58", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -1605,7 +1856,18 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", ] [[package]] @@ -1660,7 +1922,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -1669,11 +1931,21 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls", + "rustls 0.22.3", "rustls-pki-types", "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls 0.23.29", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.10" @@ -1691,14 +1963,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 1.0.2", "tokio", "tokio-util", "tower-layer", @@ -1708,16 +1980,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.2" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "base64 0.21.7", - "bitflags 2.5.0", + "base64 0.22.1", + "bitflags 2.9.1", "bytes", "http", "http-body", - "http-body-util", "mime", "pin-project-lite", "tower-layer", @@ -1727,15 +1998,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -1757,7 +2028,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] @@ -1769,15 +2040,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "treediff" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" -dependencies = [ - "serde_json", -] - [[package]] name = "try-lock" version = "0.2.5" @@ -1894,7 +2156,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -1928,7 +2190,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1989,6 +2251,12 @@ dependencies = [ "windows-targets 0.52.4", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-sys" version = "0.48.0" @@ -2148,7 +2416,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.104", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 888725f..db81c7f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,8 +8,8 @@ edition = "2021" [dependencies] tokio = { version = "1", default-features = false, features = ["macros", "rt-multi-thread", "time"] } serde_json = "1.0" -kube = { version = "0.89", features = ["runtime", "derive"] } -k8s-openapi = { version = "0.21", features = ["latest"] } +kube = { version = "1.1.0", features = ["runtime", "derive"] } +k8s-openapi = { version = "0.25", features = ["earliest"] } http = "1.0" serde = "*" protobuf = "=2.24.1" diff --git a/charts/appsignal-kubernetes/templates/deployment.yaml b/charts/appsignal-kubernetes/templates/deployment.yaml index 811b11c..405e0e4 100644 --- a/charts/appsignal-kubernetes/templates/deployment.yaml +++ b/charts/appsignal-kubernetes/templates/deployment.yaml @@ -23,6 +23,8 @@ spec: secretKeyRef: name: appsignal key: api-key + - name: RUST_LOG + value: info --- apiVersion: v1 kind: ServiceAccount @@ -34,10 +36,8 @@ kind: ClusterRole metadata: name: appsignal-kubernetes-role rules: - - apiGroups: [""] - resources: - - nodes - - "nodes/proxy" + - apiGroups: ["*"] + resources: ["*"] verbs: - get - list diff --git a/deployment.yaml b/deployment.yaml index f5b77d2..405e0e4 100644 --- a/deployment.yaml +++ b/deployment.yaml @@ -36,11 +36,8 @@ kind: ClusterRole metadata: name: appsignal-kubernetes-role rules: - - apiGroups: [""] - resources: - - nodes - - "nodes/proxy" - - pods + - apiGroups: ["*"] + resources: ["*"] verbs: - get - list diff --git a/protocol/kubernetes.rs b/protocol/kubernetes.rs index 620311f..3ed4f10 100644 --- a/protocol/kubernetes.rs +++ b/protocol/kubernetes.rs @@ -69,6 +69,7 @@ pub struct KubernetesMetrics { pub phase: ::std::string::String, pub pod_restart_count: i32, pub pod_uptime_seconds: i64, + pub owner_references: ::protobuf::RepeatedField, // special fields pub unknown_fields: ::protobuf::UnknownFields, pub cached_size: ::protobuf::CachedSize, @@ -816,10 +817,40 @@ impl KubernetesMetrics { pub fn set_pod_uptime_seconds(&mut self, v: i64) { self.pod_uptime_seconds = v; } + + // repeated .protocol.kubernetes.OwnerReference owner_references = 44; + + + pub fn get_owner_references(&self) -> &[OwnerReference] { + &self.owner_references + } + pub fn clear_owner_references(&mut self) { + self.owner_references.clear(); + } + + // Param is passed by value, moved + pub fn set_owner_references(&mut self, v: ::protobuf::RepeatedField) { + self.owner_references = v; + } + + // Mutable pointer to the field. + pub fn mut_owner_references(&mut self) -> &mut ::protobuf::RepeatedField { + &mut self.owner_references + } + + // Take field + pub fn take_owner_references(&mut self) -> ::protobuf::RepeatedField { + ::std::mem::replace(&mut self.owner_references, ::protobuf::RepeatedField::new()) + } } impl ::protobuf::Message for KubernetesMetrics { fn is_initialized(&self) -> bool { + for v in &self.owner_references { + if !v.is_initialized() { + return false; + } + }; true } @@ -1096,6 +1127,9 @@ impl ::protobuf::Message for KubernetesMetrics { let tmp = is.read_int64()?; self.pod_uptime_seconds = tmp; }, + 44 => { + ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.owner_references)?; + }, _ => { ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; }, @@ -1235,6 +1269,10 @@ impl ::protobuf::Message for KubernetesMetrics { if self.pod_uptime_seconds != 0 { my_size += ::protobuf::rt::value_size(43, self.pod_uptime_seconds, ::protobuf::wire_format::WireTypeVarint); } + for value in &self.owner_references { + let len = value.compute_size(); + my_size += 2 + ::protobuf::rt::compute_raw_varint32_size(len) + len; + }; my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); self.cached_size.set(my_size); my_size @@ -1368,6 +1406,11 @@ impl ::protobuf::Message for KubernetesMetrics { if self.pod_uptime_seconds != 0 { os.write_int64(43, self.pod_uptime_seconds)?; } + for v in &self.owner_references { + os.write_tag(44, ::protobuf::wire_format::WireTypeLengthDelimited)?; + os.write_raw_varint32(v.get_cached_size())?; + v.write_to_with_cached_sizes(os)?; + }; os.write_unknown_fields(self.get_unknown_fields())?; ::std::result::Result::Ok(()) } @@ -1621,6 +1664,11 @@ impl ::protobuf::Message for KubernetesMetrics { |m: &KubernetesMetrics| { &m.pod_uptime_seconds }, |m: &mut KubernetesMetrics| { &mut m.pod_uptime_seconds }, )); + fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage>( + "owner_references", + |m: &KubernetesMetrics| { &m.owner_references }, + |m: &mut KubernetesMetrics| { &mut m.owner_references }, + )); ::protobuf::reflect::MessageDescriptor::new_pb_name::( "KubernetesMetrics", fields, @@ -1680,6 +1728,7 @@ impl ::protobuf::Clear for KubernetesMetrics { self.phase.clear(); self.pod_restart_count = 0; self.pod_uptime_seconds = 0; + self.owner_references.clear(); self.unknown_fields.clear(); } } @@ -1696,8 +1745,251 @@ impl ::protobuf::reflect::ProtobufValue for KubernetesMetrics { } } +#[derive(PartialEq,Clone,Default)] +pub struct OwnerReference { + // message fields + pub name: ::std::string::String, + pub kind: ::std::string::String, + pub namespace: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a OwnerReference { + fn default() -> &'a OwnerReference { + ::default_instance() + } +} + +impl OwnerReference { + pub fn new() -> OwnerReference { + ::std::default::Default::default() + } + + // string name = 1; + + + pub fn get_name(&self) -> &str { + &self.name + } + pub fn clear_name(&mut self) { + self.name.clear(); + } + + // Param is passed by value, moved + pub fn set_name(&mut self, v: ::std::string::String) { + self.name = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_name(&mut self) -> &mut ::std::string::String { + &mut self.name + } + + // Take field + pub fn take_name(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.name, ::std::string::String::new()) + } + + // string kind = 2; + + + pub fn get_kind(&self) -> &str { + &self.kind + } + pub fn clear_kind(&mut self) { + self.kind.clear(); + } + + // Param is passed by value, moved + pub fn set_kind(&mut self, v: ::std::string::String) { + self.kind = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_kind(&mut self) -> &mut ::std::string::String { + &mut self.kind + } + + // Take field + pub fn take_kind(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.kind, ::std::string::String::new()) + } + + // string namespace = 3; + + + pub fn get_namespace(&self) -> &str { + &self.namespace + } + pub fn clear_namespace(&mut self) { + self.namespace.clear(); + } + + // Param is passed by value, moved + pub fn set_namespace(&mut self, v: ::std::string::String) { + self.namespace = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_namespace(&mut self) -> &mut ::std::string::String { + &mut self.namespace + } + + // Take field + pub fn take_namespace(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.namespace, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for OwnerReference { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.kind)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.namespace)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.name.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.name); + } + if !self.kind.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.kind); + } + if !self.namespace.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.namespace); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.name.is_empty() { + os.write_string(1, &self.name)?; + } + if !self.kind.is_empty() { + os.write_string(2, &self.kind)?; + } + if !self.namespace.is_empty() { + os.write_string(3, &self.namespace)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> OwnerReference { + OwnerReference::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "name", + |m: &OwnerReference| { &m.name }, + |m: &mut OwnerReference| { &mut m.name }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "kind", + |m: &OwnerReference| { &m.kind }, + |m: &mut OwnerReference| { &mut m.kind }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "namespace", + |m: &OwnerReference| { &m.namespace }, + |m: &mut OwnerReference| { &mut m.namespace }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "OwnerReference", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static OwnerReference { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(OwnerReference::new) + } +} + +impl ::protobuf::Clear for OwnerReference { + fn clear(&mut self) { + self.name.clear(); + self.kind.clear(); + self.namespace.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for OwnerReference { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for OwnerReference { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + static file_descriptor_proto_data: &'static [u8] = b"\ - \n\x10kubernetes.proto\x12\x13protocol.kubernetes\"\xcd\x0f\n\x11Kuberne\ + \n\x10kubernetes.proto\x12\x13protocol.kubernetes\"\x9d\x10\n\x11Kuberne\ tesMetrics\x12\x17\n\x07site_id\x18\x20\x20\x01(\tR\x06siteId\x12\x1b\n\ \tnode_name\x18\x01\x20\x01(\tR\x08nodeName\x12\x19\n\x08pod_name\x18\ \x02\x20\x01(\tR\x07podName\x12#\n\rpod_namespace\x18!\x20\x01(\tR\x0cpo\ @@ -1739,123 +2031,139 @@ static file_descriptor_proto_data: &'static [u8] = b"\ tes\x12\x1d\n\nswap_usage\x18'\x20\x01(\x05R\tswapUsage\x12\x14\n\x05pha\ se\x18(\x20\x01(\tR\x05phase\x12*\n\x11pod_restart_count\x18*\x20\x01(\ \x05R\x0fpodRestartCount\x12,\n\x12pod_uptime_seconds\x18+\x20\x01(\x03R\ - \x10podUptimeSeconds\x1a9\n\x0bLabelsEntry\x12\x10\n\x03key\x18\x01\x20\ - \x01(\tR\x03key\x12\x14\n\x05value\x18\x02\x20\x01(\tR\x05value:\x028\ - \x01J\xf1\x12\n\x06\x12\x04\0\0/\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\ - \x08\n\x01\x02\x12\x03\x01\0\x1c\n\n\n\x02\x04\0\x12\x04\x03\0/\x01\n\n\ - \n\x03\x04\0\x01\x12\x03\x03\x08\x19\n\x0b\n\x04\x04\0\x02\0\x12\x03\x04\ - \x02\x16\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\x04\x02\x08\n\x0c\n\x05\x04\ - \0\x02\0\x01\x12\x03\x04\t\x10\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x04\ - \x13\x15\n\x0b\n\x04\x04\0\x02\x01\x12\x03\x05\x02\x17\n\x0c\n\x05\x04\0\ - \x02\x01\x05\x12\x03\x05\x02\x08\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\ - \x05\t\x12\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x05\x15\x16\n\x0b\n\x04\ - \x04\0\x02\x02\x12\x03\x06\x02\x16\n\x0c\n\x05\x04\0\x02\x02\x05\x12\x03\ - \x06\x02\x08\n\x0c\n\x05\x04\0\x02\x02\x01\x12\x03\x06\t\x11\n\x0c\n\x05\ - \x04\0\x02\x02\x03\x12\x03\x06\x14\x15\n\x0b\n\x04\x04\0\x02\x03\x12\x03\ - \x07\x02\x1c\n\x0c\n\x05\x04\0\x02\x03\x05\x12\x03\x07\x02\x08\n\x0c\n\ - \x05\x04\0\x02\x03\x01\x12\x03\x07\t\x16\n\x0c\n\x05\x04\0\x02\x03\x03\ - \x12\x03\x07\x19\x1b\n\x0b\n\x04\x04\0\x02\x04\x12\x03\x08\x02\x17\n\x0c\ - \n\x05\x04\0\x02\x04\x05\x12\x03\x08\x02\x08\n\x0c\n\x05\x04\0\x02\x04\ - \x01\x12\x03\x08\t\x11\n\x0c\n\x05\x04\0\x02\x04\x03\x12\x03\x08\x14\x16\ - \n\x0b\n\x04\x04\0\x02\x05\x12\x03\t\x02\x1a\n\x0c\n\x05\x04\0\x02\x05\ - \x05\x12\x03\t\x02\x08\n\x0c\n\x05\x04\0\x02\x05\x01\x12\x03\t\t\x14\n\ - \x0c\n\x05\x04\0\x02\x05\x03\x12\x03\t\x17\x19\n\x0b\n\x04\x04\0\x02\x06\ - \x12\x03\n\x02\x17\n\x0c\n\x05\x04\0\x02\x06\x05\x12\x03\n\x02\x07\n\x0c\ - \n\x05\x04\0\x02\x06\x01\x12\x03\n\x08\x11\n\x0c\n\x05\x04\0\x02\x06\x03\ - \x12\x03\n\x14\x16\n\x0b\n\x04\x04\0\x02\x07\x12\x03\x0b\x02\"\n\x0c\n\ - \x05\x04\0\x02\x07\x06\x12\x03\x0b\x02\x15\n\x0c\n\x05\x04\0\x02\x07\x01\ - \x12\x03\x0b\x16\x1c\n\x0c\n\x05\x04\0\x02\x07\x03\x12\x03\x0b\x1f!\n\ - \x0b\n\x04\x04\0\x02\x08\x12\x03\x0c\x02!\n\x0c\n\x05\x04\0\x02\x08\x05\ - \x12\x03\x0c\x02\x07\n\x0c\n\x05\x04\0\x02\x08\x01\x12\x03\x0c\x08\x1c\n\ - \x0c\n\x05\x04\0\x02\x08\x03\x12\x03\x0c\x1f\x20\n\x0b\n\x04\x04\0\x02\t\ - \x12\x03\r\x02(\n\x0c\n\x05\x04\0\x02\t\x05\x12\x03\r\x02\x07\n\x0c\n\ - \x05\x04\0\x02\t\x01\x12\x03\r\x08#\n\x0c\n\x05\x04\0\x02\t\x03\x12\x03\ - \r&'\n\x0b\n\x04\x04\0\x02\n\x12\x03\x0e\x02#\n\x0c\n\x05\x04\0\x02\n\ - \x05\x12\x03\x0e\x02\x07\n\x0c\n\x05\x04\0\x02\n\x01\x12\x03\x0e\x08\x1e\ - \n\x0c\n\x05\x04\0\x02\n\x03\x12\x03\x0e!\"\n\x0b\n\x04\x04\0\x02\x0b\ - \x12\x03\x0f\x02\x1f\n\x0c\n\x05\x04\0\x02\x0b\x05\x12\x03\x0f\x02\x07\n\ - \x0c\n\x05\x04\0\x02\x0b\x01\x12\x03\x0f\x08\x1a\n\x0c\n\x05\x04\0\x02\ - \x0b\x03\x12\x03\x0f\x1d\x1e\n\x0b\n\x04\x04\0\x02\x0c\x12\x03\x10\x02%\ - \n\x0c\n\x05\x04\0\x02\x0c\x05\x12\x03\x10\x02\x07\n\x0c\n\x05\x04\0\x02\ - \x0c\x01\x12\x03\x10\x08\x20\n\x0c\n\x05\x04\0\x02\x0c\x03\x12\x03\x10#$\ - \n\x0b\n\x04\x04\0\x02\r\x12\x03\x11\x02\x1d\n\x0c\n\x05\x04\0\x02\r\x05\ - \x12\x03\x11\x02\x07\n\x0c\n\x05\x04\0\x02\r\x01\x12\x03\x11\x08\x18\n\ - \x0c\n\x05\x04\0\x02\r\x03\x12\x03\x11\x1b\x1c\n\x0b\n\x04\x04\0\x02\x0e\ - \x12\x03\x12\x02\x1f\n\x0c\n\x05\x04\0\x02\x0e\x05\x12\x03\x12\x02\x07\n\ - \x0c\n\x05\x04\0\x02\x0e\x01\x12\x03\x12\x08\x1a\n\x0c\n\x05\x04\0\x02\ - \x0e\x03\x12\x03\x12\x1d\x1e\n\x0b\n\x04\x04\0\x02\x0f\x12\x03\x13\x02&\ - \n\x0c\n\x05\x04\0\x02\x0f\x05\x12\x03\x13\x02\x07\n\x0c\n\x05\x04\0\x02\ - \x0f\x01\x12\x03\x13\x08\x20\n\x0c\n\x05\x04\0\x02\x0f\x03\x12\x03\x13#%\ - \n\x0b\n\x04\x04\0\x02\x10\x12\x03\x14\x02\x1a\n\x0c\n\x05\x04\0\x02\x10\ - \x05\x12\x03\x14\x02\x07\n\x0c\n\x05\x04\0\x02\x10\x01\x12\x03\x14\x08\ - \x14\n\x0c\n\x05\x04\0\x02\x10\x03\x12\x03\x14\x17\x19\n\x0b\n\x04\x04\0\ - \x02\x11\x12\x03\x15\x02\x1e\n\x0c\n\x05\x04\0\x02\x11\x05\x12\x03\x15\ - \x02\x07\n\x0c\n\x05\x04\0\x02\x11\x01\x12\x03\x15\x08\x18\n\x0c\n\x05\ - \x04\0\x02\x11\x03\x12\x03\x15\x1b\x1d\n\x0b\n\x04\x04\0\x02\x12\x12\x03\ - \x16\x02\x1f\n\x0c\n\x05\x04\0\x02\x12\x05\x12\x03\x16\x02\x07\n\x0c\n\ - \x05\x04\0\x02\x12\x01\x12\x03\x16\x08\x19\n\x0c\n\x05\x04\0\x02\x12\x03\ - \x12\x03\x16\x1c\x1e\n\x0b\n\x04\x04\0\x02\x13\x12\x03\x17\x02\x1e\n\x0c\ - \n\x05\x04\0\x02\x13\x05\x12\x03\x17\x02\x07\n\x0c\n\x05\x04\0\x02\x13\ - \x01\x12\x03\x17\x08\x18\n\x0c\n\x05\x04\0\x02\x13\x03\x12\x03\x17\x1b\ - \x1d\n\x0b\n\x04\x04\0\x02\x14\x12\x03\x18\x02\x1f\n\x0c\n\x05\x04\0\x02\ - \x14\x05\x12\x03\x18\x02\x07\n\x0c\n\x05\x04\0\x02\x14\x01\x12\x03\x18\ - \x08\x19\n\x0c\n\x05\x04\0\x02\x14\x03\x12\x03\x18\x1c\x1e\n\x0b\n\x04\ - \x04\0\x02\x15\x12\x03\x19\x02\x20\n\x0c\n\x05\x04\0\x02\x15\x05\x12\x03\ - \x19\x02\x07\n\x0c\n\x05\x04\0\x02\x15\x01\x12\x03\x19\x08\x1a\n\x0c\n\ - \x05\x04\0\x02\x15\x03\x12\x03\x19\x1d\x1f\n\x0b\n\x04\x04\0\x02\x16\x12\ - \x03\x1a\x02\x1f\n\x0c\n\x05\x04\0\x02\x16\x05\x12\x03\x1a\x02\x07\n\x0c\ - \n\x05\x04\0\x02\x16\x01\x12\x03\x1a\x08\x19\n\x0c\n\x05\x04\0\x02\x16\ - \x03\x12\x03\x1a\x1c\x1e\n\x0b\n\x04\x04\0\x02\x17\x12\x03\x1b\x02\x1b\n\ - \x0c\n\x05\x04\0\x02\x17\x05\x12\x03\x1b\x02\x07\n\x0c\n\x05\x04\0\x02\ - \x17\x01\x12\x03\x1b\x08\x15\n\x0c\n\x05\x04\0\x02\x17\x03\x12\x03\x1b\ - \x18\x1a\n\x0b\n\x04\x04\0\x02\x18\x12\x03\x1c\x02\x1c\n\x0c\n\x05\x04\0\ - \x02\x18\x05\x12\x03\x1c\x02\x07\n\x0c\n\x05\x04\0\x02\x18\x01\x12\x03\ - \x1c\x08\x16\n\x0c\n\x05\x04\0\x02\x18\x03\x12\x03\x1c\x19\x1b\n\x0b\n\ - \x04\x04\0\x02\x19\x12\x03\x1d\x02\x17\n\x0c\n\x05\x04\0\x02\x19\x05\x12\ - \x03\x1d\x02\x07\n\x0c\n\x05\x04\0\x02\x19\x01\x12\x03\x1d\x08\x11\n\x0c\ - \n\x05\x04\0\x02\x19\x03\x12\x03\x1d\x14\x16\n\x0b\n\x04\x04\0\x02\x1a\ - \x12\x03\x1e\x02\x1c\n\x0c\n\x05\x04\0\x02\x1a\x05\x12\x03\x1e\x02\x07\n\ - \x0c\n\x05\x04\0\x02\x1a\x01\x12\x03\x1e\x08\x16\n\x0c\n\x05\x04\0\x02\ - \x1a\x03\x12\x03\x1e\x19\x1b\n\x0b\n\x04\x04\0\x02\x1b\x12\x03\x1f\x02\ - \x18\n\x0c\n\x05\x04\0\x02\x1b\x05\x12\x03\x1f\x02\x07\n\x0c\n\x05\x04\0\ - \x02\x1b\x01\x12\x03\x1f\x08\x12\n\x0c\n\x05\x04\0\x02\x1b\x03\x12\x03\ - \x1f\x15\x17\n\x0b\n\x04\x04\0\x02\x1c\x12\x03\x20\x02\x1b\n\x0c\n\x05\ - \x04\0\x02\x1c\x05\x12\x03\x20\x02\x07\n\x0c\n\x05\x04\0\x02\x1c\x01\x12\ - \x03\x20\x08\x15\n\x0c\n\x05\x04\0\x02\x1c\x03\x12\x03\x20\x18\x1a\n\x0b\ - \n\x04\x04\0\x02\x1d\x12\x03!\x02\x1c\n\x0c\n\x05\x04\0\x02\x1d\x05\x12\ - \x03!\x02\x07\n\x0c\n\x05\x04\0\x02\x1d\x01\x12\x03!\x08\x16\n\x0c\n\x05\ - \x04\0\x02\x1d\x03\x12\x03!\x19\x1b\n\x0b\n\x04\x04\0\x02\x1e\x12\x03\"\ - \x02/\n\x0c\n\x05\x04\0\x02\x1e\x05\x12\x03\"\x02\x07\n\x0c\n\x05\x04\0\ - \x02\x1e\x01\x12\x03\"\x08)\n\x0c\n\x05\x04\0\x02\x1e\x03\x12\x03\",.\n\ - \x0b\n\x04\x04\0\x02\x1f\x12\x03#\x02.\n\x0c\n\x05\x04\0\x02\x1f\x05\x12\ - \x03#\x02\x07\n\x0c\n\x05\x04\0\x02\x1f\x01\x12\x03#\x08(\n\x0c\n\x05\ - \x04\0\x02\x1f\x03\x12\x03#+-\n\x0b\n\x04\x04\0\x02\x20\x12\x03$\x02*\n\ - \x0c\n\x05\x04\0\x02\x20\x05\x12\x03$\x02\x07\n\x0c\n\x05\x04\0\x02\x20\ - \x01\x12\x03$\x08$\n\x0c\n\x05\x04\0\x02\x20\x03\x12\x03$')\n\x0b\n\x04\ - \x04\0\x02!\x12\x03%\x02+\n\x0c\n\x05\x04\0\x02!\x05\x12\x03%\x02\x07\n\ - \x0c\n\x05\x04\0\x02!\x01\x12\x03%\x08%\n\x0c\n\x05\x04\0\x02!\x03\x12\ - \x03%(*\n\x0b\n\x04\x04\0\x02\"\x12\x03&\x02&\n\x0c\n\x05\x04\0\x02\"\ - \x05\x12\x03&\x02\x07\n\x0c\n\x05\x04\0\x02\"\x01\x12\x03&\x08\x20\n\x0c\ - \n\x05\x04\0\x02\"\x03\x12\x03&#%\n\x0b\n\x04\x04\0\x02#\x12\x03'\x02+\n\ - \x0c\n\x05\x04\0\x02#\x05\x12\x03'\x02\x07\n\x0c\n\x05\x04\0\x02#\x01\ - \x12\x03'\x08%\n\x0c\n\x05\x04\0\x02#\x03\x12\x03'(*\n\x0b\n\x04\x04\0\ - \x02$\x12\x03(\x02\x1b\n\x0c\n\x05\x04\0\x02$\x05\x12\x03(\x02\x07\n\x0c\ - \n\x05\x04\0\x02$\x01\x12\x03(\x08\x15\n\x0c\n\x05\x04\0\x02$\x03\x12\ - \x03(\x18\x1a\n\x0b\n\x04\x04\0\x02%\x12\x03)\x02\x1e\n\x0c\n\x05\x04\0\ - \x02%\x05\x12\x03)\x02\x07\n\x0c\n\x05\x04\0\x02%\x01\x12\x03)\x08\x18\n\ - \x0c\n\x05\x04\0\x02%\x03\x12\x03)\x1b\x1d\n\x0b\n\x04\x04\0\x02&\x12\ - \x03*\x02\"\n\x0c\n\x05\x04\0\x02&\x05\x12\x03*\x02\x07\n\x0c\n\x05\x04\ - \0\x02&\x01\x12\x03*\x08\x1c\n\x0c\n\x05\x04\0\x02&\x03\x12\x03*\x1f!\n\ - \x0b\n\x04\x04\0\x02'\x12\x03+\x02\x18\n\x0c\n\x05\x04\0\x02'\x05\x12\ - \x03+\x02\x07\n\x0c\n\x05\x04\0\x02'\x01\x12\x03+\x08\x12\n\x0c\n\x05\ - \x04\0\x02'\x03\x12\x03+\x15\x17\n\x0b\n\x04\x04\0\x02(\x12\x03,\x02\x14\ - \n\x0c\n\x05\x04\0\x02(\x05\x12\x03,\x02\x08\n\x0c\n\x05\x04\0\x02(\x01\ - \x12\x03,\t\x0e\n\x0c\n\x05\x04\0\x02(\x03\x12\x03,\x11\x13\n\x0b\n\x04\ - \x04\0\x02)\x12\x03-\x02\x1f\n\x0c\n\x05\x04\0\x02)\x05\x12\x03-\x02\x07\ - \n\x0c\n\x05\x04\0\x02)\x01\x12\x03-\x08\x19\n\x0c\n\x05\x04\0\x02)\x03\ - \x12\x03-\x1c\x1e\n\x0b\n\x04\x04\0\x02*\x12\x03.\x02\x20\n\x0c\n\x05\ - \x04\0\x02*\x05\x12\x03.\x02\x07\n\x0c\n\x05\x04\0\x02*\x01\x12\x03.\x08\ - \x1a\n\x0c\n\x05\x04\0\x02*\x03\x12\x03.\x1d\x1fb\x06proto3\ + \x10podUptimeSeconds\x12N\n\x10owner_references\x18,\x20\x03(\x0b2#.prot\ + ocol.kubernetes.OwnerReferenceR\x0fownerReferences\x1a9\n\x0bLabelsEntry\ + \x12\x10\n\x03key\x18\x01\x20\x01(\tR\x03key\x12\x14\n\x05value\x18\x02\ + \x20\x01(\tR\x05value:\x028\x01\"V\n\x0eOwnerReference\x12\x12\n\x04name\ + \x18\x01\x20\x01(\tR\x04name\x12\x12\n\x04kind\x18\x02\x20\x01(\tR\x04ki\ + nd\x12\x1c\n\tnamespace\x18\x03\x20\x01(\tR\tnamespaceJ\xf3\x14\n\x06\ + \x12\x04\0\06\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\x08\n\x01\x02\x12\ + \x03\x01\0\x1c\n\n\n\x02\x04\0\x12\x04\x03\00\x01\n\n\n\x03\x04\0\x01\ + \x12\x03\x03\x08\x19\n\x0b\n\x04\x04\0\x02\0\x12\x03\x04\x02\x16\n\x0c\n\ + \x05\x04\0\x02\0\x05\x12\x03\x04\x02\x08\n\x0c\n\x05\x04\0\x02\0\x01\x12\ + \x03\x04\t\x10\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x04\x13\x15\n\x0b\n\ + \x04\x04\0\x02\x01\x12\x03\x05\x02\x17\n\x0c\n\x05\x04\0\x02\x01\x05\x12\ + \x03\x05\x02\x08\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x05\t\x12\n\x0c\n\ + \x05\x04\0\x02\x01\x03\x12\x03\x05\x15\x16\n\x0b\n\x04\x04\0\x02\x02\x12\ + \x03\x06\x02\x16\n\x0c\n\x05\x04\0\x02\x02\x05\x12\x03\x06\x02\x08\n\x0c\ + \n\x05\x04\0\x02\x02\x01\x12\x03\x06\t\x11\n\x0c\n\x05\x04\0\x02\x02\x03\ + \x12\x03\x06\x14\x15\n\x0b\n\x04\x04\0\x02\x03\x12\x03\x07\x02\x1c\n\x0c\ + \n\x05\x04\0\x02\x03\x05\x12\x03\x07\x02\x08\n\x0c\n\x05\x04\0\x02\x03\ + \x01\x12\x03\x07\t\x16\n\x0c\n\x05\x04\0\x02\x03\x03\x12\x03\x07\x19\x1b\ + \n\x0b\n\x04\x04\0\x02\x04\x12\x03\x08\x02\x17\n\x0c\n\x05\x04\0\x02\x04\ + \x05\x12\x03\x08\x02\x08\n\x0c\n\x05\x04\0\x02\x04\x01\x12\x03\x08\t\x11\ + \n\x0c\n\x05\x04\0\x02\x04\x03\x12\x03\x08\x14\x16\n\x0b\n\x04\x04\0\x02\ + \x05\x12\x03\t\x02\x1a\n\x0c\n\x05\x04\0\x02\x05\x05\x12\x03\t\x02\x08\n\ + \x0c\n\x05\x04\0\x02\x05\x01\x12\x03\t\t\x14\n\x0c\n\x05\x04\0\x02\x05\ + \x03\x12\x03\t\x17\x19\n\x0b\n\x04\x04\0\x02\x06\x12\x03\n\x02\x17\n\x0c\ + \n\x05\x04\0\x02\x06\x05\x12\x03\n\x02\x07\n\x0c\n\x05\x04\0\x02\x06\x01\ + \x12\x03\n\x08\x11\n\x0c\n\x05\x04\0\x02\x06\x03\x12\x03\n\x14\x16\n\x0b\ + \n\x04\x04\0\x02\x07\x12\x03\x0b\x02\"\n\x0c\n\x05\x04\0\x02\x07\x06\x12\ + \x03\x0b\x02\x15\n\x0c\n\x05\x04\0\x02\x07\x01\x12\x03\x0b\x16\x1c\n\x0c\ + \n\x05\x04\0\x02\x07\x03\x12\x03\x0b\x1f!\n\x0b\n\x04\x04\0\x02\x08\x12\ + \x03\x0c\x02!\n\x0c\n\x05\x04\0\x02\x08\x05\x12\x03\x0c\x02\x07\n\x0c\n\ + \x05\x04\0\x02\x08\x01\x12\x03\x0c\x08\x1c\n\x0c\n\x05\x04\0\x02\x08\x03\ + \x12\x03\x0c\x1f\x20\n\x0b\n\x04\x04\0\x02\t\x12\x03\r\x02(\n\x0c\n\x05\ + \x04\0\x02\t\x05\x12\x03\r\x02\x07\n\x0c\n\x05\x04\0\x02\t\x01\x12\x03\r\ + \x08#\n\x0c\n\x05\x04\0\x02\t\x03\x12\x03\r&'\n\x0b\n\x04\x04\0\x02\n\ + \x12\x03\x0e\x02#\n\x0c\n\x05\x04\0\x02\n\x05\x12\x03\x0e\x02\x07\n\x0c\ + \n\x05\x04\0\x02\n\x01\x12\x03\x0e\x08\x1e\n\x0c\n\x05\x04\0\x02\n\x03\ + \x12\x03\x0e!\"\n\x0b\n\x04\x04\0\x02\x0b\x12\x03\x0f\x02\x1f\n\x0c\n\ + \x05\x04\0\x02\x0b\x05\x12\x03\x0f\x02\x07\n\x0c\n\x05\x04\0\x02\x0b\x01\ + \x12\x03\x0f\x08\x1a\n\x0c\n\x05\x04\0\x02\x0b\x03\x12\x03\x0f\x1d\x1e\n\ + \x0b\n\x04\x04\0\x02\x0c\x12\x03\x10\x02%\n\x0c\n\x05\x04\0\x02\x0c\x05\ + \x12\x03\x10\x02\x07\n\x0c\n\x05\x04\0\x02\x0c\x01\x12\x03\x10\x08\x20\n\ + \x0c\n\x05\x04\0\x02\x0c\x03\x12\x03\x10#$\n\x0b\n\x04\x04\0\x02\r\x12\ + \x03\x11\x02\x1d\n\x0c\n\x05\x04\0\x02\r\x05\x12\x03\x11\x02\x07\n\x0c\n\ + \x05\x04\0\x02\r\x01\x12\x03\x11\x08\x18\n\x0c\n\x05\x04\0\x02\r\x03\x12\ + \x03\x11\x1b\x1c\n\x0b\n\x04\x04\0\x02\x0e\x12\x03\x12\x02\x1f\n\x0c\n\ + \x05\x04\0\x02\x0e\x05\x12\x03\x12\x02\x07\n\x0c\n\x05\x04\0\x02\x0e\x01\ + \x12\x03\x12\x08\x1a\n\x0c\n\x05\x04\0\x02\x0e\x03\x12\x03\x12\x1d\x1e\n\ + \x0b\n\x04\x04\0\x02\x0f\x12\x03\x13\x02&\n\x0c\n\x05\x04\0\x02\x0f\x05\ + \x12\x03\x13\x02\x07\n\x0c\n\x05\x04\0\x02\x0f\x01\x12\x03\x13\x08\x20\n\ + \x0c\n\x05\x04\0\x02\x0f\x03\x12\x03\x13#%\n\x0b\n\x04\x04\0\x02\x10\x12\ + \x03\x14\x02\x1a\n\x0c\n\x05\x04\0\x02\x10\x05\x12\x03\x14\x02\x07\n\x0c\ + \n\x05\x04\0\x02\x10\x01\x12\x03\x14\x08\x14\n\x0c\n\x05\x04\0\x02\x10\ + \x03\x12\x03\x14\x17\x19\n\x0b\n\x04\x04\0\x02\x11\x12\x03\x15\x02\x1e\n\ + \x0c\n\x05\x04\0\x02\x11\x05\x12\x03\x15\x02\x07\n\x0c\n\x05\x04\0\x02\ + \x11\x01\x12\x03\x15\x08\x18\n\x0c\n\x05\x04\0\x02\x11\x03\x12\x03\x15\ + \x1b\x1d\n\x0b\n\x04\x04\0\x02\x12\x12\x03\x16\x02\x1f\n\x0c\n\x05\x04\0\ + \x02\x12\x05\x12\x03\x16\x02\x07\n\x0c\n\x05\x04\0\x02\x12\x01\x12\x03\ + \x16\x08\x19\n\x0c\n\x05\x04\0\x02\x12\x03\x12\x03\x16\x1c\x1e\n\x0b\n\ + \x04\x04\0\x02\x13\x12\x03\x17\x02\x1e\n\x0c\n\x05\x04\0\x02\x13\x05\x12\ + \x03\x17\x02\x07\n\x0c\n\x05\x04\0\x02\x13\x01\x12\x03\x17\x08\x18\n\x0c\ + \n\x05\x04\0\x02\x13\x03\x12\x03\x17\x1b\x1d\n\x0b\n\x04\x04\0\x02\x14\ + \x12\x03\x18\x02\x1f\n\x0c\n\x05\x04\0\x02\x14\x05\x12\x03\x18\x02\x07\n\ + \x0c\n\x05\x04\0\x02\x14\x01\x12\x03\x18\x08\x19\n\x0c\n\x05\x04\0\x02\ + \x14\x03\x12\x03\x18\x1c\x1e\n\x0b\n\x04\x04\0\x02\x15\x12\x03\x19\x02\ + \x20\n\x0c\n\x05\x04\0\x02\x15\x05\x12\x03\x19\x02\x07\n\x0c\n\x05\x04\0\ + \x02\x15\x01\x12\x03\x19\x08\x1a\n\x0c\n\x05\x04\0\x02\x15\x03\x12\x03\ + \x19\x1d\x1f\n\x0b\n\x04\x04\0\x02\x16\x12\x03\x1a\x02\x1f\n\x0c\n\x05\ + \x04\0\x02\x16\x05\x12\x03\x1a\x02\x07\n\x0c\n\x05\x04\0\x02\x16\x01\x12\ + \x03\x1a\x08\x19\n\x0c\n\x05\x04\0\x02\x16\x03\x12\x03\x1a\x1c\x1e\n\x0b\ + \n\x04\x04\0\x02\x17\x12\x03\x1b\x02\x1b\n\x0c\n\x05\x04\0\x02\x17\x05\ + \x12\x03\x1b\x02\x07\n\x0c\n\x05\x04\0\x02\x17\x01\x12\x03\x1b\x08\x15\n\ + \x0c\n\x05\x04\0\x02\x17\x03\x12\x03\x1b\x18\x1a\n\x0b\n\x04\x04\0\x02\ + \x18\x12\x03\x1c\x02\x1c\n\x0c\n\x05\x04\0\x02\x18\x05\x12\x03\x1c\x02\ + \x07\n\x0c\n\x05\x04\0\x02\x18\x01\x12\x03\x1c\x08\x16\n\x0c\n\x05\x04\0\ + \x02\x18\x03\x12\x03\x1c\x19\x1b\n\x0b\n\x04\x04\0\x02\x19\x12\x03\x1d\ + \x02\x17\n\x0c\n\x05\x04\0\x02\x19\x05\x12\x03\x1d\x02\x07\n\x0c\n\x05\ + \x04\0\x02\x19\x01\x12\x03\x1d\x08\x11\n\x0c\n\x05\x04\0\x02\x19\x03\x12\ + \x03\x1d\x14\x16\n\x0b\n\x04\x04\0\x02\x1a\x12\x03\x1e\x02\x1c\n\x0c\n\ + \x05\x04\0\x02\x1a\x05\x12\x03\x1e\x02\x07\n\x0c\n\x05\x04\0\x02\x1a\x01\ + \x12\x03\x1e\x08\x16\n\x0c\n\x05\x04\0\x02\x1a\x03\x12\x03\x1e\x19\x1b\n\ + \x0b\n\x04\x04\0\x02\x1b\x12\x03\x1f\x02\x18\n\x0c\n\x05\x04\0\x02\x1b\ + \x05\x12\x03\x1f\x02\x07\n\x0c\n\x05\x04\0\x02\x1b\x01\x12\x03\x1f\x08\ + \x12\n\x0c\n\x05\x04\0\x02\x1b\x03\x12\x03\x1f\x15\x17\n\x0b\n\x04\x04\0\ + \x02\x1c\x12\x03\x20\x02\x1b\n\x0c\n\x05\x04\0\x02\x1c\x05\x12\x03\x20\ + \x02\x07\n\x0c\n\x05\x04\0\x02\x1c\x01\x12\x03\x20\x08\x15\n\x0c\n\x05\ + \x04\0\x02\x1c\x03\x12\x03\x20\x18\x1a\n\x0b\n\x04\x04\0\x02\x1d\x12\x03\ + !\x02\x1c\n\x0c\n\x05\x04\0\x02\x1d\x05\x12\x03!\x02\x07\n\x0c\n\x05\x04\ + \0\x02\x1d\x01\x12\x03!\x08\x16\n\x0c\n\x05\x04\0\x02\x1d\x03\x12\x03!\ + \x19\x1b\n\x0b\n\x04\x04\0\x02\x1e\x12\x03\"\x02/\n\x0c\n\x05\x04\0\x02\ + \x1e\x05\x12\x03\"\x02\x07\n\x0c\n\x05\x04\0\x02\x1e\x01\x12\x03\"\x08)\ + \n\x0c\n\x05\x04\0\x02\x1e\x03\x12\x03\",.\n\x0b\n\x04\x04\0\x02\x1f\x12\ + \x03#\x02.\n\x0c\n\x05\x04\0\x02\x1f\x05\x12\x03#\x02\x07\n\x0c\n\x05\ + \x04\0\x02\x1f\x01\x12\x03#\x08(\n\x0c\n\x05\x04\0\x02\x1f\x03\x12\x03#+\ + -\n\x0b\n\x04\x04\0\x02\x20\x12\x03$\x02*\n\x0c\n\x05\x04\0\x02\x20\x05\ + \x12\x03$\x02\x07\n\x0c\n\x05\x04\0\x02\x20\x01\x12\x03$\x08$\n\x0c\n\ + \x05\x04\0\x02\x20\x03\x12\x03$')\n\x0b\n\x04\x04\0\x02!\x12\x03%\x02+\n\ + \x0c\n\x05\x04\0\x02!\x05\x12\x03%\x02\x07\n\x0c\n\x05\x04\0\x02!\x01\ + \x12\x03%\x08%\n\x0c\n\x05\x04\0\x02!\x03\x12\x03%(*\n\x0b\n\x04\x04\0\ + \x02\"\x12\x03&\x02&\n\x0c\n\x05\x04\0\x02\"\x05\x12\x03&\x02\x07\n\x0c\ + \n\x05\x04\0\x02\"\x01\x12\x03&\x08\x20\n\x0c\n\x05\x04\0\x02\"\x03\x12\ + \x03&#%\n\x0b\n\x04\x04\0\x02#\x12\x03'\x02+\n\x0c\n\x05\x04\0\x02#\x05\ + \x12\x03'\x02\x07\n\x0c\n\x05\x04\0\x02#\x01\x12\x03'\x08%\n\x0c\n\x05\ + \x04\0\x02#\x03\x12\x03'(*\n\x0b\n\x04\x04\0\x02$\x12\x03(\x02\x1b\n\x0c\ + \n\x05\x04\0\x02$\x05\x12\x03(\x02\x07\n\x0c\n\x05\x04\0\x02$\x01\x12\ + \x03(\x08\x15\n\x0c\n\x05\x04\0\x02$\x03\x12\x03(\x18\x1a\n\x0b\n\x04\ + \x04\0\x02%\x12\x03)\x02\x1e\n\x0c\n\x05\x04\0\x02%\x05\x12\x03)\x02\x07\ + \n\x0c\n\x05\x04\0\x02%\x01\x12\x03)\x08\x18\n\x0c\n\x05\x04\0\x02%\x03\ + \x12\x03)\x1b\x1d\n\x0b\n\x04\x04\0\x02&\x12\x03*\x02\"\n\x0c\n\x05\x04\ + \0\x02&\x05\x12\x03*\x02\x07\n\x0c\n\x05\x04\0\x02&\x01\x12\x03*\x08\x1c\ + \n\x0c\n\x05\x04\0\x02&\x03\x12\x03*\x1f!\n\x0b\n\x04\x04\0\x02'\x12\x03\ + +\x02\x18\n\x0c\n\x05\x04\0\x02'\x05\x12\x03+\x02\x07\n\x0c\n\x05\x04\0\ + \x02'\x01\x12\x03+\x08\x12\n\x0c\n\x05\x04\0\x02'\x03\x12\x03+\x15\x17\n\ + \x0b\n\x04\x04\0\x02(\x12\x03,\x02\x14\n\x0c\n\x05\x04\0\x02(\x05\x12\ + \x03,\x02\x08\n\x0c\n\x05\x04\0\x02(\x01\x12\x03,\t\x0e\n\x0c\n\x05\x04\ + \0\x02(\x03\x12\x03,\x11\x13\n\x0b\n\x04\x04\0\x02)\x12\x03-\x02\x1f\n\ + \x0c\n\x05\x04\0\x02)\x05\x12\x03-\x02\x07\n\x0c\n\x05\x04\0\x02)\x01\ + \x12\x03-\x08\x19\n\x0c\n\x05\x04\0\x02)\x03\x12\x03-\x1c\x1e\n\x0b\n\ + \x04\x04\0\x02*\x12\x03.\x02\x20\n\x0c\n\x05\x04\0\x02*\x05\x12\x03.\x02\ + \x07\n\x0c\n\x05\x04\0\x02*\x01\x12\x03.\x08\x1a\n\x0c\n\x05\x04\0\x02*\ + \x03\x12\x03.\x1d\x1f\n\x0b\n\x04\x04\0\x02+\x12\x03/\x020\n\x0c\n\x05\ + \x04\0\x02+\x04\x12\x03/\x02\n\n\x0c\n\x05\x04\0\x02+\x06\x12\x03/\x0b\ + \x19\n\x0c\n\x05\x04\0\x02+\x01\x12\x03/\x1a*\n\x0c\n\x05\x04\0\x02+\x03\ + \x12\x03/-/\n\n\n\x02\x04\x01\x12\x042\06\x01\n\n\n\x03\x04\x01\x01\x12\ + \x032\x08\x16\n\x0b\n\x04\x04\x01\x02\0\x12\x033\x02\x12\n\x0c\n\x05\x04\ + \x01\x02\0\x05\x12\x033\x02\x08\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x033\t\ + \r\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x033\x10\x11\n\x0b\n\x04\x04\x01\ + \x02\x01\x12\x034\x02\x12\n\x0c\n\x05\x04\x01\x02\x01\x05\x12\x034\x02\ + \x08\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\x034\t\r\n\x0c\n\x05\x04\x01\ + \x02\x01\x03\x12\x034\x10\x11\n\x0b\n\x04\x04\x01\x02\x02\x12\x035\x02\ + \x17\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x035\x02\x08\n\x0c\n\x05\x04\ + \x01\x02\x02\x01\x12\x035\t\x12\n\x0c\n\x05\x04\x01\x02\x02\x03\x12\x035\ + \x15\x16b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 5e49b62..df4e3b7 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel="1.75.0" +channel="1.82.0" diff --git a/script/write_version b/script/write_version index b1505e7..17b803f 100755 --- a/script/write_version +++ b/script/write_version @@ -11,6 +11,7 @@ File.write( "deployment.yaml", File.read("deployment.yaml").sub(/image: appsignal\/appsignal-kubernetes:.*$/, "image: appsignal/appsignal-kubernetes:#{VERSION}") ) +system("rake update_helm_templates") File.write( "charts/appsignal-kubernetes/Chart.yaml", File.read("charts/appsignal-kubernetes/Chart.yaml").sub(/^version: .*$/, %(version: #{VERSION}))) diff --git a/src/main.rs b/src/main.rs index 0e48f63..aacbb8f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,25 @@ +mod ownership; + extern crate time; use appsignal_transmitter::reqwest::{Client, Url}; use http::Request; use k8s_openapi::api::core::v1::{Node, Pod}; -use kube::{api::ListParams, Api, ResourceExt}; +use kube::api::ListParams; +use kube::{Api, ResourceExt}; use log::{info, trace, warn}; use protobuf::Message; use std::env; use std::time::Duration; -include!("../protocol/mod.rs"); +mod protocol { + #![allow(renamed_and_removed_lints)] + include!("../protocol/mod.rs"); +} + +use protocol::kubernetes::{KubernetesMetrics, OwnerReference}; -use kubernetes::KubernetesMetrics; +use crate::ownership::{OwnershipResolver, ResourceIdentifier}; type Error = Box; @@ -440,6 +448,32 @@ impl KubernetesMetrics { }; } + pub async fn extract_owner_references( + &mut self, + resolver: &mut OwnershipResolver, + pods: &kube::api::ObjectList, + ) -> Result<(), Error> { + if let Some(pod) = pods.iter().find(|pod| match &pod.metadata.name { + Some(name) => name == &self.pod_name, + _ => false, + }) { + let resource = ResourceIdentifier::from_pod(pod); + let owner_references = resolver.resolve_top_level_owners(&resource).await?; + for owner_reference in owner_references { + let mut protocol_owner_reference = OwnerReference::new(); + protocol_owner_reference.set_name(owner_reference.name); + protocol_owner_reference.set_kind(owner_reference.gvk.kind); + if let Some(namespace) = owner_reference.namespace { + protocol_owner_reference.set_namespace(namespace); + } + + self.mut_owner_references().push(protocol_owner_reference); + } + }; + + Ok(()) + } + fn extract_i64(data: &serde_json::Value, path: &str) -> Option { Self::extract(data, path)?.as_i64() } @@ -491,6 +525,8 @@ async fn main() -> Result<(), Error> { Config::from_env() ); + let client = kube::Client::try_default().await?; + let mut resolver = OwnershipResolver::new(client.clone()); let duration = Duration::new(60, 0); let mut interval = tokio::time::interval(duration); let mut previous = Vec::new(); @@ -498,20 +534,29 @@ async fn main() -> Result<(), Error> { loop { interval.tick().await; - match run(previous).await { + match run(&client, &mut resolver, previous).await { Ok(results) => previous = results, - Err(err) => panic!("Failed to extract metrics: {}", err), + Err(err) => { + warn!("Failed to extract and report metrics: {}", err); + previous = Vec::new(); + } } + + resolver.reset(); } } -async fn run(previous: Vec) -> Result, Error> { - let kube_client = kube::Client::try_default().await?; +async fn run( + client: &kube::Client, + resolver: &mut OwnershipResolver, + previous: Vec, +) -> Result, Error> { + trace!("Beginning Kubernetes metrics extraction"); - let nodes: Api = Api::all(kube_client.clone()); + let nodes: Api = Api::all(client.clone()); let nodes_list = nodes.list(&ListParams::default()).await?; - let pods: Api = Api::all(kube_client.clone()); + let pods: Api = Api::all(client.clone()); let pods_list = pods.list(&ListParams::default()).await?; let mut metrics = Vec::new(); @@ -522,7 +567,7 @@ async fn run(previous: Vec) -> Result, let url = format!("/api/v1/nodes/{}/proxy/stats/summary", name); let kube_request = Request::get(url).body(Default::default())?; - let kube_response = kube_client + let kube_response = client .request::(kube_request.clone()) .await?; @@ -552,6 +597,16 @@ async fn run(previous: Vec) -> Result, pod_metric.extract_pod_labels(&pods_list); pod_metric.extract_pod_restart_count_and_uptime(&pods_list); + if let Err(err) = pod_metric + .extract_owner_references(resolver, &pods_list) + .await + { + warn!( + "Failed to extract owner references for pod {}: {}", + pod_metric.pod_name, err + ); + } + if let Some(metric) = pod_metric.delta_from(previous.clone()) { payload.push(metric); } @@ -581,6 +636,8 @@ async fn run(previous: Vec) -> Result, }; } + trace!("Extracted {} metrics", metrics.len()); + let config = Config::from_env(); let base = Url::parse(&config.endpoint).expect("Could not parse endpoint"); let path = format!("metrics/kubernetes?api_key={}", config.api_key); @@ -588,6 +645,8 @@ async fn run(previous: Vec) -> Result, let reqwest_client = Client::builder().timeout(Duration::from_secs(30)).build()?; + info!("Sending {} metrics to Appsignal", payload.len()); + for metric in &payload { let metric_bytes = metric.write_to_bytes().expect("Could not serialize metric"); let appsignal_response = reqwest_client @@ -596,9 +655,11 @@ async fn run(previous: Vec) -> Result, .send() .await?; - info!("Metric sent: {:?}", appsignal_response); + trace!("Metric sent: {:?}", appsignal_response); } + trace!("Done sending metrics"); + Ok(metrics) } diff --git a/src/ownership.rs b/src/ownership.rs new file mode 100644 index 0000000..b39d402 --- /dev/null +++ b/src/ownership.rs @@ -0,0 +1,318 @@ +use std::collections::HashSet; + +use crate::Error; +use k8s_openapi::api::core::v1::Pod; +use k8s_openapi::apimachinery::pkg::apis::meta::v1::OwnerReference; +use k8s_openapi::Resource; +use kube::api::{ApiResource, DynamicObject, GroupVersionKind}; +use kube::discovery::ApiCapabilities; +use kube::{Api, ResourceExt}; +use log::{trace, warn}; + +macro_rules! gvk { + ($struct:ident) => { + GroupVersionKind::gvk($struct::GROUP, $struct::VERSION, $struct::KIND) + }; +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ResourceIdentifier { + pub gvk: GroupVersionKind, + pub name: String, + pub namespace: Option, +} + +impl TryFrom for ResourceIdentifier { + type Error = Error; + + fn try_from(object: DynamicObject) -> Result { + if let Some(types) = object.types.as_ref() { + Ok(ResourceIdentifier { + gvk: GroupVersionKind::try_from(types)?, + name: object.name_any(), + namespace: object.namespace(), + }) + } else { + Err(format!( + "DynamicObject {:?} does not have a GroupVersionKind", + object.name_any() + ) + .into()) + } + } +} + +impl ResourceIdentifier { + pub fn from_owner_reference( + owner_reference: &OwnerReference, + namespace: Option, + ) -> Self { + ResourceIdentifier { + gvk: GroupVersionKind::from(owner_reference.clone()), + name: owner_reference.name.clone(), + namespace, + } + } + + pub fn from_pod(pod: &Pod) -> Self { + ResourceIdentifier { + gvk: gvk!(Pod), + name: pod.name_any(), + namespace: pod.namespace(), + } + } +} + +type OwnerCache = std::collections::HashMap>; + +pub struct OwnershipResolver { + client: kube::Client, + discovery: Option, + should_discover: bool, + owners: OwnerCache, +} + +impl OwnershipResolver { + pub fn new(client: kube::Client) -> Self { + OwnershipResolver { + client, + discovery: None, + should_discover: true, + owners: OwnerCache::new(), + } + } + + // Clear the resolutions cache and allow re-discovery of Kubernetes APIs + // if needed. + pub fn reset(&mut self) { + trace!("Resetting ownership resolver"); + self.should_discover = true; + self.owners = OwnerCache::new(); + } + + // Re-discover Kubernetes APIs if allowed. + async fn discover(&mut self) -> Result<(), Error> { + if self.should_discover { + trace!("Discovering Kubernetes APIs"); + let discovery = kube::discovery::Discovery::new(self.client.clone()) + .run() + .await?; + self.discovery = Some(discovery); + self.should_discover = false; + } else { + warn!("Redundant Kubernetes API discovery requested, ignoring..."); + } + + Ok(()) + } + + // Use the discovery cache to resolve a GroupVersionKind. + async fn resolve_gvk( + &mut self, + gvk: &GroupVersionKind, + ) -> Result<(ApiResource, ApiCapabilities), Error> { + if let Some(api) = self.discovery.as_mut().and_then(|d| d.resolve_gvk(gvk)) { + return Ok(api); + } + + // If an API is not found for a given GroupVersionKind, this is + // either the first run, or the API was recently added to the cluster, + // or it is not available in the cluster. + // Run the discovery process to update the cache of known APIs. + self.discover().await?; + + if let Some(api) = self.discovery.as_mut().and_then(|d| d.resolve_gvk(gvk)) { + Ok(api) + } else { + Err(format!("Could not resolve GroupVersionKind {:?}", gvk).into()) + } + } + + // Use the discovery cache to resolve an API for a given GroupVersionKind + // and namespace. + async fn resolve_api( + &mut self, + gvk: &GroupVersionKind, + namespace: &Option, + ) -> Result, Error> { + let (api_resource, api_capabilities) = self.resolve_gvk(gvk).await?; + + match api_capabilities.scope { + kube::discovery::Scope::Namespaced => { + if let Some(namespace) = namespace { + // If the API is namespaced, return the API for the given namespace. + Ok(Api::namespaced_with( + self.client.clone(), + namespace, + &api_resource, + )) + } else { + // If the API is namespaced but no namespace is provided, return an error. + Err(format!( + "Cannot resolve namespaced API {:?} without a namespace", + gvk + ) + .into()) + } + } + kube::discovery::Scope::Cluster => { + // If the API is cluster-scoped, return the API without a namespace, + // ignoring the namespace provided. + Ok(Api::all_with(self.client.clone(), &api_resource)) + } + } + } + + // Use the discovery cache to resolve a DynamicObject from a + // ResourceIdentifier. + async fn resolve_object( + &mut self, + resource: &ResourceIdentifier, + ) -> Result { + let api = self.resolve_api(&resource.gvk, &resource.namespace).await?; + + Ok(api.get(&resource.name).await?) + } + + // Use the discovery cache to resolve a DynamicObject's owner + // references to dynamic objects. + async fn resolve_owner_references( + &mut self, + object: &DynamicObject, + ) -> Result, Error> { + let mut result = Vec::new(); + + for owner_reference in object.owner_references() { + let resource = + ResourceIdentifier::from_owner_reference(owner_reference, object.namespace()); + result.push(self.resolve_object(&resource).await?); + } + + Ok(result) + } + + // Use the discovery cache and the ownership cache to resolve + // a DynamicObject to its top-level owners, that is, traversing the + // ownership hierarchy, the owners which are not owned by any other + // object. + pub async fn resolve_top_level_owners( + &mut self, + resource: &ResourceIdentifier, + ) -> Result, Error> { + #[derive(Clone, Debug)] + enum QueueEntry { + DynamicObject(DynamicObject), + ResourceIdentifier(ResourceIdentifier), + } + + impl From for QueueEntry { + fn from(object: DynamicObject) -> Self { + QueueEntry::DynamicObject(object) + } + } + + impl From for QueueEntry { + fn from(resource: ResourceIdentifier) -> Self { + QueueEntry::ResourceIdentifier(resource) + } + } + + impl TryFrom for ResourceIdentifier { + type Error = Error; + + fn try_from(entry: QueueEntry) -> Result { + match entry { + QueueEntry::DynamicObject(object) => object.try_into(), + QueueEntry::ResourceIdentifier(resource) => Ok(resource), + } + } + } + + impl QueueEntry { + async fn resolve( + self, + resolver: &mut OwnershipResolver, + ) -> Result { + match self { + QueueEntry::DynamicObject(object) => Ok(object), + QueueEntry::ResourceIdentifier(resource) => { + resolver.resolve_object(&resource).await + } + } + } + } + + let mut result: HashSet = HashSet::new(); + + let mut queue: Vec = vec![resource.clone().into()]; + let mut seen: HashSet = HashSet::new(); + + while let Some(current_entry) = queue.pop() { + let current_key = current_entry.clone().try_into()?; + + if seen.contains(¤t_key) { + // If we have already seen this entry, skip it to prevent cycles. + // It's unclear whether Kubernetes resources can own each other + // cyclically, but this prevents infinite loops in case they do. + warn!( + "Skipping already seen ownership queue entry: {:?}", + current_key + ); + continue; + } + + seen.insert(current_key.clone()); + + let is_cached = self.owners.contains_key(¤t_key); + + // Fetch the owners for the current entry, either as resource identifiers + // from the owners cache, or as dynamic objects from the Kubernetes API. + let owner_entries: Vec = if is_cached { + trace!("Using cached owners for {:?}", current_key); + self.owners + .get(¤t_key) + .unwrap() + .iter() + .cloned() + .map(QueueEntry::from) + .collect() + } else { + trace!("Resolving owners for {:?}", current_key); + let current_object = current_entry.resolve(self).await?; + let owner_objects = self.resolve_owner_references(¤t_object).await?; + owner_objects.into_iter().map(QueueEntry::from).collect() + }; + + // If there are no owner entries for the current entry, the current entry + // is a top-level owner, so we add it to the result set. + if owner_entries.is_empty() { + trace!("Found root owner: {:?}", current_key); + result.insert(current_key.clone()); + } + + // Add the owner entries, if any, to the queue. + for owner_entry in owner_entries.iter().cloned() { + trace!("Adding owner entry to queue: {:?}", owner_entry); + queue.push(owner_entry); + } + + // If the current entry is not cached, insert the owner references + // into the cache. + if !is_cached { + let owner_references = owner_entries + .into_iter() + .map(|entry| entry.try_into()) + .collect::, Error>>()?; + + trace!( + "Caching owners for {:?}: {:?}", + current_key, + owner_references + ); + self.owners.insert(current_key, owner_references); + } + } + + Ok(result) + } +}