Prometheus: fall back to pie chart if prometheus is not available

Signed-off-by: Yuqiu Wang <yuqiuw@indeed.com>
This commit is contained in:
Yuqiu Wang
2021-08-26 12:45:55 -05:00
parent 6ef781480d
commit 2e1d585fb0
10 changed files with 162 additions and 147 deletions
+49 -49
View File
@@ -1577,27 +1577,27 @@
},
"@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
"integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
},
"@protobufjs/base64": {
"version": "1.1.2",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/base64/-/base64-1.1.2.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
},
"@protobufjs/codegen": {
"version": "2.0.4",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/codegen/-/codegen-2.0.4.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
},
"@protobufjs/eventemitter": {
"version": "1.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
"integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
},
"@protobufjs/fetch": {
"version": "1.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/fetch/-/fetch-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
"integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
"requires": {
"@protobufjs/aspromise": "^1.1.1",
@@ -1606,27 +1606,27 @@
},
"@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/float/-/float-1.0.2.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
"integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
},
"@protobufjs/inquire": {
"version": "1.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/inquire/-/inquire-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
"integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
},
"@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/path/-/path-1.1.2.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
"integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
},
"@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/pool/-/pool-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
"integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
},
"@protobufjs/utf8": {
"version": "1.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
},
"@svgr/babel-plugin-add-jsx-attribute": {
@@ -1975,7 +1975,7 @@
},
"@types/long": {
"version": "4.0.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@types/long/-/long-4.0.1.tgz",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
"integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
},
"@types/minimatch": {
@@ -2030,7 +2030,7 @@
},
"@types/react-select": {
"version": "3.0.22",
"resolved": "https://nexus.corp.indeed.com/repository/npm/@types/react-select/-/react-select-3.0.22.tgz",
"resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-3.0.22.tgz",
"integrity": "sha512-fqgmC979JPr/6476Pau6QnmI9zVV664R7Q92Ld1rgTn+umtUXT5X3+PO/x6O4imCZnh7XCqZcouabWAlAQJNpQ==",
"requires": {
"@types/react": "*",
@@ -4012,7 +4012,7 @@
},
"cli-width": {
"version": "3.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/cli-width/-/cli-width-3.0.0.tgz",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
"integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
},
"cliui": {
@@ -5210,7 +5210,7 @@
},
"doctrine": {
"version": "3.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/doctrine/-/doctrine-3.0.0.tgz",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"requires": {
"esutils": "^2.0.2"
@@ -5546,7 +5546,7 @@
},
"eslint": {
"version": "6.8.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/eslint/-/eslint-6.8.0.tgz",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
"integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
"requires": {
"@babel/code-frame": "^7.0.0",
@@ -5590,7 +5590,7 @@
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/ansi-regex/-/ansi-regex-4.1.0.tgz",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"ansi-styles": {
@@ -5613,7 +5613,7 @@
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://nexus.corp.indeed.com/repository/npm/cross-spawn/-/cross-spawn-6.0.5.tgz",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"requires": {
"nice-try": "^1.0.4",
@@ -5625,14 +5625,14 @@
"dependencies": {
"semver": {
"version": "5.7.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/semver/-/semver-5.7.1.tgz",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
}
},
"eslint-utils": {
"version": "1.4.3",
"resolved": "https://nexus.corp.indeed.com/repository/npm/eslint-utils/-/eslint-utils-1.4.3.tgz",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
"integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
"requires": {
"eslint-visitor-keys": "^1.1.0"
@@ -5640,7 +5640,7 @@
},
"globals": {
"version": "12.4.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/globals/-/globals-12.4.0.tgz",
"resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
"integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
"requires": {
"type-fest": "^0.8.1"
@@ -5657,22 +5657,22 @@
},
"regexpp": {
"version": "2.0.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/regexpp/-/regexpp-2.0.1.tgz",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
"integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
},
"resolve-from": {
"version": "4.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/resolve-from/-/resolve-from-4.0.0.tgz",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
},
"semver": {
"version": "6.3.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/semver/-/semver-6.3.0.tgz",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/strip-ansi/-/strip-ansi-5.2.0.tgz",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
"ansi-regex": "^4.1.0"
@@ -6088,7 +6088,7 @@
},
"espree": {
"version": "6.2.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/espree/-/espree-6.2.1.tgz",
"resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
"integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
"requires": {
"acorn": "^7.1.1",
@@ -6544,7 +6544,7 @@
},
"file-entry-cache": {
"version": "5.0.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
"integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
"requires": {
"flat-cache": "^2.0.1"
@@ -6646,7 +6646,7 @@
},
"flat-cache": {
"version": "2.0.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/flat-cache/-/flat-cache-2.0.1.tgz",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
"integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
"requires": {
"flatted": "^2.0.0",
@@ -7423,7 +7423,7 @@
},
"ignore": {
"version": "4.0.6",
"resolved": "https://nexus.corp.indeed.com/repository/npm/ignore/-/ignore-4.0.6.tgz",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
},
"immer": {
@@ -7514,7 +7514,7 @@
},
"inquirer": {
"version": "7.3.3",
"resolved": "https://nexus.corp.indeed.com/repository/npm/inquirer/-/inquirer-7.3.3.tgz",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
"integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
"requires": {
"ansi-escapes": "^4.2.1",
@@ -7534,7 +7534,7 @@
"dependencies": {
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/ansi-regex/-/ansi-regex-5.0.0.tgz",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
},
"ansi-styles": {
@@ -7547,7 +7547,7 @@
},
"chalk": {
"version": "4.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/chalk/-/chalk-4.1.0.tgz",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"requires": {
"ansi-styles": "^4.1.0",
@@ -7556,7 +7556,7 @@
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/color-convert/-/color-convert-2.0.1.tgz",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
@@ -7564,27 +7564,27 @@
},
"color-name": {
"version": "1.1.4",
"resolved": "https://nexus.corp.indeed.com/repository/npm/color-name/-/color-name-1.1.4.tgz",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/emoji-regex/-/emoji-regex-8.0.0.tgz",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/has-flag/-/has-flag-4.0.0.tgz",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
},
"string-width": {
"version": "4.2.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/string-width/-/string-width-4.2.0.tgz",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"requires": {
"emoji-regex": "^8.0.0",
@@ -7594,7 +7594,7 @@
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/strip-ansi/-/strip-ansi-6.0.0.tgz",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"requires": {
"ansi-regex": "^5.0.0"
@@ -9386,7 +9386,7 @@
},
"long": {
"version": "4.0.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/long/-/long-4.0.0.tgz",
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
},
"loose-envify": {
@@ -11733,7 +11733,7 @@
},
"protobufjs": {
"version": "6.10.2",
"resolved": "https://nexus.corp.indeed.com/repository/npm/protobufjs/-/protobufjs-6.10.2.tgz",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz",
"integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==",
"requires": {
"@protobufjs/aspromise": "^1.1.2",
@@ -13473,7 +13473,7 @@
},
"slice-ansi": {
"version": "2.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/slice-ansi/-/slice-ansi-2.1.0.tgz",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
"integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
"requires": {
"ansi-styles": "^3.2.0",
@@ -13483,7 +13483,7 @@
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/ansi-styles/-/ansi-styles-3.2.1.tgz",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "^1.9.0"
@@ -14032,7 +14032,7 @@
},
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://nexus.corp.indeed.com/repository/npm/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
},
"style-loader": {
@@ -14168,7 +14168,7 @@
},
"table": {
"version": "5.4.6",
"resolved": "https://nexus.corp.indeed.com/repository/npm/table/-/table-5.4.6.tgz",
"resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
"integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
"requires": {
"ajv": "^6.10.2",
@@ -14179,7 +14179,7 @@
"dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/ansi-regex/-/ansi-regex-4.1.0.tgz",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"is-fullwidth-code-point": {
@@ -14189,7 +14189,7 @@
},
"string-width": {
"version": "3.1.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/string-width/-/string-width-3.1.0.tgz",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"requires": {
"emoji-regex": "^7.0.1",
@@ -14199,7 +14199,7 @@
},
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://nexus.corp.indeed.com/repository/npm/strip-ansi/-/strip-ansi-5.2.0.tgz",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"requires": {
"ansi-regex": "^4.1.0"
@@ -14650,7 +14650,7 @@
},
"typescript": {
"version": "4.0.3",
"resolved": "https://nexus.corp.indeed.com/repository/npm/typescript/-/typescript-4.0.3.tgz",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
"integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg=="
},
"unicode-canonical-property-names-ecmascript": {
@@ -15718,7 +15718,7 @@
},
"write": {
"version": "1.0.3",
"resolved": "https://nexus.corp.indeed.com/repository/npm/write/-/write-1.0.3.tgz",
"resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
"integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
"requires": {
"mkdirp": "^0.5.1"
-4
View File
@@ -62,10 +62,6 @@ export default class Menu extends Base<MenuProps, MenuStates> {
{canView(rules, api.namespace) && (
<MenuItem title='Namespaces' path='namespace' resource='Namespace' onClick={onClick} />
)}
{canView(rules, api.namespace) && (
<MenuItem title='PrometheusGraphs' path='prometheusgraphs' resource='Node' onClick={onClick} />
)}
</Group>
{/* Workloads */}
+29 -3
View File
@@ -1,24 +1,43 @@
import React from 'react';
import _ from 'lodash';
import React, {useEffect, useState} from 'react';
import Chart from './chart';
import LoadingChart from './loadingChart';
import {Node} from '../utils/types';
import PrometheusGraph from '../views/prometheusgraph';
import PrometheusGraph, {BASE_HTTP_URL} from '../views/prometheusgraph';
import api from '../services/api';
export default function NodeStatusChart({items}: {items?: Node[]}) {
const readyCount = _.sumBy(items, x => getReadyStatus(x) === 'True' ? 1 : 0); // eslint-disable-line no-confusing-arrow
const query = {
queryString: 'sum(kube_node_info)',
title: 'Node Count',
yAxisMin: 0,
yAxisUnit: 'Nodes',
};
const [prometheusData, setPrometheusData] = useState([] as any);
useEffect(() => {
const refreshPMData = async function () {
const data = await api.getPrometheusData(BASE_HTTP_URL, query.queryString);
setPrometheusData(data);
};
refreshPMData();
}, []);
return (
<div className='charts_item'>
{items ? (
{prometheusData.length ? (
<PrometheusGraph
queryString={query.queryString}
title={query.title}
yAxisMin={query.yAxisMin}
yAxisUnit={query.yAxisUnit}
prometheusData={prometheusData}
/>
) : items ? (
<Chart used={readyCount} available={items.length} />
) : (
<LoadingChart />
)}
@@ -27,3 +46,10 @@ export default function NodeStatusChart({items}: {items?: Node[]}) {
</div>
);
}
function getReadyStatus({status}: Node) {
if (!status.conditions) return null;
const ready = status.conditions.find(y => y.type === 'Ready');
return ready && ready.status;
}
+23 -10
View File
@@ -1,34 +1,47 @@
import _ from 'lodash';
import React from 'react';
// import Chart from './chart';
import React, {useEffect, useState} from 'react';
import Chart from './chart';
import LoadingChart from './loadingChart';
import {parseCpu, TO_ONE_CPU} from '../utils/unitHelpers';
import {Pod, Metrics} from '../utils/types';
import PrometheusGraph from '../views/prometheusgraph';
import PrometheusGraph, {BASE_HTTP_URL} from '../views/prometheusgraph';
import api from '../services/api';
export default function PodCpuChart({items, metrics}: {items?: Pod[], metrics?: _.Dictionary<Metrics>}) {
const totals = getPodCpuTotals(items, metrics);
// const decimals = totals && totals.used > 10 ? 1 : 2;
const decimals = totals && totals.used > 10 ? 1 : 2;
const query = {
queryString: 'sum(kube_pod_container_resource_requests{unit="core", resource="cpu"})',
title: 'Pod CPU Usage',
yAxisMin: 0,
yAxisUnit: 'CPU',
};
const [prometheusData, setPrometheusData] = useState([] as any);
useEffect(() => {
const refreshPMData = async function () {
const data = await api.getPrometheusData(BASE_HTTP_URL, query.queryString);
setPrometheusData(data);
};
refreshPMData();
}, []);
return (
<div className='charts_item'>
{totals ? (
// <Chart
// decimals={decimals}
// used={totals.used}
// available={totals.available}
// />
{prometheusData ? (
<PrometheusGraph
queryString={query.queryString}
title={query.title}
yAxisMin={query.yAxisMin}
yAxisUnit={query.yAxisUnit}
prometheusData={prometheusData}
/>
) : totals ? (
<Chart
decimals={decimals}
used={totals.used}
available={totals.available}
/>
) : (
<LoadingChart />
+23 -3
View File
@@ -1,12 +1,15 @@
import _ from 'lodash';
import React from 'react';
import React, {useEffect, useState} from 'react';
import Chart from './chart';
import LoadingChart from './loadingChart';
import {parseRam, TO_GB} from '../utils/unitHelpers';
import {Pod, Metrics} from '../utils/types';
import PrometheusGraph from '../views/prometheusgraph';
import PrometheusGraph, {BASE_HTTP_URL} from '../views/prometheusgraph';
import api from '../services/api';
export default function RamChart({items, metrics}: {items?: Pod[], metrics?: _.Dictionary<Metrics>}) {
const totals = getPodRamTotals(items, metrics);
const decimals = totals && totals.used > 10 ? 1 : 2;
const query = {
queryString: `sum(kube_pod_container_resource_requests{unit="byte"}/${TO_GB})`,
@@ -14,16 +17,33 @@ export default function RamChart({items, metrics}: {items?: Pod[], metrics?: _.D
yAxisMin: 0,
yAxisUnit: 'GiB',
};
const [prometheusData, setPrometheusData] = useState([] as any);
useEffect(() => {
const refreshPMData = async function () {
const data = await api.getPrometheusData(BASE_HTTP_URL, query.queryString);
setPrometheusData(data);
};
refreshPMData();
}, []);
return (
<div className='charts_item'>
{totals ? (
{prometheusData ? (
<PrometheusGraph
queryString={query.queryString}
title={query.title}
yAxisMin={query.yAxisMin}
yAxisUnit={query.yAxisUnit}
prometheusData={prometheusData}
/>
) : totals ? (
<Chart
decimals={decimals}
used={totals && totals.used}
usedSuffix='Gb'
available={totals && totals.available}
availableSuffix='Gb'
/>
) : (
<LoadingChart />
+12 -3
View File
@@ -1,5 +1,5 @@
import _ from 'lodash';
import React from 'react';
import React, {useEffect, useState} from 'react';
import Chart from './chart';
import LoadingChart from './loadingChart';
import {Pod} from '../utils/types';
@@ -16,16 +16,25 @@ export default function PodStatusChart({items}: {items?: Pod[]}) {
yAxisMin: 0,
yAxisUnit: 'Pods',
};
const prometheusConnected = api.isPrometheusConnected(BASE_HTTP_URL);
const [prometheusData, setPrometheusData] = useState([] as any);
useEffect(() => {
const refreshPMData = async function () {
const data = await api.getPrometheusData(BASE_HTTP_URL, query.queryString);
setPrometheusData(data);
};
refreshPMData();
}, []);
return (
<div className='charts_item'>
{
prometheusConnected ? (
prometheusData ? (
<PrometheusGraph
queryString={query.queryString}
title={query.title}
yAxisMin={query.yAxisMin}
yAxisUnit={query.yAxisUnit}
prometheusData={prometheusData}
/>
) : items && available ? (
<Chart used={count} pending={available - count} available={available} />
-3
View File
@@ -26,7 +26,6 @@ import PersistentVolumeClaims from './views/persistentVolumeClaims';
import PersistentVolumes from './views/persistentVolumes';
import Pod from './views/pod';
import Pods from './views/pods';
import PrometheusGraphs from './views/prometheusgraphs';
import ReplicaSet from './views/replicaSet';
import ReplicaSets from './views/replicaSets';
import Role from './views/role';
@@ -109,8 +108,6 @@ registerRoute('storageclass', () => <StorageClasses />);
// @ts-ignore
registerRoute('storageclass/:name', params => <StorageClass {...params} />);
registerRoute('workload', () => <Workloads />);
registerRoute('prometheusgraphs', () => <PrometheusGraphs />);
// @ts-ignore
registerRoute('workload/cronjob/:namespace/:name', params => <CronJob {...params} />);
// @ts-ignore
+18 -5
View File
@@ -3,6 +3,7 @@ import {Base64} from 'js-base64';
import {request, post, stream, apiFactory, apiFactoryWithNamespace, requestText} from './apiProxy';
import log from '../utils/log';
import {K8sEvent, Namespace, TODO, Metrics, PersistentVolume, Node, Pod, ClusterRole, ClusterRoleBinding, ConfigMap, RoleBinding, Secret, ServiceAccount, StorageClass} from '../utils/types';
import {BASE_HTTP_URL} from "../views/prometheusgraph";
type DataCallback<T> = (data: T) => void;
type MetricsCallback = DataCallback<Metrics[]>;
@@ -44,7 +45,7 @@ const apis = {
logsAll,
swagger,
exec,
isPrometheusConnected,
getPrometheusData,
metrics: metricsFactory(),
oidc: oidcFactory(),
@@ -188,14 +189,26 @@ function logs(namespace: string, name: string, container: string, tailLines: num
}
}
async function isPrometheusConnected(baseUrl: string) {
async function getPrometheusData(baseUrl: string, queryString: string) {
const url = `${baseUrl}/api/v1/query_range`;
try {
const response = await request(baseUrl);
return response.status === 302;
const params = {
query: queryString,
start: (Date.now() / 1000 - 60 * 60).toString(),
end: (Date.now() / 1000).toString(), // One hour range
step: '1',
};
return fetch(`${url}?${new URLSearchParams(params).toString()}`)
.then(result => result.json())
.then((json) => {
const jsonData = json.data;
const graphData : Array<any> = jsonData.result[0]?.values.map((value: any) => ({x: value[0], y: +value[1]}));
return graphData;
});
} catch (err) {
log.error('Unable to send request', {err});
}
return null;
return [];
}
export default apis;
+8 -26
View File
@@ -3,7 +3,7 @@ import {XYPlot, XAxis, YAxis, LineSeries, Crosshair, AreaSeries} from 'react-vis
import Base from '../components/base';
export const BASE_HTTP_URL = 'http://localhost:58984';
export const BASE_HTTP_URL = 'http://localhost:4654/prom';
type Props = {
@@ -11,11 +11,10 @@ type Props = {
title: string;
yAxisMin?: number;
yAxisUnit?: string;
prometheusData: Array<any>;
}
type State = {
metric: string;
data: Array<any>;
crosshairValues: any[];
}
@@ -42,34 +41,17 @@ export default class PrometheusGraph extends Base<Props, State> {
};
componentDidMount() {
const url = `${BASE_HTTP_URL}/api/v1/query_range`;
this.setState((prevState => ({
...prevState,
data: new Array<any>(),
data: this.props.prometheusData,
crosshairValues: [],
})));
const params = {
query: this.props.queryString,
start: (Date.now() / 1000 - 60 * 60).toString(),
end: (Date.now() / 1000).toString(), // One hour range
step: '1',
};
fetch(`${url}?${new URLSearchParams(params).toString()}`)
.then(result => result.json())
.then((json) => {
const jsonData = json.data;
const graphData : Array<any> = jsonData.result[0]?.values.map((value: any) => ({x: value[0], y: +value[1]}));
this.setState(prevState => ({
...prevState,
data: graphData,
}));
});
}
getYDomain = () => {
if (this.props.yAxisUnit) {
// Taken from https://github.com/uber/react-vis/issues/609#issuecomment-330066354
const {yMin, yMax} = this.state.data.reduce((acc, row) => ({
const {yMin, yMax} = this.props.prometheusData.reduce((acc, row) => ({
yMax: Math.max(acc.yMax, row.y),
yMin: Math.min(acc.yMin, row.y),
}), {yMin: Infinity, yMax: -Infinity});
@@ -93,13 +75,13 @@ export default class PrometheusGraph extends Base<Props, State> {
};
render() {
if (!this.state || !this.state.data) {
if (!this.state || !this.props.prometheusData) {
return <div>
{/* <span style={{fontWeight: 'bold'}}>{this.props.title}</span> */}
<div>Pending...</div>
</div>;
}
return this.state.data
return this.state && this.props.prometheusData
&& <div>
{/* <div style={{fontWeight: 'bold'}}>{this.props.title}</div> */}
<XYPlot
@@ -113,10 +95,10 @@ export default class PrometheusGraph extends Base<Props, State> {
<AreaSeries
color={'#6822aa'}
opacity={0.6}
data={this.state.data}
data={this.props.prometheusData}
/>
<LineSeries
data={this.state.data}
data={this.props.prometheusData}
color={'#6822aa'}
onNearestX={this.onNearestX}
/>
-41
View File
@@ -1,41 +0,0 @@
import React from 'react';
import PrometheusGraph from './prometheusgraph';
import Base from '../components/base';
type Props = {
}
type State = {
metric: string;
data: Map<string, Array<Array<any>>>;
crosshairValues: [];
}
export default class PrometheusGraphs extends Base<Props, State> {
// GRAPH_QUERIES = [
// ['instance:node_cpu:ratio', 'Node CPU Usage'],
// ['instance:node_memory_utilisation:ratio', 'Node Memory Usage'],
// ];
GRAPH_QUERIES = [
{
queryString: 'instance:node_cpu:ratio',
title: 'Node CPU Usage',
},
{
queryString: 'instance:node_memory_utilisation:ratio',
title: 'Node Memory Usage',
},
]
render() {
return <div>
{/* eslint-disable-next-line react/jsx-key */}
{this.GRAPH_QUERIES.map(query => <PrometheusGraph
queryString={query.queryString}
title={query.title}
/>)}
</div>;
}
}