@perses-dev/alert-manager-plugin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +41 -0
- package/__mf/css/async/7790.85c2cbf6.css +1 -0
- package/__mf/font/inter-cyrillic-300-normal.432f2b21.woff +0 -0
- package/__mf/font/inter-cyrillic-300-normal.9da91009.woff2 +0 -0
- package/__mf/font/inter-cyrillic-400-normal.372704ff.woff2 +0 -0
- package/__mf/font/inter-cyrillic-400-normal.a6b6ef6f.woff +0 -0
- package/__mf/font/inter-cyrillic-500-normal.7c15bba8.woff2 +0 -0
- package/__mf/font/inter-cyrillic-500-normal.b9f8c929.woff +0 -0
- package/__mf/font/inter-cyrillic-600-normal.2f42892a.woff2 +0 -0
- package/__mf/font/inter-cyrillic-600-normal.c3987adc.woff +0 -0
- package/__mf/font/inter-cyrillic-700-normal.93eba3c3.woff +0 -0
- package/__mf/font/inter-cyrillic-700-normal.e9e5b2dc.woff2 +0 -0
- package/__mf/font/inter-cyrillic-900-normal.f285bd7a.woff2 +0 -0
- package/__mf/font/inter-cyrillic-900-normal.ffbd8a3a.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-300-normal.95bb9038.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-300-normal.cfc143a9.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-400-normal.2a31c04b.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-400-normal.f572b170.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-500-normal.5a6bb1da.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-500-normal.fe0d9b14.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-600-normal.ecbdecad.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-600-normal.f7b3c15b.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-700-normal.4b4022a6.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-700-normal.74b516d2.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-900-normal.9970ddb5.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-900-normal.a0d59adc.woff2 +0 -0
- package/__mf/font/inter-greek-300-normal.0d7be683.woff2 +0 -0
- package/__mf/font/inter-greek-300-normal.8f0b988e.woff +0 -0
- package/__mf/font/inter-greek-400-normal.cc58c11b.woff +0 -0
- package/__mf/font/inter-greek-400-normal.d7020e3c.woff2 +0 -0
- package/__mf/font/inter-greek-500-normal.d9a33207.woff +0 -0
- package/__mf/font/inter-greek-500-normal.f41f43db.woff2 +0 -0
- package/__mf/font/inter-greek-600-normal.4ec0c1c1.woff +0 -0
- package/__mf/font/inter-greek-600-normal.cc532937.woff2 +0 -0
- package/__mf/font/inter-greek-700-normal.5ec6c758.woff +0 -0
- package/__mf/font/inter-greek-700-normal.97f0eeeb.woff2 +0 -0
- package/__mf/font/inter-greek-900-normal.46b66369.woff2 +0 -0
- package/__mf/font/inter-greek-900-normal.9ae3a3c5.woff +0 -0
- package/__mf/font/inter-greek-ext-300-normal.10247a66.woff2 +0 -0
- package/__mf/font/inter-greek-ext-300-normal.4668e5cb.woff +0 -0
- package/__mf/font/inter-greek-ext-400-normal.4ce1df5d.woff2 +0 -0
- package/__mf/font/inter-greek-ext-400-normal.88ede1ea.woff +0 -0
- package/__mf/font/inter-greek-ext-500-normal.7a4aa726.woff +0 -0
- package/__mf/font/inter-greek-ext-500-normal.cbd51e2d.woff2 +0 -0
- package/__mf/font/inter-greek-ext-600-normal.089a95ee.woff +0 -0
- package/__mf/font/inter-greek-ext-600-normal.1f33d317.woff2 +0 -0
- package/__mf/font/inter-greek-ext-700-normal.31f1075d.woff +0 -0
- package/__mf/font/inter-greek-ext-700-normal.827cd618.woff2 +0 -0
- package/__mf/font/inter-greek-ext-900-normal.531bcee7.woff +0 -0
- package/__mf/font/inter-greek-ext-900-normal.8a9b36b9.woff2 +0 -0
- package/__mf/font/inter-latin-300-normal.15fb600d.woff2 +0 -0
- package/__mf/font/inter-latin-300-normal.6f95f590.woff +0 -0
- package/__mf/font/inter-latin-400-normal.2c7a775c.woff +0 -0
- package/__mf/font/inter-latin-400-normal.ef6d3f52.woff2 +0 -0
- package/__mf/font/inter-latin-500-normal.b7b43ace.woff2 +0 -0
- package/__mf/font/inter-latin-500-normal.cb4c8ceb.woff +0 -0
- package/__mf/font/inter-latin-600-normal.8fb1a964.woff2 +0 -0
- package/__mf/font/inter-latin-600-normal.ce0f5f43.woff +0 -0
- package/__mf/font/inter-latin-700-normal.953b7aa5.woff2 +0 -0
- package/__mf/font/inter-latin-700-normal.9c21d4dc.woff +0 -0
- package/__mf/font/inter-latin-900-normal.2a8028ec.woff2 +0 -0
- package/__mf/font/inter-latin-900-normal.fa252135.woff +0 -0
- package/__mf/font/inter-latin-ext-300-normal.167cc8c9.woff2 +0 -0
- package/__mf/font/inter-latin-ext-300-normal.f695be66.woff +0 -0
- package/__mf/font/inter-latin-ext-400-normal.32a25442.woff2 +0 -0
- package/__mf/font/inter-latin-ext-400-normal.4edcaace.woff +0 -0
- package/__mf/font/inter-latin-ext-500-normal.a19a84a6.woff +0 -0
- package/__mf/font/inter-latin-ext-500-normal.d9b491de.woff2 +0 -0
- package/__mf/font/inter-latin-ext-600-normal.38b075d8.woff2 +0 -0
- package/__mf/font/inter-latin-ext-600-normal.49faa47a.woff +0 -0
- package/__mf/font/inter-latin-ext-700-normal.93534b50.woff +0 -0
- package/__mf/font/inter-latin-ext-700-normal.b63daa1a.woff2 +0 -0
- package/__mf/font/inter-latin-ext-900-normal.0efdb307.woff +0 -0
- package/__mf/font/inter-latin-ext-900-normal.9c0fc2c7.woff2 +0 -0
- package/__mf/font/inter-vietnamese-300-normal.aad496d8.woff +0 -0
- package/__mf/font/inter-vietnamese-300-normal.ad9ef503.woff2 +0 -0
- package/__mf/font/inter-vietnamese-400-normal.a9dd2faf.woff +0 -0
- package/__mf/font/inter-vietnamese-400-normal.de4fc44f.woff2 +0 -0
- package/__mf/font/inter-vietnamese-500-normal.7c0a695f.woff2 +0 -0
- package/__mf/font/inter-vietnamese-500-normal.a3a73b95.woff +0 -0
- package/__mf/font/inter-vietnamese-600-normal.9d518599.woff2 +0 -0
- package/__mf/font/inter-vietnamese-600-normal.c5ce3fcb.woff +0 -0
- package/__mf/font/inter-vietnamese-700-normal.bc68b199.woff +0 -0
- package/__mf/font/inter-vietnamese-700-normal.faf12809.woff2 +0 -0
- package/__mf/font/inter-vietnamese-900-normal.2b782045.woff +0 -0
- package/__mf/font/inter-vietnamese-900-normal.e639b65a.woff2 +0 -0
- package/__mf/js/AlertManager.f762e62c.js +7 -0
- package/__mf/js/async/1616.24f00c9d.js +1 -0
- package/__mf/js/async/1728.83bb9a7c.js +1 -0
- package/__mf/js/async/1871.23ff54b3.js +1 -0
- package/__mf/js/async/1969.a83b1b48.js +1 -0
- package/__mf/js/async/2218.7829c9d9.js +2 -0
- package/__mf/js/async/2218.7829c9d9.js.LICENSE.txt +9 -0
- package/__mf/js/async/2377.f8875a4e.js +1 -0
- package/__mf/js/async/2657.fe8dd44f.js +1 -0
- package/__mf/js/async/2954.3ac1f636.js +2 -0
- package/__mf/js/async/392.7e11dd69.js +2 -0
- package/__mf/js/async/392.7e11dd69.js.LICENSE.txt +8 -0
- package/__mf/js/async/3963.fb6246d2.js +1 -0
- package/__mf/js/async/4121.ec666be2.js +2 -0
- package/__mf/js/async/4121.ec666be2.js.LICENSE.txt +9 -0
- package/__mf/js/async/4133.e94df4f8.js +28 -0
- package/__mf/js/async/4213.a0c4f2eb.js +1 -0
- package/__mf/js/async/4397.d399eecb.js +2 -0
- package/__mf/js/async/4397.d399eecb.js.LICENSE.txt +37 -0
- package/__mf/js/async/4466.a8145edd.js +74 -0
- package/__mf/js/async/4732.e866a740.js +1 -0
- package/__mf/js/async/4788.49ffeac3.js +1 -0
- package/__mf/js/async/5038.269393e3.js +2 -0
- package/__mf/js/async/5038.269393e3.js.LICENSE.txt +9 -0
- package/__mf/js/async/573.214f2003.js +2 -0
- package/__mf/js/async/573.214f2003.js.LICENSE.txt +9 -0
- package/__mf/js/async/6274.8c77cb1a.js +2 -0
- package/__mf/js/async/6274.8c77cb1a.js.LICENSE.txt +8 -0
- package/__mf/js/async/6390.3f6f279d.js +2 -0
- package/__mf/js/async/6390.3f6f279d.js.LICENSE.txt +9 -0
- package/__mf/js/async/6401.1a59dbad.js +1 -0
- package/__mf/js/async/6593.acc8b704.js +4 -0
- package/__mf/js/async/6593.acc8b704.js.LICENSE.txt +24 -0
- package/__mf/js/async/6594.b02adfd9.js +2 -0
- package/__mf/js/async/6594.b02adfd9.js.LICENSE.txt +9 -0
- package/__mf/js/async/663.5445c7e0.js +1 -0
- package/__mf/js/async/6854.1d628838.js +1 -0
- package/__mf/js/async/7177.27c86137.js +1 -0
- package/__mf/js/async/7192.ede9860b.js +1 -0
- package/__mf/js/async/733.22ab2a8a.js +1 -0
- package/__mf/js/async/7422.33d76364.js +2 -0
- package/__mf/js/async/7422.33d76364.js.LICENSE.txt +9 -0
- package/__mf/js/async/7790.a75199e6.js +7 -0
- package/__mf/js/async/7790.a75199e6.js.LICENSE.txt +64 -0
- package/__mf/js/async/7862.556c038f.js +2 -0
- package/__mf/js/async/7862.556c038f.js.LICENSE.txt +9 -0
- package/__mf/js/async/7984.49fa1156.js +22 -0
- package/__mf/js/async/7984.49fa1156.js.LICENSE.txt +19 -0
- package/__mf/js/async/804.23da0d30.js +37 -0
- package/__mf/js/async/8470.2df0db71.js +2 -0
- package/__mf/js/async/8470.2df0db71.js.LICENSE.txt +19 -0
- package/__mf/js/async/8697.c13c6603.js +1 -0
- package/__mf/js/async/8907.9e3edf43.js +1 -0
- package/__mf/js/async/9040.94717f28.js +10 -0
- package/__mf/js/async/9040.94717f28.js.LICENSE.txt +17 -0
- package/__mf/js/async/9184.27a439a4.js +1 -0
- package/__mf/js/async/9235.00f9412f.js +1 -0
- package/__mf/js/async/941.d3bc6208.js +2 -0
- package/__mf/js/async/941.d3bc6208.js.LICENSE.txt +9 -0
- package/__mf/js/async/9634.3a366799.js +1 -0
- package/__mf/js/async/9836.cc839227.js +1 -0
- package/__mf/js/async/__federation_expose_AlertManagerAlertsExplorer.d4fb76c0.js +2 -0
- package/__mf/js/async/__federation_expose_AlertManagerAlertsExplorer.d4fb76c0.js.LICENSE.txt +9 -0
- package/__mf/js/async/__federation_expose_AlertManagerAlertsQuery.9ea3093c.js +1 -0
- package/__mf/js/async/__federation_expose_AlertManagerDatasource.2fbf067c.js +2 -0
- package/__mf/js/async/__federation_expose_AlertManagerDatasource.2fbf067c.js.LICENSE.txt +9 -0
- package/__mf/js/async/__federation_expose_AlertManagerSilencesExplorer.d2527c12.js +2 -0
- package/__mf/js/async/__federation_expose_AlertManagerSilencesExplorer.d2527c12.js.LICENSE.txt +9 -0
- package/__mf/js/async/__federation_expose_AlertManagerSilencesQuery.7aca31d3.js +2 -0
- package/__mf/js/async/__federation_expose_AlertManagerSilencesQuery.7aca31d3.js.LICENSE.txt +9 -0
- package/__mf/js/async/__federation_expose_AlertTable.4a636b80.js +1 -0
- package/__mf/js/async/__federation_expose_SilenceTable.11259028.js +1 -0
- package/__mf/js/async/lib-router.19f64904.js +2 -0
- package/__mf/js/async/lib-router.19f64904.js.LICENSE.txt +32 -0
- package/__mf/js/main.a1362788.js +7 -0
- package/lib/bootstrap.d.ts +2 -0
- package/lib/bootstrap.d.ts.map +1 -0
- package/lib/bootstrap.js +19 -0
- package/lib/bootstrap.js.map +1 -0
- package/lib/cjs/bootstrap.js +26 -0
- package/lib/cjs/components/ColumnsEditor.js +271 -0
- package/lib/cjs/components/LazyTextField.js +50 -0
- package/lib/cjs/components/MatcherEditor.js +153 -0
- package/lib/cjs/components/MatchersList.js +46 -0
- package/lib/cjs/components/SilenceForm.js +205 -0
- package/lib/cjs/components/StatusBadge.js +71 -0
- package/lib/cjs/components/index.js +44 -0
- package/lib/cjs/explore/AlertManagerAlertsExplorer.js +79 -0
- package/lib/cjs/explore/AlertManagerSilencesExplorer.js +153 -0
- package/lib/cjs/getPluginModule.js +39 -0
- package/lib/cjs/index-federation.js +55 -0
- package/lib/cjs/index.js +39 -0
- package/lib/cjs/model/alertmanager-client.js +128 -0
- package/lib/cjs/model/alertmanager-selectors.js +66 -0
- package/lib/cjs/model/api-types.js +22 -0
- package/lib/cjs/model/index.js +32 -0
- package/lib/cjs/plugins/AlertManagerDatasourceEditor.js +71 -0
- package/lib/cjs/plugins/alert-table/AlertTable.js +56 -0
- package/lib/cjs/plugins/alert-table/AlertTableColumnsEditor.js +110 -0
- package/lib/cjs/plugins/alert-table/AlertTableDeduplicationEditor.js +138 -0
- package/lib/cjs/plugins/alert-table/AlertTableLabelsEditor.js +277 -0
- package/lib/cjs/plugins/alert-table/AlertTableOptionsEditor.js +128 -0
- package/lib/cjs/plugins/alert-table/AlertTablePanel.js +773 -0
- package/lib/cjs/plugins/alert-table/alert-table-model.js +142 -0
- package/lib/cjs/plugins/alert-table/alert-table-sorting.js +205 -0
- package/lib/cjs/plugins/alert-table/label-colors.js +170 -0
- package/lib/cjs/plugins/alertmanager-alerts-query/AlertManagerAlertsQuery.js +51 -0
- package/lib/cjs/plugins/alertmanager-alerts-query/AlertManagerAlertsQueryEditor.js +138 -0
- package/lib/cjs/plugins/alertmanager-alerts-query/get-alerts-data.js +124 -0
- package/lib/cjs/plugins/alertmanager-datasource.js +69 -0
- package/lib/cjs/plugins/alertmanager-silences-query/AlertManagerSilencesQuery.js +45 -0
- package/lib/cjs/plugins/alertmanager-silences-query/AlertManagerSilencesQueryEditor.js +78 -0
- package/lib/cjs/plugins/alertmanager-silences-query/get-silences-data.js +64 -0
- package/lib/cjs/plugins/index.js +74 -0
- package/lib/cjs/plugins/silence-table/SilenceTable.js +42 -0
- package/lib/cjs/plugins/silence-table/SilenceTableColumnsEditor.js +137 -0
- package/lib/cjs/plugins/silence-table/SilenceTableOptionsEditor.js +63 -0
- package/lib/cjs/plugins/silence-table/SilenceTablePanel.js +345 -0
- package/lib/cjs/plugins/silence-table/silence-table-model.js +116 -0
- package/lib/cjs/plugins/silence-table/silence-table-sorting.js +68 -0
- package/lib/cjs/plugins/types.js +16 -0
- package/lib/cjs/setup-tests.js +18 -0
- package/lib/components/ColumnsEditor.d.ts +25 -0
- package/lib/components/ColumnsEditor.d.ts.map +1 -0
- package/lib/components/ColumnsEditor.js +258 -0
- package/lib/components/ColumnsEditor.js.map +1 -0
- package/lib/components/LazyTextField.d.ts +12 -0
- package/lib/components/LazyTextField.d.ts.map +1 -0
- package/lib/components/LazyTextField.js +42 -0
- package/lib/components/LazyTextField.js.map +1 -0
- package/lib/components/MatcherEditor.d.ts +17 -0
- package/lib/components/MatcherEditor.d.ts.map +1 -0
- package/lib/components/MatcherEditor.js +142 -0
- package/lib/components/MatcherEditor.js.map +1 -0
- package/lib/components/MatchersList.d.ts +10 -0
- package/lib/components/MatchersList.d.ts.map +1 -0
- package/lib/components/MatchersList.js +40 -0
- package/lib/components/MatchersList.js.map +1 -0
- package/lib/components/SilenceForm.d.ts +13 -0
- package/lib/components/SilenceForm.d.ts.map +1 -0
- package/lib/components/SilenceForm.js +194 -0
- package/lib/components/SilenceForm.js.map +1 -0
- package/lib/components/StatusBadge.d.ts +10 -0
- package/lib/components/StatusBadge.d.ts.map +1 -0
- package/lib/components/StatusBadge.js +65 -0
- package/lib/components/StatusBadge.js.map +1 -0
- package/lib/components/index.d.ts +11 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +19 -0
- package/lib/components/index.js.map +1 -0
- package/lib/explore/AlertManagerAlertsExplorer.d.ts +3 -0
- package/lib/explore/AlertManagerAlertsExplorer.d.ts.map +1 -0
- package/lib/explore/AlertManagerAlertsExplorer.js +71 -0
- package/lib/explore/AlertManagerAlertsExplorer.js.map +1 -0
- package/lib/explore/AlertManagerSilencesExplorer.d.ts +3 -0
- package/lib/explore/AlertManagerSilencesExplorer.d.ts.map +1 -0
- package/lib/explore/AlertManagerSilencesExplorer.js +140 -0
- package/lib/explore/AlertManagerSilencesExplorer.js.map +1 -0
- package/lib/getPluginModule.d.ts +3 -0
- package/lib/getPluginModule.d.ts.map +1 -0
- package/lib/getPluginModule.js +26 -0
- package/lib/getPluginModule.js.map +1 -0
- package/lib/index-federation.d.ts +1 -0
- package/lib/index-federation.d.ts.map +1 -0
- package/lib/index-federation.js +15 -0
- package/lib/index-federation.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/index.js.map +1 -0
- package/lib/model/alertmanager-client.d.ts +27 -0
- package/lib/model/alertmanager-client.d.ts.map +1 -0
- package/lib/model/alertmanager-client.js +100 -0
- package/lib/model/alertmanager-client.js.map +1 -0
- package/lib/model/alertmanager-selectors.d.ts +13 -0
- package/lib/model/alertmanager-selectors.d.ts.map +1 -0
- package/lib/model/alertmanager-selectors.js +41 -0
- package/lib/model/alertmanager-selectors.js.map +1 -0
- package/lib/model/api-types.d.ts +120 -0
- package/lib/model/api-types.d.ts.map +1 -0
- package/lib/model/api-types.js +23 -0
- package/lib/model/api-types.js.map +1 -0
- package/lib/model/index.d.ts +4 -0
- package/lib/model/index.d.ts.map +1 -0
- package/lib/model/index.js +17 -0
- package/lib/model/index.js.map +1 -0
- package/lib/plugins/AlertManagerDatasourceEditor.d.ts +9 -0
- package/lib/plugins/AlertManagerDatasourceEditor.d.ts.map +1 -0
- package/lib/plugins/AlertManagerDatasourceEditor.js +63 -0
- package/lib/plugins/AlertManagerDatasourceEditor.js.map +1 -0
- package/lib/plugins/alert-table/AlertTable.d.ts +8 -0
- package/lib/plugins/alert-table/AlertTable.d.ts.map +1 -0
- package/lib/plugins/alert-table/AlertTable.js +50 -0
- package/lib/plugins/alert-table/AlertTable.js.map +1 -0
- package/lib/plugins/alert-table/AlertTableColumnsEditor.d.ts +5 -0
- package/lib/plugins/alert-table/AlertTableColumnsEditor.d.ts.map +1 -0
- package/lib/plugins/alert-table/AlertTableColumnsEditor.js +102 -0
- package/lib/plugins/alert-table/AlertTableColumnsEditor.js.map +1 -0
- package/lib/plugins/alert-table/AlertTableDeduplicationEditor.d.ts +5 -0
- package/lib/plugins/alert-table/AlertTableDeduplicationEditor.d.ts.map +1 -0
- package/lib/plugins/alert-table/AlertTableDeduplicationEditor.js +130 -0
- package/lib/plugins/alert-table/AlertTableDeduplicationEditor.js.map +1 -0
- package/lib/plugins/alert-table/AlertTableLabelsEditor.d.ts +5 -0
- package/lib/plugins/alert-table/AlertTableLabelsEditor.d.ts.map +1 -0
- package/lib/plugins/alert-table/AlertTableLabelsEditor.js +264 -0
- package/lib/plugins/alert-table/AlertTableLabelsEditor.js.map +1 -0
- package/lib/plugins/alert-table/AlertTableOptionsEditor.d.ts +5 -0
- package/lib/plugins/alert-table/AlertTableOptionsEditor.d.ts.map +1 -0
- package/lib/plugins/alert-table/AlertTableOptionsEditor.js +120 -0
- package/lib/plugins/alert-table/AlertTableOptionsEditor.js.map +1 -0
- package/lib/plugins/alert-table/AlertTablePanel.d.ts +11 -0
- package/lib/plugins/alert-table/AlertTablePanel.d.ts.map +1 -0
- package/lib/plugins/alert-table/AlertTablePanel.js +763 -0
- package/lib/plugins/alert-table/AlertTablePanel.js.map +1 -0
- package/lib/plugins/alert-table/alert-table-model.d.ts +73 -0
- package/lib/plugins/alert-table/alert-table-model.d.ts.map +1 -0
- package/lib/plugins/alert-table/alert-table-model.js +127 -0
- package/lib/plugins/alert-table/alert-table-model.js.map +1 -0
- package/lib/plugins/alert-table/alert-table-sorting.d.ts +13 -0
- package/lib/plugins/alert-table/alert-table-sorting.d.ts.map +1 -0
- package/lib/plugins/alert-table/alert-table-sorting.js +180 -0
- package/lib/plugins/alert-table/alert-table-sorting.js.map +1 -0
- package/lib/plugins/alert-table/label-colors.d.ts +6 -0
- package/lib/plugins/alert-table/label-colors.d.ts.map +1 -0
- package/lib/plugins/alert-table/label-colors.js +148 -0
- package/lib/plugins/alert-table/label-colors.js.map +1 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQuery.d.ts +4 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQuery.d.ts.map +1 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQuery.js +43 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQuery.js.map +1 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQueryEditor.d.ts +9 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQueryEditor.d.ts.map +1 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQueryEditor.js +130 -0
- package/lib/plugins/alertmanager-alerts-query/AlertManagerAlertsQueryEditor.js.map +1 -0
- package/lib/plugins/alertmanager-alerts-query/get-alerts-data.d.ts +8 -0
- package/lib/plugins/alertmanager-alerts-query/get-alerts-data.d.ts.map +1 -0
- package/lib/plugins/alertmanager-alerts-query/get-alerts-data.js +118 -0
- package/lib/plugins/alertmanager-alerts-query/get-alerts-data.js.map +1 -0
- package/lib/plugins/alertmanager-datasource.d.ts +5 -0
- package/lib/plugins/alertmanager-datasource.d.ts.map +1 -0
- package/lib/plugins/alertmanager-datasource.js +61 -0
- package/lib/plugins/alertmanager-datasource.js.map +1 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQuery.d.ts +4 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQuery.d.ts.map +1 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQuery.js +37 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQuery.js.map +1 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQueryEditor.d.ts +9 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQueryEditor.d.ts.map +1 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQueryEditor.js +70 -0
- package/lib/plugins/alertmanager-silences-query/AlertManagerSilencesQueryEditor.js.map +1 -0
- package/lib/plugins/alertmanager-silences-query/get-silences-data.d.ts +8 -0
- package/lib/plugins/alertmanager-silences-query/get-silences-data.d.ts.map +1 -0
- package/lib/plugins/alertmanager-silences-query/get-silences-data.js +58 -0
- package/lib/plugins/alertmanager-silences-query/get-silences-data.js.map +1 -0
- package/lib/plugins/index.d.ts +19 -0
- package/lib/plugins/index.d.ts.map +1 -0
- package/lib/plugins/index.js +30 -0
- package/lib/plugins/index.js.map +1 -0
- package/lib/plugins/silence-table/SilenceTable.d.ts +7 -0
- package/lib/plugins/silence-table/SilenceTable.d.ts.map +1 -0
- package/lib/plugins/silence-table/SilenceTable.js +36 -0
- package/lib/plugins/silence-table/SilenceTable.js.map +1 -0
- package/lib/plugins/silence-table/SilenceTableColumnsEditor.d.ts +5 -0
- package/lib/plugins/silence-table/SilenceTableColumnsEditor.d.ts.map +1 -0
- package/lib/plugins/silence-table/SilenceTableColumnsEditor.js +129 -0
- package/lib/plugins/silence-table/SilenceTableColumnsEditor.js.map +1 -0
- package/lib/plugins/silence-table/SilenceTableOptionsEditor.d.ts +5 -0
- package/lib/plugins/silence-table/SilenceTableOptionsEditor.d.ts.map +1 -0
- package/lib/plugins/silence-table/SilenceTableOptionsEditor.js +55 -0
- package/lib/plugins/silence-table/SilenceTableOptionsEditor.js.map +1 -0
- package/lib/plugins/silence-table/SilenceTablePanel.d.ts +11 -0
- package/lib/plugins/silence-table/SilenceTablePanel.d.ts.map +1 -0
- package/lib/plugins/silence-table/SilenceTablePanel.js +335 -0
- package/lib/plugins/silence-table/SilenceTablePanel.js.map +1 -0
- package/lib/plugins/silence-table/silence-table-model.d.ts +29 -0
- package/lib/plugins/silence-table/silence-table-model.d.ts.map +1 -0
- package/lib/plugins/silence-table/silence-table-model.js +90 -0
- package/lib/plugins/silence-table/silence-table-model.js.map +1 -0
- package/lib/plugins/silence-table/silence-table-sorting.d.ts +9 -0
- package/lib/plugins/silence-table/silence-table-sorting.d.ts.map +1 -0
- package/lib/plugins/silence-table/silence-table-sorting.js +60 -0
- package/lib/plugins/silence-table/silence-table-sorting.js.map +1 -0
- package/lib/plugins/types.d.ts +30 -0
- package/lib/plugins/types.d.ts.map +1 -0
- package/lib/plugins/types.js +17 -0
- package/lib/plugins/types.js.map +1 -0
- package/lib/setup-tests.d.ts +2 -0
- package/lib/setup-tests.d.ts.map +1 -0
- package/lib/setup-tests.js +16 -0
- package/lib/setup-tests.js.map +1 -0
- package/mf-manifest.json +631 -0
- package/mf-stats.json +752 -0
- package/package.json +115 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/plugins/alert-table/AlertTablePanel.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n Box,\n Chip,\n FormControl,\n IconButton,\n InputAdornment,\n InputLabel,\n MenuItem,\n Select,\n SelectChangeEvent,\n Stack,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TableSortLabel,\n TextField,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport { useSnackbar } from '@perses-dev/components';\nimport {\n PanelProps,\n parseVariables,\n replaceVariablesInString,\n useAllVariableValues,\n useDatasourceClient,\n} from '@perses-dev/plugin-system';\nimport { Alert, AlertsData } from '@perses-dev/spec';\nimport { useQueryClient } from '@tanstack/react-query';\nimport BellOffIcon from 'mdi-material-ui/BellOff';\nimport BookOpenIcon from 'mdi-material-ui/BookOpen';\nimport ChevronDownIcon from 'mdi-material-ui/ChevronDown';\nimport ChevronRightIcon from 'mdi-material-ui/ChevronRight';\nimport MagnifyIcon from 'mdi-material-ui/Magnify';\nimport UnfoldLessHorizontalIcon from 'mdi-material-ui/UnfoldLessHorizontal';\nimport UnfoldMoreHorizontalIcon from 'mdi-material-ui/UnfoldMoreHorizontal';\nimport { ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { SilenceForm } from '../../components/SilenceForm';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { AlertManagerClient, extractDatasourceSelector } from '../../model';\nimport { PostableSilence } from '../../model/api-types';\nimport {\n AlertAction,\n AlertTableOptions,\n ALL_ALERT_ACTIONS,\n ColumnDefinition,\n ColumnSortMode,\n deduplicateAlerts,\n extractLabelKeys,\n getGroupKey,\n getGroupSummary,\n GroupSummary,\n LabelColorMapping,\n} from './alert-table-model';\nimport {\n compareAlertsByColumn,\n compareGroupsByColumn,\n SORT_COL_ALERTNAME,\n SORT_COL_STATUS,\n SortState,\n} from './alert-table-sorting';\nimport { getLabelColor } from './label-colors';\n\nexport type AlertTablePanelProps = PanelProps<AlertTableOptions, AlertsData>;\n\ninterface AlertGroup {\n key: string;\n alerts: Alert[];\n summary: GroupSummary;\n}\n\nfunction GroupSummaryChips({ summary }: { summary: GroupSummary }): ReactElement {\n return (\n <Stack direction=\"row\" spacing={0.5}>\n {summary.firing > 0 && <Chip label={`${summary.firing} firing`} color=\"error\" size=\"small\" />}\n {summary.suppressed > 0 && <Chip label={`${summary.suppressed} silenced`} color=\"warning\" size=\"small\" />}\n {summary.pending > 0 && <Chip label={`${summary.pending} pending`} color=\"default\" size=\"small\" />}\n </Stack>\n );\n}\n\nfunction LabelValueSummaryChips({\n summary,\n mapping,\n}: {\n summary: GroupSummary;\n mapping: LabelColorMapping;\n}): ReactElement | null {\n const counts = summary.labelCounts?.[mapping.labelKey];\n if (!counts || Object.keys(counts).length === 0) {\n return null;\n }\n\n return (\n <Stack direction=\"row\" spacing={0.5}>\n {Object.entries(counts)\n .sort(([, a], [, b]) => b - a)\n .map(([value, count]) => {\n const bgColor = getLabelColor(value, mapping);\n return (\n <Chip\n key={value}\n label={`${count} ${value}`}\n size=\"small\"\n sx={{\n backgroundColor: bgColor,\n color: '#fff',\n fontWeight: 500,\n }}\n />\n );\n })}\n </Stack>\n );\n}\n\nfunction AlertRow({\n alert,\n allowedActions,\n columnDefs,\n columnKeySet,\n mappingsByKey,\n runbookAnnotationKey,\n onSilence,\n duplicateCount,\n showDuplicates,\n}: {\n alert: Alert;\n allowedActions: AlertAction[];\n columnDefs: ColumnDefinition[];\n columnKeySet: Set<string>;\n mappingsByKey: Map<string, LabelColorMapping>;\n runbookAnnotationKey: string;\n onSilence: (alert: Alert) => void;\n duplicateCount?: number;\n showDuplicates: boolean;\n}): ReactElement {\n const runbookUrl = alert.annotations?.[runbookAnnotationKey];\n const showActions = allowedActions.length > 0;\n\n return (\n <TableRow hover>\n <TableCell>\n <StatusBadge status={alert.suppressed ? 'suppressed' : alert.state} variant=\"alert\" />\n </TableCell>\n <TableCell>{alert.name}</TableCell>\n {columnDefs.map((col, colIdx) => {\n const value = alert.labels[col.name];\n const mapping = mappingsByKey.get(col.name);\n if (value !== undefined && mapping) {\n const bgColor = getLabelColor(value, mapping);\n return (\n <TableCell key={colIdx}>\n <Chip label={value} size=\"small\" sx={{ backgroundColor: bgColor, color: '#fff', fontWeight: 500 }} />\n </TableCell>\n );\n }\n return <TableCell key={colIdx}>{value ?? ''}</TableCell>;\n })}\n {showDuplicates && (\n <TableCell>\n {duplicateCount !== undefined && (\n <Chip label={`${duplicateCount}`} size=\"small\" variant=\"outlined\" color=\"info\" />\n )}\n </TableCell>\n )}\n <TableCell>\n <Stack direction=\"row\" spacing={0.5} flexWrap=\"wrap\" useFlexGap>\n {Object.entries(alert.labels)\n .filter(([key]) => key !== 'alertname' && !columnKeySet.has(key))\n .map(([key, value]) => {\n const mapping = mappingsByKey.get(key);\n if (mapping) {\n const bgColor = getLabelColor(value, mapping);\n return (\n <Chip\n key={key}\n label={`${key}=${value}`}\n size=\"small\"\n sx={{ backgroundColor: bgColor, color: '#fff', fontWeight: 500 }}\n />\n );\n }\n return <Chip key={key} label={`${key}=${value}`} size=\"small\" variant=\"outlined\" />;\n })}\n </Stack>\n </TableCell>\n {showActions && (\n <TableCell>\n <Stack direction=\"row\" spacing={0.5}>\n {allowedActions.includes('silence') && !alert.suppressed && (\n <Tooltip title=\"Silence this alert\">\n <IconButton size=\"small\" aria-label=\"Silence alert\" onClick={() => onSilence(alert)}>\n <BellOffIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n {allowedActions.includes('runbook') && runbookUrl && (\n <Tooltip title=\"View runbook\">\n <IconButton\n size=\"small\"\n aria-label=\"View runbook\"\n component=\"a\"\n href={runbookUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <BookOpenIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n </Stack>\n </TableCell>\n )}\n </TableRow>\n );\n}\n\nfunction AlertGroupRow({\n group,\n expanded,\n allowedActions,\n columnDefs,\n columnKeySet,\n labelColorMappings,\n mappingsByKey,\n runbookAnnotationKey,\n onToggle,\n onSilence,\n duplicateCounts,\n showDuplicates,\n}: {\n group: AlertGroup;\n expanded: boolean;\n allowedActions: AlertAction[];\n columnDefs: ColumnDefinition[];\n columnKeySet: Set<string>;\n labelColorMappings: LabelColorMapping[];\n mappingsByKey: Map<string, LabelColorMapping>;\n runbookAnnotationKey: string;\n onToggle: () => void;\n onSilence: (alert: Alert) => void;\n duplicateCounts: Map<Alert, number>;\n showDuplicates: boolean;\n}): ReactElement {\n const showActions = allowedActions.length > 0;\n\n return (\n <>\n <TableRow sx={{ cursor: 'pointer', '& > td': { fontWeight: 'bold' } }} onClick={onToggle}>\n <TableCell colSpan={2}>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n {expanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n <Typography variant=\"body2\" fontWeight=\"bold\">\n {group.key || 'Ungrouped'}\n </Typography>\n <Chip label={`${group.summary.total}`} size=\"small\" variant=\"outlined\" />\n </Stack>\n </TableCell>\n {columnDefs.map((col, colIdx) => {\n const counts = group.summary.labelCounts?.[col.name];\n const mapping = mappingsByKey.get(col.name);\n if (counts && mapping) {\n return (\n <TableCell key={colIdx}>\n <LabelValueSummaryChips summary={group.summary} mapping={mapping} />\n </TableCell>\n );\n }\n if (counts) {\n return (\n <TableCell key={colIdx}>\n <Stack direction=\"row\" spacing={0.5}>\n {Object.entries(counts)\n .sort(([, a], [, b]) => b - a)\n .map(([value, count]) => (\n <Chip key={value} label={`${count} ${value}`} size=\"small\" variant=\"outlined\" />\n ))}\n </Stack>\n </TableCell>\n );\n }\n return <TableCell key={colIdx} />;\n })}\n {showDuplicates && <TableCell />}\n <TableCell>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\" flexWrap=\"wrap\" useFlexGap>\n <GroupSummaryChips summary={group.summary} />\n {labelColorMappings\n .filter((mapping) => !columnKeySet.has(mapping.labelKey))\n .map((mapping) => (\n <LabelValueSummaryChips key={mapping.labelKey} summary={group.summary} mapping={mapping} />\n ))}\n </Stack>\n </TableCell>\n {showActions && <TableCell />}\n </TableRow>\n {expanded &&\n group.alerts.map((alert, idx) => (\n <AlertRow\n key={alert.id ?? String(idx)}\n alert={alert}\n allowedActions={allowedActions}\n columnDefs={columnDefs}\n columnKeySet={columnKeySet}\n mappingsByKey={mappingsByKey}\n runbookAnnotationKey={runbookAnnotationKey}\n onSilence={onSilence}\n duplicateCount={duplicateCounts.get(alert)}\n showDuplicates={showDuplicates}\n />\n ))}\n </>\n );\n}\n\n/**\n * Alert hierarchical table panel component.\n * Displays alerts grouped by configurable labels with deduplication.\n */\nexport function AlertTablePanel({ spec, queryResults, contentDimensions }: AlertTablePanelProps): ReactElement {\n const datasourceSelector = useMemo(() => extractDatasourceSelector(queryResults), [queryResults]);\n const { data: amClient } = useDatasourceClient<AlertManagerClient>(datasourceSelector);\n const queryClient = useQueryClient();\n\n const [silenceTarget, setSilenceTarget] = useState<Alert | null>(null);\n const silenceKeyRef = useRef(0);\n const handleSetSilenceTarget = useCallback((alert: Alert) => {\n silenceKeyRef.current++;\n setSilenceTarget(alert);\n }, []);\n const [search, setSearch] = useState('');\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(new Set());\n const { successSnackbar, exceptionSnackbar } = useSnackbar();\n\n const handleSilenceSubmit = useCallback(\n async (silence: PostableSilence) => {\n if (!amClient) return;\n try {\n await amClient.createSilence(silence);\n setSilenceTarget(null);\n successSnackbar('Silence created successfully');\n queryClient.invalidateQueries({ queryKey: ['query', 'AlertsQuery'] });\n queryClient.invalidateQueries({ queryKey: ['query', 'SilencesQuery'] });\n } catch (err) {\n exceptionSnackbar(err);\n }\n },\n [amClient, queryClient, successSnackbar, exceptionSnackbar]\n );\n\n const silenceInitial = useMemo(() => {\n if (!silenceTarget) return undefined;\n return {\n matchers: Object.entries(silenceTarget.labels).map(([name, value]) => ({\n name,\n value,\n isEqual: true,\n isRegex: false,\n })),\n };\n }, [silenceTarget]);\n\n const defaultGroupBy = useMemo(() => spec.defaultGroupBy ?? ['alertname'], [spec.defaultGroupBy]);\n const variableNames = useMemo(\n () => [...new Set(defaultGroupBy.flatMap((entry) => parseVariables(entry)))],\n [defaultGroupBy]\n );\n const variableState = useAllVariableValues(variableNames);\n\n const resolvedDefaultGroupBy = useMemo(() => {\n const result: string[] = [];\n for (const entry of defaultGroupBy) {\n const vars = parseVariables(entry);\n if (vars.length === 0) {\n result.push(entry);\n } else if (vars.length === 1 && (entry === `$${vars[0]}` || entry === `\\${${vars[0]}}`)) {\n const varState = variableState[vars[0] ?? ''];\n if (varState?.value) {\n if (Array.isArray(varState.value)) {\n result.push(...varState.value);\n } else {\n result.push(varState.value);\n }\n }\n } else {\n const resolved = replaceVariablesInString(entry, variableState);\n if (resolved) result.push(resolved);\n }\n }\n return result;\n }, [defaultGroupBy, variableState]);\n\n const [groupBy, setGroupBy] = useState<string[]>(resolvedDefaultGroupBy);\n\n useEffect(() => {\n setGroupBy(resolvedDefaultGroupBy);\n }, [resolvedDefaultGroupBy]);\n\n const effectiveActions = useMemo<AlertAction[]>(\n () => spec.allowedActions ?? ALL_ALERT_ACTIONS,\n [spec.allowedActions]\n );\n const showActionsColumn = effectiveActions.length > 0;\n const runbookAnnotationKey = spec.runbookAnnotationKey || 'runbook_url';\n const columnDefs = useMemo(() => spec.columns ?? [], [spec.columns]);\n const columnKeySet = useMemo(() => new Set(columnDefs.map((c) => c.name)), [columnDefs]);\n const labelColorMappings = useMemo(() => spec.labelColorMappings ?? [], [spec.labelColorMappings]);\n const labelKeys = useMemo(() => labelColorMappings.map((m) => m.labelKey), [labelColorMappings]);\n const mappingsByKey = useMemo(() => new Map(labelColorMappings.map((m) => [m.labelKey, m])), [labelColorMappings]);\n\n const allTrackedKeys = useMemo(\n () => [...new Set([...labelKeys, ...columnDefs.map((c) => c.name)])],\n [labelKeys, columnDefs]\n );\n\n const initialSort = useMemo<SortState | null>(() => {\n const col = columnDefs.find((c) => c.sort && c.enableSorting !== false);\n if (!col?.sort) return null;\n return { columnName: col.name, direction: col.sort, mode: col.sortMode ?? 'alphabetical' };\n }, [columnDefs]);\n const [sortState, setSortState] = useState<SortState | null>(initialSort);\n\n const handleSortClick = useCallback((columnName: string, sortMode: ColumnSortMode = 'alphabetical'): void => {\n setSortState((prev) => {\n if (prev?.columnName === columnName) {\n return prev.direction === 'asc' ? { ...prev, direction: 'desc' } : null;\n }\n return { columnName, direction: 'asc', mode: sortMode };\n });\n }, []);\n\n // Flatten all alerts from all query results\n const allAlerts = useMemo(() => {\n return queryResults.flatMap((result) => result.data?.alerts ?? []);\n }, [queryResults]);\n\n // Deduplicate\n const dedupConfig = useMemo(() => spec.deduplication ?? { mode: 'fingerprint' as const }, [spec.deduplication]);\n const dedupResult = useMemo(() => deduplicateAlerts(allAlerts, dedupConfig), [allAlerts, dedupConfig]);\n const dedupAlerts = dedupResult.alerts;\n const duplicateCounts = dedupResult.duplicateCounts;\n const hasDuplicates = duplicateCounts.size > 0;\n\n // Filter by search term\n const alerts = useMemo(() => {\n const term = search.trim().toLowerCase();\n if (!term) return dedupAlerts;\n return dedupAlerts.filter((a: Alert) => {\n if (a.state.toLowerCase().includes(term)) return true;\n if (a.suppressed && ('suppressed'.includes(term) || 'silenced'.includes(term))) return true;\n if (Object.values(a.labels).some((v) => v.toLowerCase().includes(term))) return true;\n if (a.annotations && Object.values(a.annotations).some((v) => v.toLowerCase().includes(term))) return true;\n return false;\n });\n }, [dedupAlerts, search]);\n\n // Extract available label keys for group-by selector\n const availableLabelKeys = useMemo(() => extractLabelKeys(alerts), [alerts]);\n\n // Group alerts\n const groups = useMemo<AlertGroup[]>(() => {\n let result: AlertGroup[];\n\n if (groupBy.length === 0) {\n result = [{ key: '', alerts: [...alerts], summary: getGroupSummary(alerts, allTrackedKeys) }];\n } else {\n const groupMap = new Map<string, Alert[]>();\n for (const alert of alerts) {\n const key = getGroupKey(alert, groupBy);\n const existing = groupMap.get(key) ?? [];\n existing.push(alert);\n groupMap.set(key, existing);\n }\n\n result = Array.from(groupMap.entries()).map(([key, groupAlerts]) => ({\n key,\n alerts: groupAlerts,\n summary: getGroupSummary(groupAlerts, allTrackedKeys),\n }));\n }\n\n if (sortState) {\n for (const group of result) {\n group.alerts.sort((a, b) => compareAlertsByColumn(a, b, sortState));\n }\n result.sort((a, b) =>\n compareGroupsByColumn(\n a.summary.labelCounts?.[sortState.columnName],\n b.summary.labelCounts?.[sortState.columnName],\n sortState\n )\n );\n }\n\n return result;\n }, [alerts, groupBy, allTrackedKeys, sortState]);\n\n const prevGroupKeysRef = useRef<string>('');\n useEffect(() => {\n const currentKeys = groups.map((g) => g.key).join('\\0');\n if (currentKeys === prevGroupKeysRef.current) return;\n prevGroupKeysRef.current = currentKeys;\n\n if (groups.length === 1) {\n setExpandedGroups(new Set(groups.map((g) => g.key)));\n } else {\n setExpandedGroups(new Set());\n }\n }, [groups]);\n\n const handleToggleGroup = useCallback((key: string) => {\n setExpandedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }, []);\n\n const handleExpandAll = useCallback(() => {\n setExpandedGroups(new Set(groups.map((g) => g.key)));\n }, [groups]);\n\n const handleCollapseAll = useCallback(() => {\n setExpandedGroups(new Set());\n }, []);\n\n const handleGroupByChange = (event: SelectChangeEvent<string[]>): void => {\n const value = event.target.value;\n setGroupBy(typeof value === 'string' ? value.split(',') : value);\n };\n\n if (allAlerts.length === 0) {\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: contentDimensions?.height ?? '100%',\n }}\n >\n <Typography>No alerts to display</Typography>\n </Box>\n );\n }\n\n return (\n <Stack spacing={1} sx={{ height: contentDimensions?.height, overflow: 'auto' }}>\n <Stack direction=\"row\" spacing={2} alignItems=\"center\" sx={{ px: 1, pt: 1 }}>\n <TextField\n size=\"small\"\n placeholder=\"Search alerts...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ minWidth: 200 }}\n slotProps={{\n htmlInput: { 'aria-label': 'Search alerts' },\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <MagnifyIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n },\n }}\n />\n <FormControl size=\"small\" sx={{ minWidth: 200 }}>\n <InputLabel id=\"group-by-label\">Group by</InputLabel>\n <Select\n labelId=\"group-by-label\"\n multiple\n value={groupBy}\n onChange={handleGroupByChange}\n label=\"Group by\"\n renderValue={(selected) => selected.join(', ')}\n >\n {availableLabelKeys.map((key) => (\n <MenuItem key={key} value={key}>\n {key}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ flexGrow: 1 }}>\n {alerts.length} alert{alerts.length !== 1 ? 's' : ''} in {groups.length} group\n {groups.length !== 1 ? 's' : ''}\n </Typography>\n <Stack direction=\"row\" spacing={0.5}>\n <Tooltip title=\"Expand all groups\">\n <IconButton size=\"small\" aria-label=\"Expand all groups\" onClick={handleExpandAll}>\n <UnfoldMoreHorizontalIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Collapse all groups\">\n <IconButton size=\"small\" aria-label=\"Collapse all groups\" onClick={handleCollapseAll}>\n <UnfoldLessHorizontalIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n </Stack>\n </Stack>\n <TableContainer>\n <Table size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell sortDirection={sortState?.columnName === SORT_COL_STATUS ? sortState.direction : false}>\n <TableSortLabel\n active={sortState?.columnName === SORT_COL_STATUS}\n direction={sortState?.columnName === SORT_COL_STATUS ? sortState.direction : 'asc'}\n onClick={() => handleSortClick(SORT_COL_STATUS, 'status')}\n >\n Status\n </TableSortLabel>\n </TableCell>\n <TableCell sortDirection={sortState?.columnName === SORT_COL_ALERTNAME ? sortState.direction : false}>\n <TableSortLabel\n active={sortState?.columnName === SORT_COL_ALERTNAME}\n direction={sortState?.columnName === SORT_COL_ALERTNAME ? sortState.direction : 'asc'}\n onClick={() => handleSortClick(SORT_COL_ALERTNAME, 'alphabetical')}\n >\n Alert Name\n </TableSortLabel>\n </TableCell>\n {columnDefs.map((col, colIdx) => (\n <TableCell\n key={colIdx}\n sortDirection={sortState?.columnName === col.name ? sortState.direction : false}\n >\n {col.enableSorting !== false ? (\n <TableSortLabel\n active={sortState?.columnName === col.name}\n direction={sortState?.columnName === col.name ? sortState.direction : 'asc'}\n onClick={() => handleSortClick(col.name, col.sortMode)}\n >\n {col.header ?? col.name}\n </TableSortLabel>\n ) : (\n (col.header ?? col.name)\n )}\n </TableCell>\n ))}\n {hasDuplicates && <TableCell>Duplicates</TableCell>}\n <TableCell>Labels</TableCell>\n {showActionsColumn && <TableCell>Actions</TableCell>}\n </TableRow>\n </TableHead>\n <TableBody>\n {alerts.length === 0 ? (\n <TableRow>\n <TableCell colSpan={99} align=\"center\" sx={{ py: 4 }}>\n <Typography color=\"text.secondary\">No matching alerts</Typography>\n </TableCell>\n </TableRow>\n ) : (\n groups.map((group) => (\n <AlertGroupRow\n key={group.key}\n group={group}\n expanded={expandedGroups.has(group.key)}\n allowedActions={effectiveActions}\n columnDefs={columnDefs}\n columnKeySet={columnKeySet}\n labelColorMappings={labelColorMappings}\n mappingsByKey={mappingsByKey}\n runbookAnnotationKey={runbookAnnotationKey}\n onToggle={() => handleToggleGroup(group.key)}\n onSilence={handleSetSilenceTarget}\n duplicateCounts={duplicateCounts}\n showDuplicates={hasDuplicates}\n />\n ))\n )}\n </TableBody>\n </Table>\n </TableContainer>\n <SilenceForm\n key={silenceKeyRef.current}\n open={!!silenceTarget}\n onClose={() => setSilenceTarget(null)}\n onSubmit={handleSilenceSubmit}\n initialSilence={silenceInitial}\n />\n </Stack>\n );\n}\n"],"names":["Box","Chip","FormControl","IconButton","InputAdornment","InputLabel","MenuItem","Select","Stack","Table","TableBody","TableCell","TableContainer","TableHead","TableRow","TableSortLabel","TextField","Tooltip","Typography","useSnackbar","parseVariables","replaceVariablesInString","useAllVariableValues","useDatasourceClient","useQueryClient","BellOffIcon","BookOpenIcon","ChevronDownIcon","ChevronRightIcon","MagnifyIcon","UnfoldLessHorizontalIcon","UnfoldMoreHorizontalIcon","useCallback","useEffect","useMemo","useRef","useState","SilenceForm","StatusBadge","extractDatasourceSelector","ALL_ALERT_ACTIONS","deduplicateAlerts","extractLabelKeys","getGroupKey","getGroupSummary","compareAlertsByColumn","compareGroupsByColumn","SORT_COL_ALERTNAME","SORT_COL_STATUS","getLabelColor","GroupSummaryChips","summary","direction","spacing","firing","label","color","size","suppressed","pending","LabelValueSummaryChips","mapping","counts","labelCounts","labelKey","Object","keys","length","entries","sort","a","b","map","value","count","bgColor","sx","backgroundColor","fontWeight","AlertRow","alert","allowedActions","columnDefs","columnKeySet","mappingsByKey","runbookAnnotationKey","onSilence","duplicateCount","showDuplicates","runbookUrl","annotations","showActions","hover","status","state","variant","name","col","colIdx","labels","get","undefined","flexWrap","useFlexGap","filter","key","has","includes","title","aria-label","onClick","fontSize","component","href","target","rel","AlertGroupRow","group","expanded","labelColorMappings","onToggle","duplicateCounts","cursor","colSpan","alignItems","total","alerts","idx","id","String","AlertTablePanel","spec","queryResults","contentDimensions","datasourceSelector","data","amClient","queryClient","silenceTarget","setSilenceTarget","silenceKeyRef","handleSetSilenceTarget","current","search","setSearch","expandedGroups","setExpandedGroups","Set","successSnackbar","exceptionSnackbar","handleSilenceSubmit","silence","createSilence","invalidateQueries","queryKey","err","silenceInitial","matchers","isEqual","isRegex","defaultGroupBy","variableNames","flatMap","entry","variableState","resolvedDefaultGroupBy","result","vars","push","varState","Array","isArray","resolved","groupBy","setGroupBy","effectiveActions","showActionsColumn","columns","c","labelKeys","m","Map","allTrackedKeys","initialSort","find","enableSorting","columnName","mode","sortMode","sortState","setSortState","handleSortClick","prev","allAlerts","dedupConfig","deduplication","dedupResult","dedupAlerts","hasDuplicates","term","trim","toLowerCase","values","some","v","availableLabelKeys","groups","groupMap","existing","set","from","groupAlerts","prevGroupKeysRef","currentKeys","g","join","handleToggleGroup","next","delete","add","handleExpandAll","handleCollapseAll","handleGroupByChange","event","split","display","justifyContent","height","overflow","px","pt","placeholder","onChange","e","minWidth","slotProps","htmlInput","input","startAdornment","position","labelId","multiple","renderValue","selected","flexGrow","stickyHeader","sortDirection","active","header","align","py","open","onClose","onSubmit","initialSilence"],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Alert } from '@perses-dev/spec';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for how alerts should be deduplicated across datasources.
|
|
4
|
+
*/
|
|
5
|
+
export interface AlertDeduplicationConfig {
|
|
6
|
+
mode: 'none' | 'fingerprint' | 'labels';
|
|
7
|
+
labels?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface DeduplicationResult {
|
|
10
|
+
alerts: Alert[];
|
|
11
|
+
duplicateCounts: Map<Alert, number>;
|
|
12
|
+
}
|
|
13
|
+
export type AlertAction = 'silence' | 'runbook';
|
|
14
|
+
export declare const ALL_ALERT_ACTIONS: AlertAction[];
|
|
15
|
+
export interface LabelColorOverride {
|
|
16
|
+
value: string;
|
|
17
|
+
isRegex: boolean;
|
|
18
|
+
color: string;
|
|
19
|
+
}
|
|
20
|
+
export interface LabelColorMapping {
|
|
21
|
+
labelKey: string;
|
|
22
|
+
mode: 'auto' | 'severity' | 'manual';
|
|
23
|
+
overrides?: LabelColorOverride[];
|
|
24
|
+
}
|
|
25
|
+
export type SortDirection = 'asc' | 'desc';
|
|
26
|
+
export type ColumnSortMode = 'alphabetical' | 'numeric' | 'severity' | 'status';
|
|
27
|
+
export interface ColumnDefinition {
|
|
28
|
+
name: string;
|
|
29
|
+
header?: string;
|
|
30
|
+
enableSorting?: boolean;
|
|
31
|
+
sort?: SortDirection;
|
|
32
|
+
sortMode?: ColumnSortMode;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Options for the AlertTable panel plugin.
|
|
36
|
+
*/
|
|
37
|
+
export interface AlertTableOptions {
|
|
38
|
+
defaultGroupBy?: string[];
|
|
39
|
+
columns?: ColumnDefinition[];
|
|
40
|
+
deduplication?: AlertDeduplicationConfig;
|
|
41
|
+
allowedActions?: AlertAction[];
|
|
42
|
+
runbookAnnotationKey?: string;
|
|
43
|
+
labelColorMappings?: LabelColorMapping[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Summary of alert counts by state within a group.
|
|
47
|
+
*/
|
|
48
|
+
export interface GroupSummary {
|
|
49
|
+
total: number;
|
|
50
|
+
firing: number;
|
|
51
|
+
suppressed: number;
|
|
52
|
+
pending: number;
|
|
53
|
+
labelCounts?: Record<string, Record<string, number>>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Deduplicate alerts based on the configured deduplication mode.
|
|
57
|
+
* - 'fingerprint' (default): Uses the alert's fingerprint field.
|
|
58
|
+
* - 'labels': Uses a combination of specified label values.
|
|
59
|
+
*/
|
|
60
|
+
export declare function deduplicateAlerts(alerts: Alert[], config: AlertDeduplicationConfig): DeduplicationResult;
|
|
61
|
+
/**
|
|
62
|
+
* Extract all unique label keys from a list of alerts.
|
|
63
|
+
*/
|
|
64
|
+
export declare function extractLabelKeys(alerts: Alert[]): string[];
|
|
65
|
+
/**
|
|
66
|
+
* Build a group key string from an alert's labels and the specified group-by labels.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getGroupKey(alert: Alert, groupBy: string[]): string;
|
|
69
|
+
/**
|
|
70
|
+
* Compute a summary of alert counts by state for a group of alerts.
|
|
71
|
+
*/
|
|
72
|
+
export declare function getGroupSummary(alerts: Alert[], labelKeys?: string[]): GroupSummary;
|
|
73
|
+
//# sourceMappingURL=alert-table-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-table-model.d.ts","sourceRoot":"","sources":["../../../../src/plugins/alert-table/alert-table-model.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGzC;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,eAAe,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAA2B,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IACrC,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,wBAAwB,CAAC;IACzC,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,wBAAwB,GAAG,mBAAmB,CAmCxG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAQ1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,CAmDnF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Copyright The Perses Authors
|
|
2
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
// you may not use this file except in compliance with the License.
|
|
4
|
+
// You may obtain a copy of the License at
|
|
5
|
+
//
|
|
6
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
//
|
|
8
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
// See the License for the specific language governing permissions and
|
|
12
|
+
// limitations under the License.
|
|
13
|
+
import { getEffectiveStatus, SORT_COL_ALERTNAME, SORT_COL_STATUS } from './alert-table-sorting';
|
|
14
|
+
export const ALL_ALERT_ACTIONS = [
|
|
15
|
+
'silence',
|
|
16
|
+
'runbook'
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Deduplicate alerts based on the configured deduplication mode.
|
|
20
|
+
* - 'fingerprint' (default): Uses the alert's fingerprint field.
|
|
21
|
+
* - 'labels': Uses a combination of specified label values.
|
|
22
|
+
*/ export function deduplicateAlerts(alerts, config) {
|
|
23
|
+
if (alerts.length === 0 || config.mode === 'none') return {
|
|
24
|
+
alerts,
|
|
25
|
+
duplicateCounts: new Map()
|
|
26
|
+
};
|
|
27
|
+
const seen = new Map();
|
|
28
|
+
const counts = new Map();
|
|
29
|
+
const result = [];
|
|
30
|
+
for (const alert of alerts){
|
|
31
|
+
let key;
|
|
32
|
+
if (config.mode === 'labels' && config.labels) {
|
|
33
|
+
key = config.labels.map((l)=>`${l}=${alert.labels[l] ?? ''}`).join(',');
|
|
34
|
+
} else if (alert.id) {
|
|
35
|
+
key = alert.id;
|
|
36
|
+
} else {
|
|
37
|
+
key = JSON.stringify(alert.labels);
|
|
38
|
+
}
|
|
39
|
+
if (!seen.has(key)) {
|
|
40
|
+
seen.set(key, alert);
|
|
41
|
+
counts.set(key, 1);
|
|
42
|
+
result.push(alert);
|
|
43
|
+
} else {
|
|
44
|
+
counts.set(key, (counts.get(key) ?? 1) + 1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const duplicateCounts = new Map();
|
|
48
|
+
for (const [key, alert] of seen){
|
|
49
|
+
const count = counts.get(key) ?? 1;
|
|
50
|
+
if (count > 1) {
|
|
51
|
+
duplicateCounts.set(alert, count);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
alerts: result,
|
|
56
|
+
duplicateCounts
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extract all unique label keys from a list of alerts.
|
|
61
|
+
*/ export function extractLabelKeys(alerts) {
|
|
62
|
+
const keys = new Set();
|
|
63
|
+
for (const alert of alerts){
|
|
64
|
+
for (const key of Object.keys(alert.labels)){
|
|
65
|
+
keys.add(key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return Array.from(keys).sort();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build a group key string from an alert's labels and the specified group-by labels.
|
|
72
|
+
*/ export function getGroupKey(alert, groupBy) {
|
|
73
|
+
return groupBy.map((label)=>`${label}=${alert.labels[label] ?? ''}`).join(',');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Compute a summary of alert counts by state for a group of alerts.
|
|
77
|
+
*/ export function getGroupSummary(alerts, labelKeys) {
|
|
78
|
+
const summary = {
|
|
79
|
+
total: 0,
|
|
80
|
+
firing: 0,
|
|
81
|
+
suppressed: 0,
|
|
82
|
+
pending: 0
|
|
83
|
+
};
|
|
84
|
+
const labelCounts = {};
|
|
85
|
+
labelCounts[SORT_COL_STATUS] = {};
|
|
86
|
+
labelCounts[SORT_COL_ALERTNAME] = {};
|
|
87
|
+
if (labelKeys) {
|
|
88
|
+
for (const key of labelKeys){
|
|
89
|
+
labelCounts[key] = {};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const alert of alerts){
|
|
93
|
+
summary.total++;
|
|
94
|
+
if (alert.suppressed) {
|
|
95
|
+
summary.suppressed++;
|
|
96
|
+
} else {
|
|
97
|
+
switch(alert.state){
|
|
98
|
+
case 'firing':
|
|
99
|
+
summary.firing++;
|
|
100
|
+
break;
|
|
101
|
+
case 'pending':
|
|
102
|
+
summary.pending++;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const status = getEffectiveStatus(alert);
|
|
107
|
+
labelCounts[SORT_COL_STATUS][status] = (labelCounts[SORT_COL_STATUS][status] ?? 0) + 1;
|
|
108
|
+
if (alert.name) {
|
|
109
|
+
labelCounts[SORT_COL_ALERTNAME][alert.name] = (labelCounts[SORT_COL_ALERTNAME][alert.name] ?? 0) + 1;
|
|
110
|
+
}
|
|
111
|
+
if (labelKeys) {
|
|
112
|
+
for (const key of labelKeys){
|
|
113
|
+
const labelValue = alert.labels[key];
|
|
114
|
+
if (labelValue !== undefined) {
|
|
115
|
+
const counts = labelCounts[key];
|
|
116
|
+
if (counts) {
|
|
117
|
+
counts[labelValue] = (counts[labelValue] ?? 0) + 1;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
summary.labelCounts = labelCounts;
|
|
124
|
+
return summary;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=alert-table-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/plugins/alert-table/alert-table-model.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Alert } from '@perses-dev/spec';\nimport { getEffectiveStatus, SORT_COL_ALERTNAME, SORT_COL_STATUS } from './alert-table-sorting';\n\n/**\n * Configuration for how alerts should be deduplicated across datasources.\n */\nexport interface AlertDeduplicationConfig {\n mode: 'none' | 'fingerprint' | 'labels';\n labels?: string[];\n}\n\nexport interface DeduplicationResult {\n alerts: Alert[];\n duplicateCounts: Map<Alert, number>;\n}\n\nexport type AlertAction = 'silence' | 'runbook';\n\nexport const ALL_ALERT_ACTIONS: AlertAction[] = ['silence', 'runbook'];\n\nexport interface LabelColorOverride {\n value: string;\n isRegex: boolean;\n color: string;\n}\n\nexport interface LabelColorMapping {\n labelKey: string;\n mode: 'auto' | 'severity' | 'manual';\n overrides?: LabelColorOverride[];\n}\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport type ColumnSortMode = 'alphabetical' | 'numeric' | 'severity' | 'status';\n\nexport interface ColumnDefinition {\n name: string;\n header?: string;\n enableSorting?: boolean;\n sort?: SortDirection;\n sortMode?: ColumnSortMode;\n}\n\n/**\n * Options for the AlertTable panel plugin.\n */\nexport interface AlertTableOptions {\n defaultGroupBy?: string[];\n columns?: ColumnDefinition[];\n deduplication?: AlertDeduplicationConfig;\n allowedActions?: AlertAction[];\n runbookAnnotationKey?: string;\n labelColorMappings?: LabelColorMapping[];\n}\n\n/**\n * Summary of alert counts by state within a group.\n */\nexport interface GroupSummary {\n total: number;\n firing: number;\n suppressed: number;\n pending: number;\n labelCounts?: Record<string, Record<string, number>>;\n}\n\n/**\n * Deduplicate alerts based on the configured deduplication mode.\n * - 'fingerprint' (default): Uses the alert's fingerprint field.\n * - 'labels': Uses a combination of specified label values.\n */\nexport function deduplicateAlerts(alerts: Alert[], config: AlertDeduplicationConfig): DeduplicationResult {\n if (alerts.length === 0 || config.mode === 'none') return { alerts, duplicateCounts: new Map() };\n\n const seen = new Map<string, Alert>();\n const counts = new Map<string, number>();\n const result: Alert[] = [];\n\n for (const alert of alerts) {\n let key: string;\n if (config.mode === 'labels' && config.labels) {\n key = config.labels.map((l) => `${l}=${alert.labels[l] ?? ''}`).join(',');\n } else if (alert.id) {\n key = alert.id;\n } else {\n key = JSON.stringify(alert.labels);\n }\n\n if (!seen.has(key)) {\n seen.set(key, alert);\n counts.set(key, 1);\n result.push(alert);\n } else {\n counts.set(key, (counts.get(key) ?? 1) + 1);\n }\n }\n\n const duplicateCounts = new Map<Alert, number>();\n for (const [key, alert] of seen) {\n const count = counts.get(key) ?? 1;\n if (count > 1) {\n duplicateCounts.set(alert, count);\n }\n }\n\n return { alerts: result, duplicateCounts };\n}\n\n/**\n * Extract all unique label keys from a list of alerts.\n */\nexport function extractLabelKeys(alerts: Alert[]): string[] {\n const keys = new Set<string>();\n for (const alert of alerts) {\n for (const key of Object.keys(alert.labels)) {\n keys.add(key);\n }\n }\n return Array.from(keys).sort();\n}\n\n/**\n * Build a group key string from an alert's labels and the specified group-by labels.\n */\nexport function getGroupKey(alert: Alert, groupBy: string[]): string {\n return groupBy.map((label) => `${label}=${alert.labels[label] ?? ''}`).join(',');\n}\n\n/**\n * Compute a summary of alert counts by state for a group of alerts.\n */\nexport function getGroupSummary(alerts: Alert[], labelKeys?: string[]): GroupSummary {\n const summary: GroupSummary = { total: 0, firing: 0, suppressed: 0, pending: 0 };\n const labelCounts: Record<string, Record<string, number>> = {};\n\n labelCounts[SORT_COL_STATUS] = {};\n labelCounts[SORT_COL_ALERTNAME] = {};\n\n if (labelKeys) {\n for (const key of labelKeys) {\n labelCounts[key] = {};\n }\n }\n\n for (const alert of alerts) {\n summary.total++;\n if (alert.suppressed) {\n summary.suppressed++;\n } else {\n switch (alert.state) {\n case 'firing':\n summary.firing++;\n break;\n case 'pending':\n summary.pending++;\n break;\n }\n }\n\n const status = getEffectiveStatus(alert);\n labelCounts[SORT_COL_STATUS]![status] = (labelCounts[SORT_COL_STATUS]![status] ?? 0) + 1;\n\n if (alert.name) {\n labelCounts[SORT_COL_ALERTNAME]![alert.name] = (labelCounts[SORT_COL_ALERTNAME]![alert.name] ?? 0) + 1;\n }\n\n if (labelKeys) {\n for (const key of labelKeys) {\n const labelValue = alert.labels[key];\n if (labelValue !== undefined) {\n const counts = labelCounts[key];\n if (counts) {\n counts[labelValue] = (counts[labelValue] ?? 0) + 1;\n }\n }\n }\n }\n }\n\n summary.labelCounts = labelCounts;\n\n return summary;\n}\n"],"names":["getEffectiveStatus","SORT_COL_ALERTNAME","SORT_COL_STATUS","ALL_ALERT_ACTIONS","deduplicateAlerts","alerts","config","length","mode","duplicateCounts","Map","seen","counts","result","alert","key","labels","map","l","join","id","JSON","stringify","has","set","push","get","count","extractLabelKeys","keys","Set","Object","add","Array","from","sort","getGroupKey","groupBy","label","getGroupSummary","labelKeys","summary","total","firing","suppressed","pending","labelCounts","state","status","name","labelValue","undefined"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Alert } from '@perses-dev/spec';
|
|
2
|
+
import { ColumnSortMode, SortDirection } from './alert-table-model';
|
|
3
|
+
export declare const SORT_COL_STATUS = "__status__";
|
|
4
|
+
export declare const SORT_COL_ALERTNAME = "__alertname__";
|
|
5
|
+
export interface SortState {
|
|
6
|
+
columnName: string;
|
|
7
|
+
direction: SortDirection;
|
|
8
|
+
mode: ColumnSortMode;
|
|
9
|
+
}
|
|
10
|
+
export declare function getEffectiveStatus(alert: Alert): string;
|
|
11
|
+
export declare function compareAlertsByColumn(a: Alert, b: Alert, sort: SortState): number;
|
|
12
|
+
export declare function compareGroupsByColumn(aCounts: Record<string, number> | undefined, bCounts: Record<string, number> | undefined, sort: SortState): number;
|
|
13
|
+
//# sourceMappingURL=alert-table-sorting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert-table-sorting.d.ts","sourceRoot":"","sources":["../../../../src/plugins/alert-table/alert-table-sorting.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,aAAa,CAAC;IACzB,IAAI,EAAE,cAAc,CAAC;CACtB;AAUD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEvD;AAkCD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CA0BjF;AA4CD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,IAAI,EAAE,SAAS,GACd,MAAM,CAoDR"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// Copyright The Perses Authors
|
|
2
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
// you may not use this file except in compliance with the License.
|
|
4
|
+
// You may obtain a copy of the License at
|
|
5
|
+
//
|
|
6
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
//
|
|
8
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
// See the License for the specific language governing permissions and
|
|
12
|
+
// limitations under the License.
|
|
13
|
+
import { getSeverityWeight, SEVERITY_ORDER } from './label-colors';
|
|
14
|
+
export const SORT_COL_STATUS = '__status__';
|
|
15
|
+
export const SORT_COL_ALERTNAME = '__alertname__';
|
|
16
|
+
const STATUS_WEIGHT = {
|
|
17
|
+
firing: 0,
|
|
18
|
+
pending: 1,
|
|
19
|
+
suppressed: 2,
|
|
20
|
+
inactive: 3,
|
|
21
|
+
resolved: 4
|
|
22
|
+
};
|
|
23
|
+
export function getEffectiveStatus(alert) {
|
|
24
|
+
return alert.suppressed ? 'suppressed' : alert.state;
|
|
25
|
+
}
|
|
26
|
+
function compareStatus(a, b) {
|
|
27
|
+
const wa = a !== undefined ? STATUS_WEIGHT[a] ?? 5 : 5;
|
|
28
|
+
const wb = b !== undefined ? STATUS_WEIGHT[b] ?? 5 : 5;
|
|
29
|
+
return wa - wb;
|
|
30
|
+
}
|
|
31
|
+
function directionMultiplier(direction) {
|
|
32
|
+
return direction === 'asc' ? 1 : -1;
|
|
33
|
+
}
|
|
34
|
+
function compareAlphabetical(a, b) {
|
|
35
|
+
if (a === undefined && b === undefined) return 0;
|
|
36
|
+
if (a === undefined) return 1;
|
|
37
|
+
if (b === undefined) return -1;
|
|
38
|
+
return a.localeCompare(b);
|
|
39
|
+
}
|
|
40
|
+
function compareNumeric(a, b) {
|
|
41
|
+
const na = a !== undefined ? parseFloat(a) : NaN;
|
|
42
|
+
const nb = b !== undefined ? parseFloat(b) : NaN;
|
|
43
|
+
if (isNaN(na) && isNaN(nb)) return 0;
|
|
44
|
+
if (isNaN(na)) return 1;
|
|
45
|
+
if (isNaN(nb)) return -1;
|
|
46
|
+
return na - nb;
|
|
47
|
+
}
|
|
48
|
+
function compareSeverity(a, b) {
|
|
49
|
+
const wa = a !== undefined ? getSeverityWeight(a) : SEVERITY_ORDER.length;
|
|
50
|
+
const wb = b !== undefined ? getSeverityWeight(b) : SEVERITY_ORDER.length;
|
|
51
|
+
return wa - wb;
|
|
52
|
+
}
|
|
53
|
+
export function compareAlertsByColumn(a, b, sort) {
|
|
54
|
+
if (sort.columnName === SORT_COL_STATUS) {
|
|
55
|
+
return compareStatus(getEffectiveStatus(a), getEffectiveStatus(b)) * directionMultiplier(sort.direction);
|
|
56
|
+
}
|
|
57
|
+
if (sort.columnName === SORT_COL_ALERTNAME) {
|
|
58
|
+
return compareAlphabetical(a.name, b.name) * directionMultiplier(sort.direction);
|
|
59
|
+
}
|
|
60
|
+
const va = a.labels[sort.columnName];
|
|
61
|
+
const vb = b.labels[sort.columnName];
|
|
62
|
+
let result;
|
|
63
|
+
switch(sort.mode){
|
|
64
|
+
case 'numeric':
|
|
65
|
+
result = compareNumeric(va, vb);
|
|
66
|
+
break;
|
|
67
|
+
case 'severity':
|
|
68
|
+
result = compareSeverity(va, vb);
|
|
69
|
+
break;
|
|
70
|
+
case 'alphabetical':
|
|
71
|
+
default:
|
|
72
|
+
result = compareAlphabetical(va, vb);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
return result * directionMultiplier(sort.direction);
|
|
76
|
+
}
|
|
77
|
+
function getMostFrequentValue(counts) {
|
|
78
|
+
let maxCount = 0;
|
|
79
|
+
let maxValue;
|
|
80
|
+
for (const [value, count] of Object.entries(counts)){
|
|
81
|
+
if (count > maxCount) {
|
|
82
|
+
maxCount = count;
|
|
83
|
+
maxValue = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
value: maxValue,
|
|
88
|
+
count: maxCount
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function getMostCriticalStatus(counts) {
|
|
92
|
+
let minWeight = 5;
|
|
93
|
+
let countAtMin = 0;
|
|
94
|
+
for (const [value, count] of Object.entries(counts)){
|
|
95
|
+
const weight = STATUS_WEIGHT[value] ?? 5;
|
|
96
|
+
if (weight < minWeight) {
|
|
97
|
+
minWeight = weight;
|
|
98
|
+
countAtMin = count;
|
|
99
|
+
} else if (weight === minWeight) {
|
|
100
|
+
countAtMin += count;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
weight: minWeight,
|
|
105
|
+
count: countAtMin
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function getMostCriticalSeverity(counts) {
|
|
109
|
+
let minWeight = SEVERITY_ORDER.length;
|
|
110
|
+
let countAtMin = 0;
|
|
111
|
+
for (const [value, count] of Object.entries(counts)){
|
|
112
|
+
const weight = getSeverityWeight(value);
|
|
113
|
+
if (weight < minWeight) {
|
|
114
|
+
minWeight = weight;
|
|
115
|
+
countAtMin = count;
|
|
116
|
+
} else if (weight === minWeight) {
|
|
117
|
+
countAtMin += count;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
weight: minWeight,
|
|
122
|
+
count: countAtMin
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function compareGroupsByColumn(aCounts, bCounts, sort) {
|
|
126
|
+
const emptyA = !aCounts || Object.keys(aCounts).length === 0;
|
|
127
|
+
const emptyB = !bCounts || Object.keys(bCounts).length === 0;
|
|
128
|
+
if (emptyA && emptyB) return 0;
|
|
129
|
+
if (emptyA) return 1;
|
|
130
|
+
if (emptyB) return -1;
|
|
131
|
+
let result;
|
|
132
|
+
switch(sort.mode){
|
|
133
|
+
case 'status':
|
|
134
|
+
{
|
|
135
|
+
const statusA = getMostCriticalStatus(aCounts);
|
|
136
|
+
const statusB = getMostCriticalStatus(bCounts);
|
|
137
|
+
result = statusA.weight - statusB.weight;
|
|
138
|
+
if (result === 0) {
|
|
139
|
+
result = statusB.count - statusA.count;
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case 'severity':
|
|
144
|
+
{
|
|
145
|
+
const sevA = getMostCriticalSeverity(aCounts);
|
|
146
|
+
const sevB = getMostCriticalSeverity(bCounts);
|
|
147
|
+
result = sevA.weight - sevB.weight;
|
|
148
|
+
if (result === 0) {
|
|
149
|
+
result = sevB.count - sevA.count;
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case 'numeric':
|
|
154
|
+
{
|
|
155
|
+
const freqA = getMostFrequentValue(aCounts);
|
|
156
|
+
const freqB = getMostFrequentValue(bCounts);
|
|
157
|
+
const numResult = compareNumeric(freqA.value, freqB.value);
|
|
158
|
+
if (numResult !== 0) {
|
|
159
|
+
return numResult * directionMultiplier(sort.direction);
|
|
160
|
+
}
|
|
161
|
+
// Tie-break by count is always descending (larger groups first) regardless of sort direction
|
|
162
|
+
return freqB.count - freqA.count;
|
|
163
|
+
}
|
|
164
|
+
case 'alphabetical':
|
|
165
|
+
default:
|
|
166
|
+
{
|
|
167
|
+
const freqA = getMostFrequentValue(aCounts);
|
|
168
|
+
const freqB = getMostFrequentValue(bCounts);
|
|
169
|
+
const alphaResult = compareAlphabetical(freqA.value, freqB.value);
|
|
170
|
+
if (alphaResult !== 0) {
|
|
171
|
+
return alphaResult * directionMultiplier(sort.direction);
|
|
172
|
+
}
|
|
173
|
+
// Tie-break by count is always descending (larger groups first) regardless of sort direction
|
|
174
|
+
return freqB.count - freqA.count;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return result * directionMultiplier(sort.direction);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
//# sourceMappingURL=alert-table-sorting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/plugins/alert-table/alert-table-sorting.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Alert } from '@perses-dev/spec';\nimport { ColumnSortMode, SortDirection } from './alert-table-model';\nimport { getSeverityWeight, SEVERITY_ORDER } from './label-colors';\n\nexport const SORT_COL_STATUS = '__status__';\nexport const SORT_COL_ALERTNAME = '__alertname__';\n\nexport interface SortState {\n columnName: string;\n direction: SortDirection;\n mode: ColumnSortMode;\n}\n\nconst STATUS_WEIGHT: Record<string, number> = {\n firing: 0,\n pending: 1,\n suppressed: 2,\n inactive: 3,\n resolved: 4,\n};\n\nexport function getEffectiveStatus(alert: Alert): string {\n return alert.suppressed ? 'suppressed' : alert.state;\n}\n\nfunction compareStatus(a: string | undefined, b: string | undefined): number {\n const wa = a !== undefined ? (STATUS_WEIGHT[a] ?? 5) : 5;\n const wb = b !== undefined ? (STATUS_WEIGHT[b] ?? 5) : 5;\n return wa - wb;\n}\n\nfunction directionMultiplier(direction: SortDirection): number {\n return direction === 'asc' ? 1 : -1;\n}\n\nfunction compareAlphabetical(a: string | undefined, b: string | undefined): number {\n if (a === undefined && b === undefined) return 0;\n if (a === undefined) return 1;\n if (b === undefined) return -1;\n return a.localeCompare(b);\n}\n\nfunction compareNumeric(a: string | undefined, b: string | undefined): number {\n const na = a !== undefined ? parseFloat(a) : NaN;\n const nb = b !== undefined ? parseFloat(b) : NaN;\n if (isNaN(na) && isNaN(nb)) return 0;\n if (isNaN(na)) return 1;\n if (isNaN(nb)) return -1;\n return na - nb;\n}\n\nfunction compareSeverity(a: string | undefined, b: string | undefined): number {\n const wa = a !== undefined ? getSeverityWeight(a) : SEVERITY_ORDER.length;\n const wb = b !== undefined ? getSeverityWeight(b) : SEVERITY_ORDER.length;\n return wa - wb;\n}\n\nexport function compareAlertsByColumn(a: Alert, b: Alert, sort: SortState): number {\n if (sort.columnName === SORT_COL_STATUS) {\n return compareStatus(getEffectiveStatus(a), getEffectiveStatus(b)) * directionMultiplier(sort.direction);\n }\n if (sort.columnName === SORT_COL_ALERTNAME) {\n return compareAlphabetical(a.name, b.name) * directionMultiplier(sort.direction);\n }\n\n const va = a.labels[sort.columnName];\n const vb = b.labels[sort.columnName];\n let result: number;\n\n switch (sort.mode) {\n case 'numeric':\n result = compareNumeric(va, vb);\n break;\n case 'severity':\n result = compareSeverity(va, vb);\n break;\n case 'alphabetical':\n default:\n result = compareAlphabetical(va, vb);\n break;\n }\n\n return result * directionMultiplier(sort.direction);\n}\n\nfunction getMostFrequentValue(counts: Record<string, number>): { value: string | undefined; count: number } {\n let maxCount = 0;\n let maxValue: string | undefined;\n for (const [value, count] of Object.entries(counts)) {\n if (count > maxCount) {\n maxCount = count;\n maxValue = value;\n }\n }\n return { value: maxValue, count: maxCount };\n}\n\nfunction getMostCriticalStatus(counts: Record<string, number>): { weight: number; count: number } {\n let minWeight = 5;\n let countAtMin = 0;\n for (const [value, count] of Object.entries(counts)) {\n const weight = STATUS_WEIGHT[value] ?? 5;\n if (weight < minWeight) {\n minWeight = weight;\n countAtMin = count;\n } else if (weight === minWeight) {\n countAtMin += count;\n }\n }\n return { weight: minWeight, count: countAtMin };\n}\n\nfunction getMostCriticalSeverity(counts: Record<string, number>): { weight: number; count: number } {\n let minWeight = SEVERITY_ORDER.length;\n let countAtMin = 0;\n for (const [value, count] of Object.entries(counts)) {\n const weight = getSeverityWeight(value);\n if (weight < minWeight) {\n minWeight = weight;\n countAtMin = count;\n } else if (weight === minWeight) {\n countAtMin += count;\n }\n }\n return { weight: minWeight, count: countAtMin };\n}\n\nexport function compareGroupsByColumn(\n aCounts: Record<string, number> | undefined,\n bCounts: Record<string, number> | undefined,\n sort: SortState\n): number {\n const emptyA = !aCounts || Object.keys(aCounts).length === 0;\n const emptyB = !bCounts || Object.keys(bCounts).length === 0;\n if (emptyA && emptyB) return 0;\n if (emptyA) return 1;\n if (emptyB) return -1;\n\n let result: number;\n\n switch (sort.mode) {\n case 'status': {\n const statusA = getMostCriticalStatus(aCounts);\n const statusB = getMostCriticalStatus(bCounts);\n result = statusA.weight - statusB.weight;\n if (result === 0) {\n result = statusB.count - statusA.count;\n }\n break;\n }\n case 'severity': {\n const sevA = getMostCriticalSeverity(aCounts);\n const sevB = getMostCriticalSeverity(bCounts);\n result = sevA.weight - sevB.weight;\n if (result === 0) {\n result = sevB.count - sevA.count;\n }\n break;\n }\n case 'numeric': {\n const freqA = getMostFrequentValue(aCounts);\n const freqB = getMostFrequentValue(bCounts);\n const numResult = compareNumeric(freqA.value, freqB.value);\n if (numResult !== 0) {\n return numResult * directionMultiplier(sort.direction);\n }\n // Tie-break by count is always descending (larger groups first) regardless of sort direction\n return freqB.count - freqA.count;\n }\n case 'alphabetical':\n default: {\n const freqA = getMostFrequentValue(aCounts);\n const freqB = getMostFrequentValue(bCounts);\n const alphaResult = compareAlphabetical(freqA.value, freqB.value);\n if (alphaResult !== 0) {\n return alphaResult * directionMultiplier(sort.direction);\n }\n // Tie-break by count is always descending (larger groups first) regardless of sort direction\n return freqB.count - freqA.count;\n }\n }\n\n return result * directionMultiplier(sort.direction);\n}\n"],"names":["getSeverityWeight","SEVERITY_ORDER","SORT_COL_STATUS","SORT_COL_ALERTNAME","STATUS_WEIGHT","firing","pending","suppressed","inactive","resolved","getEffectiveStatus","alert","state","compareStatus","a","b","wa","undefined","wb","directionMultiplier","direction","compareAlphabetical","localeCompare","compareNumeric","na","parseFloat","NaN","nb","isNaN","compareSeverity","length","compareAlertsByColumn","sort","columnName","name","va","labels","vb","result","mode","getMostFrequentValue","counts","maxCount","maxValue","value","count","Object","entries","getMostCriticalStatus","minWeight","countAtMin","weight","getMostCriticalSeverity","compareGroupsByColumn","aCounts","bCounts","emptyA","keys","emptyB","statusA","statusB","sevA","sevB","freqA","freqB","numResult","alphaResult"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { LabelColorMapping } from './alert-table-model';
|
|
2
|
+
export declare const SEVERITY_ORDER: string[];
|
|
3
|
+
export declare function getSeverityWeight(value: string): number;
|
|
4
|
+
export declare function hashStringToColor(value: string): string;
|
|
5
|
+
export declare function getLabelColor(value: string, mapping: LabelColorMapping): string;
|
|
6
|
+
//# sourceMappingURL=label-colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label-colors.d.ts","sourceRoot":"","sources":["../../../../src/plugins/alert-table/label-colors.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAgCxD,eAAO,MAAM,cAAc,EAAE,MAAM,EAAmF,CAAC;AAEvH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASvD;AAKD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWvD;AA0BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAiB/E"}
|