@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
@@ -0,0 +1,362 @@
1
+ import Entities from "../../../Models/DatabaseModels/Index";
2
+ import Service from "../../../Models/DatabaseModels/Service";
3
+ import GlobalCache from "../../../Server/Infrastructure/GlobalCache";
4
+ import PostgresAppInstance from "../../../Server/Infrastructure/PostgresDatabase";
5
+ import DatabaseService from "../../../Server/Services/DatabaseService";
6
+ import logger from "../../../Server/Utils/Logger";
7
+ import SingleFlight from "../../../Server/Utils/SingleFlight";
8
+ import ResourceHeartbeat from "../../../Server/Utils/Telemetry/ResourceHeartbeat";
9
+ import ObjectID from "../../../Types/ObjectID";
10
+ import { DataSource, QueryRunner } from "typeorm";
11
+
12
+ /*
13
+ * `updateColumnsByIdIfUnlockedWithoutHooks` against a real Postgres: the
14
+ * FOR UPDATE SKIP LOCKED write under every heartbeat (ResourceHeartbeat,
15
+ * ServiceService, EntityRegistry) must YIELD to a writer that holds the row
16
+ * - and must SAY it yielded, or no caller's retry path can run.
17
+ *
18
+ * It said "written" every time: TypeORM's postgres runner answers a bare
19
+ * `UPDATE ... RETURNING` with [rows, rowCount], a non-empty array however
20
+ * many rows were written. The unit suites fake `manager.query`, so only a
21
+ * real driver shows it.
22
+ *
23
+ * Opt in with RUN_POSTGRES_UPDATE_IF_UNLOCKED_TESTS=true against a Postgres
24
+ * migrated to the current head - the Postgres Schema Drift workflow's
25
+ * database right after its drift check. The Service table's STRUCTURE is
26
+ * cloned into a unique schema (search_path holds only that schema) that is
27
+ * dropped afterwards. Credentials from DATABASE_USERNAME /
28
+ * DATABASE_PASSWORD, database from UPDATE_IF_UNLOCKED_TEST_DATABASE_NAME or
29
+ * DATABASE_NAME, endpoint from UPDATE_IF_UNLOCKED_TEST_DATABASE_HOST /
30
+ * _PORT (default localhost:5400, Scripts/Dev/docker-compose.dev.yml).
31
+ */
32
+ const describePostgres: typeof describe =
33
+ process.env["RUN_POSTGRES_UPDATE_IF_UNLOCKED_TESTS"] === "true"
34
+ ? describe
35
+ : describe.skip;
36
+
37
+ // A write that blocks instead of yielding fails within this, never hangs.
38
+ const LOCK_TIMEOUT_MS: number = 5000;
39
+
40
+ describePostgres(
41
+ "updateColumnsByIdIfUnlockedWithoutHooks against Postgres",
42
+ () => {
43
+ const schema: string = `update_if_unlocked_${ObjectID.generate()
44
+ .toString()
45
+ .replace(/-/g, "")}`;
46
+ let database: DataSource;
47
+ let service: DatabaseService<Service>;
48
+ let cache: Map<string, string>;
49
+
50
+ beforeAll(async () => {
51
+ database = new DataSource({
52
+ type: "postgres",
53
+ host:
54
+ process.env["UPDATE_IF_UNLOCKED_TEST_DATABASE_HOST"] || "localhost",
55
+ port: Number(
56
+ process.env["UPDATE_IF_UNLOCKED_TEST_DATABASE_PORT"] || "5400",
57
+ ),
58
+ username: process.env["DATABASE_USERNAME"] || "postgres",
59
+ password: process.env["DATABASE_PASSWORD"] || "password",
60
+ database:
61
+ process.env["UPDATE_IF_UNLOCKED_TEST_DATABASE_NAME"] ||
62
+ process.env["DATABASE_NAME"] ||
63
+ "oneuptimedb",
64
+ entities: Entities,
65
+ schema,
66
+ synchronize: false,
67
+ extra: {
68
+ options: `-c search_path=${schema} -c lock_timeout=${LOCK_TIMEOUT_MS}`,
69
+ },
70
+ });
71
+ await database.initialize();
72
+ await database.query(`CREATE SCHEMA "${schema}"`);
73
+ await database.query(
74
+ `CREATE TABLE "${schema}"."Service" (LIKE public."Service" INCLUDING ALL)`,
75
+ );
76
+ // A fixture names only what the statement touches; the key stays NOT NULL.
77
+ const columns: Array<{ column_name: string }> = await database.query(
78
+ `SELECT column_name FROM information_schema.columns
79
+ WHERE table_schema = $1 AND table_name = 'Service' AND is_nullable = 'NO' AND column_name <> '_id'`,
80
+ [schema],
81
+ );
82
+ for (const column of columns) {
83
+ await database.query(
84
+ `ALTER TABLE "${schema}"."Service" ALTER COLUMN "${column.column_name}" DROP NOT NULL`,
85
+ );
86
+ }
87
+ expect(
88
+ (await database.query("SELECT current_schema()"))[0].current_schema,
89
+ ).toBe(schema);
90
+ });
91
+
92
+ afterAll(async () => {
93
+ if (database?.isInitialized) {
94
+ await database.query(`DROP SCHEMA IF EXISTS "${schema}" CASCADE`);
95
+ await database.destroy();
96
+ }
97
+ });
98
+
99
+ beforeEach(async () => {
100
+ for (const level of ["debug", "info", "warn"] as const) {
101
+ jest.spyOn(logger, level).mockImplementation(() => {
102
+ return undefined as never;
103
+ });
104
+ }
105
+ jest.spyOn(PostgresAppInstance, "isConnected").mockReturnValue(true);
106
+ jest
107
+ .spyOn(PostgresAppInstance, "getDataSource")
108
+ .mockReturnValue(database);
109
+
110
+ // Redis, modelled: SET NX only on an absent key, compare-and-claim on a change.
111
+ cache = new Map<string, string>();
112
+ jest
113
+ .spyOn(GlobalCache, "setStringIfNotExists")
114
+ .mockImplementation(
115
+ async (namespace: string, key: string, value: string) => {
116
+ const full: string = `${namespace}:${key}`;
117
+ if (cache.has(full)) {
118
+ return false;
119
+ }
120
+ cache.set(full, value);
121
+ return true;
122
+ },
123
+ );
124
+ jest
125
+ .spyOn(GlobalCache, "setStringIfChanged")
126
+ .mockImplementation(
127
+ async (namespace: string, key: string, value: string) => {
128
+ const full: string = `${namespace}:${key}`;
129
+ if (cache.get(full) === value) {
130
+ return false;
131
+ }
132
+ cache.set(full, value);
133
+ return true;
134
+ },
135
+ );
136
+ jest
137
+ .spyOn(GlobalCache, "deleteKey")
138
+ .mockImplementation(async (namespace: string, key: string) => {
139
+ cache.delete(`${namespace}:${key}`);
140
+ });
141
+ SingleFlight.clear();
142
+ ResourceHeartbeat.clearRecentHeartbeatMemo();
143
+
144
+ service = new DatabaseService<Service>(Service);
145
+ await database.query(`DELETE FROM "${schema}"."Service"`);
146
+ });
147
+
148
+ afterEach(() => {
149
+ jest.restoreAllMocks();
150
+ });
151
+
152
+ async function insertService(): Promise<ObjectID> {
153
+ const id: ObjectID = ObjectID.generate();
154
+ await database.query(
155
+ `INSERT INTO "${schema}"."Service" ("_id", "name", "updatedAt") VALUES ($1, 'orders', $2)`,
156
+ [id.toString(), new Date("2020-01-01T00:00:00.000Z")],
157
+ );
158
+ return id;
159
+ }
160
+
161
+ async function readService(id: ObjectID): Promise<{
162
+ lastSeenAt: Date | null;
163
+ serviceVersion: string | null;
164
+ updatedAt: Date;
165
+ }> {
166
+ const rows: Array<{
167
+ lastSeenAt: Date | null;
168
+ serviceVersion: string | null;
169
+ updatedAt: Date;
170
+ }> = await database.query(
171
+ `SELECT "lastSeenAt", "serviceVersion", "updatedAt" FROM "${schema}"."Service" WHERE "_id" = $1`,
172
+ [id.toString()],
173
+ );
174
+ return rows[0]!;
175
+ }
176
+
177
+ // Another writer holding the row's lock until release() is called.
178
+ async function holdRowLock(
179
+ id: ObjectID,
180
+ ): Promise<{ release: () => Promise<void> }> {
181
+ const holder: QueryRunner = database.createQueryRunner();
182
+ await holder.connect();
183
+ await holder.startTransaction();
184
+ await holder.query(
185
+ `SELECT "_id" FROM "${schema}"."Service" WHERE "_id" = $1 FOR UPDATE`,
186
+ [id.toString()],
187
+ );
188
+ return {
189
+ release: async (): Promise<void> => {
190
+ await holder.rollbackTransaction();
191
+ await holder.release();
192
+ },
193
+ };
194
+ }
195
+
196
+ test("an unlocked row is written and reported written", async () => {
197
+ const id: ObjectID = await insertService();
198
+ const seenAt: Date = new Date("2026-09-24T12:00:00.000Z");
199
+
200
+ await expect(
201
+ service.updateColumnsByIdIfUnlockedWithoutHooks({
202
+ id: id,
203
+ data: { lastSeenAt: seenAt, serviceVersion: "1.2.3" },
204
+ }),
205
+ ).resolves.toBe(true);
206
+
207
+ const row: {
208
+ lastSeenAt: Date | null;
209
+ serviceVersion: string | null;
210
+ updatedAt: Date;
211
+ } = await readService(id);
212
+ expect(row.lastSeenAt!.toISOString()).toBe(seenAt.toISOString());
213
+ expect(row.serviceVersion).toBe("1.2.3");
214
+ expect(row.updatedAt.getTime()).toBeGreaterThan(
215
+ new Date("2020-01-01T00:00:00.000Z").getTime(),
216
+ );
217
+ });
218
+
219
+ test("a row another writer holds is skipped at once, reported skipped, and left as it was", async () => {
220
+ const id: ObjectID = await insertService();
221
+ const lock: { release: () => Promise<void> } = await holdRowLock(id);
222
+
223
+ let wrote: boolean | "blocked";
224
+ const startedAt: number = Date.now();
225
+ try {
226
+ wrote = await Promise.race([
227
+ service.updateColumnsByIdIfUnlockedWithoutHooks({
228
+ id: id,
229
+ data: { lastSeenAt: new Date(), serviceVersion: "9.9.9" },
230
+ }),
231
+ new Promise<"blocked">((resolve: (value: "blocked") => void) => {
232
+ setTimeout(() => {
233
+ resolve("blocked");
234
+ }, LOCK_TIMEOUT_MS / 2);
235
+ }),
236
+ ]);
237
+ } finally {
238
+ await lock.release();
239
+ }
240
+
241
+ expect(wrote).toBe(false);
242
+ expect(Date.now() - startedAt).toBeLessThan(LOCK_TIMEOUT_MS / 2);
243
+
244
+ const row: {
245
+ lastSeenAt: Date | null;
246
+ serviceVersion: string | null;
247
+ updatedAt: Date;
248
+ } = await readService(id);
249
+ expect(row.lastSeenAt).toBeNull();
250
+ expect(row.serviceVersion).toBeNull();
251
+ });
252
+
253
+ test("once the lock is gone the same write lands", async () => {
254
+ const id: ObjectID = await insertService();
255
+ const lock: { release: () => Promise<void> } = await holdRowLock(id);
256
+
257
+ const whileLocked: boolean =
258
+ await service.updateColumnsByIdIfUnlockedWithoutHooks({
259
+ id: id,
260
+ data: { serviceVersion: "2.0.0" },
261
+ });
262
+ await lock.release();
263
+ const afterRelease: boolean =
264
+ await service.updateColumnsByIdIfUnlockedWithoutHooks({
265
+ id: id,
266
+ data: { serviceVersion: "2.0.0" },
267
+ });
268
+
269
+ expect([whileLocked, afterRelease]).toEqual([false, true]);
270
+ expect((await readService(id)).serviceVersion).toBe("2.0.0");
271
+ });
272
+
273
+ test("a row that does not exist is reported not written", async () => {
274
+ await expect(
275
+ service.updateColumnsByIdIfUnlockedWithoutHooks({
276
+ id: ObjectID.generate(),
277
+ data: { lastSeenAt: new Date() },
278
+ }),
279
+ ).resolves.toBe(false);
280
+ });
281
+
282
+ test("skipUpdateDateColumn leaves updatedAt alone", async () => {
283
+ const id: ObjectID = await insertService();
284
+
285
+ await expect(
286
+ service.updateColumnsByIdIfUnlockedWithoutHooks({
287
+ id: id,
288
+ data: { lastSeenAt: new Date() },
289
+ skipUpdateDateColumn: true,
290
+ }),
291
+ ).resolves.toBe(true);
292
+
293
+ expect((await readService(id)).updatedAt.toISOString()).toBe(
294
+ "2020-01-01T00:00:00.000Z",
295
+ );
296
+ });
297
+
298
+ /*
299
+ * The caller the fix exists for. A heartbeat whose enrichment write was
300
+ * skipped releases its enrichment gates, so the next batch writes the
301
+ * value instead of the window swallowing it; liveness, which the lock
302
+ * holder is writing anyway, is not retried.
303
+ */
304
+ describe("through ResourceHeartbeat", () => {
305
+ const NAMESPACE: string = "update-if-unlocked-test-last-seen";
306
+
307
+ async function heartbeat(id: ObjectID, version: string): Promise<void> {
308
+ await ResourceHeartbeat.write({
309
+ service: service,
310
+ id: id,
311
+ cacheNamespace: NAMESPACE,
312
+ throttleInSeconds: 60,
313
+ liveness: { lastSeenAt: new Date() },
314
+ metadata: { serviceVersion: version },
315
+ fingerprint: version,
316
+ describe: `service ${id.toString()}`,
317
+ });
318
+ }
319
+
320
+ test("an enrichment write lost to a lock is retried by the next batch", async () => {
321
+ const id: ObjectID = await insertService();
322
+ const lock: { release: () => Promise<void> } = await holdRowLock(id);
323
+
324
+ try {
325
+ await heartbeat(id, "3.1.0");
326
+ } finally {
327
+ await lock.release();
328
+ }
329
+
330
+ // Skipped, so the enrichment gates were re-opened...
331
+ expect((await readService(id)).serviceVersion).toBeNull();
332
+ expect(cache.has(`${NAMESPACE}-fingerprint:${id.toString()}`)).toBe(
333
+ false,
334
+ );
335
+ expect(cache.has(`${NAMESPACE}-write-window:${id.toString()}`)).toBe(
336
+ false,
337
+ );
338
+ // ...while the liveness window stays claimed.
339
+ expect(cache.has(`${NAMESPACE}:${id.toString()}`)).toBe(true);
340
+
341
+ // ...and the next batch, unlocked, writes the version.
342
+ await heartbeat(id, "3.1.0");
343
+
344
+ expect((await readService(id)).serviceVersion).toBe("3.1.0");
345
+ });
346
+
347
+ test("a heartbeat that landed keeps its gates for the window", async () => {
348
+ const id: ObjectID = await insertService();
349
+
350
+ await heartbeat(id, "4.0.0");
351
+
352
+ expect((await readService(id)).serviceVersion).toBe("4.0.0");
353
+ expect(cache.has(`${NAMESPACE}-fingerprint:${id.toString()}`)).toBe(
354
+ true,
355
+ );
356
+ expect(cache.has(`${NAMESPACE}-write-window:${id.toString()}`)).toBe(
357
+ true,
358
+ );
359
+ });
360
+ });
361
+ },
362
+ );
@@ -0,0 +1,210 @@
1
+ import DatabaseService from "../../../Server/Services/DatabaseService";
2
+ import Service from "../../../Models/DatabaseModels/Service";
3
+ import ObjectID from "../../../Types/ObjectID";
4
+ import { getJestSpyOn } from "../../Spy";
5
+ import { beforeEach, describe, expect, it, jest } from "@jest/globals";
6
+ import { PostgresDriver } from "typeorm/driver/postgres/PostgresDriver";
7
+ import { PostgresQueryRunner } from "typeorm/driver/postgres/PostgresQueryRunner";
8
+
9
+ /*
10
+ * Whether `updateColumnsByIdIfUnlockedWithoutHooks` can tell a skipped write
11
+ * from an applied one, through TypeORM's REAL postgres query runner.
12
+ *
13
+ * The neighbouring SQL suite fakes `manager.query` and hands back a plain
14
+ * rows array - which is not what TypeORM does. Its postgres runner answers a
15
+ * statement whose top-level command is UPDATE (or DELETE) with
16
+ * `[rows, rowCount]`: an array of length two whether or not a row was
17
+ * written. The primitive used to issue a bare `UPDATE ... RETURNING` and test
18
+ * `result.length > 0`, so every write that SKIP LOCKED skipped - or that hit
19
+ * a row that no longer exists - read as applied, and no caller's retry path
20
+ * (ResourceHeartbeat, ServiceService, EntityRegistry) could ever run.
21
+ *
22
+ * Here the runner is TypeORM's own; only the pg client under it is faked,
23
+ * and it answers the way Postgres does: `command` is the statement's
24
+ * top-level tag (a data-modifying CTE read by a SELECT is a SELECT), `rows`
25
+ * the RETURNING rows, `rowCount` their number. No Postgres, no Redis - the
26
+ * real-Postgres counterpart is DatabaseServiceUpdateColumnsIfUnlockedPostgres.
27
+ */
28
+
29
+ const SERVICE_ID: ObjectID = new ObjectID(
30
+ "33333333-3333-4333-8333-333333333333",
31
+ );
32
+
33
+ interface PgReply {
34
+ command: string;
35
+ rows: Array<Record<string, unknown>>;
36
+ rowCount: number;
37
+ }
38
+
39
+ // Postgres' command tag: the first keyword of the statement.
40
+ function commandOf(sql: string): string {
41
+ const keyword: string = (sql.trim().split(/\s+/)[0] || "").toUpperCase();
42
+ return keyword === "WITH" ? "SELECT" : keyword;
43
+ }
44
+
45
+ describe("updateColumnsByIdIfUnlockedWithoutHooks through TypeORM's postgres runner", () => {
46
+ let service: DatabaseService<Service>;
47
+ let runner: PostgresQueryRunner;
48
+ let statements: Array<string>;
49
+ // What the UPDATE's RETURNING yields: the row, or nothing (locked / gone).
50
+ let rowWritten: boolean;
51
+
52
+ beforeEach(() => {
53
+ jest.restoreAllMocks();
54
+ statements = [];
55
+ rowWritten = true;
56
+
57
+ const fakeDriver: unknown = {
58
+ options: {},
59
+ isReplicated: false,
60
+ connection: {
61
+ subscribers: [],
62
+ logger: {
63
+ logQuery: (): void => {},
64
+ logQuerySlow: (): void => {},
65
+ logQueryError: (): void => {},
66
+ },
67
+ },
68
+ };
69
+
70
+ runner = new PostgresQueryRunner(fakeDriver as PostgresDriver, "master");
71
+
72
+ const fakeClient: unknown = {
73
+ on: (): void => {},
74
+ removeListener: (): void => {},
75
+ query: async (sql: string): Promise<PgReply> => {
76
+ statements.push(sql);
77
+ const rows: Array<Record<string, unknown>> = rowWritten
78
+ ? [{ _id: SERVICE_ID.toString() }]
79
+ : [];
80
+ return { command: commandOf(sql), rows: rows, rowCount: rows.length };
81
+ },
82
+ };
83
+
84
+ // The runner's connection, as connect() would have set it from the pool.
85
+ (runner as unknown as { databaseConnection: unknown }).databaseConnection =
86
+ fakeClient;
87
+
88
+ service = new DatabaseService<Service>(Service);
89
+
90
+ const columns: Record<string, string> = {
91
+ lastSeenAt: "lastSeenAt",
92
+ serviceVersion: "serviceVersion",
93
+ };
94
+
95
+ getJestSpyOn(service, "getRepository").mockReturnValue({
96
+ metadata: {
97
+ tableName: "Service",
98
+ findColumnWithPropertyName: (
99
+ propertyName: string,
100
+ ): { databaseName: string } | undefined => {
101
+ return columns[propertyName]
102
+ ? { databaseName: columns[propertyName]! }
103
+ : undefined;
104
+ },
105
+ updateDateColumn: { databaseName: "updatedAt" },
106
+ primaryColumns: [{ databaseName: "_id" }],
107
+ },
108
+ manager: {
109
+ connection: {
110
+ driver: {
111
+ preparePersistentValue: (value: unknown): unknown => {
112
+ return value;
113
+ },
114
+ },
115
+ },
116
+ query: (sql: string, params: Array<unknown>): Promise<unknown> => {
117
+ return runner.query(sql, params);
118
+ },
119
+ },
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ } as any);
122
+ });
123
+
124
+ /*
125
+ * The premise, pinned so a TypeORM upgrade that changes it is noticed: a
126
+ * top-level UPDATE comes back as [rows, rowCount] even when nothing was
127
+ * written - a non-empty array.
128
+ */
129
+ it("TypeORM answers a bare UPDATE with [rows, rowCount], even when nothing was written", async () => {
130
+ rowWritten = false;
131
+
132
+ const reply: unknown = await runner.query(
133
+ `UPDATE "Service" SET "lastSeenAt" = $1 WHERE "_id" = $2 RETURNING "_id"`,
134
+ [new Date(), SERVICE_ID.toString()],
135
+ );
136
+
137
+ expect(reply).toEqual([[], 0]);
138
+ expect(Array.isArray(reply) && reply.length > 0).toBe(true);
139
+ });
140
+
141
+ it("a write SKIP LOCKED skipped reports false", async () => {
142
+ rowWritten = false;
143
+
144
+ await expect(
145
+ service.updateColumnsByIdIfUnlockedWithoutHooks({
146
+ id: SERVICE_ID,
147
+ data: { lastSeenAt: new Date() },
148
+ }),
149
+ ).resolves.toBe(false);
150
+ });
151
+
152
+ it("a write to a row that no longer exists reports false", async () => {
153
+ rowWritten = false;
154
+
155
+ await expect(
156
+ service.updateColumnsByIdIfUnlockedWithoutHooks({
157
+ id: SERVICE_ID,
158
+ data: { lastSeenAt: new Date(), serviceVersion: "1.2.3" },
159
+ }),
160
+ ).resolves.toBe(false);
161
+ });
162
+
163
+ it("a write that landed reports true", async () => {
164
+ rowWritten = true;
165
+
166
+ await expect(
167
+ service.updateColumnsByIdIfUnlockedWithoutHooks({
168
+ id: SERVICE_ID,
169
+ data: { lastSeenAt: new Date() },
170
+ }),
171
+ ).resolves.toBe(true);
172
+ });
173
+
174
+ /*
175
+ * How it stays observable: the statement is a SELECT over a
176
+ * data-modifying CTE, so TypeORM hands back the written rows themselves.
177
+ */
178
+ it("reads the written rows back through a SELECT over the UPDATE", async () => {
179
+ await service.updateColumnsByIdIfUnlockedWithoutHooks({
180
+ id: SERVICE_ID,
181
+ data: { lastSeenAt: new Date() },
182
+ });
183
+
184
+ expect(statements).toHaveLength(1);
185
+ expect(commandOf(statements[0]!)).toBe("SELECT");
186
+ expect(statements[0]).toMatch(
187
+ /^WITH "updated" AS \(UPDATE "Service" SET .+ RETURNING "_id"\) SELECT "_id" FROM "updated"$/,
188
+ );
189
+ // Still one statement, still driven from the SKIP LOCKED sub-SELECT.
190
+ expect(statements[0]).toContain(
191
+ `WHERE "_id" IN (SELECT "_id" FROM "Service" WHERE "_id" = $2 FOR UPDATE SKIP LOCKED)`,
192
+ );
193
+ });
194
+
195
+ it("answers each write for itself: skipped, then applied, then skipped", async () => {
196
+ const outcomes: Array<boolean> = [];
197
+
198
+ for (const written of [false, true, false]) {
199
+ rowWritten = written;
200
+ outcomes.push(
201
+ await service.updateColumnsByIdIfUnlockedWithoutHooks({
202
+ id: SERVICE_ID,
203
+ data: { lastSeenAt: new Date() },
204
+ }),
205
+ );
206
+ }
207
+
208
+ expect(outcomes).toEqual([false, true, false]);
209
+ });
210
+ });
@@ -11,6 +11,7 @@ import ProxmoxClusterService from "../../../Server/Services/ProxmoxClusterServic
11
11
  import VMwareVCenterService from "../../../Server/Services/VMwareVCenterService";
12
12
  import RumApplicationService from "../../../Server/Services/RumApplicationService";
13
13
  import ServerlessFunctionService from "../../../Server/Services/ServerlessFunctionService";
14
+ import DatabaseServerService from "../../../Server/Services/DatabaseServerService";
14
15
  import CephCluster from "../../../Models/DatabaseModels/CephCluster";
15
16
  import CloudResource from "../../../Models/DatabaseModels/CloudResource";
16
17
  import DatabaseBaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
@@ -24,6 +25,7 @@ import ProxmoxCluster from "../../../Models/DatabaseModels/ProxmoxCluster";
24
25
  import VMwareVCenter from "../../../Models/DatabaseModels/VMwareVCenter";
25
26
  import RumApplication from "../../../Models/DatabaseModels/RumApplication";
26
27
  import ServerlessFunction from "../../../Models/DatabaseModels/ServerlessFunction";
28
+ import DatabaseServer from "../../../Models/DatabaseModels/DatabaseServer";
27
29
  import LogDropFilter from "../../../Models/DatabaseModels/LogDropFilter";
28
30
  import LogDropFilterService from "../../../Server/Services/LogDropFilterService";
29
31
  import ObjectID from "../../../Types/ObjectID";
@@ -266,6 +268,22 @@ const CLAMP_CASES: Array<ClampCase> = [
266
268
  model: new RumApplication(),
267
269
  columns: ["agentVersion", "clientType", "sdkLanguage"],
268
270
  },
271
+ {
272
+ /*
273
+ * The collector heartbeat (agentVersion, dbVersion) and the container
274
+ * discovery refresh (upsertWorkloadDatabase) both write hook-free.
275
+ */
276
+ name: "DatabaseServerService",
277
+ service: DatabaseServerService,
278
+ model: new DatabaseServer(),
279
+ columns: [
280
+ "agentVersion",
281
+ "dbVersion",
282
+ "workloadKind",
283
+ "workloadName",
284
+ "kubernetesNamespace",
285
+ ],
286
+ },
269
287
  ];
270
288
 
271
289
  describe("updateColumnsByIdWithoutHooks clamps oversized strings", () => {
@@ -110,6 +110,7 @@ const SERVICE_CASES: Array<ServiceCase> = [
110
110
  cephClusters: [],
111
111
  dockerSwarmClusters: [],
112
112
  iotFleets: [],
113
+ databaseServers: [],
113
114
  services: [idStub()],
114
115
  };
115
116
  },
@@ -139,6 +140,7 @@ const SERVICE_CASES: Array<ServiceCase> = [
139
140
  cephClusters: [],
140
141
  dockerSwarmClusters: [],
141
142
  iotFleets: [],
143
+ databaseServers: [],
142
144
  services: [idStub()],
143
145
  };
144
146
  },