@oneuptime/common 11.7.2 → 11.7.4

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.
Files changed (414) hide show
  1. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +103 -0
  2. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
  3. package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
  4. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  5. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  6. package/Models/DatabaseModels/Index.ts +5 -0
  7. package/Models/DatabaseModels/LogDropFilter.ts +89 -0
  8. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
  9. package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
  10. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  11. package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
  12. package/Models/DatabaseModels/TableView.ts +40 -0
  13. package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
  14. package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
  15. package/Server/API/AlertAPI.ts +32 -17
  16. package/Server/API/BaseAPI.ts +31 -2
  17. package/Server/API/BaseAnalyticsAPI.ts +36 -2
  18. package/Server/API/CommonAPI.ts +57 -0
  19. package/Server/API/IncidentAPI.ts +60 -33
  20. package/Server/API/IncidentEpisodeAPI.ts +31 -16
  21. package/Server/API/MonitorAPI.ts +30 -0
  22. package/Server/API/MonitorTemplateAPI.ts +8 -0
  23. package/Server/API/ProbeAPI.ts +196 -15
  24. package/Server/API/ProjectAPI.ts +79 -1
  25. package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
  26. package/Server/API/StatusPageAPI.ts +74 -37
  27. package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  34. package/Server/Services/AlertEpisodeService.ts +47 -0
  35. package/Server/Services/AlertService.ts +125 -0
  36. package/Server/Services/BillingService.ts +98 -0
  37. package/Server/Services/DatabaseService.ts +184 -20
  38. package/Server/Services/IncidentEpisodeService.ts +47 -0
  39. package/Server/Services/IncidentService.ts +123 -0
  40. package/Server/Services/IncidentTemplateService.ts +123 -1
  41. package/Server/Services/Index.ts +2 -0
  42. package/Server/Services/LogDropFilterService.ts +133 -0
  43. package/Server/Services/MonitorProbeService.ts +94 -4
  44. package/Server/Services/MonitorService.ts +48 -43
  45. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
  46. package/Server/Services/ProbeService.ts +66 -0
  47. package/Server/Services/ProjectService.ts +131 -7
  48. package/Server/Services/RecommendationDismissalService.ts +52 -0
  49. package/Server/Services/RunbookAgentJobService.ts +68 -7
  50. package/Server/Services/ScheduledMaintenanceService.ts +103 -0
  51. package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
  52. package/Server/Services/StatusPageGroupService.ts +186 -0
  53. package/Server/Services/TraceDropFilterService.ts +133 -0
  54. package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
  55. package/Server/Types/Workflow/Components/API/Get.ts +12 -0
  56. package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
  57. package/Server/Types/Workflow/Components/API/Post.ts +12 -0
  58. package/Server/Types/Workflow/Components/API/Put.ts +13 -0
  59. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
  60. package/Server/Utils/DropFilterValidation.ts +127 -0
  61. package/Server/Utils/Errors.ts +5 -0
  62. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  63. package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
  64. package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
  65. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
  66. package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
  67. package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
  68. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
  69. package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
  70. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
  71. package/Tests/Server/API/ProbeAPI.test.ts +422 -53
  72. package/Tests/Server/API/ProjectAPI.test.ts +180 -0
  73. package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
  74. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
  75. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
  76. package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
  77. package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
  78. package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
  79. package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
  80. package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
  81. package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
  82. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
  83. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
  84. package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
  85. package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
  86. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
  87. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
  88. package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
  89. package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
  90. package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
  91. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
  92. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
  93. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
  94. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
  95. package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
  96. package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
  97. package/Tests/Types/DateUserTimezone.test.ts +52 -0
  98. package/Tests/Types/JSONFunctions.test.ts +103 -1
  99. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
  100. package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
  101. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
  102. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
  103. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
  104. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
  105. package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
  106. package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
  107. package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
  108. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
  109. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
  110. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
  111. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
  112. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
  113. package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
  114. package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
  115. package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
  116. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
  117. package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
  118. package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
  119. package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
  120. package/Tests/UI/Components/InfoCard.test.tsx +358 -0
  121. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
  122. package/Tests/UI/Components/Modal.test.tsx +43 -5
  123. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
  124. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
  125. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +999 -0
  126. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
  127. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
  128. package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
  129. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
  130. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
  131. package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
  132. package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
  133. package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
  134. package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
  135. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
  136. package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
  137. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
  138. package/Tests/Utils/UserPreferences.test.ts +563 -0
  139. package/Types/Date.ts +15 -6
  140. package/Types/JSONFunctions.ts +7 -2
  141. package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
  142. package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
  143. package/Types/Monitor/MonitorStep.ts +10 -1
  144. package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
  145. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
  146. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
  147. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
  148. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
  149. package/Types/Permission.ts +45 -0
  150. package/Types/Recommendation/RecommendationType.ts +20 -0
  151. package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
  152. package/Types/Runbook/RunbookStepTimeout.ts +202 -0
  153. package/Types/Telemetry/DropFilterSampling.ts +92 -0
  154. package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
  155. package/UI/Components/Accordion/Accordion.tsx +10 -2
  156. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
  157. package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
  158. package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
  159. package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
  160. package/UI/Components/Error/PageError.tsx +0 -4
  161. package/UI/Components/ErrorBoundary.tsx +252 -15
  162. package/UI/Components/InfoCard/InfoCard.tsx +58 -1
  163. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
  164. package/UI/Components/MasterPage/MasterPage.tsx +65 -0
  165. package/UI/Components/Modal/Modal.tsx +16 -60
  166. package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
  167. package/UI/Components/ModelTable/BaseModelTable.tsx +503 -71
  168. package/UI/Components/ModelTable/Column.ts +17 -0
  169. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +523 -0
  170. package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
  171. package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
  172. package/UI/Components/ModelTable/TableView.tsx +24 -2
  173. package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
  174. package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
  175. package/UI/Components/SideMenu/SideMenu.tsx +24 -4
  176. package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
  177. package/UI/Components/Table/Table.tsx +14 -1
  178. package/UI/Components/Table/TableRow.tsx +180 -175
  179. package/UI/Components/Table/Types/Column.ts +2 -0
  180. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
  181. package/UI/Utils/DropdownAlignment.ts +162 -0
  182. package/UI/Utils/TableFilterUrlState.ts +59 -20
  183. package/Utils/API.ts +106 -2
  184. package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
  185. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
  186. package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
  187. package/Utils/StatusPage/GroupTree.ts +307 -0
  188. package/Utils/StatusPage/ResourceUptime.ts +90 -17
  189. package/Utils/UserPreferences.ts +53 -0
  190. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
  191. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
  193. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
  195. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  197. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  199. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  201. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
  203. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
  205. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
  207. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
  208. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  209. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
  211. package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/TableView.js +40 -0
  213. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
  215. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  216. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
  217. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  218. package/build/dist/Server/API/AlertAPI.js +22 -13
  219. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  220. package/build/dist/Server/API/BaseAPI.js +22 -1
  221. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  222. package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
  223. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  224. package/build/dist/Server/API/CommonAPI.js +42 -0
  225. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  226. package/build/dist/Server/API/IncidentAPI.js +43 -26
  227. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  228. package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
  229. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  230. package/build/dist/Server/API/MonitorAPI.js +23 -0
  231. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  232. package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
  233. package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
  234. package/build/dist/Server/API/ProbeAPI.js +131 -15
  235. package/build/dist/Server/API/ProbeAPI.js.map +1 -1
  236. package/build/dist/Server/API/ProjectAPI.js +62 -3
  237. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  238. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
  239. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  240. package/build/dist/Server/API/StatusPageAPI.js +61 -33
  241. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  242. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
  243. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  256. package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
  257. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  258. package/build/dist/Server/Services/AlertService.js +95 -0
  259. package/build/dist/Server/Services/AlertService.js.map +1 -1
  260. package/build/dist/Server/Services/BillingService.js +71 -0
  261. package/build/dist/Server/Services/BillingService.js.map +1 -1
  262. package/build/dist/Server/Services/DatabaseService.js +140 -17
  263. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  264. package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
  265. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  266. package/build/dist/Server/Services/IncidentService.js +100 -0
  267. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  268. package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
  269. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  270. package/build/dist/Server/Services/Index.js +2 -0
  271. package/build/dist/Server/Services/Index.js.map +1 -1
  272. package/build/dist/Server/Services/LogDropFilterService.js +93 -0
  273. package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
  274. package/build/dist/Server/Services/MonitorProbeService.js +73 -5
  275. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  276. package/build/dist/Server/Services/MonitorService.js +34 -39
  277. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  278. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
  279. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  280. package/build/dist/Server/Services/ProbeService.js +64 -0
  281. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  282. package/build/dist/Server/Services/ProjectService.js +103 -7
  283. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  284. package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
  285. package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
  286. package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
  287. package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
  288. package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
  289. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  290. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
  291. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  292. package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
  293. package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
  294. package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
  295. package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
  296. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
  297. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  298. package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
  299. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  300. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
  301. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  302. package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
  303. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  304. package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
  305. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  306. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
  307. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
  308. package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
  309. package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
  310. package/build/dist/Server/Utils/Errors.js +3 -0
  311. package/build/dist/Server/Utils/Errors.js.map +1 -1
  312. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
  313. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  314. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
  315. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  316. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
  317. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  318. package/build/dist/Types/Date.js +14 -4
  319. package/build/dist/Types/Date.js.map +1 -1
  320. package/build/dist/Types/JSONFunctions.js +8 -3
  321. package/build/dist/Types/JSONFunctions.js.map +1 -1
  322. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
  323. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
  324. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  325. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  326. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  327. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
  328. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  329. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
  330. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
  331. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
  332. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
  333. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
  334. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
  335. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
  336. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
  337. package/build/dist/Types/Permission.js +40 -0
  338. package/build/dist/Types/Permission.js.map +1 -1
  339. package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
  340. package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
  341. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
  342. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
  343. package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
  344. package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
  345. package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
  346. package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
  347. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
  348. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  349. package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
  350. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  351. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  352. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  353. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
  354. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  355. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
  356. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
  357. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
  358. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  359. package/build/dist/UI/Components/Error/PageError.js +1 -3
  360. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  361. package/build/dist/UI/Components/ErrorBoundary.js +145 -11
  362. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  363. package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
  364. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  365. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
  366. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  367. package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
  368. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  369. package/build/dist/UI/Components/Modal/Modal.js +4 -32
  370. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  371. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  372. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +308 -40
  373. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  374. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +230 -0
  375. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
  376. package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
  377. package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
  378. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
  379. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
  380. package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
  381. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  382. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
  383. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
  384. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
  385. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
  386. package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
  387. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  388. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
  389. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
  390. package/build/dist/UI/Components/Table/Table.js +15 -2
  391. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  392. package/build/dist/UI/Components/Table/TableRow.js +11 -6
  393. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  394. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
  395. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  396. package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
  397. package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
  398. package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
  399. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  400. package/build/dist/Utils/API.js +39 -2
  401. package/build/dist/Utils/API.js.map +1 -1
  402. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
  403. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
  404. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
  405. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
  406. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
  407. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
  408. package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
  409. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
  410. package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
  411. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  412. package/build/dist/Utils/UserPreferences.js +33 -0
  413. package/build/dist/Utils/UserPreferences.js.map +1 -1
  414. package/package.json +1 -1
@@ -0,0 +1,268 @@
1
+ import { JSONObject } from "../../../Types/JSON";
2
+ import MonitorStepCephMonitor, {
3
+ CephResourceScope,
4
+ MonitorStepCephMonitorUtil,
5
+ } from "../../../Types/Monitor/MonitorStepCephMonitor";
6
+ import MonitorStepDockerMonitor, {
7
+ MonitorStepDockerMonitorUtil,
8
+ } from "../../../Types/Monitor/MonitorStepDockerMonitor";
9
+ import MonitorStepDockerSwarmMonitor, {
10
+ MonitorStepDockerSwarmMonitorUtil,
11
+ } from "../../../Types/Monitor/MonitorStepDockerSwarmMonitor";
12
+ import MonitorStepHostMonitor, {
13
+ MonitorStepHostMonitorUtil,
14
+ } from "../../../Types/Monitor/MonitorStepHostMonitor";
15
+ import MonitorStepIoTMonitor, {
16
+ IoTResourceScope,
17
+ MonitorStepIoTMonitorUtil,
18
+ } from "../../../Types/Monitor/MonitorStepIoTMonitor";
19
+ import MonitorStepKubernetesMonitor, {
20
+ KubernetesResourceScope,
21
+ MonitorStepKubernetesMonitorUtil,
22
+ } from "../../../Types/Monitor/MonitorStepKubernetesMonitor";
23
+ import MonitorStepMetricMonitor, {
24
+ MonitorStepMetricMonitorUtil,
25
+ } from "../../../Types/Monitor/MonitorStepMetricMonitor";
26
+ import MonitorStepPodmanMonitor, {
27
+ MonitorStepPodmanMonitorUtil,
28
+ } from "../../../Types/Monitor/MonitorStepPodmanMonitor";
29
+ import MonitorStepProxmoxMonitor, {
30
+ MonitorStepProxmoxMonitorUtil,
31
+ ProxmoxResourceScope,
32
+ } from "../../../Types/Monitor/MonitorStepProxmoxMonitor";
33
+ import RollingTime from "../../../Types/RollingTime/RollingTime";
34
+
35
+ /*
36
+ * The infrastructure MonitorStep utils share one shape: getDefault() returns
37
+ * an empty-scope config on a Past1Minute rolling window with an empty metric
38
+ * view config, and fromJSON/toJSON are structural pass-throughs. This suite
39
+ * locks in that contract for each of them so a future refactor cannot quietly
40
+ * change a default or drop a field on the wire.
41
+ */
42
+
43
+ describe("Infrastructure MonitorStep utils", () => {
44
+ describe("MonitorStepMetricMonitorUtil", () => {
45
+ test("getDefault has an empty metric view config on a 1-minute window", () => {
46
+ const def: MonitorStepMetricMonitor =
47
+ MonitorStepMetricMonitorUtil.getDefault();
48
+
49
+ expect(def.metricViewConfig).toEqual({
50
+ queryConfigs: [],
51
+ formulaConfigs: [],
52
+ });
53
+ expect(def.rollingTime).toBe(RollingTime.Past1Minute);
54
+ });
55
+
56
+ test("fromJSON/toJSON are pass-through and round-trip", () => {
57
+ const monitor: MonitorStepMetricMonitor = {
58
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
59
+ rollingTime: RollingTime.Past1Minute,
60
+ };
61
+ const json: JSONObject = MonitorStepMetricMonitorUtil.toJSON(monitor);
62
+ expect(MonitorStepMetricMonitorUtil.fromJSON(json)).toEqual(monitor);
63
+ });
64
+ });
65
+
66
+ describe("MonitorStepHostMonitorUtil", () => {
67
+ test("getDefault has an empty host identifier", () => {
68
+ const def: MonitorStepHostMonitor =
69
+ MonitorStepHostMonitorUtil.getDefault();
70
+
71
+ expect(def.hostIdentifier).toBe("");
72
+ expect(def.rollingTime).toBe(RollingTime.Past1Minute);
73
+ });
74
+
75
+ test("round-trips through JSON", () => {
76
+ const monitor: MonitorStepHostMonitor = {
77
+ hostIdentifier: "web-1",
78
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
79
+ rollingTime: RollingTime.Past1Minute,
80
+ };
81
+ expect(
82
+ MonitorStepHostMonitorUtil.fromJSON(
83
+ MonitorStepHostMonitorUtil.toJSON(monitor),
84
+ ),
85
+ ).toEqual(monitor);
86
+ });
87
+ });
88
+
89
+ describe("MonitorStepDockerMonitorUtil", () => {
90
+ test("getDefault has empty container filters", () => {
91
+ const def: MonitorStepDockerMonitor =
92
+ MonitorStepDockerMonitorUtil.getDefault();
93
+
94
+ expect(def.hostIdentifier).toBe("");
95
+ expect(def.containerFilters).toEqual({});
96
+ expect(def.rollingTime).toBe(RollingTime.Past1Minute);
97
+ });
98
+
99
+ test("round-trips container filters", () => {
100
+ const monitor: MonitorStepDockerMonitor = {
101
+ hostIdentifier: "docker-host",
102
+ containerFilters: { containerName: "api", containerImage: "nginx" },
103
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
104
+ rollingTime: RollingTime.Past1Minute,
105
+ };
106
+ expect(
107
+ MonitorStepDockerMonitorUtil.fromJSON(
108
+ MonitorStepDockerMonitorUtil.toJSON(monitor),
109
+ ),
110
+ ).toEqual(monitor);
111
+ });
112
+ });
113
+
114
+ describe("MonitorStepPodmanMonitorUtil", () => {
115
+ test("getDefault has empty container filters", () => {
116
+ const def: MonitorStepPodmanMonitor =
117
+ MonitorStepPodmanMonitorUtil.getDefault();
118
+
119
+ expect(def.hostIdentifier).toBe("");
120
+ expect(def.containerFilters).toEqual({});
121
+ expect(def.rollingTime).toBe(RollingTime.Past1Minute);
122
+ });
123
+
124
+ test("round-trips container filters", () => {
125
+ const monitor: MonitorStepPodmanMonitor = {
126
+ hostIdentifier: "podman-host",
127
+ containerFilters: { hostName: "node-1" },
128
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
129
+ rollingTime: RollingTime.Past1Minute,
130
+ };
131
+ expect(
132
+ MonitorStepPodmanMonitorUtil.fromJSON(
133
+ MonitorStepPodmanMonitorUtil.toJSON(monitor),
134
+ ),
135
+ ).toEqual(monitor);
136
+ });
137
+ });
138
+
139
+ describe("MonitorStepKubernetesMonitorUtil", () => {
140
+ test("getDefault scopes to the whole cluster", () => {
141
+ const def: MonitorStepKubernetesMonitor =
142
+ MonitorStepKubernetesMonitorUtil.getDefault();
143
+
144
+ expect(def.clusterIdentifier).toBe("");
145
+ expect(def.resourceScope).toBe(KubernetesResourceScope.Cluster);
146
+ expect(def.resourceFilters).toEqual({});
147
+ });
148
+
149
+ test("round-trips a namespace-scoped monitor", () => {
150
+ const monitor: MonitorStepKubernetesMonitor = {
151
+ clusterIdentifier: "prod",
152
+ resourceScope: KubernetesResourceScope.Namespace,
153
+ resourceFilters: { namespace: "payments" },
154
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
155
+ rollingTime: RollingTime.Past1Minute,
156
+ };
157
+ expect(
158
+ MonitorStepKubernetesMonitorUtil.fromJSON(
159
+ MonitorStepKubernetesMonitorUtil.toJSON(monitor),
160
+ ),
161
+ ).toEqual(monitor);
162
+ });
163
+ });
164
+
165
+ describe("MonitorStepCephMonitorUtil", () => {
166
+ test("getDefault has no OSD/pool filters", () => {
167
+ const def: MonitorStepCephMonitor =
168
+ MonitorStepCephMonitorUtil.getDefault();
169
+
170
+ expect(def.clusterIdentifier).toBe("");
171
+ expect(def.resourceFilters).toEqual({});
172
+ });
173
+
174
+ test("round-trips an OSD-scoped monitor", () => {
175
+ const monitor: MonitorStepCephMonitor = {
176
+ clusterIdentifier: "ceph-1",
177
+ resourceFilters: { osdId: "osd.3", poolId: "2" },
178
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
179
+ rollingTime: RollingTime.Past1Minute,
180
+ };
181
+ expect(
182
+ MonitorStepCephMonitorUtil.fromJSON(
183
+ MonitorStepCephMonitorUtil.toJSON(monitor),
184
+ ),
185
+ ).toEqual(monitor);
186
+ // Scope enum sanity.
187
+ expect(CephResourceScope.Osd).toBe("OSD");
188
+ });
189
+ });
190
+
191
+ describe("MonitorStepProxmoxMonitorUtil", () => {
192
+ test("getDefault has no resource filters", () => {
193
+ const def: MonitorStepProxmoxMonitor =
194
+ MonitorStepProxmoxMonitorUtil.getDefault();
195
+
196
+ expect(def.clusterIdentifier).toBe("");
197
+ expect(def.resourceFilters).toEqual({});
198
+ });
199
+
200
+ test("round-trips a guest-scoped monitor", () => {
201
+ const monitor: MonitorStepProxmoxMonitor = {
202
+ clusterIdentifier: "pve-cluster",
203
+ resourceFilters: {
204
+ scope: ProxmoxResourceScope.Guest,
205
+ guestId: "qemu/100",
206
+ },
207
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
208
+ rollingTime: RollingTime.Past1Minute,
209
+ };
210
+ expect(
211
+ MonitorStepProxmoxMonitorUtil.fromJSON(
212
+ MonitorStepProxmoxMonitorUtil.toJSON(monitor),
213
+ ),
214
+ ).toEqual(monitor);
215
+ });
216
+ });
217
+
218
+ describe("MonitorStepDockerSwarmMonitorUtil", () => {
219
+ test("getDefault has no resource filters", () => {
220
+ const def: MonitorStepDockerSwarmMonitor =
221
+ MonitorStepDockerSwarmMonitorUtil.getDefault();
222
+
223
+ expect(def.clusterIdentifier).toBe("");
224
+ expect(def.resourceFilters).toEqual({});
225
+ });
226
+
227
+ test("round-trips a service-scoped monitor", () => {
228
+ const monitor: MonitorStepDockerSwarmMonitor = {
229
+ clusterIdentifier: "swarm-1",
230
+ resourceFilters: { serviceName: "web", nodeName: "node-2" },
231
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
232
+ rollingTime: RollingTime.Past1Minute,
233
+ };
234
+ expect(
235
+ MonitorStepDockerSwarmMonitorUtil.fromJSON(
236
+ MonitorStepDockerSwarmMonitorUtil.toJSON(monitor),
237
+ ),
238
+ ).toEqual(monitor);
239
+ });
240
+ });
241
+
242
+ describe("MonitorStepIoTMonitorUtil", () => {
243
+ test("getDefault scopes to the whole fleet", () => {
244
+ const def: MonitorStepIoTMonitor = MonitorStepIoTMonitorUtil.getDefault();
245
+
246
+ expect(def.fleetIdentifier).toBe("");
247
+ expect(def.resourceFilters).toEqual({});
248
+ });
249
+
250
+ test("round-trips a device-scoped monitor", () => {
251
+ const monitor: MonitorStepIoTMonitor = {
252
+ fleetIdentifier: "fleet-1",
253
+ resourceFilters: {
254
+ scope: IoTResourceScope.Device,
255
+ deviceId: "sensor-42",
256
+ deviceType: "temperature",
257
+ },
258
+ metricViewConfig: { queryConfigs: [], formulaConfigs: [] },
259
+ rollingTime: RollingTime.Past1Minute,
260
+ };
261
+ expect(
262
+ MonitorStepIoTMonitorUtil.fromJSON(
263
+ MonitorStepIoTMonitorUtil.toJSON(monitor),
264
+ ),
265
+ ).toEqual(monitor);
266
+ });
267
+ });
268
+ });
@@ -0,0 +1,386 @@
1
+ import { JSONObject } from "../../../Types/JSON";
2
+ import MetricFormulaConfigData from "../../../Types/Metrics/MetricFormulaConfigData";
3
+ import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
4
+ import MetricsViewConfig from "../../../Types/Metrics/MetricsViewConfig";
5
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
6
+ import MonitorStepMetricMonitor, {
7
+ MonitorStepMetricMonitorUtil,
8
+ } from "../../../Types/Monitor/MonitorStepMetricMonitor";
9
+ import RollingTime from "../../../Types/RollingTime/RollingTime";
10
+
11
+ /*
12
+ * Regression coverage for the blank-screen crash on the monitor view page.
13
+ *
14
+ * MetricMonitorPreview read `monitorStepMetricMonitor?.metricViewConfig.queryConfigs`.
15
+ * The optional chain stops at `monitorStepMetricMonitor`, so a step that HAS a
16
+ * metricMonitor but no metricViewConfig threw
17
+ *
18
+ * TypeError: Cannot read properties of undefined (reading 'queryConfigs')
19
+ *
20
+ * during render. Nothing above it caught the throw, so React unmounted the whole
21
+ * tree and the dashboard went blank white — nav, sidebar and all.
22
+ *
23
+ * That shape is reachable because monitor steps are persisted as free-form JSON
24
+ * and rehydrated with a cast: nothing at runtime enforces that metricViewConfig
25
+ * is present. These tests lock in that resolving the config NEVER throws and
26
+ * always yields array-shaped queryConfigs / formulaConfigs, whatever garbage the
27
+ * database hands back.
28
+ */
29
+
30
+ function queryConfig(metricVariable: string): MetricQueryConfigData {
31
+ return {
32
+ metricAliasData: {
33
+ metricVariable,
34
+ title: metricVariable,
35
+ description: metricVariable,
36
+ legend: metricVariable,
37
+ legendUnit: undefined,
38
+ },
39
+ metricQueryData: {
40
+ filterData: {},
41
+ },
42
+ } as unknown as MetricQueryConfigData;
43
+ }
44
+
45
+ function formulaConfig(metricVariable: string): MetricFormulaConfigData {
46
+ return {
47
+ metricAliasData: {
48
+ metricVariable,
49
+ title: metricVariable,
50
+ description: metricVariable,
51
+ legend: metricVariable,
52
+ legendUnit: undefined,
53
+ },
54
+ metricFormulaData: {
55
+ formula: "a + b",
56
+ },
57
+ } as unknown as MetricFormulaConfigData;
58
+ }
59
+
60
+ describe("MonitorStepMetricMonitorUtil.getMetricViewConfig", () => {
61
+ test("returns the config untouched when the step is well formed", () => {
62
+ const queryConfigs: Array<MetricQueryConfigData> = [queryConfig("a")];
63
+ const formulaConfigs: Array<MetricFormulaConfigData> = [formulaConfig("b")];
64
+
65
+ const config: MetricsViewConfig =
66
+ MonitorStepMetricMonitorUtil.getMetricViewConfig({
67
+ metricViewConfig: {
68
+ queryConfigs,
69
+ formulaConfigs,
70
+ },
71
+ rollingTime: RollingTime.Past1Hour,
72
+ });
73
+
74
+ expect(config.queryConfigs).toEqual(queryConfigs);
75
+ expect(config.formulaConfigs).toEqual(formulaConfigs);
76
+ });
77
+
78
+ test("returns empty arrays when the whole monitor is undefined", () => {
79
+ const config: MetricsViewConfig =
80
+ MonitorStepMetricMonitorUtil.getMetricViewConfig(undefined);
81
+
82
+ expect(config).toEqual({ queryConfigs: [], formulaConfigs: [] });
83
+ });
84
+
85
+ test("returns empty arrays when the whole monitor is null", () => {
86
+ const config: MetricsViewConfig =
87
+ MonitorStepMetricMonitorUtil.getMetricViewConfig(null);
88
+
89
+ expect(config).toEqual({ queryConfigs: [], formulaConfigs: [] });
90
+ });
91
+
92
+ test("THE CRASH: monitor present but metricViewConfig missing entirely", () => {
93
+ /*
94
+ * The exact shape from the bug report: a persisted metricMonitor that only
95
+ * carries rollingTime. Reading .metricViewConfig.queryConfigs off this is
96
+ * what threw and blanked the page.
97
+ */
98
+ const malformed: MonitorStepMetricMonitor = {
99
+ rollingTime: RollingTime.Past1Minute,
100
+ } as unknown as MonitorStepMetricMonitor;
101
+
102
+ expect(() => {
103
+ return MonitorStepMetricMonitorUtil.getMetricViewConfig(malformed);
104
+ }).not.toThrow();
105
+
106
+ expect(MonitorStepMetricMonitorUtil.getMetricViewConfig(malformed)).toEqual(
107
+ {
108
+ queryConfigs: [],
109
+ formulaConfigs: [],
110
+ },
111
+ );
112
+ });
113
+
114
+ test("returns empty arrays when metricViewConfig is explicitly null", () => {
115
+ const malformed: MonitorStepMetricMonitor = {
116
+ metricViewConfig: null,
117
+ rollingTime: RollingTime.Past1Minute,
118
+ } as unknown as MonitorStepMetricMonitor;
119
+
120
+ expect(MonitorStepMetricMonitorUtil.getMetricViewConfig(malformed)).toEqual(
121
+ { queryConfigs: [], formulaConfigs: [] },
122
+ );
123
+ });
124
+
125
+ test("fills in queryConfigs when only formulaConfigs was persisted", () => {
126
+ const formulaConfigs: Array<MetricFormulaConfigData> = [formulaConfig("b")];
127
+
128
+ const config: MetricsViewConfig =
129
+ MonitorStepMetricMonitorUtil.getMetricViewConfig({
130
+ metricViewConfig: { formulaConfigs },
131
+ rollingTime: RollingTime.Past1Minute,
132
+ } as unknown as MonitorStepMetricMonitor);
133
+
134
+ expect(config.queryConfigs).toEqual([]);
135
+ expect(config.formulaConfigs).toEqual(formulaConfigs);
136
+ });
137
+
138
+ test("fills in formulaConfigs when only queryConfigs was persisted", () => {
139
+ const queryConfigs: Array<MetricQueryConfigData> = [queryConfig("a")];
140
+
141
+ const config: MetricsViewConfig =
142
+ MonitorStepMetricMonitorUtil.getMetricViewConfig({
143
+ metricViewConfig: { queryConfigs },
144
+ rollingTime: RollingTime.Past1Minute,
145
+ } as unknown as MonitorStepMetricMonitor);
146
+
147
+ expect(config.queryConfigs).toEqual(queryConfigs);
148
+ expect(config.formulaConfigs).toEqual([]);
149
+ });
150
+
151
+ test.each([
152
+ ["null", null],
153
+ ["undefined", undefined],
154
+ ["a string", "not-an-array"],
155
+ ["a number", 42],
156
+ ["an object", { length: 2 }],
157
+ ["a boolean", true],
158
+ ])(
159
+ "coerces non-array queryConfigs (%s) to an empty array",
160
+ (_label: string, value: unknown) => {
161
+ const config: MetricsViewConfig =
162
+ MonitorStepMetricMonitorUtil.getMetricViewConfig({
163
+ metricViewConfig: {
164
+ queryConfigs: value,
165
+ formulaConfigs: value,
166
+ },
167
+ rollingTime: RollingTime.Past1Minute,
168
+ } as unknown as MonitorStepMetricMonitor);
169
+
170
+ expect(config.queryConfigs).toEqual([]);
171
+ expect(config.formulaConfigs).toEqual([]);
172
+ // Callers immediately call .length / .map / .some on these.
173
+ expect(Array.isArray(config.queryConfigs)).toBe(true);
174
+ expect(Array.isArray(config.formulaConfigs)).toBe(true);
175
+ },
176
+ );
177
+
178
+ test("the result is always safe for the array reads MetricView performs", () => {
179
+ const malformed: MonitorStepMetricMonitor =
180
+ {} as unknown as MonitorStepMetricMonitor;
181
+
182
+ const config: MetricsViewConfig =
183
+ MonitorStepMetricMonitorUtil.getMetricViewConfig(malformed);
184
+
185
+ // These are the exact operations MetricView runs on the data it is given.
186
+ expect(() => {
187
+ return [
188
+ config.queryConfigs.length,
189
+ config.queryConfigs.map((q: MetricQueryConfigData) => {
190
+ return q;
191
+ }),
192
+ config.queryConfigs.some(() => {
193
+ return true;
194
+ }),
195
+ config.formulaConfigs.length,
196
+ config.formulaConfigs.map((f: MetricFormulaConfigData) => {
197
+ return f;
198
+ }),
199
+ ];
200
+ }).not.toThrow();
201
+ });
202
+
203
+ test("does not mutate the monitor it was given", () => {
204
+ const malformed: MonitorStepMetricMonitor = {
205
+ rollingTime: RollingTime.Past1Minute,
206
+ } as unknown as MonitorStepMetricMonitor;
207
+
208
+ MonitorStepMetricMonitorUtil.getMetricViewConfig(malformed);
209
+
210
+ expect(
211
+ (malformed as unknown as JSONObject)["metricViewConfig"],
212
+ ).toBeUndefined();
213
+ });
214
+
215
+ test("hands back the same array references when they are already valid", () => {
216
+ const queryConfigs: Array<MetricQueryConfigData> = [queryConfig("a")];
217
+ const formulaConfigs: Array<MetricFormulaConfigData> = [formulaConfig("b")];
218
+
219
+ const config: MetricsViewConfig =
220
+ MonitorStepMetricMonitorUtil.getMetricViewConfig({
221
+ metricViewConfig: { queryConfigs, formulaConfigs },
222
+ rollingTime: RollingTime.Past1Minute,
223
+ });
224
+
225
+ // No defensive copy: the preview passes these straight into MetricView.
226
+ expect(config.queryConfigs).toBe(queryConfigs);
227
+ expect(config.formulaConfigs).toBe(formulaConfigs);
228
+ });
229
+ });
230
+
231
+ describe("MonitorStepMetricMonitorUtil.getDefault", () => {
232
+ test("produces a config that resolves to itself", () => {
233
+ const defaultMonitor: MonitorStepMetricMonitor =
234
+ MonitorStepMetricMonitorUtil.getDefault();
235
+
236
+ expect(
237
+ MonitorStepMetricMonitorUtil.getMetricViewConfig(defaultMonitor),
238
+ ).toEqual({
239
+ queryConfigs: [],
240
+ formulaConfigs: [],
241
+ });
242
+ expect(defaultMonitor.rollingTime).toBe(RollingTime.Past1Minute);
243
+ });
244
+ });
245
+
246
+ describe("MonitorStepMetricMonitorUtil.fromJSON", () => {
247
+ test("normalizes JSON that is missing metricViewConfig", () => {
248
+ const monitor: MonitorStepMetricMonitor =
249
+ MonitorStepMetricMonitorUtil.fromJSON({
250
+ rollingTime: RollingTime.Past1Hour,
251
+ });
252
+
253
+ expect(monitor.metricViewConfig).toEqual({
254
+ queryConfigs: [],
255
+ formulaConfigs: [],
256
+ });
257
+ expect(monitor.rollingTime).toBe(RollingTime.Past1Hour);
258
+ });
259
+
260
+ test("normalizes JSON that is missing everything", () => {
261
+ const monitor: MonitorStepMetricMonitor =
262
+ MonitorStepMetricMonitorUtil.fromJSON({});
263
+
264
+ expect(monitor.metricViewConfig).toEqual({
265
+ queryConfigs: [],
266
+ formulaConfigs: [],
267
+ });
268
+ // rollingTime backs off to the same default a fresh step gets.
269
+ expect(monitor.rollingTime).toBe(RollingTime.Past1Minute);
270
+ });
271
+
272
+ test("preserves a well formed config", () => {
273
+ const json: JSONObject = {
274
+ metricViewConfig: {
275
+ queryConfigs: [queryConfig("a")],
276
+ formulaConfigs: [formulaConfig("b")],
277
+ },
278
+ rollingTime: RollingTime.Past7Days,
279
+ } as unknown as JSONObject;
280
+
281
+ const monitor: MonitorStepMetricMonitor =
282
+ MonitorStepMetricMonitorUtil.fromJSON(json);
283
+
284
+ expect(monitor.metricViewConfig.queryConfigs).toHaveLength(1);
285
+ expect(monitor.metricViewConfig.formulaConfigs).toHaveLength(1);
286
+ expect(monitor.rollingTime).toBe(RollingTime.Past7Days);
287
+ });
288
+
289
+ test("keeps unknown keys so forward-compatible fields are not dropped", () => {
290
+ const monitor: MonitorStepMetricMonitor =
291
+ MonitorStepMetricMonitorUtil.fromJSON({
292
+ rollingTime: RollingTime.Past1Minute,
293
+ someFutureField: "keep-me",
294
+ } as unknown as JSONObject);
295
+
296
+ expect((monitor as unknown as JSONObject)["someFutureField"]).toBe(
297
+ "keep-me",
298
+ );
299
+ });
300
+
301
+ test("round trips through toJSON without losing the normalization", () => {
302
+ const monitor: MonitorStepMetricMonitor =
303
+ MonitorStepMetricMonitorUtil.fromJSON({
304
+ rollingTime: RollingTime.Past1Minute,
305
+ });
306
+
307
+ const roundTripped: MonitorStepMetricMonitor =
308
+ MonitorStepMetricMonitorUtil.fromJSON(
309
+ MonitorStepMetricMonitorUtil.toJSON(monitor),
310
+ );
311
+
312
+ expect(roundTripped.metricViewConfig).toEqual({
313
+ queryConfigs: [],
314
+ formulaConfigs: [],
315
+ });
316
+ });
317
+ });
318
+
319
+ describe("MonitorStep.fromJSON normalizes persisted metric monitors", () => {
320
+ function monitorStepJSON(metricMonitor: JSONObject | undefined): JSONObject {
321
+ return {
322
+ _type: "MonitorStep",
323
+ value: {
324
+ id: "step-1",
325
+ monitorCriteria: {
326
+ _type: "MonitorCriteria",
327
+ value: {
328
+ monitorCriteriaInstanceArray: [],
329
+ },
330
+ },
331
+ metricMonitor: metricMonitor,
332
+ },
333
+ } as unknown as JSONObject;
334
+ }
335
+
336
+ test("a step whose metricMonitor has no metricViewConfig loads with one", () => {
337
+ const step: MonitorStep = MonitorStep.fromJSON(
338
+ monitorStepJSON({
339
+ rollingTime: RollingTime.Past1Minute,
340
+ } as unknown as JSONObject),
341
+ );
342
+
343
+ expect(step.data?.metricMonitor?.metricViewConfig).toEqual({
344
+ queryConfigs: [],
345
+ formulaConfigs: [],
346
+ });
347
+ });
348
+
349
+ test("the loaded step is safe to hand to the metric preview", () => {
350
+ const step: MonitorStep = MonitorStep.fromJSON(
351
+ monitorStepJSON({} as unknown as JSONObject),
352
+ );
353
+
354
+ expect(() => {
355
+ const config: MetricsViewConfig =
356
+ MonitorStepMetricMonitorUtil.getMetricViewConfig(
357
+ step.data?.metricMonitor,
358
+ );
359
+
360
+ return [config.queryConfigs.length, config.formulaConfigs.length];
361
+ }).not.toThrow();
362
+ });
363
+
364
+ test("a step with no metricMonitor at all stays undefined", () => {
365
+ const step: MonitorStep = MonitorStep.fromJSON(monitorStepJSON(undefined));
366
+
367
+ expect(step.data?.metricMonitor).toBeUndefined();
368
+ });
369
+
370
+ test("a well formed metricMonitor survives the load unchanged", () => {
371
+ const step: MonitorStep = MonitorStep.fromJSON(
372
+ monitorStepJSON({
373
+ metricViewConfig: {
374
+ queryConfigs: [queryConfig("a")],
375
+ formulaConfigs: [],
376
+ },
377
+ rollingTime: RollingTime.Past1Hour,
378
+ } as unknown as JSONObject),
379
+ );
380
+
381
+ expect(
382
+ step.data?.metricMonitor?.metricViewConfig.queryConfigs,
383
+ ).toHaveLength(1);
384
+ expect(step.data?.metricMonitor?.rollingTime).toBe(RollingTime.Past1Hour);
385
+ });
386
+ });