@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
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DiscoveredHostNetbiosStatus,
|
|
3
|
+
DiscoveredHostReverseDnsStatus,
|
|
4
|
+
readDiscoveredHostNetbiosStatus,
|
|
5
|
+
readDiscoveredHostReverseDnsStatus,
|
|
6
|
+
} from "../../../Types/NetworkDevice/DiscoveredHostNamingStatus";
|
|
7
|
+
import { describe, expect, test } from "@jest/globals";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* The per-host "why is this host unnamed" codes (OneUptime issue #3916), and
|
|
11
|
+
* the two readers every consumer goes through.
|
|
12
|
+
*
|
|
13
|
+
* The codes are PERSISTED: the probe stamps them into the scan's
|
|
14
|
+
* `discoveredDevices` jsonb, and rows written today are read by every
|
|
15
|
+
* dashboard build from now on. So the spellings are pinned here as literals
|
|
16
|
+
* rather than read back out of the enum. A test that compared the enum with
|
|
17
|
+
* itself would stay green through a rename, and a rename is exactly the
|
|
18
|
+
* change that silently turns every stored code into "no code".
|
|
19
|
+
*
|
|
20
|
+
* The readers are the other half of the contract. The column is written
|
|
21
|
+
* verbatim from the probe's payload, so the declared type says what a probe
|
|
22
|
+
* SHOULD send, not what is stored. A reader that let anything else through
|
|
23
|
+
* would hand the dashboard a value it has no sentence for. Two cases matter
|
|
24
|
+
* most:
|
|
25
|
+
*
|
|
26
|
+
* - A near miss, like "No-Record" or "timeout ". It looks like a code to a
|
|
27
|
+
* person, but the copy table is keyed by exact strings. Accepting it would
|
|
28
|
+
* need a normalisation step nothing else does, and an unknown key would
|
|
29
|
+
* then look up `undefined` copy.
|
|
30
|
+
* - A prototype key, like "constructor". A reader built on `value in
|
|
31
|
+
* SOME_OBJECT` would accept it, and the copy lookup would then return a
|
|
32
|
+
* FUNCTION, which ends up in the tooltip as its source text.
|
|
33
|
+
*
|
|
34
|
+
* Everything that is not exactly a code reads as undefined, which every
|
|
35
|
+
* consumer already treats as "this row carries no code".
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
const REVERSE_DNS_CODES: Array<string> = [
|
|
39
|
+
"no-record",
|
|
40
|
+
"unusable-name",
|
|
41
|
+
"timeout",
|
|
42
|
+
"server-failure",
|
|
43
|
+
"refused",
|
|
44
|
+
"unreachable",
|
|
45
|
+
"failed",
|
|
46
|
+
"skipped-time-budget",
|
|
47
|
+
"skipped-no-resolver",
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
const NETBIOS_CODES: Array<string> = [
|
|
51
|
+
"no-reply",
|
|
52
|
+
"no-usable-name",
|
|
53
|
+
"send-failed",
|
|
54
|
+
"skipped",
|
|
55
|
+
"skipped-host-cap",
|
|
56
|
+
"skipped-ineligible-address",
|
|
57
|
+
"skipped-global-probe",
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* Every value that is not a string, as jsonb and a hand-written API call
|
|
62
|
+
* can deliver them, plus the JavaScript values no JSON can hold. The readers
|
|
63
|
+
* accept `unknown` because of these.
|
|
64
|
+
*/
|
|
65
|
+
const NON_STRING_VALUES: Array<[string, unknown]> = [
|
|
66
|
+
["undefined", undefined],
|
|
67
|
+
["null", null],
|
|
68
|
+
["zero", 0],
|
|
69
|
+
["a positive number", 7],
|
|
70
|
+
["a negative number", -1],
|
|
71
|
+
["NaN", NaN],
|
|
72
|
+
["Infinity", Infinity],
|
|
73
|
+
["true", true],
|
|
74
|
+
["false", false],
|
|
75
|
+
["an empty object", {}],
|
|
76
|
+
["an empty array", []],
|
|
77
|
+
["an array holding a code", ["timeout"]],
|
|
78
|
+
["an array holding a NetBIOS code", ["no-reply"]],
|
|
79
|
+
["an object wrapping a code", { value: "timeout" }],
|
|
80
|
+
["a String object", new String("timeout")],
|
|
81
|
+
[
|
|
82
|
+
"an object whose toString is a code",
|
|
83
|
+
{
|
|
84
|
+
toString: (): string => {
|
|
85
|
+
return "timeout";
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
["a symbol", Symbol("timeout")],
|
|
90
|
+
["a bigint", BigInt(1)],
|
|
91
|
+
[
|
|
92
|
+
"a function",
|
|
93
|
+
(): string => {
|
|
94
|
+
return "timeout";
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
["a date", new Date(0)],
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
/*
|
|
101
|
+
* Strings that are not codes. The prototype keys are listed separately
|
|
102
|
+
* below.
|
|
103
|
+
*/
|
|
104
|
+
const JUNK_STRINGS: Array<[string, string]> = [
|
|
105
|
+
["the empty string", ""],
|
|
106
|
+
["a single space", " "],
|
|
107
|
+
["a sentence", "the DNS server timed out"],
|
|
108
|
+
["markup", "<img src=x onerror=1>"],
|
|
109
|
+
["a raw Node error code", "ENOTFOUND"],
|
|
110
|
+
["a raw DNS rcode", "SERVFAIL"],
|
|
111
|
+
["a hostname", "kds-01.corp.example.com"],
|
|
112
|
+
["an address", "10.16.42.51"],
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
const PROTOTYPE_KEYS: Array<string> = [
|
|
116
|
+
"constructor",
|
|
117
|
+
"__proto__",
|
|
118
|
+
"toString",
|
|
119
|
+
"valueOf",
|
|
120
|
+
"hasOwnProperty",
|
|
121
|
+
"isPrototypeOf",
|
|
122
|
+
"propertyIsEnumerable",
|
|
123
|
+
"toLocaleString",
|
|
124
|
+
"prototype",
|
|
125
|
+
"__defineGetter__",
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* The near misses a person would read as a code: every spelling here is one
|
|
130
|
+
* edit away from a real one. A one-word code has no hyphen to swap, so the
|
|
131
|
+
* spellings that come out identical to the code itself are dropped.
|
|
132
|
+
*/
|
|
133
|
+
function nearMissesOf(code: string): Array<string> {
|
|
134
|
+
const camelCase: string = code.replace(
|
|
135
|
+
/-([a-z])/g,
|
|
136
|
+
(_match: string, letter: string): string => {
|
|
137
|
+
return letter.toUpperCase();
|
|
138
|
+
},
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
return [
|
|
142
|
+
code.toUpperCase(),
|
|
143
|
+
code.charAt(0).toUpperCase() + code.slice(1),
|
|
144
|
+
` ${code}`,
|
|
145
|
+
`${code} `,
|
|
146
|
+
`\t${code}\n`,
|
|
147
|
+
`${code}\u0000`,
|
|
148
|
+
code.replace(/-/g, "_"),
|
|
149
|
+
code.replace(/-/g, " "),
|
|
150
|
+
camelCase,
|
|
151
|
+
// The enum KEY spelling, e.g. "NoRecord" for "no-record".
|
|
152
|
+
camelCase.charAt(0).toUpperCase() + camelCase.slice(1),
|
|
153
|
+
`${code}s`,
|
|
154
|
+
code.slice(0, -1),
|
|
155
|
+
`"${code}"`,
|
|
156
|
+
].filter((nearMiss: string): boolean => {
|
|
157
|
+
return nearMiss !== code;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
describe("DiscoveredHostReverseDnsStatus", () => {
|
|
162
|
+
test("holds exactly the persisted codes, spelled as they are stored", () => {
|
|
163
|
+
expect(Object.values(DiscoveredHostReverseDnsStatus).sort()).toEqual(
|
|
164
|
+
[...REVERSE_DNS_CODES].sort(),
|
|
165
|
+
);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test.each([
|
|
169
|
+
[DiscoveredHostReverseDnsStatus.NoRecord, "no-record"],
|
|
170
|
+
[DiscoveredHostReverseDnsStatus.UnusableName, "unusable-name"],
|
|
171
|
+
[DiscoveredHostReverseDnsStatus.Timeout, "timeout"],
|
|
172
|
+
[DiscoveredHostReverseDnsStatus.ServerFailure, "server-failure"],
|
|
173
|
+
[DiscoveredHostReverseDnsStatus.Refused, "refused"],
|
|
174
|
+
[DiscoveredHostReverseDnsStatus.Unreachable, "unreachable"],
|
|
175
|
+
[DiscoveredHostReverseDnsStatus.Failed, "failed"],
|
|
176
|
+
[DiscoveredHostReverseDnsStatus.SkippedTimeBudget, "skipped-time-budget"],
|
|
177
|
+
[DiscoveredHostReverseDnsStatus.SkippedNoResolver, "skipped-no-resolver"],
|
|
178
|
+
])("%s is stored as %p", (member: string, stored: string) => {
|
|
179
|
+
expect(member).toBe(stored);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe("DiscoveredHostNetbiosStatus", () => {
|
|
184
|
+
test("holds exactly the persisted codes, spelled as they are stored", () => {
|
|
185
|
+
expect(Object.values(DiscoveredHostNetbiosStatus).sort()).toEqual(
|
|
186
|
+
[...NETBIOS_CODES].sort(),
|
|
187
|
+
);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test.each([
|
|
191
|
+
[DiscoveredHostNetbiosStatus.NoReply, "no-reply"],
|
|
192
|
+
[DiscoveredHostNetbiosStatus.NoUsableName, "no-usable-name"],
|
|
193
|
+
[DiscoveredHostNetbiosStatus.SendFailed, "send-failed"],
|
|
194
|
+
[DiscoveredHostNetbiosStatus.Skipped, "skipped"],
|
|
195
|
+
[DiscoveredHostNetbiosStatus.SkippedHostCap, "skipped-host-cap"],
|
|
196
|
+
[
|
|
197
|
+
DiscoveredHostNetbiosStatus.SkippedIneligibleAddress,
|
|
198
|
+
"skipped-ineligible-address",
|
|
199
|
+
],
|
|
200
|
+
[DiscoveredHostNetbiosStatus.SkippedGlobalProbe, "skipped-global-probe"],
|
|
201
|
+
])("%s is stored as %p", (member: string, stored: string) => {
|
|
202
|
+
expect(member).toBe(stored);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
describe("the two code sets", () => {
|
|
207
|
+
/*
|
|
208
|
+
* No code means one thing in one field and something else in the other.
|
|
209
|
+
* If a spelling were shared, a probe that wrote it to the wrong field would
|
|
210
|
+
* get a plausible but wrong sentence instead of the "no code" fallback.
|
|
211
|
+
*/
|
|
212
|
+
test("share no spelling", () => {
|
|
213
|
+
const reverseDnsCodes: Set<string> = new Set<string>(
|
|
214
|
+
Object.values(DiscoveredHostReverseDnsStatus),
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
for (const code of Object.values(DiscoveredHostNetbiosStatus)) {
|
|
218
|
+
expect(reverseDnsCodes.has(code)).toBe(false);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
/*
|
|
223
|
+
* Short kebab-case: the column can hold tens of thousands of hosts, and
|
|
224
|
+
* each code is repeated once per unnamed host. Anything longer, or with
|
|
225
|
+
* spaces or capitals, is a sentence that has slipped into the payload.
|
|
226
|
+
*/
|
|
227
|
+
test.each([
|
|
228
|
+
...Object.values(DiscoveredHostReverseDnsStatus),
|
|
229
|
+
...Object.values(DiscoveredHostNetbiosStatus),
|
|
230
|
+
])("%p is short lower-case kebab-case", (code: string) => {
|
|
231
|
+
expect(code).toMatch(/^[a-z]+(?:-[a-z]+)*$/);
|
|
232
|
+
expect(code.length).toBeLessThanOrEqual(32);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
describe("readDiscoveredHostReverseDnsStatus", () => {
|
|
237
|
+
test.each(Object.values(DiscoveredHostReverseDnsStatus))(
|
|
238
|
+
"reads the exact code %p as itself",
|
|
239
|
+
(code: DiscoveredHostReverseDnsStatus) => {
|
|
240
|
+
expect(readDiscoveredHostReverseDnsStatus(code)).toBe(code);
|
|
241
|
+
},
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
test.each(REVERSE_DNS_CODES)(
|
|
245
|
+
"reads the literal %p as the matching enum member",
|
|
246
|
+
(literal: string) => {
|
|
247
|
+
/*
|
|
248
|
+
* The value comes out of JSON as a plain string, never as an enum
|
|
249
|
+
* member, so this is the case that happens in production.
|
|
250
|
+
*/
|
|
251
|
+
const stored: unknown = JSON.parse(JSON.stringify(literal));
|
|
252
|
+
|
|
253
|
+
expect(readDiscoveredHostReverseDnsStatus(stored)).toBe(literal);
|
|
254
|
+
},
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
test.each(REVERSE_DNS_CODES)(
|
|
258
|
+
"rejects every near miss of %p",
|
|
259
|
+
(code: string) => {
|
|
260
|
+
// Enough spellings survive the filter for this to test something.
|
|
261
|
+
expect(nearMissesOf(code).length).toBeGreaterThanOrEqual(10);
|
|
262
|
+
|
|
263
|
+
for (const nearMiss of nearMissesOf(code)) {
|
|
264
|
+
expect(readDiscoveredHostReverseDnsStatus(nearMiss)).toBeUndefined();
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
test.each(NON_STRING_VALUES)(
|
|
270
|
+
"rejects %s",
|
|
271
|
+
(_label: string, value: unknown) => {
|
|
272
|
+
expect(readDiscoveredHostReverseDnsStatus(value)).toBeUndefined();
|
|
273
|
+
},
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
test.each(JUNK_STRINGS)("rejects %s", (_label: string, value: string) => {
|
|
277
|
+
expect(readDiscoveredHostReverseDnsStatus(value)).toBeUndefined();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test.each(PROTOTYPE_KEYS)("rejects the prototype key %p", (key: string) => {
|
|
281
|
+
expect(readDiscoveredHostReverseDnsStatus(key)).toBeUndefined();
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test.each(Object.values(DiscoveredHostNetbiosStatus))(
|
|
285
|
+
"rejects the NetBIOS code %p",
|
|
286
|
+
(code: string) => {
|
|
287
|
+
/*
|
|
288
|
+
* A probe that stamped a NetBIOS code into the reverse-DNS field would
|
|
289
|
+
* otherwise have the dashboard look up a key its reverse-DNS copy
|
|
290
|
+
* table does not have.
|
|
291
|
+
*/
|
|
292
|
+
expect(readDiscoveredHostReverseDnsStatus(code)).toBeUndefined();
|
|
293
|
+
},
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
test("rejects the enum's own key names", () => {
|
|
297
|
+
for (const key of Object.keys(DiscoveredHostReverseDnsStatus)) {
|
|
298
|
+
expect(readDiscoveredHostReverseDnsStatus(key)).toBeUndefined();
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
test("never throws, whatever it is handed", () => {
|
|
303
|
+
const hostile: Array<unknown> = [
|
|
304
|
+
Object.create(null),
|
|
305
|
+
new Proxy(
|
|
306
|
+
{},
|
|
307
|
+
{
|
|
308
|
+
get: (): never => {
|
|
309
|
+
throw new Error("read");
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
),
|
|
313
|
+
...NON_STRING_VALUES.map((entry: [string, unknown]): unknown => {
|
|
314
|
+
return entry[1];
|
|
315
|
+
}),
|
|
316
|
+
];
|
|
317
|
+
|
|
318
|
+
for (const value of hostile) {
|
|
319
|
+
expect(() => {
|
|
320
|
+
return readDiscoveredHostReverseDnsStatus(value);
|
|
321
|
+
}).not.toThrow();
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
describe("readDiscoveredHostNetbiosStatus", () => {
|
|
327
|
+
test.each(Object.values(DiscoveredHostNetbiosStatus))(
|
|
328
|
+
"reads the exact code %p as itself",
|
|
329
|
+
(code: DiscoveredHostNetbiosStatus) => {
|
|
330
|
+
expect(readDiscoveredHostNetbiosStatus(code)).toBe(code);
|
|
331
|
+
},
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
test.each(NETBIOS_CODES)(
|
|
335
|
+
"reads the literal %p as the matching enum member",
|
|
336
|
+
(literal: string) => {
|
|
337
|
+
const stored: unknown = JSON.parse(JSON.stringify(literal));
|
|
338
|
+
|
|
339
|
+
expect(readDiscoveredHostNetbiosStatus(stored)).toBe(literal);
|
|
340
|
+
},
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
test.each(NETBIOS_CODES)("rejects every near miss of %p", (code: string) => {
|
|
344
|
+
expect(nearMissesOf(code).length).toBeGreaterThanOrEqual(10);
|
|
345
|
+
|
|
346
|
+
for (const nearMiss of nearMissesOf(code)) {
|
|
347
|
+
expect(readDiscoveredHostNetbiosStatus(nearMiss)).toBeUndefined();
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
test.each(NON_STRING_VALUES)(
|
|
352
|
+
"rejects %s",
|
|
353
|
+
(_label: string, value: unknown) => {
|
|
354
|
+
expect(readDiscoveredHostNetbiosStatus(value)).toBeUndefined();
|
|
355
|
+
},
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
test.each(JUNK_STRINGS)("rejects %s", (_label: string, value: string) => {
|
|
359
|
+
expect(readDiscoveredHostNetbiosStatus(value)).toBeUndefined();
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
test.each(PROTOTYPE_KEYS)("rejects the prototype key %p", (key: string) => {
|
|
363
|
+
expect(readDiscoveredHostNetbiosStatus(key)).toBeUndefined();
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
test.each(Object.values(DiscoveredHostReverseDnsStatus))(
|
|
367
|
+
"rejects the reverse-DNS code %p",
|
|
368
|
+
(code: string) => {
|
|
369
|
+
expect(readDiscoveredHostNetbiosStatus(code)).toBeUndefined();
|
|
370
|
+
},
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
test("rejects the enum's own key names", () => {
|
|
374
|
+
for (const key of Object.keys(DiscoveredHostNetbiosStatus)) {
|
|
375
|
+
expect(readDiscoveredHostNetbiosStatus(key)).toBeUndefined();
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
test("never throws, whatever it is handed", () => {
|
|
380
|
+
const hostile: Array<unknown> = [
|
|
381
|
+
Object.create(null),
|
|
382
|
+
new Proxy(
|
|
383
|
+
{},
|
|
384
|
+
{
|
|
385
|
+
get: (): never => {
|
|
386
|
+
throw new Error("read");
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
),
|
|
390
|
+
...NON_STRING_VALUES.map((entry: [string, unknown]): unknown => {
|
|
391
|
+
return entry[1];
|
|
392
|
+
}),
|
|
393
|
+
];
|
|
394
|
+
|
|
395
|
+
for (const value of hostile) {
|
|
396
|
+
expect(() => {
|
|
397
|
+
return readDiscoveredHostNetbiosStatus(value);
|
|
398
|
+
}).not.toThrow();
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
});
|
|
@@ -45,6 +45,7 @@ const NEWLY_FILTERABLE_KEYS: Array<string> = [
|
|
|
45
45
|
"cloudResourceId",
|
|
46
46
|
"rumApplicationId",
|
|
47
47
|
"iotFleetId",
|
|
48
|
+
"databaseServerId",
|
|
48
49
|
];
|
|
49
50
|
|
|
50
51
|
function facetMap(
|
|
@@ -86,7 +87,7 @@ describe("ResourceEntityFacet", () => {
|
|
|
86
87
|
expect([...RESOURCE_ENTITY_FACET_KEYS]).toEqual([
|
|
87
88
|
...RESOURCE_FACET_CATALOG_KEYS,
|
|
88
89
|
]);
|
|
89
|
-
expect(RESOURCE_ENTITY_FACET_KEYS).toHaveLength(
|
|
90
|
+
expect(RESOURCE_ENTITY_FACET_KEYS).toHaveLength(13);
|
|
90
91
|
});
|
|
91
92
|
|
|
92
93
|
test("the non-Service group is a copy, not the catalog's own array", () => {
|
|
@@ -99,6 +100,8 @@ describe("ResourceEntityFacet", () => {
|
|
|
99
100
|
"ProxmoxClusterId",
|
|
100
101
|
"cephclusterid",
|
|
101
102
|
" iotFleetId",
|
|
103
|
+
"DatabaseServerId",
|
|
104
|
+
"databaseId",
|
|
102
105
|
"constructor",
|
|
103
106
|
"__proto__",
|
|
104
107
|
]) {
|
|
@@ -107,6 +107,13 @@ const EXPECTED_CATALOG: Array<CatalogRow> = [
|
|
|
107
107
|
"IoT Fleets",
|
|
108
108
|
IconProp.IoT,
|
|
109
109
|
],
|
|
110
|
+
[
|
|
111
|
+
"databaseServerId",
|
|
112
|
+
ServiceType.DatabaseServer,
|
|
113
|
+
"Database",
|
|
114
|
+
"Databases",
|
|
115
|
+
IconProp.Database,
|
|
116
|
+
],
|
|
110
117
|
];
|
|
111
118
|
|
|
112
119
|
const EXPECTED_KEYS: Array<string> = EXPECTED_CATALOG.map(
|
|
@@ -117,8 +124,8 @@ const EXPECTED_KEYS: Array<string> = EXPECTED_CATALOG.map(
|
|
|
117
124
|
|
|
118
125
|
describe("ResourceFacetCatalog", () => {
|
|
119
126
|
describe("contents", () => {
|
|
120
|
-
test("lists exactly the
|
|
121
|
-
expect(RESOURCE_FACET_CATALOG).toHaveLength(
|
|
127
|
+
test("lists exactly the thirteen non-Service resource types, in sidebar order", () => {
|
|
128
|
+
expect(RESOURCE_FACET_CATALOG).toHaveLength(13);
|
|
122
129
|
expect([...RESOURCE_FACET_CATALOG_KEYS]).toEqual(EXPECTED_KEYS);
|
|
123
130
|
});
|
|
124
131
|
|
|
@@ -202,6 +209,18 @@ describe("ResourceFacetCatalog", () => {
|
|
|
202
209
|
);
|
|
203
210
|
});
|
|
204
211
|
|
|
212
|
+
test("Databases count under DatabaseServer — the type a DB receiver batch without service.name is stamped with", () => {
|
|
213
|
+
expect(getResourceFacetDefinition("databaseServerId")?.serviceType).toBe(
|
|
214
|
+
ServiceType.DatabaseServer,
|
|
215
|
+
);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test("the Database facet is not the logical-database or monitor key", () => {
|
|
219
|
+
for (const reserved of ["databaseId", "dbId", "databaseMonitorId"]) {
|
|
220
|
+
expect(isCatalogResourceFacetKey(reserved)).toBe(false);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
205
224
|
test("RUM applications count under RealUserMonitor", () => {
|
|
206
225
|
expect(getResourceFacetDefinition("rumApplicationId")?.serviceType).toBe(
|
|
207
226
|
ServiceType.RealUserMonitor,
|
|
@@ -256,6 +275,9 @@ describe("ResourceFacetCatalog", () => {
|
|
|
256
275
|
"toString",
|
|
257
276
|
"__proto__",
|
|
258
277
|
"iotDeviceId",
|
|
278
|
+
"databaseId",
|
|
279
|
+
"DatabaseServerId",
|
|
280
|
+
"databaseServerIdentifier",
|
|
259
281
|
])("%j is not a catalog key", (facetKey: string) => {
|
|
260
282
|
expect(isCatalogResourceFacetKey(facetKey)).toBe(false);
|
|
261
283
|
expect(getResourceFacetDefinition(facetKey)).toBeUndefined();
|
|
@@ -9,6 +9,15 @@ import IconProp from "../../../Types/Icon/IconProp";
|
|
|
9
9
|
import React, { ReactElement } from "react";
|
|
10
10
|
import { describe, expect, jest } from "@jest/globals";
|
|
11
11
|
import getJestMockFunction, { MockFunction } from "../../MockType";
|
|
12
|
+
import {
|
|
13
|
+
LAPTOP_WIDTH_IN_PX,
|
|
14
|
+
PHONE_WIDTH_IN_PX,
|
|
15
|
+
TABLET_WIDTH_IN_PX,
|
|
16
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
17
|
+
describeVisibility,
|
|
18
|
+
isVisibleAtWidth,
|
|
19
|
+
resolveDisplay,
|
|
20
|
+
} from "../../ResponsiveVisibility";
|
|
12
21
|
|
|
13
22
|
describe("Card", () => {
|
|
14
23
|
const props: ComponentProps = {
|
|
@@ -164,12 +173,18 @@ describe("Card header layout", () => {
|
|
|
164
173
|
/*
|
|
165
174
|
* Captured from Card before headerLayout existed. Every card in the app
|
|
166
175
|
* that does not opt in must keep rendering exactly this.
|
|
176
|
+
*
|
|
177
|
+
* One token has moved on purpose since: the description was `hidden
|
|
178
|
+
* md:block` and is now `max-md:hidden md:block`. The two paint the same
|
|
179
|
+
* at every width, but only the second survives a foreign
|
|
180
|
+
* `.hidden { display: none !important }` rule, which took the old
|
|
181
|
+
* description off desktops as well (see "Card description" below).
|
|
167
182
|
*/
|
|
168
183
|
const GOLDEN_WITH_ACTIONS: string =
|
|
169
|
-
'<div data-testid="card" class="mb-5 extra"><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="flex-1 min-w-0"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full hidden md:block leading-relaxed">Desc</p></div><div class="flex flex-col md:flex-row md:items-center md:w-fit mt-4 md:mt-0 md:ml-4 gap-2 md:gap-0 flex-shrink-0 items-center"><div class="mb-2 md:mb-0 md:mr-3"><span>right</span></div><div class="flex flex-wrap items-center gap-1.5"><div class="flex items-center"><a href="/docs">Docs</a></div></div></div></div><div class="mt-0"><div>body</div></div></div></div></div>';
|
|
184
|
+
'<div data-testid="card" class="mb-5 extra"><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="flex-1 min-w-0"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full max-md:hidden md:block leading-relaxed">Desc</p></div><div class="flex flex-col md:flex-row md:items-center md:w-fit mt-4 md:mt-0 md:ml-4 gap-2 md:gap-0 flex-shrink-0 items-center"><div class="mb-2 md:mb-0 md:mr-3"><span>right</span></div><div class="flex flex-wrap items-center gap-1.5"><div class="flex items-center"><a href="/docs">Docs</a></div></div></div></div><div class="mt-0"><div>body</div></div></div></div></div>';
|
|
170
185
|
|
|
171
186
|
const GOLDEN_WITHOUT_ACTIONS: string =
|
|
172
|
-
'<div data-testid="card" class="mb-5 "><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="w-full"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full hidden md:block leading-relaxed">Desc</p></div></div></div></div></div>';
|
|
187
|
+
'<div data-testid="card" class="mb-5 "><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="w-full"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full max-md:hidden md:block leading-relaxed">Desc</p></div></div></div></div></div>';
|
|
173
188
|
|
|
174
189
|
test.each([
|
|
175
190
|
["left out", undefined],
|
|
@@ -418,3 +433,79 @@ describe("Card header layout", () => {
|
|
|
418
433
|
});
|
|
419
434
|
});
|
|
420
435
|
});
|
|
436
|
+
|
|
437
|
+
/*
|
|
438
|
+
* The description is a phone-width casualty on purpose: it is secondary copy,
|
|
439
|
+
* and a phone header has no room for it. What it must never be is a desktop
|
|
440
|
+
* casualty. It used to carry the bare `hidden` class and lean on `md:block`
|
|
441
|
+
* to come back, and a page carrying a foreign `.hidden { display: none
|
|
442
|
+
* !important }` rule (Bootstrap 3, HTML5 Boilerplate, a browser extension)
|
|
443
|
+
* beats `md:block` at every width — so every card in the product lost its
|
|
444
|
+
* description, on the widest screen as well as the narrowest.
|
|
445
|
+
*/
|
|
446
|
+
describe("Card description", () => {
|
|
447
|
+
const OLD_DESCRIPTION_CLASS_NAME: string =
|
|
448
|
+
"mt-1.5 text-sm text-gray-500 w-full hidden md:block leading-relaxed";
|
|
449
|
+
|
|
450
|
+
test.each([
|
|
451
|
+
["default", "default"],
|
|
452
|
+
["stacked", "stacked"],
|
|
453
|
+
] as Array<[string, "default" | "stacked"]>)(
|
|
454
|
+
"the %s layout holds it back on a phone and shows it from md up",
|
|
455
|
+
(_label: string, headerLayout: "default" | "stacked") => {
|
|
456
|
+
render(
|
|
457
|
+
<Card title="Title" description="Desc" headerLayout={headerLayout} />,
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
const description: HTMLElement = screen.getByTestId("card-description");
|
|
461
|
+
|
|
462
|
+
expect(isVisibleAtWidth(description, PHONE_WIDTH_IN_PX)).toBe(false);
|
|
463
|
+
|
|
464
|
+
for (const width of [
|
|
465
|
+
TABLET_WIDTH_IN_PX,
|
|
466
|
+
LAPTOP_WIDTH_IN_PX,
|
|
467
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
468
|
+
]) {
|
|
469
|
+
expect(describeVisibility(description, width)).toBe(
|
|
470
|
+
`visible at ${width}px`,
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
},
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
test("a foreign .hidden rule cannot take it off a tablet or a desktop", () => {
|
|
477
|
+
render(<Card title="Title" description="Desc" />);
|
|
478
|
+
|
|
479
|
+
const description: HTMLElement = screen.getByTestId("card-description");
|
|
480
|
+
|
|
481
|
+
expect(description).not.toHaveClass("hidden");
|
|
482
|
+
|
|
483
|
+
for (const width of [
|
|
484
|
+
TABLET_WIDTH_IN_PX,
|
|
485
|
+
LAPTOP_WIDTH_IN_PX,
|
|
486
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
487
|
+
]) {
|
|
488
|
+
expect(
|
|
489
|
+
describeVisibility(description, width, { withForeignHiddenRule: true }),
|
|
490
|
+
).toBe(`visible at ${width}px with a foreign .hidden rule on the page`);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/*
|
|
494
|
+
* The control: the class string the description shipped with before
|
|
495
|
+
* paints at these widths on a clean page, and on the customer's page it
|
|
496
|
+
* is gone at every one of them.
|
|
497
|
+
*/
|
|
498
|
+
for (const width of [
|
|
499
|
+
TABLET_WIDTH_IN_PX,
|
|
500
|
+
LAPTOP_WIDTH_IN_PX,
|
|
501
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
502
|
+
]) {
|
|
503
|
+
expect(resolveDisplay(OLD_DESCRIPTION_CLASS_NAME, width)).toBe("block");
|
|
504
|
+
expect(
|
|
505
|
+
resolveDisplay(OLD_DESCRIPTION_CLASS_NAME, width, {
|
|
506
|
+
withForeignHiddenRule: true,
|
|
507
|
+
}),
|
|
508
|
+
).toBe("hidden");
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
});
|
|
@@ -23,6 +23,7 @@ import { AlertEpisodeFeedEventType } from "../../../Models/DatabaseModels/AlertE
|
|
|
23
23
|
import { AlertFeedEventType } from "../../../Models/DatabaseModels/AlertFeed";
|
|
24
24
|
import { CephClusterFeedEventType } from "../../../Models/DatabaseModels/CephClusterFeed";
|
|
25
25
|
import { CloudResourceFeedEventType } from "../../../Models/DatabaseModels/CloudResourceFeed";
|
|
26
|
+
import { DatabaseServerFeedEventType } from "../../../Models/DatabaseModels/DatabaseServerFeed";
|
|
26
27
|
import { DockerHostFeedEventType } from "../../../Models/DatabaseModels/DockerHostFeed";
|
|
27
28
|
import { DockerSwarmClusterFeedEventType } from "../../../Models/DatabaseModels/DockerSwarmClusterFeed";
|
|
28
29
|
import { HostFeedEventType } from "../../../Models/DatabaseModels/HostFeed";
|
|
@@ -86,6 +87,11 @@ const FEEDS: Array<FeedEventTypeSpec> = [
|
|
|
86
87
|
enumName: "CloudResourceFeedEventType",
|
|
87
88
|
eventTypes: Object.values(CloudResourceFeedEventType),
|
|
88
89
|
},
|
|
90
|
+
{
|
|
91
|
+
name: "DatabaseServerFeed",
|
|
92
|
+
enumName: "DatabaseServerFeedEventType",
|
|
93
|
+
eventTypes: Object.values(DatabaseServerFeedEventType),
|
|
94
|
+
},
|
|
89
95
|
{
|
|
90
96
|
name: "DockerHostFeed",
|
|
91
97
|
enumName: "DockerHostFeedEventType",
|
|
@@ -303,8 +303,15 @@ describe("FeedOptionsButton", () => {
|
|
|
303
303
|
* that would drop it from the accessibility tree and leave the button
|
|
304
304
|
* with no name at all on phones and tablets. jsdom applies no CSS, so
|
|
305
305
|
* the class is the only place this can be seen.
|
|
306
|
+
*
|
|
307
|
+
* `max-xl:sr-only`, not a bare `sr-only` undone by `xl:not-sr-only`:
|
|
308
|
+
* Bootstrap 3 and HTML5 Boilerplate both ship a `.sr-only` rule, and a
|
|
309
|
+
* browser extension or user stylesheet that injects one after Tailwind
|
|
310
|
+
* would otherwise collapse the visible label on a wide screen too.
|
|
306
311
|
*/
|
|
307
|
-
expect(label).toHaveClass("sr-only");
|
|
312
|
+
expect(label).toHaveClass("max-xl:sr-only");
|
|
313
|
+
expect(label).toHaveClass("xl:not-sr-only");
|
|
314
|
+
expect(label).not.toHaveClass("sr-only");
|
|
308
315
|
expect(label).not.toHaveClass("hidden");
|
|
309
316
|
});
|
|
310
317
|
|