@oneuptime/common 12.0.4 → 12.0.5

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 (374) hide show
  1. package/Models/DatabaseModels/AIRun.ts +38 -1
  2. package/Models/DatabaseModels/AlertFeed.ts +30 -0
  3. package/Models/DatabaseModels/Dashboard.ts +28 -0
  4. package/Models/DatabaseModels/Incident.ts +2 -0
  5. package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
  6. package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
  7. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  8. package/Models/DatabaseModels/IncidentFeed.ts +30 -0
  9. package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
  10. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  11. package/Models/DatabaseModels/LogSavedView.ts +33 -0
  12. package/Models/DatabaseModels/Project.ts +231 -9
  13. package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
  14. package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
  15. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  16. package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
  17. package/Models/DatabaseModels/StatusPage.ts +28 -0
  18. package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
  19. package/Server/API/AIAgentDataAPI.ts +44 -55
  20. package/Server/API/AIInvestigationAPI.ts +175 -17
  21. package/Server/API/DashboardAPI.ts +10 -10
  22. package/Server/API/StatusPageAPI.ts +38 -19
  23. package/Server/EnvironmentConfig.ts +16 -0
  24. package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
  25. package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  32. package/Server/Services/AIRunService.ts +78 -10
  33. package/Server/Services/AIService.ts +94 -22
  34. package/Server/Services/AlertFeedService.ts +5 -0
  35. package/Server/Services/AnalyticsDatabaseService.ts +29 -0
  36. package/Server/Services/DatabaseService.ts +43 -2
  37. package/Server/Services/IncidentFeedService.ts +5 -0
  38. package/Server/Services/LlmLogService.ts +46 -2
  39. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
  40. package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
  41. package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
  42. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
  43. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
  44. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
  45. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
  46. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
  47. package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
  48. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
  49. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
  50. package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
  51. package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
  52. package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
  53. package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
  54. package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
  55. package/Server/Utils/AI/SRE/README.md +1 -1
  56. package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
  57. package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
  58. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
  59. package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
  60. package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
  61. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
  62. package/Server/Utils/PasswordHash.ts +28 -4
  63. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
  64. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
  65. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
  66. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
  67. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
  68. package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
  69. package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
  70. package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
  71. package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
  72. package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
  73. package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
  74. package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
  75. package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
  76. package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
  77. package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
  78. package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
  79. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
  80. package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
  81. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +25 -1
  82. package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +45 -35
  83. package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
  84. package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
  85. package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
  86. package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
  87. package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
  88. package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
  89. package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
  90. package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
  91. package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
  92. package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
  93. package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
  94. package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
  95. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
  96. package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
  97. package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
  98. package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
  99. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
  100. package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
  101. package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
  102. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
  103. package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
  104. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
  105. package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
  106. package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
  107. package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
  108. package/Tests/Server/Utils/PasswordHash.test.ts +30 -0
  109. package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
  110. package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
  111. package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
  112. package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
  113. package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
  114. package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
  115. package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
  116. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
  117. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
  118. package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
  119. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
  120. package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
  121. package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
  122. package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
  123. package/Tests/Types/Permission.test.ts +137 -0
  124. package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
  125. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
  126. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
  127. package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
  128. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
  129. package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
  130. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
  131. package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
  132. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
  133. package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
  134. package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
  135. package/Tests/UI/Utils/Project.test.ts +31 -0
  136. package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
  137. package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
  138. package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
  139. package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
  140. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
  141. package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
  142. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
  143. package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
  144. package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
  145. package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
  146. package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
  147. package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
  148. package/Types/AI/CodeFixTaskContext.ts +63 -3
  149. package/Types/AI/CodeFixTaskType.ts +3 -3
  150. package/Types/HashedString.ts +4 -3
  151. package/Types/Monitor/CriteriaFilter.ts +4 -0
  152. package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
  153. package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
  154. package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
  155. package/Types/Monitor/MonitorMetricType.ts +8 -0
  156. package/Types/Monitor/MonitorStep.ts +10 -1
  157. package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
  158. package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
  159. package/Types/Permission.ts +23 -175
  160. package/Types/Probe/ProbeMonitorResponse.ts +6 -0
  161. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
  162. package/UI/Components/ErrorBoundary.tsx +138 -11
  163. package/UI/Components/Feed/FeedItem.tsx +9 -2
  164. package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
  165. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  166. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
  167. package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
  168. package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
  169. package/UI/Utils/DownloadFile.ts +16 -8
  170. package/UI/Utils/ErrorSupportBundle.ts +805 -0
  171. package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
  172. package/UI/Utils/Project.ts +4 -0
  173. package/UI/Utils/StatusPage.ts +8 -2
  174. package/UI/Utils/UseDashboardGridDnd.ts +917 -0
  175. package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
  176. package/Utils/Dashboard/GridLayout.ts +523 -0
  177. package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
  178. package/Utils/Monitor/MonitorMetricType.ts +44 -2
  179. package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
  180. package/Utils/StatusPage/GroupTree.ts +157 -66
  181. package/Utils/StatusPage/ResourceUptime.ts +37 -2
  182. package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
  183. package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
  184. package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
  185. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
  187. package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
  189. package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/Incident.js +2 -0
  191. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
  193. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
  195. package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.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/IncidentFeed.js +32 -0
  199. package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
  201. package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  203. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
  205. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/Project.js +241 -11
  207. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
  209. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
  211. package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  213. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
  215. package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
  216. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
  218. package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
  219. package/build/dist/Server/API/AIAgentDataAPI.js +28 -46
  220. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  221. package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
  222. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  223. package/build/dist/Server/API/DashboardAPI.js +8 -5
  224. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  225. package/build/dist/Server/API/StatusPageAPI.js +29 -11
  226. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  227. package/build/dist/Server/EnvironmentConfig.js +14 -0
  228. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  229. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
  230. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  231. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
  232. package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  245. package/build/dist/Server/Services/AIRunService.js +58 -12
  246. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  247. package/build/dist/Server/Services/AIService.js +74 -21
  248. package/build/dist/Server/Services/AIService.js.map +1 -1
  249. package/build/dist/Server/Services/AlertFeedService.js +3 -0
  250. package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
  251. package/build/dist/Server/Services/AnalyticsDatabaseService.js +29 -1
  252. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  253. package/build/dist/Server/Services/DatabaseService.js +21 -2
  254. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  255. package/build/dist/Server/Services/IncidentFeedService.js +3 -0
  256. package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
  257. package/build/dist/Server/Services/LlmLogService.js +22 -1
  258. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  259. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  260. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  261. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
  262. package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
  263. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
  264. package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
  265. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
  266. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  267. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
  268. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  269. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
  270. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  271. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
  272. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  273. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
  274. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  275. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
  276. package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
  277. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
  278. package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
  279. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
  280. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  281. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
  282. package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
  283. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
  284. package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
  285. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
  286. package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
  287. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
  288. package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
  289. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
  290. package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
  291. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
  292. package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
  293. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
  294. package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
  295. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
  296. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  297. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
  298. package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
  299. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  300. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  301. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
  302. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  303. package/build/dist/Server/Utils/PasswordHash.js +25 -4
  304. package/build/dist/Server/Utils/PasswordHash.js.map +1 -1
  305. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
  306. package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
  307. package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
  308. package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
  309. package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
  310. package/build/dist/Types/HashedString.js +4 -3
  311. package/build/dist/Types/HashedString.js.map +1 -1
  312. package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
  313. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  314. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
  315. package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
  316. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
  317. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  318. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  319. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  320. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  321. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  322. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
  323. package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
  324. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
  325. package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
  326. package/build/dist/Types/Permission.js +23 -155
  327. package/build/dist/Types/Permission.js.map +1 -1
  328. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
  329. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  330. package/build/dist/UI/Components/ErrorBoundary.js +67 -8
  331. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  332. package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
  333. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  334. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
  335. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  336. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  337. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  338. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
  339. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  340. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
  341. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  342. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
  343. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  344. package/build/dist/UI/Utils/DownloadFile.js +15 -8
  345. package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
  346. package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
  347. package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
  348. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
  349. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  350. package/build/dist/UI/Utils/Project.js +3 -0
  351. package/build/dist/UI/Utils/Project.js.map +1 -1
  352. package/build/dist/UI/Utils/StatusPage.js +4 -4
  353. package/build/dist/UI/Utils/StatusPage.js.map +1 -1
  354. package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
  355. package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
  356. package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
  357. package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
  358. package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
  359. package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
  360. package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
  361. package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
  362. package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
  363. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  364. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
  365. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
  366. package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
  367. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
  368. package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
  369. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  370. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
  371. package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
  372. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
  373. package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
  374. package/package.json +1 -1
@@ -0,0 +1,118 @@
1
+ import {
2
+ KubernetesMetricCategory,
3
+ KubernetesMetricDefinition,
4
+ getAllKubernetesMetricCategories,
5
+ getAllKubernetesMetrics,
6
+ getKubernetesMetricById,
7
+ getKubernetesMetricByMetricName,
8
+ getKubernetesMetricsByCategory,
9
+ } from "../../../Types/Monitor/KubernetesMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("KubernetesMetricCatalog", () => {
14
+ const allMetrics: Array<KubernetesMetricDefinition> =
15
+ getAllKubernetesMetrics();
16
+ const allCategories: Array<KubernetesMetricCategory> =
17
+ getAllKubernetesMetricCategories();
18
+ const validAggregations: Array<string> = Object.values(AggregationType);
19
+
20
+ test("returns a non-empty catalog", () => {
21
+ expect(Array.isArray(allMetrics)).toBe(true);
22
+ expect(allMetrics.length).toBeGreaterThan(0);
23
+ });
24
+
25
+ test("every metric definition has all required non-empty fields", () => {
26
+ for (const metric of allMetrics) {
27
+ expect(typeof metric.id).toBe("string");
28
+ expect(metric.id.length).toBeGreaterThan(0);
29
+ expect(metric.friendlyName.length).toBeGreaterThan(0);
30
+ expect(metric.description.length).toBeGreaterThan(0);
31
+ expect(metric.metricName.length).toBeGreaterThan(0);
32
+ expect(metric.category.length).toBeGreaterThan(0);
33
+ }
34
+ });
35
+
36
+ test("every metric uses a valid aggregation type", () => {
37
+ for (const metric of allMetrics) {
38
+ expect(validAggregations).toContain(metric.defaultAggregation);
39
+ }
40
+ });
41
+
42
+ test("metric ids are unique", () => {
43
+ const ids: Array<string> = allMetrics.map(
44
+ (m: KubernetesMetricDefinition) => {
45
+ return m.id;
46
+ },
47
+ );
48
+ expect(new Set(ids).size).toBe(ids.length);
49
+ });
50
+
51
+ test("metric names are unique", () => {
52
+ const names: Array<string> = allMetrics.map(
53
+ (m: KubernetesMetricDefinition) => {
54
+ return m.metricName;
55
+ },
56
+ );
57
+ expect(new Set(names).size).toBe(names.length);
58
+ });
59
+
60
+ test("every metric category is a declared category", () => {
61
+ for (const metric of allMetrics) {
62
+ expect(allCategories).toContain(metric.category);
63
+ }
64
+ });
65
+
66
+ test("declared categories are unique and non-empty", () => {
67
+ expect(allCategories.length).toBeGreaterThan(0);
68
+ expect(new Set(allCategories).size).toBe(allCategories.length);
69
+ });
70
+
71
+ test("every declared category has at least one metric", () => {
72
+ for (const category of allCategories) {
73
+ expect(getKubernetesMetricsByCategory(category).length).toBeGreaterThan(
74
+ 0,
75
+ );
76
+ }
77
+ });
78
+
79
+ test("getKubernetesMetricsByCategory returns only metrics of that category", () => {
80
+ for (const category of allCategories) {
81
+ for (const metric of getKubernetesMetricsByCategory(category)) {
82
+ expect(metric.category).toBe(category);
83
+ }
84
+ }
85
+ });
86
+
87
+ test("getKubernetesMetricById round-trips every metric", () => {
88
+ for (const metric of allMetrics) {
89
+ expect(getKubernetesMetricById(metric.id)).toEqual(metric);
90
+ }
91
+ });
92
+
93
+ test("getKubernetesMetricById returns undefined for an unknown id", () => {
94
+ expect(getKubernetesMetricById("does-not-exist")).toBeUndefined();
95
+ expect(getKubernetesMetricById("")).toBeUndefined();
96
+ });
97
+
98
+ test("getKubernetesMetricByMetricName round-trips every metric", () => {
99
+ for (const metric of allMetrics) {
100
+ expect(getKubernetesMetricByMetricName(metric.metricName)).toEqual(
101
+ metric,
102
+ );
103
+ }
104
+ });
105
+
106
+ test("getKubernetesMetricByMetricName returns undefined for an unknown name", () => {
107
+ expect(getKubernetesMetricByMetricName("nope.nope.nope")).toBeUndefined();
108
+ });
109
+
110
+ test("known metrics are present", () => {
111
+ expect(
112
+ getKubernetesMetricByMetricName("k8s.pod.cpu.utilization"),
113
+ ).toBeDefined();
114
+ expect(
115
+ getKubernetesMetricByMetricName("k8s.pod.memory.usage"),
116
+ ).toBeDefined();
117
+ });
118
+ });
@@ -146,6 +146,28 @@ describe("MonitorCriteriaInstance", () => {
146
146
  });
147
147
  expect(instance).toBeNull();
148
148
  });
149
+
150
+ /*
151
+ * A domain whose registration data cannot be read has no expiry date, so
152
+ * DomainIsExpired cannot decide anything. Requiring IsOnline as well is
153
+ * what stops an unreadable registration from being reported as healthy
154
+ * (issue #3046).
155
+ */
156
+ test("Domain monitor requires a successful lookup as well as a live registration", () => {
157
+ const instance: MonitorCriteriaInstance | null =
158
+ MonitorCriteriaInstance.getDefaultOnlineMonitorCriteriaInstance({
159
+ monitorType: MonitorType.Domain,
160
+ monitorStatusId,
161
+ monitorName: "identity.digital",
162
+ });
163
+
164
+ expect(instance?.data?.filterCondition).toBe(FilterCondition.All);
165
+ expect(instance?.data?.filters).toHaveLength(2);
166
+ expect(instance?.data?.filters[0]?.checkOn).toBe(CheckOn.IsOnline);
167
+ expect(instance?.data?.filters[0]?.filterType).toBe(FilterType.True);
168
+ expect(instance?.data?.filters[1]?.checkOn).toBe(CheckOn.DomainIsExpired);
169
+ expect(instance?.data?.filters[1]?.filterType).toBe(FilterType.False);
170
+ });
149
171
  });
150
172
 
151
173
  describe("getDefaultOfflineMonitorCriteriaInstance", () => {
@@ -181,6 +203,26 @@ describe("MonitorCriteriaInstance", () => {
181
203
  );
182
204
  expect(instance.data?.incidents[0]?.title).toContain("Edge");
183
205
  });
206
+
207
+ test("Domain offline criteria fires on an expired registration or a failed lookup", () => {
208
+ const instance: MonitorCriteriaInstance =
209
+ MonitorCriteriaInstance.getDefaultOfflineMonitorCriteriaInstance({
210
+ monitorType: MonitorType.Domain,
211
+ monitorStatusId: new ObjectID("bbbbbbbbbbbbbbbbbbbbbbbb"),
212
+ incidentSeverityId: new ObjectID("cccccccccccccccccccccccc"),
213
+ alertSeverityId: new ObjectID("dddddddddddddddddddddddd"),
214
+ monitorName: "identity.digital",
215
+ });
216
+
217
+ expect(instance.data?.filterCondition).toBe(FilterCondition.Any);
218
+ expect(instance.data?.filters).toHaveLength(2);
219
+ expect(instance.data?.filters[0]?.checkOn).toBe(CheckOn.DomainIsExpired);
220
+ expect(instance.data?.filters[0]?.filterType).toBe(FilterType.True);
221
+ expect(instance.data?.filters[1]?.checkOn).toBe(CheckOn.IsOnline);
222
+ expect(instance.data?.filters[1]?.filterType).toBe(FilterType.False);
223
+ expect(instance.data?.createIncidents).toBe(true);
224
+ expect(instance.data?.incidents[0]?.title).toContain("identity.digital");
225
+ });
184
226
  });
185
227
 
186
228
  describe("getValidationError", () => {
@@ -1,5 +1,6 @@
1
1
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
2
2
  import MonitorType from "../../../Types/Monitor/MonitorType";
3
+ import DomainLookupMethod from "../../../Types/Monitor/DomainMonitor/DomainLookupMethod";
3
4
  import ObjectID from "../../../Types/ObjectID";
4
5
  import HTTPMethod from "../../../Types/API/HTTPMethod";
5
6
  import { JSONObject, ObjectType } from "../../../Types/JSON";
@@ -179,5 +180,42 @@ describe("MonitorStep", () => {
179
180
  const parsed: JSONObject = JSON.parse(step.toString()) as JSONObject;
180
181
  expect(parsed["_type"]).toBe(ObjectType.MonitorStep);
181
182
  });
183
+
184
+ /*
185
+ * Domain monitors saved before the lookupMethod option existed carry no
186
+ * such key. fromJSON has to fill it in, because the probe reads the
187
+ * deserialized config directly and its type says the field is present.
188
+ */
189
+ function restoreWithDomainMonitor(domainMonitor: JSONObject): JSONObject {
190
+ const json: JSONObject =
191
+ MonitorStep.getDefaultMonitorStep(DEFAULT_ARG).toJSON();
192
+
193
+ (json["value"] as JSONObject)["domainMonitor"] = domainMonitor;
194
+
195
+ return MonitorStep.fromJSON(json).data
196
+ ?.domainMonitor as unknown as JSONObject;
197
+ }
198
+
199
+ test("fills in the domain monitor lookup method for a step saved without one", () => {
200
+ const domainMonitor: JSONObject = restoreWithDomainMonitor({
201
+ domainName: "identity.digital",
202
+ timeout: 10000,
203
+ retries: 3,
204
+ });
205
+
206
+ expect(domainMonitor["domainName"]).toBe("identity.digital");
207
+ expect(domainMonitor["lookupMethod"]).toBe(DomainLookupMethod.Auto);
208
+ });
209
+
210
+ test("preserves an explicitly chosen domain monitor lookup method", () => {
211
+ const domainMonitor: JSONObject = restoreWithDomainMonitor({
212
+ domainName: "identity.digital",
213
+ lookupMethod: DomainLookupMethod.WHOIS,
214
+ timeout: 10000,
215
+ retries: 3,
216
+ });
217
+
218
+ expect(domainMonitor["lookupMethod"]).toBe(DomainLookupMethod.WHOIS);
219
+ });
182
220
  });
183
221
  });
@@ -1,4 +1,5 @@
1
1
  import { JSONObject } from "../../../Types/JSON";
2
+ import DomainLookupMethod from "../../../Types/Monitor/DomainMonitor/DomainLookupMethod";
2
3
  import MonitorStepDomainMonitor, {
3
4
  MonitorStepDomainMonitorUtil,
4
5
  } from "../../../Types/Monitor/MonitorStepDomainMonitor";
@@ -13,6 +14,16 @@ describe("MonitorStepDomainMonitorUtil", () => {
13
14
  expect(def.timeout).toBe(10000);
14
15
  expect(def.retries).toBe(3);
15
16
  });
17
+
18
+ /*
19
+ * Auto rather than RDAP: about half the ccTLDs (.io, .co, .de, ...)
20
+ * publish no RDAP service, so RDAP-only would break them.
21
+ */
22
+ test("defaults to the Auto lookup method", () => {
23
+ expect(MonitorStepDomainMonitorUtil.getDefault().lookupMethod).toBe(
24
+ DomainLookupMethod.Auto,
25
+ );
26
+ });
16
27
  });
17
28
 
18
29
  describe("fromJSON", () => {
@@ -20,11 +31,13 @@ describe("MonitorStepDomainMonitorUtil", () => {
20
31
  const parsed: MonitorStepDomainMonitor =
21
32
  MonitorStepDomainMonitorUtil.fromJSON({
22
33
  domainName: "oneuptime.com",
34
+ lookupMethod: DomainLookupMethod.RDAP,
23
35
  timeout: 3000,
24
36
  retries: 7,
25
37
  });
26
38
 
27
39
  expect(parsed.domainName).toBe("oneuptime.com");
40
+ expect(parsed.lookupMethod).toBe(DomainLookupMethod.RDAP);
28
41
  expect(parsed.timeout).toBe(3000);
29
42
  expect(parsed.retries).toBe(7);
30
43
  });
@@ -41,12 +54,54 @@ describe("MonitorStepDomainMonitorUtil", () => {
41
54
  expect(parsed.timeout).toBe(10000);
42
55
  expect(parsed.retries).toBe(3);
43
56
  });
57
+
58
+ /*
59
+ * Every domain monitor saved before RDAP support existed has no
60
+ * lookupMethod key at all, and must keep working.
61
+ */
62
+ test("treats a monitor saved without a lookup method as Auto", () => {
63
+ const parsed: MonitorStepDomainMonitor =
64
+ MonitorStepDomainMonitorUtil.fromJSON({
65
+ domainName: "identity.digital",
66
+ timeout: 10000,
67
+ retries: 3,
68
+ });
69
+
70
+ expect(parsed.lookupMethod).toBe(DomainLookupMethod.Auto);
71
+ });
72
+
73
+ test("treats an unrecognised lookup method as Auto", () => {
74
+ expect(
75
+ MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: "" })
76
+ .lookupMethod,
77
+ ).toBe(DomainLookupMethod.Auto);
78
+
79
+ expect(
80
+ MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: "Telepathy" })
81
+ .lookupMethod,
82
+ ).toBe(DomainLookupMethod.Auto);
83
+
84
+ expect(
85
+ MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: 42 })
86
+ .lookupMethod,
87
+ ).toBe(DomainLookupMethod.Auto);
88
+ });
89
+
90
+ test("accepts every declared lookup method", () => {
91
+ for (const method of Object.values(DomainLookupMethod)) {
92
+ expect(
93
+ MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: method })
94
+ .lookupMethod,
95
+ ).toBe(method);
96
+ }
97
+ });
44
98
  });
45
99
 
46
100
  describe("round-trip", () => {
47
101
  test("toJSON emits every field and fromJSON restores it", () => {
48
102
  const monitor: MonitorStepDomainMonitor = {
49
103
  domainName: "example.com",
104
+ lookupMethod: DomainLookupMethod.WHOIS,
50
105
  timeout: 5000,
51
106
  retries: 2,
52
107
  };
@@ -57,4 +112,24 @@ describe("MonitorStepDomainMonitorUtil", () => {
57
112
  expect(MonitorStepDomainMonitorUtil.fromJSON(json)).toEqual(monitor);
58
113
  });
59
114
  });
115
+
116
+ describe("parseLookupMethod", () => {
117
+ test("accepts the declared values and rejects anything else", () => {
118
+ expect(MonitorStepDomainMonitorUtil.parseLookupMethod("RDAP")).toBe(
119
+ DomainLookupMethod.RDAP,
120
+ );
121
+ expect(MonitorStepDomainMonitorUtil.parseLookupMethod("WHOIS")).toBe(
122
+ DomainLookupMethod.WHOIS,
123
+ );
124
+ expect(MonitorStepDomainMonitorUtil.parseLookupMethod("rdap")).toBe(
125
+ DomainLookupMethod.Auto,
126
+ );
127
+ expect(MonitorStepDomainMonitorUtil.parseLookupMethod(null)).toBe(
128
+ DomainLookupMethod.Auto,
129
+ );
130
+ expect(MonitorStepDomainMonitorUtil.parseLookupMethod(undefined)).toBe(
131
+ DomainLookupMethod.Auto,
132
+ );
133
+ });
134
+ });
60
135
  });
@@ -0,0 +1,109 @@
1
+ import {
2
+ PodmanMetricCategory,
3
+ PodmanMetricDefinition,
4
+ getAllPodmanMetricCategories,
5
+ getAllPodmanMetrics,
6
+ getPodmanMetricById,
7
+ getPodmanMetricByMetricName,
8
+ getPodmanMetricsByCategory,
9
+ } from "../../../Types/Monitor/PodmanMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("PodmanMetricCatalog", () => {
14
+ const allMetrics: Array<PodmanMetricDefinition> = getAllPodmanMetrics();
15
+ const allCategories: Array<PodmanMetricCategory> =
16
+ getAllPodmanMetricCategories();
17
+ const validAggregations: Array<string> = Object.values(AggregationType);
18
+
19
+ test("returns a non-empty catalog", () => {
20
+ expect(Array.isArray(allMetrics)).toBe(true);
21
+ expect(allMetrics.length).toBeGreaterThan(0);
22
+ });
23
+
24
+ test("every metric definition has all required non-empty fields", () => {
25
+ for (const metric of allMetrics) {
26
+ expect(typeof metric.id).toBe("string");
27
+ expect(metric.id.length).toBeGreaterThan(0);
28
+ expect(metric.friendlyName.length).toBeGreaterThan(0);
29
+ expect(metric.description.length).toBeGreaterThan(0);
30
+ expect(metric.metricName.length).toBeGreaterThan(0);
31
+ expect(metric.category.length).toBeGreaterThan(0);
32
+ }
33
+ });
34
+
35
+ test("every metric uses a valid aggregation type", () => {
36
+ for (const metric of allMetrics) {
37
+ expect(validAggregations).toContain(metric.defaultAggregation);
38
+ }
39
+ });
40
+
41
+ test("metric ids are unique", () => {
42
+ const ids: Array<string> = allMetrics.map((m: PodmanMetricDefinition) => {
43
+ return m.id;
44
+ });
45
+ expect(new Set(ids).size).toBe(ids.length);
46
+ });
47
+
48
+ test("metric names are unique", () => {
49
+ const names: Array<string> = allMetrics.map((m: PodmanMetricDefinition) => {
50
+ return m.metricName;
51
+ });
52
+ expect(new Set(names).size).toBe(names.length);
53
+ });
54
+
55
+ test("every metric category is a declared category", () => {
56
+ for (const metric of allMetrics) {
57
+ expect(allCategories).toContain(metric.category);
58
+ }
59
+ });
60
+
61
+ test("declared categories are unique and non-empty", () => {
62
+ expect(allCategories.length).toBeGreaterThan(0);
63
+ expect(new Set(allCategories).size).toBe(allCategories.length);
64
+ });
65
+
66
+ test("every declared category has at least one metric", () => {
67
+ for (const category of allCategories) {
68
+ expect(getPodmanMetricsByCategory(category).length).toBeGreaterThan(0);
69
+ }
70
+ });
71
+
72
+ test("getPodmanMetricsByCategory returns only metrics of that category", () => {
73
+ for (const category of allCategories) {
74
+ for (const metric of getPodmanMetricsByCategory(category)) {
75
+ expect(metric.category).toBe(category);
76
+ }
77
+ }
78
+ });
79
+
80
+ test("getPodmanMetricById round-trips every metric", () => {
81
+ for (const metric of allMetrics) {
82
+ expect(getPodmanMetricById(metric.id)).toEqual(metric);
83
+ }
84
+ });
85
+
86
+ test("getPodmanMetricById returns undefined for an unknown id", () => {
87
+ expect(getPodmanMetricById("does-not-exist")).toBeUndefined();
88
+ expect(getPodmanMetricById("")).toBeUndefined();
89
+ });
90
+
91
+ test("getPodmanMetricByMetricName round-trips every metric", () => {
92
+ for (const metric of allMetrics) {
93
+ expect(getPodmanMetricByMetricName(metric.metricName)).toEqual(metric);
94
+ }
95
+ });
96
+
97
+ test("getPodmanMetricByMetricName returns undefined for an unknown name", () => {
98
+ expect(getPodmanMetricByMetricName("nope.nope.nope")).toBeUndefined();
99
+ });
100
+
101
+ test("known metrics are present", () => {
102
+ expect(
103
+ getPodmanMetricByMetricName("container.cpu.usage.total"),
104
+ ).toBeDefined();
105
+ expect(
106
+ getPodmanMetricByMetricName("container.cpu.utilization"),
107
+ ).toBeDefined();
108
+ });
109
+ });
@@ -0,0 +1,107 @@
1
+ import {
2
+ ProxmoxMetricCategory,
3
+ ProxmoxMetricDefinition,
4
+ getAllProxmoxMetricCategories,
5
+ getAllProxmoxMetrics,
6
+ getProxmoxMetricById,
7
+ getProxmoxMetricByMetricName,
8
+ getProxmoxMetricsByCategory,
9
+ } from "../../../Types/Monitor/ProxmoxMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("ProxmoxMetricCatalog", () => {
14
+ const allMetrics: Array<ProxmoxMetricDefinition> = getAllProxmoxMetrics();
15
+ const allCategories: Array<ProxmoxMetricCategory> =
16
+ getAllProxmoxMetricCategories();
17
+ const validAggregations: Array<string> = Object.values(AggregationType);
18
+
19
+ test("returns a non-empty catalog", () => {
20
+ expect(Array.isArray(allMetrics)).toBe(true);
21
+ expect(allMetrics.length).toBeGreaterThan(0);
22
+ });
23
+
24
+ test("every metric definition has all required non-empty fields", () => {
25
+ for (const metric of allMetrics) {
26
+ expect(typeof metric.id).toBe("string");
27
+ expect(metric.id.length).toBeGreaterThan(0);
28
+ expect(metric.friendlyName.length).toBeGreaterThan(0);
29
+ expect(metric.description.length).toBeGreaterThan(0);
30
+ expect(metric.metricName.length).toBeGreaterThan(0);
31
+ expect(metric.category.length).toBeGreaterThan(0);
32
+ }
33
+ });
34
+
35
+ test("every metric uses a valid aggregation type", () => {
36
+ for (const metric of allMetrics) {
37
+ expect(validAggregations).toContain(metric.defaultAggregation);
38
+ }
39
+ });
40
+
41
+ test("metric ids are unique", () => {
42
+ const ids: Array<string> = allMetrics.map((m: ProxmoxMetricDefinition) => {
43
+ return m.id;
44
+ });
45
+ expect(new Set(ids).size).toBe(ids.length);
46
+ });
47
+
48
+ test("metric names are unique", () => {
49
+ const names: Array<string> = allMetrics.map(
50
+ (m: ProxmoxMetricDefinition) => {
51
+ return m.metricName;
52
+ },
53
+ );
54
+ expect(new Set(names).size).toBe(names.length);
55
+ });
56
+
57
+ test("every metric category is a declared category", () => {
58
+ for (const metric of allMetrics) {
59
+ expect(allCategories).toContain(metric.category);
60
+ }
61
+ });
62
+
63
+ test("declared categories are unique and non-empty", () => {
64
+ expect(allCategories.length).toBeGreaterThan(0);
65
+ expect(new Set(allCategories).size).toBe(allCategories.length);
66
+ });
67
+
68
+ test("every declared category has at least one metric", () => {
69
+ for (const category of allCategories) {
70
+ expect(getProxmoxMetricsByCategory(category).length).toBeGreaterThan(0);
71
+ }
72
+ });
73
+
74
+ test("getProxmoxMetricsByCategory returns only metrics of that category", () => {
75
+ for (const category of allCategories) {
76
+ for (const metric of getProxmoxMetricsByCategory(category)) {
77
+ expect(metric.category).toBe(category);
78
+ }
79
+ }
80
+ });
81
+
82
+ test("getProxmoxMetricById round-trips every metric", () => {
83
+ for (const metric of allMetrics) {
84
+ expect(getProxmoxMetricById(metric.id)).toEqual(metric);
85
+ }
86
+ });
87
+
88
+ test("getProxmoxMetricById returns undefined for an unknown id", () => {
89
+ expect(getProxmoxMetricById("does-not-exist")).toBeUndefined();
90
+ expect(getProxmoxMetricById("")).toBeUndefined();
91
+ });
92
+
93
+ test("getProxmoxMetricByMetricName round-trips every metric", () => {
94
+ for (const metric of allMetrics) {
95
+ expect(getProxmoxMetricByMetricName(metric.metricName)).toEqual(metric);
96
+ }
97
+ });
98
+
99
+ test("getProxmoxMetricByMetricName returns undefined for an unknown name", () => {
100
+ expect(getProxmoxMetricByMetricName("nope.nope.nope")).toBeUndefined();
101
+ });
102
+
103
+ test("known metrics are present", () => {
104
+ expect(getProxmoxMetricByMetricName("pve_up")).toBeDefined();
105
+ expect(getProxmoxMetricByMetricName("pve_uptime_seconds")).toBeDefined();
106
+ });
107
+ });