@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.
- package/Models/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
- package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
- package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
- package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
- package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +1 -1
- package/Server/Middleware/TelemetryIngest.ts +15 -8
- package/Server/Services/AlertReminderRuleService.ts +100 -24
- package/Server/Services/DatabaseServerEndpointService.ts +895 -0
- package/Server/Services/DatabaseServerFeedService.ts +128 -0
- package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
- package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
- package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
- package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
- package/Server/Services/DatabaseServerService.ts +4546 -0
- package/Server/Services/DatabaseService.ts +14 -8
- package/Server/Services/DockerResourceService.ts +43 -2
- package/Server/Services/IncidentReminderRuleService.ts +103 -23
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +113 -5
- package/Server/Services/IoTDeviceService.ts +145 -37
- package/Server/Services/OpenTelemetryIngestService.ts +19 -0
- package/Server/Services/PodmanResourceService.ts +43 -2
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
- package/Server/Services/ServiceService.ts +1 -1
- package/Server/Services/TelemetryUsageBillingService.ts +29 -2
- package/Server/Services/UserProjectSsoConsentService.ts +74 -0
- package/Server/Services/UserService.ts +14 -1
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +30 -1
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +69 -1
- package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +188 -6
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2262 -755
- package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
- package/Server/Utils/Monitor/MonitorResource.ts +47 -11
- package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
- package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/StartServer.ts +26 -6
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
- package/Server/Utils/Telemetry/Telemetry.ts +16 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
- package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
- package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
- package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
- package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
- package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
- package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
- package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
- package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
- package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
- package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
- package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
- package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
- package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
- package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
- package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
- package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
- package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
- package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
- package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
- package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
- package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
- package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
- package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
- package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
- package/Tests/ClassStrings.ts +178 -0
- package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
- package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/RenderedMarkup.ts +518 -0
- package/Tests/ResponsiveVisibility.test.ts +490 -4
- package/Tests/ResponsiveVisibility.ts +505 -52
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
- package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
- package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
- package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
- package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
- package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
- package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
- package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
- package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
- package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
- package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
- package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
- package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
- package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
- package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
- package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
- package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
- package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
- package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
- package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
- package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
- package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
- package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1719 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
- package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
- package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
- package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
- package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
- package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
- package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
- package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
- package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
- package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
- package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +298 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +271 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
- package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +181 -0
- package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
- package/Tests/UI/Components/Card.test.tsx +93 -2
- package/Tests/UI/Components/FeedOptions.test.ts +6 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
- package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
- package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
- package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
- package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
- package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
- package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
- package/Tests/UI/Utils/Navigation.test.ts +102 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
- package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
- package/Tests/Utils/ValueFormatter.test.ts +50 -0
- package/Tests/tsconfig.json +16 -0
- package/Types/AI/AIResourceContext.ts +7 -0
- package/Types/Dashboard/DashboardTemplates.ts +2 -1
- package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
- package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
- package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
- package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
- package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
- package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
- package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
- package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/CephAlertTemplates.ts +18 -0
- package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
- package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
- package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
- package/Types/Permission.ts +267 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
- package/Types/Rules/RuleRun.ts +12 -0
- package/Types/Telemetry/EntityType.ts +23 -0
- package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
- package/Types/Telemetry/ServiceType.ts +8 -0
- package/UI/Components/Banner/Banner.tsx +1 -1
- package/UI/Components/Card/Card.tsx +1 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
- package/UI/Components/Date/StartAndEndDate.tsx +5 -5
- package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
- package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
- package/UI/Components/Forms/BasicForm.tsx +1 -1
- package/UI/Components/Header/Header.tsx +1 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
- package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
- package/UI/Components/Modal/ModalFooter.tsx +1 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
- package/UI/Components/Navbar/NavBar.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
- package/UI/Components/Page/Page.tsx +1 -1
- package/UI/Components/Pagination/Pagination.tsx +3 -3
- package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
- package/UI/Components/SideMenu/SideMenu.tsx +4 -1
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
- package/UI/Components/StatusPage/ResourceList.tsx +6 -6
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
- package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Styles/Theme.css +8 -1
- package/UI/Utils/Navigation.ts +89 -42
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
- package/UI/Utils/TelemetryService.ts +4 -3
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/MetricUnitUtil.ts +103 -11
- package/Utils/Monitor/MetricValueFormatter.ts +66 -13
- package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
- package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
- package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
- package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
- package/Utils/Telemetry/EntityKey.ts +176 -0
- package/Utils/ValueFormatter.ts +16 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
- package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +8 -4
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerResourceService.js +30 -3
- package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +88 -5
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceService.js +111 -24
- package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanResourceService.js +30 -3
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +1 -1
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
- package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +13 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +26 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +46 -0
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +134 -13
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +20 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +7 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +2 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +23 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +8 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Banner/Banner.js +1 -1
- package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
- package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +1 -1
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
- package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +66 -33
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +77 -13
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +15 -0
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
- 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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
}
|