@oneuptime/common 14.0.3 → 14.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 (617) hide show
  1. package/Models/DatabaseModels/Alert.ts +55 -0
  2. package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
  3. package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
  4. package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
  5. package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
  6. package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
  7. package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
  8. package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
  9. package/Models/DatabaseModels/Incident.ts +55 -0
  10. package/Models/DatabaseModels/Index.ts +16 -0
  11. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
  12. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  13. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  14. package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  18. package/Server/Middleware/MultipartFormData.ts +1 -1
  19. package/Server/Middleware/TelemetryIngest.ts +15 -8
  20. package/Server/Services/AlertReminderRuleService.ts +100 -24
  21. package/Server/Services/DatabaseServerEndpointService.ts +895 -0
  22. package/Server/Services/DatabaseServerFeedService.ts +128 -0
  23. package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
  24. package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
  25. package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
  26. package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
  27. package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
  28. package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
  29. package/Server/Services/DatabaseServerService.ts +4546 -0
  30. package/Server/Services/DatabaseService.ts +14 -8
  31. package/Server/Services/DockerResourceService.ts +43 -2
  32. package/Server/Services/IncidentReminderRuleService.ts +103 -23
  33. package/Server/Services/Index.ts +16 -0
  34. package/Server/Services/InventoryItemService.ts +113 -5
  35. package/Server/Services/IoTDeviceService.ts +145 -37
  36. package/Server/Services/OpenTelemetryIngestService.ts +19 -0
  37. package/Server/Services/PodmanResourceService.ts +43 -2
  38. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
  39. package/Server/Services/ServiceService.ts +1 -1
  40. package/Server/Services/TelemetryUsageBillingService.ts +29 -2
  41. package/Server/Services/UserProjectSsoConsentService.ts +74 -0
  42. package/Server/Services/UserService.ts +14 -1
  43. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
  44. package/Server/Types/Database/QueryHelper.ts +30 -1
  45. package/Server/Utils/AI/Toolbox/ResourceTools.ts +69 -1
  46. package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
  47. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +188 -6
  48. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  49. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2262 -755
  50. package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
  51. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
  52. package/Server/Utils/Monitor/MonitorResource.ts +47 -11
  53. package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
  54. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
  55. package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
  56. package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
  57. package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
  58. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  59. package/Server/Utils/StartServer.ts +26 -6
  60. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  61. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
  62. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
  63. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
  64. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
  65. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
  66. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
  67. package/Server/Utils/Telemetry/Telemetry.ts +16 -0
  68. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
  69. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
  70. package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
  71. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
  72. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
  73. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
  74. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
  75. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
  76. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
  77. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
  78. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
  79. package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
  80. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
  81. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
  82. package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
  83. package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
  84. package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
  85. package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
  86. package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
  87. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
  88. package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
  89. package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
  90. package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
  91. package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
  92. package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
  93. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
  94. package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
  95. package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
  96. package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
  97. package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
  98. package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
  99. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
  100. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
  101. package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
  102. package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
  103. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
  104. package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
  105. package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
  106. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
  107. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
  108. package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
  109. package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
  110. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
  111. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
  112. package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
  113. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
  114. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
  115. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  116. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
  117. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
  118. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
  119. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
  120. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
  121. package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
  122. package/Tests/ClassStrings.ts +178 -0
  123. package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
  124. package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
  125. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
  126. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
  127. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  128. package/Tests/RenderedMarkup.ts +518 -0
  129. package/Tests/ResponsiveVisibility.test.ts +490 -4
  130. package/Tests/ResponsiveVisibility.ts +505 -52
  131. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
  133. package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
  134. package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
  135. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
  136. package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
  137. package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
  138. package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
  139. package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
  140. package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
  141. package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
  142. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
  143. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
  144. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
  145. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
  146. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
  147. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
  148. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
  149. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
  150. package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
  151. package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
  152. package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
  153. package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
  154. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  155. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
  156. package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
  157. package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
  158. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
  159. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  160. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
  161. package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
  162. package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
  163. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
  164. package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
  165. package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
  166. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
  167. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
  168. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
  169. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
  170. package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
  171. package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
  172. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
  175. package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
  176. package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
  177. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
  178. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
  179. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
  180. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
  181. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1719 -0
  182. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
  183. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
  184. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
  185. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
  186. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
  187. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  188. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
  189. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
  190. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
  191. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
  192. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
  193. package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
  194. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
  195. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  196. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
  197. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  198. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
  199. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
  200. package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
  201. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
  202. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
  203. package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
  204. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
  205. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
  206. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
  207. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
  208. package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
  209. package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
  210. package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
  211. package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
  212. package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
  213. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
  214. package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
  215. package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
  216. package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
  217. package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
  218. package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
  219. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
  220. package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
  221. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +298 -0
  222. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +271 -0
  223. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
  224. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
  225. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
  226. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
  227. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
  228. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
  229. package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +181 -0
  230. package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
  231. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
  232. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
  233. package/Tests/UI/Components/Card.test.tsx +93 -2
  234. package/Tests/UI/Components/FeedOptions.test.ts +6 -0
  235. package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
  236. package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
  237. package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
  238. package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
  239. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
  240. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
  241. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  242. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
  243. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
  244. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
  245. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
  246. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
  247. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
  248. package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
  249. package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
  250. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
  251. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
  252. package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
  253. package/Tests/UI/Utils/Navigation.test.ts +102 -0
  254. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
  255. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  256. package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
  257. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
  258. package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
  259. package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
  260. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
  261. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
  262. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
  263. package/Tests/Utils/ValueFormatter.test.ts +50 -0
  264. package/Tests/tsconfig.json +16 -0
  265. package/Types/AI/AIResourceContext.ts +7 -0
  266. package/Types/Dashboard/DashboardTemplates.ts +2 -1
  267. package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
  268. package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
  269. package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
  270. package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
  271. package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
  272. package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
  273. package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
  274. package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
  275. package/Types/Email/EmailTemplateType.ts +1 -0
  276. package/Types/Monitor/CephAlertTemplates.ts +18 -0
  277. package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
  278. package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
  279. package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
  280. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
  281. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
  282. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
  283. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
  284. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
  285. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
  286. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
  287. package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
  288. package/Types/Permission.ts +267 -0
  289. package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
  290. package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
  291. package/Types/Rules/RuleRun.ts +12 -0
  292. package/Types/Telemetry/EntityType.ts +23 -0
  293. package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
  294. package/Types/Telemetry/ServiceType.ts +8 -0
  295. package/UI/Components/Banner/Banner.tsx +1 -1
  296. package/UI/Components/Card/Card.tsx +1 -1
  297. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
  298. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  299. package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
  300. package/UI/Components/Date/StartAndEndDate.tsx +5 -5
  301. package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
  302. package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
  303. package/UI/Components/Forms/BasicForm.tsx +1 -1
  304. package/UI/Components/Header/Header.tsx +1 -1
  305. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
  306. package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
  307. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
  308. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
  309. package/UI/Components/Modal/ModalFooter.tsx +1 -1
  310. package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
  311. package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
  312. package/UI/Components/Navbar/NavBar.tsx +9 -2
  313. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
  314. package/UI/Components/Page/Page.tsx +1 -1
  315. package/UI/Components/Pagination/Pagination.tsx +3 -3
  316. package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
  317. package/UI/Components/SideMenu/SideMenu.tsx +4 -1
  318. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
  319. package/UI/Components/StatusPage/ResourceList.tsx +6 -6
  320. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
  321. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
  322. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
  323. package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
  324. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  325. package/UI/Styles/Theme.css +8 -1
  326. package/UI/Utils/Navigation.ts +89 -42
  327. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
  328. package/UI/Utils/TelemetryService.ts +4 -3
  329. package/Utils/LabelRuleImportExport.ts +2 -0
  330. package/Utils/MetricUnitUtil.ts +103 -11
  331. package/Utils/Monitor/MetricValueFormatter.ts +66 -13
  332. package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
  333. package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
  334. package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
  335. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
  336. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
  337. package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
  338. package/Utils/Telemetry/EntityKey.ts +176 -0
  339. package/Utils/ValueFormatter.ts +16 -0
  340. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  341. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  342. package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
  343. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
  344. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
  345. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
  346. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
  347. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
  348. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
  349. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
  350. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
  351. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
  352. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
  353. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
  354. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
  355. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
  356. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  357. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  358. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  359. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  360. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  362. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
  366. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
  367. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
  368. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
  369. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
  370. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
  371. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  372. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  373. package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
  374. package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
  375. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  376. package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
  377. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  378. package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
  379. package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
  380. package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
  381. package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
  382. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
  383. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
  384. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
  385. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
  386. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
  387. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
  388. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
  389. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
  390. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
  391. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
  392. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
  393. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
  394. package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
  395. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
  396. package/build/dist/Server/Services/DatabaseService.js +8 -4
  397. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  398. package/build/dist/Server/Services/DockerResourceService.js +30 -3
  399. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  400. package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
  401. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  402. package/build/dist/Server/Services/Index.js +16 -0
  403. package/build/dist/Server/Services/Index.js.map +1 -1
  404. package/build/dist/Server/Services/InventoryItemService.js +88 -5
  405. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  406. package/build/dist/Server/Services/IoTDeviceService.js +111 -24
  407. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  408. package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
  409. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  410. package/build/dist/Server/Services/PodmanResourceService.js +30 -3
  411. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  412. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
  413. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  414. package/build/dist/Server/Services/ServiceService.js +1 -1
  415. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  416. package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
  417. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  418. package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
  419. package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
  420. package/build/dist/Server/Services/UserService.js +13 -1
  421. package/build/dist/Server/Services/UserService.js.map +1 -1
  422. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
  423. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  424. package/build/dist/Server/Types/Database/QueryHelper.js +26 -1
  425. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  426. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +46 -0
  427. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  428. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
  429. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +134 -13
  431. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
  435. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  437. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
  439. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
  441. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
  443. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
  445. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  446. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
  447. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
  448. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
  449. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  450. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
  451. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  452. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  453. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  454. package/build/dist/Server/Utils/StartServer.js +20 -4
  455. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  456. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  457. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  458. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
  459. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
  460. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
  461. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  462. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
  463. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  464. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
  465. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  466. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
  467. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  468. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
  469. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  470. package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
  471. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  472. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
  473. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  474. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
  475. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
  476. package/build/dist/Types/AI/AIResourceContext.js +7 -0
  477. package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
  478. package/build/dist/Types/Dashboard/DashboardTemplates.js +2 -1
  479. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  480. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
  481. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
  482. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
  483. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
  484. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
  485. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
  486. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
  487. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
  488. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
  489. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
  490. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
  491. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
  492. package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
  493. package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
  494. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
  495. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
  496. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  497. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  498. package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
  499. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  500. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
  501. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
  502. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
  503. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  504. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
  505. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  506. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
  507. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  508. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
  509. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  510. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
  511. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  512. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
  513. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
  514. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
  515. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  516. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
  517. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
  518. package/build/dist/Types/Permission.js +234 -0
  519. package/build/dist/Types/Permission.js.map +1 -1
  520. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
  521. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  522. package/build/dist/Types/Rules/RuleRun.js +4 -0
  523. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  524. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  525. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  526. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
  527. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
  528. package/build/dist/Types/Telemetry/ServiceType.js +8 -0
  529. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  530. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  531. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  532. package/build/dist/UI/Components/Card/Card.js +1 -1
  533. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  534. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
  535. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  536. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  537. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  538. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
  539. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  540. package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
  541. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  542. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
  543. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
  544. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
  545. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
  546. package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
  547. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  548. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  549. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  550. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
  551. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  552. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
  553. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  554. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  555. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  556. package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
  557. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  558. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
  559. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  560. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
  561. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  562. package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
  563. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  564. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  565. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  566. package/build/dist/UI/Components/Page/Page.js +1 -1
  567. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  568. package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
  569. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  570. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
  571. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
  572. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
  573. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  574. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
  575. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  576. package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
  577. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  578. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  579. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  580. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
  581. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  582. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
  583. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  584. package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
  585. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  586. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  587. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  588. package/build/dist/UI/Utils/Navigation.js +66 -33
  589. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  590. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
  591. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  592. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  593. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  594. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  595. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  596. package/build/dist/Utils/MetricUnitUtil.js +77 -13
  597. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  598. package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
  599. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
  600. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
  601. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
  602. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
  603. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
  604. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
  605. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
  606. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
  607. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  608. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
  609. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
  610. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
  611. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
  612. package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
  613. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  614. package/build/dist/Utils/ValueFormatter.js +15 -0
  615. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  616. package/package.json +1 -1
  617. package/tsconfig.tests.json +7 -5
@@ -8,6 +8,8 @@ import {
8
8
  buildRecommendationId,
9
9
  } from "../../../../Types/Monitor/Recommendation/MonitorRecommendationTypes";
10
10
  import MonitorType from "../../../../Types/Monitor/MonitorType";
11
+ import MonitorStep from "../../../../Types/Monitor/MonitorStep";
12
+ import ObjectID from "../../../../Types/ObjectID";
11
13
 
12
14
  import { getAllCephAlertTemplates } from "../../../../Types/Monitor/CephAlertTemplates";
13
15
  import { getAllDockerAlertTemplates } from "../../../../Types/Monitor/DockerAlertTemplates";
@@ -24,6 +26,22 @@ import {
24
26
  getLanguagesWithServiceAlertTemplates,
25
27
  getServiceAlertTemplates,
26
28
  } from "../../../../Types/Monitor/ServiceAlertTemplates";
29
+ import {
30
+ DatabaseAlertTemplate,
31
+ getAllDatabaseAlertTemplates,
32
+ getDatabaseAlertTemplates,
33
+ getDatabaseEnginesWithAlertTemplates,
34
+ } from "../../../../Types/Monitor/DatabaseAlertTemplates";
35
+
36
+ /*
37
+ * Resource types whose recommendation set is EMPTY without context, on
38
+ * purpose: a database with no known engine has no template that applies to
39
+ * it (every database template reads one engine receiver's metrics). Every
40
+ * other resource type has a non-empty context-free subset, and the tests
41
+ * below keep holding them to that.
42
+ */
43
+ const RESOURCE_TYPES_WITHOUT_CONTEXT_FREE_SUBSET: Array<MonitorRecommendationResourceType> =
44
+ [MonitorRecommendationResourceType.DatabaseServer];
27
45
 
28
46
  /*
29
47
  * The catalog is the seam between ten independently-maintained alert-template
@@ -69,7 +87,8 @@ interface ModuleExpectation {
69
87
  | "hostIdentifier"
70
88
  | "fleetIdentifier"
71
89
  | "rumApplicationId"
72
- | "serviceId";
90
+ | "serviceId"
91
+ | "databaseServerId";
73
92
  }
74
93
 
75
94
  const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
@@ -164,6 +183,18 @@ const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
164
183
  contextFreeTemplateCount: getServiceAlertTemplates(null).length,
165
184
  identifierFieldName: "serviceId",
166
185
  },
186
+ {
187
+ resourceType: MonitorRecommendationResourceType.DatabaseServer,
188
+ monitorTypes: [MonitorType.Metrics],
189
+ templateCount: getAllDatabaseAlertTemplates().length,
190
+ /*
191
+ * Zero, and deliberately so — see RESOURCE_TYPES_WITHOUT_CONTEXT_FREE_SUBSET.
192
+ * `getDatabaseAlertTemplates(null)` is the module's own answer to "what
193
+ * applies to a database whose engine is unknown".
194
+ */
195
+ contextFreeTemplateCount: getDatabaseAlertTemplates(null).length,
196
+ identifierFieldName: "databaseServerId",
197
+ },
167
198
  ];
168
199
 
169
200
  describe("MonitorRecommendationCatalog", () => {
@@ -215,7 +246,17 @@ describe("MonitorRecommendationCatalog", () => {
215
246
  );
216
247
 
217
248
  expect(expectation.templateCount).toBeGreaterThan(0);
218
- expect(expectation.contextFreeTemplateCount).toBeGreaterThan(0);
249
+
250
+ if (
251
+ RESOURCE_TYPES_WITHOUT_CONTEXT_FREE_SUBSET.includes(
252
+ expectation.resourceType,
253
+ )
254
+ ) {
255
+ expect(expectation.contextFreeTemplateCount).toBe(0);
256
+ } else {
257
+ expect(expectation.contextFreeTemplateCount).toBeGreaterThan(0);
258
+ }
259
+
219
260
  expect(recommendations.length).toBe(
220
261
  expectation.contextFreeTemplateCount,
221
262
  );
@@ -363,9 +404,22 @@ describe("MonitorRecommendationCatalog", () => {
363
404
  }
364
405
  });
365
406
 
407
+ /*
408
+ * Both run over EVERY recommendation a type can produce, not the
409
+ * context-free subset: a database has no context-free subset at all, and a
410
+ * service's is missing every runtime template — checking only that would
411
+ * leave exactly the engine- and runtime-specific half unchecked.
412
+ */
366
413
  it("stamps every recommendation with one of its definition's monitorTypes and its resourceType", () => {
367
414
  for (const definition of MonitorRecommendationCatalog.getResourceTypeDefinitions()) {
368
- for (const recommendation of definition.getRecommendations()) {
415
+ const recommendations: Array<MonitorRecommendation> =
416
+ MonitorRecommendationCatalog.getAllPossibleRecommendations(
417
+ definition.resourceType,
418
+ );
419
+
420
+ expect(recommendations.length).toBeGreaterThan(0);
421
+
422
+ for (const recommendation of recommendations) {
369
423
  expect(definition.monitorTypes).toContain(recommendation.monitorType);
370
424
  expect(recommendation.resourceType).toBe(definition.resourceType);
371
425
  }
@@ -376,11 +430,11 @@ describe("MonitorRecommendationCatalog", () => {
376
430
  for (const definition of MonitorRecommendationCatalog.getResourceTypeDefinitions()) {
377
431
  const usedTypes: Array<MonitorType> = Array.from(
378
432
  new Set(
379
- definition
380
- .getRecommendations()
381
- .map((recommendation: MonitorRecommendation) => {
382
- return recommendation.monitorType;
383
- }),
433
+ MonitorRecommendationCatalog.getAllPossibleRecommendations(
434
+ definition.resourceType,
435
+ ).map((recommendation: MonitorRecommendation) => {
436
+ return recommendation.monitorType;
437
+ }),
384
438
  ),
385
439
  );
386
440
 
@@ -549,7 +603,10 @@ describe("MonitorRecommendationCatalog", () => {
549
603
  for (const resourceType of Object.values(
550
604
  MonitorRecommendationResourceType,
551
605
  )) {
552
- if (resourceType === MonitorRecommendationResourceType.Service) {
606
+ if (
607
+ resourceType === MonitorRecommendationResourceType.Service ||
608
+ resourceType === MonitorRecommendationResourceType.DatabaseServer
609
+ ) {
553
610
  continue;
554
611
  }
555
612
 
@@ -662,4 +719,191 @@ describe("MonitorRecommendationCatalog", () => {
662
719
  }
663
720
  });
664
721
  });
722
+
723
+ /*
724
+ * Databases: the second context-dependent resource type, and the first
725
+ * whose context-free set is empty. The failure modes mirror Service's —
726
+ * a PostgreSQL monitor offered to a Redis server — plus one of their own:
727
+ * a monitor offered to a database whose engine metrics never arrive, which
728
+ * either never fires or (Engine Metrics Stopped) fires the moment it is
729
+ * created.
730
+ */
731
+ describe("database recommendations", () => {
732
+ function databaseRecommendationIds(
733
+ context?: MonitorRecommendationContext | undefined,
734
+ ): Array<string> {
735
+ return MonitorRecommendationCatalog.getRecommendations(
736
+ MonitorRecommendationResourceType.DatabaseServer,
737
+ context,
738
+ ).map((recommendation: MonitorRecommendation) => {
739
+ return recommendation.recommendationId;
740
+ });
741
+ }
742
+
743
+ function templateIdsFor(engine: string): Array<string> {
744
+ return getDatabaseAlertTemplates(engine).map(
745
+ (template: DatabaseAlertTemplate) => {
746
+ return buildRecommendationId(
747
+ MonitorRecommendationResourceType.DatabaseServer,
748
+ template.id,
749
+ );
750
+ },
751
+ );
752
+ }
753
+
754
+ it("offers nothing when the engine is not known", () => {
755
+ expect(databaseRecommendationIds()).toEqual([]);
756
+ expect(databaseRecommendationIds({})).toEqual([]);
757
+ expect(databaseRecommendationIds({ databaseEngine: null })).toEqual([]);
758
+ expect(databaseRecommendationIds({ databaseEngine: "" })).toEqual([]);
759
+ expect(
760
+ databaseRecommendationIds({ databaseEngineMetricsReported: true }),
761
+ ).toEqual([]);
762
+ });
763
+
764
+ it("offers exactly the engine's templates, in the module's order", () => {
765
+ for (const engine of getDatabaseEnginesWithAlertTemplates()) {
766
+ expect(
767
+ databaseRecommendationIds({
768
+ databaseEngine: engine,
769
+ databaseEngineMetricsReported: true,
770
+ }),
771
+ ).toEqual(templateIdsFor(engine));
772
+ }
773
+ });
774
+
775
+ it("withholds everything from a database whose engine metrics never arrived", () => {
776
+ for (const engine of getDatabaseEnginesWithAlertTemplates()) {
777
+ expect(
778
+ databaseRecommendationIds({
779
+ databaseEngine: engine,
780
+ databaseEngineMetricsReported: false,
781
+ }),
782
+ ).toEqual([]);
783
+ }
784
+ });
785
+
786
+ it("treats an unknown metrics state as 'do not withhold'", () => {
787
+ for (const reported of [null, undefined]) {
788
+ expect(
789
+ databaseRecommendationIds({
790
+ databaseEngine: "postgresql",
791
+ databaseEngineMetricsReported: reported,
792
+ }),
793
+ ).toEqual(templateIdsFor("postgresql"));
794
+ }
795
+ });
796
+
797
+ it("never offers one engine's recommendations to another", () => {
798
+ const forPostgres: Array<string> = databaseRecommendationIds({
799
+ databaseEngine: "postgresql",
800
+ });
801
+ const forRedis: Array<string> = databaseRecommendationIds({
802
+ databaseEngine: "redis",
803
+ });
804
+
805
+ expect(forPostgres.length).toBeGreaterThan(0);
806
+ expect(forRedis.length).toBeGreaterThan(0);
807
+
808
+ for (const recommendationId of forPostgres) {
809
+ expect(forRedis).not.toContain(recommendationId);
810
+ }
811
+ });
812
+
813
+ it("offers a fork its family receiver's recommendations", () => {
814
+ expect(databaseRecommendationIds({ databaseEngine: "mariadb" })).toEqual(
815
+ databaseRecommendationIds({ databaseEngine: "mysql" }),
816
+ );
817
+ expect(databaseRecommendationIds({ databaseEngine: "valkey" })).toEqual(
818
+ databaseRecommendationIds({ databaseEngine: "redis" }),
819
+ );
820
+ });
821
+
822
+ it("offers nothing for an engine no template receiver covers", () => {
823
+ expect(
824
+ databaseRecommendationIds({ databaseEngine: "cassandra" }),
825
+ ).toEqual([]);
826
+ });
827
+
828
+ it("keeps the two context-dependent resource types independent", () => {
829
+ expect(databaseRecommendationIds({ serviceLanguage: "java" })).toEqual(
830
+ [],
831
+ );
832
+
833
+ const serviceIds: Array<string> =
834
+ MonitorRecommendationCatalog.getRecommendations(
835
+ MonitorRecommendationResourceType.Service,
836
+ ).map((recommendation: MonitorRecommendation) => {
837
+ return recommendation.recommendationId;
838
+ });
839
+
840
+ expect(
841
+ MonitorRecommendationCatalog.getRecommendations(
842
+ MonitorRecommendationResourceType.Service,
843
+ { databaseEngine: "postgresql" },
844
+ ).map((recommendation: MonitorRecommendation) => {
845
+ return recommendation.recommendationId;
846
+ }),
847
+ ).toEqual(serviceIds);
848
+ });
849
+
850
+ it("stays exhaustive and resolvable by id with no context", () => {
851
+ const all: Array<MonitorRecommendation> =
852
+ MonitorRecommendationCatalog.getAllPossibleRecommendations(
853
+ MonitorRecommendationResourceType.DatabaseServer,
854
+ );
855
+
856
+ expect(all.length).toBe(getAllDatabaseAlertTemplates().length);
857
+
858
+ for (const recommendation of all) {
859
+ expect(recommendation.monitorType).toBe(MonitorType.Metrics);
860
+ expect(
861
+ MonitorRecommendationCatalog.getRecommendationById(
862
+ recommendation.recommendationId,
863
+ )?.templateId,
864
+ ).toBe(recommendation.templateId);
865
+ }
866
+ });
867
+
868
+ it("threads the database id into every query of every recommendation", () => {
869
+ const databaseServerId: string = "d0000000-0000-4000-8000-000000000007";
870
+
871
+ for (const recommendation of MonitorRecommendationCatalog.getAllPossibleRecommendations(
872
+ MonitorRecommendationResourceType.DatabaseServer,
873
+ )) {
874
+ const step: MonitorStep = recommendation.getMonitorStep({
875
+ resourceIdentifier: databaseServerId,
876
+ onlineMonitorStatusId: ObjectID.generate(),
877
+ offlineMonitorStatusId: ObjectID.generate(),
878
+ defaultIncidentSeverityId: ObjectID.generate(),
879
+ defaultAlertSeverityId: ObjectID.generate(),
880
+ monitorName: "PostgreSQL db.prod:5432",
881
+ });
882
+
883
+ for (const queryConfig of step.data!.metricMonitor!.metricViewConfig
884
+ .queryConfigs) {
885
+ expect(
886
+ (
887
+ queryConfig.metricQueryData.filterData.attributes as Record<
888
+ string,
889
+ unknown
890
+ >
891
+ )["oneuptime.database.server.id"],
892
+ ).toBe(databaseServerId);
893
+ }
894
+ }
895
+ });
896
+
897
+ it("lists categories in first-declaration order for an engine", () => {
898
+ const categories: Array<string> =
899
+ MonitorRecommendationCatalog.getCategories(
900
+ MonitorRecommendationResourceType.DatabaseServer,
901
+ { databaseEngine: "postgresql" },
902
+ );
903
+
904
+ // Availability (Engine Metrics Stopped) always leads.
905
+ expect(categories[0]).toBe("Availability");
906
+ expect(new Set(categories).size).toBe(categories.length);
907
+ });
908
+ });
665
909
  });
@@ -513,11 +513,13 @@ describe("MonitorRecommendationUtil.getCoveredRecommendationMonitorIds", () => {
513
513
  * both a covered and an uncovered answer are exercised for all eight
514
514
  * resource types.
515
515
  */
516
- expect(RESOURCE_TYPE_DEFINITIONS.length).toBe(11);
516
+ expect(RESOURCE_TYPE_DEFINITIONS.length).toBe(12);
517
517
 
518
518
  for (const definition of RESOURCE_TYPE_DEFINITIONS) {
519
519
  const recommendations: Array<MonitorRecommendation> =
520
- definition.getRecommendations();
520
+ MonitorRecommendationCatalog.getAllPossibleRecommendations(
521
+ definition.resourceType,
522
+ );
521
523
  const args: MonitorRecommendationArgs = buildArgs();
522
524
 
523
525
  const createdRecommendations: Array<MonitorRecommendation> =
@@ -623,7 +625,9 @@ describe("MonitorRecommendationUtil.getCoveredRecommendationMonitorIds", () => {
623
625
  */
624
626
  for (const definition of RESOURCE_TYPE_DEFINITIONS) {
625
627
  const recommendations: Array<MonitorRecommendation> =
626
- definition.getRecommendations();
628
+ MonitorRecommendationCatalog.getAllPossibleRecommendations(
629
+ definition.resourceType,
630
+ );
627
631
  const args: MonitorRecommendationArgs = buildArgs();
628
632
 
629
633
  const first: MonitorRecommendation = recommendations[0]!;
@@ -680,7 +684,9 @@ describe("MonitorRecommendationUtil.getCoveredRecommendationMonitorIds", () => {
680
684
  it("ignores the monitor-status and severity args entirely", () => {
681
685
  for (const definition of RESOURCE_TYPE_DEFINITIONS) {
682
686
  const recommendations: Array<MonitorRecommendation> =
683
- definition.getRecommendations();
687
+ MonitorRecommendationCatalog.getAllPossibleRecommendations(
688
+ definition.resourceType,
689
+ );
684
690
 
685
691
  const realArgs: MonitorRecommendationArgs = buildArgs();
686
692
 
@@ -749,7 +755,9 @@ describe("MonitorRecommendationUtil.getCoveredRecommendationMonitorIds", () => {
749
755
  Array<string>
750
756
  >();
751
757
 
752
- for (const recommendation of definition.getRecommendations()) {
758
+ for (const recommendation of MonitorRecommendationCatalog.getAllPossibleRecommendations(
759
+ definition.resourceType,
760
+ )) {
753
761
  const fingerprint: string = getSerializedFingerprint(
754
762
  recommendation,
755
763
  args,
@@ -168,7 +168,9 @@ const ALL_RECOMMENDATIONS: Array<MonitorRecommendation> =
168
168
  const ONE_PER_RESOURCE_TYPE: Array<MonitorRecommendation> =
169
169
  MonitorRecommendationCatalog.getResourceTypeDefinitions().map(
170
170
  (definition: MonitorRecommendationResourceTypeDefinition) => {
171
- return definition.getRecommendations()[0]!;
171
+ return MonitorRecommendationCatalog.getAllPossibleRecommendations(
172
+ definition.resourceType,
173
+ )[0]!;
172
174
  },
173
175
  );
174
176
 
@@ -194,7 +196,7 @@ describe("MonitorRecommendationNotificationMode", () => {
194
196
  it("has recommendations to test at all", () => {
195
197
  // Guards every for-loop in this file against a vacuous pass.
196
198
  expect(ALL_RECOMMENDATIONS.length).toBeGreaterThan(0);
197
- expect(ONE_PER_RESOURCE_TYPE.length).toBe(11);
199
+ expect(ONE_PER_RESOURCE_TYPE.length).toBe(12);
198
200
  });
199
201
 
200
202
  it("ships every unhealthy criteria with createIncidents AND createAlerts true, and both arrays populated", () => {
@@ -16,6 +16,7 @@ import MonitorSteps from "../../../../Types/Monitor/MonitorSteps";
16
16
  import MonitorCriteriaInstance from "../../../../Types/Monitor/MonitorCriteriaInstance";
17
17
  import { CriteriaIncident } from "../../../../Types/Monitor/CriteriaIncident";
18
18
  import { CriteriaAlert } from "../../../../Types/Monitor/CriteriaAlert";
19
+ import { getDatabaseEnginesWithAlertTemplates } from "../../../../Types/Monitor/DatabaseAlertTemplates";
19
20
  import ObjectID from "../../../../Types/ObjectID";
20
21
 
21
22
  /*
@@ -95,7 +96,9 @@ const ALL_RECOMMENDATIONS: Array<MonitorRecommendation> =
95
96
  const ONE_PER_RESOURCE_TYPE: Array<MonitorRecommendation> =
96
97
  MonitorRecommendationCatalog.getResourceTypeDefinitions().map(
97
98
  (definition: MonitorRecommendationResourceTypeDefinition) => {
98
- return definition.getRecommendations()[0]!;
99
+ return MonitorRecommendationCatalog.getAllPossibleRecommendations(
100
+ definition.resourceType,
101
+ )[0]!;
99
102
  },
100
103
  );
101
104
 
@@ -154,6 +157,30 @@ describe("MonitorRecommendationUtil", () => {
154
157
  expect(new Set(names).size).toBe(names.length);
155
158
  }
156
159
  });
160
+
161
+ it("produces distinct names within the set one database is offered, for every engine", () => {
162
+ /*
163
+ * A database's set is empty without context, so the loop above proves
164
+ * nothing for it. Per engine is the unit that matters: one database
165
+ * only ever renders one engine's recommendations ("Engine Metrics
166
+ * Stopped" repeats across engines on purpose).
167
+ */
168
+ for (const engine of getDatabaseEnginesWithAlertTemplates()) {
169
+ const names: Array<string> =
170
+ MonitorRecommendationCatalog.getRecommendations(
171
+ MonitorRecommendationResourceType.DatabaseServer,
172
+ { databaseEngine: engine, databaseEngineMetricsReported: true },
173
+ ).map((recommendation: MonitorRecommendation) => {
174
+ return MonitorRecommendationUtil.getMonitorName({
175
+ recommendation: recommendation,
176
+ resourceDisplayName: "PostgreSQL db.prod:5432",
177
+ });
178
+ });
179
+
180
+ expect(names.length).toBeGreaterThan(0);
181
+ expect(new Set(names).size).toBe(names.length);
182
+ }
183
+ });
157
184
  });
158
185
 
159
186
  describe("getMonitorStep — every recommendation, every resource type", () => {
@@ -802,7 +829,9 @@ describe("MonitorRecommendationUtil", () => {
802
829
  it("works for every resource type, not just Kubernetes", () => {
803
830
  for (const definition of MonitorRecommendationCatalog.getResourceTypeDefinitions()) {
804
831
  const recommendations: Array<MonitorRecommendation> =
805
- definition.getRecommendations();
832
+ MonitorRecommendationCatalog.getAllPossibleRecommendations(
833
+ definition.resourceType,
834
+ );
806
835
  const args: MonitorRecommendationArgs = buildArgs();
807
836
  const created: MonitorRecommendation = recommendations[0]!;
808
837
 
@@ -961,4 +990,84 @@ describe("MonitorRecommendationUtil", () => {
961
990
  expect(lastCriticalIndex).toBeLessThan(firstWarningIndex);
962
991
  });
963
992
  });
993
+
994
+ /*
995
+ * A database's monitors are generic Metrics monitors whose only resource
996
+ * identity is the `oneuptime.database.server.id` filter on every query. The
997
+ * already-created diff has to read that as the resource, or every database
998
+ * in the project would share one set of "created" cards.
999
+ */
1000
+ describe("database fingerprints", () => {
1001
+ const DATABASE_A: string = "d0000000-0000-4000-8000-00000000000a";
1002
+ const DATABASE_B: string = "d0000000-0000-4000-8000-00000000000b";
1003
+
1004
+ const postgresRecommendations: Array<MonitorRecommendation> =
1005
+ MonitorRecommendationCatalog.getRecommendations(
1006
+ MonitorRecommendationResourceType.DatabaseServer,
1007
+ { databaseEngine: "postgresql", databaseEngineMetricsReported: true },
1008
+ );
1009
+
1010
+ it("reads the database id off the query filter as the resource identifier", () => {
1011
+ expect(postgresRecommendations.length).toBeGreaterThan(0);
1012
+
1013
+ for (const recommendation of postgresRecommendations) {
1014
+ const fingerprint: MonitorRecommendationFingerprint | undefined =
1015
+ MonitorRecommendationUtil.getFingerprintFromMonitorStep(
1016
+ recommendation.getMonitorStep(
1017
+ buildArgs({ resourceIdentifier: DATABASE_A }),
1018
+ ),
1019
+ );
1020
+
1021
+ expect(fingerprint?.configKind).toBe("metricMonitor");
1022
+ expect(fingerprint?.resourceIdentifier).toBe(DATABASE_A);
1023
+ }
1024
+ });
1025
+
1026
+ it("never lets one database's monitor cover another database's recommendation", () => {
1027
+ const existing: Array<MonitorStep> = postgresRecommendations.map(
1028
+ (recommendation: MonitorRecommendation) => {
1029
+ return recommendation.getMonitorStep(
1030
+ buildArgs({ resourceIdentifier: DATABASE_A }),
1031
+ );
1032
+ },
1033
+ );
1034
+
1035
+ expect(
1036
+ MonitorRecommendationUtil.getCoveredRecommendationIds({
1037
+ recommendations: postgresRecommendations,
1038
+ existingMonitorSteps: existing,
1039
+ args: buildArgs({ resourceIdentifier: DATABASE_B }),
1040
+ }).size,
1041
+ ).toBe(0);
1042
+
1043
+ expect(
1044
+ MonitorRecommendationUtil.getCoveredRecommendationIds({
1045
+ recommendations: postgresRecommendations,
1046
+ existingMonitorSteps: existing,
1047
+ args: buildArgs({ resourceIdentifier: DATABASE_A }),
1048
+ }).size,
1049
+ ).toBe(postgresRecommendations.length);
1050
+ });
1051
+
1052
+ it("leaves a project-wide metric monitor's identity empty", () => {
1053
+ /*
1054
+ * The fallback only reads the database scope attribute: a Metrics
1055
+ * monitor with no such filter is not about any one resource, and must
1056
+ * not suddenly start claiming one.
1057
+ */
1058
+ const step: MonitorStep = postgresRecommendations[0]!.getMonitorStep(
1059
+ buildArgs({ resourceIdentifier: DATABASE_A }),
1060
+ );
1061
+
1062
+ for (const queryConfig of step.data!.metricMonitor!.metricViewConfig
1063
+ .queryConfigs) {
1064
+ queryConfig.metricQueryData.filterData.attributes = {};
1065
+ }
1066
+
1067
+ expect(
1068
+ MonitorRecommendationUtil.getFingerprintFromMonitorStep(step)
1069
+ ?.resourceIdentifier,
1070
+ ).toBe("");
1071
+ });
1072
+ });
964
1073
  });
@@ -371,6 +371,67 @@ describe("RecommendationCriteriaBuilder", () => {
371
371
  expect(
372
372
  firstFilter(buildHealthy()).metricMonitorOptions?.onNoDataPolicy,
373
373
  ).toBeUndefined();
374
+ expect(
375
+ firstFilter(buildUnhealthy()).metricMonitorOptions?.onNoDataPolicy,
376
+ ).toBeUndefined();
377
+ });
378
+
379
+ /*
380
+ * The heartbeat shape the database "Engine Metrics Stopped" templates
381
+ * use: silence IS the breach, so the firing side must say Trigger.
382
+ */
383
+ test("triggerOnNoData puts the Trigger policy on every breach filter", () => {
384
+ const instance: MonitorCriteriaInstance = buildUnhealthy({
385
+ triggerOnNoData: true,
386
+ additionalFilters: [
387
+ {
388
+ metricAlias: "second_heartbeat",
389
+ filterType: FilterType.LessThan,
390
+ value: 0,
391
+ },
392
+ ],
393
+ });
394
+
395
+ const filters: Array<CriteriaFilter> = instance.data
396
+ ?.filters as Array<CriteriaFilter>;
397
+
398
+ expect(filters.length).toBe(2);
399
+
400
+ for (const filter of filters) {
401
+ expect(filter.metricMonitorOptions?.onNoDataPolicy).toBe(
402
+ NoDataPolicy.Trigger,
403
+ );
404
+ }
405
+ });
406
+
407
+ test("triggerOnNoData wins over treatNoDataAsZero — one answer per criteria", () => {
408
+ expect(
409
+ firstFilter(
410
+ buildUnhealthy({ triggerOnNoData: true, treatNoDataAsZero: true }),
411
+ ).metricMonitorOptions?.onNoDataPolicy,
412
+ ).toBe(NoDataPolicy.Trigger);
413
+
414
+ // ...and treatNoDataAsZero alone still behaves exactly as before.
415
+ expect(
416
+ firstFilter(buildUnhealthy({ treatNoDataAsZero: true }))
417
+ .metricMonitorOptions?.onNoDataPolicy,
418
+ ).toBe(NoDataPolicy.TreatAsZero);
419
+ });
420
+
421
+ test("triggerOnNoData keeps the breach sustained and its threshold as given", () => {
422
+ const filter: CriteriaFilter = firstFilter(
423
+ buildUnhealthy({
424
+ triggerOnNoData: true,
425
+ filterType: FilterType.LessThan,
426
+ value: 0,
427
+ }),
428
+ );
429
+
430
+ expect(filter.metricMonitorOptions?.metricAggregationType).toBe(
431
+ SustainedEvaluation,
432
+ );
433
+ expect(filter.filterType).toBe(FilterType.LessThan);
434
+ expect(filter.value).toBe(0);
374
435
  });
375
436
 
376
437
  test("filterCondition is overridable so multi-alias recovery can require ALL", () => {