@oneuptime/common 11.7.3 → 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 (365) hide show
  1. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
  2. package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
  3. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  4. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  5. package/Models/DatabaseModels/Index.ts +5 -0
  6. package/Models/DatabaseModels/LogDropFilter.ts +89 -0
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
  8. package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
  9. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  10. package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
  11. package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
  12. package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
  13. package/Server/API/AlertAPI.ts +32 -17
  14. package/Server/API/BaseAPI.ts +31 -2
  15. package/Server/API/BaseAnalyticsAPI.ts +36 -2
  16. package/Server/API/CommonAPI.ts +57 -0
  17. package/Server/API/IncidentAPI.ts +60 -33
  18. package/Server/API/IncidentEpisodeAPI.ts +31 -16
  19. package/Server/API/MonitorAPI.ts +30 -0
  20. package/Server/API/MonitorTemplateAPI.ts +8 -0
  21. package/Server/API/ProbeAPI.ts +196 -15
  22. package/Server/API/ProjectAPI.ts +79 -1
  23. package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
  24. package/Server/API/StatusPageAPI.ts +74 -37
  25. package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  31. package/Server/Services/AlertEpisodeService.ts +47 -0
  32. package/Server/Services/AlertService.ts +125 -0
  33. package/Server/Services/BillingService.ts +98 -0
  34. package/Server/Services/DatabaseService.ts +184 -20
  35. package/Server/Services/IncidentEpisodeService.ts +47 -0
  36. package/Server/Services/IncidentService.ts +123 -0
  37. package/Server/Services/IncidentTemplateService.ts +123 -1
  38. package/Server/Services/Index.ts +2 -0
  39. package/Server/Services/LogDropFilterService.ts +133 -0
  40. package/Server/Services/MonitorProbeService.ts +94 -4
  41. package/Server/Services/MonitorService.ts +48 -43
  42. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
  43. package/Server/Services/ProbeService.ts +66 -0
  44. package/Server/Services/ProjectService.ts +131 -7
  45. package/Server/Services/RecommendationDismissalService.ts +52 -0
  46. package/Server/Services/RunbookAgentJobService.ts +68 -7
  47. package/Server/Services/ScheduledMaintenanceService.ts +103 -0
  48. package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
  49. package/Server/Services/StatusPageGroupService.ts +186 -0
  50. package/Server/Services/TraceDropFilterService.ts +133 -0
  51. package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
  52. package/Server/Types/Workflow/Components/API/Get.ts +12 -0
  53. package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
  54. package/Server/Types/Workflow/Components/API/Post.ts +12 -0
  55. package/Server/Types/Workflow/Components/API/Put.ts +13 -0
  56. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
  57. package/Server/Utils/DropFilterValidation.ts +127 -0
  58. package/Server/Utils/Errors.ts +5 -0
  59. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  60. package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
  61. package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
  62. package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
  63. package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
  64. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
  65. package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
  66. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
  67. package/Tests/Server/API/ProbeAPI.test.ts +422 -53
  68. package/Tests/Server/API/ProjectAPI.test.ts +180 -0
  69. package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
  70. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
  71. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
  72. package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
  73. package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
  74. package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
  75. package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
  76. package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
  77. package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
  78. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
  79. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
  80. package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
  81. package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
  82. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
  83. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
  84. package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
  85. package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
  86. package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
  87. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
  88. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
  89. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
  90. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
  91. package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
  92. package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
  93. package/Tests/Types/DateUserTimezone.test.ts +52 -0
  94. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
  95. package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
  96. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
  97. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
  98. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
  99. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
  100. package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
  101. package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
  102. package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
  103. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
  104. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
  105. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
  106. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
  107. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
  108. package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
  109. package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
  110. package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
  111. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
  112. package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
  113. package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
  114. package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
  115. package/Tests/UI/Components/InfoCard.test.tsx +358 -0
  116. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
  117. package/Tests/UI/Components/Modal.test.tsx +43 -5
  118. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
  119. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +427 -0
  120. package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
  121. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
  122. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
  123. package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
  124. package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
  125. package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
  126. package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
  127. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
  128. package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
  129. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
  130. package/Types/Date.ts +15 -6
  131. package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
  132. package/Types/Monitor/MonitorStep.ts +10 -1
  133. package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
  134. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
  135. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
  136. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
  137. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
  138. package/Types/Permission.ts +45 -0
  139. package/Types/Recommendation/RecommendationType.ts +20 -0
  140. package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
  141. package/Types/Runbook/RunbookStepTimeout.ts +202 -0
  142. package/Types/Telemetry/DropFilterSampling.ts +92 -0
  143. package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
  144. package/UI/Components/Accordion/Accordion.tsx +10 -2
  145. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
  146. package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
  147. package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
  148. package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
  149. package/UI/Components/Error/PageError.tsx +0 -4
  150. package/UI/Components/ErrorBoundary.tsx +252 -15
  151. package/UI/Components/InfoCard/InfoCard.tsx +58 -1
  152. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
  153. package/UI/Components/Modal/Modal.tsx +16 -60
  154. package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
  155. package/UI/Components/ModelTable/BaseModelTable.tsx +116 -67
  156. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +150 -47
  157. package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
  158. package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
  159. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
  160. package/UI/Utils/DropdownAlignment.ts +162 -0
  161. package/UI/Utils/TableFilterUrlState.ts +59 -20
  162. package/Utils/API.ts +106 -2
  163. package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
  164. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
  165. package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
  166. package/Utils/StatusPage/GroupTree.ts +307 -0
  167. package/Utils/StatusPage/ResourceUptime.ts +90 -17
  168. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
  169. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
  170. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
  171. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  172. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  173. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  174. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  175. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  176. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  177. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
  179. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
  181. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
  183. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
  184. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  185. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
  187. package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
  189. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
  191. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  192. package/build/dist/Server/API/AlertAPI.js +22 -13
  193. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  194. package/build/dist/Server/API/BaseAPI.js +22 -1
  195. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  196. package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
  197. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  198. package/build/dist/Server/API/CommonAPI.js +42 -0
  199. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  200. package/build/dist/Server/API/IncidentAPI.js +43 -26
  201. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  202. package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
  203. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  204. package/build/dist/Server/API/MonitorAPI.js +23 -0
  205. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  206. package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
  207. package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
  208. package/build/dist/Server/API/ProbeAPI.js +131 -15
  209. package/build/dist/Server/API/ProbeAPI.js.map +1 -1
  210. package/build/dist/Server/API/ProjectAPI.js +62 -3
  211. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  212. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
  213. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  214. package/build/dist/Server/API/StatusPageAPI.js +61 -33
  215. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  216. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
  217. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  228. package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
  229. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  230. package/build/dist/Server/Services/AlertService.js +95 -0
  231. package/build/dist/Server/Services/AlertService.js.map +1 -1
  232. package/build/dist/Server/Services/BillingService.js +71 -0
  233. package/build/dist/Server/Services/BillingService.js.map +1 -1
  234. package/build/dist/Server/Services/DatabaseService.js +140 -17
  235. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  236. package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
  237. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  238. package/build/dist/Server/Services/IncidentService.js +100 -0
  239. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  240. package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
  241. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  242. package/build/dist/Server/Services/Index.js +2 -0
  243. package/build/dist/Server/Services/Index.js.map +1 -1
  244. package/build/dist/Server/Services/LogDropFilterService.js +93 -0
  245. package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
  246. package/build/dist/Server/Services/MonitorProbeService.js +73 -5
  247. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  248. package/build/dist/Server/Services/MonitorService.js +34 -39
  249. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  250. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
  251. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  252. package/build/dist/Server/Services/ProbeService.js +64 -0
  253. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  254. package/build/dist/Server/Services/ProjectService.js +103 -7
  255. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  256. package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
  257. package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
  258. package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
  259. package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
  260. package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
  261. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  262. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
  263. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  264. package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
  265. package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
  266. package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
  267. package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
  268. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
  269. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  270. package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
  271. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  272. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
  273. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  274. package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
  275. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  276. package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
  277. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  278. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
  279. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
  280. package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
  281. package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
  282. package/build/dist/Server/Utils/Errors.js +3 -0
  283. package/build/dist/Server/Utils/Errors.js.map +1 -1
  284. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
  285. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  286. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
  287. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  288. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
  289. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  290. package/build/dist/Types/Date.js +14 -4
  291. package/build/dist/Types/Date.js.map +1 -1
  292. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
  293. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  294. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  295. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  296. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
  297. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  298. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
  299. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
  300. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
  301. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
  302. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
  303. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
  304. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
  305. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
  306. package/build/dist/Types/Permission.js +40 -0
  307. package/build/dist/Types/Permission.js.map +1 -1
  308. package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
  309. package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
  310. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
  311. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
  312. package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
  313. package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
  314. package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
  315. package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
  316. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
  317. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  318. package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
  319. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  320. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  321. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  322. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
  323. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  324. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
  325. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
  326. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
  327. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  328. package/build/dist/UI/Components/Error/PageError.js +1 -3
  329. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  330. package/build/dist/UI/Components/ErrorBoundary.js +145 -11
  331. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  332. package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
  333. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  334. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
  335. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  336. package/build/dist/UI/Components/Modal/Modal.js +4 -32
  337. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  338. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  339. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +69 -33
  340. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  341. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +73 -32
  342. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
  343. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
  344. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
  345. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
  346. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
  347. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
  348. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  349. package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
  350. package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
  351. package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
  352. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  353. package/build/dist/Utils/API.js +39 -2
  354. package/build/dist/Utils/API.js.map +1 -1
  355. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
  356. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
  357. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
  358. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
  359. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
  360. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
  361. package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
  362. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
  363. package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
  364. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  365. package/package.json +1 -1
@@ -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
+ });
@@ -0,0 +1,185 @@
1
+ import Profile from "../../../Models/AnalyticsModels/Profile";
2
+ import InBetween from "../../../Types/BaseDatabase/InBetween";
3
+ import Includes from "../../../Types/BaseDatabase/Includes";
4
+ import Query from "../../../Types/BaseDatabase/Query";
5
+ import Search from "../../../Types/BaseDatabase/Search";
6
+ import { JSONObject } from "../../../Types/JSON";
7
+ import MonitorStepProfileMonitor, {
8
+ MonitorStepProfileMonitorUtil,
9
+ } from "../../../Types/Monitor/MonitorStepProfileMonitor";
10
+ import ObjectID from "../../../Types/ObjectID";
11
+
12
+ describe("MonitorStepProfileMonitorUtil", () => {
13
+ describe("getDefault", () => {
14
+ test("returns an empty monitor scoped to the last 60 seconds", () => {
15
+ const def: MonitorStepProfileMonitor =
16
+ MonitorStepProfileMonitorUtil.getDefault();
17
+
18
+ expect(def.attributes).toEqual({});
19
+ expect(def.profileType).toBe("");
20
+ expect(def.profileTypes).toEqual([]);
21
+ expect(def.telemetryServiceIds).toEqual([]);
22
+ expect(def.entityKeys).toEqual([]);
23
+ expect(def.lastXSecondsOfProfiles).toBe(60);
24
+ });
25
+ });
26
+
27
+ describe("toQuery", () => {
28
+ test("builds only the time window for the empty default", () => {
29
+ const query: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery(
30
+ MonitorStepProfileMonitorUtil.getDefault(),
31
+ );
32
+
33
+ // Only the rolling time window is present.
34
+ expect(query.startTime).toBeInstanceOf(InBetween);
35
+ expect(query.primaryEntityId).toBeUndefined();
36
+ expect(query.entityKeys).toBeUndefined();
37
+ expect(query.attributes).toBeUndefined();
38
+ expect(query.profileType).toBeUndefined();
39
+ });
40
+
41
+ test("builds no filters at all when the time window is disabled", () => {
42
+ const query: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery({
43
+ ...MonitorStepProfileMonitorUtil.getDefault(),
44
+ lastXSecondsOfProfiles: 0,
45
+ });
46
+
47
+ expect(query).toEqual({});
48
+ });
49
+
50
+ test("scopes to telemetry services when provided", () => {
51
+ const serviceId: ObjectID = ObjectID.generate();
52
+
53
+ const query: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery({
54
+ ...MonitorStepProfileMonitorUtil.getDefault(),
55
+ telemetryServiceIds: [serviceId],
56
+ lastXSecondsOfProfiles: 0,
57
+ });
58
+
59
+ expect(query.primaryEntityId).toBeInstanceOf(Includes);
60
+ expect((query.primaryEntityId as Includes).values).toEqual([serviceId]);
61
+ });
62
+
63
+ test("scopes to entity keys when provided", () => {
64
+ const query: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery({
65
+ ...MonitorStepProfileMonitorUtil.getDefault(),
66
+ entityKeys: ["host-1", "pod-2"],
67
+ lastXSecondsOfProfiles: 0,
68
+ });
69
+
70
+ expect(query.entityKeys).toBeInstanceOf(Includes);
71
+ expect((query.entityKeys as Includes).values).toEqual([
72
+ "host-1",
73
+ "pod-2",
74
+ ]);
75
+ });
76
+
77
+ test("passes attributes through only when non-empty", () => {
78
+ const withAttrs: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery({
79
+ ...MonitorStepProfileMonitorUtil.getDefault(),
80
+ attributes: { "service.name": "checkout" },
81
+ lastXSecondsOfProfiles: 0,
82
+ });
83
+ expect(withAttrs.attributes).toEqual({ "service.name": "checkout" });
84
+
85
+ const withoutAttrs: Query<Profile> =
86
+ MonitorStepProfileMonitorUtil.toQuery({
87
+ ...MonitorStepProfileMonitorUtil.getDefault(),
88
+ attributes: {},
89
+ lastXSecondsOfProfiles: 0,
90
+ });
91
+ expect(withoutAttrs.attributes).toBeUndefined();
92
+ });
93
+
94
+ test("uses Includes for profileTypes", () => {
95
+ const query: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery({
96
+ ...MonitorStepProfileMonitorUtil.getDefault(),
97
+ profileTypes: ["cpu", "heap"],
98
+ lastXSecondsOfProfiles: 0,
99
+ });
100
+
101
+ expect(query.profileType).toBeInstanceOf(Includes);
102
+ expect((query.profileType as unknown as Includes).values).toEqual([
103
+ "cpu",
104
+ "heap",
105
+ ]);
106
+ });
107
+
108
+ test("a single profileType wins over profileTypes as a Search", () => {
109
+ const query: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery({
110
+ ...MonitorStepProfileMonitorUtil.getDefault(),
111
+ profileTypes: ["cpu", "heap"],
112
+ profileType: "cpu",
113
+ lastXSecondsOfProfiles: 0,
114
+ });
115
+
116
+ expect(query.profileType).toBeInstanceOf(Search);
117
+ expect((query.profileType as unknown as Search<string>).value).toBe(
118
+ "cpu",
119
+ );
120
+ });
121
+
122
+ test("builds a bounded time window from lastXSecondsOfProfiles", () => {
123
+ const query: Query<Profile> = MonitorStepProfileMonitorUtil.toQuery({
124
+ ...MonitorStepProfileMonitorUtil.getDefault(),
125
+ lastXSecondsOfProfiles: 120,
126
+ });
127
+
128
+ const window: InBetween<Date> = query.startTime as InBetween<Date>;
129
+ expect(window).toBeInstanceOf(InBetween);
130
+
131
+ const spanMs: number =
132
+ window.endValue.getTime() - window.startValue.getTime();
133
+ // 120 seconds, allowing a small margin for clock advance during the call.
134
+ expect(spanMs).toBeGreaterThanOrEqual(119 * 1000);
135
+ expect(spanMs).toBeLessThanOrEqual(121 * 1000);
136
+ });
137
+ });
138
+
139
+ describe("round-trip", () => {
140
+ test("fromJSON(toJSON(x)) preserves a populated monitor", () => {
141
+ const monitor: MonitorStepProfileMonitor = {
142
+ attributes: { env: "prod", replicas: 3, canary: true },
143
+ profileType: "cpu",
144
+ profileTypes: ["cpu", "heap"],
145
+ telemetryServiceIds: [ObjectID.generate(), ObjectID.generate()],
146
+ entityKeys: ["host-1"],
147
+ lastXSecondsOfProfiles: 300,
148
+ };
149
+
150
+ const json: JSONObject = MonitorStepProfileMonitorUtil.toJSON(monitor);
151
+ const roundTripped: MonitorStepProfileMonitor =
152
+ MonitorStepProfileMonitorUtil.fromJSON(json);
153
+
154
+ expect(roundTripped.attributes).toEqual(monitor.attributes);
155
+ expect(roundTripped.profileType).toBe(monitor.profileType);
156
+ expect(roundTripped.profileTypes).toEqual(monitor.profileTypes);
157
+ expect(roundTripped.entityKeys).toEqual(monitor.entityKeys);
158
+ expect(roundTripped.lastXSecondsOfProfiles).toBe(
159
+ monitor.lastXSecondsOfProfiles,
160
+ );
161
+ expect(
162
+ roundTripped.telemetryServiceIds.map((id: ObjectID) => {
163
+ return id.toString();
164
+ }),
165
+ ).toEqual(
166
+ monitor.telemetryServiceIds.map((id: ObjectID) => {
167
+ return id.toString();
168
+ }),
169
+ );
170
+ });
171
+
172
+ test("fromJSON defaults entityKeys to an empty array when absent", () => {
173
+ const parsed: MonitorStepProfileMonitor =
174
+ MonitorStepProfileMonitorUtil.fromJSON({
175
+ attributes: {},
176
+ profileType: "",
177
+ profileTypes: [],
178
+ telemetryServiceIds: [],
179
+ lastXSecondsOfProfiles: 60,
180
+ });
181
+
182
+ expect(parsed.entityKeys).toEqual([]);
183
+ });
184
+ });
185
+ });