mirror of
https://github.com/sadoyan/aralez.git
synced 2026-10-23 22:21:37 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a4f3e6187 | ||
|
|
31f513cc2a | ||
|
|
0006d27d02 | ||
|
|
d2d4100cba | ||
|
|
f575007044 |
Generated
+57
-45
@@ -138,7 +138,7 @@ checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aralez"
|
name = "aralez"
|
||||||
version = "0.92.19"
|
version = "0.93.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
@@ -183,7 +183,7 @@ dependencies = [
|
|||||||
"subtle",
|
"subtle",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-native-tls",
|
"tokio-native-tls",
|
||||||
"tower-http 0.7.0",
|
"tower-http 0.7.1",
|
||||||
"urlencoding",
|
"urlencoding",
|
||||||
"x509-parser",
|
"x509-parser",
|
||||||
]
|
]
|
||||||
@@ -284,9 +284,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.91"
|
version = "0.1.92"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec"
|
checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -307,9 +307,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aws-lc-rs"
|
name = "aws-lc-rs"
|
||||||
version = "1.17.1"
|
version = "1.18.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad"
|
checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aws-lc-sys",
|
"aws-lc-sys",
|
||||||
"untrusted 0.7.1",
|
"untrusted 0.7.1",
|
||||||
@@ -318,9 +318,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aws-lc-sys"
|
name = "aws-lc-sys"
|
||||||
version = "0.42.0"
|
version = "0.45.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444"
|
checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"cmake",
|
"cmake",
|
||||||
@@ -1338,9 +1338,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures"
|
name = "futures"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"
|
checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@@ -1353,9 +1353,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-channel"
|
name = "futures-channel"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
|
checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
@@ -1363,15 +1363,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-core"
|
name = "futures-core"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
|
checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-executor"
|
name = "futures-executor"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d"
|
checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-task",
|
"futures-task",
|
||||||
@@ -1380,38 +1380,38 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-io"
|
name = "futures-io"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
|
checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-macro"
|
name = "futures-macro"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
|
checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.118",
|
"syn 3.0.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-sink"
|
name = "futures-sink"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
|
checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-task"
|
name = "futures-task"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
|
checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-util"
|
name = "futures-util"
|
||||||
version = "0.3.32"
|
version = "0.3.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
|
checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@@ -1638,9 +1638,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "http-body-util"
|
name = "http-body-util"
|
||||||
version = "0.1.4"
|
version = "0.1.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2"
|
checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@@ -1684,9 +1684,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "1.11.0"
|
version = "1.11.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72"
|
checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atomic-waker",
|
"atomic-waker",
|
||||||
"bytes",
|
"bytes",
|
||||||
@@ -2019,7 +2019,7 @@ dependencies = [
|
|||||||
"js-sys",
|
"js-sys",
|
||||||
"p256",
|
"p256",
|
||||||
"p384",
|
"p384",
|
||||||
"pem",
|
"pem 3.0.6",
|
||||||
"rand 0.8.7",
|
"rand 0.8.7",
|
||||||
"rsa",
|
"rsa",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -2096,7 +2096,7 @@ dependencies = [
|
|||||||
"jsonpath-rust",
|
"jsonpath-rust",
|
||||||
"k8s-openapi",
|
"k8s-openapi",
|
||||||
"kube-core",
|
"kube-core",
|
||||||
"pem",
|
"pem 3.0.6",
|
||||||
"rustls",
|
"rustls",
|
||||||
"rustls-platform-verifier",
|
"rustls-platform-verifier",
|
||||||
"secrecy",
|
"secrecy",
|
||||||
@@ -2239,9 +2239,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.33"
|
version = "0.4.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_core",
|
"serde_core",
|
||||||
]
|
]
|
||||||
@@ -2373,9 +2373,9 @@ checksum = "9bb517913cfcfb9eeda59f36020269075a152701a01606c612f547e4890be399"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "moka"
|
name = "moka"
|
||||||
version = "0.12.15"
|
version = "0.12.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046"
|
checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"crossbeam-epoch",
|
"crossbeam-epoch",
|
||||||
@@ -2505,16 +2505,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "noyalib"
|
name = "noyalib"
|
||||||
version = "0.0.18"
|
version = "0.0.32"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ccc67d13e91577493ff12d930fcdc92a342b46e2299210089d90d2caed837f60"
|
checksum = "190b855ac3a2a1ff710c203db23da6aec67f4317af6e226960d40f181ceeccac"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"hashbrown 0.17.1",
|
||||||
"indexmap 2.14.0",
|
"indexmap 2.14.0",
|
||||||
"itoa",
|
"itoa",
|
||||||
|
"libm",
|
||||||
"memchr",
|
"memchr",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
"ryu",
|
"ryu",
|
||||||
"serde",
|
"serde_core",
|
||||||
"serde_ignored",
|
"serde_ignored",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
]
|
]
|
||||||
@@ -2760,6 +2762,16 @@ dependencies = [
|
|||||||
"serde_core",
|
"serde_core",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pem"
|
||||||
|
version = "4.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d354a98a3d1251555de99e8fdd8afda05573c31b82f59063a7b0a29b5527f120"
|
||||||
|
dependencies = [
|
||||||
|
"base64 0.23.1",
|
||||||
|
"serde_core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pem-rfc7468"
|
name = "pem-rfc7468"
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
@@ -3357,12 +3369,12 @@ checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rcgen"
|
name = "rcgen"
|
||||||
version = "0.14.8"
|
version = "0.14.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "57f6d249aad744e274e682777a50283a225a32705394ee6d5fcc01efa25e4055"
|
checksum = "8774e05a7d0de114588e6a28fe7e71694b82614ed569d86d8b389dfbc98b8ad8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aws-lc-rs",
|
"aws-lc-rs",
|
||||||
"pem",
|
"pem 4.0.0",
|
||||||
"ring",
|
"ring",
|
||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
"time",
|
"time",
|
||||||
@@ -4356,9 +4368,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-http"
|
name = "tower-http"
|
||||||
version = "0.7.0"
|
version = "0.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233"
|
checksum = "08a05a66a4fdd61cbbe0a1d755ffe0ca6aba159dd4820936a0ff8a8278245b9c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.13.0",
|
"bitflags 2.13.0",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
|||||||
+10
-10
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "aralez"
|
name = "aralez"
|
||||||
version = "0.92.19"
|
version = "0.93.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
description = "Reverse proxy built on top of Cloudflare's Pingora"
|
description = "Reverse proxy built on top of Cloudflare's Pingora"
|
||||||
@@ -23,12 +23,12 @@ pingora-http = "0.8.1"
|
|||||||
pingora-limits = "0.8.1"
|
pingora-limits = "0.8.1"
|
||||||
pingora-cache = "0.8.1"
|
pingora-cache = "0.8.1"
|
||||||
dashmap = "7.0.0-rc2"
|
dashmap = "7.0.0-rc2"
|
||||||
async-trait = "0.1.91"
|
async-trait = "0.1.92"
|
||||||
log = "0.4.33"
|
log = "0.4.34"
|
||||||
notify = "9.0.0-rc.4"
|
notify = "9.0.0-rc.4"
|
||||||
axum = { version = "0.8.9" }
|
axum = { version = "0.8.9" }
|
||||||
serde = { version = "1.0.229", features = ["derive"] }
|
serde = { version = "1.0.229", features = ["derive"] }
|
||||||
noyalib = { version = "0.0.18", features = ["compat-serde-yaml"] }
|
noyalib = { version = "0.0.32", features = ["compat-serde-yaml"] }
|
||||||
rand = "0.10.2"
|
rand = "0.10.2"
|
||||||
base64 = "0.23.1"
|
base64 = "0.23.1"
|
||||||
jsonwebtoken = { version = "11.0.0", default-features = false, features = ["use_pem", "rust_crypto"] }
|
jsonwebtoken = { version = "11.0.0", default-features = false, features = ["use_pem", "rust_crypto"] }
|
||||||
@@ -39,26 +39,26 @@ arc-swap = "1.9.2"
|
|||||||
prometheus = "0.14.0"
|
prometheus = "0.14.0"
|
||||||
x509-parser = "0.18.1"
|
x509-parser = "0.18.1"
|
||||||
rustls-pemfile = "2.2.0"
|
rustls-pemfile = "2.2.0"
|
||||||
tower-http = { version = "0.7.0", features = ["fs"] }
|
tower-http = { version = "0.7.1", features = ["fs"] }
|
||||||
privdrop = "0.5.6"
|
privdrop = "0.5.6"
|
||||||
serde_json = "1.0.151"
|
serde_json = "1.0.151"
|
||||||
subtle = "2.6.1"
|
subtle = "2.6.1"
|
||||||
moka = { version = "0.12.15", features = ["sync"] }
|
moka = { version = "0.12.16", features = ["sync"] }
|
||||||
ahash = "0.8.12"
|
ahash = "0.8.12"
|
||||||
instant-acme = "0.8.5"
|
instant-acme = "0.8.5"
|
||||||
rcgen = "0.14.8"
|
rcgen = "0.14.10"
|
||||||
log4rs = { version = "1.4.0", features = ["rolling_file_appender", "compound_policy", "size_trigger", "fixed_window_roller", "gzip"] }
|
log4rs = { version = "1.4.0", features = ["rolling_file_appender", "compound_policy", "size_trigger", "fixed_window_roller", "gzip"] }
|
||||||
mimalloc = { version = "0.1.52", default-features = false }
|
mimalloc = { version = "0.1.52", default-features = false }
|
||||||
signal-hook = "0.4.4"
|
signal-hook = "0.4.4"
|
||||||
sd-notify = "0.5.0"
|
sd-notify = "0.5.0"
|
||||||
libc = "0.2.186"
|
libc = "0.2.186"
|
||||||
tokio-native-tls = "0.3.1"
|
tokio-native-tls = "0.3.1"
|
||||||
hyper = "1.11.0"
|
hyper = "1.11.1"
|
||||||
hyper-util = "0.1.20"
|
hyper-util = "0.1.20"
|
||||||
http-body-util = "0.1.4"
|
http-body-util = "0.1.5"
|
||||||
bytes = "1.12.1"
|
bytes = "1.12.1"
|
||||||
|
|
||||||
rustls = { version = "0.23", default-features = false, features = ["ring"] }
|
rustls = { version = "0.23", default-features = false, features = ["ring"] }
|
||||||
kube = { version = "4.2.0", features = ["runtime", "client", "derive"] }
|
kube = { version = "4.2.0", features = ["runtime", "client", "derive"] }
|
||||||
k8s-openapi = { version = "0.28.0", features = ["v1_32"] }
|
k8s-openapi = { version = "0.28.0", features = ["v1_32"] }
|
||||||
futures = "0.3"
|
futures = "0.3.34"
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
job "apache" {
|
||||||
|
meta {
|
||||||
|
uuid = uuidv4()
|
||||||
|
}
|
||||||
|
datacenters = ["eu-ams-1"]
|
||||||
|
type = "service"
|
||||||
|
constraint {
|
||||||
|
attribute = node.unique.name
|
||||||
|
operator = "regexp"
|
||||||
|
value = "consul[0-9]"
|
||||||
|
}
|
||||||
|
update {
|
||||||
|
max_parallel = 1
|
||||||
|
min_healthy_time = "10s"
|
||||||
|
healthy_deadline = "3m"
|
||||||
|
progress_deadline = "10m"
|
||||||
|
auto_revert = false
|
||||||
|
canary = 0
|
||||||
|
}
|
||||||
|
migrate {
|
||||||
|
max_parallel = 1
|
||||||
|
health_check = "checks"
|
||||||
|
min_healthy_time = "10s"
|
||||||
|
healthy_deadline = "5m"
|
||||||
|
}
|
||||||
|
group "Apache" {
|
||||||
|
network {
|
||||||
|
port "apache" { to = 80 }
|
||||||
|
}
|
||||||
|
constraint {
|
||||||
|
operator = "distinct_hosts"
|
||||||
|
value = "true"
|
||||||
|
}
|
||||||
|
count = 3
|
||||||
|
restart {
|
||||||
|
attempts = 2
|
||||||
|
interval = "30m"
|
||||||
|
delay = "15s"
|
||||||
|
mode = "fail"
|
||||||
|
}
|
||||||
|
task "health" {
|
||||||
|
service {
|
||||||
|
port = "apache"
|
||||||
|
tags = [
|
||||||
|
"aralez.service=yes",
|
||||||
|
"aralez.host=apache.example.com",
|
||||||
|
"aralez.path=/",
|
||||||
|
"aralez.redirect=http://checkip.amazonaws.com"
|
||||||
|
]
|
||||||
|
check {
|
||||||
|
type = "http"
|
||||||
|
port = "apache"
|
||||||
|
path = "/"
|
||||||
|
interval = "5s"
|
||||||
|
timeout = "2s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
driver = "docker"
|
||||||
|
config {
|
||||||
|
image = "httpd:latest"
|
||||||
|
force_pull = true
|
||||||
|
ports = ["apache"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
job "echo" {
|
||||||
|
meta {
|
||||||
|
uuid = uuidv4()
|
||||||
|
}
|
||||||
|
datacenters = ["eu-ams-1"]
|
||||||
|
type = "service"
|
||||||
|
constraint {
|
||||||
|
attribute = node.unique.name
|
||||||
|
operator = "regexp"
|
||||||
|
value = "consul[0-9]"
|
||||||
|
}
|
||||||
|
update {
|
||||||
|
max_parallel = 1
|
||||||
|
min_healthy_time = "10s"
|
||||||
|
healthy_deadline = "3m"
|
||||||
|
progress_deadline = "10m"
|
||||||
|
auto_revert = false
|
||||||
|
canary = 0
|
||||||
|
}
|
||||||
|
migrate {
|
||||||
|
max_parallel = 1
|
||||||
|
health_check = "checks"
|
||||||
|
min_healthy_time = "10s"
|
||||||
|
healthy_deadline = "5m"
|
||||||
|
}
|
||||||
|
group "Echo" {
|
||||||
|
network {
|
||||||
|
port "echo" { to = 80 }
|
||||||
|
}
|
||||||
|
constraint {
|
||||||
|
operator = "distinct_hosts"
|
||||||
|
value = "true"
|
||||||
|
}
|
||||||
|
count = 3
|
||||||
|
restart {
|
||||||
|
attempts = 2
|
||||||
|
interval = "30m"
|
||||||
|
delay = "15s"
|
||||||
|
mode = "fail"
|
||||||
|
}
|
||||||
|
task "server" {
|
||||||
|
service {
|
||||||
|
port = "echo"
|
||||||
|
tags = [
|
||||||
|
"aralez.service=yes",
|
||||||
|
"aralez.host=echo.example.com",
|
||||||
|
"aralez.path=/",
|
||||||
|
"aralez.rate=20",
|
||||||
|
"aralez.4xx_rate=10",
|
||||||
|
"aralez.to_https=true",
|
||||||
|
"aralez.client_header=X-Client-Header:Some simple header",
|
||||||
|
"aralez.server_header=X-Server-Header:Some simple header",
|
||||||
|
]
|
||||||
|
check {
|
||||||
|
type = "http"
|
||||||
|
port = "echo"
|
||||||
|
path = "/"
|
||||||
|
interval = "5s"
|
||||||
|
timeout = "2s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
driver = "docker"
|
||||||
|
config {
|
||||||
|
image = "ealen/echo-server:latest"
|
||||||
|
force_pull = true
|
||||||
|
ports = ["echo"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
job "nginx" {
|
||||||
|
meta {
|
||||||
|
uuid = uuidv4()
|
||||||
|
}
|
||||||
|
datacenters = ["eu-ams-1"]
|
||||||
|
type = "service"
|
||||||
|
constraint {
|
||||||
|
attribute = node.unique.name
|
||||||
|
operator = "regexp"
|
||||||
|
value = "consul[0-9]"
|
||||||
|
}
|
||||||
|
update {
|
||||||
|
max_parallel = 1
|
||||||
|
min_healthy_time = "10s"
|
||||||
|
healthy_deadline = "3m"
|
||||||
|
progress_deadline = "10m"
|
||||||
|
auto_revert = false
|
||||||
|
canary = 0
|
||||||
|
}
|
||||||
|
migrate {
|
||||||
|
max_parallel = 1
|
||||||
|
health_check = "checks"
|
||||||
|
min_healthy_time = "10s"
|
||||||
|
healthy_deadline = "5m"
|
||||||
|
}
|
||||||
|
group "NginX" {
|
||||||
|
network {
|
||||||
|
port "nginx" { to = 80 }
|
||||||
|
}
|
||||||
|
constraint {
|
||||||
|
operator = "distinct_hosts"
|
||||||
|
value = "true"
|
||||||
|
}
|
||||||
|
count = 3
|
||||||
|
restart {
|
||||||
|
attempts = 2
|
||||||
|
interval = "30m"
|
||||||
|
delay = "15s"
|
||||||
|
mode = "fail"
|
||||||
|
}
|
||||||
|
task "server" {
|
||||||
|
service {
|
||||||
|
port = "nginx"
|
||||||
|
tags = [
|
||||||
|
"aralez.service=yes",
|
||||||
|
"aralez.host=nginx.example.com",
|
||||||
|
"aralez.path=/",
|
||||||
|
"aralez.rate=1",
|
||||||
|
"aralez.4xx_rate=10",
|
||||||
|
"aralez.to_https=true",
|
||||||
|
"aralez.client_header=X-Some:Some Random Header",
|
||||||
|
"aralez.client_header=X-Emos:Redaeh Modnar Emos",
|
||||||
|
"aralez.server_header=X-From:Aralez & Consul",
|
||||||
|
"aralez.server_header=X-Mrof: Lusnoc & Zelara",
|
||||||
|
]
|
||||||
|
check {
|
||||||
|
type = "http"
|
||||||
|
port = "nginx"
|
||||||
|
path = "/"
|
||||||
|
interval = "5s"
|
||||||
|
timeout = "2s"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
driver = "docker"
|
||||||
|
config {
|
||||||
|
image = "nginx:latest"
|
||||||
|
force_pull = true
|
||||||
|
ports = ["nginx"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
pub mod auth;
|
pub mod auth;
|
||||||
|
pub mod consul;
|
||||||
pub mod discovery;
|
pub mod discovery;
|
||||||
mod filewatch;
|
mod filewatch;
|
||||||
pub mod fordebug;
|
pub mod fordebug;
|
||||||
@@ -8,6 +9,7 @@ pub mod healthcheck;
|
|||||||
pub mod httpclient;
|
pub mod httpclient;
|
||||||
pub mod jwt;
|
pub mod jwt;
|
||||||
pub mod kuberconsul;
|
pub mod kuberconsul;
|
||||||
|
pub mod kubernetes;
|
||||||
pub mod kubewatcher;
|
pub mod kubewatcher;
|
||||||
pub mod lazylock;
|
pub mod lazylock;
|
||||||
pub mod metrics;
|
pub mod metrics;
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
use crate::utils::httpclient;
|
||||||
|
use crate::utils::kuberconsul::{list_to_upstreams, ServiceDiscovery};
|
||||||
|
use crate::utils::parceyaml::build_headers;
|
||||||
|
use crate::utils::structs::{Configuration, GlobalServiceMapping, UpstreamsDashMap};
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use dashmap::DashMap;
|
||||||
|
use pingora::prelude::sleep;
|
||||||
|
use rand::RngExt;
|
||||||
|
use serde::Deserialize;
|
||||||
|
use std::env;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::time::Duration;
|
||||||
|
use tokio::sync::mpsc::Sender;
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
pub struct ConsulService {
|
||||||
|
#[serde(rename = "Address")]
|
||||||
|
pub address: String,
|
||||||
|
#[serde(rename = "ServicePort")]
|
||||||
|
pub port: u16,
|
||||||
|
}
|
||||||
|
pub struct ConsulDiscovery;
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl ServiceDiscovery for ConsulDiscovery {
|
||||||
|
async fn fetch_upstreams(&self, config: Arc<Configuration>, toreturn: Sender<Configuration>) {
|
||||||
|
loop {
|
||||||
|
let upstreams = UpstreamsDashMap::new();
|
||||||
|
|
||||||
|
if let Some(consul) = config.consul.clone() {
|
||||||
|
let servers = consul.servers.unwrap_or_else(|| {
|
||||||
|
vec![format!(
|
||||||
|
"{}:{}",
|
||||||
|
env::var("CONSUL_SERVICE_HOST").unwrap_or_else(|_| "0.0.0.0".to_string()),
|
||||||
|
env::var("CONSUL_SERVICE_PORT").unwrap_or_else(|_| "0".to_string())
|
||||||
|
)]
|
||||||
|
});
|
||||||
|
let end = servers.len().saturating_sub(1);
|
||||||
|
let num = if end > 0 { rand::rng().random_range(0..end) } else { 0 };
|
||||||
|
let consul_data = servers.get(num).unwrap().to_string();
|
||||||
|
let ss = format!("{}/v1/catalog/service/", consul_data);
|
||||||
|
let dc = format!("{}/v1/catalog/services?filter=%22aralez.service=yes%22+in+ServiceTags", consul_data);
|
||||||
|
|
||||||
|
if let Some(infolist) = httpclient::for_consul_list(dc.as_str(), consul.token.clone()).await {
|
||||||
|
for (k, v) in infolist {
|
||||||
|
let client_header_map: DashMap<Arc<str>, Vec<(String, Arc<str>)>> = DashMap::new();
|
||||||
|
let mut client_header_list = Vec::new();
|
||||||
|
build_headers(&v.client_headers, config.as_ref(), &mut client_header_list);
|
||||||
|
|
||||||
|
let sever_header_map: DashMap<Arc<str>, Vec<(String, Arc<str>)>> = DashMap::new();
|
||||||
|
let mut server_header_list = Vec::new();
|
||||||
|
build_headers(&v.server_headers, config.as_ref(), &mut server_header_list);
|
||||||
|
|
||||||
|
if !client_header_list.is_empty() {
|
||||||
|
let path_key = v.path.clone();
|
||||||
|
client_header_map.insert(Arc::from(path_key), client_header_list);
|
||||||
|
config.client_headers.insert(Arc::from(v.host.clone()), client_header_map);
|
||||||
|
}
|
||||||
|
if !server_header_list.is_empty() {
|
||||||
|
let path_key = v.path.clone();
|
||||||
|
sever_header_map.insert(Arc::from(path_key), server_header_list);
|
||||||
|
config.server_headers.insert(Arc::from(v.host.clone()), sever_header_map);
|
||||||
|
}
|
||||||
|
let pref = format!("{}{}", ss, k);
|
||||||
|
let gsm = &GlobalServiceMapping {
|
||||||
|
upstream: k.clone(),
|
||||||
|
hostname: v.host.clone(),
|
||||||
|
path: Some(v.path),
|
||||||
|
to_https: v.to_https,
|
||||||
|
redirect_to: v.redirect,
|
||||||
|
authorization: v.auth,
|
||||||
|
rate_limit: v.rate,
|
||||||
|
x4xx_limit: v.xrate,
|
||||||
|
client_headers: v.client_headers,
|
||||||
|
server_headers: v.server_headers,
|
||||||
|
};
|
||||||
|
|
||||||
|
let list = httpclient::for_consul(pref.as_str(), consul.token.clone(), gsm).await;
|
||||||
|
list_to_upstreams(list, &upstreams, gsm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(lt) = crate::utils::kuberconsul::clone_compare(&upstreams, &config).await {
|
||||||
|
let _ = toreturn.send(lt).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(Duration::from_secs(5)).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
|
use crate::utils::consul::ConsulDiscovery;
|
||||||
use crate::utils::filewatch;
|
use crate::utils::filewatch;
|
||||||
use crate::utils::kuberconsul::{ConsulDiscovery, KubernetesDiscovery, ServiceDiscovery};
|
use crate::utils::kuberconsul::ServiceDiscovery;
|
||||||
|
use crate::utils::kubernetes::KubernetesDiscovery;
|
||||||
use crate::utils::structs::{Configuration, UpstreamsDashMap};
|
use crate::utils::structs::{Configuration, UpstreamsDashMap};
|
||||||
use crate::web::webserver;
|
use crate::web::webserver;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
|||||||
+75
-6
@@ -1,33 +1,95 @@
|
|||||||
use crate::utils::kuberconsul::{match_path, ConsulService, KubeEndpoints};
|
use crate::utils::consul::ConsulService;
|
||||||
|
use crate::utils::kuberconsul::match_path;
|
||||||
|
use crate::utils::kubernetes::KubeEndpoints;
|
||||||
use crate::utils::structs::{GlobalServiceMapping, InnerMap};
|
use crate::utils::structs::{GlobalServiceMapping, InnerMap};
|
||||||
|
use ahash::HashMap;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use pingora_core::connectors::http::Connector;
|
use pingora_core::connectors::http::Connector;
|
||||||
use pingora_core::listeners::ALPN;
|
use pingora_core::listeners::ALPN;
|
||||||
use pingora_core::prelude::HttpPeer;
|
use pingora_core::prelude::HttpPeer;
|
||||||
use pingora_http::RequestHeader;
|
use pingora_http::RequestHeader;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use std::sync::atomic::AtomicUsize;
|
use std::sync::atomic::AtomicUsize;
|
||||||
use std::sync::{Arc, LazyLock};
|
use std::sync::{Arc, LazyLock};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
pub static CONNECTOR: LazyLock<Connector> = LazyLock::new(|| Connector::new(None));
|
pub static CONNECTOR: LazyLock<Connector> = LazyLock::new(|| Connector::new(None));
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct ConsulServicesInternal {
|
||||||
|
#[serde(rename = "aralez.host")]
|
||||||
|
pub host: String,
|
||||||
|
#[serde(rename = "aralez.path")]
|
||||||
|
pub path: String,
|
||||||
|
#[serde(rename = "aralez.auth")]
|
||||||
|
pub auth: Option<String>,
|
||||||
|
#[serde(rename = "aralez.redirect")]
|
||||||
|
pub redirect: Option<String>,
|
||||||
|
#[serde(rename = "aralez.rate")]
|
||||||
|
pub rate: Option<isize>,
|
||||||
|
#[serde(rename = "aralez.4xx_rate")]
|
||||||
|
pub xrate: Option<u32>,
|
||||||
|
#[serde(rename = "aralez.client_headers")]
|
||||||
|
pub client_headers: Option<Vec<String>>,
|
||||||
|
#[serde(rename = "aralez.server_headers")]
|
||||||
|
pub server_headers: Option<Vec<String>>,
|
||||||
|
#[serde(rename = "aralez.to_https")]
|
||||||
|
pub to_https: Option<bool>,
|
||||||
|
}
|
||||||
|
pub type ConsulServices = HashMap<String, ConsulServicesInternal>;
|
||||||
|
pub async fn for_consul_list(url: &str, token: Option<String>) -> Option<ConsulServices> {
|
||||||
|
if let Some(data) = getfromapi(url, token, "consul").await {
|
||||||
|
let yo = parse_services(data);
|
||||||
|
if let Ok(y) = yo {
|
||||||
|
return Some(y);
|
||||||
|
}
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_services(json: Vec<u8>) -> Result<ConsulServices, serde_json::Error> {
|
||||||
|
let raw: HashMap<String, Vec<String>> = serde_json::from_slice(&json)?;
|
||||||
|
Ok(raw
|
||||||
|
.into_iter()
|
||||||
|
.map(|(service, tags)| {
|
||||||
|
let mut internal = ConsulServicesInternal::default();
|
||||||
|
for tag in tags {
|
||||||
|
if let Some((key, value)) = tag.split_once('=') {
|
||||||
|
match key {
|
||||||
|
"aralez.host" => internal.host = value.to_string(),
|
||||||
|
"aralez.path" => internal.path = value.to_string(),
|
||||||
|
"aralez.rate" => internal.rate = value.parse::<isize>().ok(),
|
||||||
|
"aralez.4xx_rate" => internal.xrate = value.parse::<u32>().ok(),
|
||||||
|
"aralez.to_https" => internal.to_https = value.parse::<bool>().ok(),
|
||||||
|
"aralez.auth" => internal.auth = Option::from(value.to_string()),
|
||||||
|
"aralez.redirect" => internal.redirect = Option::from(value.to_string()),
|
||||||
|
"aralez.client_header" => internal.client_headers.get_or_insert_default().push(value.to_string()),
|
||||||
|
"aralez.server_header" => internal.server_headers.get_or_insert_default().push(value.to_string()),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(service, internal)
|
||||||
|
})
|
||||||
|
.collect())
|
||||||
|
}
|
||||||
pub async fn for_consul(url: &str, token: Option<String>, conf: &GlobalServiceMapping) -> Option<DashMap<Arc<str>, (Vec<Arc<InnerMap>>, AtomicUsize)>> {
|
pub async fn for_consul(url: &str, token: Option<String>, conf: &GlobalServiceMapping) -> Option<DashMap<Arc<str>, (Vec<Arc<InnerMap>>, AtomicUsize)>> {
|
||||||
if let Some(data) = getfromapi(url, token, "consul").await {
|
if let Some(data) = getfromapi(url, token, "consul").await {
|
||||||
let endpoints: Vec<ConsulService> = serde_json::from_slice(&data).ok()?;
|
let endpoints: Vec<ConsulService> = serde_json::from_slice(&data).ok()?;
|
||||||
let mut inner_vec = Vec::new();
|
let mut inner_vec = Vec::new();
|
||||||
let upstreams: DashMap<Arc<str>, (Vec<Arc<InnerMap>>, AtomicUsize)> = DashMap::new();
|
let upstreams: DashMap<Arc<str>, (Vec<Arc<InnerMap>>, AtomicUsize)> = DashMap::new();
|
||||||
for subsets in endpoints {
|
for subsets in endpoints {
|
||||||
let addr = subsets.tagged_addresses.get("lan_ipv4").unwrap().address.clone();
|
|
||||||
let prt = subsets.tagged_addresses.get("lan_ipv4").unwrap().port;
|
|
||||||
let to_add = Arc::from(InnerMap {
|
let to_add = Arc::from(InnerMap {
|
||||||
address: Arc::from(&*addr),
|
address: Arc::from(&*subsets.address),
|
||||||
port: prt,
|
port: subsets.port,
|
||||||
is_ssl: false,
|
is_ssl: false,
|
||||||
is_http2: false,
|
is_http2: false,
|
||||||
to_https: conf.to_https.unwrap_or(false),
|
to_https: conf.to_https.unwrap_or(false),
|
||||||
rate_limit: conf.rate_limit,
|
rate_limit: conf.rate_limit,
|
||||||
x4xx_limit: conf.x4xx_limit,
|
x4xx_limit: conf.x4xx_limit,
|
||||||
redirect_to: None,
|
redirect_to: conf.redirect_to.clone().map(Arc::<str>::from),
|
||||||
healthcheck: None,
|
healthcheck: None,
|
||||||
authorization: None,
|
authorization: None,
|
||||||
});
|
});
|
||||||
@@ -164,3 +226,10 @@ fn parse_url(url: &str) -> Result<(&str, u16, &str, bool), &'static str> {
|
|||||||
|
|
||||||
Ok((host, port, uri, is_https))
|
Ok((host, port, uri, is_https))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fn base64_decode(encoded: &str) -> Option<String> {
|
||||||
|
// let decoded_bytes = general_purpose::STANDARD.decode(encoded).unwrap_or_default();
|
||||||
|
// let decoded: Result<HashMap<String, String>, serde_json::Error> = serde_json::from_slice(&decoded_bytes);
|
||||||
|
// println!("Decoded: {:?}", decoded);
|
||||||
|
// None
|
||||||
|
// }
|
||||||
|
|||||||
+2
-217
@@ -1,63 +1,13 @@
|
|||||||
use crate::utils::httpclient;
|
|
||||||
use crate::utils::kubewatcher::{start_ingress_watcher_with_config, AralezRouteUpdate};
|
|
||||||
use crate::utils::parceyaml::build_headers;
|
|
||||||
use crate::utils::structs::{Configuration, GlobalServiceMapping, InnerMap, UpstreamsDashMap};
|
use crate::utils::structs::{Configuration, GlobalServiceMapping, InnerMap, UpstreamsDashMap};
|
||||||
use crate::utils::tools::{clone_dashmap_into, compare_dashmaps, print_upstreams};
|
use crate::utils::tools::{clone_dashmap_into, compare_dashmaps, print_upstreams};
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use log::error;
|
|
||||||
use pingora::prelude::sleep;
|
|
||||||
use rand::RngExt;
|
|
||||||
use serde::Deserialize;
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::env;
|
|
||||||
use std::fs;
|
|
||||||
use std::path::Path;
|
|
||||||
use std::sync::atomic::AtomicUsize;
|
use std::sync::atomic::AtomicUsize;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
|
||||||
use tokio::fs::File;
|
use tokio::fs::File;
|
||||||
use tokio::io::AsyncReadExt;
|
use tokio::io::AsyncReadExt;
|
||||||
|
|
||||||
use rustls::crypto::ring::default_provider;
|
|
||||||
use rustls::crypto::CryptoProvider;
|
|
||||||
use tokio::sync::mpsc::Sender;
|
use tokio::sync::mpsc::Sender;
|
||||||
|
|
||||||
#[derive(Debug, serde::Deserialize)]
|
|
||||||
pub struct KubeEndpoints {
|
|
||||||
pub subsets: Option<Vec<KubeSubset>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, serde::Deserialize)]
|
|
||||||
pub struct KubeSubset {
|
|
||||||
pub addresses: Option<Vec<KubeAddress>>,
|
|
||||||
pub ports: Option<Vec<KubePort>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, serde::Deserialize)]
|
|
||||||
pub struct KubeAddress {
|
|
||||||
pub ip: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, serde::Deserialize)]
|
|
||||||
pub struct KubePort {
|
|
||||||
pub port: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
pub struct ConsulService {
|
|
||||||
#[serde(rename = "ServiceTaggedAddresses")]
|
|
||||||
pub tagged_addresses: HashMap<String, ConsulTaggedAddress>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
pub struct ConsulTaggedAddress {
|
|
||||||
#[serde(rename = "Address")]
|
|
||||||
pub address: String,
|
|
||||||
#[serde(rename = "Port")]
|
|
||||||
pub port: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(clippy::type_complexity)]
|
#[allow(clippy::type_complexity)]
|
||||||
pub fn list_to_upstreams(lt: Option<DashMap<Arc<str>, (Vec<Arc<InnerMap>>, AtomicUsize)>>, upstreams: &UpstreamsDashMap, i: &GlobalServiceMapping) {
|
pub fn list_to_upstreams(lt: Option<DashMap<Arc<str>, (Vec<Arc<InnerMap>>, AtomicUsize)>>, upstreams: &UpstreamsDashMap, i: &GlobalServiceMapping) {
|
||||||
if let Some(list) = lt {
|
if let Some(list) = lt {
|
||||||
@@ -80,7 +30,7 @@ pub fn match_path(conf: &GlobalServiceMapping, upstreams: &DashMap<Arc<str>, (Ve
|
|||||||
upstreams.insert(Arc::from(path), (values, AtomicUsize::new(0)));
|
upstreams.insert(Arc::from(path), (values, AtomicUsize::new(0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn read_token(path: &str) -> String {
|
pub async fn read_token(path: &str) -> String {
|
||||||
let mut file = File::open(path).await.unwrap();
|
let mut file = File::open(path).await.unwrap();
|
||||||
let mut contents = String::new();
|
let mut contents = String::new();
|
||||||
file.read_to_string(&mut contents).await.unwrap();
|
file.read_to_string(&mut contents).await.unwrap();
|
||||||
@@ -92,172 +42,7 @@ pub trait ServiceDiscovery {
|
|||||||
async fn fetch_upstreams(&self, config: Arc<Configuration>, toreturn: Sender<Configuration>);
|
async fn fetch_upstreams(&self, config: Arc<Configuration>, toreturn: Sender<Configuration>);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct KubernetesDiscovery;
|
pub async fn clone_compare(upstreams: &UpstreamsDashMap, config: &Arc<Configuration>) -> Option<Configuration> {
|
||||||
pub struct ConsulDiscovery;
|
|
||||||
|
|
||||||
#[async_trait]
|
|
||||||
impl ServiceDiscovery for KubernetesDiscovery {
|
|
||||||
async fn fetch_upstreams(&self, config: Arc<Configuration>, toreturn: Sender<Configuration>) {
|
|
||||||
if let Some(kuber) = config.kubernetes.clone() {
|
|
||||||
let servers = kuber.servers.unwrap_or_else(|| {
|
|
||||||
vec![format!(
|
|
||||||
"{}:{}",
|
|
||||||
env::var("KUBERNETES_SERVICE_HOST").unwrap_or_else(|_| "0.0.0.0".to_string()),
|
|
||||||
env::var("KUBERNETES_SERVICE_PORT_HTTPS").unwrap_or_else(|_| "0".to_string())
|
|
||||||
)]
|
|
||||||
});
|
|
||||||
|
|
||||||
let end = servers.len().saturating_sub(1);
|
|
||||||
let num = if end > 0 { rand::rng().random_range(0..end) } else { 0 };
|
|
||||||
let server = servers.get(num).unwrap().to_string();
|
|
||||||
let path = kuber.tokenpath.unwrap_or_else(|| "/var/run/secrets/kubernetes.io/serviceaccount/token".to_string());
|
|
||||||
let namespace = get_current_namespace().unwrap_or_else(|| "default".to_string());
|
|
||||||
let token = read_token(path.as_str()).await;
|
|
||||||
|
|
||||||
if CryptoProvider::get_default().is_none() {
|
|
||||||
default_provider().install_default().expect("Failed to install rustls crypto provider");
|
|
||||||
}
|
|
||||||
|
|
||||||
let (tx, mut rx) = tokio::sync::mpsc::channel::<AralezRouteUpdate>(100);
|
|
||||||
let srv = server.clone();
|
|
||||||
let tok = token.clone();
|
|
||||||
tokio::spawn(async move {
|
|
||||||
if let Err(e) = start_ingress_watcher_with_config(srv.as_str(), tok.as_str(), tx, "aralez").await {
|
|
||||||
error!("Fatal watcher error: {:?}", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let upstreams = UpstreamsDashMap::new();
|
|
||||||
|
|
||||||
while let Some(update) = rx.recv().await {
|
|
||||||
let host_key: Arc<str> = Arc::from(update.host.as_str());
|
|
||||||
|
|
||||||
if update.is_deleted {
|
|
||||||
upstreams.remove(&host_key);
|
|
||||||
config.client_headers.remove(&host_key);
|
|
||||||
} else {
|
|
||||||
let service = GlobalServiceMapping {
|
|
||||||
upstream: update.service_name.clone(),
|
|
||||||
hostname: update.host.clone(),
|
|
||||||
path: Some(update.path.clone()),
|
|
||||||
to_https: None,
|
|
||||||
sticky_sessions: update.sticky_sessions,
|
|
||||||
rate_limit: update.rate_limit,
|
|
||||||
x4xx_limit: update.x4xx_limit,
|
|
||||||
client_headers: None,
|
|
||||||
server_headers: None,
|
|
||||||
};
|
|
||||||
|
|
||||||
let cheader_list: DashMap<Arc<str>, Vec<(String, Arc<str>)>> = DashMap::new();
|
|
||||||
let sheader_list: DashMap<Arc<str>, Vec<(String, Arc<str>)>> = DashMap::new();
|
|
||||||
|
|
||||||
let mut client_headers_list = Vec::new();
|
|
||||||
let mut server_headers_list = Vec::new();
|
|
||||||
|
|
||||||
let mut chl: Option<Vec<String>> = None;
|
|
||||||
let mut shl: Option<Vec<String>> = None;
|
|
||||||
|
|
||||||
if let Some(hdr) = service.client_headers.as_ref() {
|
|
||||||
chl.get_or_insert_with(Vec::new).extend(hdr.iter().cloned());
|
|
||||||
}
|
|
||||||
if let Some(hdr) = service.server_headers.as_ref() {
|
|
||||||
shl.get_or_insert_with(Vec::new).extend(hdr.iter().cloned());
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(ch) = update.client_headers {
|
|
||||||
chl.get_or_insert_with(Vec::new).extend(ch);
|
|
||||||
}
|
|
||||||
if let Some(hdr) = update.server_headers.as_ref() {
|
|
||||||
shl.get_or_insert_with(Vec::new).extend(hdr.iter().cloned());
|
|
||||||
}
|
|
||||||
|
|
||||||
build_headers(&chl, config.as_ref(), &mut client_headers_list);
|
|
||||||
if !client_headers_list.is_empty() {
|
|
||||||
let path_key = service.path.as_deref().unwrap_or("/");
|
|
||||||
cheader_list.insert(Arc::from(path_key), client_headers_list);
|
|
||||||
config.client_headers.insert(host_key.clone(), cheader_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
build_headers(&shl, config.as_ref(), &mut server_headers_list);
|
|
||||||
if !server_headers_list.is_empty() {
|
|
||||||
let path_key = service.path.as_deref().unwrap_or("/");
|
|
||||||
sheader_list.insert(Arc::from(path_key), server_headers_list);
|
|
||||||
config.server_headers.insert(host_key.clone(), sheader_list);
|
|
||||||
}
|
|
||||||
let url = format!("https://{}/api/v1/namespaces/{}/endpoints/{}", server, namespace, update.service_name);
|
|
||||||
let list = httpclient::for_kuber(&url, &token, &service).await;
|
|
||||||
|
|
||||||
if list.is_none() {
|
|
||||||
error!("Endpoint URL: {} returned empty/invalid response", url);
|
|
||||||
}
|
|
||||||
|
|
||||||
list_to_upstreams(list, &upstreams, &service);
|
|
||||||
}
|
|
||||||
if let Some(lt) = clone_compare(&upstreams, &config).await {
|
|
||||||
let _ = toreturn.send(lt).await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_current_namespace() -> Option<String> {
|
|
||||||
let ns_path = "/var/run/secrets/kubernetes.io/serviceaccount/namespace";
|
|
||||||
if Path::new(ns_path).exists() {
|
|
||||||
if let Ok(contents) = fs::read_to_string(ns_path) {
|
|
||||||
return Some(contents.trim().to_string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
env::var("POD_NAMESPACE").ok()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[async_trait]
|
|
||||||
impl ServiceDiscovery for ConsulDiscovery {
|
|
||||||
async fn fetch_upstreams(&self, config: Arc<Configuration>, toreturn: Sender<Configuration>) {
|
|
||||||
loop {
|
|
||||||
let upstreams = UpstreamsDashMap::new();
|
|
||||||
|
|
||||||
if let Some(consul) = config.consul.clone() {
|
|
||||||
let servers = consul.servers.unwrap_or_else(|| {
|
|
||||||
vec![format!(
|
|
||||||
"{}:{}",
|
|
||||||
env::var("CONSUL_SERVICE_HOST").unwrap_or_else(|_| "0.0.0.0".to_string()),
|
|
||||||
env::var("CONSUL_SERVICE_PORT").unwrap_or_else(|_| "0".to_string())
|
|
||||||
)]
|
|
||||||
});
|
|
||||||
let end = servers.len().saturating_sub(1);
|
|
||||||
let num = if end > 0 { rand::rng().random_range(0..end) } else { 0 };
|
|
||||||
let consul_data = servers.get(num).unwrap().to_string();
|
|
||||||
let ss = format!("{}/v1/catalog/service/", consul_data);
|
|
||||||
|
|
||||||
if let Some(svc) = consul.services {
|
|
||||||
for i in &svc {
|
|
||||||
let header_list = DashMap::new();
|
|
||||||
let mut hl = Vec::new();
|
|
||||||
build_headers(&i.client_headers, config.as_ref(), &mut hl);
|
|
||||||
if !hl.is_empty() {
|
|
||||||
let path_key = i.path.as_deref().unwrap_or("/");
|
|
||||||
header_list.insert(Arc::from(path_key), hl);
|
|
||||||
config.client_headers.insert(Arc::from(i.hostname.clone()), header_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
let pref = format!("{}{}", ss, i.upstream);
|
|
||||||
let list = httpclient::for_consul(pref.as_str(), consul.token.clone(), i).await;
|
|
||||||
list_to_upstreams(list, &upstreams, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(lt) = clone_compare(&upstreams, &config).await {
|
|
||||||
let _ = toreturn.send(lt).await;
|
|
||||||
}
|
|
||||||
|
|
||||||
sleep(Duration::from_secs(5)).await;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn clone_compare(upstreams: &UpstreamsDashMap, config: &Arc<Configuration>) -> Option<Configuration> {
|
|
||||||
if !compare_dashmaps(upstreams, &config.upstreams) {
|
if !compare_dashmaps(upstreams, &config.upstreams) {
|
||||||
let tosend = Configuration {
|
let tosend = Configuration {
|
||||||
upstreams: Default::default(),
|
upstreams: Default::default(),
|
||||||
|
|||||||
@@ -0,0 +1,157 @@
|
|||||||
|
use crate::utils::httpclient;
|
||||||
|
use crate::utils::kubewatcher::{start_ingress_watcher_with_config, AralezRouteUpdate};
|
||||||
|
use crate::utils::parceyaml::build_headers;
|
||||||
|
use crate::utils::structs::{Configuration, GlobalServiceMapping, UpstreamsDashMap};
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use dashmap::DashMap;
|
||||||
|
use log::error;
|
||||||
|
use rand::RngExt;
|
||||||
|
use std::env;
|
||||||
|
use std::fs;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::utils::kuberconsul::{clone_compare, list_to_upstreams, ServiceDiscovery};
|
||||||
|
use rustls::crypto::ring::default_provider;
|
||||||
|
use rustls::crypto::CryptoProvider;
|
||||||
|
use tokio::sync::mpsc::Sender;
|
||||||
|
|
||||||
|
#[derive(Debug, serde::Deserialize)]
|
||||||
|
pub struct KubeEndpoints {
|
||||||
|
pub subsets: Option<Vec<KubeSubset>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, serde::Deserialize)]
|
||||||
|
pub struct KubeSubset {
|
||||||
|
pub addresses: Option<Vec<KubeAddress>>,
|
||||||
|
pub ports: Option<Vec<KubePort>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, serde::Deserialize)]
|
||||||
|
pub struct KubeAddress {
|
||||||
|
pub ip: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, serde::Deserialize)]
|
||||||
|
pub struct KubePort {
|
||||||
|
pub port: u16,
|
||||||
|
}
|
||||||
|
pub struct KubernetesDiscovery;
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl ServiceDiscovery for KubernetesDiscovery {
|
||||||
|
async fn fetch_upstreams(&self, config: Arc<Configuration>, toreturn: Sender<Configuration>) {
|
||||||
|
if let Some(kuber) = config.kubernetes.clone() {
|
||||||
|
let servers = kuber.servers.unwrap_or_else(|| {
|
||||||
|
vec![format!(
|
||||||
|
"{}:{}",
|
||||||
|
env::var("KUBERNETES_SERVICE_HOST").unwrap_or_else(|_| "0.0.0.0".to_string()),
|
||||||
|
env::var("KUBERNETES_SERVICE_PORT_HTTPS").unwrap_or_else(|_| "0".to_string())
|
||||||
|
)]
|
||||||
|
});
|
||||||
|
|
||||||
|
let end = servers.len().saturating_sub(1);
|
||||||
|
let num = if end > 0 { rand::rng().random_range(0..end) } else { 0 };
|
||||||
|
let server = servers.get(num).unwrap().to_string();
|
||||||
|
let path = kuber.tokenpath.unwrap_or_else(|| "/var/run/secrets/kubernetes.io/serviceaccount/token".to_string());
|
||||||
|
let namespace = get_current_namespace().unwrap_or_else(|| "default".to_string());
|
||||||
|
let token = crate::utils::kuberconsul::read_token(path.as_str()).await;
|
||||||
|
|
||||||
|
if CryptoProvider::get_default().is_none() {
|
||||||
|
default_provider().install_default().expect("Failed to install rustls crypto provider");
|
||||||
|
}
|
||||||
|
|
||||||
|
let (tx, mut rx) = tokio::sync::mpsc::channel::<AralezRouteUpdate>(100);
|
||||||
|
let srv = server.clone();
|
||||||
|
let tok = token.clone();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
if let Err(e) = start_ingress_watcher_with_config(srv.as_str(), tok.as_str(), tx, "aralez").await {
|
||||||
|
error!("Fatal watcher error: {:?}", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let upstreams = UpstreamsDashMap::new();
|
||||||
|
|
||||||
|
while let Some(update) = rx.recv().await {
|
||||||
|
let host_key: Arc<str> = Arc::from(update.host.as_str());
|
||||||
|
|
||||||
|
if update.is_deleted {
|
||||||
|
upstreams.remove(&host_key);
|
||||||
|
config.client_headers.remove(&host_key);
|
||||||
|
} else {
|
||||||
|
let service = GlobalServiceMapping {
|
||||||
|
upstream: update.service_name.clone(),
|
||||||
|
hostname: update.host.clone(),
|
||||||
|
path: Some(update.path.clone()),
|
||||||
|
to_https: None,
|
||||||
|
redirect_to: None,
|
||||||
|
authorization: None,
|
||||||
|
// sticky_sessions: update.sticky_sessions,
|
||||||
|
rate_limit: update.rate_limit,
|
||||||
|
x4xx_limit: update.x4xx_limit,
|
||||||
|
client_headers: None,
|
||||||
|
server_headers: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let cheader_list: DashMap<Arc<str>, Vec<(String, Arc<str>)>> = DashMap::new();
|
||||||
|
let sheader_list: DashMap<Arc<str>, Vec<(String, Arc<str>)>> = DashMap::new();
|
||||||
|
|
||||||
|
let mut client_headers_list = Vec::new();
|
||||||
|
let mut server_headers_list = Vec::new();
|
||||||
|
|
||||||
|
let mut chl: Option<Vec<String>> = None;
|
||||||
|
let mut shl: Option<Vec<String>> = None;
|
||||||
|
|
||||||
|
if let Some(hdr) = service.client_headers.as_ref() {
|
||||||
|
chl.get_or_insert_with(Vec::new).extend(hdr.iter().cloned());
|
||||||
|
}
|
||||||
|
if let Some(hdr) = service.server_headers.as_ref() {
|
||||||
|
shl.get_or_insert_with(Vec::new).extend(hdr.iter().cloned());
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(ch) = update.client_headers {
|
||||||
|
chl.get_or_insert_with(Vec::new).extend(ch);
|
||||||
|
}
|
||||||
|
if let Some(hdr) = update.server_headers.as_ref() {
|
||||||
|
shl.get_or_insert_with(Vec::new).extend(hdr.iter().cloned());
|
||||||
|
}
|
||||||
|
|
||||||
|
build_headers(&chl, config.as_ref(), &mut client_headers_list);
|
||||||
|
if !client_headers_list.is_empty() {
|
||||||
|
let path_key = service.path.as_deref().unwrap_or("/");
|
||||||
|
cheader_list.insert(Arc::from(path_key), client_headers_list);
|
||||||
|
config.client_headers.insert(host_key.clone(), cheader_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
build_headers(&shl, config.as_ref(), &mut server_headers_list);
|
||||||
|
if !server_headers_list.is_empty() {
|
||||||
|
let path_key = service.path.as_deref().unwrap_or("/");
|
||||||
|
sheader_list.insert(Arc::from(path_key), server_headers_list);
|
||||||
|
config.server_headers.insert(host_key.clone(), sheader_list);
|
||||||
|
}
|
||||||
|
let url = format!("https://{}/api/v1/namespaces/{}/endpoints/{}", server, namespace, update.service_name);
|
||||||
|
let list = httpclient::for_kuber(&url, &token, &service).await;
|
||||||
|
|
||||||
|
if list.is_none() {
|
||||||
|
error!("Endpoint URL: {} returned empty/invalid response", url);
|
||||||
|
}
|
||||||
|
|
||||||
|
list_to_upstreams(list, &upstreams, &service);
|
||||||
|
}
|
||||||
|
if let Some(lt) = clone_compare(&upstreams, &config).await {
|
||||||
|
let _ = toreturn.send(lt).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_current_namespace() -> Option<String> {
|
||||||
|
let ns_path = "/var/run/secrets/kubernetes.io/serviceaccount/namespace";
|
||||||
|
if Path::new(ns_path).exists() {
|
||||||
|
if let Ok(contents) = fs::read_to_string(ns_path) {
|
||||||
|
return Some(contents.trim().to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
env::var("POD_NAMESPACE").ok()
|
||||||
|
}
|
||||||
+82
-15
@@ -47,28 +47,83 @@ pub static REQUESTS_BY_UPSTREAM: LazyLock<IntCounterVec> =
|
|||||||
|
|
||||||
pub static REQUESTS_BY_VERSION: LazyLock<IntCounterVec> =
|
pub static REQUESTS_BY_VERSION: LazyLock<IntCounterVec> =
|
||||||
LazyLock::new(|| register_int_counter_vec!("aralez_requests_by_version_total", "Number of requests by HTTP versions", &["version"]).unwrap());
|
LazyLock::new(|| register_int_counter_vec!("aralez_requests_by_version_total", "Number of requests by HTTP versions", &["version"]).unwrap());
|
||||||
|
pub static HTTP_11_COUNT: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/1.1"]));
|
||||||
|
pub static HTTP_20_COUNT: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/2.0"]));
|
||||||
|
pub static HTTP_30_COUNT: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/3.0"]));
|
||||||
|
pub static HTTP_10_COUNT: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["HTTP/1.0"]));
|
||||||
|
pub static HTTP_UNK_COUNT: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_VERSION.with_label_values(&["Unknown"]));
|
||||||
|
|
||||||
|
pub static METHOD_GET: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["GET"]));
|
||||||
|
pub static METHOD_POST: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["POST"]));
|
||||||
|
pub static METHOD_PUT: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["PUT"]));
|
||||||
|
pub static METHOD_DELETE: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["DELETE"]));
|
||||||
|
pub static METHOD_HEAD: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["HEAD"]));
|
||||||
|
pub static METHOD_OPTIONS: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["OPTIONS"]));
|
||||||
|
pub static METHOD_PATCH: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["PATCH"]));
|
||||||
|
pub static METHOD_OTHER: LazyLock<IntCounter> = LazyLock::new(|| REQUESTS_BY_METHOD.with_label_values(&["OTHER"]));
|
||||||
|
|
||||||
|
pub static STATUS_100: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["100"]));
|
||||||
|
pub static STATUS_101: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["101"]));
|
||||||
|
pub static STATUS_200: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["200"]));
|
||||||
|
pub static STATUS_204: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["204"]));
|
||||||
|
pub static STATUS_301: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["301"]));
|
||||||
|
pub static STATUS_302: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["302"]));
|
||||||
|
pub static STATUS_304: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["304"]));
|
||||||
|
pub static STATUS_400: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["400"]));
|
||||||
|
pub static STATUS_403: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["403"]));
|
||||||
|
pub static STATUS_404: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["404"]));
|
||||||
|
pub static STATUS_500: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["500"]));
|
||||||
|
pub static STATUS_501: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["501"]));
|
||||||
|
pub static STATUS_502: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["502"]));
|
||||||
|
pub static STATUS_503: LazyLock<IntCounter> = LazyLock::new(|| RESPONSE_CODES.with_label_values(&["503"]));
|
||||||
|
|
||||||
pub fn calc_metrics(metric_types: &MetricTypes) {
|
pub fn calc_metrics(metric_types: &MetricTypes) {
|
||||||
REQUEST_COUNT.inc();
|
REQUEST_COUNT.inc();
|
||||||
let version_str = match metric_types.version {
|
match metric_types.version {
|
||||||
Version::HTTP_11 => "HTTP/1.1",
|
Version::HTTP_11 => HTTP_11_COUNT.inc(),
|
||||||
Version::HTTP_2 => "HTTP/2.0",
|
Version::HTTP_2 => HTTP_20_COUNT.inc(),
|
||||||
Version::HTTP_3 => "HTTP/3.0",
|
Version::HTTP_3 => HTTP_30_COUNT.inc(),
|
||||||
Version::HTTP_10 => "HTTP/1.0",
|
Version::HTTP_10 => HTTP_10_COUNT.inc(),
|
||||||
_ => "Unknown",
|
_ => HTTP_UNK_COUNT.inc(),
|
||||||
};
|
};
|
||||||
REQUESTS_BY_VERSION.with_label_values(&[version_str]).inc();
|
match metric_types.method.as_str() {
|
||||||
RESPONSE_CODES.with_label_values(&[metric_types.code.unwrap_or(StatusCode::GONE).as_str()]).inc();
|
"GET" => METHOD_GET.inc(),
|
||||||
REQUESTS_BY_METHOD.with_label_values(&[metric_types.method.as_str()]).inc();
|
"POST" => METHOD_POST.inc(),
|
||||||
|
"PUT" => METHOD_PUT.inc(),
|
||||||
|
"DELETE" => METHOD_DELETE.inc(),
|
||||||
|
"HEAD" => METHOD_HEAD.inc(),
|
||||||
|
"OPTIONS" => METHOD_OPTIONS.inc(),
|
||||||
|
"PATCH" => METHOD_PATCH.inc(),
|
||||||
|
_ => METHOD_OTHER.inc(),
|
||||||
|
}
|
||||||
|
let code = metric_types.code.unwrap_or(StatusCode::GONE);
|
||||||
|
match code.as_u16() {
|
||||||
|
100 => STATUS_100.inc(),
|
||||||
|
101 => STATUS_101.inc(),
|
||||||
|
200 => STATUS_200.inc(),
|
||||||
|
204 => STATUS_204.inc(),
|
||||||
|
301 => STATUS_301.inc(),
|
||||||
|
302 => STATUS_302.inc(),
|
||||||
|
304 => STATUS_304.inc(),
|
||||||
|
400 => STATUS_400.inc(),
|
||||||
|
403 => STATUS_403.inc(),
|
||||||
|
404 => STATUS_404.inc(),
|
||||||
|
500 => STATUS_500.inc(),
|
||||||
|
501 => STATUS_501.inc(),
|
||||||
|
502 => STATUS_502.inc(),
|
||||||
|
503 => STATUS_503.inc(),
|
||||||
|
_ => RESPONSE_CODES.with_label_values(&[code.as_str()]).inc(), // Fallback for rare status codes
|
||||||
|
}
|
||||||
|
|
||||||
REQUESTS_BY_UPSTREAM.with_label_values(&[metric_types.upstream.as_ref()]).inc();
|
REQUESTS_BY_UPSTREAM.with_label_values(&[metric_types.upstream.as_ref()]).inc();
|
||||||
RESPONSE_LATENCY.observe(metric_types.latency.as_secs_f64());
|
RESPONSE_LATENCY.observe(metric_types.latency.as_secs_f64());
|
||||||
|
|
||||||
if let Some(eviction) = EVICTION.get() {
|
// if let Some(eviction) = EVICTION.get() {
|
||||||
CACHE_SIZE_BYTES.set(eviction.total_size() as i64);
|
// CACHE_SIZE_BYTES.set(eviction.total_size() as i64);
|
||||||
CACHE_ITEMS.set(eviction.total_items() as i64);
|
// CACHE_ITEMS.set(eviction.total_items() as i64);
|
||||||
CACHE_EVICTED_BYTES.set(eviction.evicted_size() as i64);
|
// CACHE_EVICTED_BYTES.set(eviction.evicted_size() as i64);
|
||||||
CACHE_EVICTED_ITEMS.set(eviction.evicted_items() as i64);
|
// CACHE_EVICTED_ITEMS.set(eviction.evicted_items() as i64);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn get_memory_usage() -> usize {
|
pub(crate) fn get_memory_usage() -> usize {
|
||||||
@@ -87,3 +142,15 @@ pub(crate) fn get_memory_usage() -> usize {
|
|||||||
pub fn get_open_files() -> usize {
|
pub fn get_open_files() -> usize {
|
||||||
std::fs::read_dir("/proc/self/fd").map(|dir| dir.count()).unwrap_or(0)
|
std::fs::read_dir("/proc/self/fd").map(|dir| dir.count()).unwrap_or(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn calc_cache_metrics() {
|
||||||
|
loop {
|
||||||
|
if let Some(eviction) = EVICTION.get() {
|
||||||
|
CACHE_SIZE_BYTES.set(eviction.total_size() as i64);
|
||||||
|
CACHE_ITEMS.set(eviction.total_items() as i64);
|
||||||
|
CACHE_EVICTED_BYTES.set(eviction.evicted_size() as i64);
|
||||||
|
CACHE_EVICTED_ITEMS.set(eviction.evicted_items() as i64);
|
||||||
|
}
|
||||||
|
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,14 +16,3 @@ pub fn is_first_run() -> bool {
|
|||||||
let state = GLOBAL_STATE.read().unwrap();
|
let state = GLOBAL_STATE.read().unwrap();
|
||||||
state.first_run
|
state.first_run
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
impl SharedState {
|
|
||||||
pub fn mark_first_run(&mut self) {
|
|
||||||
self.first_run = false;
|
|
||||||
}
|
|
||||||
pub fn is_first_run(&self) -> bool {
|
|
||||||
self.first_run
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|||||||
@@ -20,11 +20,12 @@ pub struct Extraparams {
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
|
||||||
pub struct GlobalServiceMapping {
|
pub struct GlobalServiceMapping {
|
||||||
|
pub redirect_to: Option<String>,
|
||||||
|
pub authorization: Option<String>,
|
||||||
pub upstream: String,
|
pub upstream: String,
|
||||||
pub hostname: String,
|
pub hostname: String,
|
||||||
pub path: Option<String>,
|
pub path: Option<String>,
|
||||||
pub to_https: Option<bool>,
|
pub to_https: Option<bool>,
|
||||||
pub sticky_sessions: Option<u64>,
|
|
||||||
pub rate_limit: Option<isize>,
|
pub rate_limit: Option<isize>,
|
||||||
pub x4xx_limit: Option<u32>,
|
pub x4xx_limit: Option<u32>,
|
||||||
pub client_headers: Option<Vec<String>>,
|
pub client_headers: Option<Vec<String>>,
|
||||||
@@ -34,14 +35,12 @@ pub struct GlobalServiceMapping {
|
|||||||
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
|
||||||
pub struct Kubernetes {
|
pub struct Kubernetes {
|
||||||
pub servers: Option<Vec<String>>,
|
pub servers: Option<Vec<String>>,
|
||||||
pub services: Option<Vec<GlobalServiceMapping>>,
|
|
||||||
pub tokenpath: Option<String>,
|
pub tokenpath: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
|
||||||
pub struct Consul {
|
pub struct Consul {
|
||||||
pub servers: Option<Vec<String>>,
|
pub servers: Option<Vec<String>>,
|
||||||
pub services: Option<Vec<GlobalServiceMapping>>,
|
|
||||||
pub token: Option<String>,
|
pub token: Option<String>,
|
||||||
}
|
}
|
||||||
#[derive(Debug, Default, Serialize, Deserialize)]
|
#[derive(Debug, Default, Serialize, Deserialize)]
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
use crate::tls::acme::order::refresh_order;
|
use crate::tls::acme::order::refresh_order;
|
||||||
use crate::utils::discovery::{APIUpstreamProvider, ConsulProvider, Discovery, FromFileProvider, KubernetesProvider};
|
use crate::utils::discovery::{APIUpstreamProvider, ConsulProvider, Discovery, FromFileProvider, KubernetesProvider};
|
||||||
|
use crate::utils::metrics::calc_cache_metrics;
|
||||||
use crate::utils::parceyaml::load_configuration;
|
use crate::utils::parceyaml::load_configuration;
|
||||||
use crate::utils::structs::Configuration;
|
use crate::utils::structs::Configuration;
|
||||||
use crate::utils::tools::*;
|
use crate::utils::tools::*;
|
||||||
@@ -76,6 +77,7 @@ impl BackgroundService for LB {
|
|||||||
drop(tokio::spawn(async move {
|
drop(tokio::spawn(async move {
|
||||||
healthcheck::hc2(uu, ff, im, (&*hc_method.to_string(), hc_interval.to_string().parse().unwrap())).await
|
healthcheck::hc2(uu, ff, im, (&*hc_method.to_string(), hc_interval.to_string().parse().unwrap())).await
|
||||||
}));
|
}));
|
||||||
|
drop(tokio::spawn(async move { calc_cache_metrics().await }));
|
||||||
drop(tokio::spawn(async move { refresh_order(certdir, confdir).await }));
|
drop(tokio::spawn(async move { refresh_order(certdir, confdir).await }));
|
||||||
init_logging(self.config.access_log.clone());
|
init_logging(self.config.access_log.clone());
|
||||||
loop {
|
loop {
|
||||||
|
|||||||
@@ -310,15 +310,16 @@ impl ProxyHttp for LB {
|
|||||||
let _ = _upstream_response.append_header("set-cookie", buf.as_str());
|
let _ = _upstream_response.append_header("set-cookie", buf.as_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
async fn upstream_response_filter(&self, _session: &mut Session, upstream_response: &mut ResponseHeader, ctx: &mut Self::CTX) -> Result<()> {
|
||||||
if let Some(client_headers) = &ctx.client_headers {
|
if let Some(client_headers) = &ctx.client_headers {
|
||||||
for (k, v) in client_headers.iter() {
|
for (k, v) in client_headers.iter() {
|
||||||
_upstream_response.append_header(k.clone(), v.as_ref())?;
|
upstream_response.append_header(k.clone(), v.as_ref())?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn logging(&self, session: &mut Session, _e: Option<&pingora::Error>, ctx: &mut Self::CTX) {
|
async fn logging(&self, session: &mut Session, _e: Option<&pingora::Error>, ctx: &mut Self::CTX) {
|
||||||
let response_code = session.response_written().map_or(0, |resp| resp.status.as_u16());
|
let response_code = session.response_written().map_or(0, |resp| resp.status.as_u16());
|
||||||
let m = &MetricTypes {
|
let m = &MetricTypes {
|
||||||
|
|||||||
+2
-3
@@ -1,4 +1,3 @@
|
|||||||
// use rustls::crypto::ring::default_provider;
|
|
||||||
use crate::tls::grades;
|
use crate::tls::grades;
|
||||||
use crate::tls::load;
|
use crate::tls::load;
|
||||||
use crate::tls::load::CertificateConfig;
|
use crate::tls::load::CertificateConfig;
|
||||||
@@ -18,6 +17,7 @@ use pingora_core::prelude::{background_service, Opt};
|
|||||||
use pingora_core::protocols::TcpKeepalive;
|
use pingora_core::protocols::TcpKeepalive;
|
||||||
use pingora_core::server::Server;
|
use pingora_core::server::Server;
|
||||||
use privdrop::reexports::libc::SIGQUIT;
|
use privdrop::reexports::libc::SIGQUIT;
|
||||||
|
use rustls::crypto::ring::default_provider;
|
||||||
use sd_notify::NotifyState;
|
use sd_notify::NotifyState;
|
||||||
use signal_hook::{
|
use signal_hook::{
|
||||||
consts::{SIGINT, SIGTERM},
|
consts::{SIGINT, SIGTERM},
|
||||||
@@ -27,9 +27,8 @@ use std::sync::mpsc::{channel, Receiver, Sender};
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{fs, thread};
|
use std::{fs, thread};
|
||||||
|
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
// default_provider().install_default().expect("Failed to install rustls crypto provider");
|
default_provider().install_default().expect("Failed to install RusTLS crypto provider");
|
||||||
let parameters = Opt::parse_args();
|
let parameters = Opt::parse_args();
|
||||||
let file = parameters.conf.clone().unwrap();
|
let file = parameters.conf.clone().unwrap();
|
||||||
let maincfg = crate::utils::parceyaml::parce_main_config(file.as_str());
|
let maincfg = crate::utils::parceyaml::parce_main_config(file.as_str());
|
||||||
|
|||||||
Reference in New Issue
Block a user