@oneuptime/common 12.0.13 → 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/OnCallDutyPolicySchedule.ts +14 -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/Server/API/BaseAPI.ts +79 -14
- 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/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- 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/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- 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 +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -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/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -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/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/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/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/TestingUtils/AuthenticatorApp.ts +248 -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/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/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/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/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -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/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/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/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/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- 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/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/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- 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/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- 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/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- 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/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.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/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.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/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 +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.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/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.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/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.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/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- 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/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/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/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/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/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.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/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/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/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/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.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/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/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/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
|
@@ -50,6 +50,7 @@ jest.mock("../../../../UI/Utils/Project", () => {
|
|
|
50
50
|
import useCustomFieldColumns, {
|
|
51
51
|
CustomFieldColumnsResult,
|
|
52
52
|
} from "../../../../UI/Components/ModelTable/useCustomFieldColumns";
|
|
53
|
+
import ModelListCache from "../../../../UI/Utils/ModelListCache";
|
|
53
54
|
import { CustomFieldDefinition } from "../../../../UI/Components/ModelTable/CustomFieldColumns";
|
|
54
55
|
import BaseModel from "../../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
55
56
|
import IncidentCustomField from "../../../../Models/DatabaseModels/IncidentCustomField";
|
|
@@ -115,6 +116,13 @@ afterEach(() => {
|
|
|
115
116
|
cleanup();
|
|
116
117
|
getListMock.mockReset();
|
|
117
118
|
getCurrentProjectIdMock.mockReset();
|
|
119
|
+
/*
|
|
120
|
+
* The hook now reads through ModelListCache, whose module-level cache and
|
|
121
|
+
* in-flight dedup survive between tests. Every test here uses the same
|
|
122
|
+
* model + project + shape (one key), so without a reset one test's request
|
|
123
|
+
* - resolved or deliberately never-resolving - would be served to the next.
|
|
124
|
+
*/
|
|
125
|
+
ModelListCache.invalidateAll();
|
|
118
126
|
});
|
|
119
127
|
|
|
120
128
|
describe("useCustomFieldColumns — isLoading on the first render", () => {
|
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
import TemplateVariablesCatalog, {
|
|
2
|
+
TemplateVariable,
|
|
3
|
+
TemplateVariableGroup,
|
|
4
|
+
} from "../../../../UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog";
|
|
5
|
+
import MonitorType from "../../../../Types/Monitor/MonitorType";
|
|
6
|
+
import { describe, expect, it } from "@jest/globals";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Title of the monitor-identity group that getVariables always emits first,
|
|
10
|
+
* and the title of the per-series labels group that only infrastructure
|
|
11
|
+
* monitor types emit last. Declared once so the expectations below stay in
|
|
12
|
+
* lockstep with the source strings.
|
|
13
|
+
*/
|
|
14
|
+
const MONITOR_GROUP_TITLE: string = "Monitor";
|
|
15
|
+
const SERIES_GROUP_TITLE: string = "Series Labels (per-host / per-container)";
|
|
16
|
+
const METRIC_GROUP_TITLE: string = "Metric";
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
* The eight infrastructure/telemetry monitor types that (a) get the single
|
|
20
|
+
* "Metric" per-type group AND (b) additionally get the "Series Labels" group.
|
|
21
|
+
* Both lists in the source are identical, so one constant covers both.
|
|
22
|
+
*/
|
|
23
|
+
const INFRA_TYPES: Array<MonitorType> = [
|
|
24
|
+
MonitorType.Metrics,
|
|
25
|
+
MonitorType.Kubernetes,
|
|
26
|
+
MonitorType.Docker,
|
|
27
|
+
MonitorType.Host,
|
|
28
|
+
MonitorType.Podman,
|
|
29
|
+
MonitorType.DockerSwarm,
|
|
30
|
+
MonitorType.Proxmox,
|
|
31
|
+
MonitorType.Ceph,
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* Monitor types that hit the `default` arm of perTypeGroup (returns null) and
|
|
36
|
+
* are NOT in the infrastructure list, so getVariables returns the identity
|
|
37
|
+
* group and nothing else. IoTDevice is the notable trap here: it is a
|
|
38
|
+
* telemetry monitor elsewhere in the codebase but is deliberately absent from
|
|
39
|
+
* both the "Metric" and "Series Labels" branches.
|
|
40
|
+
*/
|
|
41
|
+
const IDENTITY_ONLY_TYPES: Array<MonitorType> = [
|
|
42
|
+
MonitorType.Manual,
|
|
43
|
+
MonitorType.IoTDevice,
|
|
44
|
+
MonitorType.IncomingEmail,
|
|
45
|
+
MonitorType.SQLQuery,
|
|
46
|
+
MonitorType.Logs,
|
|
47
|
+
MonitorType.Traces,
|
|
48
|
+
MonitorType.Exceptions,
|
|
49
|
+
MonitorType.Profiles,
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
interface PerTypeExpectation {
|
|
53
|
+
monitorType: MonitorType;
|
|
54
|
+
title: string;
|
|
55
|
+
keys: Array<string>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Every monitor type that produces a per-type group, with the exact ordered
|
|
60
|
+
* key list the source declares. Verifying the whole list (not just a sample)
|
|
61
|
+
* guards against silent additions/removals and reordering.
|
|
62
|
+
*/
|
|
63
|
+
const PER_TYPE_EXPECTATIONS: Array<PerTypeExpectation> = [
|
|
64
|
+
{
|
|
65
|
+
monitorType: MonitorType.API,
|
|
66
|
+
title: "Response",
|
|
67
|
+
keys: [
|
|
68
|
+
"isOnline",
|
|
69
|
+
"responseStatusCode",
|
|
70
|
+
"responseTimeInMs",
|
|
71
|
+
"responseBody",
|
|
72
|
+
"responseHeaders",
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
monitorType: MonitorType.Website,
|
|
77
|
+
title: "Response",
|
|
78
|
+
keys: [
|
|
79
|
+
"isOnline",
|
|
80
|
+
"responseStatusCode",
|
|
81
|
+
"responseTimeInMs",
|
|
82
|
+
"responseBody",
|
|
83
|
+
"responseHeaders",
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
monitorType: MonitorType.IncomingRequest,
|
|
88
|
+
title: "Incoming Request",
|
|
89
|
+
keys: [
|
|
90
|
+
"requestMethod",
|
|
91
|
+
"requestBody",
|
|
92
|
+
"requestHeaders",
|
|
93
|
+
"incomingRequestReceivedAt",
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
monitorType: MonitorType.Ping,
|
|
98
|
+
title: "Connectivity",
|
|
99
|
+
keys: ["isOnline", "responseTimeInMs", "isTimeout", "failureCause"],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
monitorType: MonitorType.IP,
|
|
103
|
+
title: "Connectivity",
|
|
104
|
+
keys: ["isOnline", "responseTimeInMs", "isTimeout", "failureCause"],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
monitorType: MonitorType.Port,
|
|
108
|
+
title: "Connectivity",
|
|
109
|
+
keys: ["isOnline", "responseTimeInMs", "isTimeout", "failureCause"],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
monitorType: MonitorType.SSLCertificate,
|
|
113
|
+
title: "SSL Certificate",
|
|
114
|
+
keys: [
|
|
115
|
+
"commonName",
|
|
116
|
+
"organization",
|
|
117
|
+
"organizationalUnit",
|
|
118
|
+
"locality",
|
|
119
|
+
"state",
|
|
120
|
+
"country",
|
|
121
|
+
"expiresAt",
|
|
122
|
+
"createdAt",
|
|
123
|
+
"isSelfSigned",
|
|
124
|
+
"serialNumber",
|
|
125
|
+
"fingerprint",
|
|
126
|
+
"fingerprint256",
|
|
127
|
+
"isOnline",
|
|
128
|
+
"failureCause",
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
monitorType: MonitorType.Server,
|
|
133
|
+
title: "Server Metrics",
|
|
134
|
+
keys: [
|
|
135
|
+
"hostname",
|
|
136
|
+
"cpuUsagePercent",
|
|
137
|
+
"cpuCores",
|
|
138
|
+
"memoryUsagePercent",
|
|
139
|
+
"memoryFreePercent",
|
|
140
|
+
"memoryTotalBytes",
|
|
141
|
+
"diskMetrics",
|
|
142
|
+
"processes",
|
|
143
|
+
"requestReceivedAt",
|
|
144
|
+
"failureCause",
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
monitorType: MonitorType.CustomJavaScriptCode,
|
|
149
|
+
title: "Custom Code",
|
|
150
|
+
keys: [
|
|
151
|
+
"result",
|
|
152
|
+
"executionTimeInMs",
|
|
153
|
+
"scriptError",
|
|
154
|
+
"logMessages",
|
|
155
|
+
"failureCause",
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
monitorType: MonitorType.SyntheticMonitor,
|
|
160
|
+
title: "Synthetic Monitor",
|
|
161
|
+
keys: ["syntheticResponses", "failureCause"],
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
monitorType: MonitorType.NetworkDevice,
|
|
165
|
+
title: "Network Device (SNMP)",
|
|
166
|
+
keys: [
|
|
167
|
+
"isOnline",
|
|
168
|
+
"responseTimeInMs",
|
|
169
|
+
"isTimeout",
|
|
170
|
+
"failureCause",
|
|
171
|
+
"oidResponses",
|
|
172
|
+
"sysName",
|
|
173
|
+
"sysDescr",
|
|
174
|
+
"sysObjectId",
|
|
175
|
+
"sysLocation",
|
|
176
|
+
"downInterfaces",
|
|
177
|
+
"interfacesTotal",
|
|
178
|
+
"interfacesUp",
|
|
179
|
+
"interfacesDown",
|
|
180
|
+
"interfaceWalkFailure",
|
|
181
|
+
"trapOid",
|
|
182
|
+
"trapSourceIp",
|
|
183
|
+
"trapVarbinds",
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
monitorType: MonitorType.DNS,
|
|
188
|
+
title: "DNS",
|
|
189
|
+
keys: [
|
|
190
|
+
"isOnline",
|
|
191
|
+
"responseTimeInMs",
|
|
192
|
+
"isTimeout",
|
|
193
|
+
"isDnssecValid",
|
|
194
|
+
"failureCause",
|
|
195
|
+
"records",
|
|
196
|
+
"recordValues",
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
monitorType: MonitorType.Domain,
|
|
201
|
+
title: "Domain",
|
|
202
|
+
keys: [
|
|
203
|
+
"isOnline",
|
|
204
|
+
"domainName",
|
|
205
|
+
"lookupMethod",
|
|
206
|
+
"registrar",
|
|
207
|
+
"createdDate",
|
|
208
|
+
"updatedDate",
|
|
209
|
+
"expiresDate",
|
|
210
|
+
"nameServers",
|
|
211
|
+
"domainStatus",
|
|
212
|
+
"dnssec",
|
|
213
|
+
"responseTimeInMs",
|
|
214
|
+
"failureCause",
|
|
215
|
+
],
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
monitorType: MonitorType.DNSSEC,
|
|
219
|
+
title: "DNSSEC",
|
|
220
|
+
keys: [
|
|
221
|
+
"isOnline",
|
|
222
|
+
"domainName",
|
|
223
|
+
"isZoneSigned",
|
|
224
|
+
"isParentDsPresent",
|
|
225
|
+
"isChainValid",
|
|
226
|
+
"resolverConsensusAd",
|
|
227
|
+
"isNameserverConsistent",
|
|
228
|
+
"earliestSignatureExpiration",
|
|
229
|
+
"daysUntilSignatureExpiry",
|
|
230
|
+
"dnskeyCount",
|
|
231
|
+
"dsRecordCount",
|
|
232
|
+
"rrsigCount",
|
|
233
|
+
"responseTimeInMs",
|
|
234
|
+
"failureCause",
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
monitorType: MonitorType.ExternalStatusPage,
|
|
239
|
+
title: "External Status Page",
|
|
240
|
+
keys: [
|
|
241
|
+
"overallStatus",
|
|
242
|
+
"activeIncidentCount",
|
|
243
|
+
"componentStatuses",
|
|
244
|
+
"provider",
|
|
245
|
+
"componentGroup",
|
|
246
|
+
"componentName",
|
|
247
|
+
"isOnline",
|
|
248
|
+
"responseTimeInMs",
|
|
249
|
+
"failureCause",
|
|
250
|
+
],
|
|
251
|
+
},
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
/*
|
|
255
|
+
* Small helpers so each `it` stays about a single behaviour. These are plain
|
|
256
|
+
* function declarations (not arrow consts) to keep the typedef rule happy
|
|
257
|
+
* without annotating the variable itself.
|
|
258
|
+
*/
|
|
259
|
+
function keysOf(group: TemplateVariableGroup): Array<string> {
|
|
260
|
+
return group.variables.map((variable: TemplateVariable): string => {
|
|
261
|
+
return variable.key;
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function titlesOf(groups: Array<TemplateVariableGroup>): Array<string> {
|
|
266
|
+
return groups.map((group: TemplateVariableGroup): string => {
|
|
267
|
+
return group.title;
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function findGroup(
|
|
272
|
+
groups: Array<TemplateVariableGroup>,
|
|
273
|
+
title: string,
|
|
274
|
+
): TemplateVariableGroup | undefined {
|
|
275
|
+
return groups.find((group: TemplateVariableGroup): boolean => {
|
|
276
|
+
return group.title === title;
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
describe("TemplateVariablesCatalog.getVariables - monitor identity group", () => {
|
|
281
|
+
it("always emits the identity group first, for every monitor type in the enum", () => {
|
|
282
|
+
const allTypes: Array<MonitorType> = Object.values(
|
|
283
|
+
MonitorType,
|
|
284
|
+
) as Array<MonitorType>;
|
|
285
|
+
|
|
286
|
+
for (const monitorType of allTypes) {
|
|
287
|
+
const groups: Array<TemplateVariableGroup> =
|
|
288
|
+
TemplateVariablesCatalog.getVariables({ monitorType });
|
|
289
|
+
|
|
290
|
+
expect(groups.length).toBeGreaterThanOrEqual(1);
|
|
291
|
+
expect(groups[0]?.title).toBe(MONITOR_GROUP_TITLE);
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it("exposes exactly monitorName and monitorId with their example values", () => {
|
|
296
|
+
const groups: Array<TemplateVariableGroup> =
|
|
297
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.API });
|
|
298
|
+
|
|
299
|
+
const identity: TemplateVariableGroup | undefined = findGroup(
|
|
300
|
+
groups,
|
|
301
|
+
MONITOR_GROUP_TITLE,
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
expect(identity).toBeDefined();
|
|
305
|
+
expect(keysOf(identity as TemplateVariableGroup)).toEqual([
|
|
306
|
+
"monitorName",
|
|
307
|
+
"monitorId",
|
|
308
|
+
]);
|
|
309
|
+
expect(identity?.variables[0]?.example).toBe("Production API");
|
|
310
|
+
expect(identity?.variables[1]?.example).toBe(
|
|
311
|
+
"a0f78958-da0a-4775-9fd9-c9fc63d3456f",
|
|
312
|
+
);
|
|
313
|
+
expect(identity?.description).toContain("Identity of the monitor");
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
describe("TemplateVariablesCatalog.getVariables - per-type groups", () => {
|
|
318
|
+
for (const expectation of PER_TYPE_EXPECTATIONS) {
|
|
319
|
+
it(`emits the "${expectation.title}" group with the expected keys for ${expectation.monitorType}`, () => {
|
|
320
|
+
const groups: Array<TemplateVariableGroup> =
|
|
321
|
+
TemplateVariablesCatalog.getVariables({
|
|
322
|
+
monitorType: expectation.monitorType,
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
const perType: TemplateVariableGroup | undefined = findGroup(
|
|
326
|
+
groups,
|
|
327
|
+
expectation.title,
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
expect(perType).toBeDefined();
|
|
331
|
+
expect(keysOf(perType as TemplateVariableGroup)).toEqual(
|
|
332
|
+
expectation.keys,
|
|
333
|
+
);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
it("orders the identity group before the per-type group", () => {
|
|
338
|
+
const groups: Array<TemplateVariableGroup> =
|
|
339
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.DNS });
|
|
340
|
+
|
|
341
|
+
expect(titlesOf(groups)).toEqual([MONITOR_GROUP_TITLE, "DNS"]);
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it("treats API and Website as the same case (identical Response group)", () => {
|
|
345
|
+
const apiGroups: Array<TemplateVariableGroup> =
|
|
346
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.API });
|
|
347
|
+
const websiteGroups: Array<TemplateVariableGroup> =
|
|
348
|
+
TemplateVariablesCatalog.getVariables({
|
|
349
|
+
monitorType: MonitorType.Website,
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
expect(findGroup(apiGroups, "Response")).toEqual(
|
|
353
|
+
findGroup(websiteGroups, "Response"),
|
|
354
|
+
);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it("treats Ping, IP and Port as the same Connectivity case", () => {
|
|
358
|
+
const pingResponse: TemplateVariableGroup | undefined = findGroup(
|
|
359
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.Ping }),
|
|
360
|
+
"Connectivity",
|
|
361
|
+
);
|
|
362
|
+
const ipResponse: TemplateVariableGroup | undefined = findGroup(
|
|
363
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.IP }),
|
|
364
|
+
"Connectivity",
|
|
365
|
+
);
|
|
366
|
+
const portResponse: TemplateVariableGroup | undefined = findGroup(
|
|
367
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.Port }),
|
|
368
|
+
"Connectivity",
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
expect(pingResponse).toEqual(ipResponse);
|
|
372
|
+
expect(ipResponse).toEqual(portResponse);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it("gives the Response group a description while the Incoming Request group has none", () => {
|
|
376
|
+
const responseGroup: TemplateVariableGroup | undefined = findGroup(
|
|
377
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.API }),
|
|
378
|
+
"Response",
|
|
379
|
+
);
|
|
380
|
+
const incomingGroup: TemplateVariableGroup | undefined = findGroup(
|
|
381
|
+
TemplateVariablesCatalog.getVariables({
|
|
382
|
+
monitorType: MonitorType.IncomingRequest,
|
|
383
|
+
}),
|
|
384
|
+
"Incoming Request",
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
expect(responseGroup?.description).toBeDefined();
|
|
388
|
+
expect(responseGroup?.description?.length).toBeGreaterThan(0);
|
|
389
|
+
expect(incomingGroup?.description).toBeUndefined();
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it("leaves responseHeaders without an example while responseBody has one", () => {
|
|
393
|
+
const responseGroup: TemplateVariableGroup | undefined = findGroup(
|
|
394
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.API }),
|
|
395
|
+
"Response",
|
|
396
|
+
);
|
|
397
|
+
|
|
398
|
+
const responseHeaders: TemplateVariable | undefined =
|
|
399
|
+
responseGroup?.variables.find((variable: TemplateVariable): boolean => {
|
|
400
|
+
return variable.key === "responseHeaders";
|
|
401
|
+
});
|
|
402
|
+
const responseBody: TemplateVariable | undefined =
|
|
403
|
+
responseGroup?.variables.find((variable: TemplateVariable): boolean => {
|
|
404
|
+
return variable.key === "responseBody";
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
expect(responseHeaders?.example).toBeUndefined();
|
|
408
|
+
expect(responseBody?.example).toBe('{"status":"degraded"}');
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it("includes SNMP trap and interface variables for a Network Device monitor", () => {
|
|
412
|
+
const snmpGroup: TemplateVariableGroup | undefined = findGroup(
|
|
413
|
+
TemplateVariablesCatalog.getVariables({
|
|
414
|
+
monitorType: MonitorType.NetworkDevice,
|
|
415
|
+
}),
|
|
416
|
+
"Network Device (SNMP)",
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
const keys: Array<string> = keysOf(snmpGroup as TemplateVariableGroup);
|
|
420
|
+
|
|
421
|
+
expect(keys).toEqual(expect.arrayContaining(["trapOid", "trapVarbinds"]));
|
|
422
|
+
expect(keys).toEqual(
|
|
423
|
+
expect.arrayContaining(["interfacesUp", "interfacesDown"]),
|
|
424
|
+
);
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
describe("TemplateVariablesCatalog.getVariables - identity-only monitor types", () => {
|
|
429
|
+
for (const monitorType of IDENTITY_ONLY_TYPES) {
|
|
430
|
+
it(`returns only the identity group for ${monitorType} (default branch, no series labels)`, () => {
|
|
431
|
+
const groups: Array<TemplateVariableGroup> =
|
|
432
|
+
TemplateVariablesCatalog.getVariables({ monitorType });
|
|
433
|
+
|
|
434
|
+
expect(groups.length).toBe(1);
|
|
435
|
+
expect(titlesOf(groups)).toEqual([MONITOR_GROUP_TITLE]);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
it("does not emit a series-labels group for IoTDevice even when attribute keys are supplied", () => {
|
|
440
|
+
const groups: Array<TemplateVariableGroup> =
|
|
441
|
+
TemplateVariablesCatalog.getVariables({
|
|
442
|
+
monitorType: MonitorType.IoTDevice,
|
|
443
|
+
seriesAttributeKeys: ["host.name"],
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
expect(findGroup(groups, SERIES_GROUP_TITLE)).toBeUndefined();
|
|
447
|
+
expect(groups.length).toBe(1);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
describe("TemplateVariablesCatalog.getVariables - infrastructure series labels", () => {
|
|
452
|
+
for (const monitorType of INFRA_TYPES) {
|
|
453
|
+
it(`emits identity, Metric and series-labels groups in order for ${monitorType}`, () => {
|
|
454
|
+
const groups: Array<TemplateVariableGroup> =
|
|
455
|
+
TemplateVariablesCatalog.getVariables({
|
|
456
|
+
monitorType,
|
|
457
|
+
seriesAttributeKeys: ["region"],
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
expect(titlesOf(groups)).toEqual([
|
|
461
|
+
MONITOR_GROUP_TITLE,
|
|
462
|
+
METRIC_GROUP_TITLE,
|
|
463
|
+
SERIES_GROUP_TITLE,
|
|
464
|
+
]);
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
it("exposes the single metricName variable in the Metric group", () => {
|
|
469
|
+
const metricGroup: TemplateVariableGroup | undefined = findGroup(
|
|
470
|
+
TemplateVariablesCatalog.getVariables({
|
|
471
|
+
monitorType: MonitorType.Metrics,
|
|
472
|
+
}),
|
|
473
|
+
METRIC_GROUP_TITLE,
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
expect(keysOf(metricGroup as TemplateVariableGroup)).toEqual([
|
|
477
|
+
"metricName",
|
|
478
|
+
]);
|
|
479
|
+
expect(metricGroup?.variables[0]?.example).toBe("container.cpu.time");
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
it("returns an empty series group with the 'Group By' guidance when no attribute keys are given", () => {
|
|
483
|
+
const groups: Array<TemplateVariableGroup> =
|
|
484
|
+
TemplateVariablesCatalog.getVariables({
|
|
485
|
+
monitorType: MonitorType.Kubernetes,
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
const seriesGroup: TemplateVariableGroup | undefined = findGroup(
|
|
489
|
+
groups,
|
|
490
|
+
SERIES_GROUP_TITLE,
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
expect(seriesGroup).toBeDefined();
|
|
494
|
+
expect(seriesGroup?.variables).toEqual([]);
|
|
495
|
+
expect(seriesGroup?.description).toContain("Group By");
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
it("treats an explicit empty array the same as omitting the keys", () => {
|
|
499
|
+
const omitted: TemplateVariableGroup | undefined = findGroup(
|
|
500
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.Host }),
|
|
501
|
+
SERIES_GROUP_TITLE,
|
|
502
|
+
);
|
|
503
|
+
const emptyArray: TemplateVariableGroup | undefined = findGroup(
|
|
504
|
+
TemplateVariablesCatalog.getVariables({
|
|
505
|
+
monitorType: MonitorType.Host,
|
|
506
|
+
seriesAttributeKeys: [],
|
|
507
|
+
}),
|
|
508
|
+
SERIES_GROUP_TITLE,
|
|
509
|
+
);
|
|
510
|
+
|
|
511
|
+
expect(emptyArray).toEqual(omitted);
|
|
512
|
+
expect(emptyArray?.variables).toEqual([]);
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
it("maps each attribute key to a variable, preserving order and count", () => {
|
|
516
|
+
const seriesGroup: TemplateVariableGroup | undefined = findGroup(
|
|
517
|
+
TemplateVariablesCatalog.getVariables({
|
|
518
|
+
monitorType: MonitorType.Docker,
|
|
519
|
+
seriesAttributeKeys: ["region", "host.name", "az"],
|
|
520
|
+
}),
|
|
521
|
+
SERIES_GROUP_TITLE,
|
|
522
|
+
);
|
|
523
|
+
|
|
524
|
+
expect(keysOf(seriesGroup as TemplateVariableGroup)).toEqual([
|
|
525
|
+
"region",
|
|
526
|
+
"host.name",
|
|
527
|
+
"az",
|
|
528
|
+
]);
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
it("preserves duplicate attribute keys as separate variables (no dedupe)", () => {
|
|
532
|
+
const seriesGroup: TemplateVariableGroup | undefined = findGroup(
|
|
533
|
+
TemplateVariablesCatalog.getVariables({
|
|
534
|
+
monitorType: MonitorType.Ceph,
|
|
535
|
+
seriesAttributeKeys: ["host.name", "host.name"],
|
|
536
|
+
}),
|
|
537
|
+
SERIES_GROUP_TITLE,
|
|
538
|
+
);
|
|
539
|
+
|
|
540
|
+
expect(seriesGroup?.variables.length).toBe(2);
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
it("wraps each attribute key in backticks inside its description", () => {
|
|
544
|
+
const seriesGroup: TemplateVariableGroup | undefined = findGroup(
|
|
545
|
+
TemplateVariablesCatalog.getVariables({
|
|
546
|
+
monitorType: MonitorType.Proxmox,
|
|
547
|
+
seriesAttributeKeys: ["region"],
|
|
548
|
+
}),
|
|
549
|
+
SERIES_GROUP_TITLE,
|
|
550
|
+
);
|
|
551
|
+
|
|
552
|
+
expect(seriesGroup?.variables[0]?.description).toBe(
|
|
553
|
+
"Value of `region` for the series that breached the threshold.",
|
|
554
|
+
);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
it("uses the curated example for host.name, container name, and undefined otherwise", () => {
|
|
558
|
+
const seriesGroup: TemplateVariableGroup | undefined = findGroup(
|
|
559
|
+
TemplateVariablesCatalog.getVariables({
|
|
560
|
+
monitorType: MonitorType.Metrics,
|
|
561
|
+
seriesAttributeKeys: [
|
|
562
|
+
"host.name",
|
|
563
|
+
"resource.k8s.container.name",
|
|
564
|
+
"region",
|
|
565
|
+
],
|
|
566
|
+
}),
|
|
567
|
+
SERIES_GROUP_TITLE,
|
|
568
|
+
);
|
|
569
|
+
|
|
570
|
+
expect(seriesGroup?.variables[0]?.example).toBe("prod-db-01");
|
|
571
|
+
expect(seriesGroup?.variables[1]?.example).toBe("mariadb");
|
|
572
|
+
expect(seriesGroup?.variables[2]?.example).toBeUndefined();
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
it("swaps the description to the per-series wording once keys exist", () => {
|
|
576
|
+
const seriesGroup: TemplateVariableGroup | undefined = findGroup(
|
|
577
|
+
TemplateVariablesCatalog.getVariables({
|
|
578
|
+
monitorType: MonitorType.DockerSwarm,
|
|
579
|
+
seriesAttributeKeys: ["host.name"],
|
|
580
|
+
}),
|
|
581
|
+
SERIES_GROUP_TITLE,
|
|
582
|
+
);
|
|
583
|
+
|
|
584
|
+
expect(seriesGroup?.description).toContain(
|
|
585
|
+
"One incident fires per unique combination",
|
|
586
|
+
);
|
|
587
|
+
expect(seriesGroup?.description).not.toContain("Group By");
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
describe("TemplateVariablesCatalog.getVariables - non-infra types ignore series keys", () => {
|
|
592
|
+
it("does not add a series group for an API monitor even with attribute keys", () => {
|
|
593
|
+
const groups: Array<TemplateVariableGroup> =
|
|
594
|
+
TemplateVariablesCatalog.getVariables({
|
|
595
|
+
monitorType: MonitorType.API,
|
|
596
|
+
seriesAttributeKeys: ["host.name", "region"],
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
expect(findGroup(groups, SERIES_GROUP_TITLE)).toBeUndefined();
|
|
600
|
+
expect(titlesOf(groups)).toEqual([MONITOR_GROUP_TITLE, "Response"]);
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
describe("TemplateVariablesCatalog.getVariables - structural invariants", () => {
|
|
605
|
+
const allTypes: Array<MonitorType> = Object.values(
|
|
606
|
+
MonitorType,
|
|
607
|
+
) as Array<MonitorType>;
|
|
608
|
+
|
|
609
|
+
it("returns between one and three groups for every monitor type", () => {
|
|
610
|
+
for (const monitorType of allTypes) {
|
|
611
|
+
const groups: Array<TemplateVariableGroup> =
|
|
612
|
+
TemplateVariablesCatalog.getVariables({
|
|
613
|
+
monitorType,
|
|
614
|
+
seriesAttributeKeys: ["host.name"],
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
expect(groups.length).toBeGreaterThanOrEqual(1);
|
|
618
|
+
expect(groups.length).toBeLessThanOrEqual(3);
|
|
619
|
+
}
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
it("gives every variable a non-empty key and description, with example being a string or undefined", () => {
|
|
623
|
+
for (const monitorType of allTypes) {
|
|
624
|
+
const groups: Array<TemplateVariableGroup> =
|
|
625
|
+
TemplateVariablesCatalog.getVariables({
|
|
626
|
+
monitorType,
|
|
627
|
+
seriesAttributeKeys: ["host.name", "region"],
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
for (const group of groups) {
|
|
631
|
+
expect(group.title.length).toBeGreaterThan(0);
|
|
632
|
+
|
|
633
|
+
for (const variable of group.variables) {
|
|
634
|
+
expect(typeof variable.key).toBe("string");
|
|
635
|
+
expect(variable.key.length).toBeGreaterThan(0);
|
|
636
|
+
expect(typeof variable.description).toBe("string");
|
|
637
|
+
expect(variable.description.length).toBeGreaterThan(0);
|
|
638
|
+
|
|
639
|
+
if (variable.example !== undefined) {
|
|
640
|
+
expect(typeof variable.example).toBe("string");
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
it("keeps variable keys unique within every non-series group", () => {
|
|
648
|
+
for (const monitorType of allTypes) {
|
|
649
|
+
const groups: Array<TemplateVariableGroup> =
|
|
650
|
+
TemplateVariablesCatalog.getVariables({ monitorType });
|
|
651
|
+
|
|
652
|
+
for (const group of groups) {
|
|
653
|
+
if (group.title === SERIES_GROUP_TITLE) {
|
|
654
|
+
continue;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
const keys: Array<string> = keysOf(group);
|
|
658
|
+
const uniqueKeys: Set<string> = new Set<string>(keys);
|
|
659
|
+
expect(uniqueKeys.size).toBe(keys.length);
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
|
|
665
|
+
describe("TemplateVariablesCatalog.getVariables - determinism and isolation", () => {
|
|
666
|
+
it("returns deeply equal output across repeated calls with the same input", () => {
|
|
667
|
+
const first: Array<TemplateVariableGroup> =
|
|
668
|
+
TemplateVariablesCatalog.getVariables({
|
|
669
|
+
monitorType: MonitorType.Kubernetes,
|
|
670
|
+
seriesAttributeKeys: ["host.name", "region"],
|
|
671
|
+
});
|
|
672
|
+
const second: Array<TemplateVariableGroup> =
|
|
673
|
+
TemplateVariablesCatalog.getVariables({
|
|
674
|
+
monitorType: MonitorType.Kubernetes,
|
|
675
|
+
seriesAttributeKeys: ["host.name", "region"],
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
expect(first).toEqual(second);
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
it("hands back a fresh array instance each call (no shared mutable state)", () => {
|
|
682
|
+
const first: Array<TemplateVariableGroup> =
|
|
683
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.DNS });
|
|
684
|
+
const second: Array<TemplateVariableGroup> =
|
|
685
|
+
TemplateVariablesCatalog.getVariables({ monitorType: MonitorType.DNS });
|
|
686
|
+
|
|
687
|
+
expect(first).not.toBe(second);
|
|
688
|
+
|
|
689
|
+
first.push({ title: "Injected", variables: [] });
|
|
690
|
+
expect(titlesOf(second)).not.toContain("Injected");
|
|
691
|
+
});
|
|
692
|
+
});
|