@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
@@ -7,17 +7,21 @@ import {
7
7
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
8
8
  import MonitorStepKubernetesMonitor from "../../../Types/Monitor/MonitorStepKubernetesMonitor";
9
9
  import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
10
+ import { FilterType } from "../../../Types/Monitor/CriteriaFilter";
10
11
  import ObjectID from "../../../Types/ObjectID";
11
12
 
12
13
  /*
13
- * These tests lock in the subtle, easy-to-regress decisions in the per-node
14
- * ratio alert templates (request utilization + usage utilization):
14
+ * These tests lock in the subtle, easy-to-regress decisions in the
15
+ * per-series ratio alert templates (node request/usage utilization, plus
16
+ * the autoscaling and container-limit saturation templates):
15
17
  *
16
18
  * 1. Group-by uses the ClickHouse-stored `resource.`-prefixed attribute
17
19
  * name (`resource.k8s.node.name`), not the bare `k8s.node.name`.
18
20
  * OneUptime stamps OTel resource attributes with a `resource.` prefix
19
21
  * at ingest, so the bare key would match nothing and collapse every
20
- * node into one mislabeled series.
22
+ * node into one mislabeled series. The key differs per template — the
23
+ * HPA template groups per HPA and the pod-limit templates per pod —
24
+ * so each case carries its own expected key.
21
25
  *
22
26
  * 2. The aggregation differs by numerator shape:
23
27
  * - Request utilization sums MANY container series per node, and both
@@ -27,9 +31,17 @@ import ObjectID from "../../../Types/ObjectID";
27
31
  * (kubeletstats) and denominator (k8s_cluster) come from different
28
32
  * receivers, so `Avg` on both sides gives the correct per-minute
29
33
  * ratio regardless of each receiver's scrape count.
34
+ * - The saturation templates are all `Avg` — see the pod-memory
35
+ * template's note in KubernetesAlertTemplates.ts for the
36
+ * multi-container trade-off that choice accepts.
30
37
  *
31
38
  * 3. The criteria reference the FORMULA alias (the computed percentage),
32
39
  * not a raw query alias.
40
+ *
41
+ * 4. The unhealthy and healthy criteria PARTITION the value range — no
42
+ * gap (a value that matches neither leaves the monitor stuck in its
43
+ * previous status) and no overlap (a value that matches both makes the
44
+ * resulting status depend on evaluation order).
33
45
  */
34
46
 
35
47
  interface RatioTemplateCase {
@@ -41,6 +53,7 @@ interface RatioTemplateCase {
41
53
  resultAlias: string;
42
54
  aggregation: MetricsAggregationType;
43
55
  threshold: number;
56
+ groupBy: string;
44
57
  }
45
58
 
46
59
  const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
@@ -54,6 +67,7 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
54
67
  resultAlias: "node_cpu_request_utilization",
55
68
  aggregation: MetricsAggregationType.Sum,
56
69
  threshold: 90,
70
+ groupBy: "resource.k8s.node.name",
57
71
  },
58
72
  {
59
73
  id: "k8s-node-memory-request-utilization",
@@ -64,6 +78,7 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
64
78
  resultAlias: "node_memory_request_utilization",
65
79
  aggregation: MetricsAggregationType.Sum,
66
80
  threshold: 90,
81
+ groupBy: "resource.k8s.node.name",
67
82
  },
68
83
  // Usage utilization — Avg/Avg (one series per node, cross-receiver).
69
84
  {
@@ -75,6 +90,7 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
75
90
  resultAlias: "node_cpu_utilization",
76
91
  aggregation: MetricsAggregationType.Avg,
77
92
  threshold: 90,
93
+ groupBy: "resource.k8s.node.name",
78
94
  },
79
95
  {
80
96
  id: "k8s-high-memory",
@@ -85,6 +101,50 @@ const RATIO_TEMPLATES: Array<RatioTemplateCase> = [
85
101
  resultAlias: "node_memory_utilization",
86
102
  aggregation: MetricsAggregationType.Avg,
87
103
  threshold: 85,
104
+ groupBy: "resource.k8s.node.name",
105
+ },
106
+ /*
107
+ * Autoscaling / limit saturation — Avg/Avg, and NOT keyed on the node.
108
+ *
109
+ * The HPA ratio groups per HPA object; the two pod-limit ratios group
110
+ * per pod. Locking the group-by key here is the point of these cases:
111
+ * these were the first ratio templates in this file not keyed on
112
+ * `resource.k8s.node.name`, so a copy-paste of the node key would
113
+ * silently collapse every HPA (or every pod) into one mislabeled
114
+ * series that still renders and still alerts.
115
+ */
116
+ {
117
+ id: "k8s-hpa-at-max-replicas",
118
+ numerator: "k8s.hpa.current_replicas",
119
+ denominator: "k8s.hpa.max_replicas",
120
+ numAlias: "current_replicas",
121
+ denAlias: "max_replicas",
122
+ resultAlias: "hpa_replica_saturation",
123
+ aggregation: MetricsAggregationType.Avg,
124
+ threshold: 90,
125
+ groupBy: "resource.k8s.hpa.name",
126
+ },
127
+ {
128
+ id: "k8s-pod-memory-limit-saturation",
129
+ numerator: "k8s.pod.memory.usage",
130
+ denominator: "k8s.container.memory_limit",
131
+ numAlias: "used_mem",
132
+ denAlias: "limit_mem",
133
+ resultAlias: "pod_memory_limit_saturation",
134
+ aggregation: MetricsAggregationType.Avg,
135
+ threshold: 90,
136
+ groupBy: "resource.k8s.pod.name",
137
+ },
138
+ {
139
+ id: "k8s-pod-cpu-limit-saturation",
140
+ numerator: "k8s.pod.cpu.utilization",
141
+ denominator: "k8s.container.cpu_limit",
142
+ numAlias: "used_cpu",
143
+ denAlias: "limit_cpu",
144
+ resultAlias: "pod_cpu_limit_saturation",
145
+ aggregation: MetricsAggregationType.Avg,
146
+ threshold: 90,
147
+ groupBy: "resource.k8s.pod.name",
88
148
  },
89
149
  ];
90
150
 
@@ -108,8 +168,8 @@ function getKubernetesMonitor(step: MonitorStep): MonitorStepKubernetesMonitor {
108
168
  return kubernetesMonitor;
109
169
  }
110
170
 
111
- describe("KubernetesAlertTemplates - per-node ratio templates", () => {
112
- test("all four ratio templates are registered", () => {
171
+ describe("KubernetesAlertTemplates - per-series ratio templates", () => {
172
+ test("all ratio templates are registered", () => {
113
173
  const ids: Array<string> = getAllKubernetesAlertTemplates().map(
114
174
  (t: KubernetesAlertTemplate) => {
115
175
  return t.id;
@@ -121,7 +181,7 @@ describe("KubernetesAlertTemplates - per-node ratio templates", () => {
121
181
  });
122
182
 
123
183
  test.each(RATIO_TEMPLATES)(
124
- "$id is a per-node ($aggregation/$aggregation) ratio keyed on resource.k8s.node.name",
184
+ "$id is a ($aggregation/$aggregation) ratio keyed on $groupBy",
125
185
  (tc: RatioTemplateCase) => {
126
186
  const template: KubernetesAlertTemplate | undefined =
127
187
  getKubernetesAlertTemplateById(tc.id);
@@ -162,16 +222,19 @@ describe("KubernetesAlertTemplates - per-node ratio templates", () => {
162
222
  );
163
223
 
164
224
  /*
165
- * Decision (1): group by the resource-prefixed node attribute on BOTH
225
+ * Decision (1): group by the resource-prefixed attribute on BOTH
166
226
  * queries so the per-series fingerprints line up for the formula join.
167
227
  */
168
228
  expect(numerator.metricQueryData.groupByAttributeKeys).toEqual([
169
- "resource.k8s.node.name",
229
+ tc.groupBy,
170
230
  ]);
171
231
  expect(denominator.metricQueryData.groupByAttributeKeys).toEqual([
172
- "resource.k8s.node.name",
232
+ tc.groupBy,
173
233
  ]);
174
234
 
235
+ // The `resource.` prefix is load-bearing — a bare OTel key matches nothing.
236
+ expect(tc.groupBy.startsWith("resource.")).toBe(true);
237
+
175
238
  // Formula divides numerator by denominator and scales to a percentage.
176
239
  expect(formulaConfigs[0].metricFormulaData.metricFormula).toBe(
177
240
  `(${tc.numAlias} / ${tc.denAlias}) * 100`,
@@ -190,4 +253,109 @@ describe("KubernetesAlertTemplates - per-node ratio templates", () => {
190
253
  expect(offlineFilters[0].value).toBe(tc.threshold);
191
254
  },
192
255
  );
256
+
257
+ /*
258
+ * Decision (4): unhealthy and healthy must be exact complements at the
259
+ * same threshold. Both halves are hand-written per template, so the
260
+ * failure mode is a strict/non-strict slip — pairing `> 90` with
261
+ * `< 90` leaves exactly 90 matching neither criterion (the monitor
262
+ * silently holds its previous status), and pairing `>= 90` with
263
+ * `<= 90` makes 90 match both (status depends on evaluation order).
264
+ */
265
+ const COMPLEMENT_OF: Record<string, string> = {
266
+ [FilterType.GreaterThan]: FilterType.LessThanOrEqualTo,
267
+ [FilterType.GreaterThanOrEqualTo]: FilterType.LessThan,
268
+ };
269
+
270
+ test.each(RATIO_TEMPLATES)(
271
+ "$id unhealthy/healthy criteria partition the range at $threshold",
272
+ (tc: RatioTemplateCase) => {
273
+ const template: KubernetesAlertTemplate | undefined =
274
+ getKubernetesAlertTemplateById(tc.id);
275
+ const step: MonitorStep = template!.getMonitorStep(buildArgs());
276
+
277
+ const instances: Array<any> = step.data?.monitorCriteria.data
278
+ ?.monitorCriteriaInstanceArray as Array<any>;
279
+ const [offline, online] = instances;
280
+
281
+ const offlineFilter: any = offline.data.filters[0];
282
+ const onlineFilter: any = online.data.filters[0];
283
+
284
+ // Same metric, same threshold — only the comparison direction differs.
285
+ expect(onlineFilter.metricMonitorOptions.metricAlias).toBe(
286
+ tc.resultAlias,
287
+ );
288
+ expect(onlineFilter.value).toBe(tc.threshold);
289
+
290
+ expect(COMPLEMENT_OF[offlineFilter.filterType]).toBe(
291
+ onlineFilter.filterType,
292
+ );
293
+
294
+ // The unhealthy criterion is the one that opens incidents/alerts.
295
+ expect(offline.data.createIncidents).toBe(true);
296
+ expect(offline.data.createAlerts).toBe(true);
297
+ expect(online.data.createIncidents).toBe(false);
298
+ expect(online.data.createAlerts).toBe(false);
299
+ },
300
+ );
301
+ });
302
+
303
+ /*
304
+ * The three saturation templates exist to catch the CAUSE of the
305
+ * "under-resourced workload behind an autoscaler" failure — limits too
306
+ * low, HPA driven to its ceiling, cluster filled — rather than its
307
+ * downstream symptoms (node pressure, pending pods, NotReady), which the
308
+ * older node-side templates already cover. These assertions pin the
309
+ * properties that make them useful for that: they must be discoverable in
310
+ * the picker under a category, and severity must reflect that memory
311
+ * saturation ends in an OOMKill while CPU saturation only throttles.
312
+ */
313
+ describe("KubernetesAlertTemplates - autoscaling & limit saturation", () => {
314
+ const SATURATION_TEMPLATES: Array<{
315
+ id: string;
316
+ category: string;
317
+ severity: string;
318
+ }> = [
319
+ {
320
+ id: "k8s-hpa-at-max-replicas",
321
+ category: "Workload",
322
+ severity: "Critical",
323
+ },
324
+ {
325
+ id: "k8s-pod-memory-limit-saturation",
326
+ category: "Workload",
327
+ // Crossing a memory limit is an immediate kill, not a slowdown.
328
+ severity: "Critical",
329
+ },
330
+ {
331
+ id: "k8s-pod-cpu-limit-saturation",
332
+ category: "Workload",
333
+ // CFS throttling degrades latency; it never kills the container.
334
+ severity: "Warning",
335
+ },
336
+ ];
337
+
338
+ test.each(SATURATION_TEMPLATES)(
339
+ "$id is registered as a $severity $category template",
340
+ (tc: { id: string; category: string; severity: string }) => {
341
+ const template: KubernetesAlertTemplate | undefined =
342
+ getKubernetesAlertTemplateById(tc.id);
343
+
344
+ expect(template).toBeDefined();
345
+ expect(template!.category).toBe(tc.category);
346
+ expect(template!.severity).toBe(tc.severity);
347
+ expect(template!.name.length).toBeGreaterThan(0);
348
+ expect(template!.description.length).toBeGreaterThan(0);
349
+ },
350
+ );
351
+
352
+ test("every template id is unique", () => {
353
+ const ids: Array<string> = getAllKubernetesAlertTemplates().map(
354
+ (t: KubernetesAlertTemplate) => {
355
+ return t.id;
356
+ },
357
+ );
358
+
359
+ expect(new Set(ids).size).toBe(ids.length);
360
+ });
193
361
  });
@@ -0,0 +1,105 @@
1
+ import { JSONObject } from "../../../Types/JSON";
2
+ import DnsRecordType from "../../../Types/Monitor/DnsMonitor/DnsRecordType";
3
+ import MonitorStepDnsMonitor, {
4
+ MonitorStepDnsMonitorUtil,
5
+ } from "../../../Types/Monitor/MonitorStepDnsMonitor";
6
+
7
+ describe("MonitorStepDnsMonitorUtil", () => {
8
+ describe("getDefault", () => {
9
+ test("returns an empty query on port 53 with an A record", () => {
10
+ const def: MonitorStepDnsMonitor = MonitorStepDnsMonitorUtil.getDefault();
11
+
12
+ expect(def.queryName).toBe("");
13
+ expect(def.recordType).toBe(DnsRecordType.A);
14
+ expect(def.hostname).toBe("");
15
+ expect(def.port).toBe(53);
16
+ expect(def.timeout).toBe(5000);
17
+ expect(def.retries).toBe(3);
18
+ });
19
+ });
20
+
21
+ describe("fromJSON", () => {
22
+ test("reads through explicit values", () => {
23
+ const parsed: MonitorStepDnsMonitor = MonitorStepDnsMonitorUtil.fromJSON({
24
+ queryName: "oneuptime.com",
25
+ recordType: DnsRecordType.MX,
26
+ hostname: "8.8.8.8",
27
+ port: 5353,
28
+ timeout: 2000,
29
+ retries: 5,
30
+ });
31
+
32
+ expect(parsed.queryName).toBe("oneuptime.com");
33
+ expect(parsed.recordType).toBe(DnsRecordType.MX);
34
+ expect(parsed.hostname).toBe("8.8.8.8");
35
+ expect(parsed.port).toBe(5353);
36
+ expect(parsed.timeout).toBe(2000);
37
+ expect(parsed.retries).toBe(5);
38
+ });
39
+
40
+ test("falls back to defaults for missing or falsy fields", () => {
41
+ const parsed: MonitorStepDnsMonitor = MonitorStepDnsMonitorUtil.fromJSON(
42
+ {},
43
+ );
44
+
45
+ expect(parsed.queryName).toBe("");
46
+ expect(parsed.recordType).toBe(DnsRecordType.A);
47
+ // An empty hostname collapses to undefined (system-default resolver).
48
+ expect(parsed.hostname).toBeUndefined();
49
+ expect(parsed.port).toBe(53);
50
+ expect(parsed.timeout).toBe(5000);
51
+ expect(parsed.retries).toBe(3);
52
+ });
53
+
54
+ test("treats an empty hostname as the system default resolver", () => {
55
+ const parsed: MonitorStepDnsMonitor = MonitorStepDnsMonitorUtil.fromJSON({
56
+ queryName: "oneuptime.com",
57
+ hostname: "",
58
+ });
59
+
60
+ expect(parsed.hostname).toBeUndefined();
61
+ });
62
+ });
63
+
64
+ describe("toJSON / round-trip", () => {
65
+ test("serializes every field", () => {
66
+ const monitor: MonitorStepDnsMonitor = {
67
+ queryName: "example.com",
68
+ recordType: DnsRecordType.AAAA,
69
+ hostname: "1.1.1.1",
70
+ port: 53,
71
+ timeout: 7000,
72
+ retries: 2,
73
+ };
74
+
75
+ const json: JSONObject = MonitorStepDnsMonitorUtil.toJSON(monitor);
76
+
77
+ expect(json).toEqual({
78
+ queryName: "example.com",
79
+ recordType: DnsRecordType.AAAA,
80
+ hostname: "1.1.1.1",
81
+ port: 53,
82
+ timeout: 7000,
83
+ retries: 2,
84
+ });
85
+ });
86
+
87
+ test("fromJSON(toJSON(x)) preserves a populated monitor", () => {
88
+ const monitor: MonitorStepDnsMonitor = {
89
+ queryName: "example.com",
90
+ recordType: DnsRecordType.TXT,
91
+ hostname: "9.9.9.9",
92
+ port: 5300,
93
+ timeout: 4000,
94
+ retries: 4,
95
+ };
96
+
97
+ const roundTripped: MonitorStepDnsMonitor =
98
+ MonitorStepDnsMonitorUtil.fromJSON(
99
+ MonitorStepDnsMonitorUtil.toJSON(monitor),
100
+ );
101
+
102
+ expect(roundTripped).toEqual(monitor);
103
+ });
104
+ });
105
+ });
@@ -0,0 +1,131 @@
1
+ import { JSONObject } from "../../../Types/JSON";
2
+ import MonitorStepDnssecMonitor, {
3
+ MonitorStepDnssecMonitorUtil,
4
+ } from "../../../Types/Monitor/MonitorStepDnssecMonitor";
5
+
6
+ describe("MonitorStepDnssecMonitorUtil", () => {
7
+ describe("getDefault", () => {
8
+ test("returns three public resolvers and nameserver consistency on", () => {
9
+ const def: MonitorStepDnssecMonitor =
10
+ MonitorStepDnssecMonitorUtil.getDefault();
11
+
12
+ expect(def.domainName).toBe("");
13
+ expect(def.resolvers).toEqual(["1.1.1.1", "8.8.8.8", "9.9.9.9"]);
14
+ expect(def.checkNameserverConsistency).toBe(true);
15
+ expect(def.signatureExpiryWarningDays).toBe(7);
16
+ expect(def.timeout).toBe(10000);
17
+ expect(def.retries).toBe(3);
18
+ });
19
+ });
20
+
21
+ describe("fromJSON resolvers handling", () => {
22
+ test("keeps only non-empty string resolvers", () => {
23
+ const parsed: MonitorStepDnssecMonitor =
24
+ MonitorStepDnssecMonitorUtil.fromJSON({
25
+ domainName: "oneuptime.com",
26
+ resolvers: ["1.1.1.1", "", "8.8.4.4", 123, null],
27
+ });
28
+
29
+ expect(parsed.resolvers).toEqual(["1.1.1.1", "8.8.4.4"]);
30
+ });
31
+
32
+ test("restores default resolvers when the provided list filters down to empty", () => {
33
+ const parsed: MonitorStepDnssecMonitor =
34
+ MonitorStepDnssecMonitorUtil.fromJSON({
35
+ domainName: "oneuptime.com",
36
+ resolvers: ["", 5, null],
37
+ });
38
+
39
+ expect(parsed.resolvers).toEqual(["1.1.1.1", "8.8.8.8", "9.9.9.9"]);
40
+ });
41
+
42
+ test("restores default resolvers when resolvers is not an array", () => {
43
+ const parsed: MonitorStepDnssecMonitor =
44
+ MonitorStepDnssecMonitorUtil.fromJSON({
45
+ domainName: "oneuptime.com",
46
+ resolvers: "1.1.1.1" as unknown as Array<string>,
47
+ });
48
+
49
+ expect(parsed.resolvers).toEqual(["1.1.1.1", "8.8.8.8", "9.9.9.9"]);
50
+ });
51
+ });
52
+
53
+ describe("fromJSON checkNameserverConsistency handling", () => {
54
+ test("honors an explicit false", () => {
55
+ const parsed: MonitorStepDnssecMonitor =
56
+ MonitorStepDnssecMonitorUtil.fromJSON({
57
+ domainName: "oneuptime.com",
58
+ checkNameserverConsistency: false,
59
+ });
60
+
61
+ expect(parsed.checkNameserverConsistency).toBe(false);
62
+ });
63
+
64
+ test("defaults to true when the field is absent or non-boolean", () => {
65
+ expect(
66
+ MonitorStepDnssecMonitorUtil.fromJSON({ domainName: "oneuptime.com" })
67
+ .checkNameserverConsistency,
68
+ ).toBe(true);
69
+
70
+ expect(
71
+ MonitorStepDnssecMonitorUtil.fromJSON({
72
+ domainName: "oneuptime.com",
73
+ checkNameserverConsistency: "yes" as unknown as boolean,
74
+ }).checkNameserverConsistency,
75
+ ).toBe(true);
76
+ });
77
+ });
78
+
79
+ describe("fromJSON numeric defaults", () => {
80
+ test("falls back for falsy numeric fields", () => {
81
+ const parsed: MonitorStepDnssecMonitor =
82
+ MonitorStepDnssecMonitorUtil.fromJSON({
83
+ domainName: "oneuptime.com",
84
+ signatureExpiryWarningDays: 0,
85
+ timeout: 0,
86
+ retries: 0,
87
+ });
88
+
89
+ expect(parsed.signatureExpiryWarningDays).toBe(7);
90
+ expect(parsed.timeout).toBe(10000);
91
+ expect(parsed.retries).toBe(3);
92
+ });
93
+ });
94
+
95
+ describe("round-trip", () => {
96
+ test("fromJSON(toJSON(x)) preserves a populated monitor", () => {
97
+ const monitor: MonitorStepDnssecMonitor = {
98
+ domainName: "example.com",
99
+ resolvers: ["8.8.8.8"],
100
+ checkNameserverConsistency: false,
101
+ signatureExpiryWarningDays: 14,
102
+ timeout: 20000,
103
+ retries: 5,
104
+ };
105
+
106
+ const roundTripped: MonitorStepDnssecMonitor =
107
+ MonitorStepDnssecMonitorUtil.fromJSON(
108
+ MonitorStepDnssecMonitorUtil.toJSON(monitor),
109
+ );
110
+
111
+ expect(roundTripped).toEqual(monitor);
112
+ });
113
+
114
+ test("toJSON emits every field", () => {
115
+ const json: JSONObject = MonitorStepDnssecMonitorUtil.toJSON(
116
+ MonitorStepDnssecMonitorUtil.getDefault(),
117
+ );
118
+
119
+ expect(Object.keys(json).sort()).toEqual(
120
+ [
121
+ "checkNameserverConsistency",
122
+ "domainName",
123
+ "resolvers",
124
+ "retries",
125
+ "signatureExpiryWarningDays",
126
+ "timeout",
127
+ ].sort(),
128
+ );
129
+ });
130
+ });
131
+ });
@@ -0,0 +1,60 @@
1
+ import { JSONObject } from "../../../Types/JSON";
2
+ import MonitorStepDomainMonitor, {
3
+ MonitorStepDomainMonitorUtil,
4
+ } from "../../../Types/Monitor/MonitorStepDomainMonitor";
5
+
6
+ describe("MonitorStepDomainMonitorUtil", () => {
7
+ describe("getDefault", () => {
8
+ test("returns an empty domain with 10s timeout and 3 retries", () => {
9
+ const def: MonitorStepDomainMonitor =
10
+ MonitorStepDomainMonitorUtil.getDefault();
11
+
12
+ expect(def.domainName).toBe("");
13
+ expect(def.timeout).toBe(10000);
14
+ expect(def.retries).toBe(3);
15
+ });
16
+ });
17
+
18
+ describe("fromJSON", () => {
19
+ test("reads through explicit values", () => {
20
+ const parsed: MonitorStepDomainMonitor =
21
+ MonitorStepDomainMonitorUtil.fromJSON({
22
+ domainName: "oneuptime.com",
23
+ timeout: 3000,
24
+ retries: 7,
25
+ });
26
+
27
+ expect(parsed.domainName).toBe("oneuptime.com");
28
+ expect(parsed.timeout).toBe(3000);
29
+ expect(parsed.retries).toBe(7);
30
+ });
31
+
32
+ test("falls back to defaults for missing or falsy fields", () => {
33
+ const parsed: MonitorStepDomainMonitor =
34
+ MonitorStepDomainMonitorUtil.fromJSON({
35
+ domainName: "",
36
+ timeout: 0,
37
+ retries: 0,
38
+ });
39
+
40
+ expect(parsed.domainName).toBe("");
41
+ expect(parsed.timeout).toBe(10000);
42
+ expect(parsed.retries).toBe(3);
43
+ });
44
+ });
45
+
46
+ describe("round-trip", () => {
47
+ test("toJSON emits every field and fromJSON restores it", () => {
48
+ const monitor: MonitorStepDomainMonitor = {
49
+ domainName: "example.com",
50
+ timeout: 5000,
51
+ retries: 2,
52
+ };
53
+
54
+ const json: JSONObject = MonitorStepDomainMonitorUtil.toJSON(monitor);
55
+ expect(json).toEqual(monitor);
56
+
57
+ expect(MonitorStepDomainMonitorUtil.fromJSON(json)).toEqual(monitor);
58
+ });
59
+ });
60
+ });
@@ -0,0 +1,82 @@
1
+ import { JSONObject } from "../../../Types/JSON";
2
+ import ExternalStatusPageProviderType from "../../../Types/Monitor/ExternalStatusPageProviderType";
3
+ import MonitorStepExternalStatusPageMonitor, {
4
+ MonitorStepExternalStatusPageMonitorUtil,
5
+ } from "../../../Types/Monitor/MonitorStepExternalStatusPageMonitor";
6
+
7
+ describe("MonitorStepExternalStatusPageMonitorUtil", () => {
8
+ describe("getDefault", () => {
9
+ test("returns an auto-detected provider with no component filters", () => {
10
+ const def: MonitorStepExternalStatusPageMonitor =
11
+ MonitorStepExternalStatusPageMonitorUtil.getDefault();
12
+
13
+ expect(def.statusPageUrl).toBe("");
14
+ expect(def.provider).toBe(ExternalStatusPageProviderType.Auto);
15
+ expect(def.componentGroupName).toBeUndefined();
16
+ expect(def.componentName).toBeUndefined();
17
+ expect(def.timeout).toBe(10000);
18
+ expect(def.retries).toBe(3);
19
+ });
20
+ });
21
+
22
+ describe("fromJSON", () => {
23
+ test("reads through explicit values", () => {
24
+ const parsed: MonitorStepExternalStatusPageMonitor =
25
+ MonitorStepExternalStatusPageMonitorUtil.fromJSON({
26
+ statusPageUrl: "https://status.example.com",
27
+ provider: ExternalStatusPageProviderType.AtlassianStatuspage,
28
+ componentGroupName: "APIs",
29
+ componentName: "Ingest",
30
+ timeout: 4000,
31
+ retries: 1,
32
+ });
33
+
34
+ expect(parsed.statusPageUrl).toBe("https://status.example.com");
35
+ expect(parsed.provider).toBe(
36
+ ExternalStatusPageProviderType.AtlassianStatuspage,
37
+ );
38
+ expect(parsed.componentGroupName).toBe("APIs");
39
+ expect(parsed.componentName).toBe("Ingest");
40
+ expect(parsed.timeout).toBe(4000);
41
+ expect(parsed.retries).toBe(1);
42
+ });
43
+
44
+ test("falls back to defaults for missing or falsy fields", () => {
45
+ const parsed: MonitorStepExternalStatusPageMonitor =
46
+ MonitorStepExternalStatusPageMonitorUtil.fromJSON({
47
+ statusPageUrl: "",
48
+ componentGroupName: "",
49
+ componentName: "",
50
+ timeout: 0,
51
+ retries: 0,
52
+ });
53
+
54
+ expect(parsed.statusPageUrl).toBe("");
55
+ expect(parsed.provider).toBe(ExternalStatusPageProviderType.Auto);
56
+ expect(parsed.componentGroupName).toBeUndefined();
57
+ expect(parsed.componentName).toBeUndefined();
58
+ expect(parsed.timeout).toBe(10000);
59
+ expect(parsed.retries).toBe(3);
60
+ });
61
+ });
62
+
63
+ describe("round-trip", () => {
64
+ test("fromJSON(toJSON(x)) preserves a populated monitor", () => {
65
+ const monitor: MonitorStepExternalStatusPageMonitor = {
66
+ statusPageUrl: "https://status.incident.io/x",
67
+ provider: ExternalStatusPageProviderType.IncidentIo,
68
+ componentGroupName: "Core",
69
+ componentName: "Dashboard",
70
+ timeout: 15000,
71
+ retries: 5,
72
+ };
73
+
74
+ const json: JSONObject =
75
+ MonitorStepExternalStatusPageMonitorUtil.toJSON(monitor);
76
+ const roundTripped: MonitorStepExternalStatusPageMonitor =
77
+ MonitorStepExternalStatusPageMonitorUtil.fromJSON(json);
78
+
79
+ expect(roundTripped).toEqual(monitor);
80
+ });
81
+ });
82
+ });