@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,111 @@
1
+ import {
2
+ DashboardTemplate,
3
+ DashboardTemplateCategories,
4
+ DashboardTemplateCategory,
5
+ DashboardTemplateType,
6
+ DashboardTemplates,
7
+ getDashboardTemplatesByCategory,
8
+ getTemplateConfig,
9
+ } from "../../../Types/Dashboard/DashboardTemplates";
10
+ import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
11
+ import { ObjectType } from "../../../Types/JSON";
12
+ import { describe, expect, test } from "@jest/globals";
13
+
14
+ describe("DashboardTemplates", () => {
15
+ test("exposes a non-empty template list", () => {
16
+ expect(Array.isArray(DashboardTemplates)).toBe(true);
17
+ expect(DashboardTemplates.length).toBeGreaterThan(0);
18
+ });
19
+
20
+ test("every template has all required non-empty fields", () => {
21
+ for (const template of DashboardTemplates) {
22
+ expect(template.name.length).toBeGreaterThan(0);
23
+ expect(template.description.length).toBeGreaterThan(0);
24
+ expect(template.icon.length).toBeGreaterThan(0);
25
+ expect(Object.values(DashboardTemplateType).includes(template.type)).toBe(
26
+ true,
27
+ );
28
+ expect(
29
+ Object.values(DashboardTemplateCategory).includes(template.category),
30
+ ).toBe(true);
31
+ }
32
+ });
33
+
34
+ test("template types are unique", () => {
35
+ const types: Array<DashboardTemplateType> = DashboardTemplates.map(
36
+ (t: DashboardTemplate) => {
37
+ return t.type;
38
+ },
39
+ );
40
+ expect(new Set(types).size).toBe(types.length);
41
+ });
42
+
43
+ test("every template category is one of the declared categories", () => {
44
+ for (const template of DashboardTemplates) {
45
+ expect(DashboardTemplateCategories).toContain(template.category);
46
+ }
47
+ });
48
+
49
+ test("declared categories are unique", () => {
50
+ expect(new Set(DashboardTemplateCategories).size).toBe(
51
+ DashboardTemplateCategories.length,
52
+ );
53
+ });
54
+
55
+ describe("getDashboardTemplatesByCategory", () => {
56
+ test("returns only templates of the requested category", () => {
57
+ for (const category of DashboardTemplateCategories) {
58
+ for (const template of getDashboardTemplatesByCategory(category)) {
59
+ expect(template.category).toBe(category);
60
+ }
61
+ }
62
+ });
63
+
64
+ test("every declared category has at least one template", () => {
65
+ for (const category of DashboardTemplateCategories) {
66
+ expect(
67
+ getDashboardTemplatesByCategory(category).length,
68
+ ).toBeGreaterThan(0);
69
+ }
70
+ });
71
+
72
+ test("categories partition the full template list", () => {
73
+ const totalByCategory: number = DashboardTemplateCategories.reduce(
74
+ (sum: number, category: DashboardTemplateCategory) => {
75
+ return sum + getDashboardTemplatesByCategory(category).length;
76
+ },
77
+ 0,
78
+ );
79
+ expect(totalByCategory).toBe(DashboardTemplates.length);
80
+ });
81
+ });
82
+
83
+ describe("getTemplateConfig", () => {
84
+ test("returns null for the Blank template", () => {
85
+ expect(getTemplateConfig(DashboardTemplateType.Blank)).toBeNull();
86
+ });
87
+
88
+ test("returns a well-formed config for every non-Blank type", () => {
89
+ for (const type of Object.values(DashboardTemplateType)) {
90
+ if (type === DashboardTemplateType.Blank) {
91
+ continue;
92
+ }
93
+ const config: DashboardViewConfig | null = getTemplateConfig(type);
94
+ expect(config).not.toBeNull();
95
+ expect(config!._type).toBe(ObjectType.DashboardViewConfig);
96
+ expect(Array.isArray(config!.components)).toBe(true);
97
+ expect(config!.components.length).toBeGreaterThan(0);
98
+ expect(typeof config!.heightInDashboardUnits).toBe("number");
99
+ expect(config!.heightInDashboardUnits).toBeGreaterThan(0);
100
+ }
101
+ });
102
+
103
+ test("handles every enum value without throwing", () => {
104
+ for (const type of Object.values(DashboardTemplateType)) {
105
+ expect(() => {
106
+ return getTemplateConfig(type);
107
+ }).not.toThrow();
108
+ }
109
+ });
110
+ });
111
+ });
@@ -0,0 +1,104 @@
1
+ import {
2
+ CephMetricCategory,
3
+ CephMetricDefinition,
4
+ getAllCephMetricCategories,
5
+ getAllCephMetrics,
6
+ getCephMetricById,
7
+ getCephMetricByMetricName,
8
+ getCephMetricsByCategory,
9
+ } from "../../../Types/Monitor/CephMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("CephMetricCatalog", () => {
14
+ const allMetrics: Array<CephMetricDefinition> = getAllCephMetrics();
15
+ const allCategories: Array<CephMetricCategory> = getAllCephMetricCategories();
16
+ const validAggregations: Array<string> = Object.values(AggregationType);
17
+
18
+ test("returns a non-empty catalog", () => {
19
+ expect(Array.isArray(allMetrics)).toBe(true);
20
+ expect(allMetrics.length).toBeGreaterThan(0);
21
+ });
22
+
23
+ test("every metric definition has all required non-empty fields", () => {
24
+ for (const metric of allMetrics) {
25
+ expect(typeof metric.id).toBe("string");
26
+ expect(metric.id.length).toBeGreaterThan(0);
27
+ expect(metric.friendlyName.length).toBeGreaterThan(0);
28
+ expect(metric.description.length).toBeGreaterThan(0);
29
+ expect(metric.metricName.length).toBeGreaterThan(0);
30
+ expect(metric.category.length).toBeGreaterThan(0);
31
+ }
32
+ });
33
+
34
+ test("every metric uses a valid aggregation type", () => {
35
+ for (const metric of allMetrics) {
36
+ expect(validAggregations).toContain(metric.defaultAggregation);
37
+ }
38
+ });
39
+
40
+ test("metric ids are unique", () => {
41
+ const ids: Array<string> = allMetrics.map((m: CephMetricDefinition) => {
42
+ return m.id;
43
+ });
44
+ expect(new Set(ids).size).toBe(ids.length);
45
+ });
46
+
47
+ test("metric names are unique", () => {
48
+ const names: Array<string> = allMetrics.map((m: CephMetricDefinition) => {
49
+ return m.metricName;
50
+ });
51
+ expect(new Set(names).size).toBe(names.length);
52
+ });
53
+
54
+ test("every metric category is a declared category", () => {
55
+ for (const metric of allMetrics) {
56
+ expect(allCategories).toContain(metric.category);
57
+ }
58
+ });
59
+
60
+ test("declared categories are unique and non-empty", () => {
61
+ expect(allCategories.length).toBeGreaterThan(0);
62
+ expect(new Set(allCategories).size).toBe(allCategories.length);
63
+ });
64
+
65
+ test("every declared category has at least one metric", () => {
66
+ for (const category of allCategories) {
67
+ expect(getCephMetricsByCategory(category).length).toBeGreaterThan(0);
68
+ }
69
+ });
70
+
71
+ test("getCephMetricsByCategory returns only metrics of that category", () => {
72
+ for (const category of allCategories) {
73
+ for (const metric of getCephMetricsByCategory(category)) {
74
+ expect(metric.category).toBe(category);
75
+ }
76
+ }
77
+ });
78
+
79
+ test("getCephMetricById round-trips every metric", () => {
80
+ for (const metric of allMetrics) {
81
+ expect(getCephMetricById(metric.id)).toEqual(metric);
82
+ }
83
+ });
84
+
85
+ test("getCephMetricById returns undefined for an unknown id", () => {
86
+ expect(getCephMetricById("does-not-exist")).toBeUndefined();
87
+ expect(getCephMetricById("")).toBeUndefined();
88
+ });
89
+
90
+ test("getCephMetricByMetricName round-trips every metric", () => {
91
+ for (const metric of allMetrics) {
92
+ expect(getCephMetricByMetricName(metric.metricName)).toEqual(metric);
93
+ }
94
+ });
95
+
96
+ test("getCephMetricByMetricName returns undefined for an unknown name", () => {
97
+ expect(getCephMetricByMetricName("nope.nope.nope")).toBeUndefined();
98
+ });
99
+
100
+ test("known metrics are present", () => {
101
+ expect(getCephMetricByMetricName("ceph_health_status")).toBeDefined();
102
+ expect(getCephMetricByMetricName("ceph_health_detail")).toBeDefined();
103
+ });
104
+ });
@@ -270,6 +270,8 @@ describe("CriteriaFilterUtil", () => {
270
270
  test.each([
271
271
  CheckOn.ResponseStatusCode,
272
272
  CheckOn.ResponseTime,
273
+ CheckOn.PortDnsLookupTime,
274
+ CheckOn.PortTcpConnectTime,
273
275
  CheckOn.CPUUsagePercent,
274
276
  CheckOn.MemoryUsagePercent,
275
277
  CheckOn.IsOnline,
@@ -290,6 +292,8 @@ describe("CriteriaFilterUtil", () => {
290
292
  test.each([
291
293
  CheckOn.ResponseStatusCode,
292
294
  CheckOn.ResponseTime,
295
+ CheckOn.PortDnsLookupTime,
296
+ CheckOn.PortTcpConnectTime,
293
297
  CheckOn.DiskUsagePercent,
294
298
  CheckOn.CPUUsagePercent,
295
299
  CheckOn.MemoryUsagePercent,
@@ -0,0 +1,109 @@
1
+ import {
2
+ DockerMetricCategory,
3
+ DockerMetricDefinition,
4
+ getAllDockerMetricCategories,
5
+ getAllDockerMetrics,
6
+ getDockerMetricById,
7
+ getDockerMetricByMetricName,
8
+ getDockerMetricsByCategory,
9
+ } from "../../../Types/Monitor/DockerMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("DockerMetricCatalog", () => {
14
+ const allMetrics: Array<DockerMetricDefinition> = getAllDockerMetrics();
15
+ const allCategories: Array<DockerMetricCategory> =
16
+ getAllDockerMetricCategories();
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: DockerMetricDefinition) => {
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: DockerMetricDefinition) => {
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(getDockerMetricsByCategory(category).length).toBeGreaterThan(0);
69
+ }
70
+ });
71
+
72
+ test("getDockerMetricsByCategory returns only metrics of that category", () => {
73
+ for (const category of allCategories) {
74
+ for (const metric of getDockerMetricsByCategory(category)) {
75
+ expect(metric.category).toBe(category);
76
+ }
77
+ }
78
+ });
79
+
80
+ test("getDockerMetricById round-trips every metric", () => {
81
+ for (const metric of allMetrics) {
82
+ expect(getDockerMetricById(metric.id)).toEqual(metric);
83
+ }
84
+ });
85
+
86
+ test("getDockerMetricById returns undefined for an unknown id", () => {
87
+ expect(getDockerMetricById("does-not-exist")).toBeUndefined();
88
+ expect(getDockerMetricById("")).toBeUndefined();
89
+ });
90
+
91
+ test("getDockerMetricByMetricName round-trips every metric", () => {
92
+ for (const metric of allMetrics) {
93
+ expect(getDockerMetricByMetricName(metric.metricName)).toEqual(metric);
94
+ }
95
+ });
96
+
97
+ test("getDockerMetricByMetricName returns undefined for an unknown name", () => {
98
+ expect(getDockerMetricByMetricName("nope.nope.nope")).toBeUndefined();
99
+ });
100
+
101
+ test("known metrics are present", () => {
102
+ expect(
103
+ getDockerMetricByMetricName("container.cpu.usage.total"),
104
+ ).toBeDefined();
105
+ expect(
106
+ getDockerMetricByMetricName("container.cpu.utilization"),
107
+ ).toBeDefined();
108
+ });
109
+ });
@@ -0,0 +1,118 @@
1
+ import {
2
+ DockerSwarmMetricCategory,
3
+ DockerSwarmMetricDefinition,
4
+ getAllDockerSwarmMetricCategories,
5
+ getAllDockerSwarmMetrics,
6
+ getDockerSwarmMetricById,
7
+ getDockerSwarmMetricByMetricName,
8
+ getDockerSwarmMetricsByCategory,
9
+ } from "../../../Types/Monitor/DockerSwarmMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("DockerSwarmMetricCatalog", () => {
14
+ const allMetrics: Array<DockerSwarmMetricDefinition> =
15
+ getAllDockerSwarmMetrics();
16
+ const allCategories: Array<DockerSwarmMetricCategory> =
17
+ getAllDockerSwarmMetricCategories();
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: DockerSwarmMetricDefinition) => {
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: DockerSwarmMetricDefinition) => {
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(getDockerSwarmMetricsByCategory(category).length).toBeGreaterThan(
74
+ 0,
75
+ );
76
+ }
77
+ });
78
+
79
+ test("getDockerSwarmMetricsByCategory returns only metrics of that category", () => {
80
+ for (const category of allCategories) {
81
+ for (const metric of getDockerSwarmMetricsByCategory(category)) {
82
+ expect(metric.category).toBe(category);
83
+ }
84
+ }
85
+ });
86
+
87
+ test("getDockerSwarmMetricById round-trips every metric", () => {
88
+ for (const metric of allMetrics) {
89
+ expect(getDockerSwarmMetricById(metric.id)).toEqual(metric);
90
+ }
91
+ });
92
+
93
+ test("getDockerSwarmMetricById returns undefined for an unknown id", () => {
94
+ expect(getDockerSwarmMetricById("does-not-exist")).toBeUndefined();
95
+ expect(getDockerSwarmMetricById("")).toBeUndefined();
96
+ });
97
+
98
+ test("getDockerSwarmMetricByMetricName round-trips every metric", () => {
99
+ for (const metric of allMetrics) {
100
+ expect(getDockerSwarmMetricByMetricName(metric.metricName)).toEqual(
101
+ metric,
102
+ );
103
+ }
104
+ });
105
+
106
+ test("getDockerSwarmMetricByMetricName returns undefined for an unknown name", () => {
107
+ expect(getDockerSwarmMetricByMetricName("nope.nope.nope")).toBeUndefined();
108
+ });
109
+
110
+ test("known metrics are present", () => {
111
+ expect(
112
+ getDockerSwarmMetricByMetricName("container.cpu.utilization"),
113
+ ).toBeDefined();
114
+ expect(
115
+ getDockerSwarmMetricByMetricName("container.memory.usage.total"),
116
+ ).toBeDefined();
117
+ });
118
+ });
@@ -0,0 +1,104 @@
1
+ import {
2
+ HostMetricCategory,
3
+ HostMetricDefinition,
4
+ getAllHostMetricCategories,
5
+ getAllHostMetrics,
6
+ getHostMetricById,
7
+ getHostMetricByMetricName,
8
+ getHostMetricsByCategory,
9
+ } from "../../../Types/Monitor/HostMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("HostMetricCatalog", () => {
14
+ const allMetrics: Array<HostMetricDefinition> = getAllHostMetrics();
15
+ const allCategories: Array<HostMetricCategory> = getAllHostMetricCategories();
16
+ const validAggregations: Array<string> = Object.values(AggregationType);
17
+
18
+ test("returns a non-empty catalog", () => {
19
+ expect(Array.isArray(allMetrics)).toBe(true);
20
+ expect(allMetrics.length).toBeGreaterThan(0);
21
+ });
22
+
23
+ test("every metric definition has all required non-empty fields", () => {
24
+ for (const metric of allMetrics) {
25
+ expect(typeof metric.id).toBe("string");
26
+ expect(metric.id.length).toBeGreaterThan(0);
27
+ expect(metric.friendlyName.length).toBeGreaterThan(0);
28
+ expect(metric.description.length).toBeGreaterThan(0);
29
+ expect(metric.metricName.length).toBeGreaterThan(0);
30
+ expect(metric.category.length).toBeGreaterThan(0);
31
+ }
32
+ });
33
+
34
+ test("every metric uses a valid aggregation type", () => {
35
+ for (const metric of allMetrics) {
36
+ expect(validAggregations).toContain(metric.defaultAggregation);
37
+ }
38
+ });
39
+
40
+ test("metric ids are unique", () => {
41
+ const ids: Array<string> = allMetrics.map((m: HostMetricDefinition) => {
42
+ return m.id;
43
+ });
44
+ expect(new Set(ids).size).toBe(ids.length);
45
+ });
46
+
47
+ test("metric names are unique", () => {
48
+ const names: Array<string> = allMetrics.map((m: HostMetricDefinition) => {
49
+ return m.metricName;
50
+ });
51
+ expect(new Set(names).size).toBe(names.length);
52
+ });
53
+
54
+ test("every metric category is a declared category", () => {
55
+ for (const metric of allMetrics) {
56
+ expect(allCategories).toContain(metric.category);
57
+ }
58
+ });
59
+
60
+ test("declared categories are unique and non-empty", () => {
61
+ expect(allCategories.length).toBeGreaterThan(0);
62
+ expect(new Set(allCategories).size).toBe(allCategories.length);
63
+ });
64
+
65
+ test("every declared category has at least one metric", () => {
66
+ for (const category of allCategories) {
67
+ expect(getHostMetricsByCategory(category).length).toBeGreaterThan(0);
68
+ }
69
+ });
70
+
71
+ test("getHostMetricsByCategory returns only metrics of that category", () => {
72
+ for (const category of allCategories) {
73
+ for (const metric of getHostMetricsByCategory(category)) {
74
+ expect(metric.category).toBe(category);
75
+ }
76
+ }
77
+ });
78
+
79
+ test("getHostMetricById round-trips every metric", () => {
80
+ for (const metric of allMetrics) {
81
+ expect(getHostMetricById(metric.id)).toEqual(metric);
82
+ }
83
+ });
84
+
85
+ test("getHostMetricById returns undefined for an unknown id", () => {
86
+ expect(getHostMetricById("does-not-exist")).toBeUndefined();
87
+ expect(getHostMetricById("")).toBeUndefined();
88
+ });
89
+
90
+ test("getHostMetricByMetricName round-trips every metric", () => {
91
+ for (const metric of allMetrics) {
92
+ expect(getHostMetricByMetricName(metric.metricName)).toEqual(metric);
93
+ }
94
+ });
95
+
96
+ test("getHostMetricByMetricName returns undefined for an unknown name", () => {
97
+ expect(getHostMetricByMetricName("nope.nope")).toBeUndefined();
98
+ });
99
+
100
+ test("known host metrics are present", () => {
101
+ expect(getHostMetricByMetricName("system.cpu.utilization")).toBeDefined();
102
+ expect(getHostMetricByMetricName("system.memory.usage")).toBeDefined();
103
+ });
104
+ });
@@ -0,0 +1,104 @@
1
+ import {
2
+ IoTMetricCategory,
3
+ IoTMetricDefinition,
4
+ getAllIoTMetricCategories,
5
+ getAllIoTMetrics,
6
+ getIoTMetricById,
7
+ getIoTMetricByMetricName,
8
+ getIoTMetricsByCategory,
9
+ } from "../../../Types/Monitor/IotMetricCatalog";
10
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
11
+ import { describe, expect, test } from "@jest/globals";
12
+
13
+ describe("IotMetricCatalog", () => {
14
+ const allMetrics: Array<IoTMetricDefinition> = getAllIoTMetrics();
15
+ const allCategories: Array<IoTMetricCategory> = getAllIoTMetricCategories();
16
+ const validAggregations: Array<string> = Object.values(AggregationType);
17
+
18
+ test("returns a non-empty catalog", () => {
19
+ expect(Array.isArray(allMetrics)).toBe(true);
20
+ expect(allMetrics.length).toBeGreaterThan(0);
21
+ });
22
+
23
+ test("every metric definition has all required non-empty fields", () => {
24
+ for (const metric of allMetrics) {
25
+ expect(typeof metric.id).toBe("string");
26
+ expect(metric.id.length).toBeGreaterThan(0);
27
+ expect(metric.friendlyName.length).toBeGreaterThan(0);
28
+ expect(metric.description.length).toBeGreaterThan(0);
29
+ expect(metric.metricName.length).toBeGreaterThan(0);
30
+ expect(metric.category.length).toBeGreaterThan(0);
31
+ }
32
+ });
33
+
34
+ test("every metric uses a valid aggregation type", () => {
35
+ for (const metric of allMetrics) {
36
+ expect(validAggregations).toContain(metric.defaultAggregation);
37
+ }
38
+ });
39
+
40
+ test("metric ids are unique", () => {
41
+ const ids: Array<string> = allMetrics.map((m: IoTMetricDefinition) => {
42
+ return m.id;
43
+ });
44
+ expect(new Set(ids).size).toBe(ids.length);
45
+ });
46
+
47
+ test("metric names are unique", () => {
48
+ const names: Array<string> = allMetrics.map((m: IoTMetricDefinition) => {
49
+ return m.metricName;
50
+ });
51
+ expect(new Set(names).size).toBe(names.length);
52
+ });
53
+
54
+ test("every metric category is a declared category", () => {
55
+ for (const metric of allMetrics) {
56
+ expect(allCategories).toContain(metric.category);
57
+ }
58
+ });
59
+
60
+ test("declared categories are unique and non-empty", () => {
61
+ expect(allCategories.length).toBeGreaterThan(0);
62
+ expect(new Set(allCategories).size).toBe(allCategories.length);
63
+ });
64
+
65
+ test("every declared category has at least one metric", () => {
66
+ for (const category of allCategories) {
67
+ expect(getIoTMetricsByCategory(category).length).toBeGreaterThan(0);
68
+ }
69
+ });
70
+
71
+ test("getIoTMetricsByCategory returns only metrics of that category", () => {
72
+ for (const category of allCategories) {
73
+ for (const metric of getIoTMetricsByCategory(category)) {
74
+ expect(metric.category).toBe(category);
75
+ }
76
+ }
77
+ });
78
+
79
+ test("getIoTMetricById round-trips every metric", () => {
80
+ for (const metric of allMetrics) {
81
+ expect(getIoTMetricById(metric.id)).toEqual(metric);
82
+ }
83
+ });
84
+
85
+ test("getIoTMetricById returns undefined for an unknown id", () => {
86
+ expect(getIoTMetricById("does-not-exist")).toBeUndefined();
87
+ expect(getIoTMetricById("")).toBeUndefined();
88
+ });
89
+
90
+ test("getIoTMetricByMetricName round-trips every metric", () => {
91
+ for (const metric of allMetrics) {
92
+ expect(getIoTMetricByMetricName(metric.metricName)).toEqual(metric);
93
+ }
94
+ });
95
+
96
+ test("getIoTMetricByMetricName returns undefined for an unknown name", () => {
97
+ expect(getIoTMetricByMetricName("nope.nope.nope")).toBeUndefined();
98
+ });
99
+
100
+ test("known metrics are present", () => {
101
+ expect(getIoTMetricByMetricName("iot_device_up")).toBeDefined();
102
+ expect(getIoTMetricByMetricName("iot_battery_percent")).toBeDefined();
103
+ });
104
+ });