@oneuptime/common 14.0.3 → 14.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (617) hide show
  1. package/Models/DatabaseModels/Alert.ts +55 -0
  2. package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
  3. package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
  4. package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
  5. package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
  6. package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
  7. package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
  8. package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
  9. package/Models/DatabaseModels/Incident.ts +55 -0
  10. package/Models/DatabaseModels/Index.ts +16 -0
  11. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
  12. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  13. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  14. package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  18. package/Server/Middleware/MultipartFormData.ts +1 -1
  19. package/Server/Middleware/TelemetryIngest.ts +15 -8
  20. package/Server/Services/AlertReminderRuleService.ts +100 -24
  21. package/Server/Services/DatabaseServerEndpointService.ts +895 -0
  22. package/Server/Services/DatabaseServerFeedService.ts +128 -0
  23. package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
  24. package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
  25. package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
  26. package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
  27. package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
  28. package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
  29. package/Server/Services/DatabaseServerService.ts +4546 -0
  30. package/Server/Services/DatabaseService.ts +14 -8
  31. package/Server/Services/DockerResourceService.ts +43 -2
  32. package/Server/Services/IncidentReminderRuleService.ts +103 -23
  33. package/Server/Services/Index.ts +16 -0
  34. package/Server/Services/InventoryItemService.ts +113 -5
  35. package/Server/Services/IoTDeviceService.ts +145 -37
  36. package/Server/Services/OpenTelemetryIngestService.ts +19 -0
  37. package/Server/Services/PodmanResourceService.ts +43 -2
  38. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
  39. package/Server/Services/ServiceService.ts +1 -1
  40. package/Server/Services/TelemetryUsageBillingService.ts +29 -2
  41. package/Server/Services/UserProjectSsoConsentService.ts +74 -0
  42. package/Server/Services/UserService.ts +14 -1
  43. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
  44. package/Server/Types/Database/QueryHelper.ts +30 -1
  45. package/Server/Utils/AI/Toolbox/ResourceTools.ts +69 -1
  46. package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
  47. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +188 -6
  48. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  49. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2262 -755
  50. package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
  51. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
  52. package/Server/Utils/Monitor/MonitorResource.ts +47 -11
  53. package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
  54. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
  55. package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
  56. package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
  57. package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
  58. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  59. package/Server/Utils/StartServer.ts +26 -6
  60. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  61. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
  62. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
  63. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
  64. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
  65. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
  66. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
  67. package/Server/Utils/Telemetry/Telemetry.ts +16 -0
  68. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
  69. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
  70. package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
  71. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
  72. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
  73. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
  74. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
  75. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
  76. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
  77. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
  78. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
  79. package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
  80. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
  81. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
  82. package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
  83. package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
  84. package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
  85. package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
  86. package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
  87. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
  88. package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
  89. package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
  90. package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
  91. package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
  92. package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
  93. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
  94. package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
  95. package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
  96. package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
  97. package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
  98. package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
  99. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
  100. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
  101. package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
  102. package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
  103. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
  104. package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
  105. package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
  106. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
  107. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
  108. package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
  109. package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
  110. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
  111. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
  112. package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
  113. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
  114. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
  115. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  116. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
  117. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
  118. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
  119. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
  120. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
  121. package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
  122. package/Tests/ClassStrings.ts +178 -0
  123. package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
  124. package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
  125. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
  126. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
  127. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  128. package/Tests/RenderedMarkup.ts +518 -0
  129. package/Tests/ResponsiveVisibility.test.ts +490 -4
  130. package/Tests/ResponsiveVisibility.ts +505 -52
  131. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
  133. package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
  134. package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
  135. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
  136. package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
  137. package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
  138. package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
  139. package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
  140. package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
  141. package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
  142. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
  143. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
  144. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
  145. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
  146. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
  147. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
  148. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
  149. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
  150. package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
  151. package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
  152. package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
  153. package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
  154. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  155. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
  156. package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
  157. package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
  158. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
  159. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  160. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
  161. package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
  162. package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
  163. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
  164. package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
  165. package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
  166. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
  167. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
  168. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
  169. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
  170. package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
  171. package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
  172. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
  175. package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
  176. package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
  177. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
  178. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
  179. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
  180. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
  181. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1719 -0
  182. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
  183. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
  184. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
  185. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
  186. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
  187. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  188. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
  189. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
  190. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
  191. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
  192. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
  193. package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
  194. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
  195. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  196. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
  197. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  198. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
  199. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
  200. package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
  201. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
  202. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
  203. package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
  204. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
  205. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
  206. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
  207. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
  208. package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
  209. package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
  210. package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
  211. package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
  212. package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
  213. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
  214. package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
  215. package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
  216. package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
  217. package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
  218. package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
  219. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
  220. package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
  221. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +298 -0
  222. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +271 -0
  223. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
  224. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
  225. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
  226. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
  227. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
  228. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
  229. package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +181 -0
  230. package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
  231. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
  232. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
  233. package/Tests/UI/Components/Card.test.tsx +93 -2
  234. package/Tests/UI/Components/FeedOptions.test.ts +6 -0
  235. package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
  236. package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
  237. package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
  238. package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
  239. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
  240. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
  241. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  242. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
  243. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
  244. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
  245. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
  246. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
  247. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
  248. package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
  249. package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
  250. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
  251. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
  252. package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
  253. package/Tests/UI/Utils/Navigation.test.ts +102 -0
  254. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
  255. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  256. package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
  257. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
  258. package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
  259. package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
  260. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
  261. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
  262. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
  263. package/Tests/Utils/ValueFormatter.test.ts +50 -0
  264. package/Tests/tsconfig.json +16 -0
  265. package/Types/AI/AIResourceContext.ts +7 -0
  266. package/Types/Dashboard/DashboardTemplates.ts +2 -1
  267. package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
  268. package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
  269. package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
  270. package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
  271. package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
  272. package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
  273. package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
  274. package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
  275. package/Types/Email/EmailTemplateType.ts +1 -0
  276. package/Types/Monitor/CephAlertTemplates.ts +18 -0
  277. package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
  278. package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
  279. package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
  280. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
  281. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
  282. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
  283. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
  284. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
  285. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
  286. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
  287. package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
  288. package/Types/Permission.ts +267 -0
  289. package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
  290. package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
  291. package/Types/Rules/RuleRun.ts +12 -0
  292. package/Types/Telemetry/EntityType.ts +23 -0
  293. package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
  294. package/Types/Telemetry/ServiceType.ts +8 -0
  295. package/UI/Components/Banner/Banner.tsx +1 -1
  296. package/UI/Components/Card/Card.tsx +1 -1
  297. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
  298. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  299. package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
  300. package/UI/Components/Date/StartAndEndDate.tsx +5 -5
  301. package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
  302. package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
  303. package/UI/Components/Forms/BasicForm.tsx +1 -1
  304. package/UI/Components/Header/Header.tsx +1 -1
  305. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
  306. package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
  307. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
  308. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
  309. package/UI/Components/Modal/ModalFooter.tsx +1 -1
  310. package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
  311. package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
  312. package/UI/Components/Navbar/NavBar.tsx +9 -2
  313. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
  314. package/UI/Components/Page/Page.tsx +1 -1
  315. package/UI/Components/Pagination/Pagination.tsx +3 -3
  316. package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
  317. package/UI/Components/SideMenu/SideMenu.tsx +4 -1
  318. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
  319. package/UI/Components/StatusPage/ResourceList.tsx +6 -6
  320. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
  321. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
  322. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
  323. package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
  324. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  325. package/UI/Styles/Theme.css +8 -1
  326. package/UI/Utils/Navigation.ts +89 -42
  327. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
  328. package/UI/Utils/TelemetryService.ts +4 -3
  329. package/Utils/LabelRuleImportExport.ts +2 -0
  330. package/Utils/MetricUnitUtil.ts +103 -11
  331. package/Utils/Monitor/MetricValueFormatter.ts +66 -13
  332. package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
  333. package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
  334. package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
  335. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
  336. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
  337. package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
  338. package/Utils/Telemetry/EntityKey.ts +176 -0
  339. package/Utils/ValueFormatter.ts +16 -0
  340. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  341. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  342. package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
  343. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
  344. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
  345. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
  346. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
  347. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
  348. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
  349. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
  350. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
  351. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
  352. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
  353. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
  354. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
  355. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
  356. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  357. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  358. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  359. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  360. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  362. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
  366. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
  367. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
  368. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
  369. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
  370. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
  371. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  372. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  373. package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
  374. package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
  375. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  376. package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
  377. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  378. package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
  379. package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
  380. package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
  381. package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
  382. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
  383. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
  384. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
  385. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
  386. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
  387. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
  388. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
  389. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
  390. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
  391. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
  392. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
  393. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
  394. package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
  395. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
  396. package/build/dist/Server/Services/DatabaseService.js +8 -4
  397. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  398. package/build/dist/Server/Services/DockerResourceService.js +30 -3
  399. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  400. package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
  401. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  402. package/build/dist/Server/Services/Index.js +16 -0
  403. package/build/dist/Server/Services/Index.js.map +1 -1
  404. package/build/dist/Server/Services/InventoryItemService.js +88 -5
  405. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  406. package/build/dist/Server/Services/IoTDeviceService.js +111 -24
  407. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  408. package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
  409. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  410. package/build/dist/Server/Services/PodmanResourceService.js +30 -3
  411. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  412. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
  413. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  414. package/build/dist/Server/Services/ServiceService.js +1 -1
  415. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  416. package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
  417. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  418. package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
  419. package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
  420. package/build/dist/Server/Services/UserService.js +13 -1
  421. package/build/dist/Server/Services/UserService.js.map +1 -1
  422. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
  423. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  424. package/build/dist/Server/Types/Database/QueryHelper.js +26 -1
  425. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  426. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +46 -0
  427. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  428. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
  429. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +134 -13
  431. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
  435. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  437. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
  439. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
  441. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
  443. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
  445. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  446. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
  447. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
  448. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
  449. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  450. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
  451. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  452. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  453. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  454. package/build/dist/Server/Utils/StartServer.js +20 -4
  455. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  456. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  457. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  458. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
  459. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
  460. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
  461. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  462. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
  463. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  464. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
  465. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  466. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
  467. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  468. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
  469. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  470. package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
  471. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  472. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
  473. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  474. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
  475. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
  476. package/build/dist/Types/AI/AIResourceContext.js +7 -0
  477. package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
  478. package/build/dist/Types/Dashboard/DashboardTemplates.js +2 -1
  479. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  480. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
  481. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
  482. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
  483. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
  484. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
  485. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
  486. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
  487. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
  488. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
  489. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
  490. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
  491. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
  492. package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
  493. package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
  494. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
  495. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
  496. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  497. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  498. package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
  499. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  500. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
  501. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
  502. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
  503. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  504. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
  505. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  506. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
  507. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  508. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
  509. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  510. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
  511. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  512. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
  513. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
  514. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
  515. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  516. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
  517. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
  518. package/build/dist/Types/Permission.js +234 -0
  519. package/build/dist/Types/Permission.js.map +1 -1
  520. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
  521. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  522. package/build/dist/Types/Rules/RuleRun.js +4 -0
  523. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  524. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  525. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  526. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
  527. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
  528. package/build/dist/Types/Telemetry/ServiceType.js +8 -0
  529. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  530. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  531. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  532. package/build/dist/UI/Components/Card/Card.js +1 -1
  533. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  534. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
  535. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  536. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  537. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  538. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
  539. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  540. package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
  541. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  542. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
  543. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
  544. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
  545. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
  546. package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
  547. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  548. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  549. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  550. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
  551. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  552. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
  553. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  554. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  555. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  556. package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
  557. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  558. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
  559. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  560. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
  561. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  562. package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
  563. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  564. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  565. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  566. package/build/dist/UI/Components/Page/Page.js +1 -1
  567. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  568. package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
  569. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  570. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
  571. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
  572. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
  573. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  574. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
  575. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  576. package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
  577. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  578. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  579. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  580. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
  581. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  582. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
  583. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  584. package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
  585. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  586. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  587. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  588. package/build/dist/UI/Utils/Navigation.js +66 -33
  589. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  590. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
  591. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  592. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  593. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  594. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  595. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  596. package/build/dist/Utils/MetricUnitUtil.js +77 -13
  597. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  598. package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
  599. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
  600. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
  601. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
  602. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
  603. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
  604. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
  605. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
  606. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
  607. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  608. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
  609. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
  610. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
  611. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
  612. package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
  613. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  614. package/build/dist/Utils/ValueFormatter.js +15 -0
  615. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  616. package/package.json +1 -1
  617. package/tsconfig.tests.json +7 -5
@@ -16,6 +16,23 @@ import {
16
16
  isLoopbackHost,
17
17
  normalizeHost,
18
18
  } from "../../../Utils/Telemetry/NetworkHost";
19
+ import {
20
+ DATABASE_INSTANCE_NAME_ATTRIBUTE,
21
+ DATABASE_NAMESPACE_ATTRIBUTE,
22
+ DatabaseCallerContext,
23
+ DatabaseEndpoint,
24
+ DatabaseEndpointScope,
25
+ NETWORK_SCOPED_NAME_SUFFIXES,
26
+ formatDatabaseEndpoint,
27
+ parseHostAndPort,
28
+ ParsedHostAndPort,
29
+ } from "../../../Types/DatabaseServer/DatabaseEndpoint";
30
+ import {
31
+ DATABASE_ADDRESS_ATTRIBUTES,
32
+ DATABASE_PORT_ATTRIBUTES,
33
+ DATABASE_SYSTEM_ATTRIBUTES,
34
+ resolveDatabaseCallTarget,
35
+ } from "../../../Types/DatabaseServer/DatabaseTelemetryResolver";
19
36
  import { ExtractedEntity } from "./TelemetryEntity";
20
37
 
21
38
  export { isLoopbackHost, normalizeHost };
@@ -82,6 +99,182 @@ export function escapeSql(value: string): string {
82
99
  return value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
83
100
  }
84
101
 
102
+ /*
103
+ * The SQL both span-table discovery queries read a database call with — the
104
+ * dependency query below and DatabaseEndpointDiscovery's — kept here, the
105
+ * lower of the two modules, so neither imports the other in a cycle.
106
+ * DatabaseEndpointDiscovery re-exports them.
107
+ */
108
+
109
+ // Stored span rows carry resource attributes under a `resource.` prefix.
110
+ export const CALLER_NAMESPACE_ATTRIBUTE: string = "resource.k8s.namespace.name";
111
+ export const CALLER_CLUSTER_ATTRIBUTE: string = "resource.k8s.cluster.name";
112
+
113
+ /**
114
+ * `multiIf(attributes['a'] != '', attributes['a'], …, '')` — the first
115
+ * attribute that is present and not the empty string, exactly the
116
+ * `firstPresent` rule of the ingest resolver.
117
+ */
118
+ export function firstNonEmptyAttributeSql(keys: ReadonlyArray<string>): string {
119
+ const branches: Array<string> = keys.map((key: string): string => {
120
+ const attribute: string = `attributes['${escapeSql(key)}']`;
121
+ return `${attribute} != '', ${attribute}`;
122
+ });
123
+ return `multiIf(${[...branches, "''"].join(", ")})`;
124
+ }
125
+
126
+ /**
127
+ * The SQL Server instance a span names beside its address, in SQL — the
128
+ * twin of readDatabaseInstanceName without its engine check (the resolver
129
+ * ignores the value for any other engine): `db.mssql.instance_name`, else
130
+ * the part of `db.namespace` before its first "|", else ''.
131
+ */
132
+ export function databaseInstanceSql(): string {
133
+ const instanceName: string = `attributes['${escapeSql(
134
+ DATABASE_INSTANCE_NAME_ATTRIBUTE,
135
+ )}']`;
136
+ const namespace: string = `attributes['${escapeSql(
137
+ DATABASE_NAMESPACE_ATTRIBUTE,
138
+ )}']`;
139
+ return `multiIf(${instanceName} != '', ${instanceName}, position(${namespace}, '|') > 0, splitByChar('|', ${namespace})[1], '')`;
140
+ }
141
+
142
+ /*
143
+ * Private IPv4 ranges (RFC 1918 and CGNAT 100.64/10, leading zeros
144
+ * tolerated), IPv4 link-local 169.254/16, IPv6 unique-local (fc00::/7) and
145
+ * link-local (fe80::/10) addresses and IPv4-mapped IPv6, at the start of the
146
+ * address or after a URL / userinfo / SQL Server `tcp:` / IPv6 bracket
147
+ * boundary. Matched against the LOWERCASED address. Written in the regex
148
+ * subset RE2 (ClickHouse `match`) and JavaScript agree on, so the tests can
149
+ * run the exact pattern the query runs.
150
+ *
151
+ * A superset on purpose: over-matching (a public IPv6 address with an
152
+ * `fc..:` group, say) only keeps the caller's cluster in the grouping,
153
+ * which the canonicalization then ignores.
154
+ */
155
+ export const PRIVATE_IP_ADDRESS_PATTERN: string = [
156
+ "(?:^|[/@:]|\\[)",
157
+ "(?:",
158
+ "0*10[.]",
159
+ "|0*192[.]0*168[.]",
160
+ "|0*172[.]0*(?:1[6-9]|2[0-9]|3[01])[.]",
161
+ "|0*100[.]0*(?:6[4-9]|[7-9][0-9]|1[01][0-9]|12[0-7])[.]",
162
+ "|0*169[.]0*254[.]",
163
+ "|f[cd][0-9a-f]{0,2}:",
164
+ "|fe[89ab][0-9a-f]:",
165
+ "|[0:]*:ffff:",
166
+ ")",
167
+ ].join("");
168
+
169
+ /*
170
+ * A plain `host[:port]`: hostname labels and an optional numeric port,
171
+ * nothing else. Only such an address is classified precisely; anything else
172
+ * keeps the whole caller context. RE2 and JavaScript agree on it.
173
+ */
174
+ export const PLAIN_HOST_ADDRESS_PATTERN: string =
175
+ "^[a-z0-9_-]+(?:[.][a-z0-9_-]+)*(?::[0-9]*)?$";
176
+
177
+ // A label ending in `-<digits>`: a StatefulSet pod such as `mongo-0`.
178
+ export const ORDINAL_SUFFIX_PATTERN: string = "-[0-9]+$";
179
+
180
+ /*
181
+ * "Not blank" exactly as JavaScript's String.prototype.trim sees it: any
182
+ * character outside its whitespace set (ASCII whitespace, NBSP, the
183
+ * Unicode space separators, the line / paragraph separators and the BOM).
184
+ * RE2 syntax; the TypeScript side simply trims.
185
+ */
186
+ export const NON_BLANK_TEXT_PATTERN: string =
187
+ "[^\\t\\n\\v\\f\\r \\x{A0}\\x{1680}\\x{2000}-\\x{200A}\\x{2028}\\x{2029}\\x{202F}\\x{205F}\\x{3000}\\x{FEFF}]";
188
+
189
+ // The caller-context columns of a database call, as SQL expressions.
190
+ export interface DatabaseCallerContextSql {
191
+ // The caller's Kubernetes namespace, or ''.
192
+ callerNamespace: string;
193
+ // 1 when the caller had a namespace, for the addresses that keep only that.
194
+ callerInKubernetes: string;
195
+ // The caller's Kubernetes cluster, or ''.
196
+ callerCluster: string;
197
+ }
198
+
199
+ /**
200
+ * The caller's Kubernetes context a database call keeps, over `addressSql`
201
+ * — the raw address the call named, decided on lowercased — shared by both
202
+ * span-table discovery queries. The context only changes the canonical
203
+ * endpoint of some addresses, so each column keeps it ONLY for those and is
204
+ * '' (or 0) otherwise — a thousand pods, namespaces or clusters calling one
205
+ * `orders.cjd8.eu-west-1.rds.amazonaws.com` all keep the same nothing:
206
+ *
207
+ * - anything that is not a plain `host[:port]` (a URL, a host list, JDBC
208
+ * properties, userinfo, a trailing dot, IPv6, `host\instance`, …) keeps
209
+ * the namespace AND the cluster: the host inside it could be anything;
210
+ * - a plain single-label host keeps both (it expands to
211
+ * `<name>.<namespace>.svc.cluster.local`);
212
+ * - a plain two-label host keeps the cluster and one flag, "the caller has
213
+ * a namespace", because from a pod `<service>.<namespace>` resolves
214
+ * through the cluster's DNS whichever namespace the pod is in — plus the
215
+ * namespace itself when the first label is a StatefulSet pod
216
+ * (`mongo-0.mongo-headless`, a member of the caller's own namespace);
217
+ * - Kubernetes Service DNS (a `svc` label), the private DNS zones
218
+ * (NETWORK_SCOPED_NAME_SUFFIXES) and private / link-local IPv4 keep the
219
+ * cluster — the hosts every cluster or network has its own copy of.
220
+ *
221
+ * The predicates are deliberately a superset of the canonicalization rules
222
+ * (keeping context canonicalization ignores costs a group, dropping context
223
+ * it needs would change the endpoint);
224
+ * DatabaseEndpointDiscovery.getDatabaseEndpointCallerContextNeeds is their
225
+ * TypeScript twin — keep them in step.
226
+ */
227
+ export function databaseCallerContextSql(
228
+ addressSql: string,
229
+ ): DatabaseCallerContextSql {
230
+ const address: string = `lower(${addressSql})`;
231
+ const hostPart: string = `splitByChar(':', ${address})[1]`;
232
+ const labels: string = `splitByChar('.', ${hostPart})`;
233
+ const labelCount: string = `length(${labels})`;
234
+ const plainAddress: string = `match(${address}, '${escapeSql(
235
+ PLAIN_HOST_ADDRESS_PATTERN,
236
+ )}')`;
237
+
238
+ const namespaceAttribute: string = `attributes['${escapeSql(
239
+ CALLER_NAMESPACE_ATTRIBUTE,
240
+ )}']`;
241
+ const clusterAttribute: string = `attributes['${escapeSql(
242
+ CALLER_CLUSTER_ATTRIBUTE,
243
+ )}']`;
244
+
245
+ const networkScopedName: string = NETWORK_SCOPED_NAME_SUFFIXES.map(
246
+ (suffix: string): string => {
247
+ return `endsWith(${hostPart}, '${escapeSql(suffix)}')`;
248
+ },
249
+ ).join(" OR ");
250
+
251
+ return {
252
+ callerNamespace: `if(
253
+ NOT ${plainAddress}
254
+ OR ${labelCount} = 1
255
+ OR (${labelCount} = 2 AND match(${labels}[1], '${escapeSql(
256
+ ORDINAL_SUFFIX_PATTERN,
257
+ )}')),
258
+ ${namespaceAttribute},
259
+ ''
260
+ )`,
261
+ callerInKubernetes: `if(
262
+ ${plainAddress} AND ${labelCount} = 2,
263
+ match(${namespaceAttribute}, '${escapeSql(NON_BLANK_TEXT_PATTERN)}'),
264
+ 0
265
+ )`,
266
+ callerCluster: `if(
267
+ NOT ${plainAddress}
268
+ OR ${labelCount} <= 2
269
+ OR has(${labels}, 'svc')
270
+ OR ${networkScopedName}
271
+ OR match(${address}, '${escapeSql(PRIVATE_IP_ADDRESS_PATTERN)}'),
272
+ ${clusterAttribute},
273
+ ''
274
+ )`,
275
+ };
276
+ }
277
+
85
278
  export interface DependencyQueryWindow {
86
279
  projectId: string;
87
280
  /** ClickHouse DateTime64 expressions, e.g. toDateTime64('...', 9). */
@@ -158,6 +351,13 @@ export function buildTraceLinkedDependencySql(
158
351
  `;
159
352
  }
160
353
 
354
+ /*
355
+ * Cap on the distinct database servers (dbTargets) one client-span
356
+ * dependency row keeps. A row whose list is full may have been cut short,
357
+ * so it never names one server (see describeDependencyDatabaseServer).
358
+ */
359
+ export const MAX_DATABASE_TARGETS_PER_ROW: number = 16;
360
+
161
361
  /**
162
362
  * Source 2: CLIENT / PRODUCER spans with no client/server child — calls into
163
363
  * something that did not report a span of its own. Requiring the span to be
@@ -168,48 +368,93 @@ export function buildTraceLinkedDependencySql(
168
368
  * The target is summarized in SQL to a handful of low-cardinality semconv
169
369
  * attributes (old and new names both) so the grouping stays bounded: the
170
370
  * address of an HTTP call falls back from `server.address` to the host of
171
- * the URL, never to the URL itself.
371
+ * the URL, never to the URL itself. Rows are grouped on exactly the columns
372
+ * a node is keyed by, so there is ONE row per (caller, node), and the row
373
+ * cap is shared fairly between databases, HTTP APIs, brokers and RPC peers.
374
+ *
375
+ * A database call also keeps what the ingest resolver
376
+ * (resolveDatabaseCallTarget) reads to find the database SERVER it called —
377
+ * the address, port and SQL Server instance with the resolver's precedence,
378
+ * and the caller's Kubernetes context where it can change the endpoint
379
+ * (databaseCallerContextSql) — so its node can say which server that is
380
+ * (see describeDependencyDatabaseServer). None of them is part of a node's
381
+ * identity, so they are AGGREGATED, never grouped on: `dbTargets` lists the
382
+ * distinct servers the row's calls named (at most
383
+ * MAX_DATABASE_TARGETS_PER_ROW). A database reached from a hundred
384
+ * namespaces, pods, IPs or ports is still one row.
172
385
  */
173
386
  export function buildClientSpanDependencySql(
174
387
  window: DependencyQueryWindow,
175
388
  ): string {
389
+ const databaseOnly: (sql: string, otherwise?: string) => string = (
390
+ sql: string,
391
+ otherwise: string = "''",
392
+ ): string => {
393
+ return `if(dbSystem != '', ${sql}, ${otherwise})`;
394
+ };
395
+
396
+ const callerContext: DatabaseCallerContextSql =
397
+ databaseCallerContextSql("dbServerAddress");
398
+
176
399
  return `
177
400
  SELECT
178
- primaryEntityId AS callerServiceId,
179
- multiIf(attributes['db.system.name'] != '', attributes['db.system.name'], attributes['db.system']) AS dbSystem,
180
- multiIf(attributes['db.namespace'] != '', attributes['db.namespace'], attributes['db.name']) AS dbNamespace,
181
- attributes['messaging.system'] AS messagingSystem,
182
- attributes['peer.service'] AS peerService,
183
- attributes['rpc.system'] AS rpcSystem,
184
- attributes['rpc.service'] AS rpcService,
185
- multiIf(
186
- attributes['server.address'] != '', attributes['server.address'],
187
- attributes['net.peer.name'] != '', attributes['net.peer.name'],
188
- attributes['http.host'] != '', attributes['http.host'],
189
- attributes['url.full'] != '', domain(attributes['url.full']),
190
- attributes['http.url'] != '', domain(attributes['http.url']),
191
- ''
192
- ) AS serverAddress,
193
- if(attributes['http.request.method'] != '' OR attributes['http.method'] != '', 1, 0) AS isHttp,
401
+ callerServiceId,
402
+ dbSystem,
403
+ dbNamespace,
404
+ messagingSystem,
405
+ peerService,
406
+ rpcSystem,
407
+ rpcService,
408
+ serverAddress,
409
+ isHttp,
410
+ groupUniqArrayIf(${MAX_DATABASE_TARGETS_PER_ROW})([dbServerAddress, serverPort, dbInstance, callerNamespace, toString(callerInKubernetes), callerCluster], dbSystem != '') AS dbTargets,
194
411
  count() AS callCount,
195
412
  countIf(statusCode = 2) AS errorCount,
196
413
  avg(durationUnixNano) AS avgDurationNano
197
- FROM ${SPAN_TABLE}
198
- WHERE ${projectAndServiceFilter(window)}
199
- AND startTime >= ${window.startSql}
200
- AND startTime < ${window.endSql}
201
- AND kind IN ${OUTBOUND_KINDS_SQL}
202
- AND (traceId, spanId) NOT IN (
203
- SELECT traceId, parentSpanId
204
- FROM ${SPAN_TABLE}
205
- WHERE projectId = '${escapeSql(window.projectId)}'
206
- AND startTime >= ${window.startSql}
207
- AND startTime < ${window.endSql} + INTERVAL ${PARENT_LOOKBACK_MINUTES} MINUTE
208
- AND kind IN ${CALL_KINDS_SQL}
209
- AND parentSpanId IS NOT NULL
210
- AND parentSpanId != ''
211
- LIMIT ${window.maxEntrySpans}
212
- )
414
+ FROM
415
+ (
416
+ SELECT
417
+ primaryEntityId AS callerServiceId,
418
+ multiIf(attributes['db.system.name'] != '', attributes['db.system.name'], attributes['db.system']) AS dbSystem,
419
+ multiIf(attributes['db.namespace'] != '', attributes['db.namespace'], attributes['db.name']) AS dbNamespace,
420
+ attributes['messaging.system'] AS messagingSystem,
421
+ attributes['peer.service'] AS peerService,
422
+ attributes['rpc.system'] AS rpcSystem,
423
+ attributes['rpc.service'] AS rpcService,
424
+ multiIf(
425
+ attributes['server.address'] != '', attributes['server.address'],
426
+ attributes['net.peer.name'] != '', attributes['net.peer.name'],
427
+ attributes['http.host'] != '', attributes['http.host'],
428
+ attributes['url.full'] != '', domain(attributes['url.full']),
429
+ attributes['http.url'] != '', domain(attributes['http.url']),
430
+ ''
431
+ ) AS serverAddress,
432
+ if(attributes['http.request.method'] != '' OR attributes['http.method'] != '', 1, 0) AS isHttp,
433
+ ${databaseOnly(firstNonEmptyAttributeSql(DATABASE_ADDRESS_ATTRIBUTES))} AS dbServerAddress,
434
+ ${databaseOnly(firstNonEmptyAttributeSql(DATABASE_PORT_ATTRIBUTES))} AS serverPort,
435
+ ${databaseOnly(databaseInstanceSql())} AS dbInstance,
436
+ ${databaseOnly(callerContext.callerNamespace)} AS callerNamespace,
437
+ ${databaseOnly(callerContext.callerInKubernetes, "0")} AS callerInKubernetes,
438
+ ${databaseOnly(callerContext.callerCluster)} AS callerCluster,
439
+ statusCode,
440
+ durationUnixNano
441
+ FROM ${SPAN_TABLE}
442
+ WHERE ${projectAndServiceFilter(window)}
443
+ AND startTime >= ${window.startSql}
444
+ AND startTime < ${window.endSql}
445
+ AND kind IN ${OUTBOUND_KINDS_SQL}
446
+ AND (traceId, spanId) NOT IN (
447
+ SELECT traceId, parentSpanId
448
+ FROM ${SPAN_TABLE}
449
+ WHERE projectId = '${escapeSql(window.projectId)}'
450
+ AND startTime >= ${window.startSql}
451
+ AND startTime < ${window.endSql} + INTERVAL ${PARENT_LOOKBACK_MINUTES} MINUTE
452
+ AND kind IN ${CALL_KINDS_SQL}
453
+ AND parentSpanId IS NOT NULL
454
+ AND parentSpanId != ''
455
+ LIMIT ${window.maxEntrySpans}
456
+ )
457
+ )
213
458
  GROUP BY callerServiceId, dbSystem, dbNamespace, messagingSystem, peerService, rpcSystem, rpcService, serverAddress, isHttp
214
459
  ORDER BY callCount DESC
215
460
  LIMIT ${window.maxRows}
@@ -279,6 +524,14 @@ export interface TraceLinkedDependencyRow {
279
524
  avgDurationNano: string | number;
280
525
  }
281
526
 
527
+ /*
528
+ * One database server a row's calls named, positionally as the query
529
+ * returns it: [address, port, SQL Server instance, caller namespace,
530
+ * caller-in-Kubernetes flag ("1" / "0"), caller cluster] — see
531
+ * readDependencyDatabaseTargets.
532
+ */
533
+ export type DependencyDatabaseTargetColumns = Array<string>;
534
+
282
535
  export interface ClientSpanDependencyRow {
283
536
  callerServiceId: string;
284
537
  dbSystem?: string | undefined;
@@ -289,6 +542,12 @@ export interface ClientSpanDependencyRow {
289
542
  rpcService?: string | undefined;
290
543
  serverAddress?: string | undefined;
291
544
  isHttp?: string | number | boolean | undefined;
545
+ /*
546
+ * Database calls only (empty otherwise): the distinct servers the row's
547
+ * calls named — what resolveDatabaseCallTarget reads, at most
548
+ * MAX_DATABASE_TARGETS_PER_ROW of them.
549
+ */
550
+ dbTargets?: Array<DependencyDatabaseTargetColumns> | undefined;
292
551
  callCount: string | number;
293
552
  errorCount: string | number;
294
553
  avgDurationNano: string | number;
@@ -374,6 +633,305 @@ function nonEmpty(value: string | undefined | null): string | null {
374
633
  return trimmed.length > 0 ? trimmed : null;
375
634
  }
376
635
 
636
+ /*
637
+ * What a Database dependency node says about the database SERVER its calls
638
+ * reached, for the Service Map's "Open database" link (ResolveTypedRowLink
639
+ * prefers these): the canonical endpoint ingest keyed the calls with
640
+ * (formatDatabaseEndpoint, `@cluster` included) and the port the calls
641
+ * named. DESCRIPTIVE only — a node stays keyed by what its spans said
642
+ * (engine, host, logical database), so these never change its identity.
643
+ * '' means the node's calls reached more than one server, or more than
644
+ * could be told apart (see describeDependencyDatabaseServer and
645
+ * mergeDependencyEntityDescriptions).
646
+ */
647
+ export const DATABASE_ENDPOINT_DESCRIPTIVE_ATTRIBUTE: string =
648
+ "oneuptime.database.endpoint";
649
+ export const DATABASE_PORT_DESCRIPTIVE_ATTRIBUTE: string = "server.port";
650
+
651
+ const DIGITS_ONLY_REGEX: RegExp = /^\d+$/;
652
+
653
+ export interface DependencyDatabaseEndpoint {
654
+ // The server the calls reached, formatted (formatDatabaseEndpoint).
655
+ endpoint: string;
656
+ // The port the calls named (the port attribute, else the address's); null for none.
657
+ port: number | null;
658
+ }
659
+
660
+ /*
661
+ * One database server a dependency row's calls named — an entry of its
662
+ * `dbTargets`, read (readDependencyDatabaseTargets): exactly what
663
+ * resolveDatabaseCallTarget reads beside the engine.
664
+ */
665
+ export interface DependencyDatabaseTarget {
666
+ // The address, with the resolver's precedence.
667
+ address: string;
668
+ // The port attribute, with the resolver's precedence; '' for none.
669
+ port: string;
670
+ // The SQL Server instance named beside the address; '' for none.
671
+ instance: string;
672
+ // The caller's placement, kept only where it can change the server.
673
+ callerNamespace: string;
674
+ callerInKubernetes: boolean;
675
+ callerCluster: string;
676
+ }
677
+
678
+ /*
679
+ * What a node (or one row of it) says about the server its calls reached:
680
+ * the formatted endpoint and the port the calls named, as the descriptive
681
+ * attributes carry them — null for no port, '' for "not one".
682
+ */
683
+ export interface DependencyDatabaseServer {
684
+ endpoint: string;
685
+ port: string | null;
686
+ }
687
+
688
+ function readPort(value: unknown): number | null {
689
+ const text: string =
690
+ typeof value === "number"
691
+ ? String(value)
692
+ : typeof value === "string"
693
+ ? value.trim()
694
+ : "";
695
+ if (!DIGITS_ONLY_REGEX.test(text)) {
696
+ return null;
697
+ }
698
+ const port: number = Number(text);
699
+ return port >= 1 && port <= 65535 ? port : null;
700
+ }
701
+
702
+ function readColumn(value: unknown): string {
703
+ if (typeof value === "string") {
704
+ return value;
705
+ }
706
+ if (typeof value === "number" || typeof value === "boolean") {
707
+ return String(value);
708
+ }
709
+ return "";
710
+ }
711
+
712
+ function isFlagSet(value: unknown): boolean {
713
+ return value === true || value === 1 || value === "1" || value === "true";
714
+ }
715
+
716
+ /**
717
+ * A row's `dbTargets`, read: every entry that is a list of columns, in the
718
+ * query's column order, a missing or malformed column read as none. Empty
719
+ * for a row that is not a database call, or that has no such column.
720
+ */
721
+ export function readDependencyDatabaseTargets(
722
+ row: ClientSpanDependencyRow,
723
+ ): Array<DependencyDatabaseTarget> {
724
+ const entries: unknown = row && typeof row === "object" ? row.dbTargets : [];
725
+ if (!Array.isArray(entries)) {
726
+ return [];
727
+ }
728
+
729
+ const targets: Array<DependencyDatabaseTarget> = [];
730
+ for (const entry of entries) {
731
+ if (!Array.isArray(entry)) {
732
+ continue;
733
+ }
734
+ const columns: Array<unknown> = entry as Array<unknown>;
735
+ targets.push({
736
+ address: readColumn(columns[0]),
737
+ port: readColumn(columns[1]),
738
+ instance: readColumn(columns[2]),
739
+ callerNamespace: readColumn(columns[3]),
740
+ callerInKubernetes: isFlagSet(columns[4]),
741
+ callerCluster: readColumn(columns[5]),
742
+ });
743
+ }
744
+ return targets;
745
+ }
746
+
747
+ /**
748
+ * The database server one target of a client-span dependency row named —
749
+ * exactly the endpoint ingest keyed its spans with: the target goes through
750
+ * resolveDatabaseCallTarget, the ingest resolver itself, with the caller
751
+ * context the query kept (the flag included), as DatabaseEndpointDiscovery
752
+ * does. Null when it names none: not a database call, or a loopback,
753
+ * host-relative or unreadable address.
754
+ */
755
+ export function resolveDependencyDatabaseEndpoint(data: {
756
+ dbSystem: string | undefined;
757
+ target: DependencyDatabaseTarget;
758
+ }): DependencyDatabaseEndpoint | null {
759
+ if (!data || !data.target || typeof data.target !== "object") {
760
+ return null;
761
+ }
762
+
763
+ const target: DependencyDatabaseTarget = data.target;
764
+
765
+ const attributes: Record<string, unknown> = {
766
+ [DATABASE_SYSTEM_ATTRIBUTES[0]!]: data.dbSystem,
767
+ [DATABASE_ADDRESS_ATTRIBUTES[0]!]: target.address,
768
+ [DATABASE_PORT_ATTRIBUTES[0]!]: target.port,
769
+ [DATABASE_INSTANCE_NAME_ATTRIBUTE]: target.instance,
770
+ };
771
+
772
+ const caller: DatabaseCallerContext = {
773
+ kubernetesNamespace: nonEmpty(target.callerNamespace),
774
+ kubernetesClusterName: nonEmpty(target.callerCluster),
775
+ hostName: null,
776
+ // Only the collector purpose reads it; a client call never does.
777
+ isEphemeral: true,
778
+ runsInKubernetes: target.callerInKubernetes === true,
779
+ };
780
+
781
+ const resolved: {
782
+ system: string;
783
+ endpoint: DatabaseEndpoint;
784
+ scope: DatabaseEndpointScope;
785
+ } | null = resolveDatabaseCallTarget({
786
+ getAttribute: (key: string): unknown => {
787
+ return attributes[key];
788
+ },
789
+ caller: caller,
790
+ });
791
+
792
+ if (!resolved) {
793
+ return null;
794
+ }
795
+
796
+ // Named exactly as the resolver reads it: the port attribute, else the address's.
797
+ const address: ParsedHostAndPort | null = parseHostAndPort(target.address);
798
+
799
+ return {
800
+ endpoint: formatDatabaseEndpoint(resolved.endpoint),
801
+ port: readPort(target.port) ?? address?.port ?? null,
802
+ };
803
+ }
804
+
805
+ /*
806
+ * Two descriptions of one node → one: the server is kept only while both
807
+ * name the same endpoint (and the same port, "none" included); any
808
+ * disagreement is '' — ambiguous — and stays so.
809
+ */
810
+ function combineDatabaseServers(
811
+ first: DependencyDatabaseServer | null,
812
+ second: DependencyDatabaseServer | null,
813
+ ): DependencyDatabaseServer | null {
814
+ if (!first || !second) {
815
+ return first || second;
816
+ }
817
+ return {
818
+ endpoint: first.endpoint === second.endpoint ? first.endpoint : "",
819
+ port: first.port === second.port ? first.port : "",
820
+ };
821
+ }
822
+
823
+ /**
824
+ * The database server a client-span dependency row's calls reached: each
825
+ * of its targets resolved (resolveDependencyDatabaseEndpoint) and combined
826
+ * like the sightings of a node (mergeDependencyEntityDescriptions) — a
827
+ * target that names no server contradicts nothing, targets that disagree
828
+ * leave '' (ambiguous). A row whose target list is full
829
+ * (MAX_DATABASE_TARGETS_PER_ROW) may have been cut short, so it is
830
+ * ambiguous whatever the targets it kept say. Null when the row names no
831
+ * server at all.
832
+ */
833
+ export function describeDependencyDatabaseServer(
834
+ row: ClientSpanDependencyRow,
835
+ ): DependencyDatabaseServer | null {
836
+ if (!row || typeof row !== "object" || !nonEmpty(row.dbSystem)) {
837
+ return null;
838
+ }
839
+
840
+ const targets: Array<DependencyDatabaseTarget> =
841
+ readDependencyDatabaseTargets(row);
842
+ if (targets.length === 0) {
843
+ return null;
844
+ }
845
+
846
+ if (
847
+ Array.isArray(row.dbTargets) &&
848
+ row.dbTargets.length >= MAX_DATABASE_TARGETS_PER_ROW
849
+ ) {
850
+ return { endpoint: "", port: "" };
851
+ }
852
+
853
+ let server: DependencyDatabaseServer | null = null;
854
+ for (const target of targets) {
855
+ const resolved: DependencyDatabaseEndpoint | null =
856
+ resolveDependencyDatabaseEndpoint({
857
+ dbSystem: row.dbSystem,
858
+ target: target,
859
+ });
860
+ if (resolved) {
861
+ server = combineDatabaseServers(server, {
862
+ endpoint: resolved.endpoint,
863
+ port: resolved.port === null ? null : String(resolved.port),
864
+ });
865
+ }
866
+ }
867
+ return server;
868
+ }
869
+
870
+ function readDatabaseServerDescription(
871
+ attributes: Record<string, string>,
872
+ ): DependencyDatabaseServer | null {
873
+ const endpoint: string | undefined =
874
+ attributes[DATABASE_ENDPOINT_DESCRIPTIVE_ATTRIBUTE];
875
+ if (typeof endpoint !== "string") {
876
+ return null;
877
+ }
878
+ const port: string | undefined =
879
+ attributes[DATABASE_PORT_DESCRIPTIVE_ATTRIBUTE];
880
+ return { endpoint: endpoint, port: typeof port === "string" ? port : null };
881
+ }
882
+
883
+ /**
884
+ * Two sightings of one dependency node in one run → one description. A
885
+ * node is keyed by what its callers' spans said (engine, host, logical
886
+ * database), so it can stand for more than one database server: two ports
887
+ * on one host, or a short Kubernetes name (`postgres`) that is another
888
+ * Service in each caller's namespace. The server is therefore described
889
+ * only while every sighting that names one names the same endpoint (and
890
+ * the same port, "none" included); sightings that disagree leave '' —
891
+ * ambiguous — which also overwrites what an earlier run stamped, since
892
+ * descriptive attributes merge key by key, last writer wins. The Service
893
+ * Map then never opens one of several databases as if it were the only
894
+ * one. A sighting that names no server (its address did not resolve)
895
+ * contradicts nothing. Every other attribute: the later sighting wins.
896
+ */
897
+ export function mergeDependencyEntityDescriptions(
898
+ earlier: ExtractedEntity,
899
+ later: ExtractedEntity,
900
+ ): ExtractedEntity {
901
+ const before: Record<string, string> = earlier.descriptiveAttributes || {};
902
+ const after: Record<string, string> = later.descriptiveAttributes || {};
903
+
904
+ const merged: Record<string, string> = {};
905
+ for (const [key, value] of Object.entries({ ...before, ...after })) {
906
+ if (
907
+ key !== DATABASE_ENDPOINT_DESCRIPTIVE_ATTRIBUTE &&
908
+ key !== DATABASE_PORT_DESCRIPTIVE_ATTRIBUTE
909
+ ) {
910
+ merged[key] = value;
911
+ }
912
+ }
913
+
914
+ const server: DependencyDatabaseServer | null = combineDatabaseServers(
915
+ readDatabaseServerDescription(before),
916
+ readDatabaseServerDescription(after),
917
+ );
918
+
919
+ if (server) {
920
+ merged[DATABASE_ENDPOINT_DESCRIPTIVE_ATTRIBUTE] = server.endpoint;
921
+ if (server.port !== null) {
922
+ merged[DATABASE_PORT_DESCRIPTIVE_ATTRIBUTE] = server.port;
923
+ }
924
+ }
925
+
926
+ const result: ExtractedEntity = { ...later };
927
+ if (Object.keys(merged).length > 0) {
928
+ result.descriptiveAttributes = merged;
929
+ } else {
930
+ delete result.descriptiveAttributes;
931
+ }
932
+ return result;
933
+ }
934
+
377
935
  function matchKnownService(
378
936
  names: Array<string>,
379
937
  knownServiceNames: ReadonlySet<string>,
@@ -417,14 +975,26 @@ export function resolveClientSpanTarget(
417
975
  identifyingAttributes["db.namespace"] =
418
976
  canonicalizeEntityValue(namespace);
419
977
  }
978
+ const descriptiveAttributes: Record<string, string> = {
979
+ "db.system.name": canonicalizeEntityValue(dbSystem),
980
+ };
981
+ // Which server the calls reached: descriptive, never identifying.
982
+ const server: DependencyDatabaseServer | null =
983
+ describeDependencyDatabaseServer(row);
984
+ if (server) {
985
+ descriptiveAttributes[DATABASE_ENDPOINT_DESCRIPTIVE_ATTRIBUTE] =
986
+ server.endpoint;
987
+ if (server.port !== null) {
988
+ descriptiveAttributes[DATABASE_PORT_DESCRIPTIVE_ATTRIBUTE] =
989
+ server.port;
990
+ }
991
+ }
420
992
  return {
421
993
  kind: "dependency",
422
994
  entity: {
423
995
  entityType: EntityType.Database,
424
996
  identifyingAttributes,
425
- descriptiveAttributes: {
426
- "db.system.name": canonicalizeEntityValue(dbSystem),
427
- },
997
+ descriptiveAttributes,
428
998
  },
429
999
  };
430
1000
  }