@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
|
@@ -451,6 +451,22 @@ export default class TelemetryUtil {
|
|
|
451
451
|
};
|
|
452
452
|
}
|
|
453
453
|
|
|
454
|
+
/*
|
|
455
|
+
* Stamped on rows from a database's own telemetry (collector / Database
|
|
456
|
+
* Agent receiver batches), like oneuptime.host.id. A metric monitor
|
|
457
|
+
* series grouped by oneuptime.database.server.id links the incident or
|
|
458
|
+
* alert it opens to that database (see SeriesResourceLinker).
|
|
459
|
+
*/
|
|
460
|
+
public static getAttributesForDatabaseServerIdAndName(data: {
|
|
461
|
+
databaseServerId: ObjectID;
|
|
462
|
+
databaseServerName: string;
|
|
463
|
+
}): Dictionary<AttributeType> {
|
|
464
|
+
return {
|
|
465
|
+
"oneuptime.database.server.id": data.databaseServerId.toString(),
|
|
466
|
+
"oneuptime.database.server.name": data.databaseServerName,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
|
|
454
470
|
public static getAttributes(data: {
|
|
455
471
|
prefixKeysWithString: string;
|
|
456
472
|
items: JSONArray;
|
|
@@ -14,6 +14,14 @@ import logger from "../Logger";
|
|
|
14
14
|
import { ONEUPTIME_LABEL_ATTRIBUTE_PREFIX } from "./OneuptimeLabel";
|
|
15
15
|
import crypto from "crypto";
|
|
16
16
|
|
|
17
|
+
/*
|
|
18
|
+
* `keyForContainer` moved to the isomorphic EntityKey module (the Databases
|
|
19
|
+
* product needs it in the browser too). Re-exported here so the existing
|
|
20
|
+
* server-side importers (MetricService's container rollup read path and its
|
|
21
|
+
* tests) keep working unchanged.
|
|
22
|
+
*/
|
|
23
|
+
export { keyForContainer } from "../../../Utils/Telemetry/EntityKey";
|
|
24
|
+
|
|
17
25
|
/*
|
|
18
26
|
* Generalized OpenTelemetry entity extraction (the identity layer of the
|
|
19
27
|
* entity model — see Internal/Docs/OpenTelemetryEntities.md, phase 1).
|
|
@@ -211,11 +219,18 @@ export default class InventoryItem {
|
|
|
211
219
|
* entries is usable and extraction falls back to heuristics. We never infer a
|
|
212
220
|
* retirement across that boundary; in particular, an explicitly referenced
|
|
213
221
|
* Host must remain authoritative on a Kubernetes resource.
|
|
222
|
+
*
|
|
223
|
+
* `suppressHeuristicEntityTypes` drops those types from the HEURISTIC
|
|
224
|
+
* resolvers only — for a resource the caller knows the heuristic would
|
|
225
|
+
* misread (a database receiver's batch carries the host.name of the
|
|
226
|
+
* machine the collector runs on, which is not what it describes). A type a
|
|
227
|
+
* producer declared through `entity_refs` is never suppressed.
|
|
214
228
|
*/
|
|
215
229
|
public static extractEntitiesWithRetirements(data: {
|
|
216
230
|
projectId: string;
|
|
217
231
|
attributes: EntityAttributes;
|
|
218
232
|
entityRefs?: Array<ResourceEntityRef> | undefined;
|
|
233
|
+
suppressHeuristicEntityTypes?: ReadonlyArray<EntityType> | undefined;
|
|
219
234
|
}): EntityExtractionResult {
|
|
220
235
|
let out: Array<ExtractedEntity> = [];
|
|
221
236
|
const hasAuthoritativeEntityRefs: boolean = Boolean(
|
|
@@ -285,9 +300,15 @@ export default class InventoryItem {
|
|
|
285
300
|
private static entitiesFromResolvers(data: {
|
|
286
301
|
projectId: string;
|
|
287
302
|
attributes: EntityAttributes;
|
|
303
|
+
suppressHeuristicEntityTypes?: ReadonlyArray<EntityType> | undefined;
|
|
288
304
|
}): Array<ExtractedEntity> {
|
|
289
305
|
const out: Array<ExtractedEntity> = [];
|
|
290
306
|
const seen: Set<string> = new Set<string>();
|
|
307
|
+
const suppressed: ReadonlyArray<EntityType> = Array.isArray(
|
|
308
|
+
data.suppressHeuristicEntityTypes,
|
|
309
|
+
)
|
|
310
|
+
? data.suppressHeuristicEntityTypes
|
|
311
|
+
: [];
|
|
291
312
|
|
|
292
313
|
for (const resolve of this.resolvers) {
|
|
293
314
|
const identity: {
|
|
@@ -295,7 +316,7 @@ export default class InventoryItem {
|
|
|
295
316
|
id: Dictionary<string>;
|
|
296
317
|
} | null = resolve(data.attributes);
|
|
297
318
|
|
|
298
|
-
if (!identity) {
|
|
319
|
+
if (!identity || suppressed.includes(identity.entityType)) {
|
|
299
320
|
continue;
|
|
300
321
|
}
|
|
301
322
|
|
|
@@ -1449,24 +1470,3 @@ export default class InventoryItem {
|
|
|
1449
1470
|
return out;
|
|
1450
1471
|
}
|
|
1451
1472
|
}
|
|
1452
|
-
|
|
1453
|
-
/**
|
|
1454
|
-
* `container.id` is the container identity (mirrors the container
|
|
1455
|
-
* resolver above — id-only). Read-side helper in the mold of
|
|
1456
|
-
* `EntityKey.keyForHost` & co.; it lives here rather than in the
|
|
1457
|
-
* isomorphic EntityKey module because its only consumer today is the
|
|
1458
|
-
* server-side container metric-rollup read path
|
|
1459
|
-
* (`MetricService.tryBuildEntityAggregateMVStatement` against
|
|
1460
|
-
* `MetricItemAggMV1mByContainer`), so there is no reason to widen the
|
|
1461
|
-
* browser bundle. Pass the raw `container.id` attribute value.
|
|
1462
|
-
*/
|
|
1463
|
-
export function keyForContainer(
|
|
1464
|
-
projectId: string,
|
|
1465
|
-
containerId: string,
|
|
1466
|
-
): string {
|
|
1467
|
-
return computeEntityKeyShared({
|
|
1468
|
-
projectId,
|
|
1469
|
-
entityType: EntityType.Container,
|
|
1470
|
-
identifyingAttributes: { "container.id": containerId },
|
|
1471
|
-
});
|
|
1472
|
-
}
|
|
@@ -11,20 +11,26 @@ import TelemetryIngestSurface, {
|
|
|
11
11
|
*
|
|
12
12
|
* TelemetryIngest (the Express middleware) runs these inline as part of a
|
|
13
13
|
* longer chain that also covers the Origin allowlist and the per-key rate
|
|
14
|
-
* limit, neither of which means anything off HTTP.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* limit, neither of which means anything off HTTP. Other places that accept a
|
|
15
|
+
* TelemetryIngestionKey cannot use that middleware - the gRPC OTLP server and
|
|
16
|
+
* the MQTT broker are not Express routes, and the two key-validation probes
|
|
17
|
+
* have to describe a refusal in their own JSON answer rather than let the
|
|
18
|
+
* middleware end the request - yet must answer these same three questions or
|
|
19
|
+
* a disabled key keeps working on the pipe nobody remembered to update.
|
|
19
20
|
*
|
|
20
21
|
* The refusal SENTENCES are deliberately identical to the middleware's, so a
|
|
21
|
-
* customer who moves the same key between HTTP
|
|
22
|
-
* explanation
|
|
23
|
-
*
|
|
22
|
+
* customer who moves the same key between OTLP/HTTP and OTLP/gRPC reads the
|
|
23
|
+
* same explanation on both: gRPC sends `message` back as its status details,
|
|
24
|
+
* and the session replay probe returns it in its JSON body. MQTT cannot carry
|
|
25
|
+
* it - an MQTT 3.1.1 CONNACK has no reason field - so the broker logs
|
|
26
|
+
* `reason` and the device sees only a generic credential error. If you change
|
|
27
|
+
* wording here, change it in the middleware too;
|
|
28
|
+
* GrpcServerAuthStatusLive.test.ts compares the two and fails on drift.
|
|
24
29
|
*
|
|
25
30
|
* What this deliberately does NOT do is decide the transport-level response.
|
|
26
|
-
* A refusal is
|
|
27
|
-
*
|
|
31
|
+
* A refusal is an HTTP status, a non-retryable gRPC status (UNAUTHENTICATED
|
|
32
|
+
* or PERMISSION_DENIED, mapped from the middleware's HTTP status - see
|
|
33
|
+
* GrpcServer), or MQTT CONNACK return code 4; each caller owns that
|
|
28
34
|
* translation because each transport's retry semantics are its own.
|
|
29
35
|
*/
|
|
30
36
|
export enum TelemetryIngestionKeyRefusalReason {
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import {
|
|
11
|
+
act,
|
|
12
|
+
cleanup,
|
|
13
|
+
fireEvent,
|
|
14
|
+
render,
|
|
15
|
+
screen,
|
|
16
|
+
waitFor,
|
|
17
|
+
} from "@testing-library/react";
|
|
18
|
+
import userEvent from "@testing-library/user-event";
|
|
19
|
+
import React from "react";
|
|
20
|
+
import { MemoryRouter } from "react-router-dom";
|
|
21
|
+
import User from "../../../Models/DatabaseModels/User";
|
|
22
|
+
import Email from "../../../Types/Email";
|
|
23
|
+
import HTTPResponse from "../../../Types/API/HTTPResponse";
|
|
24
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
25
|
+
import { DASHBOARD_URL } from "../../../UI/Config";
|
|
26
|
+
import UiAnalytics from "../../../UI/Utils/Analytics";
|
|
27
|
+
import API from "../../../UI/Utils/API/API";
|
|
28
|
+
import ModelAPI, {
|
|
29
|
+
ModelAPIHttpResponse,
|
|
30
|
+
} from "../../../UI/Utils/ModelAPI/ModelAPI";
|
|
31
|
+
import Navigation from "../../../UI/Utils/Navigation";
|
|
32
|
+
import UserUtil from "../../../UI/Utils/User";
|
|
33
|
+
import "../../../../App/FeatureSet/Accounts/src/Utils/i18n";
|
|
34
|
+
import LoginPage from "../../../../App/FeatureSet/Accounts/src/Pages/Login";
|
|
35
|
+
import LoginWithSSOPage from "../../../../App/FeatureSet/Accounts/src/Pages/LoginWithSSO";
|
|
36
|
+
import RegisterPage from "../../../../App/FeatureSet/Accounts/src/Pages/Register";
|
|
37
|
+
|
|
38
|
+
/*
|
|
39
|
+
* The sign-in pages send a visitor who is already signed in on to the
|
|
40
|
+
* Dashboard. That check used to run on every render, and a sign-in on the
|
|
41
|
+
* page itself signs the user in and navigates to the Dashboard too
|
|
42
|
+
* (LoginUtil.login): the login form then re-rendered the page as it stopped
|
|
43
|
+
* loading, the check saw a signed-in user and navigated again, and the
|
|
44
|
+
* second navigation aborted the first. People landed on the Dashboard
|
|
45
|
+
* regardless, but every e2e spec that signed in through the login page
|
|
46
|
+
* failed on the aborted navigation (net::ERR_ABORTED / NS_BINDING_ABORTED).
|
|
47
|
+
*
|
|
48
|
+
* LoginUtil.login is the real one here, so a sign-in really stores the user
|
|
49
|
+
* and really asks to navigate; only the navigation itself is recorded
|
|
50
|
+
* instead of performed.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
jest.mock("../../../UI/Config", () => {
|
|
54
|
+
return {
|
|
55
|
+
...(jest.requireActual(
|
|
56
|
+
"../../../UI/Config",
|
|
57
|
+
) as typeof import("../../../UI/Config")),
|
|
58
|
+
__esModule: true,
|
|
59
|
+
BILLING_ENABLED: false,
|
|
60
|
+
CAPTCHA_ENABLED: false,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Page chrome that fetches the instance's global config on mount.
|
|
65
|
+
jest.mock("../../../UI/Components/EditionLabel/EditionLabel", () => {
|
|
66
|
+
return {
|
|
67
|
+
__esModule: true,
|
|
68
|
+
default: (): null => {
|
|
69
|
+
return null;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const USER_JSON: JSONObject = {
|
|
75
|
+
_id: "33333333-3333-4333-8333-333333333333",
|
|
76
|
+
email: "ada@example.com",
|
|
77
|
+
name: "Ada Lovelace",
|
|
78
|
+
};
|
|
79
|
+
const PASSWORD: string = "lantern river meadow";
|
|
80
|
+
|
|
81
|
+
let navigations: Array<string> = [];
|
|
82
|
+
|
|
83
|
+
/*
|
|
84
|
+
* What an email link would put in ?email=. Register reads it to prefill its
|
|
85
|
+
* form; the login page is typed into instead, as a person signs in.
|
|
86
|
+
*/
|
|
87
|
+
let linkedEmail: string = "";
|
|
88
|
+
|
|
89
|
+
function navigationsToTheDashboard(): Array<string> {
|
|
90
|
+
return navigations.filter((url: string) => {
|
|
91
|
+
return url === DASHBOARD_URL.toString();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function renderInRouter(
|
|
96
|
+
page: React.ReactElement,
|
|
97
|
+
): Promise<ReturnType<typeof render>> {
|
|
98
|
+
let result: ReturnType<typeof render> | undefined;
|
|
99
|
+
await act(async () => {
|
|
100
|
+
result = render(<MemoryRouter>{page}</MemoryRouter>);
|
|
101
|
+
});
|
|
102
|
+
return result as ReturnType<typeof render>;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Anything a stray second navigation would need to land.
|
|
106
|
+
async function letTheDustSettle(): Promise<void> {
|
|
107
|
+
await act(async () => {
|
|
108
|
+
await new Promise<void>((resolve: () => void) => {
|
|
109
|
+
setTimeout(resolve, 50);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
describe("Accounts pages navigate a signed-in user to the Dashboard once", () => {
|
|
115
|
+
beforeEach(() => {
|
|
116
|
+
window.localStorage.clear();
|
|
117
|
+
navigations = [];
|
|
118
|
+
linkedEmail = "";
|
|
119
|
+
|
|
120
|
+
jest
|
|
121
|
+
.spyOn(Navigation, "navigate")
|
|
122
|
+
.mockImplementation((to: { toString: () => string }) => {
|
|
123
|
+
navigations.push(to.toString());
|
|
124
|
+
});
|
|
125
|
+
jest
|
|
126
|
+
.spyOn(Navigation, "getQueryStringByName")
|
|
127
|
+
.mockImplementation((key: string): string => {
|
|
128
|
+
return key === "email" ? linkedEmail : "";
|
|
129
|
+
});
|
|
130
|
+
jest.spyOn(UserUtil, "getUtmParams").mockReturnValue({});
|
|
131
|
+
jest.spyOn(UserUtil, "getAttributionClickIds").mockReturnValue(null);
|
|
132
|
+
jest.spyOn(UserUtil, "getFirstTouchAttribution").mockReturnValue(null);
|
|
133
|
+
jest.spyOn(UiAnalytics, "userAuth").mockImplementation(() => {});
|
|
134
|
+
jest.spyOn(UiAnalytics, "capture").mockImplementation(() => {});
|
|
135
|
+
jest.spyOn(UiAnalytics, "captureRevenueEvent").mockImplementation(() => {});
|
|
136
|
+
|
|
137
|
+
// /login and /signup both answer with the account and a session.
|
|
138
|
+
jest
|
|
139
|
+
.spyOn(ModelAPI, "createOrUpdate")
|
|
140
|
+
.mockImplementation(async (): Promise<ModelAPIHttpResponse<User>> => {
|
|
141
|
+
const response: ModelAPIHttpResponse<User> =
|
|
142
|
+
new ModelAPIHttpResponse<User>(200, USER_JSON, {});
|
|
143
|
+
response.miscData = { token: "session-token" };
|
|
144
|
+
return response;
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// The SSO page lists the global providers on mount: there are none.
|
|
148
|
+
jest.spyOn(API, "get").mockImplementation(async () => {
|
|
149
|
+
return new HTTPResponse<JSONObject>(200, [] as unknown as JSONObject, {});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
afterEach(() => {
|
|
154
|
+
cleanup();
|
|
155
|
+
jest.restoreAllMocks();
|
|
156
|
+
window.localStorage.clear();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("a password sign-in on the login page navigates once", async () => {
|
|
160
|
+
await renderInRouter(<LoginPage />);
|
|
161
|
+
expect(navigations).toEqual([]);
|
|
162
|
+
|
|
163
|
+
const user: ReturnType<typeof userEvent.setup> = userEvent.setup({
|
|
164
|
+
delay: null,
|
|
165
|
+
});
|
|
166
|
+
await user.type(await screen.findByTestId("email"), "ada@example.com");
|
|
167
|
+
await user.type(screen.getByTestId("password"), PASSWORD);
|
|
168
|
+
await act(async () => {
|
|
169
|
+
await user.click(screen.getByTestId("Login"));
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
await waitFor(() => {
|
|
173
|
+
expect(UserUtil.isLoggedIn()).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
await letTheDustSettle();
|
|
176
|
+
|
|
177
|
+
expect(navigationsToTheDashboard()).toHaveLength(1);
|
|
178
|
+
expect(navigations).toEqual([DASHBOARD_URL.toString()]);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
test("a signup that signs the account in navigates once", async () => {
|
|
182
|
+
// The shared Email input loses synthetic paste events in jsdom.
|
|
183
|
+
linkedEmail = "ada@example.com";
|
|
184
|
+
await renderInRouter(<RegisterPage />);
|
|
185
|
+
await waitFor(() => {
|
|
186
|
+
expect(screen.getByTestId("email")).toHaveValue("ada@example.com");
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const user: ReturnType<typeof userEvent.setup> = userEvent.setup({
|
|
190
|
+
delay: null,
|
|
191
|
+
});
|
|
192
|
+
for (const [field, value] of [
|
|
193
|
+
["name", "Ada Lovelace"],
|
|
194
|
+
["password", PASSWORD],
|
|
195
|
+
["confirmPassword", PASSWORD],
|
|
196
|
+
] as const) {
|
|
197
|
+
await user.clear(screen.getByTestId(field));
|
|
198
|
+
await user.paste(value);
|
|
199
|
+
}
|
|
200
|
+
await act(async () => {
|
|
201
|
+
fireEvent.click(screen.getByRole("button", { name: "Sign Up" }));
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
await waitFor(() => {
|
|
205
|
+
expect(UserUtil.isLoggedIn()).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
await letTheDustSettle();
|
|
208
|
+
|
|
209
|
+
expect(navigations).toEqual([DASHBOARD_URL.toString()]);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test.each([
|
|
213
|
+
["login", LoginPage],
|
|
214
|
+
["register", RegisterPage],
|
|
215
|
+
["single sign-on", LoginWithSSOPage],
|
|
216
|
+
] as Array<[string, () => React.ReactElement]>)(
|
|
217
|
+
"a visitor already signed in is sent on from the %s page once, and not again as it re-renders",
|
|
218
|
+
async (_name: string, Page: () => React.ReactElement) => {
|
|
219
|
+
UserUtil.setEmail(new Email("ada@example.com"));
|
|
220
|
+
|
|
221
|
+
const { rerender } = await renderInRouter(<Page />);
|
|
222
|
+
await waitFor(() => {
|
|
223
|
+
expect(navigations).toEqual([DASHBOARD_URL.toString()]);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// The page goes on rendering while the navigation is under way.
|
|
227
|
+
for (let render: number = 0; render < 3; render++) {
|
|
228
|
+
await act(async () => {
|
|
229
|
+
rerender(
|
|
230
|
+
<MemoryRouter>
|
|
231
|
+
<Page />
|
|
232
|
+
</MemoryRouter>,
|
|
233
|
+
);
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
await letTheDustSettle();
|
|
237
|
+
|
|
238
|
+
expect(navigations).toEqual([DASHBOARD_URL.toString()]);
|
|
239
|
+
},
|
|
240
|
+
);
|
|
241
|
+
});
|
|
@@ -13,8 +13,12 @@ import {
|
|
|
13
13
|
LAPTOP_WIDTH_IN_PX,
|
|
14
14
|
PHONE_WIDTH_IN_PX,
|
|
15
15
|
TABLET_WIDTH_IN_PX,
|
|
16
|
+
TAILWIND_BREAKPOINTS_IN_PX,
|
|
17
|
+
VisibilityOptions,
|
|
18
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
16
19
|
describeVisibility,
|
|
17
20
|
isVisibleAtWidth,
|
|
21
|
+
restorePreFixMarkup,
|
|
18
22
|
} from "../../ResponsiveVisibility";
|
|
19
23
|
import englishLocale from "../../../../App/FeatureSet/AdminDashboard/src/Locales/en.json";
|
|
20
24
|
|
|
@@ -32,6 +36,34 @@ jest.mock("../../../UI/Images/logos/OneUptimeSVG/3-transparent.svg", () => {
|
|
|
32
36
|
return ASSET_DATA_URL;
|
|
33
37
|
});
|
|
34
38
|
|
|
39
|
+
/*
|
|
40
|
+
* BILLING_ENABLED is read from the environment (UI/Config), and EditionLabel
|
|
41
|
+
* returns an empty fragment when it is on — oneuptime.com bounds plans through
|
|
42
|
+
* subscriptions and shows no edition pill at all. So the pill these tests are
|
|
43
|
+
* about only exists on a self-hosted header, and without pinning the flag the
|
|
44
|
+
* suite passes or fails depending on whether BILLING_ENABLED happened to be
|
|
45
|
+
* exported into the jest process: green locally, red in CI, which is how it
|
|
46
|
+
* reached master.
|
|
47
|
+
*
|
|
48
|
+
* Pinned false, which is the deployment whose layout is under test. Same
|
|
49
|
+
* approach as EditionLabelLicenseStatus.test.tsx.
|
|
50
|
+
*/
|
|
51
|
+
jest.mock("../../../UI/Config", () => {
|
|
52
|
+
const actualConfig: Record<string, unknown> = jest.requireActual(
|
|
53
|
+
"../../../UI/Config",
|
|
54
|
+
) as Record<string, unknown>;
|
|
55
|
+
|
|
56
|
+
const mockedConfig: Record<string, unknown> = { ...actualConfig };
|
|
57
|
+
|
|
58
|
+
Object.defineProperty(mockedConfig, "BILLING_ENABLED", {
|
|
59
|
+
get: (): boolean => {
|
|
60
|
+
return false;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return mockedConfig;
|
|
65
|
+
});
|
|
66
|
+
|
|
35
67
|
type LocaleValue = string | { [key: string]: LocaleValue };
|
|
36
68
|
|
|
37
69
|
const lookUpTranslation: (key: string) => string | undefined = (
|
|
@@ -92,12 +124,18 @@ const renderHeader: RenderHeaderFunction = async (): Promise<void> => {
|
|
|
92
124
|
});
|
|
93
125
|
};
|
|
94
126
|
|
|
127
|
+
type ResetHeaderStateFunction = () => void;
|
|
128
|
+
|
|
129
|
+
const resetHeaderState: ResetHeaderStateFunction = (): void => {
|
|
130
|
+
cleanup();
|
|
131
|
+
document.documentElement.className = "";
|
|
132
|
+
window.localStorage.clear();
|
|
133
|
+
isMasterAdminMock.mockReturnValue(true);
|
|
134
|
+
};
|
|
135
|
+
|
|
95
136
|
describe("admin dashboard header on small screens", () => {
|
|
96
137
|
beforeEach(() => {
|
|
97
|
-
|
|
98
|
-
document.documentElement.className = "";
|
|
99
|
-
window.localStorage.clear();
|
|
100
|
-
isMasterAdminMock.mockReturnValue(true);
|
|
138
|
+
resetHeaderState();
|
|
101
139
|
});
|
|
102
140
|
|
|
103
141
|
test("the profile button is on screen at every width, phone included", async () => {
|
|
@@ -200,3 +238,182 @@ describe("admin dashboard header on small screens", () => {
|
|
|
200
238
|
).toHaveLength(0);
|
|
201
239
|
});
|
|
202
240
|
});
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* The admin header under a foreign `.hidden { display: none !important }`
|
|
244
|
+
* (Bootstrap 3, HTML5 Boilerplate, browser extensions, user stylesheets).
|
|
245
|
+
*
|
|
246
|
+
* Its two wide-screen-only entries — the edition pill and the standalone Exit
|
|
247
|
+
* Admin button — used `hidden md:inline-flex` and `hidden lg:flex`. The rule
|
|
248
|
+
* matches the bare class and beats the breakpoint utility, so an admin with
|
|
249
|
+
* such a browser lost both on every screen, a wide desktop included. They now
|
|
250
|
+
* use `max-md:hidden` / `max-lg:hidden`, which paint the same on a clean page
|
|
251
|
+
* and never carry the class the rule targets.
|
|
252
|
+
*/
|
|
253
|
+
const WITH_FOREIGN_HIDDEN_RULE: VisibilityOptions = {
|
|
254
|
+
withForeignHiddenRule: true,
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const MD_WIDTH_IN_PX: number = TAILWIND_BREAKPOINTS_IN_PX["md"]!;
|
|
258
|
+
const LG_WIDTH_IN_PX: number = TAILWIND_BREAKPOINTS_IN_PX["lg"]!;
|
|
259
|
+
|
|
260
|
+
const EVERY_WIDTH_IN_PX: Array<number> = [
|
|
261
|
+
PHONE_WIDTH_IN_PX,
|
|
262
|
+
MD_WIDTH_IN_PX - 1,
|
|
263
|
+
TABLET_WIDTH_IN_PX,
|
|
264
|
+
LG_WIDTH_IN_PX - 1,
|
|
265
|
+
LG_WIDTH_IN_PX,
|
|
266
|
+
LAPTOP_WIDTH_IN_PX,
|
|
267
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
type WidthsFromFunction = (minimumWidthInPx: number) => Array<number>;
|
|
271
|
+
|
|
272
|
+
const widthsFrom: WidthsFromFunction = (
|
|
273
|
+
minimumWidthInPx: number,
|
|
274
|
+
): Array<number> => {
|
|
275
|
+
return EVERY_WIDTH_IN_PX.filter((width: number): boolean => {
|
|
276
|
+
return width >= minimumWidthInPx;
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const widthsBelow: WidthsFromFunction = (
|
|
281
|
+
minimumWidthInPx: number,
|
|
282
|
+
): Array<number> => {
|
|
283
|
+
return EVERY_WIDTH_IN_PX.filter((width: number): boolean => {
|
|
284
|
+
return width < minimumWidthInPx;
|
|
285
|
+
});
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
type GetElementFunction = () => HTMLElement;
|
|
289
|
+
|
|
290
|
+
// The edition pill's accessible name leads with the edition it reports.
|
|
291
|
+
const getEditionPill: GetElementFunction = (): HTMLElement => {
|
|
292
|
+
return screen.getByRole("button", { name: /Edition/ });
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
// Before the profile menu opens, the standalone button is the only one.
|
|
296
|
+
const getStandaloneExitAdmin: GetElementFunction = (): HTMLElement => {
|
|
297
|
+
return screen.getByRole("button", { name: "Exit Admin" });
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
describe("admin dashboard header with a foreign .hidden rule on the page", () => {
|
|
301
|
+
beforeEach(() => {
|
|
302
|
+
resetHeaderState();
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
test("the edition pill is on screen from md up with the rule, and stays behind below md", async () => {
|
|
306
|
+
await renderHeader();
|
|
307
|
+
|
|
308
|
+
const pill: HTMLElement = getEditionPill();
|
|
309
|
+
|
|
310
|
+
for (const width of widthsFrom(MD_WIDTH_IN_PX)) {
|
|
311
|
+
expect(describeVisibility(pill, width, WITH_FOREIGN_HIDDEN_RULE)).toBe(
|
|
312
|
+
`visible at ${width}px with a foreign .hidden rule on the page`,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
for (const width of widthsBelow(MD_WIDTH_IN_PX)) {
|
|
317
|
+
expect(isVisibleAtWidth(pill, width, WITH_FOREIGN_HIDDEN_RULE)).toBe(
|
|
318
|
+
false,
|
|
319
|
+
);
|
|
320
|
+
expect(isVisibleAtWidth(pill, width)).toBe(false);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
test("the standalone Exit Admin is on screen from lg up with the rule, and stays behind below lg", async () => {
|
|
325
|
+
await renderHeader();
|
|
326
|
+
|
|
327
|
+
const exitAdmin: HTMLElement = getStandaloneExitAdmin();
|
|
328
|
+
|
|
329
|
+
for (const width of widthsFrom(LG_WIDTH_IN_PX)) {
|
|
330
|
+
expect(
|
|
331
|
+
describeVisibility(exitAdmin, width, WITH_FOREIGN_HIDDEN_RULE),
|
|
332
|
+
).toBe(`visible at ${width}px with a foreign .hidden rule on the page`);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
for (const width of widthsBelow(LG_WIDTH_IN_PX)) {
|
|
336
|
+
expect(isVisibleAtWidth(exitAdmin, width, WITH_FOREIGN_HIDDEN_RULE)).toBe(
|
|
337
|
+
false,
|
|
338
|
+
);
|
|
339
|
+
expect(isVisibleAtWidth(exitAdmin, width)).toBe(false);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
test("help and the profile button are on screen at every width with the rule", async () => {
|
|
344
|
+
await renderHeader();
|
|
345
|
+
|
|
346
|
+
for (const button of [
|
|
347
|
+
screen.getByRole("button", { name: "Help" }),
|
|
348
|
+
screen.getByRole("button", { name: /User Profile/ }),
|
|
349
|
+
]) {
|
|
350
|
+
for (const width of EVERY_WIDTH_IN_PX) {
|
|
351
|
+
expect(
|
|
352
|
+
describeVisibility(button, width, WITH_FOREIGN_HIDDEN_RULE),
|
|
353
|
+
).toBe(`visible at ${width}px with a foreign .hidden rule on the page`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("at the customer's 1917px with the rule, the edition pill, Exit Admin, help and profile are all there", async () => {
|
|
359
|
+
await renderHeader();
|
|
360
|
+
|
|
361
|
+
const entries: Array<[string, HTMLElement]> = [
|
|
362
|
+
["edition pill", getEditionPill()],
|
|
363
|
+
["Exit Admin", getStandaloneExitAdmin()],
|
|
364
|
+
["Help", screen.getByRole("button", { name: "Help" })],
|
|
365
|
+
["User Profile", screen.getByRole("button", { name: /User Profile/ })],
|
|
366
|
+
];
|
|
367
|
+
|
|
368
|
+
expect(
|
|
369
|
+
entries.map(([label, element]: [string, HTMLElement]): string => {
|
|
370
|
+
return `${label}: ${describeVisibility(
|
|
371
|
+
element,
|
|
372
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
373
|
+
WITH_FOREIGN_HIDDEN_RULE,
|
|
374
|
+
)}`;
|
|
375
|
+
}),
|
|
376
|
+
).toEqual(
|
|
377
|
+
entries.map(([label]: [string, HTMLElement]): string => {
|
|
378
|
+
return `${label}: visible at 1917px with a foreign .hidden rule on the page`;
|
|
379
|
+
}),
|
|
380
|
+
);
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
test("control: with the pre-fix classes put back, the same check fails at 1917px", async () => {
|
|
384
|
+
/*
|
|
385
|
+
* Proof that the tests above can fail: rewrite the rendered markup to what
|
|
386
|
+
* the header shipped before the fix and ask the very same question.
|
|
387
|
+
*/
|
|
388
|
+
await renderHeader();
|
|
389
|
+
|
|
390
|
+
restorePreFixMarkup();
|
|
391
|
+
|
|
392
|
+
const exitAdmin: HTMLElement = getStandaloneExitAdmin();
|
|
393
|
+
|
|
394
|
+
expect(
|
|
395
|
+
describeVisibility(
|
|
396
|
+
exitAdmin,
|
|
397
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
398
|
+
WITH_FOREIGN_HIDDEN_RULE,
|
|
399
|
+
),
|
|
400
|
+
).toBe(
|
|
401
|
+
'hidden at 1917px with a foreign .hidden rule on the page by <div class="hidden items-center lg:flex">',
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
const pill: HTMLElement = getEditionPill();
|
|
405
|
+
|
|
406
|
+
expect(pill.getAttribute("class")).toContain("mr-3 hidden md:inline-flex");
|
|
407
|
+
expect(
|
|
408
|
+
isVisibleAtWidth(
|
|
409
|
+
pill,
|
|
410
|
+
WIDE_DESKTOP_WIDTH_IN_PX,
|
|
411
|
+
WITH_FOREIGN_HIDDEN_RULE,
|
|
412
|
+
),
|
|
413
|
+
).toBe(false);
|
|
414
|
+
|
|
415
|
+
// On a clean page the old markup was fine, which is why nobody saw it.
|
|
416
|
+
expect(isVisibleAtWidth(exitAdmin, WIDE_DESKTOP_WIDTH_IN_PX)).toBe(true);
|
|
417
|
+
expect(isVisibleAtWidth(pill, WIDE_DESKTOP_WIDTH_IN_PX)).toBe(true);
|
|
418
|
+
});
|
|
419
|
+
});
|