@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
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { DiscoveredNetworkDevice } from "../../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
|
|
2
|
+
import {
|
|
3
|
+
DiscoveredHostNetbiosStatus,
|
|
4
|
+
DiscoveredHostReverseDnsStatus,
|
|
5
|
+
} from "../../../Types/NetworkDevice/DiscoveredHostNamingStatus";
|
|
2
6
|
import { normalizeDiscoveredHosts } from "../../../Utils/NetworkDiscovery/DiscoveredHostUtil";
|
|
3
7
|
import {
|
|
4
8
|
DiscoveredHostNaming,
|
|
@@ -642,3 +646,314 @@ describe("normalizeDiscoveredHosts — the NetBIOS name (issue #3677)", () => {
|
|
|
642
646
|
expect(getDiscoveredHostDisplayName(normalized!, FULL_NAMES)).toBe("reg01");
|
|
643
647
|
});
|
|
644
648
|
});
|
|
649
|
+
|
|
650
|
+
/*
|
|
651
|
+
* OneUptime issue #3916 — why a host is unnamed.
|
|
652
|
+
*
|
|
653
|
+
* `dnsHostnameStatus` and `netbiosNameStatus` are short codes the probe
|
|
654
|
+
* stamps on a host that reverse DNS or NetBIOS left without a name. The
|
|
655
|
+
* Review dialog turns them into the sentence beside a bare address. Unlike
|
|
656
|
+
* the names above they are not chosen by the scanned network, but they come
|
|
657
|
+
* out of the same verbatim jsonb, so they get the same treatment: only an
|
|
658
|
+
* exact code survives, and anything else is DELETED, not blanked.
|
|
659
|
+
*
|
|
660
|
+
* Deleted matters for the same `in`-versus-truthiness reason as the names.
|
|
661
|
+
* It matters more for the explanation, because "this row carries a code" is
|
|
662
|
+
* what tells a still-sweeping scan's previous results apart from its fresh
|
|
663
|
+
* ones. A key left behind holding junk would make one reader say "a code"
|
|
664
|
+
* and another say "no code" about the same row.
|
|
665
|
+
*/
|
|
666
|
+
describe("normalizeDiscoveredHosts — the naming status codes (issue #3916)", () => {
|
|
667
|
+
/*
|
|
668
|
+
* Values that are not a code, as the column can hold them. The other
|
|
669
|
+
* field's codes are added per test: a reverse-DNS code is junk in the
|
|
670
|
+
* NetBIOS field, and the reverse.
|
|
671
|
+
*/
|
|
672
|
+
const NOT_A_CODE: Array<[string, unknown]> = [
|
|
673
|
+
["an unknown string", "dnssec-bogus"],
|
|
674
|
+
["an upper-case code", "TIMEOUT"],
|
|
675
|
+
["a padded code", " no-reply "],
|
|
676
|
+
["an underscored code", "no_record"],
|
|
677
|
+
["the empty string", ""],
|
|
678
|
+
["a prototype key", "constructor"],
|
|
679
|
+
["another prototype key", "__proto__"],
|
|
680
|
+
["markup", "<img src=x onerror=1>"],
|
|
681
|
+
["a number", 3],
|
|
682
|
+
["zero", 0],
|
|
683
|
+
["an object", { code: "timeout" }],
|
|
684
|
+
["an array holding a code", ["timeout"]],
|
|
685
|
+
["true", true],
|
|
686
|
+
["null", null],
|
|
687
|
+
];
|
|
688
|
+
|
|
689
|
+
test.each(Object.values(DiscoveredHostReverseDnsStatus))(
|
|
690
|
+
"keeps the reverse-DNS code %p exactly as stored",
|
|
691
|
+
(code: DiscoveredHostReverseDnsStatus) => {
|
|
692
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
693
|
+
host({ dnsHostnameStatus: code }),
|
|
694
|
+
]);
|
|
695
|
+
|
|
696
|
+
expect(normalized?.dnsHostnameStatus).toBe(code);
|
|
697
|
+
},
|
|
698
|
+
);
|
|
699
|
+
|
|
700
|
+
test.each(Object.values(DiscoveredHostNetbiosStatus))(
|
|
701
|
+
"keeps the NetBIOS code %p exactly as stored",
|
|
702
|
+
(code: DiscoveredHostNetbiosStatus) => {
|
|
703
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
704
|
+
host({ netbiosNameStatus: code }),
|
|
705
|
+
]);
|
|
706
|
+
|
|
707
|
+
expect(normalized?.netbiosNameStatus).toBe(code);
|
|
708
|
+
},
|
|
709
|
+
);
|
|
710
|
+
|
|
711
|
+
test.each([
|
|
712
|
+
...NOT_A_CODE,
|
|
713
|
+
...Object.values(DiscoveredHostNetbiosStatus).map(
|
|
714
|
+
(code: string): [string, unknown] => {
|
|
715
|
+
return [`the NetBIOS code ${code}`, code];
|
|
716
|
+
},
|
|
717
|
+
),
|
|
718
|
+
])(
|
|
719
|
+
"deletes %s from the reverse-DNS field",
|
|
720
|
+
(_label: string, value: unknown) => {
|
|
721
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
722
|
+
host({
|
|
723
|
+
dnsHostnameStatus: value as DiscoveredHostReverseDnsStatus,
|
|
724
|
+
}),
|
|
725
|
+
]);
|
|
726
|
+
|
|
727
|
+
expect(normalized).not.toHaveProperty("dnsHostnameStatus");
|
|
728
|
+
},
|
|
729
|
+
);
|
|
730
|
+
|
|
731
|
+
test.each([
|
|
732
|
+
...NOT_A_CODE,
|
|
733
|
+
...Object.values(DiscoveredHostReverseDnsStatus).map(
|
|
734
|
+
(code: string): [string, unknown] => {
|
|
735
|
+
return [`the reverse-DNS code ${code}`, code];
|
|
736
|
+
},
|
|
737
|
+
),
|
|
738
|
+
])("deletes %s from the NetBIOS field", (_label: string, value: unknown) => {
|
|
739
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
740
|
+
host({ netbiosNameStatus: value as DiscoveredHostNetbiosStatus }),
|
|
741
|
+
]);
|
|
742
|
+
|
|
743
|
+
expect(normalized).not.toHaveProperty("netbiosNameStatus");
|
|
744
|
+
});
|
|
745
|
+
|
|
746
|
+
test("an explicitly undefined code is removed rather than kept as a key", () => {
|
|
747
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
748
|
+
host({ dnsHostnameStatus: undefined, netbiosNameStatus: undefined }),
|
|
749
|
+
]);
|
|
750
|
+
|
|
751
|
+
expect(normalized).not.toHaveProperty("dnsHostnameStatus");
|
|
752
|
+
expect(normalized).not.toHaveProperty("netbiosNameStatus");
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
test("a host with no codes gains no keys", () => {
|
|
756
|
+
/*
|
|
757
|
+
* Named hosts, rows stored before the codes existed, and rows from an
|
|
758
|
+
* older probe all have neither key, and must still have neither: a
|
|
759
|
+
* normaliser that added them would change what `in` says about every
|
|
760
|
+
* row in every scan.
|
|
761
|
+
*/
|
|
762
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
763
|
+
host({ snmpReachable: false }),
|
|
764
|
+
]);
|
|
765
|
+
|
|
766
|
+
expect(normalized).toStrictEqual({
|
|
767
|
+
ipAddress: "10.0.0.1",
|
|
768
|
+
snmpReachable: false,
|
|
769
|
+
});
|
|
770
|
+
expect(Object.keys(normalized!).sort()).toEqual([
|
|
771
|
+
"ipAddress",
|
|
772
|
+
"snmpReachable",
|
|
773
|
+
]);
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
test("the two codes are cleaned independently of each other", () => {
|
|
777
|
+
const [badDnsGoodNetbios, goodDnsBadNetbios] = normalizeDiscoveredHosts([
|
|
778
|
+
host({
|
|
779
|
+
dnsHostnameStatus: "TIMEOUT" as DiscoveredHostReverseDnsStatus,
|
|
780
|
+
netbiosNameStatus: DiscoveredHostNetbiosStatus.NoReply,
|
|
781
|
+
}),
|
|
782
|
+
host({
|
|
783
|
+
ipAddress: "10.0.0.2",
|
|
784
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Timeout,
|
|
785
|
+
netbiosNameStatus: 7 as unknown as DiscoveredHostNetbiosStatus,
|
|
786
|
+
}),
|
|
787
|
+
]);
|
|
788
|
+
|
|
789
|
+
expect(badDnsGoodNetbios).not.toHaveProperty("dnsHostnameStatus");
|
|
790
|
+
expect(badDnsGoodNetbios?.netbiosNameStatus).toBe(
|
|
791
|
+
DiscoveredHostNetbiosStatus.NoReply,
|
|
792
|
+
);
|
|
793
|
+
|
|
794
|
+
expect(goodDnsBadNetbios?.dnsHostnameStatus).toBe(
|
|
795
|
+
DiscoveredHostReverseDnsStatus.Timeout,
|
|
796
|
+
);
|
|
797
|
+
expect(goodDnsBadNetbios).not.toHaveProperty("netbiosNameStatus");
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
test("the codes and the names are cleaned independently", () => {
|
|
801
|
+
/*
|
|
802
|
+
* A rejected PTR name must not take the code with it, and a rejected
|
|
803
|
+
* code must not take a good name with it. The code on the first row is
|
|
804
|
+
* exactly the one a probe stamps for a PTR answer that normalised away.
|
|
805
|
+
*/
|
|
806
|
+
const [rejectedName, rejectedCode] = normalizeDiscoveredHosts([
|
|
807
|
+
host({
|
|
808
|
+
dnsHostname: "51.0.0.10.in-addr.arpa",
|
|
809
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.UnusableName,
|
|
810
|
+
}),
|
|
811
|
+
host({
|
|
812
|
+
ipAddress: "10.0.0.2",
|
|
813
|
+
netbiosName: "REG01",
|
|
814
|
+
netbiosNameStatus: "no reply" as DiscoveredHostNetbiosStatus,
|
|
815
|
+
}),
|
|
816
|
+
]);
|
|
817
|
+
|
|
818
|
+
expect(rejectedName).not.toHaveProperty("dnsHostname");
|
|
819
|
+
expect(rejectedName?.dnsHostnameStatus).toBe(
|
|
820
|
+
DiscoveredHostReverseDnsStatus.UnusableName,
|
|
821
|
+
);
|
|
822
|
+
|
|
823
|
+
expect(rejectedCode?.netbiosName).toBe("reg01");
|
|
824
|
+
expect(rejectedCode).not.toHaveProperty("netbiosNameStatus");
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
test("a code on a host that has a name is kept, not judged", () => {
|
|
828
|
+
/*
|
|
829
|
+
* This function whitelists values; it does not decide what a row means.
|
|
830
|
+
* A valid code on a named row is harmless, because the explanation is
|
|
831
|
+
* only ever shown for a row whose name line is its address, and deleting
|
|
832
|
+
* it here would be a second copy of that rule.
|
|
833
|
+
*/
|
|
834
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
835
|
+
host({
|
|
836
|
+
netbiosName: "REG01",
|
|
837
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.NoRecord,
|
|
838
|
+
}),
|
|
839
|
+
]);
|
|
840
|
+
|
|
841
|
+
expect(normalized?.dnsHostnameStatus).toBe(
|
|
842
|
+
DiscoveredHostReverseDnsStatus.NoRecord,
|
|
843
|
+
);
|
|
844
|
+
});
|
|
845
|
+
|
|
846
|
+
test("normalising is stable when applied twice, key for key", () => {
|
|
847
|
+
/*
|
|
848
|
+
* toStrictEqual, so a key left behind as `undefined` would fail it, and
|
|
849
|
+
* the key lists too, so a failure names the key.
|
|
850
|
+
*/
|
|
851
|
+
const once: Array<DiscoveredNetworkDevice> = normalizeDiscoveredHosts([
|
|
852
|
+
host({
|
|
853
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.ServerFailure,
|
|
854
|
+
netbiosNameStatus: DiscoveredHostNetbiosStatus.SkippedGlobalProbe,
|
|
855
|
+
}),
|
|
856
|
+
host({
|
|
857
|
+
ipAddress: "10.0.0.2",
|
|
858
|
+
dnsHostnameStatus: "server_failure" as DiscoveredHostReverseDnsStatus,
|
|
859
|
+
netbiosNameStatus: {} as unknown as DiscoveredHostNetbiosStatus,
|
|
860
|
+
}),
|
|
861
|
+
host({ ipAddress: "10.0.0.3", dnsHostnameStatus: undefined }),
|
|
862
|
+
]);
|
|
863
|
+
const twice: Array<DiscoveredNetworkDevice> =
|
|
864
|
+
normalizeDiscoveredHosts(once);
|
|
865
|
+
|
|
866
|
+
expect(twice).toStrictEqual(once);
|
|
867
|
+
expect(
|
|
868
|
+
twice.map((entry: DiscoveredNetworkDevice): Array<string> => {
|
|
869
|
+
return Object.keys(entry).sort();
|
|
870
|
+
}),
|
|
871
|
+
).toEqual([
|
|
872
|
+
["dnsHostnameStatus", "ipAddress", "netbiosNameStatus"],
|
|
873
|
+
["ipAddress"],
|
|
874
|
+
["ipAddress"],
|
|
875
|
+
]);
|
|
876
|
+
});
|
|
877
|
+
|
|
878
|
+
test("the codes survive a JSON round trip of the normalised rows", () => {
|
|
879
|
+
/*
|
|
880
|
+
* The normalised rows are what the server's auto-import engine works
|
|
881
|
+
* from and what a re-serialised response carries. The codes are plain
|
|
882
|
+
* strings, so nothing is lost or reshaped on the way.
|
|
883
|
+
*/
|
|
884
|
+
const once: Array<DiscoveredNetworkDevice> = normalizeDiscoveredHosts([
|
|
885
|
+
host({
|
|
886
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.SkippedNoResolver,
|
|
887
|
+
netbiosNameStatus: DiscoveredHostNetbiosStatus.SkippedHostCap,
|
|
888
|
+
}),
|
|
889
|
+
]);
|
|
890
|
+
const roundTripped: Array<DiscoveredNetworkDevice> = JSON.parse(
|
|
891
|
+
JSON.stringify(once),
|
|
892
|
+
) as Array<DiscoveredNetworkDevice>;
|
|
893
|
+
|
|
894
|
+
expect(normalizeDiscoveredHosts(roundTripped)).toStrictEqual(once);
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
test("the row the caller passed in is not changed", () => {
|
|
898
|
+
/*
|
|
899
|
+
* The dialog normalises the scan's stored array on every render. If
|
|
900
|
+
* this deleted keys from the rows it was handed, the stored copy would
|
|
901
|
+
* change underneath the next reader.
|
|
902
|
+
*/
|
|
903
|
+
const raw: DiscoveredNetworkDevice = host({
|
|
904
|
+
dnsHostnameStatus: "junk" as DiscoveredHostReverseDnsStatus,
|
|
905
|
+
netbiosNameStatus: DiscoveredHostNetbiosStatus.NoReply,
|
|
906
|
+
});
|
|
907
|
+
|
|
908
|
+
const [normalized] = normalizeDiscoveredHosts([raw]);
|
|
909
|
+
|
|
910
|
+
expect(normalized).not.toBe(raw);
|
|
911
|
+
expect(normalized).not.toHaveProperty("dnsHostnameStatus");
|
|
912
|
+
expect(raw.dnsHostnameStatus).toBe("junk");
|
|
913
|
+
expect(raw.netbiosNameStatus).toBe(DiscoveredHostNetbiosStatus.NoReply);
|
|
914
|
+
});
|
|
915
|
+
|
|
916
|
+
test("a row marked registered because of another row keeps its codes", () => {
|
|
917
|
+
/*
|
|
918
|
+
* The registered-address pass rebuilds the rows it flips. The codes on
|
|
919
|
+
* those rows must come through it.
|
|
920
|
+
*/
|
|
921
|
+
const result: Array<DiscoveredNetworkDevice> = normalizeDiscoveredHosts([
|
|
922
|
+
host({
|
|
923
|
+
ipAddress: "10.0.0.40",
|
|
924
|
+
isAlreadyRegistered: false,
|
|
925
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Refused,
|
|
926
|
+
netbiosNameStatus: DiscoveredHostNetbiosStatus.NoUsableName,
|
|
927
|
+
}),
|
|
928
|
+
host({ ipAddress: "10.0.0.40", isAlreadyRegistered: true }),
|
|
929
|
+
]);
|
|
930
|
+
|
|
931
|
+
expect(result[0]).toStrictEqual({
|
|
932
|
+
ipAddress: "10.0.0.40",
|
|
933
|
+
isAlreadyRegistered: true,
|
|
934
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Refused,
|
|
935
|
+
netbiosNameStatus: DiscoveredHostNetbiosStatus.NoUsableName,
|
|
936
|
+
});
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
test("cleaning the codes leaves the row's other fields alone", () => {
|
|
940
|
+
const [normalized] = normalizeDiscoveredHosts([
|
|
941
|
+
{
|
|
942
|
+
ipAddress: " 10.16.42.51 ",
|
|
943
|
+
snmpReachable: false,
|
|
944
|
+
isAlreadyRegistered: false,
|
|
945
|
+
sysDescr: "KDS terminal",
|
|
946
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Timeout,
|
|
947
|
+
netbiosNameStatus: "?" as DiscoveredHostNetbiosStatus,
|
|
948
|
+
},
|
|
949
|
+
]);
|
|
950
|
+
|
|
951
|
+
expect(normalized).toStrictEqual({
|
|
952
|
+
ipAddress: "10.16.42.51",
|
|
953
|
+
snmpReachable: false,
|
|
954
|
+
isAlreadyRegistered: false,
|
|
955
|
+
sysDescr: "KDS terminal",
|
|
956
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Timeout,
|
|
957
|
+
});
|
|
958
|
+
});
|
|
959
|
+
});
|
|
@@ -7,6 +7,16 @@ import {
|
|
|
7
7
|
getDiscoveredHostDisplayName,
|
|
8
8
|
} from "../../../Utils/NetworkDiscovery/DiscoveredDeviceBuilder";
|
|
9
9
|
import { normalizeDiscoveredHosts } from "../../../Utils/NetworkDiscovery/DiscoveredHostUtil";
|
|
10
|
+
import {
|
|
11
|
+
DiscoveredHostNamingExplanation,
|
|
12
|
+
REVERSE_DNS_NOT_RECORDED_SENTENCE,
|
|
13
|
+
explainUnnamedDiscoveredHost,
|
|
14
|
+
} from "../../../Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis";
|
|
15
|
+
import { DiscoveryScanStatus } from "../../../Utils/NetworkDiscovery/DiscoveryScanStatus";
|
|
16
|
+
import {
|
|
17
|
+
DiscoveredHostNetbiosStatus,
|
|
18
|
+
DiscoveredHostReverseDnsStatus,
|
|
19
|
+
} from "../../../Types/NetworkDevice/DiscoveredHostNamingStatus";
|
|
10
20
|
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
11
21
|
import NetworkDeviceDiscoveryScan, {
|
|
12
22
|
DiscoveredNetworkDevice,
|
|
@@ -521,6 +531,13 @@ describe("Reverse DNS, probe payload to created NetworkDevice", () => {
|
|
|
521
531
|
* a root dot is stripped, a padded address is trimmed, a numeric sysName
|
|
522
532
|
* is blanked, and a rejected PTR key is deleted. A payload that was
|
|
523
533
|
* already clean would make this test pass no matter what.
|
|
534
|
+
*
|
|
535
|
+
* The last two rows also carry the naming status codes of issue #3916,
|
|
536
|
+
* one valid and one junk each, so the first pass deletes a code from
|
|
537
|
+
* each field and keeps one in each. Those keys decide whether a row
|
|
538
|
+
* reads as "the naming passes ran" in the Review dialog, so a code that
|
|
539
|
+
* came back as `undefined` on the second pass would be exactly the
|
|
540
|
+
* split reading this test exists for.
|
|
524
541
|
*/
|
|
525
542
|
const payload: Array<unknown> = [
|
|
526
543
|
{
|
|
@@ -528,11 +545,18 @@ describe("Reverse DNS, probe payload to created NetworkDevice", () => {
|
|
|
528
545
|
snmpReachable: false,
|
|
529
546
|
dnsHostname: "hq-router-01.corp.example.net.",
|
|
530
547
|
},
|
|
531
|
-
{
|
|
548
|
+
{
|
|
549
|
+
ipAddress: " 10.18.166.53 ",
|
|
550
|
+
sysName: 42,
|
|
551
|
+
dnsHostnameStatus: "TIMEOUT",
|
|
552
|
+
netbiosNameStatus: DiscoveredHostNetbiosStatus.NoReply,
|
|
553
|
+
},
|
|
532
554
|
{
|
|
533
555
|
ipAddress: "10.18.166.54",
|
|
534
556
|
snmpReachable: false,
|
|
535
557
|
dnsHostname: "in-addr.arpa",
|
|
558
|
+
dnsHostnameStatus: DiscoveredHostReverseDnsStatus.UnusableName,
|
|
559
|
+
netbiosNameStatus: 7,
|
|
536
560
|
},
|
|
537
561
|
];
|
|
538
562
|
|
|
@@ -567,6 +591,32 @@ describe("Reverse DNS, probe payload to created NetworkDevice", () => {
|
|
|
567
591
|
expect(once[2]).not.toHaveProperty("dnsHostname");
|
|
568
592
|
expect(twice[2]).not.toHaveProperty("dnsHostname");
|
|
569
593
|
|
|
594
|
+
/*
|
|
595
|
+
* The exact keys each row ends with, the two naming status codes
|
|
596
|
+
* included: the junk ones gone, the valid ones kept, and no row gaining
|
|
597
|
+
* a key it did not arrive with.
|
|
598
|
+
*/
|
|
599
|
+
expect(
|
|
600
|
+
once.map((host: DiscoveredNetworkDevice): Array<string> => {
|
|
601
|
+
return Object.keys(host).sort();
|
|
602
|
+
}),
|
|
603
|
+
).toEqual([
|
|
604
|
+
["dnsHostname", "ipAddress", "snmpReachable"],
|
|
605
|
+
["ipAddress", "netbiosNameStatus", "sysName"],
|
|
606
|
+
["dnsHostnameStatus", "ipAddress", "snmpReachable"],
|
|
607
|
+
]);
|
|
608
|
+
|
|
609
|
+
for (const pass of [once, twice]) {
|
|
610
|
+
expect(pass[1]).not.toHaveProperty("dnsHostnameStatus");
|
|
611
|
+
expect(pass[1]?.netbiosNameStatus).toBe(
|
|
612
|
+
DiscoveredHostNetbiosStatus.NoReply,
|
|
613
|
+
);
|
|
614
|
+
expect(pass[2]?.dnsHostnameStatus).toBe(
|
|
615
|
+
DiscoveredHostReverseDnsStatus.UnusableName,
|
|
616
|
+
);
|
|
617
|
+
expect(pass[2]).not.toHaveProperty("netbiosNameStatus");
|
|
618
|
+
}
|
|
619
|
+
|
|
570
620
|
const namesOnce: Array<string> = once.map(
|
|
571
621
|
(host: DiscoveredNetworkDevice): string => {
|
|
572
622
|
return buildDeviceName(host, FULL_NAMES);
|
|
@@ -1703,3 +1753,288 @@ describe("NetBIOS names, probe payload to created NetworkDevice", () => {
|
|
|
1703
1753
|
expect(retry.dnsName).toBeUndefined();
|
|
1704
1754
|
});
|
|
1705
1755
|
});
|
|
1756
|
+
|
|
1757
|
+
/*
|
|
1758
|
+
* OneUptime issue #3916 — why a host is listed by its address.
|
|
1759
|
+
*
|
|
1760
|
+
* The probe now stamps a short code on each host it could not name: what
|
|
1761
|
+
* the reverse-DNS lookup came back with, and what NetBIOS did. The Review
|
|
1762
|
+
* dialog turns those into the sentence beside the address. This block runs
|
|
1763
|
+
* the codes down the same path the names take — payload, jsonb,
|
|
1764
|
+
* normalizeDiscoveredHosts, then the row's name and its explanation — and
|
|
1765
|
+
* pins the joints:
|
|
1766
|
+
*
|
|
1767
|
+
* - the normaliser and the explanation read the codes the same way, so a
|
|
1768
|
+
* junk code cannot mean "a code" to one and "no code" to the other;
|
|
1769
|
+
* - the explanation is shown on exactly the rows whose name is their
|
|
1770
|
+
* address;
|
|
1771
|
+
* - the codes never change what a host is called or what device is built.
|
|
1772
|
+
*/
|
|
1773
|
+
describe("Naming status codes, probe payload to the Review row's explanation", () => {
|
|
1774
|
+
/*
|
|
1775
|
+
* The scan the way the dialog really hands it over: through the model's
|
|
1776
|
+
* serializer and back, so its status and settings are what a stored row
|
|
1777
|
+
* yields.
|
|
1778
|
+
*/
|
|
1779
|
+
function scanThroughSerializer(settings: {
|
|
1780
|
+
isSnmpEnabled: boolean;
|
|
1781
|
+
isNetbiosLookupEnabled: boolean;
|
|
1782
|
+
}): NetworkDeviceDiscoveryScan {
|
|
1783
|
+
const scan: NetworkDeviceDiscoveryScan = new NetworkDeviceDiscoveryScan();
|
|
1784
|
+
scan.status = DiscoveryScanStatus.Completed;
|
|
1785
|
+
scan.isSnmpEnabled = settings.isSnmpEnabled;
|
|
1786
|
+
scan.isNetbiosLookupEnabled = settings.isNetbiosLookupEnabled;
|
|
1787
|
+
|
|
1788
|
+
const wire: JSONObject = JSON.parse(
|
|
1789
|
+
JSON.stringify(
|
|
1790
|
+
DatabaseBaseModel.toJSON(scan, NetworkDeviceDiscoveryScan),
|
|
1791
|
+
),
|
|
1792
|
+
) as JSONObject;
|
|
1793
|
+
|
|
1794
|
+
return DatabaseBaseModel.fromJSONObject(wire, NetworkDeviceDiscoveryScan);
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
/*
|
|
1798
|
+
* The reporter's scan: ping only. NetBIOS names on, the wizard's default,
|
|
1799
|
+
* since the issue does not say.
|
|
1800
|
+
*/
|
|
1801
|
+
const REPORTERS_SCAN: NetworkDeviceDiscoveryScan = scanThroughSerializer({
|
|
1802
|
+
isSnmpEnabled: false,
|
|
1803
|
+
isNetbiosLookupEnabled: true,
|
|
1804
|
+
});
|
|
1805
|
+
|
|
1806
|
+
/*
|
|
1807
|
+
* The reporter's kitchen displays as a current probe would send them,
|
|
1808
|
+
* plus the rows a probe of another version could leave in the column:
|
|
1809
|
+
*
|
|
1810
|
+
* .51 named by PTR: a named host carries no codes
|
|
1811
|
+
* .52 the DNS server answered: no PTR record
|
|
1812
|
+
* .53 the DNS server did not answer in time
|
|
1813
|
+
* .54 the DNS server answered SERVFAIL
|
|
1814
|
+
* .55 a PTR answer that normalised away (an older probe stored the name
|
|
1815
|
+
* too), so the host is unnamed, with the code that says why
|
|
1816
|
+
* .56 a code from a newer probe, which this build does not know
|
|
1817
|
+
* .57 a row from an older probe: no codes at all
|
|
1818
|
+
* .58 a reverse-DNS code on a host NetBIOS then named
|
|
1819
|
+
*/
|
|
1820
|
+
const PAYLOAD: Array<unknown> = [
|
|
1821
|
+
{
|
|
1822
|
+
ipAddress: "10.16.42.51",
|
|
1823
|
+
snmpReachable: false,
|
|
1824
|
+
dnsHostname: "WB0024KDS02.corp.example.com",
|
|
1825
|
+
},
|
|
1826
|
+
{
|
|
1827
|
+
ipAddress: "10.16.42.52",
|
|
1828
|
+
snmpReachable: false,
|
|
1829
|
+
dnsHostnameStatus: "no-record",
|
|
1830
|
+
netbiosNameStatus: "no-reply",
|
|
1831
|
+
},
|
|
1832
|
+
{
|
|
1833
|
+
ipAddress: "10.16.42.53",
|
|
1834
|
+
snmpReachable: false,
|
|
1835
|
+
dnsHostnameStatus: "timeout",
|
|
1836
|
+
netbiosNameStatus: "no-reply",
|
|
1837
|
+
},
|
|
1838
|
+
{
|
|
1839
|
+
ipAddress: "10.16.42.54",
|
|
1840
|
+
snmpReachable: false,
|
|
1841
|
+
dnsHostnameStatus: "server-failure",
|
|
1842
|
+
netbiosNameStatus: "no-reply",
|
|
1843
|
+
},
|
|
1844
|
+
{
|
|
1845
|
+
ipAddress: "10.16.42.55",
|
|
1846
|
+
snmpReachable: false,
|
|
1847
|
+
dnsHostname: "55.42.16.10.in-addr.arpa",
|
|
1848
|
+
dnsHostnameStatus: "unusable-name",
|
|
1849
|
+
netbiosNameStatus: "no-usable-name",
|
|
1850
|
+
},
|
|
1851
|
+
{
|
|
1852
|
+
ipAddress: "10.16.42.56",
|
|
1853
|
+
snmpReachable: false,
|
|
1854
|
+
dnsHostnameStatus: "dnssec-bogus",
|
|
1855
|
+
netbiosNameStatus: "no-reply",
|
|
1856
|
+
},
|
|
1857
|
+
{ ipAddress: "10.16.42.57", snmpReachable: false },
|
|
1858
|
+
{
|
|
1859
|
+
ipAddress: "10.16.42.58",
|
|
1860
|
+
snmpReachable: false,
|
|
1861
|
+
dnsHostnameStatus: "no-record",
|
|
1862
|
+
netbiosName: "WB0024KDS08",
|
|
1863
|
+
},
|
|
1864
|
+
];
|
|
1865
|
+
|
|
1866
|
+
function explanationsOf(
|
|
1867
|
+
hosts: Array<DiscoveredNetworkDevice>,
|
|
1868
|
+
): Array<DiscoveredHostNamingExplanation | undefined> {
|
|
1869
|
+
return hosts.map(
|
|
1870
|
+
(
|
|
1871
|
+
host: DiscoveredNetworkDevice,
|
|
1872
|
+
): DiscoveredHostNamingExplanation | undefined => {
|
|
1873
|
+
return explainUnnamedDiscoveredHost({
|
|
1874
|
+
host: host,
|
|
1875
|
+
scan: REPORTERS_SCAN,
|
|
1876
|
+
isGlobalProbe: false,
|
|
1877
|
+
});
|
|
1878
|
+
},
|
|
1879
|
+
);
|
|
1880
|
+
}
|
|
1881
|
+
|
|
1882
|
+
it("keeps the scan's settings and status through the serializer", () => {
|
|
1883
|
+
expect(REPORTERS_SCAN.status).toBe(DiscoveryScanStatus.Completed);
|
|
1884
|
+
expect(REPORTERS_SCAN.isSnmpEnabled).toBe(false);
|
|
1885
|
+
expect(REPORTERS_SCAN.isNetbiosLookupEnabled).toBe(true);
|
|
1886
|
+
});
|
|
1887
|
+
|
|
1888
|
+
it("stores every code a current probe sends, and drops the one this build does not know", () => {
|
|
1889
|
+
const hosts: Array<DiscoveredNetworkDevice> = hostsFromPayload(PAYLOAD);
|
|
1890
|
+
|
|
1891
|
+
expect(
|
|
1892
|
+
hosts.map((host: DiscoveredNetworkDevice): Array<unknown> => {
|
|
1893
|
+
return [host.dnsHostnameStatus, host.netbiosNameStatus];
|
|
1894
|
+
}),
|
|
1895
|
+
).toEqual([
|
|
1896
|
+
[undefined, undefined],
|
|
1897
|
+
[
|
|
1898
|
+
DiscoveredHostReverseDnsStatus.NoRecord,
|
|
1899
|
+
DiscoveredHostNetbiosStatus.NoReply,
|
|
1900
|
+
],
|
|
1901
|
+
[
|
|
1902
|
+
DiscoveredHostReverseDnsStatus.Timeout,
|
|
1903
|
+
DiscoveredHostNetbiosStatus.NoReply,
|
|
1904
|
+
],
|
|
1905
|
+
[
|
|
1906
|
+
DiscoveredHostReverseDnsStatus.ServerFailure,
|
|
1907
|
+
DiscoveredHostNetbiosStatus.NoReply,
|
|
1908
|
+
],
|
|
1909
|
+
[
|
|
1910
|
+
DiscoveredHostReverseDnsStatus.UnusableName,
|
|
1911
|
+
DiscoveredHostNetbiosStatus.NoUsableName,
|
|
1912
|
+
],
|
|
1913
|
+
[undefined, DiscoveredHostNetbiosStatus.NoReply],
|
|
1914
|
+
[undefined, undefined],
|
|
1915
|
+
[DiscoveredHostReverseDnsStatus.NoRecord, undefined],
|
|
1916
|
+
]);
|
|
1917
|
+
|
|
1918
|
+
// Deleted, not left behind holding undefined.
|
|
1919
|
+
expect(hosts[5]).not.toHaveProperty("dnsHostnameStatus");
|
|
1920
|
+
expect(hosts[6]).not.toHaveProperty("dnsHostnameStatus");
|
|
1921
|
+
expect(hosts[6]).not.toHaveProperty("netbiosNameStatus");
|
|
1922
|
+
});
|
|
1923
|
+
|
|
1924
|
+
it("explains each unnamed display by its own lookup, and the named ones not at all", () => {
|
|
1925
|
+
const explanations: Array<DiscoveredHostNamingExplanation | undefined> =
|
|
1926
|
+
explanationsOf(hostsFromPayload(PAYLOAD));
|
|
1927
|
+
|
|
1928
|
+
// Named by PTR, and by NetBIOS: no hint.
|
|
1929
|
+
expect(explanations[0]).toBeUndefined();
|
|
1930
|
+
expect(explanations[7]).toBeUndefined();
|
|
1931
|
+
|
|
1932
|
+
/*
|
|
1933
|
+
* The three the issue could not tell apart. The exact sentences are
|
|
1934
|
+
* pinned in DiscoveredHostNamingDiagnosis.test.ts; this only checks that
|
|
1935
|
+
* each row reached the one for its own code.
|
|
1936
|
+
*/
|
|
1937
|
+
expect(explanations[1]?.text).toContain("no PTR record");
|
|
1938
|
+
expect(explanations[2]?.text).toContain("did not answer in time");
|
|
1939
|
+
expect(explanations[3]?.text).toContain("SERVFAIL");
|
|
1940
|
+
expect(explanations[4]?.text).toContain("not a valid hostname");
|
|
1941
|
+
|
|
1942
|
+
for (const index of [1, 2, 3, 4]) {
|
|
1943
|
+
expect(explanations[index]?.text).not.toContain(
|
|
1944
|
+
REVERSE_DNS_NOT_RECORDED_SENTENCE,
|
|
1945
|
+
);
|
|
1946
|
+
}
|
|
1947
|
+
|
|
1948
|
+
/*
|
|
1949
|
+
* The unknown code and the older probe's row both say only that no name
|
|
1950
|
+
* was recorded, and say it the same way.
|
|
1951
|
+
*/
|
|
1952
|
+
expect(explanations[5]?.text).toContain(REVERSE_DNS_NOT_RECORDED_SENTENCE);
|
|
1953
|
+
expect(explanations[6]?.text).toContain(REVERSE_DNS_NOT_RECORDED_SENTENCE);
|
|
1954
|
+
expect(explanations[5]?.text).not.toContain("PTR");
|
|
1955
|
+
expect(explanations[6]?.text).not.toContain("PTR");
|
|
1956
|
+
});
|
|
1957
|
+
|
|
1958
|
+
it("explains a row the same from the raw stored jsonb as from the normalised row", () => {
|
|
1959
|
+
/*
|
|
1960
|
+
* The explanation reads the codes through the same whitelist the
|
|
1961
|
+
* normaliser applies, so handing it an un-normalised row changes
|
|
1962
|
+
* nothing. If the two whitelists ever drifted, the unknown-code row
|
|
1963
|
+
* would be where it showed.
|
|
1964
|
+
*/
|
|
1965
|
+
expect(explanationsOf(storedScanResults(PAYLOAD))).toStrictEqual(
|
|
1966
|
+
explanationsOf(hostsFromPayload(PAYLOAD)),
|
|
1967
|
+
);
|
|
1968
|
+
});
|
|
1969
|
+
|
|
1970
|
+
it("shows the explanation on exactly the rows named by their address", () => {
|
|
1971
|
+
const hosts: Array<DiscoveredNetworkDevice> = hostsFromPayload(PAYLOAD);
|
|
1972
|
+
const explanations: Array<DiscoveredHostNamingExplanation | undefined> =
|
|
1973
|
+
explanationsOf(hosts);
|
|
1974
|
+
|
|
1975
|
+
hosts.forEach((host: DiscoveredNetworkDevice, index: number) => {
|
|
1976
|
+
expect(Boolean(explanations[index])).toBe(
|
|
1977
|
+
buildDeviceName(host, FULL_NAMES) === host.ipAddress,
|
|
1978
|
+
);
|
|
1979
|
+
});
|
|
1980
|
+
});
|
|
1981
|
+
|
|
1982
|
+
it("names and builds the same devices with the codes as without them", () => {
|
|
1983
|
+
/*
|
|
1984
|
+
* The codes explain a name; they must never choose one. The same payload
|
|
1985
|
+
* with every code stripped has to import identically.
|
|
1986
|
+
*/
|
|
1987
|
+
const withoutCodes: Array<unknown> = PAYLOAD.map(
|
|
1988
|
+
(entry: unknown): unknown => {
|
|
1989
|
+
const copy: JSONObject = { ...(entry as JSONObject) };
|
|
1990
|
+
delete copy["dnsHostnameStatus"];
|
|
1991
|
+
delete copy["netbiosNameStatus"];
|
|
1992
|
+
return copy;
|
|
1993
|
+
},
|
|
1994
|
+
);
|
|
1995
|
+
|
|
1996
|
+
expect(namesFromPayload(PAYLOAD)).toEqual(namesFromPayload(withoutCodes));
|
|
1997
|
+
expect(namesFromPayload(PAYLOAD)).toEqual([
|
|
1998
|
+
"WB0024KDS02.corp.example.com",
|
|
1999
|
+
"10.16.42.52",
|
|
2000
|
+
"10.16.42.53",
|
|
2001
|
+
"10.16.42.54",
|
|
2002
|
+
"10.16.42.55",
|
|
2003
|
+
"10.16.42.56",
|
|
2004
|
+
"10.16.42.57",
|
|
2005
|
+
"wb0024kds08",
|
|
2006
|
+
]);
|
|
2007
|
+
|
|
2008
|
+
expect(deviceHostnames(devicesFromPayload(PAYLOAD))).toEqual(
|
|
2009
|
+
deviceHostnames(devicesFromPayload(withoutCodes)),
|
|
2010
|
+
);
|
|
2011
|
+
});
|
|
2012
|
+
|
|
2013
|
+
it("never carries a code into the created device", () => {
|
|
2014
|
+
/*
|
|
2015
|
+
* A code is a note about one scan's lookup, not a property of the
|
|
2016
|
+
* device. Nothing of it may reach the NetworkDevice row an import
|
|
2017
|
+
* creates.
|
|
2018
|
+
*/
|
|
2019
|
+
for (const device of devicesFromPayload(PAYLOAD)) {
|
|
2020
|
+
const stored: string = JSON.stringify(
|
|
2021
|
+
DatabaseBaseModel.toJSON(device, NetworkDevice),
|
|
2022
|
+
);
|
|
2023
|
+
|
|
2024
|
+
// The serialised device is real: it carries the address it dials.
|
|
2025
|
+
expect(stored).toContain(`"${device.hostname}"`);
|
|
2026
|
+
|
|
2027
|
+
for (const forbidden of [
|
|
2028
|
+
"dnsHostnameStatus",
|
|
2029
|
+
"netbiosNameStatus",
|
|
2030
|
+
"no-record",
|
|
2031
|
+
"server-failure",
|
|
2032
|
+
"unusable-name",
|
|
2033
|
+
"no-reply",
|
|
2034
|
+
"no-usable-name",
|
|
2035
|
+
]) {
|
|
2036
|
+
expect(stored).not.toContain(forbidden);
|
|
2037
|
+
}
|
|
2038
|
+
}
|
|
2039
|
+
});
|
|
2040
|
+
});
|