@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,694 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import DatabaseService from "./DatabaseService";
11
+ import DatabaseServerFeedService from "./DatabaseServerFeedService";
12
+ import DatabaseServerService from "./DatabaseServerService";
13
+ import Model from "../../Models/DatabaseModels/DatabaseServerEndpoint";
14
+ import DatabaseServer from "../../Models/DatabaseModels/DatabaseServer";
15
+ import { DatabaseServerFeedEventType } from "../../Models/DatabaseModels/DatabaseServerFeed";
16
+ import ModelPermission from "../Types/Database/Permissions/Index";
17
+ import RelationIdUtil from "../Utils/Database/RelationIdUtil";
18
+ import logger from "../Utils/Logger";
19
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
20
+ import SortOrder from "../../Types/BaseDatabase/SortOrder";
21
+ import { Gray500, Red500 } from "../../Types/BrandColors";
22
+ import ColumnLength from "../../Types/Database/ColumnLength";
23
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
24
+ import OneUptimeDate from "../../Types/Date";
25
+ import BadDataException from "../../Types/Exception/BadDataException";
26
+ import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
27
+ import ObjectID from "../../Types/ObjectID";
28
+ import { formatDatabaseEndpoint, parseManualDatabaseEndpoint, } from "../../Types/DatabaseServer/DatabaseEndpoint";
29
+ /*
30
+ * "Last matched" is refreshed at most this often per endpoint: often enough
31
+ * that a stale alias stands out on the Endpoints tab, rarely enough that a
32
+ * busy endpoint costs one write an hour, not one per lookup.
33
+ */
34
+ export const ENDPOINT_MATCH_REFRESH_SECONDS = 60 * 60;
35
+ // What an alias looks like, for the refusal of an empty one.
36
+ const ENDPOINT_EXAMPLE = "Enter the host name or IP address applications use to reach this database, with an optional port, for example orders-db.example.com:5432.";
37
+ /*
38
+ * The endpoints a database is reached at. Every endpoint belongs to at most
39
+ * one database per project: the (projectId, endpoint) unique index enforces
40
+ * it, and this service turns a collision into a message naming the database
41
+ * that already owns the endpoint instead of a raw constraint error.
42
+ *
43
+ * Endpoints are stored canonical (formatDatabaseEndpoint), because the
44
+ * telemetry entity key of a database is derived from the endpoint string -
45
+ * a person typing "Orders-DB.example.com" must land on the same key ingest
46
+ * computes for `server.address=orders-db.example.com`.
47
+ */
48
+ export class Service extends DatabaseService {
49
+ constructor() {
50
+ super(Model);
51
+ }
52
+ /*
53
+ * A person adding an alias. Root writes (the discovery paths, through
54
+ * claimEndpoint) pass through untouched: they already hold a canonical
55
+ * endpoint and handle ownership themselves.
56
+ *
57
+ * Adding an endpoint is an EDIT of the database it is added to: it decides
58
+ * which traffic that database's pages show and - one owner per endpoint -
59
+ * that no other database can claim it. So the caller must be allowed to
60
+ * edit that very row, label and Owned scopes included. DatabaseService
61
+ * checks the create permission only after this hook, and never scopes a
62
+ * create to the parent row, so both happen here - the create permission
63
+ * FIRST, so a caller without it learns nothing about which databases exist
64
+ * or who owns an endpoint.
65
+ */
66
+ async onBeforeCreate(createBy) {
67
+ var _a;
68
+ if (createBy.props.isRoot) {
69
+ return { createBy: createBy, carryForward: null };
70
+ }
71
+ const data = createBy.data;
72
+ ModelPermission.checkCreatePermissions(Model, data, createBy.props);
73
+ /*
74
+ * The tenant column is stamped from props.tenantId only after this hook,
75
+ * so read the request tenant first - it is the only project the caller
76
+ * was checked in.
77
+ */
78
+ const projectId = createBy.props.tenantId || data.projectId || undefined;
79
+ if (!projectId) {
80
+ throw new BadDataException("Project ID is required to add a database endpoint.");
81
+ }
82
+ /*
83
+ * The reference arrives as the FK column or as a relation object, and
84
+ * TypeORM persists the relation object's id over the column's. Read both
85
+ * spellings, refuse a payload whose two spellings disagree, and leave the
86
+ * validated column as the only one that can reach the insert.
87
+ */
88
+ const databaseServerId = RelationIdUtil.readConsistent(data, ["databaseServerId", "databaseServer"], "database");
89
+ data.setColumnValue("databaseServer", undefined);
90
+ if (!databaseServerId) {
91
+ throw new BadDataException("Select the database this endpoint belongs to.");
92
+ }
93
+ const databaseServer = await this.findEditableDatabaseServer({
94
+ projectId: projectId,
95
+ databaseServerId: databaseServerId,
96
+ props: createBy.props,
97
+ });
98
+ /*
99
+ * One answer for "no such database in this project" and "a database you
100
+ * may not edit", so the refusal is not a way to probe for ids.
101
+ */
102
+ if (!databaseServer) {
103
+ throw new NotAuthorizedException("Database not found, or you do not have permission to edit it. Adding an endpoint to a database needs permission to edit that database.");
104
+ }
105
+ /*
106
+ * Canonicalize with the database's own context: its engine supplies the
107
+ * default port, and for a database discovered on Kubernetes its
108
+ * namespace expands a bare service name (and `<service>.<namespace>` to
109
+ * the Service's full name) and its cluster qualifies a cluster-local
110
+ * name - exactly what ingest does for the pods calling it. A value that
111
+ * cannot be used - `user@host`, a cluster qualifier on a public host, a
112
+ * loopback name, a port outside 1-65535 - is refused with a message
113
+ * saying what to change, never read as something else or quietly given
114
+ * the engine's default port.
115
+ */
116
+ const manual = parseManualDatabaseEndpoint(data.endpoint, {
117
+ system: databaseServer.dbSystem || "",
118
+ kubernetesClusterName: (_a = databaseServer.kubernetesCluster) === null || _a === void 0 ? void 0 : _a.clusterIdentifier,
119
+ kubernetesNamespace: databaseServer.kubernetesNamespace,
120
+ });
121
+ const endpoint = manual.endpoint;
122
+ if (!endpoint) {
123
+ throw new BadDataException(typeof data.endpoint !== "string" || !data.endpoint.trim()
124
+ ? `Endpoint is required. ${ENDPOINT_EXAMPLE}`
125
+ : manual.error || `This is not a valid endpoint. ${ENDPOINT_EXAMPLE}`);
126
+ }
127
+ const formatted = formatDatabaseEndpoint(endpoint);
128
+ if (formatted.length > ColumnLength.LongText) {
129
+ throw new BadDataException(`This endpoint is too long. Endpoints can be at most ${ColumnLength.LongText} characters.`);
130
+ }
131
+ const owner = await this.findOwnerByEndpoint(projectId, formatted);
132
+ if (owner) {
133
+ if (owner.databaseServerId.toString() === databaseServerId.toString()) {
134
+ throw new BadDataException(`${formatted} is already an endpoint of this database.`);
135
+ }
136
+ throw new BadDataException(await getOwnedByOtherDatabaseMessage(formatted, owner, createBy.props));
137
+ }
138
+ data.databaseServerId = databaseServerId;
139
+ data.endpoint = formatted;
140
+ /*
141
+ * Forced, whatever the caller sent: a person only ever adds a removable
142
+ * alias. The primary endpoint is written by whichever path created the
143
+ * database, as root.
144
+ */
145
+ data.source = "user";
146
+ data.isPrimary = false;
147
+ return { createBy: createBy, carryForward: null };
148
+ }
149
+ /*
150
+ * A person removing endpoints. Removing one is an EDIT of the database it
151
+ * belongs to, exactly like adding one (onBeforeCreate): it decides which
152
+ * traffic that database's pages show, and frees the endpoint for another
153
+ * database to claim. DatabaseService scopes a delete to the project only -
154
+ * the endpoint has no labels of its own, and the parent's label and Owned
155
+ * scopes never reach a delete - so the caller must be allowed to edit
156
+ * every database the delete would touch, checked here: the delete
157
+ * permission FIRST (so a caller without it learns nothing), then the
158
+ * parents, and only then the primary guard, whose refusal names the
159
+ * endpoint.
160
+ *
161
+ * The primary endpoint is what the database was created from; discovery
162
+ * would claim it straight back, and a manually added database would lose
163
+ * the only endpoint its telemetry is keyed by. Aliases can be removed.
164
+ */
165
+ async onBeforeDelete(deleteBy) {
166
+ var _a;
167
+ if (deleteBy.props.isRoot) {
168
+ return { deleteBy: deleteBy, carryForward: null };
169
+ }
170
+ // The project the caller was checked in, whatever project the query named.
171
+ const query = await ModelPermission.checkDeleteQueryPermission(Model, deleteBy.query, deleteBy.props);
172
+ const matched = await this.findBy({
173
+ query: query,
174
+ select: {
175
+ _id: true,
176
+ projectId: true,
177
+ databaseServerId: true,
178
+ endpoint: true,
179
+ isPrimary: true,
180
+ },
181
+ limit: LIMIT_MAX,
182
+ skip: 0,
183
+ props: {
184
+ isRoot: true,
185
+ },
186
+ });
187
+ const checked = new Set();
188
+ for (const endpoint of matched) {
189
+ const databaseServerId = (_a = endpoint.databaseServerId) === null || _a === void 0 ? void 0 : _a.toString();
190
+ const projectId = deleteBy.props.tenantId || endpoint.projectId || undefined;
191
+ if (!databaseServerId || !projectId || checked.has(databaseServerId)) {
192
+ continue;
193
+ }
194
+ const databaseServer = await this.findEditableDatabaseServer({
195
+ projectId: projectId,
196
+ databaseServerId: new ObjectID(databaseServerId),
197
+ props: deleteBy.props,
198
+ });
199
+ // The same answer onBeforeCreate gives: no probing for ids.
200
+ if (!databaseServer) {
201
+ throw new NotAuthorizedException("Database not found, or you do not have permission to edit it. Removing an endpoint from a database needs permission to edit that database.");
202
+ }
203
+ checked.add(databaseServerId);
204
+ }
205
+ const primary = matched.find((endpoint) => {
206
+ return Boolean(endpoint.isPrimary);
207
+ });
208
+ if (primary) {
209
+ const endpoint = primary.endpoint || "The primary endpoint";
210
+ throw new BadDataException(`${endpoint} is the primary endpoint of this database and cannot be removed. Add another endpoint as an alias instead, or delete the database.`);
211
+ }
212
+ // The rows are gone by onDeleteSuccess: its feed items are built from these.
213
+ const carryForward = {
214
+ endpointsToDelete: matched,
215
+ };
216
+ return { deleteBy: deleteBy, carryForward: carryForward };
217
+ }
218
+ /*
219
+ * A person added an alias: that is an edit of the database (it decides
220
+ * which traffic the database's pages show), so it goes on the database's
221
+ * Feed like any other edit, naming the endpoint and who added it. A
222
+ * discovery claim is root and never gets here.
223
+ */
224
+ async onCreateSuccess(onCreate, createdItem) {
225
+ if (onCreate.createBy.props.isRoot) {
226
+ return createdItem;
227
+ }
228
+ await this.writeEndpointFeedItem({
229
+ change: "added",
230
+ endpoint: createdItem,
231
+ projectId: createdItem.projectId || onCreate.createBy.props.tenantId || undefined,
232
+ userId: createdItem.createdByUserId ||
233
+ onCreate.createBy.props.userId ||
234
+ undefined,
235
+ });
236
+ return createdItem;
237
+ }
238
+ /*
239
+ * A person removed aliases: one feed item per endpoint actually removed,
240
+ * on its own database. Discovery's releases and moves are root writes and
241
+ * never get here.
242
+ */
243
+ async onDeleteSuccess(onDelete, itemIdsBeforeDelete) {
244
+ var _a;
245
+ const carried = onDelete.carryForward || null;
246
+ if (onDelete.deleteBy.props.isRoot || !carried) {
247
+ return onDelete;
248
+ }
249
+ const deletedIds = new Set((itemIdsBeforeDelete || []).map((id) => {
250
+ return id.toString();
251
+ }));
252
+ const userId = ((_a = onDelete.deleteBy.deletedByUser) === null || _a === void 0 ? void 0 : _a.id) ||
253
+ onDelete.deleteBy.props.userId ||
254
+ undefined;
255
+ for (const endpoint of carried.endpointsToDelete || []) {
256
+ if (!endpoint._id || !deletedIds.has(endpoint._id.toString())) {
257
+ continue;
258
+ }
259
+ await this.writeEndpointFeedItem({
260
+ change: "removed",
261
+ endpoint: endpoint,
262
+ projectId: endpoint.projectId || onDelete.deleteBy.props.tenantId || undefined,
263
+ userId: userId,
264
+ });
265
+ }
266
+ return onDelete;
267
+ }
268
+ // One "endpoint added / removed" item on the database's Feed. Never throws.
269
+ async writeEndpointFeedItem(data) {
270
+ const databaseServerId = data.endpoint.databaseServerId || undefined;
271
+ const endpoint = (data.endpoint.endpoint || "").trim();
272
+ if (!databaseServerId || !data.projectId || !endpoint) {
273
+ return;
274
+ }
275
+ try {
276
+ const link = await DatabaseServerService.getDatabaseServerMarkdownLink(data.projectId, databaseServerId);
277
+ const added = data.change === "added";
278
+ await DatabaseServerFeedService.createDatabaseServerFeedItem({
279
+ databaseServerId: databaseServerId,
280
+ projectId: data.projectId,
281
+ databaseServerFeedEventType: DatabaseServerFeedEventType.DatabaseServerUpdated,
282
+ displayColor: added ? Gray500 : Red500,
283
+ feedInfoInMarkdown: added
284
+ ? `🔗 Added the endpoint \`${endpoint}\` to ${link}.`
285
+ : `🔗 Removed the endpoint \`${endpoint}\` from ${link}.`,
286
+ moreInformationInMarkdown: added
287
+ ? `**Endpoint**: \`${endpoint}\`\n\nCalls applications make to this endpoint now count as this database's traffic, and no other database can claim it.`
288
+ : `**Endpoint**: \`${endpoint}\`\n\nCalls to this endpoint no longer count as this database's traffic, and another database may claim it.`,
289
+ userId: data.userId,
290
+ });
291
+ }
292
+ catch (error) {
293
+ logger.warn(`DatabaseServerEndpointService: could not write the feed item for endpoint ${endpoint} ${data.change}: ${error instanceof Error ? error.message : String(error)}`);
294
+ }
295
+ }
296
+ /**
297
+ * The database that owns this canonical (formatDatabaseEndpoint) endpoint
298
+ * in the project, or null when no database lists it.
299
+ */
300
+ async findOwnerByEndpoint(projectId, formattedEndpoint) {
301
+ const endpoint = (formattedEndpoint || "").trim();
302
+ if (!endpoint) {
303
+ return null;
304
+ }
305
+ const row = await this.findOneBy({
306
+ query: {
307
+ projectId: projectId,
308
+ endpoint: endpoint,
309
+ },
310
+ select: {
311
+ _id: true,
312
+ databaseServerId: true,
313
+ isPrimary: true,
314
+ source: true,
315
+ lastMatchedAt: true,
316
+ },
317
+ props: {
318
+ isRoot: true,
319
+ },
320
+ });
321
+ if (!row || !row.databaseServerId) {
322
+ return null;
323
+ }
324
+ return {
325
+ databaseServerId: new ObjectID(row.databaseServerId.toString()),
326
+ isPrimary: Boolean(row.isPrimary),
327
+ endpointId: row._id ? new ObjectID(row._id.toString()) : undefined,
328
+ source: row.source || undefined,
329
+ lastMatchedAt: row.lastMatchedAt || undefined,
330
+ };
331
+ }
332
+ /**
333
+ * Record that telemetry just matched this endpoint to its database: moves
334
+ * lastMatchedAt to now, at most once per ENDPOINT_MATCH_REFRESH_SECONDS
335
+ * (decided from the lastMatchedAt the owner lookup already read, so a
336
+ * fresh endpoint costs nothing). A "workload" endpoint is left alone: its
337
+ * lastMatchedAt says when the workload last produced it, which is what
338
+ * decides whether discovery may release it. Never throws.
339
+ */
340
+ async markEndpointMatched(owner) {
341
+ if (!owner || !owner.endpointId || owner.source === "workload") {
342
+ return;
343
+ }
344
+ const now = OneUptimeDate.getCurrentDate();
345
+ if (owner.lastMatchedAt &&
346
+ OneUptimeDate.isAfter(owner.lastMatchedAt, OneUptimeDate.addRemoveSeconds(now, -ENDPOINT_MATCH_REFRESH_SECONDS))) {
347
+ return;
348
+ }
349
+ try {
350
+ await this.updateColumnsByIdWithoutHooks({
351
+ id: owner.endpointId,
352
+ data: {
353
+ lastMatchedAt: now,
354
+ },
355
+ skipUpdateDateColumn: true,
356
+ });
357
+ owner.lastMatchedAt = now;
358
+ }
359
+ catch (error) {
360
+ logger.warn(`DatabaseServerEndpointService: could not record a match of endpoint ${owner.endpointId.toString()}: ${error instanceof Error ? error.message : String(error)}`);
361
+ }
362
+ }
363
+ /**
364
+ * Move lastMatchedAt to `now` on those of `endpoints` this database owns
365
+ * whose lastMatchedAt is empty or older than `staleBefore` - one
366
+ * statement, however many endpoints. The workload path calls it for the
367
+ * aliases a discovery run produced again.
368
+ */
369
+ async refreshMatchedEndpoints(data) {
370
+ if (data.endpoints.length === 0) {
371
+ return;
372
+ }
373
+ await this.getRepository().manager.query(`UPDATE "DatabaseServerEndpoint"
374
+ SET "lastMatchedAt" = $1
375
+ WHERE "projectId" = $2
376
+ AND "databaseServerId" = $3
377
+ AND "endpoint" = ANY($4::text[])
378
+ AND ("lastMatchedAt" IS NULL OR "lastMatchedAt" < $5)
379
+ AND "deletedAt" IS NULL`, [
380
+ data.now,
381
+ data.projectId.toString(),
382
+ data.databaseServerId.toString(),
383
+ data.endpoints,
384
+ data.staleBefore,
385
+ ]);
386
+ }
387
+ /**
388
+ * Hand a discovered endpoint to another database: the workload that now
389
+ * serves it. A compare-and-set on the current owner, and never a "user"
390
+ * endpoint - those only a person moves. The endpoint becomes a "workload"
391
+ * endpoint of its new owner, matched now. True when it moved.
392
+ */
393
+ async transferEndpoint(data) {
394
+ /*
395
+ * Wrapped in a CTE so the statement is a SELECT: TypeORM answers a bare
396
+ * UPDATE with [rows, rowCount], which would read as "moved" every time.
397
+ */
398
+ const moved = await this.getRepository().manager.query(`WITH "moved" AS (
399
+ UPDATE "DatabaseServerEndpoint"
400
+ SET "databaseServerId" = $1,
401
+ "source" = 'workload',
402
+ "isPrimary" = $2,
403
+ "lastMatchedAt" = $3,
404
+ "updatedAt" = CURRENT_TIMESTAMP
405
+ WHERE "_id" = $4
406
+ AND "projectId" = $5
407
+ AND "databaseServerId" = $6
408
+ AND COALESCE("source", '') <> 'user'
409
+ AND "deletedAt" IS NULL
410
+ RETURNING "_id"
411
+ )
412
+ SELECT "_id" FROM "moved"`, [
413
+ data.toDatabaseServerId.toString(),
414
+ data.isPrimary,
415
+ data.now,
416
+ data.endpointId.toString(),
417
+ data.projectId.toString(),
418
+ data.fromDatabaseServerId.toString(),
419
+ ]);
420
+ return Array.isArray(moved) && moved.length > 0;
421
+ }
422
+ /**
423
+ * Release the "workload" endpoints of one database that its workload no
424
+ * longer produces: not in `keepEndpoints` and not matched since
425
+ * `staleBefore` (so one partial discovery run releases nothing). Never the
426
+ * primary endpoint, never an "auto" or "user" one. Returns the endpoints
427
+ * released.
428
+ */
429
+ async releaseUnproducedWorkloadEndpoints(data) {
430
+ // A CTE for the same reason as transferEndpoint: a SELECT's rows come back.
431
+ const released = await this.getRepository().manager.query(`WITH "released" AS (
432
+ DELETE FROM "DatabaseServerEndpoint"
433
+ WHERE "projectId" = $1
434
+ AND "databaseServerId" = $2
435
+ AND "source" = 'workload'
436
+ AND "isPrimary" = false
437
+ AND NOT ("endpoint" = ANY($3::text[]))
438
+ AND ("lastMatchedAt" IS NULL OR "lastMatchedAt" < $4)
439
+ RETURNING "endpoint"
440
+ )
441
+ SELECT "endpoint" FROM "released"`, [
442
+ data.projectId.toString(),
443
+ data.databaseServerId.toString(),
444
+ data.keepEndpoints,
445
+ data.staleBefore,
446
+ ]);
447
+ if (!Array.isArray(released)) {
448
+ return [];
449
+ }
450
+ return released
451
+ .map((row) => {
452
+ const endpoint = row === null || row === void 0 ? void 0 : row.endpoint;
453
+ return typeof endpoint === "string" ? endpoint : "";
454
+ })
455
+ .filter((endpoint) => {
456
+ return endpoint.length > 0;
457
+ });
458
+ }
459
+ // True when the database has a primary endpoint.
460
+ async hasPrimaryEndpoint(data) {
461
+ const primary = await this.findOneBy({
462
+ query: {
463
+ projectId: data.projectId,
464
+ databaseServerId: data.databaseServerId,
465
+ isPrimary: true,
466
+ },
467
+ select: {
468
+ _id: true,
469
+ },
470
+ props: {
471
+ isRoot: true,
472
+ },
473
+ });
474
+ return Boolean(primary);
475
+ }
476
+ /**
477
+ * Make a canonical endpoint this database's, as root. Never takes an
478
+ * endpoint away from another database: that answers "owned-by-other" and
479
+ * the caller decides what to do (discovery logs and skips it).
480
+ *
481
+ * Two discovery writers can race to claim the same endpoint. The unique
482
+ * index lets exactly one insert through; the loser re-reads the owner and
483
+ * reports the winner rather than throwing.
484
+ */
485
+ async claimEndpoint(data) {
486
+ const endpoint = (data.endpoint || "").trim();
487
+ if (!endpoint) {
488
+ throw new BadDataException("Endpoint is required to claim it.");
489
+ }
490
+ const existingOwner = await this.findOwnerByEndpoint(data.projectId, endpoint);
491
+ if (existingOwner) {
492
+ const result = classifyOwner(existingOwner, data.databaseServerId);
493
+ // Re-reported by the database that owns it: that is a match.
494
+ if (result === "already-owned-by-this") {
495
+ await this.markEndpointMatched(existingOwner);
496
+ }
497
+ return result;
498
+ }
499
+ try {
500
+ const row = new Model();
501
+ row.projectId = data.projectId;
502
+ row.databaseServerId = data.databaseServerId;
503
+ row.endpoint = endpoint;
504
+ row.isPrimary = data.isPrimary;
505
+ row.source = data.source;
506
+ row.lastMatchedAt = OneUptimeDate.getCurrentDate();
507
+ await this.create({
508
+ data: row,
509
+ props: {
510
+ isRoot: true,
511
+ },
512
+ });
513
+ return "claimed";
514
+ }
515
+ catch (error) {
516
+ const racedOwner = await this.findOwnerByEndpoint(data.projectId, endpoint);
517
+ if (racedOwner) {
518
+ return classifyOwner(racedOwner, data.databaseServerId);
519
+ }
520
+ // Not a lost race (a foreign key, a dead connection): surface it.
521
+ throw error;
522
+ }
523
+ }
524
+ /**
525
+ * Every endpoint of one database, primary first then alphabetical - the
526
+ * input getDatabaseServerSignalEntityKeys turns into the database's
527
+ * telemetry key set.
528
+ */
529
+ async listEndpoints(databaseServerId) {
530
+ const rows = await this.findBy({
531
+ query: {
532
+ databaseServerId: databaseServerId,
533
+ },
534
+ select: {
535
+ _id: true,
536
+ endpoint: true,
537
+ isPrimary: true,
538
+ },
539
+ sort: {
540
+ isPrimary: SortOrder.Descending,
541
+ endpoint: SortOrder.Ascending,
542
+ },
543
+ limit: LIMIT_MAX,
544
+ skip: 0,
545
+ props: {
546
+ isRoot: true,
547
+ },
548
+ });
549
+ const endpoints = [];
550
+ for (const row of rows) {
551
+ if (row.endpoint && !endpoints.includes(row.endpoint)) {
552
+ endpoints.push(row.endpoint);
553
+ }
554
+ }
555
+ return endpoints;
556
+ }
557
+ /**
558
+ * The database a caller adds an endpoint to, read only if the caller may
559
+ * EDIT it: the update permission check scopes the lookup exactly the way
560
+ * an update of that row would be scoped (project, label-scoped and
561
+ * Owned-scoped grants, block permissions). Null when the row does not
562
+ * exist in the project or the caller may not edit it - deliberately the
563
+ * same answer.
564
+ */
565
+ async findEditableDatabaseServer(data) {
566
+ const editableQuery = await ModelPermission.checkUpdateQueryPermissions(DatabaseServer, {
567
+ _id: data.databaseServerId.toString(),
568
+ projectId: data.projectId,
569
+ }, {}, data.props);
570
+ return await DatabaseServerService.findOneBy({
571
+ query: editableQuery,
572
+ select: {
573
+ _id: true,
574
+ dbSystem: true,
575
+ kubernetesNamespace: true,
576
+ kubernetesCluster: {
577
+ clusterIdentifier: true,
578
+ },
579
+ },
580
+ props: {
581
+ isRoot: true,
582
+ },
583
+ });
584
+ }
585
+ }
586
+ __decorate([
587
+ CaptureSpan(),
588
+ __metadata("design:type", Function),
589
+ __metadata("design:paramtypes", [Object]),
590
+ __metadata("design:returntype", Promise)
591
+ ], Service.prototype, "onBeforeCreate", null);
592
+ __decorate([
593
+ CaptureSpan(),
594
+ __metadata("design:type", Function),
595
+ __metadata("design:paramtypes", [Object]),
596
+ __metadata("design:returntype", Promise)
597
+ ], Service.prototype, "onBeforeDelete", null);
598
+ __decorate([
599
+ CaptureSpan(),
600
+ __metadata("design:type", Function),
601
+ __metadata("design:paramtypes", [Object, Model]),
602
+ __metadata("design:returntype", Promise)
603
+ ], Service.prototype, "onCreateSuccess", null);
604
+ __decorate([
605
+ CaptureSpan(),
606
+ __metadata("design:type", Function),
607
+ __metadata("design:paramtypes", [Object, Array]),
608
+ __metadata("design:returntype", Promise)
609
+ ], Service.prototype, "onDeleteSuccess", null);
610
+ __decorate([
611
+ CaptureSpan(),
612
+ __metadata("design:type", Function),
613
+ __metadata("design:paramtypes", [ObjectID, String]),
614
+ __metadata("design:returntype", Promise)
615
+ ], Service.prototype, "findOwnerByEndpoint", null);
616
+ __decorate([
617
+ CaptureSpan(),
618
+ __metadata("design:type", Function),
619
+ __metadata("design:paramtypes", [Object]),
620
+ __metadata("design:returntype", Promise)
621
+ ], Service.prototype, "markEndpointMatched", null);
622
+ __decorate([
623
+ CaptureSpan(),
624
+ __metadata("design:type", Function),
625
+ __metadata("design:paramtypes", [Object]),
626
+ __metadata("design:returntype", Promise)
627
+ ], Service.prototype, "refreshMatchedEndpoints", null);
628
+ __decorate([
629
+ CaptureSpan(),
630
+ __metadata("design:type", Function),
631
+ __metadata("design:paramtypes", [Object]),
632
+ __metadata("design:returntype", Promise)
633
+ ], Service.prototype, "transferEndpoint", null);
634
+ __decorate([
635
+ CaptureSpan(),
636
+ __metadata("design:type", Function),
637
+ __metadata("design:paramtypes", [Object]),
638
+ __metadata("design:returntype", Promise)
639
+ ], Service.prototype, "releaseUnproducedWorkloadEndpoints", null);
640
+ __decorate([
641
+ CaptureSpan(),
642
+ __metadata("design:type", Function),
643
+ __metadata("design:paramtypes", [Object]),
644
+ __metadata("design:returntype", Promise)
645
+ ], Service.prototype, "hasPrimaryEndpoint", null);
646
+ __decorate([
647
+ CaptureSpan(),
648
+ __metadata("design:type", Function),
649
+ __metadata("design:paramtypes", [Object]),
650
+ __metadata("design:returntype", Promise)
651
+ ], Service.prototype, "claimEndpoint", null);
652
+ __decorate([
653
+ CaptureSpan(),
654
+ __metadata("design:type", Function),
655
+ __metadata("design:paramtypes", [ObjectID]),
656
+ __metadata("design:returntype", Promise)
657
+ ], Service.prototype, "listEndpoints", null);
658
+ __decorate([
659
+ CaptureSpan(),
660
+ __metadata("design:type", Function),
661
+ __metadata("design:paramtypes", [Object]),
662
+ __metadata("design:returntype", Promise)
663
+ ], Service.prototype, "findEditableDatabaseServer", null);
664
+ function classifyOwner(owner, databaseServerId) {
665
+ return owner.databaseServerId.toString() === databaseServerId.toString()
666
+ ? "already-owned-by-this"
667
+ : "owned-by-other";
668
+ }
669
+ /*
670
+ * "orders-db.example.com:5432 already belongs to the database "PostgreSQL
671
+ * orders-db.example.com:5432"" - naming the owner is the only way a person can
672
+ * find and fix the conflict. But only a database the caller can READ is
673
+ * named: with label- or Owned-scoped permissions the owner may be a row they
674
+ * are not allowed to see, and then it is just "another database". Without
675
+ * props (a root path) the name is read as root.
676
+ */
677
+ export async function getOwnedByOtherDatabaseMessage(formattedEndpoint, owner, props) {
678
+ let ownerName = "";
679
+ try {
680
+ ownerName = await DatabaseServerService.getDatabaseServerNameIfReadable({
681
+ databaseServerId: owner.databaseServerId,
682
+ props: props,
683
+ });
684
+ }
685
+ catch (_a) {
686
+ // The name only decorates the message; the refusal stands without it.
687
+ }
688
+ const ownerLabel = ownerName
689
+ ? `the database "${ownerName}"`
690
+ : "another database";
691
+ return `${formattedEndpoint} already belongs to ${ownerLabel}. An endpoint can belong to only one database in a project - remove it from that database first.`;
692
+ }
693
+ export default new Service();
694
+ //# sourceMappingURL=DatabaseServerEndpointService.js.map