@oneuptime/common 12.0.12 → 12.0.14
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/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
- package/Models/DatabaseModels/NetworkDevice.ts +64 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/StatusPage.ts +59 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
- package/Server/API/AIChatAPI.ts +55 -56
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/CommonAPI.ts +89 -0
- package/Server/API/MicrosoftTeamsAPI.ts +20 -9
- package/Server/API/SlackAPI.ts +13 -10
- package/Server/API/StatusPageAPI.ts +2197 -2128
- package/Server/API/TelemetryAPI.ts +72 -3
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/UserAuthorization.ts +11 -2
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/ApiKeyPermissionService.ts +116 -2
- package/Server/Services/DatabaseService.ts +118 -6
- package/Server/Services/LogAggregationService.ts +39 -0
- package/Server/Services/LogService.ts +21 -0
- package/Server/Services/NetworkSiteService.ts +12 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/SpanService.ts +21 -0
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/TraceAggregationService.ts +15 -0
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/APIKey/AccessPermission.ts +16 -40
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/LogRedaction.ts +576 -0
- package/Server/Utils/Logger.ts +123 -46
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResource.ts +29 -9
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
- package/Server/Utils/StartServer.ts +30 -9
- package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +328 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
- package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
- package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
- package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
- package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
- package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
- package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
- package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
- package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
- package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
- package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
- package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/MasterPage.test.tsx +36 -1
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/API/Hostname.ts +79 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
- package/Types/Database/DatabaseProperty.ts +38 -0
- package/Types/Database/TableColumn.ts +34 -7
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Events/Recurring.ts +16 -1
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/MonitorStep.ts +13 -1
- package/Types/Monitor/MonitorType.ts +345 -40
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CardSelect/CardSelect.tsx +714 -105
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EmptyState/EmptyState.tsx +8 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/Footer/Footer.tsx +32 -6
- package/UI/Components/Forms/Fields/FormField.tsx +3 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Loader/PageLoader.tsx +29 -8
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/MasterPage/MasterPage.tsx +24 -11
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/Utils/Monitor/MonitorMetricType.ts +16 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
- package/Utils/Telemetry/CrossSignalScope.ts +75 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +48 -35
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +59 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +13 -10
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +745 -673
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +34 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +89 -6
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +7 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogService.js +16 -0
- package/build/dist/Server/Services/LogService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +12 -0
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +16 -0
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +2 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +449 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
- package/build/dist/Server/Utils/Logger.js +98 -45
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -7
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +63 -0
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/DatabaseProperty.js +38 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/TableColumn.js +24 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Events/Recurring.js +13 -1
- package/build/dist/Types/Events/Recurring.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +9 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +330 -31
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
- package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Footer/Footer.js +7 -4
- package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
- package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
package/Utils/API.ts
CHANGED
|
@@ -226,8 +226,13 @@ export default class API {
|
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
public static getDefaultHeaders(_props?: any): Headers {
|
|
229
|
+
/*
|
|
230
|
+
* NOTE: no "Access-Control-Allow-Origin" here - that is a RESPONSE-only
|
|
231
|
+
* header. Sending it as a request header forces a CORS preflight on every
|
|
232
|
+
* cross-origin call (self-hosted setups where the API is on a different
|
|
233
|
+
* origin), doubling the request count for zero benefit.
|
|
234
|
+
*/
|
|
229
235
|
const defaultHeaders: Headers = {
|
|
230
|
-
"Access-Control-Allow-Origin": "*",
|
|
231
236
|
Accept: "application/json",
|
|
232
237
|
"Content-Type": "application/json;charset=UTF-8",
|
|
233
238
|
};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import AggregationType from "../../Types/BaseDatabase/AggregationType";
|
|
2
2
|
import { CheckOn } from "../../Types/Monitor/CriteriaFilter";
|
|
3
3
|
import MonitorMetricType from "../../Types/Monitor/MonitorMetricType";
|
|
4
|
-
import MonitorType
|
|
4
|
+
import MonitorType, {
|
|
5
|
+
MonitorTypeHelper,
|
|
6
|
+
} from "../../Types/Monitor/MonitorType";
|
|
5
7
|
|
|
6
8
|
/*
|
|
7
9
|
* Groups of metrics rendered as separate cards on the monitor metrics page.
|
|
@@ -238,11 +240,24 @@ class MonitorMetricTypeUtil {
|
|
|
238
240
|
monitorType === MonitorType.DNSSEC ||
|
|
239
241
|
monitorType === MonitorType.Domain ||
|
|
240
242
|
monitorType === MonitorType.SQLQuery ||
|
|
243
|
+
monitorType === MonitorType.SSLCertificate ||
|
|
241
244
|
monitorType === MonitorType.ExternalStatusPage
|
|
242
245
|
) {
|
|
243
246
|
return [MonitorMetricType.IsOnline, MonitorMetricType.ResponseTime];
|
|
244
247
|
}
|
|
245
248
|
|
|
249
|
+
/*
|
|
250
|
+
* Any other type the probe actually checks still writes IsOnline and
|
|
251
|
+
* ResponseTime rows, so default to showing them rather than to an empty
|
|
252
|
+
* list. Falling through to [] hides the Monitor Metrics tab entirely -
|
|
253
|
+
* SSL Certificate monitors were missing from the list above and so had
|
|
254
|
+
* no metrics tab at all, which left an operator with no way to see that
|
|
255
|
+
* their monitor was running.
|
|
256
|
+
*/
|
|
257
|
+
if (MonitorTypeHelper.isProbableMonitor(monitorType)) {
|
|
258
|
+
return [MonitorMetricType.IsOnline, MonitorMetricType.ResponseTime];
|
|
259
|
+
}
|
|
260
|
+
|
|
246
261
|
return [];
|
|
247
262
|
}
|
|
248
263
|
|
|
@@ -13,13 +13,27 @@ import {
|
|
|
13
13
|
classifyEndpointRole,
|
|
14
14
|
resolveDeviceRole,
|
|
15
15
|
} from "./NetworkDeviceRoleUtil";
|
|
16
|
+
import DeviceReachabilityUtil, {
|
|
17
|
+
NetworkDeviceReachability,
|
|
18
|
+
} from "../NetworkDevice/DeviceReachabilityUtil";
|
|
16
19
|
|
|
17
20
|
export interface TopologyDeviceInput {
|
|
18
21
|
id: string;
|
|
19
22
|
name: string;
|
|
20
23
|
hostname?: string | undefined;
|
|
21
24
|
sysName?: string | undefined;
|
|
25
|
+
/*
|
|
26
|
+
* Reachability inputs, all three of them. `isReachable` is the outcome of
|
|
27
|
+
* the last poll and is what actually decides up/down; `lastPolledAt` and
|
|
28
|
+
* `pollingIntervalInMinutes` only size the "we have stopped polling
|
|
29
|
+
* entirely" backstop. Passing lastSeenAt alone still works (that is the
|
|
30
|
+
* legacy path for rows written before the columns existed) but re-creates
|
|
31
|
+
* the bug where a fleet the probe cannot keep up with draws all-red.
|
|
32
|
+
*/
|
|
33
|
+
isReachable?: boolean | undefined;
|
|
34
|
+
lastPolledAt?: Date | undefined;
|
|
22
35
|
lastSeenAt?: Date | undefined;
|
|
36
|
+
pollingIntervalInMinutes?: number | undefined;
|
|
23
37
|
interfacesUp?: number | undefined;
|
|
24
38
|
interfacesDown?: number | undefined;
|
|
25
39
|
vendor?: string | undefined;
|
|
@@ -232,12 +246,17 @@ interface ResolvedClaim {
|
|
|
232
246
|
*/
|
|
233
247
|
const IPV4_PATTERN: RegExp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
|
|
234
248
|
|
|
235
|
-
// A device not seen within this window is treated as not currently up.
|
|
236
|
-
const FRESH_WINDOW_MS: number = 15 * 60 * 1000;
|
|
237
|
-
|
|
238
249
|
// Endpoint nodes rendered per graph; the slice is deterministic (by MAC).
|
|
239
250
|
const ENDPOINT_RENDER_CAP: number = 2000;
|
|
240
251
|
|
|
252
|
+
/*
|
|
253
|
+
* How long an ARP/FDB-learned endpoint keeps its "up" colour after the last
|
|
254
|
+
* walk that saw it. Taken from the shared device rule at its default
|
|
255
|
+
* interval so the map's two node kinds age out on comparable timescales.
|
|
256
|
+
*/
|
|
257
|
+
const ENDPOINT_FRESH_WINDOW_MS: number =
|
|
258
|
+
DeviceReachabilityUtil.getStaleWindowInMinutes(undefined) * 60 * 1000;
|
|
259
|
+
|
|
241
260
|
export default class NetworkTopologyUtil {
|
|
242
261
|
/*
|
|
243
262
|
* Builds the topology graph from every device in a project. Nodes are the
|
|
@@ -1305,10 +1324,17 @@ export default class NetworkTopologyUtil {
|
|
|
1305
1324
|
if (device.monitorStatus) {
|
|
1306
1325
|
return device.monitorStatus;
|
|
1307
1326
|
}
|
|
1308
|
-
return NetworkTopologyUtil.
|
|
1327
|
+
return NetworkTopologyUtil.statusFromPoll(device, now);
|
|
1309
1328
|
}
|
|
1310
1329
|
|
|
1311
|
-
|
|
1330
|
+
/*
|
|
1331
|
+
* Endpoints (ARP/FDB-learned hosts) have no poll of their own: they are
|
|
1332
|
+
* re-learned from whichever device's tables they appear in, so freshness
|
|
1333
|
+
* really is all there is to go on. The window is the shared default
|
|
1334
|
+
* staleness window rather than the old fixed 15 minutes, so a host on a
|
|
1335
|
+
* switch its probe polls slowly does not blink out of the map between
|
|
1336
|
+
* walks.
|
|
1337
|
+
*/
|
|
1312
1338
|
private static statusFromLastSeen(
|
|
1313
1339
|
lastSeenAt: Date | undefined,
|
|
1314
1340
|
now: Date,
|
|
@@ -1316,10 +1342,36 @@ export default class NetworkTopologyUtil {
|
|
|
1316
1342
|
if (!lastSeenAt) {
|
|
1317
1343
|
return "unknown";
|
|
1318
1344
|
}
|
|
1345
|
+
|
|
1319
1346
|
const ageMs: number = now.getTime() - new Date(lastSeenAt).getTime();
|
|
1320
|
-
|
|
1321
|
-
|
|
1347
|
+
|
|
1348
|
+
return ageMs > ENDPOINT_FRESH_WINDOW_MS ? "down" : "up";
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
/*
|
|
1352
|
+
* The shared reachability rule (DeviceReachabilityUtil), mapped onto the
|
|
1353
|
+
* graph's three node states. "Pending" — never polled — is the graph's
|
|
1354
|
+
* "unknown", which is what keeps a device nothing walks from being drawn
|
|
1355
|
+
* as a failure.
|
|
1356
|
+
*/
|
|
1357
|
+
private static statusFromPoll(
|
|
1358
|
+
device: TopologyDeviceInput,
|
|
1359
|
+
now: Date,
|
|
1360
|
+
): NetworkTopologyNodeStatus {
|
|
1361
|
+
const status: NetworkDeviceReachability = DeviceReachabilityUtil.getStatus(
|
|
1362
|
+
{
|
|
1363
|
+
isReachable: device.isReachable,
|
|
1364
|
+
lastPolledAt: device.lastPolledAt,
|
|
1365
|
+
lastSeenAt: device.lastSeenAt,
|
|
1366
|
+
pollingIntervalInMinutes: device.pollingIntervalInMinutes,
|
|
1367
|
+
},
|
|
1368
|
+
now,
|
|
1369
|
+
);
|
|
1370
|
+
|
|
1371
|
+
if (status === NetworkDeviceReachability.Pending) {
|
|
1372
|
+
return "unknown";
|
|
1322
1373
|
}
|
|
1323
|
-
|
|
1374
|
+
|
|
1375
|
+
return status === NetworkDeviceReachability.Up ? "up" : "down";
|
|
1324
1376
|
}
|
|
1325
1377
|
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import OneUptimeDate from "../../Types/Date";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* The one place that decides whether a NetworkDevice is reachable.
|
|
5
|
+
*
|
|
6
|
+
* The rule this replaces was "lastSeenAt within a fixed 15 minutes = up",
|
|
7
|
+
* which conflates two different facts:
|
|
8
|
+
*
|
|
9
|
+
* 1. the device did not answer the probe (the device is down), and
|
|
10
|
+
* 2. the probe has not asked it recently (WE are behind).
|
|
11
|
+
*
|
|
12
|
+
* (2) is not a device outage. A probe hands out at most a bounded number of
|
|
13
|
+
* devices per fetch cycle, so a large fleet's real poll cadence is
|
|
14
|
+
* `fleetSize / claimRate` minutes however short the configured interval is —
|
|
15
|
+
* and a fleet whose cadence exceeds the freshness window paints healthy
|
|
16
|
+
* devices red on the device list, the topology graph and the site rollup,
|
|
17
|
+
* while the device's own Interfaces tab (written by that same successful
|
|
18
|
+
* walk) still reads "Up". A device polled on a 30-minute interval was
|
|
19
|
+
* permanently "Down" for the same reason: it can never satisfy a 15-minute
|
|
20
|
+
* window.
|
|
21
|
+
*
|
|
22
|
+
* So reachability is now the OUTCOME of the most recent poll —
|
|
23
|
+
* NetworkDevice.isReachable, stamped by the walk pipeline on every ingested
|
|
24
|
+
* walk — and freshness is only a backstop for "the polling pipeline itself
|
|
25
|
+
* stopped", measured generously against the device's own interval.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export enum NetworkDeviceReachability {
|
|
29
|
+
Up = "Up",
|
|
30
|
+
Down = "Down",
|
|
31
|
+
Pending = "Pending",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* Mirrors the NetworkDevice.pollingIntervalInMinutes column default, and is
|
|
36
|
+
* what a NULL interval (rows written before that column existed) is read as.
|
|
37
|
+
*/
|
|
38
|
+
export const DEFAULT_DEVICE_POLLING_INTERVAL_IN_MINUTES: number = 5;
|
|
39
|
+
|
|
40
|
+
/*
|
|
41
|
+
* Consecutive missed polls before a device's last verdict is reported as
|
|
42
|
+
* STALE. Staleness is an annotation on the verdict, never the verdict
|
|
43
|
+
* itself — see getReachability for why turning it into "Down" would both
|
|
44
|
+
* re-create this bug at a longer timescale and put the pill permanently at
|
|
45
|
+
* odds with the summary counts.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately generous: a device that stops answering is marked
|
|
48
|
+
* unreachable by the very next poll, so the only thing this flags is the
|
|
49
|
+
* whole polling pipeline going silent (probe offline, claim loop wedged,
|
|
50
|
+
* walk queue backed up). Ten missed cycles is unambiguous.
|
|
51
|
+
*/
|
|
52
|
+
export const DEVICE_MISSED_POLL_ALLOWANCE: number = 10;
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* Floor under the window above, so a device on a one-minute interval is not
|
|
56
|
+
* declared out of contact after ten minutes of ordinary scheduling jitter.
|
|
57
|
+
*/
|
|
58
|
+
export const DEVICE_MIN_STALE_WINDOW_IN_MINUTES: number = 60;
|
|
59
|
+
|
|
60
|
+
// The columns this util reads. Every caller selects exactly these.
|
|
61
|
+
export interface DeviceReachabilityInput {
|
|
62
|
+
/*
|
|
63
|
+
* Outcome of the most recent poll: true = the device answered, false = the
|
|
64
|
+
* probe could not reach it, null/undefined = never polled, or a row
|
|
65
|
+
* written before this column existed.
|
|
66
|
+
*/
|
|
67
|
+
isReachable?: boolean | null | undefined;
|
|
68
|
+
// When the probe last ATTEMPTED a walk, whatever the outcome.
|
|
69
|
+
lastPolledAt?: Date | string | null | undefined;
|
|
70
|
+
// When the device last ANSWERED one.
|
|
71
|
+
lastSeenAt?: Date | string | null | undefined;
|
|
72
|
+
// The device's own schedule; sizes the staleness backstop.
|
|
73
|
+
pollingIntervalInMinutes?: number | null | undefined;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface DeviceReachabilityResult {
|
|
77
|
+
status: NetworkDeviceReachability;
|
|
78
|
+
/*
|
|
79
|
+
* True when the last poll ATTEMPT is older than the staleness window —
|
|
80
|
+
* i.e. this verdict is being read off data nothing has refreshed for a
|
|
81
|
+
* long time. Strictly independent of `status`: it qualifies the verdict
|
|
82
|
+
* ("and nobody has checked lately") rather than changing it, and either
|
|
83
|
+
* an Up or a Down device can be stale.
|
|
84
|
+
*/
|
|
85
|
+
isStale: boolean;
|
|
86
|
+
// The window `isStale` was measured against, so the UI can name it.
|
|
87
|
+
staleWindowInMinutes: number;
|
|
88
|
+
// Latest of lastPolledAt / lastSeenAt; null when neither is set.
|
|
89
|
+
lastContactAt: Date | null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const MS_PER_MINUTE: number = 60 * 1000;
|
|
93
|
+
|
|
94
|
+
export default class DeviceReachabilityUtil {
|
|
95
|
+
/*
|
|
96
|
+
* The device's poll interval as a usable positive number. NULL, zero,
|
|
97
|
+
* negative and non-finite values all fall back to the column default —
|
|
98
|
+
* the same clamp NetworkDeviceService.claimDevicesForPolling applies when
|
|
99
|
+
* it advances nextPollAt, so the window and the schedule agree.
|
|
100
|
+
*/
|
|
101
|
+
public static getPollingIntervalInMinutes(
|
|
102
|
+
pollingIntervalInMinutes?: number | null | undefined,
|
|
103
|
+
): number {
|
|
104
|
+
if (
|
|
105
|
+
typeof pollingIntervalInMinutes !== "number" ||
|
|
106
|
+
!Number.isFinite(pollingIntervalInMinutes) ||
|
|
107
|
+
pollingIntervalInMinutes <= 0
|
|
108
|
+
) {
|
|
109
|
+
return DEFAULT_DEVICE_POLLING_INTERVAL_IN_MINUTES;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return Math.max(pollingIntervalInMinutes, 1);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// How long a device may go unpolled before its last verdict goes stale.
|
|
116
|
+
public static getStaleWindowInMinutes(
|
|
117
|
+
pollingIntervalInMinutes?: number | null | undefined,
|
|
118
|
+
): number {
|
|
119
|
+
const interval: number = DeviceReachabilityUtil.getPollingIntervalInMinutes(
|
|
120
|
+
pollingIntervalInMinutes,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
return Math.max(
|
|
124
|
+
interval * DEVICE_MISSED_POLL_ALLOWANCE,
|
|
125
|
+
DEVICE_MIN_STALE_WINDOW_IN_MINUTES,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public static getReachability(
|
|
130
|
+
device: DeviceReachabilityInput,
|
|
131
|
+
now?: Date | undefined,
|
|
132
|
+
): DeviceReachabilityResult {
|
|
133
|
+
const currentDate: Date = now || OneUptimeDate.getCurrentDate();
|
|
134
|
+
|
|
135
|
+
const staleWindowInMinutes: number =
|
|
136
|
+
DeviceReachabilityUtil.getStaleWindowInMinutes(
|
|
137
|
+
device.pollingIntervalInMinutes,
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const lastPolledAt: Date | null = toDate(device.lastPolledAt);
|
|
141
|
+
const lastSeenAt: Date | null = toDate(device.lastSeenAt);
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
* Newest of the two. lastPolledAt alone would be wrong for rows written
|
|
145
|
+
* before it existed (they only have lastSeenAt), and lastSeenAt alone
|
|
146
|
+
* would call a device that is being polled and failing "out of contact"
|
|
147
|
+
* — it is very much in contact, it is just down.
|
|
148
|
+
*/
|
|
149
|
+
const lastContactAt: Date | null = newerOf(lastPolledAt, lastSeenAt);
|
|
150
|
+
|
|
151
|
+
const isStale: boolean = lastContactAt
|
|
152
|
+
? currentDate.getTime() - lastContactAt.getTime() >
|
|
153
|
+
staleWindowInMinutes * MS_PER_MINUTE
|
|
154
|
+
: false;
|
|
155
|
+
|
|
156
|
+
const result: (
|
|
157
|
+
status: NetworkDeviceReachability,
|
|
158
|
+
) => DeviceReachabilityResult = (
|
|
159
|
+
status: NetworkDeviceReachability,
|
|
160
|
+
): DeviceReachabilityResult => {
|
|
161
|
+
return {
|
|
162
|
+
status: status,
|
|
163
|
+
isStale: isStale,
|
|
164
|
+
staleWindowInMinutes: staleWindowInMinutes,
|
|
165
|
+
lastContactAt: lastContactAt,
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/*
|
|
170
|
+
* The probe asked and got nothing. Authoritative however long ago it
|
|
171
|
+
* was — nothing since has said otherwise.
|
|
172
|
+
*/
|
|
173
|
+
if (device.isReachable === false) {
|
|
174
|
+
return result(NetworkDeviceReachability.Down);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/*
|
|
178
|
+
* The probe asked and the device answered. The answer stands until a
|
|
179
|
+
* later poll contradicts it.
|
|
180
|
+
*
|
|
181
|
+
* Staleness deliberately does NOT override this. Turning "we have not
|
|
182
|
+
* asked in a while" into "the device is down" is the exact move this
|
|
183
|
+
* whole change exists to undo — doing it again at a longer timescale
|
|
184
|
+
* would just relocate the bug. It is also not expressible as a database
|
|
185
|
+
* filter (the window is per-device, derived from each row's own
|
|
186
|
+
* interval), so a status that depended on it could never agree with the
|
|
187
|
+
* summary counts or the Status filter, which have to run in SQL over
|
|
188
|
+
* `isReachable`. A verdict the list cannot count or filter by is a
|
|
189
|
+
* verdict that contradicts itself on screen.
|
|
190
|
+
*
|
|
191
|
+
* `isStale` still comes back in the result, and the UI shows it as what
|
|
192
|
+
* it is — "nothing has polled this device in N minutes, check its
|
|
193
|
+
* probe" — which is a different and more actionable statement than
|
|
194
|
+
* "this device is down".
|
|
195
|
+
*/
|
|
196
|
+
if (device.isReachable === true) {
|
|
197
|
+
return result(NetworkDeviceReachability.Up);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/*
|
|
201
|
+
* No recorded outcome. Either the device has genuinely never been polled
|
|
202
|
+
* (Pending), or the row predates the column — in which case lastSeenAt
|
|
203
|
+
* is all we have and freshness is the only rule available. The upgrade
|
|
204
|
+
* migration backfills these, so this is a short-lived path.
|
|
205
|
+
*/
|
|
206
|
+
if (!lastSeenAt) {
|
|
207
|
+
/*
|
|
208
|
+
* Polled but never once answered — the probe has been trying and
|
|
209
|
+
* failing, which is Down, not "not set up yet".
|
|
210
|
+
*/
|
|
211
|
+
if (lastPolledAt) {
|
|
212
|
+
return result(NetworkDeviceReachability.Down);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return result(NetworkDeviceReachability.Pending);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return result(
|
|
219
|
+
isStale ? NetworkDeviceReachability.Down : NetworkDeviceReachability.Up,
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Shorthand for callers that only render the pill.
|
|
224
|
+
public static getStatus(
|
|
225
|
+
device: DeviceReachabilityInput,
|
|
226
|
+
now?: Date | undefined,
|
|
227
|
+
): NetworkDeviceReachability {
|
|
228
|
+
return DeviceReachabilityUtil.getReachability(device, now).status;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/*
|
|
233
|
+
* Tolerant of everything an API payload can carry in a date column: a Date,
|
|
234
|
+
* an ISO string, the serialized {_type, value} form, null, undefined and the
|
|
235
|
+
* empty string. Anything unparseable reads as "not set" rather than as an
|
|
236
|
+
* Invalid Date that would silently compare false against every window.
|
|
237
|
+
*/
|
|
238
|
+
function toDate(value: Date | string | null | undefined): Date | null {
|
|
239
|
+
if (value === null || value === undefined || value === "") {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const parsed: Date = OneUptimeDate.fromString(value);
|
|
244
|
+
|
|
245
|
+
if (!(parsed instanceof Date) || Number.isNaN(parsed.getTime())) {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return parsed;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function newerOf(first: Date | null, second: Date | null): Date | null {
|
|
253
|
+
if (!first) {
|
|
254
|
+
return second;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if (!second) {
|
|
258
|
+
return first;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return first.getTime() >= second.getTime() ? first : second;
|
|
262
|
+
}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import DeviceReachabilityUtil, {
|
|
2
|
+
NetworkDeviceReachability,
|
|
3
|
+
} from "../NetworkDevice/DeviceReachabilityUtil";
|
|
4
|
+
|
|
1
5
|
/*
|
|
2
6
|
* Worst-of health rollup for a NetworkSite's device subtree.
|
|
3
7
|
*
|
|
@@ -16,8 +20,17 @@ export interface DeviceHealthState {
|
|
|
16
20
|
currentMonitorStatusId?: string | null | undefined;
|
|
17
21
|
// Priority of that status row; missing when the row no longer exists.
|
|
18
22
|
monitorStatusPriority?: number | null | undefined;
|
|
19
|
-
|
|
23
|
+
/*
|
|
24
|
+
* The SNMP fallback for devices no monitor stamps, resolved by the shared
|
|
25
|
+
* DeviceReachabilityUtil rule: the OUTCOME of the last poll, not the age
|
|
26
|
+
* of the last success. Rolling a site up from freshness alone is what
|
|
27
|
+
* turned "the probe is behind on a 900-device fleet" into a red site card
|
|
28
|
+
* over devices that were all answering.
|
|
29
|
+
*/
|
|
30
|
+
isReachable?: boolean | null | undefined;
|
|
31
|
+
lastPolledAt?: Date | null | undefined;
|
|
20
32
|
lastSeenAt?: Date | null | undefined;
|
|
33
|
+
pollingIntervalInMinutes?: number | null | undefined;
|
|
21
34
|
}
|
|
22
35
|
|
|
23
36
|
// A project MonitorStatus row a freshness fallback can resolve to.
|
|
@@ -27,32 +40,27 @@ export interface RollupStatusOption {
|
|
|
27
40
|
}
|
|
28
41
|
|
|
29
42
|
export class SiteStatusRollupUtil {
|
|
30
|
-
// A device is considered alive when SNMP data arrived within this window.
|
|
31
|
-
public static readonly DEFAULT_FRESHNESS_WINDOW_IN_MINUTES: number = 15;
|
|
32
|
-
|
|
33
43
|
/*
|
|
34
44
|
* Returns the winning MonitorStatus id for a set of devices, or null when
|
|
35
|
-
* no device contributes anything (empty subtree, or
|
|
36
|
-
*
|
|
37
|
-
*
|
|
45
|
+
* no device contributes anything (empty subtree, or fallbacks unavailable
|
|
46
|
+
* because the project has no operational/offline rows) - the caller
|
|
47
|
+
* treats null as "leave the site's status untouched".
|
|
38
48
|
*
|
|
39
49
|
* Per device: a stamped monitor status (with a known priority) wins;
|
|
40
|
-
* otherwise
|
|
41
|
-
* isOperationalState row and
|
|
42
|
-
*
|
|
50
|
+
* otherwise the device's SNMP reachability maps Up to the project's
|
|
51
|
+
* isOperationalState row and Down to its isOfflineState row. A device
|
|
52
|
+
* that has never been polled contributes nothing at all - it is not
|
|
53
|
+
* evidence of an outage, and counting it as one used to pin a site red
|
|
54
|
+
* for as long as it took the first walk to land. Priority ties keep the
|
|
55
|
+
* first contributor (stable).
|
|
43
56
|
*/
|
|
44
57
|
public static worstStatus(data: {
|
|
45
58
|
deviceStates: Array<DeviceHealthState>;
|
|
46
59
|
operationalStatus?: RollupStatusOption | null | undefined;
|
|
47
60
|
offlineStatus?: RollupStatusOption | null | undefined;
|
|
48
61
|
now?: Date | undefined;
|
|
49
|
-
freshnessWindowInMinutes?: number | undefined;
|
|
50
62
|
}): string | null {
|
|
51
63
|
const now: Date = data.now || new Date();
|
|
52
|
-
const windowInMinutes: number =
|
|
53
|
-
data.freshnessWindowInMinutes ??
|
|
54
|
-
SiteStatusRollupUtil.DEFAULT_FRESHNESS_WINDOW_IN_MINUTES;
|
|
55
|
-
const windowInMs: number = windowInMinutes * 60 * 1000;
|
|
56
64
|
|
|
57
65
|
let winner: RollupStatusOption | null = null;
|
|
58
66
|
|
|
@@ -69,16 +77,25 @@ export class SiteStatusRollupUtil {
|
|
|
69
77
|
priority: device.monitorStatusPriority,
|
|
70
78
|
};
|
|
71
79
|
} else {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
const reachability: NetworkDeviceReachability =
|
|
81
|
+
DeviceReachabilityUtil.getStatus(
|
|
82
|
+
{
|
|
83
|
+
isReachable: device.isReachable,
|
|
84
|
+
lastPolledAt: device.lastPolledAt,
|
|
85
|
+
lastSeenAt: device.lastSeenAt,
|
|
86
|
+
pollingIntervalInMinutes: device.pollingIntervalInMinutes,
|
|
87
|
+
},
|
|
88
|
+
now,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
if (reachability === NetworkDeviceReachability.Pending) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
78
94
|
|
|
79
|
-
candidate =
|
|
80
|
-
|
|
81
|
-
|
|
95
|
+
candidate =
|
|
96
|
+
reachability === NetworkDeviceReachability.Up
|
|
97
|
+
? data.operationalStatus || null
|
|
98
|
+
: data.offlineStatus || null;
|
|
82
99
|
}
|
|
83
100
|
|
|
84
101
|
if (!candidate) {
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import Dictionary from "../../Types/Dictionary";
|
|
2
|
+
import {
|
|
3
|
+
RESOURCE_ENTITY_FACET_KEYS,
|
|
4
|
+
ResourceEntityFacetSelections,
|
|
5
|
+
isResourceEntityFacetKey,
|
|
6
|
+
} from "../../Types/Telemetry/ResourceEntityFacet";
|
|
2
7
|
import OneUptimeDate from "../../Types/Date";
|
|
3
8
|
import TimeRange from "../../Types/Time/TimeRange";
|
|
4
9
|
import MetricExplorerUrl, {
|
|
@@ -61,6 +66,16 @@ const WHITESPACE: RegExp = /\s/;
|
|
|
61
66
|
export interface TelemetryCrossSignalScope {
|
|
62
67
|
/** Service ObjectID strings (Log/Span `primaryEntityId` values). */
|
|
63
68
|
serviceIds?: Array<string> | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* Non-Service resource selections keyed by facet — e.g.
|
|
71
|
+
* `{ kubernetesClusterId: ["<id>"] }`. Deliberately NOT merged into
|
|
72
|
+
* `serviceIds`: a host or cluster id is not a `primaryEntityId` value for
|
|
73
|
+
* telemetry that carries a `service.name`, so it has to reach the target
|
|
74
|
+
* explorer as its own facet and be resolved to the resource's entity key
|
|
75
|
+
* there. Both the logs and the traces `filters` grammar carry arbitrary
|
|
76
|
+
* facet keys, so these survive the trip intact.
|
|
77
|
+
*/
|
|
78
|
+
resourceFacetSelections?: ResourceEntityFacetSelections | undefined;
|
|
64
79
|
/** Exact-match telemetry attribute filters. Keys may contain dots. */
|
|
65
80
|
attributes?: Dictionary<string> | undefined;
|
|
66
81
|
traceIds?: Array<string> | undefined;
|
|
@@ -165,6 +180,36 @@ function sanitizeAttributeEntries(
|
|
|
165
180
|
return entries;
|
|
166
181
|
}
|
|
167
182
|
|
|
183
|
+
/*
|
|
184
|
+
* Drop unknown facet keys and blank ids from a resource selection map. An
|
|
185
|
+
* unknown key would become a filter chip the target explorer cannot compile
|
|
186
|
+
* (it would land as an unknown column predicate), so it is reported as
|
|
187
|
+
* dropped by the callers instead of being emitted.
|
|
188
|
+
*/
|
|
189
|
+
function sanitizeResourceFacetSelections(
|
|
190
|
+
selections: ResourceEntityFacetSelections | undefined,
|
|
191
|
+
): Array<[string, Array<string>]> {
|
|
192
|
+
if (!selections) {
|
|
193
|
+
return [];
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const entries: Array<[string, Array<string>]> = [];
|
|
197
|
+
|
|
198
|
+
for (const facetKey of RESOURCE_ENTITY_FACET_KEYS) {
|
|
199
|
+
if (!isResourceEntityFacetKey(facetKey)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const values: Array<string> = sanitizeValues(selections[facetKey]);
|
|
204
|
+
|
|
205
|
+
if (values.length > 0) {
|
|
206
|
+
entries.push([facetKey, values]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return entries;
|
|
211
|
+
}
|
|
212
|
+
|
|
168
213
|
function isValidDate(value: Date | undefined): value is Date {
|
|
169
214
|
return value instanceof Date && !isNaN(value.getTime());
|
|
170
215
|
}
|
|
@@ -250,6 +295,12 @@ export function toLogsExplorerQueryParams(
|
|
|
250
295
|
tuples.push(["primaryEntityId", serviceIds]);
|
|
251
296
|
}
|
|
252
297
|
|
|
298
|
+
for (const [facetKey, values] of sanitizeResourceFacetSelections(
|
|
299
|
+
scope.resourceFacetSelections,
|
|
300
|
+
)) {
|
|
301
|
+
tuples.push([facetKey, values]);
|
|
302
|
+
}
|
|
303
|
+
|
|
253
304
|
const traceIds: Array<string> = sanitizeValues(scope.traceIds);
|
|
254
305
|
|
|
255
306
|
if (traceIds.length > 0) {
|
|
@@ -372,6 +423,19 @@ export function toTracesExplorerQueryParams(
|
|
|
372
423
|
filterTuples.push(["primaryEntityId", serviceId]);
|
|
373
424
|
}
|
|
374
425
|
|
|
426
|
+
/*
|
|
427
|
+
* The traces `filters` grammar is one [key, value] pair per chip, so a
|
|
428
|
+
* multi-valued selection fans out into one chip per id — the explorer
|
|
429
|
+
* groups same-key chips back into a single facet selection.
|
|
430
|
+
*/
|
|
431
|
+
for (const [facetKey, values] of sanitizeResourceFacetSelections(
|
|
432
|
+
scope.resourceFacetSelections,
|
|
433
|
+
)) {
|
|
434
|
+
for (const value of values) {
|
|
435
|
+
filterTuples.push([facetKey, value]);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
375
439
|
for (const [key, value] of sanitizeAttributeEntries(scope.attributes)) {
|
|
376
440
|
const tokenValue: string | null = isTraceTokenSafeKey(key)
|
|
377
441
|
? buildTraceSearchTokenValue(value)
|
|
@@ -438,10 +502,11 @@ export function toTracesExplorerQueryParams(
|
|
|
438
502
|
* Custom by the absolute params alone — see MetricExplorerUrl). The
|
|
439
503
|
* optional `metricName` argument names the query.
|
|
440
504
|
*
|
|
441
|
-
* Dropped: serviceIds, traceIds, spanIds,
|
|
442
|
-
* explorer's URL grammar has no service /
|
|
443
|
-
*
|
|
444
|
-
*
|
|
505
|
+
* Dropped: serviceIds, resourceFacetSelections, traceIds, spanIds,
|
|
506
|
+
* severityTexts — the metric explorer's URL grammar has no service /
|
|
507
|
+
* resource / trace / span / severity dimension (metrics carry a
|
|
508
|
+
* primaryEntityId column, but the explorer only parses metricName +
|
|
509
|
+
* attributes out of `metricQueries`).
|
|
445
510
|
*/
|
|
446
511
|
export function toMetricsExplorerQueryParams(
|
|
447
512
|
scope: TelemetryCrossSignalScope,
|
|
@@ -484,6 +549,12 @@ export function toMetricsExplorerQueryParams(
|
|
|
484
549
|
dropped.push("serviceIds");
|
|
485
550
|
}
|
|
486
551
|
|
|
552
|
+
for (const [facetKey] of sanitizeResourceFacetSelections(
|
|
553
|
+
scope.resourceFacetSelections,
|
|
554
|
+
)) {
|
|
555
|
+
dropped.push(facetKey);
|
|
556
|
+
}
|
|
557
|
+
|
|
487
558
|
if (sanitizeValues(scope.traceIds).length > 0) {
|
|
488
559
|
dropped.push("traceIds");
|
|
489
560
|
}
|