@oneuptime/common 14.0.3 → 14.0.6

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 (663) 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/MetricService.ts +1 -1
  37. package/Server/Services/OpenTelemetryIngestService.ts +19 -0
  38. package/Server/Services/PodmanResourceService.ts +43 -2
  39. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
  40. package/Server/Services/ServiceService.ts +1 -1
  41. package/Server/Services/TelemetryUsageBillingService.ts +29 -2
  42. package/Server/Services/UserProjectSsoConsentService.ts +74 -0
  43. package/Server/Services/UserService.ts +14 -1
  44. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
  45. package/Server/Types/Database/QueryHelper.ts +84 -2
  46. package/Server/Utils/AI/Toolbox/MetricTools.ts +13 -2
  47. package/Server/Utils/AI/Toolbox/ResourceTools.ts +81 -2
  48. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +1 -1
  49. package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
  50. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +33 -0
  51. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +192 -9
  52. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  53. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2264 -755
  54. package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
  55. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
  56. package/Server/Utils/Monitor/MonitorResource.ts +47 -11
  57. package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
  58. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
  59. package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
  60. package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
  61. package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
  62. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  63. package/Server/Utils/StartServer.ts +26 -6
  64. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  65. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
  66. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
  67. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
  68. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
  69. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
  70. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
  71. package/Server/Utils/Telemetry/Telemetry.ts +16 -0
  72. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
  73. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
  74. package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
  75. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
  76. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
  77. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
  78. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
  79. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
  80. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
  81. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
  82. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
  83. package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
  84. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
  85. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
  86. package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
  87. package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
  88. package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
  89. package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
  90. package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
  91. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
  92. package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
  93. package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
  94. package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
  95. package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
  96. package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
  97. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
  98. package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
  99. package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
  100. package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
  101. package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
  102. package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
  103. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
  104. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
  105. package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
  106. package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
  107. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
  108. package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
  109. package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
  110. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
  111. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
  112. package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
  113. package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
  114. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
  115. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
  116. package/Tests/App/Dashboard/NetworkTopologyExplorerSearch.test.tsx +1267 -0
  117. package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
  118. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
  119. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
  120. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  121. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
  122. package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +4 -1
  123. package/Tests/App/Dashboard/RumOverviewPage.test.tsx +127 -0
  124. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
  125. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
  126. package/Tests/App/Dashboard/SiteSearchBox.test.tsx +2110 -0
  127. package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +168 -8
  128. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
  129. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
  130. package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
  131. package/Tests/ClassStrings.ts +178 -0
  132. package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
  133. package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
  134. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
  135. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
  136. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  137. package/Tests/RenderedMarkup.ts +518 -0
  138. package/Tests/ResponsiveVisibility.test.ts +490 -4
  139. package/Tests/ResponsiveVisibility.ts +505 -52
  140. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  141. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
  142. package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
  143. package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
  144. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
  145. package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
  146. package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
  147. package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
  148. package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
  149. package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
  150. package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
  151. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
  152. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
  153. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
  154. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
  155. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
  156. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
  157. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
  158. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
  159. package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
  160. package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
  161. package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
  162. package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
  163. package/Tests/Server/Services/MetricServiceAggregate.test.ts +12 -0
  164. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  165. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
  166. package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
  167. package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
  168. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
  169. package/Tests/Server/Services/SavedViewDefaults.test.ts +325 -0
  170. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  171. package/Tests/Server/Services/StatusPageCertificateService.test.ts +169 -0
  172. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +191 -0
  173. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
  174. package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
  175. package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
  176. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
  177. package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
  178. package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
  179. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
  180. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
  181. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
  182. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
  183. package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
  184. package/Tests/Server/Types/Database/QueryHelperSearchAllWords.test.ts +651 -0
  185. package/Tests/Server/Utils/AI/AlertWriteTools.test.ts +256 -0
  186. package/Tests/Server/Utils/AI/IncidentWriteTools.test.ts +482 -0
  187. package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
  188. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +54 -0
  189. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
  190. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
  191. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
  192. package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
  193. package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
  194. package/Tests/Server/Utils/Monitor/MetricDecimalThreshold.test.ts +417 -0
  195. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
  196. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
  197. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
  198. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
  199. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1815 -0
  200. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
  201. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
  202. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
  203. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
  204. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
  205. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  206. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
  207. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
  208. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
  209. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
  210. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
  211. package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
  212. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
  213. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  214. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
  215. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  216. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
  217. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
  218. package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
  219. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
  220. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
  221. package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
  222. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
  223. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
  224. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
  225. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
  226. package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
  227. package/Tests/Types/BaseDatabase/AggregationType.test.ts +5 -1
  228. package/Tests/Types/Dashboard/KubernetesDashboardTemplate.test.ts +184 -0
  229. package/Tests/Types/Dashboard/KubernetesDashboardTemplates.test.ts +107 -0
  230. package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
  231. package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
  232. package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
  233. package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
  234. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
  235. package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
  236. package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
  237. package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
  238. package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
  239. package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
  240. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
  241. package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
  242. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +292 -0
  243. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +272 -0
  244. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
  245. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
  246. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
  247. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
  248. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
  249. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
  250. package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +202 -0
  251. package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
  252. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
  253. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
  254. package/Tests/UI/Components/Card.test.tsx +93 -2
  255. package/Tests/UI/Components/FeedOptions.test.ts +6 -0
  256. package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
  257. package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
  258. package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
  259. package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
  260. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
  261. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
  262. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  263. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
  264. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
  265. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
  266. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
  267. package/Tests/UI/Rum/ChunkLoader.test.ts +76 -0
  268. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
  269. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +53 -0
  270. package/Tests/UI/Rum/ReplaySignals.test.ts +54 -0
  271. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
  272. package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
  273. package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
  274. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
  275. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
  276. package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
  277. package/Tests/UI/Utils/Navigation.test.ts +102 -0
  278. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
  279. package/Tests/Utils/Dashboard/KubernetesClusterCpuTileRepair.test.ts +370 -0
  280. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  281. package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
  282. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
  283. package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
  284. package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
  285. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
  286. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
  287. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
  288. package/Tests/Utils/Rules/MonitorTypeRuleCriteria.test.ts +181 -0
  289. package/Tests/Utils/ValueFormatter.test.ts +50 -0
  290. package/Tests/tsconfig.json +16 -0
  291. package/Types/AI/AIResourceContext.ts +7 -0
  292. package/Types/BaseDatabase/AggregationType.ts +7 -0
  293. package/Types/Dashboard/DashboardTemplates.ts +22 -8
  294. package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
  295. package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
  296. package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
  297. package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
  298. package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
  299. package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
  300. package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
  301. package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
  302. package/Types/Email/EmailTemplateType.ts +1 -0
  303. package/Types/Monitor/CephAlertTemplates.ts +18 -0
  304. package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
  305. package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
  306. package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
  307. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
  308. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
  309. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
  310. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
  311. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
  312. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
  313. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
  314. package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
  315. package/Types/Permission.ts +267 -0
  316. package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
  317. package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
  318. package/Types/Rules/RuleRun.ts +12 -0
  319. package/Types/Rum/SessionReplayCustomEvents.ts +29 -3
  320. package/Types/Rum/WebVitals.ts +13 -0
  321. package/Types/Telemetry/EntityType.ts +23 -0
  322. package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
  323. package/Types/Telemetry/ServiceType.ts +8 -0
  324. package/UI/Components/Banner/Banner.tsx +1 -1
  325. package/UI/Components/Card/Card.tsx +1 -1
  326. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
  327. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  328. package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
  329. package/UI/Components/Date/StartAndEndDate.tsx +5 -5
  330. package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
  331. package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
  332. package/UI/Components/Forms/BasicForm.tsx +1 -1
  333. package/UI/Components/Header/Header.tsx +1 -1
  334. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
  335. package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
  336. package/UI/Components/Input/Input.tsx +11 -0
  337. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
  338. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
  339. package/UI/Components/Modal/ModalFooter.tsx +1 -1
  340. package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
  341. package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
  342. package/UI/Components/Navbar/NavBar.tsx +9 -2
  343. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
  344. package/UI/Components/Page/Page.tsx +1 -1
  345. package/UI/Components/Pagination/Pagination.tsx +3 -3
  346. package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
  347. package/UI/Components/SideMenu/SideMenu.tsx +4 -1
  348. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
  349. package/UI/Components/StatusPage/ResourceList.tsx +6 -6
  350. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
  351. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
  352. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
  353. package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
  354. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  355. package/UI/Styles/Theme.css +8 -1
  356. package/UI/Utils/Navigation.ts +89 -42
  357. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
  358. package/UI/Utils/TelemetryService.ts +4 -3
  359. package/Utils/Dashboard/KubernetesClusterCpuTileRepair.ts +147 -0
  360. package/Utils/LabelRuleImportExport.ts +2 -0
  361. package/Utils/MetricUnitUtil.ts +103 -11
  362. package/Utils/Monitor/MetricValueFormatter.ts +66 -13
  363. package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
  364. package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
  365. package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
  366. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
  367. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
  368. package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
  369. package/Utils/Telemetry/EntityKey.ts +176 -0
  370. package/Utils/ValueFormatter.ts +16 -0
  371. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  372. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
  374. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
  375. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
  376. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
  377. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
  378. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
  379. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
  380. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
  381. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
  382. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
  383. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
  384. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
  385. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
  386. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
  387. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  388. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  389. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  390. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  391. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  392. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  393. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  394. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  395. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  396. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
  397. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
  398. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
  399. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
  400. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
  401. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
  402. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  403. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  404. package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
  405. package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
  406. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  407. package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
  408. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  409. package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
  410. package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
  411. package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
  412. package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
  413. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
  414. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
  415. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
  416. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
  417. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
  418. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
  419. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
  420. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
  421. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
  422. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
  423. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
  424. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
  425. package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
  426. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
  427. package/build/dist/Server/Services/DatabaseService.js +8 -4
  428. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  429. package/build/dist/Server/Services/DockerResourceService.js +30 -3
  430. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  431. package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
  432. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  433. package/build/dist/Server/Services/Index.js +16 -0
  434. package/build/dist/Server/Services/Index.js.map +1 -1
  435. package/build/dist/Server/Services/InventoryItemService.js +88 -5
  436. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  437. package/build/dist/Server/Services/IoTDeviceService.js +111 -24
  438. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  439. package/build/dist/Server/Services/MetricService.js +1 -1
  440. package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
  441. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  442. package/build/dist/Server/Services/PodmanResourceService.js +30 -3
  443. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  444. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
  445. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  446. package/build/dist/Server/Services/ServiceService.js +1 -1
  447. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  448. package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
  449. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  450. package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
  451. package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
  452. package/build/dist/Server/Services/UserService.js +13 -1
  453. package/build/dist/Server/Services/UserService.js.map +1 -1
  454. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
  455. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  456. package/build/dist/Server/Types/Database/QueryHelper.js +73 -2
  457. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  458. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js +13 -2
  459. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js.map +1 -1
  460. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +58 -1
  461. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  462. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +1 -1
  463. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
  464. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
  465. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +31 -0
  466. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  467. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +135 -14
  468. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  469. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
  470. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  471. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
  472. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  473. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  474. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  475. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
  476. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  477. package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
  478. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  479. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
  480. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  481. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
  482. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  483. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
  484. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
  485. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
  486. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  487. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
  488. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  489. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  490. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  491. package/build/dist/Server/Utils/StartServer.js +20 -4
  492. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  493. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  494. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  495. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
  496. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
  497. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
  498. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  499. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
  500. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  501. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
  502. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  503. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
  504. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  505. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
  506. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  507. package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
  508. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  509. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
  510. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  511. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
  512. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
  513. package/build/dist/Types/AI/AIResourceContext.js +7 -0
  514. package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
  515. package/build/dist/Types/BaseDatabase/AggregationType.js +7 -0
  516. package/build/dist/Types/BaseDatabase/AggregationType.js.map +1 -1
  517. package/build/dist/Types/Dashboard/DashboardTemplates.js +22 -8
  518. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  519. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
  520. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
  521. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
  522. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
  523. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
  524. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
  525. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
  526. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
  527. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
  528. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
  529. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
  530. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
  531. package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
  532. package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
  533. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
  534. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
  535. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  536. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  537. package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
  538. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  539. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
  540. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
  541. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
  542. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  543. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
  544. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  545. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
  546. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  547. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
  548. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  549. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
  550. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  551. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
  552. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
  553. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
  554. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  555. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
  556. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
  557. package/build/dist/Types/Permission.js +234 -0
  558. package/build/dist/Types/Permission.js.map +1 -1
  559. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
  560. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  561. package/build/dist/Types/Rules/RuleRun.js +4 -0
  562. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  563. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -1
  564. package/build/dist/Types/Rum/WebVitals.js +12 -0
  565. package/build/dist/Types/Rum/WebVitals.js.map +1 -1
  566. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  567. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  568. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
  569. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
  570. package/build/dist/Types/Telemetry/ServiceType.js +8 -0
  571. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  572. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  573. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  574. package/build/dist/UI/Components/Card/Card.js +1 -1
  575. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  576. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
  577. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  579. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  580. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
  581. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  582. package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
  583. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  584. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
  585. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
  586. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
  587. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
  588. package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
  589. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  590. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  592. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
  593. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  594. package/build/dist/UI/Components/Input/Input.js +1 -1
  595. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  596. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
  597. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  598. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  599. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  600. package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
  601. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  602. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
  603. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  604. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
  605. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  606. package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
  607. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  608. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  609. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  610. package/build/dist/UI/Components/Page/Page.js +1 -1
  611. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  612. package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
  613. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  614. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
  615. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
  616. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
  617. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  618. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
  619. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  620. package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
  621. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  622. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  623. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  624. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
  625. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  626. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
  627. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  628. package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
  629. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  630. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  631. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  632. package/build/dist/UI/Utils/Navigation.js +66 -33
  633. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  634. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
  635. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  636. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  637. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  638. package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js +110 -0
  639. package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js.map +1 -0
  640. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  641. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  642. package/build/dist/Utils/MetricUnitUtil.js +77 -13
  643. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  644. package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
  645. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
  646. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
  647. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
  648. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
  649. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
  650. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
  651. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
  652. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
  653. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  654. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
  655. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
  656. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
  657. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
  658. package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
  659. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  660. package/build/dist/Utils/ValueFormatter.js +15 -0
  661. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  662. package/package.json +1 -1
  663. package/tsconfig.tests.json +7 -5
@@ -4015,17 +4015,23 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
4015
4015
  /*
4016
4016
  * The lock is taken by the sub-SELECT and inherited by the UPDATE within
4017
4017
  * the same implicit transaction, so the outer write never blocks either.
4018
- * RETURNING is how the affected-row count comes back: TypeORM's `query()`
4019
- * surfaces the driver's rows and a bare UPDATE returns none, so without it
4020
- * a skipped write is indistinguishable from an applied one.
4018
+ *
4019
+ * The UPDATE sits in a CTE so the statement is a SELECT of the rows it
4020
+ * wrote. TypeORM's postgres `query()` answers a top-level UPDATE with
4021
+ * `[rows, rowCount]` - an array of length 2 whether or not anything was
4022
+ * written - so a bare `UPDATE ... RETURNING` made every skipped write
4023
+ * read as applied. A SELECT comes back as its rows: one when the row
4024
+ * was written, none when it was locked or no longer exists.
4021
4025
  */
4022
- const sql: string = `UPDATE "${metadata.tableName}" SET ${setClauses.join(
4023
- ", ",
4024
- )} WHERE "${primaryColumnName}" IN (SELECT "${primaryColumnName}" FROM "${
4026
+ const sql: string = `WITH "updated" AS (UPDATE "${
4025
4027
  metadata.tableName
4026
- }" WHERE "${primaryColumnName}" = $${
4028
+ }" SET ${setClauses.join(", ")} WHERE "${primaryColumnName}" IN (SELECT "${
4029
+ primaryColumnName
4030
+ }" FROM "${metadata.tableName}" WHERE "${primaryColumnName}" = $${
4027
4031
  params.length
4028
- } FOR UPDATE SKIP LOCKED) RETURNING "${primaryColumnName}"`;
4032
+ } FOR UPDATE SKIP LOCKED) RETURNING "${primaryColumnName}") SELECT "${
4033
+ primaryColumnName
4034
+ }" FROM "updated"`;
4029
4035
 
4030
4036
  const result: unknown = await repository.manager.query(sql, params);
4031
4037
 
@@ -39,6 +39,19 @@ export interface ParsedDockerContainer {
39
39
  cpuPercent: number | null;
40
40
  memoryBytes: number | null;
41
41
  observedAt: Date;
42
+ /*
43
+ * The container labels the agent copies onto its metrics (Compose /
44
+ * Swarm / Testcontainers keys, see CONTAINER_CLASSIFIER_LABEL_KEYS):
45
+ * MERGED into the row's labels, never replacing what the inventory
46
+ * snapshot wrote. Null / omitted leaves the labels alone.
47
+ */
48
+ labels?: JSONObject | null | undefined;
49
+ /*
50
+ * When the container's current run started (metric time − container.uptime).
51
+ * Fills an empty resourceCreationTimestamp, and moves it forward when
52
+ * the container was restarted or recreated under the same name.
53
+ */
54
+ startedAt?: Date | null | undefined;
42
55
  }
43
56
 
44
57
  export interface ParsedDockerResource {
@@ -141,7 +154,7 @@ export class Service extends DatabaseService<Model> {
141
154
 
142
155
  for (const c of chunk) {
143
156
  valueFragments.push(
144
- `($${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}::numeric, $${p++}::bigint, $${p++}::timestamptz, $${p++}::timestamptz, $${p++})`,
157
+ `($${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}::numeric, $${p++}::bigint, $${p++}::timestamptz, $${p++}::timestamptz, $${p++}, $${p++}::jsonb, $${p++}::timestamptz)`,
145
158
  );
146
159
  params.push(
147
160
  data.projectId.toString(),
@@ -160,15 +173,27 @@ export class Service extends DatabaseService<Model> {
160
173
  c.observedAt,
161
174
  c.observedAt,
162
175
  0, // version (BaseModel @VersionColumn)
176
+ c.labels && Object.keys(c.labels).length > 0
177
+ ? JSON.stringify(c.labels)
178
+ : null,
179
+ c.startedAt || null,
163
180
  );
164
181
  }
165
182
 
183
+ /*
184
+ * The same container name with a different id is a recreated
185
+ * container: its labels and start time replace the old ones. Else
186
+ * the metric labels are merged into whatever the inventory wrote,
187
+ * and the start time only moves forward (a restart) — by more than
188
+ * a minute, so clock jitter between scrapes never rewrites it.
189
+ */
166
190
  const sql: string = `
167
191
  INSERT INTO "DockerResource" (
168
192
  "projectId", "dockerHostId", "kind", "name",
169
193
  "containerId", "imageName", "state",
170
194
  "latestCpuPercent", "latestMemoryBytes",
171
- "metricsUpdatedAt", "lastSeenAt", "version"
195
+ "metricsUpdatedAt", "lastSeenAt", "version",
196
+ "labels", "resourceCreationTimestamp"
172
197
  )
173
198
  VALUES ${valueFragments.join(", ")}
174
199
  ON CONFLICT ("projectId", "dockerHostId", "kind", "name")
@@ -180,6 +205,22 @@ export class Service extends DatabaseService<Model> {
180
205
  "latestMemoryBytes" = COALESCE(EXCLUDED."latestMemoryBytes", "DockerResource"."latestMemoryBytes"),
181
206
  "metricsUpdatedAt" = EXCLUDED."metricsUpdatedAt",
182
207
  "lastSeenAt" = EXCLUDED."lastSeenAt",
208
+ "labels" = CASE
209
+ WHEN EXCLUDED."labels" IS NULL THEN "DockerResource"."labels"
210
+ WHEN lower(left(EXCLUDED."containerId", 12)) <> lower(left("DockerResource"."containerId", 12))
211
+ THEN EXCLUDED."labels"
212
+ WHEN jsonb_typeof("DockerResource"."labels") = 'object'
213
+ THEN "DockerResource"."labels" || EXCLUDED."labels"
214
+ ELSE EXCLUDED."labels"
215
+ END,
216
+ "resourceCreationTimestamp" = CASE
217
+ WHEN EXCLUDED."resourceCreationTimestamp" IS NULL THEN "DockerResource"."resourceCreationTimestamp"
218
+ WHEN "DockerResource"."resourceCreationTimestamp" IS NULL
219
+ OR lower(left(EXCLUDED."containerId", 12)) <> lower(left("DockerResource"."containerId", 12))
220
+ OR EXCLUDED."resourceCreationTimestamp" > "DockerResource"."resourceCreationTimestamp" + interval '1 minute'
221
+ THEN EXCLUDED."resourceCreationTimestamp"
222
+ ELSE "DockerResource"."resourceCreationTimestamp"
223
+ END,
183
224
  "updatedAt" = now()
184
225
  WHERE EXCLUDED."lastSeenAt" >= "DockerResource"."lastSeenAt"
185
226
  `;
@@ -101,10 +101,34 @@ export class Service extends DatabaseService<Model> {
101
101
  return onDelete;
102
102
  }
103
103
 
104
+ /*
105
+ * Re-matches the reminder rule for every open incident in the project and
106
+ * rewrites its nextReminderNotificationAt.
107
+ *
108
+ * Without options that is one read of at most LIMIT_MAX open incidents, and
109
+ * it must stay one: the rule create, update and delete hooks run it inside
110
+ * the API request.
111
+ *
112
+ * `onlyWithoutNextReminder` narrows that to open incidents with no reminder
113
+ * scheduled at all, and reads every one of them, in `_id`-ordered pages of
114
+ * LIMIT_MAX. It exists for backfills (see the
115
+ * ScheduleRemindersMissedByReminderRuleLookup data migration), which run in a
116
+ * worker rather than a request and must reach every such incident of the
117
+ * project, however many there are. The pages are cursored by `_id`, not
118
+ * offset, because refreshing an incident can take it out of the set being
119
+ * paged. An incident that already has a timestamp is left alone, because
120
+ * re-scheduling it would push a reminder that is due, or overdue, one full
121
+ * interval later.
122
+ */
104
123
  @CaptureSpan()
105
124
  public async refreshSchedulesForOpenIncidents(
106
125
  projectId: ObjectID,
126
+ options?: { onlyWithoutNextReminder?: boolean | undefined } | undefined,
107
127
  ): Promise<void> {
128
+ const onlyWithoutNextReminder: boolean = Boolean(
129
+ options?.onlyWithoutNextReminder,
130
+ );
131
+
108
132
  try {
109
133
  const unresolvedStates: Array<IncidentState> =
110
134
  await IncidentStateService.findBy({
@@ -132,33 +156,51 @@ export class Service extends DatabaseService<Model> {
132
156
  return;
133
157
  }
134
158
 
135
- const openIncidents: Array<Incident> = await IncidentService.findBy({
136
- query: {
159
+ let afterId: ObjectID | null = null;
160
+
161
+ while (true) {
162
+ const openIncidents: Array<Incident> = await this.findOpenIncidents({
137
163
  projectId: projectId,
138
- currentIncidentStateId: QueryHelper.any(unresolvedStateIds),
139
- },
140
- select: {
141
- _id: true,
142
- },
143
- limit: LIMIT_MAX,
144
- skip: 0,
145
- props: {
146
- isRoot: true,
147
- },
148
- });
164
+ unresolvedStateIds: unresolvedStateIds,
165
+ onlyWithoutNextReminder: onlyWithoutNextReminder,
166
+ afterId: afterId,
167
+ });
149
168
 
150
- for (const incident of openIncidents) {
151
- try {
152
- await IncidentService.refreshReminderSchedule({
153
- incidentId: incident.id!,
154
- projectId: projectId,
155
- });
156
- } catch (error) {
157
- logger.error(
158
- `Failed to refresh reminder schedule for incident ${incident.id}: ${error}`,
159
- { projectId: projectId?.toString() } as LogAttributes,
169
+ for (const incident of openIncidents) {
170
+ try {
171
+ await IncidentService.refreshReminderSchedule({
172
+ incidentId: incident.id!,
173
+ projectId: projectId,
174
+ });
175
+ } catch (error) {
176
+ logger.error(
177
+ `Failed to refresh reminder schedule for incident ${incident.id}: ${error}`,
178
+ { projectId: projectId?.toString() } as LogAttributes,
179
+ );
180
+ }
181
+ }
182
+
183
+ // Without the option, the one read above is all there is.
184
+ if (!onlyWithoutNextReminder || openIncidents.length < LIMIT_MAX) {
185
+ return;
186
+ }
187
+
188
+ const lastId: ObjectID | null =
189
+ openIncidents[openIncidents.length - 1]!.id;
190
+
191
+ if (!lastId || (afterId && lastId.toString() <= afterId.toString())) {
192
+ /*
193
+ * A full page whose last row does not move the cursor forward
194
+ * would be read again forever. Not reachable with `_id ASC` and a
195
+ * `> afterId` filter; guarded so a broken sort cannot hang the
196
+ * backfill.
197
+ */
198
+ throw new Error(
199
+ "the open incident page did not advance its _id cursor",
160
200
  );
161
201
  }
202
+
203
+ afterId = lastId;
162
204
  }
163
205
  } catch (error) {
164
206
  logger.error(
@@ -168,6 +210,44 @@ export class Service extends DatabaseService<Model> {
168
210
  }
169
211
  }
170
212
 
213
+ /*
214
+ * One read of the project's open incidents: those whose current state is one
215
+ * of `unresolvedStateIds`. Both paths of refreshSchedulesForOpenIncidents
216
+ * read through here, so what "open" means is written once.
217
+ *
218
+ * With `onlyWithoutNextReminder`, only those with no reminder scheduled,
219
+ * `_id` ascending and after `afterId` when there is one. Without it, no
220
+ * cursor and the default order: the read the rule hooks have always made.
221
+ */
222
+ private async findOpenIncidents(data: {
223
+ projectId: ObjectID;
224
+ unresolvedStateIds: Array<ObjectID>;
225
+ onlyWithoutNextReminder: boolean;
226
+ afterId: ObjectID | null;
227
+ }): Promise<Array<Incident>> {
228
+ return await IncidentService.findBy({
229
+ query: {
230
+ projectId: data.projectId,
231
+ currentIncidentStateId: QueryHelper.any(data.unresolvedStateIds),
232
+ ...(data.onlyWithoutNextReminder
233
+ ? { nextReminderNotificationAt: QueryHelper.isNull() }
234
+ : {}),
235
+ ...(data.afterId ? { _id: QueryHelper.greaterThan(data.afterId) } : {}),
236
+ },
237
+ select: {
238
+ _id: true,
239
+ },
240
+ ...(data.onlyWithoutNextReminder
241
+ ? { sort: { _id: SortOrder.Ascending } }
242
+ : {}),
243
+ limit: LIMIT_MAX,
244
+ skip: 0,
245
+ props: {
246
+ isRoot: true,
247
+ },
248
+ });
249
+ }
250
+
171
251
  @CaptureSpan()
172
252
  public async findMatchingRule(data: {
173
253
  projectId: ObjectID;
@@ -106,6 +106,12 @@ import VMwareVCenterOwnerRuleService from "./VMwareVCenterOwnerRuleService";
106
106
  import VMwareVCenterOwnerTeamService from "./VMwareVCenterOwnerTeamService";
107
107
  import VMwareVCenterOwnerUserService from "./VMwareVCenterOwnerUserService";
108
108
  import CephClusterOwnerUserService from "./CephClusterOwnerUserService";
109
+ import DatabaseServerService from "./DatabaseServerService";
110
+ import DatabaseServerEndpointService from "./DatabaseServerEndpointService";
111
+ import DatabaseServerLabelRuleService from "./DatabaseServerLabelRuleService";
112
+ import DatabaseServerOwnerRuleService from "./DatabaseServerOwnerRuleService";
113
+ import DatabaseServerOwnerTeamService from "./DatabaseServerOwnerTeamService";
114
+ import DatabaseServerOwnerUserService from "./DatabaseServerOwnerUserService";
109
115
  import LlmProviderService from "./LlmProviderService";
110
116
  import DataSourceService from "./DataSourceService";
111
117
  import AuditLogService from "./AuditLogService";
@@ -150,6 +156,7 @@ import KubernetesClusterFeedService from "./KubernetesClusterFeedService";
150
156
  import DockerHostFeedService from "./DockerHostFeedService";
151
157
  import DockerSwarmClusterFeedService from "./DockerSwarmClusterFeedService";
152
158
  import CephClusterFeedService from "./CephClusterFeedService";
159
+ import DatabaseServerFeedService from "./DatabaseServerFeedService";
153
160
  import PodmanHostFeedService from "./PodmanHostFeedService";
154
161
  import ProxmoxClusterFeedService from "./ProxmoxClusterFeedService";
155
162
  import VMwareVCenterFeedService from "./VMwareVCenterFeedService";
@@ -291,6 +298,7 @@ import UserOnCallLogService from "./UserOnCallLogService";
291
298
  import UserOnCallLogTimelineService from "./UserOnCallLogTimelineService";
292
299
  import UserService from "./UserService";
293
300
  import UserSessionService from "./UserSessionService";
301
+ import UserProjectSsoConsentService from "./UserProjectSsoConsentService";
294
302
  import UserTotpAuthService from "./UserTotpAuthService";
295
303
  import UserTwoFactorBackupCodeService from "./UserTwoFactorBackupCodeService";
296
304
  import UserWebAuthnService from "./UserWebAuthnService";
@@ -573,6 +581,12 @@ const services: Array<BaseService> = [
573
581
  VMwareVCenterOwnerRuleService,
574
582
  VMwareVCenterOwnerTeamService,
575
583
  VMwareVCenterOwnerUserService,
584
+ DatabaseServerService,
585
+ DatabaseServerEndpointService,
586
+ DatabaseServerLabelRuleService,
587
+ DatabaseServerOwnerRuleService,
588
+ DatabaseServerOwnerTeamService,
589
+ DatabaseServerOwnerUserService,
576
590
  LlmProviderService,
577
591
  DataSourceService,
578
592
 
@@ -600,6 +614,7 @@ const services: Array<BaseService> = [
600
614
  DockerHostFeedService,
601
615
  DockerSwarmClusterFeedService,
602
616
  CephClusterFeedService,
617
+ DatabaseServerFeedService,
603
618
  PodmanHostFeedService,
604
619
  ProxmoxClusterFeedService,
605
620
  VMwareVCenterFeedService,
@@ -691,6 +706,7 @@ const services: Array<BaseService> = [
691
706
 
692
707
  UserService,
693
708
  UserSessionService,
709
+ UserProjectSsoConsentService,
694
710
  UserCallService,
695
711
  UserEmailService,
696
712
  UserNotificationRuleService,
@@ -31,6 +31,11 @@ import {
31
31
  shouldWarnEntityBudgetOnce,
32
32
  } from "../Utils/Telemetry/EntityRegistry";
33
33
 
34
+ // A database node's port, as its calls named it (deriveDatabaseDisplayName).
35
+ const PORT_REGEX: RegExp = /^\d{1,5}$/;
36
+ // A bare IPv6 address - bracketed before a port.
37
+ const IPV6_LITERAL_REGEX: RegExp = /^[0-9a-f:.]+$/i;
38
+
34
39
  export class InventoryItemService extends DatabaseService<Model> {
35
40
  public constructor() {
36
41
  super(Model);
@@ -427,6 +432,39 @@ export class InventoryItemService extends DatabaseService<Model> {
427
432
  }
428
433
  }
429
434
 
435
+ /*
436
+ * A database dependency node named by the old rule - its bare namespace,
437
+ * "orders" for every Postgres a project calls - is renamed to
438
+ * "<namespace> @ <server>" the next time it is seen. Same guard as above:
439
+ * only a name this service generated is replaced, never one a person
440
+ * typed, and a later sighting that cannot name the port does not undo a
441
+ * name that has it.
442
+ */
443
+ if (entity.entityType === EntityType.Database) {
444
+ const desiredDisplayName: string =
445
+ InventoryItemService.deriveDatabaseDisplayName(entity).substring(
446
+ 0,
447
+ ColumnLength.ShortText,
448
+ );
449
+ const existingDisplayName: string = existing.displayName || "";
450
+ const generatedBefore: Array<string> = [
451
+ InventoryItemService.deriveLegacyDatabaseDisplayName(entity),
452
+ InventoryItemService.deriveDatabaseDisplayName(entity, {
453
+ withPort: false,
454
+ }),
455
+ ].map((name: string): string => {
456
+ return name.substring(0, ColumnLength.ShortText);
457
+ });
458
+
459
+ if (
460
+ desiredDisplayName &&
461
+ existingDisplayName !== desiredDisplayName &&
462
+ (!existingDisplayName || generatedBefore.includes(existingDisplayName))
463
+ ) {
464
+ update.displayName = desiredDisplayName;
465
+ }
466
+ }
467
+
430
468
  const incoming: Record<string, string> = entity.descriptiveAttributes || {};
431
469
  if (Object.keys(incoming).length > 0) {
432
470
  const current: Record<string, unknown> =
@@ -498,6 +536,13 @@ export class InventoryItemService extends DatabaseService<Model> {
498
536
  }
499
537
  }
500
538
 
539
+ if (entity.entityType === EntityType.Database) {
540
+ const databaseName: string = this.deriveDatabaseDisplayName(entity);
541
+ if (databaseName) {
542
+ return databaseName;
543
+ }
544
+ }
545
+
501
546
  for (const key of this.dependencyDisplayNameOrderByType[
502
547
  entity.entityType
503
548
  ] || []) {
@@ -509,13 +554,76 @@ export class InventoryItemService extends DatabaseService<Model> {
509
554
  return this.deriveFallbackDisplayName(entity);
510
555
  }
511
556
 
557
+ /*
558
+ * A database dependency node is named after the logical database AND the
559
+ * server it lives on: "<db.namespace> @ <host[:port]>". The namespace alone
560
+ * ("orders") is shared by every copy of an application's schema - an e2e
561
+ * project showed ten different PostgreSQL servers all named "orders" on
562
+ * the Service Map and in Inventory. The host is the node's identifying
563
+ * `server.address`; the port is the descriptive `server.port` its calls
564
+ * named (left off when they named none, or several). Only the name
565
+ * changes: the node's identity (engine, host, namespace) does not.
566
+ * Without a namespace it is the server alone, without a host the
567
+ * namespace, and with neither the engine. '' when nothing names it.
568
+ */
569
+ public static deriveDatabaseDisplayName(
570
+ entity: ExtractedEntity,
571
+ options?: { withPort?: boolean | undefined },
572
+ ): string {
573
+ const id: Record<string, string> = entity.identifyingAttributes || {};
574
+ const descriptive: Record<string, string> =
575
+ entity.descriptiveAttributes || {};
576
+
577
+ const namespace: string = (id["db.namespace"] || "").trim();
578
+ const host: string = (id["server.address"] || "").trim();
579
+ const port: string = (descriptive["server.port"] || "").trim();
580
+
581
+ let server: string = host;
582
+ if (host && options?.withPort !== false && PORT_REGEX.test(port)) {
583
+ if (!host.includes(":")) {
584
+ server = `${host}:${port}`;
585
+ } else if (IPV6_LITERAL_REGEX.test(host)) {
586
+ // A bare IPv6 address takes brackets before a port.
587
+ server = `[${host}]:${port}`;
588
+ }
589
+ // Anything else with a colon (a host list) already names its ports.
590
+ }
591
+
592
+ if (namespace && server) {
593
+ return `${namespace} @ ${server}`;
594
+ }
595
+
596
+ return server || namespace || (id["db.system.name"] || "").trim();
597
+ }
598
+
599
+ /*
600
+ * What deriveDisplayName named a database node before it named the server
601
+ * too: the first of namespace, host, engine. Only a row still carrying
602
+ * this (or the port-less new name) is renamed - see buildDescriptiveUpdate.
603
+ */
604
+ private static deriveLegacyDatabaseDisplayName(
605
+ entity: ExtractedEntity,
606
+ ): string {
607
+ const id: Record<string, string> = entity.identifyingAttributes || {};
608
+
609
+ for (const key of this.dependencyDisplayNameOrderByType[
610
+ EntityType.Database
611
+ ] || []) {
612
+ if (id[key]) {
613
+ return id[key]!;
614
+ }
615
+ }
616
+
617
+ return this.deriveFallbackDisplayName(entity);
618
+ }
619
+
512
620
  /*
513
621
  * Dependency endpoints have composite identities in which the most
514
- * recognisable part is not a `*.name` key: a database reads best as its
515
- * namespace ("orders"), then the host it lives on, and only as a last
516
- * resort as its engine ("postgresql" is shared by every Postgres a project
517
- * calls). Remote endpoints read best as the service name their callers gave
518
- * them, then their host.
622
+ * recognisable part is not a `*.name` key. A database is named by
623
+ * deriveDatabaseDisplayName; its order here is the old rule (namespace,
624
+ * then host, then engine), which deriveLegacyDatabaseDisplayName reads to
625
+ * recognise the names it generated. Remote endpoints read best as the
626
+ * service name their callers gave them, then their host.
519
627
  */
520
628
  private static readonly dependencyDisplayNameOrderByType: Partial<
521
629
  Record<EntityType, Array<string>>
@@ -78,6 +78,123 @@ const UPSERT_COLUMNS: Array<string> = [
78
78
  "version",
79
79
  ];
80
80
 
81
+ /*
82
+ * One entry per column of the `FROM (VALUES ...) AS v(...)` source in
83
+ * bulkUpdateLatestMetrics(). The placeholder tuple, the alias list, the
84
+ * bound params and the SET clause are all generated from this table, so
85
+ * they cannot drift apart: a hand-written tuple once carried 9
86
+ * placeholders against 10 aliases and 10 params, and Postgres rejected
87
+ * every mirror write (GitHub #3998).
88
+ *
89
+ * mirrorColumn: the IoTDevice column the value is COALESCEd into, or
90
+ * null for the join keys and observedAt, which the statement uses
91
+ * directly.
92
+ */
93
+ export interface LatestMetricColumn {
94
+ alias: string;
95
+ cast: string | null;
96
+ mirrorColumn: string | null;
97
+ value: (metric: IoTDeviceLatestMetric) => unknown;
98
+ }
99
+
100
+ const nullableNumber: (value: number | null | undefined) => number | null = (
101
+ value: number | null | undefined,
102
+ ): number | null => {
103
+ return value !== null && value !== undefined ? value : null;
104
+ };
105
+
106
+ // bigint params go over the wire as integer strings: a JS number past 2^53 loses precision.
107
+ const nullableBigInt: (value: number | null | undefined) => string | null = (
108
+ value: number | null | undefined,
109
+ ): string | null => {
110
+ return value !== null && value !== undefined
111
+ ? Math.trunc(value).toString()
112
+ : null;
113
+ };
114
+
115
+ export const LATEST_METRIC_COLUMNS: ReadonlyArray<LatestMetricColumn> = [
116
+ {
117
+ alias: "kind",
118
+ cast: null,
119
+ mirrorColumn: null,
120
+ value: (m: IoTDeviceLatestMetric): unknown => {
121
+ return m.kind;
122
+ },
123
+ },
124
+ {
125
+ alias: "externalId",
126
+ cast: null,
127
+ mirrorColumn: null,
128
+ value: (m: IoTDeviceLatestMetric): unknown => {
129
+ return m.externalId;
130
+ },
131
+ },
132
+ {
133
+ alias: "cpu",
134
+ cast: "numeric",
135
+ mirrorColumn: "latestCpuPercent",
136
+ value: (m: IoTDeviceLatestMetric): unknown => {
137
+ return nullableNumber(m.cpuPercent);
138
+ },
139
+ },
140
+ {
141
+ alias: "mem",
142
+ cast: "bigint",
143
+ mirrorColumn: "latestMemoryBytes",
144
+ value: (m: IoTDeviceLatestMetric): unknown => {
145
+ return nullableBigInt(m.memoryBytes);
146
+ },
147
+ },
148
+ {
149
+ alias: "maxMem",
150
+ cast: "bigint",
151
+ mirrorColumn: "maxMemoryBytes",
152
+ value: (m: IoTDeviceLatestMetric): unknown => {
153
+ return nullableBigInt(m.maxMemoryBytes);
154
+ },
155
+ },
156
+ {
157
+ alias: "memPct",
158
+ cast: "numeric",
159
+ mirrorColumn: "latestMemoryPercent",
160
+ value: (m: IoTDeviceLatestMetric): unknown => {
161
+ return nullableNumber(m.memoryPercent);
162
+ },
163
+ },
164
+ {
165
+ alias: "battery",
166
+ cast: "numeric",
167
+ mirrorColumn: "latestBatteryPercent",
168
+ value: (m: IoTDeviceLatestMetric): unknown => {
169
+ return nullableNumber(m.batteryPercent);
170
+ },
171
+ },
172
+ {
173
+ alias: "signal",
174
+ cast: "numeric",
175
+ mirrorColumn: "latestSignalStrengthDbm",
176
+ value: (m: IoTDeviceLatestMetric): unknown => {
177
+ return nullableNumber(m.signalStrengthDbm);
178
+ },
179
+ },
180
+ {
181
+ alias: "temp",
182
+ cast: "numeric",
183
+ mirrorColumn: "latestTemperatureCelsius",
184
+ value: (m: IoTDeviceLatestMetric): unknown => {
185
+ return nullableNumber(m.temperatureCelsius);
186
+ },
187
+ },
188
+ {
189
+ alias: "observedAt",
190
+ cast: "timestamptz",
191
+ mirrorColumn: null,
192
+ value: (m: IoTDeviceLatestMetric): unknown => {
193
+ return m.observedAt;
194
+ },
195
+ },
196
+ ];
197
+
81
198
  export class Service extends DatabaseService<Model> {
82
199
  public constructor() {
83
200
  super(Model);
@@ -260,6 +377,22 @@ export class Service extends DatabaseService<Model> {
260
377
  return;
261
378
  }
262
379
 
380
+ const aliases: string = LATEST_METRIC_COLUMNS.map(
381
+ (column: LatestMetricColumn) => {
382
+ return `"${column.alias}"`;
383
+ },
384
+ ).join(", ");
385
+
386
+ const assignments: string = LATEST_METRIC_COLUMNS.filter(
387
+ (column: LatestMetricColumn) => {
388
+ return column.mirrorColumn !== null;
389
+ },
390
+ )
391
+ .map((column: LatestMetricColumn) => {
392
+ return `"${column.mirrorColumn}" = COALESCE(v."${column.alias}", p."${column.mirrorColumn}"),`;
393
+ })
394
+ .join("\n ");
395
+
263
396
  for (let i: number = 0; i < metrics.length; i += UPSERT_BATCH_SIZE) {
264
397
  const chunk: Array<IoTDeviceLatestMetric> = metrics.slice(
265
398
  i,
@@ -274,51 +407,26 @@ export class Service extends DatabaseService<Model> {
274
407
  let paramIndex: number = 3;
275
408
 
276
409
  for (const m of chunk) {
277
- valueFragments.push(
278
- `($${paramIndex++}, $${paramIndex++}, $${paramIndex++}::numeric, $${paramIndex++}::bigint, $${paramIndex++}::bigint, $${paramIndex++}::numeric, $${paramIndex++}::numeric, $${paramIndex++}::numeric, $${paramIndex++}::timestamptz)`,
279
- );
280
- params.push(
281
- m.kind,
282
- m.externalId,
283
- m.cpuPercent !== null && m.cpuPercent !== undefined
284
- ? m.cpuPercent
285
- : null,
286
- m.memoryBytes !== null && m.memoryBytes !== undefined
287
- ? Math.trunc(m.memoryBytes).toString()
288
- : null,
289
- m.maxMemoryBytes !== null && m.maxMemoryBytes !== undefined
290
- ? Math.trunc(m.maxMemoryBytes).toString()
291
- : null,
292
- m.memoryPercent !== null && m.memoryPercent !== undefined
293
- ? m.memoryPercent
294
- : null,
295
- m.batteryPercent !== null && m.batteryPercent !== undefined
296
- ? m.batteryPercent
297
- : null,
298
- m.signalStrengthDbm !== null && m.signalStrengthDbm !== undefined
299
- ? m.signalStrengthDbm
300
- : null,
301
- m.temperatureCelsius !== null && m.temperatureCelsius !== undefined
302
- ? m.temperatureCelsius
303
- : null,
304
- m.observedAt,
305
- );
410
+ const placeholders: Array<string> = [];
411
+ for (const column of LATEST_METRIC_COLUMNS) {
412
+ placeholders.push(
413
+ column.cast
414
+ ? `$${paramIndex++}::${column.cast}`
415
+ : `$${paramIndex++}`,
416
+ );
417
+ params.push(column.value(m));
418
+ }
419
+ valueFragments.push(`(${placeholders.join(", ")})`);
306
420
  }
307
421
 
308
422
  const sql: string = `
309
423
  UPDATE "IoTDevice" AS p
310
424
  SET
311
- "latestCpuPercent" = COALESCE(v."cpu", p."latestCpuPercent"),
312
- "latestMemoryBytes" = COALESCE(v."mem", p."latestMemoryBytes"),
313
- "maxMemoryBytes" = COALESCE(v."maxMem", p."maxMemoryBytes"),
314
- "latestMemoryPercent" = COALESCE(v."memPct", p."latestMemoryPercent"),
315
- "latestBatteryPercent" = COALESCE(v."battery", p."latestBatteryPercent"),
316
- "latestSignalStrengthDbm" = COALESCE(v."signal", p."latestSignalStrengthDbm"),
317
- "latestTemperatureCelsius" = COALESCE(v."temp", p."latestTemperatureCelsius"),
425
+ ${assignments}
318
426
  "metricsUpdatedAt" = v."observedAt",
319
427
  "updatedAt" = now()
320
428
  FROM (VALUES ${valueFragments.join(", ")})
321
- AS v("kind", "externalId", "cpu", "mem", "maxMem", "memPct", "battery", "signal", "temp", "observedAt")
429
+ AS v(${aliases})
322
430
  WHERE
323
431
  p."projectId" = $1
324
432
  AND p."iotFleetId" = $2