@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
|
@@ -30,7 +30,7 @@ import IncidentStateTimelineService from "../../../../Server/Services/IncidentSt
|
|
|
30
30
|
import NetworkDeviceOwnerUserService from "../../../../Server/Services/NetworkDeviceOwnerUserService";
|
|
31
31
|
import ProjectScopedReferenceValidator from "../../../../Server/Utils/Database/ProjectScopedReferenceValidator";
|
|
32
32
|
import MonitorAlert from "../../../../Server/Utils/Monitor/MonitorAlert";
|
|
33
|
-
import
|
|
33
|
+
import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
|
|
34
34
|
import { DependencySuppressionResult } from "../../../../Server/Utils/Monitor/MonitorDependencySuppression";
|
|
35
35
|
import MonitorIncident from "../../../../Server/Utils/Monitor/MonitorIncident";
|
|
36
36
|
import Dictionary from "../../../../Types/Dictionary";
|
|
@@ -185,7 +185,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
|
|
|
185
185
|
|
|
186
186
|
let alertFindBySpy: SpyLike;
|
|
187
187
|
let incidentFindBySpy: SpyLike;
|
|
188
|
-
let
|
|
188
|
+
let resourceContextSpy: SpyLike;
|
|
189
189
|
|
|
190
190
|
beforeEach(() => {
|
|
191
191
|
createdIncidents = [];
|
|
@@ -211,9 +211,14 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
|
|
|
211
211
|
* creators — its call count is how these tests observe whether the flow
|
|
212
212
|
* proceeded past the block.
|
|
213
213
|
*/
|
|
214
|
-
|
|
215
|
-
.spyOn(
|
|
214
|
+
resourceContextSpy = jest
|
|
215
|
+
.spyOn(MonitorResourceContextUtil, "resolveResourceContextForMonitor")
|
|
216
216
|
.mockResolvedValue({
|
|
217
|
+
hostIds: [],
|
|
218
|
+
dockerHostIds: [],
|
|
219
|
+
podmanHostIds: [],
|
|
220
|
+
kubernetesClusterIds: [],
|
|
221
|
+
serviceIds: [],
|
|
217
222
|
proxmoxClusterIds: [],
|
|
218
223
|
cephClusterIds: [],
|
|
219
224
|
dockerSwarmClusterIds: [],
|
|
@@ -349,7 +354,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
|
|
|
349
354
|
expect(skipEvent.relatedCriteriaId).toBe("criteria-1");
|
|
350
355
|
|
|
351
356
|
// The skip block RETURNS: nothing after it (cluster context) runs.
|
|
352
|
-
expect(
|
|
357
|
+
expect(resourceContextSpy.mock.calls).toHaveLength(0);
|
|
353
358
|
});
|
|
354
359
|
|
|
355
360
|
it("suppressed: the open-alert resolve pass still runs before the skip block (resolution is never suppressed)", async () => {
|
|
@@ -421,7 +426,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
|
|
|
421
426
|
// The resolve pass still ran (it sits above both gates) ...
|
|
422
427
|
expect(alertFindBySpy.mock.calls).toHaveLength(1);
|
|
423
428
|
// ... and nothing after the gates did.
|
|
424
|
-
expect(
|
|
429
|
+
expect(resourceContextSpy.mock.calls).toHaveLength(0);
|
|
425
430
|
});
|
|
426
431
|
|
|
427
432
|
it("resolve-only entry point resolves an open alert — suppression state cannot block resolution", async () => {
|
|
@@ -488,7 +493,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
|
|
|
488
493
|
);
|
|
489
494
|
expect(skipEvent.relatedCriteriaId).toBe("criteria-1");
|
|
490
495
|
|
|
491
|
-
expect(
|
|
496
|
+
expect(resourceContextSpy.mock.calls).toHaveLength(0);
|
|
492
497
|
});
|
|
493
498
|
|
|
494
499
|
it("suppressed: the open-incident resolve pass still runs before the skip block (resolution is never suppressed)", async () => {
|
|
@@ -556,7 +561,7 @@ describe("Dependency-suppression skip block in the alert / incident creators", (
|
|
|
556
561
|
expect(createdIncidents).toHaveLength(0);
|
|
557
562
|
|
|
558
563
|
expect(incidentFindBySpy.mock.calls).toHaveLength(1);
|
|
559
|
-
expect(
|
|
564
|
+
expect(resourceContextSpy.mock.calls).toHaveLength(0);
|
|
560
565
|
});
|
|
561
566
|
|
|
562
567
|
it("resolve-only entry point resolves an open incident — suppression state cannot block resolution", async () => {
|
|
@@ -23,7 +23,8 @@ import PodmanHostService from "../../../../Server/Services/PodmanHostService";
|
|
|
23
23
|
import ProxmoxClusterService from "../../../../Server/Services/ProxmoxClusterService";
|
|
24
24
|
import ServiceService from "../../../../Server/Services/ServiceService";
|
|
25
25
|
import ProjectScopedReferenceValidator from "../../../../Server/Utils/Database/ProjectScopedReferenceValidator";
|
|
26
|
-
import
|
|
26
|
+
import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
|
|
27
|
+
import { SeriesResolvedResourceIds } from "../../../../Server/Utils/Monitor/SeriesResourceLinker";
|
|
27
28
|
import MonitorIncident from "../../../../Server/Utils/Monitor/MonitorIncident";
|
|
28
29
|
import Dictionary from "../../../../Types/Dictionary";
|
|
29
30
|
import { JSONObject } from "../../../../Types/JSON";
|
|
@@ -125,6 +126,25 @@ function idsOn(
|
|
|
125
126
|
});
|
|
126
127
|
}
|
|
127
128
|
|
|
129
|
+
/*
|
|
130
|
+
* The nine-relation shape MonitorResourceContext resolves from the
|
|
131
|
+
* monitor's own step config. Tests stub the util and hand back one of
|
|
132
|
+
* these, spreading over it to name only the relations under test.
|
|
133
|
+
*/
|
|
134
|
+
function emptyResourceContext(): SeriesResolvedResourceIds {
|
|
135
|
+
return {
|
|
136
|
+
hostIds: [],
|
|
137
|
+
dockerHostIds: [],
|
|
138
|
+
podmanHostIds: [],
|
|
139
|
+
kubernetesClusterIds: [],
|
|
140
|
+
serviceIds: [],
|
|
141
|
+
proxmoxClusterIds: [],
|
|
142
|
+
cephClusterIds: [],
|
|
143
|
+
dockerSwarmClusterIds: [],
|
|
144
|
+
iotFleetIds: [],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
128
148
|
describe("Incidents link the resources their series identifies", () => {
|
|
129
149
|
let createdIncidents: Array<Incident> = [];
|
|
130
150
|
|
|
@@ -138,12 +158,7 @@ describe("Incidents link the resources their series identifies", () => {
|
|
|
138
158
|
let dockerSwarmClusterRows: Array<{ _id: string }> = [];
|
|
139
159
|
let iotFleetRows: Array<{ _id: string }> = [];
|
|
140
160
|
|
|
141
|
-
let
|
|
142
|
-
proxmoxClusterIds: Array<string>;
|
|
143
|
-
cephClusterIds: Array<string>;
|
|
144
|
-
dockerSwarmClusterIds: Array<string>;
|
|
145
|
-
iotFleetIds: Array<string>;
|
|
146
|
-
};
|
|
161
|
+
let resourceContext: SeriesResolvedResourceIds;
|
|
147
162
|
|
|
148
163
|
beforeEach(() => {
|
|
149
164
|
createdIncidents = [];
|
|
@@ -158,12 +173,7 @@ describe("Incidents link the resources their series identifies", () => {
|
|
|
158
173
|
dockerSwarmClusterRows = [];
|
|
159
174
|
iotFleetRows = [];
|
|
160
175
|
|
|
161
|
-
|
|
162
|
-
proxmoxClusterIds: [],
|
|
163
|
-
cephClusterIds: [],
|
|
164
|
-
dockerSwarmClusterIds: [],
|
|
165
|
-
iotFleetIds: [],
|
|
166
|
-
};
|
|
176
|
+
resourceContext = emptyResourceContext();
|
|
167
177
|
|
|
168
178
|
// No incident is already open for this monitor.
|
|
169
179
|
jest.spyOn(IncidentService, "findBy").mockResolvedValue([]);
|
|
@@ -173,9 +183,9 @@ describe("Incidents link the resources their series identifies", () => {
|
|
|
173
183
|
.mockResolvedValue(true);
|
|
174
184
|
|
|
175
185
|
jest
|
|
176
|
-
.spyOn(
|
|
186
|
+
.spyOn(MonitorResourceContextUtil, "resolveResourceContextForMonitor")
|
|
177
187
|
.mockImplementation(async () => {
|
|
178
|
-
return
|
|
188
|
+
return resourceContext;
|
|
179
189
|
});
|
|
180
190
|
|
|
181
191
|
jest
|
|
@@ -422,7 +432,14 @@ describe("Incidents link the resources their series identifies", () => {
|
|
|
422
432
|
expect(idsOn(createdIncidents[1]!.hosts)).toEqual(["host-7"]);
|
|
423
433
|
});
|
|
424
434
|
|
|
425
|
-
it("links nothing, and still opens the incident, for an ungrouped monitor", async () => {
|
|
435
|
+
it("links nothing from LABELS, and still opens the incident, for an ungrouped monitor", async () => {
|
|
436
|
+
/*
|
|
437
|
+
* A whole-monitor incident has no series, so the label path has
|
|
438
|
+
* nothing to work with. It must not invent an identity from another
|
|
439
|
+
* series, and it must still be created. (The step-config path can
|
|
440
|
+
* still name a resource here — that is the test above; this one
|
|
441
|
+
* pins that the label path alone contributes nothing.)
|
|
442
|
+
*/
|
|
426
443
|
hostRows = [{ _id: "host-1" }];
|
|
427
444
|
|
|
428
445
|
await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
|
|
@@ -441,7 +458,8 @@ describe("Incidents link the resources their series identifies", () => {
|
|
|
441
458
|
|
|
442
459
|
it("merges the monitor's step-config cluster with the one the series names", async () => {
|
|
443
460
|
proxmoxClusterRows = [{ _id: "pve-from-label" }];
|
|
444
|
-
|
|
461
|
+
resourceContext = {
|
|
462
|
+
...emptyResourceContext(),
|
|
445
463
|
proxmoxClusterIds: ["pve-from-step-config"],
|
|
446
464
|
cephClusterIds: [],
|
|
447
465
|
dockerSwarmClusterIds: [],
|
|
@@ -464,8 +482,134 @@ describe("Incidents link the resources their series identifies", () => {
|
|
|
464
482
|
]);
|
|
465
483
|
});
|
|
466
484
|
|
|
485
|
+
it("links the service an ungrouped metric monitor is scoped to", async () => {
|
|
486
|
+
/*
|
|
487
|
+
* THE REPORTED BUG. The alert twin of this came from a Metrics monitor whose only
|
|
488
|
+
* resource identity was the attribute filter
|
|
489
|
+
* `oneuptime.service.name = app-plan-starship-online-production`.
|
|
490
|
+
* It is ungrouped, so there are no series labels and the label path
|
|
491
|
+
* links nothing — the incident's "Affected Resources" card read "No
|
|
492
|
+
* resources affected" even though the monitor named the service.
|
|
493
|
+
*
|
|
494
|
+
* `matchesPerSeries` is deliberately omitted: that is what makes
|
|
495
|
+
* this the ungrouped path.
|
|
496
|
+
*/
|
|
497
|
+
resourceContext = {
|
|
498
|
+
...emptyResourceContext(),
|
|
499
|
+
serviceIds: ["service-1"],
|
|
500
|
+
};
|
|
501
|
+
|
|
502
|
+
await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
|
|
503
|
+
criteriaInstance: criteriaInstance(),
|
|
504
|
+
monitor: monitor(),
|
|
505
|
+
dataToProcess: dataToProcess,
|
|
506
|
+
rootCause: "Memory is above 60%",
|
|
507
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
|
|
508
|
+
props: {},
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
expect(createdIncidents).toHaveLength(1);
|
|
512
|
+
expect(idsOn(createdIncidents[0]!.services)).toEqual(["service-1"]);
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
it("links the host an ungrouped host monitor is scoped to", async () => {
|
|
516
|
+
// Same shape for the infra types: the step config names the host.
|
|
517
|
+
resourceContext = {
|
|
518
|
+
...emptyResourceContext(),
|
|
519
|
+
hostIds: ["host-1"],
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
|
|
523
|
+
criteriaInstance: criteriaInstance(),
|
|
524
|
+
monitor: monitor(),
|
|
525
|
+
dataToProcess: dataToProcess,
|
|
526
|
+
rootCause: "CPU is above 90%",
|
|
527
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
|
|
528
|
+
props: {},
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
expect(idsOn(createdIncidents[0]!.hosts)).toEqual(["host-1"]);
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
it("merges the step-config service with the one the series names", async () => {
|
|
535
|
+
/*
|
|
536
|
+
* A grouped monitor can resolve a service from its labels while the
|
|
537
|
+
* step config names another. Neither may erase the other.
|
|
538
|
+
*/
|
|
539
|
+
serviceRows = [{ _id: "service-from-label" }];
|
|
540
|
+
resourceContext = {
|
|
541
|
+
...emptyResourceContext(),
|
|
542
|
+
serviceIds: ["service-from-step-config"],
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
|
|
546
|
+
criteriaInstance: criteriaInstance(),
|
|
547
|
+
monitor: monitor(),
|
|
548
|
+
dataToProcess: dataToProcess,
|
|
549
|
+
rootCause: "CPU is above 90%",
|
|
550
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
|
|
551
|
+
matchesPerSeries: [series({ "service.name": "checkout-api" }, "fp-1")],
|
|
552
|
+
props: {},
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
expect(idsOn(createdIncidents[0]!.services).sort()).toEqual([
|
|
556
|
+
"service-from-label",
|
|
557
|
+
"service-from-step-config",
|
|
558
|
+
]);
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
it("dedupes a service both paths resolved", async () => {
|
|
562
|
+
serviceRows = [{ _id: "service-1" }];
|
|
563
|
+
resourceContext = {
|
|
564
|
+
...emptyResourceContext(),
|
|
565
|
+
serviceIds: ["service-1"],
|
|
566
|
+
};
|
|
567
|
+
|
|
568
|
+
await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
|
|
569
|
+
criteriaInstance: criteriaInstance(),
|
|
570
|
+
monitor: monitor(),
|
|
571
|
+
dataToProcess: dataToProcess,
|
|
572
|
+
rootCause: "CPU is above 90%",
|
|
573
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
|
|
574
|
+
matchesPerSeries: [series({ "service.name": "checkout-api" }, "fp-1")],
|
|
575
|
+
props: {},
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
expect(idsOn(createdIncidents[0]!.services)).toEqual(["service-1"]);
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
it("attaches the step-config resources to EVERY incident of a grouped monitor", async () => {
|
|
582
|
+
/*
|
|
583
|
+
* One evaluation, two breaching series, one shared monitor config.
|
|
584
|
+
* Both incidents are about the same service.
|
|
585
|
+
*/
|
|
586
|
+
hostRows = [{ _id: "host-2" }];
|
|
587
|
+
resourceContext = {
|
|
588
|
+
...emptyResourceContext(),
|
|
589
|
+
serviceIds: ["service-1"],
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
await MonitorIncident.criteriaMetCreateIncidentsAndUpdateMonitorStatus({
|
|
593
|
+
criteriaInstance: criteriaInstance(),
|
|
594
|
+
monitor: monitor(),
|
|
595
|
+
dataToProcess: dataToProcess,
|
|
596
|
+
rootCause: "CPU is above 90%",
|
|
597
|
+
autoResolveCriteriaInstanceIdIncidentIdsDictionary: NO_AUTO_RESOLVE,
|
|
598
|
+
matchesPerSeries: [
|
|
599
|
+
series({ "host.name": "node-a" }, "fp-1"),
|
|
600
|
+
series({ "host.name": "node-b" }, "fp-2"),
|
|
601
|
+
],
|
|
602
|
+
props: {},
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
expect(createdIncidents).toHaveLength(2);
|
|
606
|
+
expect(idsOn(createdIncidents[0]!.services)).toEqual(["service-1"]);
|
|
607
|
+
expect(idsOn(createdIncidents[1]!.services)).toEqual(["service-1"]);
|
|
608
|
+
});
|
|
609
|
+
|
|
467
610
|
it("still attaches the step-config cluster to an ungrouped incident", async () => {
|
|
468
|
-
|
|
611
|
+
resourceContext = {
|
|
612
|
+
...emptyResourceContext(),
|
|
469
613
|
proxmoxClusterIds: [],
|
|
470
614
|
cephClusterIds: ["ceph-1"],
|
|
471
615
|
dockerSwarmClusterIds: [],
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PasswordHash carries a pre-existing TS5.9 diagnostic that fails any suite
|
|
3
|
+
* whose runtime require graph reaches it (DatabaseService, the base class of
|
|
4
|
+
* every concrete service, imports it). Nothing password-related is under
|
|
5
|
+
* test here, so the module is replaced WITH A FACTORY — an automock would
|
|
6
|
+
* still require (and type-check) the real file.
|
|
7
|
+
*/
|
|
8
|
+
jest.mock("../../../../Server/Utils/PasswordHash", () => {
|
|
9
|
+
return {
|
|
10
|
+
__esModule: true,
|
|
11
|
+
default: {
|
|
12
|
+
hash: jest.fn(),
|
|
13
|
+
verify: jest.fn(),
|
|
14
|
+
generateSalt: jest.fn(),
|
|
15
|
+
needsUpgrade: jest.fn(),
|
|
16
|
+
applyPepper: jest.fn(),
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
import Monitor from "../../../../Models/DatabaseModels/Monitor";
|
|
22
|
+
import HostService from "../../../../Server/Services/HostService";
|
|
23
|
+
import KubernetesClusterService from "../../../../Server/Services/KubernetesClusterService";
|
|
24
|
+
import ServiceService from "../../../../Server/Services/ServiceService";
|
|
25
|
+
import DockerHostService from "../../../../Server/Services/DockerHostService";
|
|
26
|
+
import MonitorResourceContextUtil from "../../../../Server/Utils/Monitor/MonitorResourceContext";
|
|
27
|
+
import SeriesResourceLinker, {
|
|
28
|
+
SeriesResolvedResourceIds,
|
|
29
|
+
} from "../../../../Server/Utils/Monitor/SeriesResourceLinker";
|
|
30
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
31
|
+
import MonitorStep from "../../../../Types/Monitor/MonitorStep";
|
|
32
|
+
import MonitorSteps from "../../../../Types/Monitor/MonitorSteps";
|
|
33
|
+
import MonitorType from "../../../../Types/Monitor/MonitorType";
|
|
34
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
35
|
+
import {
|
|
36
|
+
afterEach,
|
|
37
|
+
beforeEach,
|
|
38
|
+
describe,
|
|
39
|
+
expect,
|
|
40
|
+
jest,
|
|
41
|
+
test,
|
|
42
|
+
} from "@jest/globals";
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* MonitorResourceContext turns a monitor's own step config into the real
|
|
46
|
+
* resource rows its incidents and alerts should be attached to. It is
|
|
47
|
+
* what makes an UNGROUPED monitor link anything at all — the series-label
|
|
48
|
+
* path only fires for grouped criteria, and most monitors are ungrouped.
|
|
49
|
+
*
|
|
50
|
+
* The regression it fixes: an alert from a metric monitor scoped to one
|
|
51
|
+
* service showed "No resources affected", because the only thing naming
|
|
52
|
+
* that service was an attribute filter nobody read.
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
56
|
+
"11111111-1111-4111-8111-111111111111",
|
|
57
|
+
);
|
|
58
|
+
const MONITOR_ID: ObjectID = new ObjectID(
|
|
59
|
+
"22222222-2222-4222-8222-222222222222",
|
|
60
|
+
);
|
|
61
|
+
const SERVICE_ID: string = "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa";
|
|
62
|
+
|
|
63
|
+
function monitorWith(
|
|
64
|
+
monitorType: MonitorType,
|
|
65
|
+
stepData: JSONObject,
|
|
66
|
+
options?: { projectId?: ObjectID | undefined },
|
|
67
|
+
): Monitor {
|
|
68
|
+
const model: Monitor = new Monitor();
|
|
69
|
+
model._id = MONITOR_ID.toString();
|
|
70
|
+
model.monitorType = monitorType;
|
|
71
|
+
|
|
72
|
+
if (!options || options.projectId !== undefined) {
|
|
73
|
+
model.projectId = options?.projectId ?? PROJECT_ID;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const step: MonitorStep = new MonitorStep();
|
|
77
|
+
step.data = { ...step.data, ...stepData } as MonitorStep["data"];
|
|
78
|
+
|
|
79
|
+
const steps: MonitorSteps = new MonitorSteps();
|
|
80
|
+
steps.data = { monitorStepsInstanceArray: [step] };
|
|
81
|
+
model.monitorSteps = steps;
|
|
82
|
+
|
|
83
|
+
return model;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function metricViewConfigWith(attributes: JSONObject): JSONObject {
|
|
87
|
+
return {
|
|
88
|
+
queryConfigs: [
|
|
89
|
+
{
|
|
90
|
+
metricQueryData: {
|
|
91
|
+
filterData: { metricName: "some.metric", attributes: attributes },
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
formulaConfigs: [],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/*
|
|
100
|
+
* A TypeORM Raw() FindOperator as it appears in a captured query. Its
|
|
101
|
+
* SQL generator is a function on `.value` — invisible to JSON — so the
|
|
102
|
+
* only inspectable part is the bound-parameter bag.
|
|
103
|
+
*/
|
|
104
|
+
interface RawOperator {
|
|
105
|
+
type?: string | undefined;
|
|
106
|
+
objectLiteralParameters?: Record<string, unknown> | undefined;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/*
|
|
110
|
+
* The query each service's findBy was handed, so a test can assert the
|
|
111
|
+
* lookup was project-scoped and root-privileged rather than only
|
|
112
|
+
* checking the ids that came back.
|
|
113
|
+
*/
|
|
114
|
+
let capturedQueries: Array<{ service: string; query: JSONObject }> = [];
|
|
115
|
+
|
|
116
|
+
function stubService(
|
|
117
|
+
name: string,
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
service: any,
|
|
120
|
+
rows: Array<{ _id: string }>,
|
|
121
|
+
): void {
|
|
122
|
+
jest
|
|
123
|
+
.spyOn(service, "findBy")
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
125
|
+
.mockImplementation(async (args: any) => {
|
|
126
|
+
capturedQueries.push({ service: name, query: args.query as JSONObject });
|
|
127
|
+
return rows;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
describe("MonitorResourceContext", () => {
|
|
132
|
+
beforeEach(() => {
|
|
133
|
+
capturedQueries = [];
|
|
134
|
+
|
|
135
|
+
stubService("host", HostService, []);
|
|
136
|
+
stubService("dockerHost", DockerHostService, []);
|
|
137
|
+
stubService("kubernetesCluster", KubernetesClusterService, []);
|
|
138
|
+
stubService("service", ServiceService, []);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
afterEach(() => {
|
|
142
|
+
jest.restoreAllMocks();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("resolves the service a metric monitor's filter names", async () => {
|
|
146
|
+
stubService("service", ServiceService, [{ _id: SERVICE_ID }]);
|
|
147
|
+
|
|
148
|
+
const resolved: SeriesResolvedResourceIds =
|
|
149
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
150
|
+
monitor: monitorWith(MonitorType.Metrics, {
|
|
151
|
+
metricMonitor: {
|
|
152
|
+
metricViewConfig: metricViewConfigWith({
|
|
153
|
+
"oneuptime.service.name": "app-plan-starship-online-production",
|
|
154
|
+
}),
|
|
155
|
+
},
|
|
156
|
+
}),
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
expect(resolved.serviceIds).toEqual([SERVICE_ID]);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("resolves the services a log monitor's telemetryServiceIds name", async () => {
|
|
163
|
+
stubService("service", ServiceService, [{ _id: SERVICE_ID }]);
|
|
164
|
+
|
|
165
|
+
const resolved: SeriesResolvedResourceIds =
|
|
166
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
167
|
+
monitor: monitorWith(MonitorType.Logs, {
|
|
168
|
+
logMonitor: { telemetryServiceIds: [new ObjectID(SERVICE_ID)] },
|
|
169
|
+
}),
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
expect(resolved.serviceIds).toEqual([SERVICE_ID]);
|
|
173
|
+
|
|
174
|
+
// Looked up by primary key, not by name.
|
|
175
|
+
const serviceQuery: JSONObject | undefined = capturedQueries.find(
|
|
176
|
+
(entry: { service: string }): boolean => {
|
|
177
|
+
return entry.service === "service";
|
|
178
|
+
},
|
|
179
|
+
)?.query;
|
|
180
|
+
|
|
181
|
+
expect(serviceQuery?.["_id"]).toBeDefined();
|
|
182
|
+
expect(serviceQuery?.["name"]).toBeUndefined();
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("resolves the host a host monitor names", async () => {
|
|
186
|
+
stubService("host", HostService, [{ _id: "host-1" }]);
|
|
187
|
+
|
|
188
|
+
const resolved: SeriesResolvedResourceIds =
|
|
189
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
190
|
+
monitor: monitorWith(MonitorType.Host, {
|
|
191
|
+
hostMonitor: { hostIdentifier: "prod-01" },
|
|
192
|
+
}),
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
expect(resolved.hostIds).toEqual(["host-1"]);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("resolves the cluster a kubernetes monitor names", async () => {
|
|
199
|
+
stubService("kubernetesCluster", KubernetesClusterService, [
|
|
200
|
+
{ _id: "k8s-1" },
|
|
201
|
+
]);
|
|
202
|
+
|
|
203
|
+
const resolved: SeriesResolvedResourceIds =
|
|
204
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
205
|
+
monitor: monitorWith(MonitorType.Kubernetes, {
|
|
206
|
+
kubernetesMonitor: { clusterIdentifier: "prod-cluster" },
|
|
207
|
+
}),
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
expect(resolved.kubernetesClusterIds).toEqual(["k8s-1"]);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test("matches a name case-insensitively", async () => {
|
|
214
|
+
/*
|
|
215
|
+
* The identifier was typed by a user into the monitor form; the row's
|
|
216
|
+
* name was stamped by an agent at ingest. They legitimately differ by
|
|
217
|
+
* case, so the lookup must not be an exact-match Includes().
|
|
218
|
+
*/
|
|
219
|
+
stubService("host", HostService, [{ _id: "host-1" }]);
|
|
220
|
+
|
|
221
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
222
|
+
monitor: monitorWith(MonitorType.Host, {
|
|
223
|
+
hostMonitor: { hostIdentifier: "PROD-01" },
|
|
224
|
+
}),
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
const hostQuery: JSONObject | undefined = capturedQueries.find(
|
|
228
|
+
(entry: { service: string }): boolean => {
|
|
229
|
+
return entry.service === "host";
|
|
230
|
+
},
|
|
231
|
+
)?.query;
|
|
232
|
+
|
|
233
|
+
const identifierClause: RawOperator | undefined = hostQuery?.[
|
|
234
|
+
"hostIdentifier"
|
|
235
|
+
] as RawOperator | undefined;
|
|
236
|
+
|
|
237
|
+
/*
|
|
238
|
+
* A TypeORM Raw() operator, not a plain Includes: the SQL generator
|
|
239
|
+
* lives on `.value` (a function, invisible to JSON) and the
|
|
240
|
+
* identifiers are BOUND under a per-call random key in
|
|
241
|
+
* `.objectLiteralParameters`. Asserting on the bound value proves
|
|
242
|
+
* two things at once — the comparison is case-folded (the value was
|
|
243
|
+
* lowercased on the way in), and the identifier is parameterized
|
|
244
|
+
* rather than interpolated into the SQL.
|
|
245
|
+
*/
|
|
246
|
+
expect(identifierClause?.type).toBe("raw");
|
|
247
|
+
|
|
248
|
+
expect(
|
|
249
|
+
Object.values(identifierClause?.objectLiteralParameters || {}),
|
|
250
|
+
).toEqual([["prod-01"]]);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("scopes every lookup to the monitor's project", async () => {
|
|
254
|
+
stubService("host", HostService, [{ _id: "host-1" }]);
|
|
255
|
+
|
|
256
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
257
|
+
monitor: monitorWith(MonitorType.Host, {
|
|
258
|
+
hostMonitor: { hostIdentifier: "prod-01" },
|
|
259
|
+
}),
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
expect(capturedQueries.length).toBeGreaterThan(0);
|
|
263
|
+
|
|
264
|
+
for (const entry of capturedQueries) {
|
|
265
|
+
expect(String(entry.query["projectId"])).toBe(PROJECT_ID.toString());
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test("costs zero round-trips when the monitor names no resource", async () => {
|
|
270
|
+
const resolved: SeriesResolvedResourceIds =
|
|
271
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
272
|
+
monitor: monitorWith(MonitorType.Website, {}),
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
expect(resolved).toEqual(MonitorResourceContextUtil.emptyContext());
|
|
276
|
+
expect(capturedQueries).toHaveLength(0);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
test("returns empty without a lookup when the monitor has no project", async () => {
|
|
280
|
+
const model: Monitor = monitorWith(
|
|
281
|
+
MonitorType.Host,
|
|
282
|
+
{ hostMonitor: { hostIdentifier: "prod-01" } },
|
|
283
|
+
{ projectId: undefined },
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
const resolved: SeriesResolvedResourceIds =
|
|
287
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
288
|
+
monitor: model,
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
expect(resolved).toEqual(MonitorResourceContextUtil.emptyContext());
|
|
292
|
+
expect(capturedQueries).toHaveLength(0);
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
test("returns empty instead of throwing when a lookup fails", async () => {
|
|
296
|
+
/*
|
|
297
|
+
* This runs inside the probe / telemetry queue workers. A throw here
|
|
298
|
+
* would fail the whole job and retry forever, so a lookup failure
|
|
299
|
+
* must degrade to "no resources linked", never block creation.
|
|
300
|
+
*/
|
|
301
|
+
jest
|
|
302
|
+
.spyOn(SeriesResourceLinker, "resolveResourceRefs")
|
|
303
|
+
.mockRejectedValue(new Error("database is down"));
|
|
304
|
+
|
|
305
|
+
const resolved: SeriesResolvedResourceIds =
|
|
306
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
307
|
+
monitor: monitorWith(MonitorType.Host, {
|
|
308
|
+
hostMonitor: { hostIdentifier: "prod-01" },
|
|
309
|
+
}),
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
expect(resolved).toEqual(MonitorResourceContextUtil.emptyContext());
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
test("links nothing when the named resource is in another project", async () => {
|
|
316
|
+
// The project-scoped query simply returns no row.
|
|
317
|
+
stubService("host", HostService, []);
|
|
318
|
+
|
|
319
|
+
const resolved: SeriesResolvedResourceIds =
|
|
320
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
321
|
+
monitor: monitorWith(MonitorType.Host, {
|
|
322
|
+
hostMonitor: { hostIdentifier: "someone-elses-host" },
|
|
323
|
+
}),
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
expect(resolved.hostIds).toEqual([]);
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
test("a docker monitor resolves a DockerHost and never a Host", async () => {
|
|
330
|
+
stubService("dockerHost", DockerHostService, [{ _id: "docker-1" }]);
|
|
331
|
+
stubService("host", HostService, [{ _id: "host-should-not-be-used" }]);
|
|
332
|
+
|
|
333
|
+
const resolved: SeriesResolvedResourceIds =
|
|
334
|
+
await MonitorResourceContextUtil.resolveResourceContextForMonitor({
|
|
335
|
+
monitor: monitorWith(MonitorType.Docker, {
|
|
336
|
+
dockerMonitor: {
|
|
337
|
+
hostIdentifier: "docker-prod-01",
|
|
338
|
+
metricViewConfig: metricViewConfigWith({
|
|
339
|
+
"resource.host.name": "docker-prod-01",
|
|
340
|
+
}),
|
|
341
|
+
},
|
|
342
|
+
}),
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
expect(resolved.dockerHostIds).toEqual(["docker-1"]);
|
|
346
|
+
expect(resolved.hostIds).toEqual([]);
|
|
347
|
+
expect(HostService.findBy).not.toHaveBeenCalled();
|
|
348
|
+
});
|
|
349
|
+
});
|