@oneuptime/common 12.0.31 → 12.0.33
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/AnalyticsModels/Span.ts +14 -0
- package/Models/DatabaseModels/AlertState.ts +0 -2
- package/Models/DatabaseModels/Domain.ts +1 -1
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Incident.ts +1 -1
- package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
- package/Models/DatabaseModels/Index.ts +12 -0
- package/Models/DatabaseModels/MetricType.ts +0 -2
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
- package/Models/DatabaseModels/MonitorTest.ts +0 -2
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +297 -3
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +3 -1
- package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
- package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
- package/Models/DatabaseModels/StatusPageResource.ts +0 -2
- package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/DatabaseService.ts +39 -9
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +12 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceRoleService.ts +90 -0
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +186 -44
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -31
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +158 -27
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +626 -0
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +115 -41
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +145 -3
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/BasicCron.test.ts +283 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +256 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
- package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
- package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
- package/Tests/Utils/Slug.test.ts +61 -1
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Tests/jest.setup.ts +19 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +135 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +14 -0
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/ModelTable/BaseModelTable.tsx +50 -15
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/Navbar/NavBar.tsx +62 -13
- package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
- package/UI/Components/SideMenu/SideMenu.tsx +135 -7
- package/UI/Components/SideMenu/SideMenuItem.tsx +80 -85
- package/UI/Components/SideMenu/SideMenuSection.tsx +69 -25
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +139 -36
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
- package/Utils/Slug.ts +34 -1
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
- package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +12 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
- package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +304 -4
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +3 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +31 -5
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +12 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
- package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +131 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -21
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.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/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +120 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +7 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +39 -13
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +76 -11
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +50 -54
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +32 -9
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +75 -35
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
- package/build/dist/Utils/Slug.js +31 -1
- package/build/dist/Utils/Slug.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
3
|
+
import { OnCreate } from "../Types/Database/Hooks";
|
|
4
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
5
|
+
import Model from "../../Models/DatabaseModels/UserNotificationEmailRollupSetting";
|
|
6
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
7
|
+
import ObjectID from "../../Types/ObjectID";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* The escape hatch from owner-email burst rollup, one row per (user, project).
|
|
11
|
+
*
|
|
12
|
+
* The read below is the ONLY place the preference is consulted, and it is
|
|
13
|
+
* deliberately not cached. A cache would mean a person who has just clicked
|
|
14
|
+
* "send me every email immediately" keeps getting batched mail for the length
|
|
15
|
+
* of the TTL - which is precisely the complaint the toggle exists to answer,
|
|
16
|
+
* reproduced by the mechanism meant to serve it. The query is a single indexed
|
|
17
|
+
* row on a table with at most one row per project member, on a path that
|
|
18
|
+
* already runs a dozen queries, and the write path only reaches it when it is
|
|
19
|
+
* about to DEFER - never on the common below-the-threshold send.
|
|
20
|
+
*/
|
|
21
|
+
export class Service extends DatabaseService<Model> {
|
|
22
|
+
public constructor() {
|
|
23
|
+
super(Model);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
* True when this person's owner notification emails may be coalesced.
|
|
28
|
+
*
|
|
29
|
+
* Absent row means enabled. Rollup ships on by default with no backfill, so
|
|
30
|
+
* almost nobody has a row here; treating "no row" as anything other than the
|
|
31
|
+
* default would make the feature depend on data that does not exist.
|
|
32
|
+
*
|
|
33
|
+
* This does NOT swallow errors. The one caller reads it inside the write
|
|
34
|
+
* path's fail-open catch, which turns any failure into an immediate send -
|
|
35
|
+
* the same direction this method's `false` means, and the same direction
|
|
36
|
+
* every other failure in that path takes.
|
|
37
|
+
*/
|
|
38
|
+
@CaptureSpan()
|
|
39
|
+
public async isRollupEnabledForUser(data: {
|
|
40
|
+
userId: ObjectID;
|
|
41
|
+
projectId: ObjectID;
|
|
42
|
+
}): Promise<boolean> {
|
|
43
|
+
const setting: Model | null = await this.findOneBy({
|
|
44
|
+
query: {
|
|
45
|
+
userId: data.userId,
|
|
46
|
+
projectId: data.projectId,
|
|
47
|
+
},
|
|
48
|
+
select: {
|
|
49
|
+
isEnabled: true,
|
|
50
|
+
},
|
|
51
|
+
props: {
|
|
52
|
+
isRoot: true,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
if (!setting) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* Only an explicit false opts out. A row whose isEnabled somehow arrived
|
|
62
|
+
* NULL - a hand-written insert, a column added ahead of its default - is
|
|
63
|
+
* not an opt-out, because opting somebody out of individual emails is the
|
|
64
|
+
* change that needs to have been asked for.
|
|
65
|
+
*/
|
|
66
|
+
return setting.isEnabled !== false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@CaptureSpan()
|
|
70
|
+
protected override async onBeforeCreate(
|
|
71
|
+
createBy: CreateBy<Model>,
|
|
72
|
+
): Promise<OnCreate<Model>> {
|
|
73
|
+
if (!createBy.data.projectId) {
|
|
74
|
+
throw new BadDataException("projectId is required");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!createBy.data.userId) {
|
|
78
|
+
throw new BadDataException("userId is required");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* One row per person per project. The page creates lazily on the first
|
|
83
|
+
* toggle, so a double click or two open tabs would otherwise leave two
|
|
84
|
+
* rows and make findOneBy's answer depend on which one it happened to
|
|
85
|
+
* pick. There is no unique index behind this check - the same
|
|
86
|
+
* check-then-create shape UserNotificationSettingService.onBeforeCreate
|
|
87
|
+
* already uses - so it narrows the window rather than closing it; the read
|
|
88
|
+
* above tolerates a duplicate because both rows say the same thing in
|
|
89
|
+
* every flow the UI can produce.
|
|
90
|
+
*/
|
|
91
|
+
const existingCount: number = (
|
|
92
|
+
await this.countBy({
|
|
93
|
+
query: {
|
|
94
|
+
projectId: createBy.data.projectId,
|
|
95
|
+
userId: createBy.data.userId,
|
|
96
|
+
},
|
|
97
|
+
props: {
|
|
98
|
+
isRoot: true,
|
|
99
|
+
},
|
|
100
|
+
})
|
|
101
|
+
).toNumber();
|
|
102
|
+
|
|
103
|
+
if (existingCount > 0) {
|
|
104
|
+
throw new BadDataException(
|
|
105
|
+
"An email rollup setting already exists for this user in this project.",
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return { createBy, carryForward: null };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export default new Service();
|
|
@@ -3,7 +3,6 @@ import { OnCreate } from "../Types/Database/Hooks";
|
|
|
3
3
|
import logger from "../Utils/Logger";
|
|
4
4
|
import CallService from "./CallService";
|
|
5
5
|
import DatabaseService from "./DatabaseService";
|
|
6
|
-
import MailService from "./MailService";
|
|
7
6
|
import ProjectCallSMSConfigService from "./ProjectCallSMSConfigService";
|
|
8
7
|
import SmsService from "./SmsService";
|
|
9
8
|
import TeamMemberService from "./TeamMemberService";
|
|
@@ -51,6 +50,7 @@ import {
|
|
|
51
50
|
WorkspaceMessageBlock,
|
|
52
51
|
WorkspacePayloadMarkdown,
|
|
53
52
|
} from "../../Types/Workspace/WorkspaceMessagePayload";
|
|
53
|
+
import EmailRollupWriter from "../Utils/EmailRollup/EmailRollupWriter";
|
|
54
54
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
55
55
|
import { appendRecipientToWhatsAppMessage } from "../Utils/WhatsAppTemplateUtil";
|
|
56
56
|
|
|
@@ -76,6 +76,16 @@ export class Service extends DatabaseService<UserNotificationSetting> {
|
|
|
76
76
|
*/
|
|
77
77
|
whatsAppMessage?: WhatsAppMessagePayload | undefined;
|
|
78
78
|
telegramMessage?: TelegramMessagePayload | undefined;
|
|
79
|
+
/*
|
|
80
|
+
* Bypasses burst coalescing for this send, before any rollup bookkeeping
|
|
81
|
+
* runs. Some producers reuse another family's event type: the SLA-breach
|
|
82
|
+
* job at App/FeatureSet/Workers/Jobs/IncidentSla/CheckSlaBreaches.ts sends
|
|
83
|
+
* under EmailTemplateType.IncidentOwnerResourceCreated at :265 and reuses
|
|
84
|
+
* SEND_INCIDENT_CREATED_OWNER_NOTIFICATION at :286, so the event type
|
|
85
|
+
* alone cannot express that this particular message is urgent. Only a
|
|
86
|
+
* caller knows that, so only a caller can say so.
|
|
87
|
+
*/
|
|
88
|
+
forceImmediate?: boolean | undefined;
|
|
79
89
|
incidentId?: ObjectID | undefined;
|
|
80
90
|
alertId?: ObjectID | undefined;
|
|
81
91
|
alertEpisodeId?: ObjectID | undefined;
|
|
@@ -140,33 +150,60 @@ export class Service extends DatabaseService<UserNotificationSetting> {
|
|
|
140
150
|
});
|
|
141
151
|
|
|
142
152
|
for (const userEmail of userEmails) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
153
|
+
/*
|
|
154
|
+
* The one seam where an owner email can be held back. Below the
|
|
155
|
+
* burst threshold this is byte-for-byte the send that was here
|
|
156
|
+
* before - same envelope, same correlation ids, still
|
|
157
|
+
* fire-and-forget inside the writer - and above it the message is
|
|
158
|
+
* queued for a rollup instead of dropped. Awaited, unlike the raw
|
|
159
|
+
* send it replaces, because the queue row has to exist before this
|
|
160
|
+
* method returns; the writer itself never awaits MailService.
|
|
161
|
+
*
|
|
162
|
+
* data.emailEnvelope is passed by reference and is never mutated by
|
|
163
|
+
* the writer, which the Telegram fallback below and the Slack /
|
|
164
|
+
* Microsoft Teams bodies further down depend on: all three
|
|
165
|
+
* synthesise their message from data.emailEnvelope.subject.
|
|
166
|
+
*
|
|
167
|
+
* Guarded even though sendOrRollup is written not to throw. The send
|
|
168
|
+
* it replaces was fire-and-forget, so one bad address could never
|
|
169
|
+
* cost another address its email - let alone cost this notification
|
|
170
|
+
* its SMS, call, push, Telegram, workspace and webhook deliveries
|
|
171
|
+
* further down. Awaiting reintroduces that possibility; this catch
|
|
172
|
+
* takes it back out.
|
|
173
|
+
*/
|
|
174
|
+
try {
|
|
175
|
+
await EmailRollupWriter.sendOrRollup({
|
|
149
176
|
projectId: data.projectId,
|
|
150
|
-
incidentId: data.incidentId,
|
|
151
|
-
alertId: data.alertId,
|
|
152
|
-
alertEpisodeId: data.alertEpisodeId,
|
|
153
|
-
incidentEpisodeId: data.incidentEpisodeId,
|
|
154
|
-
monitorId: data.monitorId,
|
|
155
|
-
scheduledMaintenanceId: data.scheduledMaintenanceId,
|
|
156
|
-
statusPageId: data.statusPageId,
|
|
157
|
-
statusPageAnnouncementId: data.statusPageAnnouncementId,
|
|
158
177
|
userId: data.userId,
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
data.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
178
|
+
toEmail: userEmail.email!,
|
|
179
|
+
eventType: data.eventType,
|
|
180
|
+
emailEnvelope: data.emailEnvelope,
|
|
181
|
+
mailOptions: {
|
|
182
|
+
projectId: data.projectId,
|
|
183
|
+
incidentId: data.incidentId,
|
|
184
|
+
alertId: data.alertId,
|
|
185
|
+
alertEpisodeId: data.alertEpisodeId,
|
|
186
|
+
incidentEpisodeId: data.incidentEpisodeId,
|
|
187
|
+
monitorId: data.monitorId,
|
|
188
|
+
scheduledMaintenanceId: data.scheduledMaintenanceId,
|
|
189
|
+
statusPageId: data.statusPageId,
|
|
190
|
+
statusPageAnnouncementId: data.statusPageAnnouncementId,
|
|
191
|
+
userId: data.userId,
|
|
192
|
+
teamId: data.teamId,
|
|
193
|
+
// OnCall-related fields
|
|
194
|
+
onCallPolicyId: data.onCallPolicyId,
|
|
195
|
+
onCallPolicyEscalationRuleId: data.onCallPolicyEscalationRuleId,
|
|
196
|
+
onCallDutyPolicyExecutionLogTimelineId:
|
|
197
|
+
data.onCallDutyPolicyExecutionLogTimelineId,
|
|
198
|
+
onCallScheduleId: data.onCallScheduleId,
|
|
199
|
+
},
|
|
200
|
+
...(data.forceImmediate !== undefined && {
|
|
201
|
+
forceImmediate: data.forceImmediate,
|
|
202
|
+
}),
|
|
203
|
+
});
|
|
204
|
+
} catch (err) {
|
|
168
205
|
logger.error(err);
|
|
169
|
-
}
|
|
206
|
+
}
|
|
170
207
|
}
|
|
171
208
|
}
|
|
172
209
|
|
|
@@ -800,12 +837,6 @@ export class Service extends DatabaseService<UserNotificationSetting> {
|
|
|
800
837
|
userId: ObjectID,
|
|
801
838
|
projectId: ObjectID,
|
|
802
839
|
): Promise<void> {
|
|
803
|
-
await this.addNotificationSettingIfNotExists(
|
|
804
|
-
userId,
|
|
805
|
-
projectId,
|
|
806
|
-
NotificationSettingEventType.SEND_MONITOR_STATUS_CHANGED_OWNER_NOTIFICATION,
|
|
807
|
-
);
|
|
808
|
-
|
|
809
840
|
await this.addNotificationSettingIfNotExists(
|
|
810
841
|
userId,
|
|
811
842
|
projectId,
|
|
@@ -353,6 +353,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
353
353
|
carryForward = users;
|
|
354
354
|
}
|
|
355
355
|
|
|
356
|
+
if (updateBy.data.email) {
|
|
357
|
+
await this.expirePasswordResetTokensForEmailChange({
|
|
358
|
+
newEmail: updateBy.data.email as Email,
|
|
359
|
+
existingUsers: carryForward,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
|
|
356
363
|
/*
|
|
357
364
|
* There used to be a guard here refusing to set `enableTwoFactorAuth` on
|
|
358
365
|
* an account with no verified authenticator, on the grounds that doing so
|
|
@@ -412,6 +419,94 @@ export class Service extends DatabaseService<Model> {
|
|
|
412
419
|
return { updateBy, carryForward: carryForward };
|
|
413
420
|
}
|
|
414
421
|
|
|
422
|
+
/**
|
|
423
|
+
* Kill any outstanding password-reset link for every account whose email
|
|
424
|
+
* address this update is about to change.
|
|
425
|
+
*
|
|
426
|
+
* A reset link is a bearer credential addressed to ONE mailbox: holding it
|
|
427
|
+
* proves only that somebody could read mail sent to the address the account
|
|
428
|
+
* had when the link was minted. Move the account to a different address and
|
|
429
|
+
* that proof is about a mailbox the account no longer uses, so the link has
|
|
430
|
+
* to die with the address it was sent to.
|
|
431
|
+
*
|
|
432
|
+
* Without this, changing your email is not the account-recovery step that
|
|
433
|
+
* users -- and our own "You have changed your email" mail -- take it to be:
|
|
434
|
+
*
|
|
435
|
+
* 1. An attacker who can read the victim's mailbox requests a password
|
|
436
|
+
* reset and does NOT spend the link. Nothing about the account looks
|
|
437
|
+
* wrong, because nothing has changed yet.
|
|
438
|
+
* 2. The victim notices the mailbox is compromised and moves the account
|
|
439
|
+
* to an address the attacker cannot read. This is exactly the advice
|
|
440
|
+
* they would be given, and they now believe they are safe.
|
|
441
|
+
* 3. The attacker spends the link from step 1. `/reset-password` finds the
|
|
442
|
+
* row BY TOKEN HASH ALONE -- it never looks at the email address -- so
|
|
443
|
+
* it happily sets a new password on the account at its NEW address, and
|
|
444
|
+
* the victim is locked out of an account they had just rescued.
|
|
445
|
+
*
|
|
446
|
+
* Cleared BEFORE the email is written rather than afterwards in
|
|
447
|
+
* `onUpdateSuccess`, so there is no instant in which the new address is
|
|
448
|
+
* committed while a link mailed to the old one is still redeemable. The
|
|
449
|
+
* price of that ordering is that an email update which subsequently fails
|
|
450
|
+
* has still burned a pending link, and the user has to request another one.
|
|
451
|
+
* For a credential that is the right way round.
|
|
452
|
+
*
|
|
453
|
+
* Only rows whose address actually CHANGES are touched. Directory syncs
|
|
454
|
+
* rewrite `email` with the value it already has on every push (see
|
|
455
|
+
* `App/FeatureSet/Identity/API/SCIM.ts`, which updates whenever either the
|
|
456
|
+
* email or the name is present), and clearing on those would let an
|
|
457
|
+
* unrelated SCIM run invalidate a reset link the user is part-way through
|
|
458
|
+
* using.
|
|
459
|
+
*
|
|
460
|
+
* A row that came back with no `email` at all is treated as changed. That
|
|
461
|
+
* happens when the caller could not read the column, and on a credential the
|
|
462
|
+
* safe assumption is the one that expires the token.
|
|
463
|
+
*
|
|
464
|
+
* NOTE: this runs from `onBeforeUpdate`, so an email write made with
|
|
465
|
+
* `ignoreHooks: true` would slip past it. Nothing does that today -- the
|
|
466
|
+
* dashboard, the SCIM endpoints and the admin API all go through the hooks
|
|
467
|
+
* -- and any new caller that writes `email` hook-free has to clear these two
|
|
468
|
+
* columns itself.
|
|
469
|
+
*/
|
|
470
|
+
@CaptureSpan()
|
|
471
|
+
private async expirePasswordResetTokensForEmailChange(data: {
|
|
472
|
+
newEmail: Email;
|
|
473
|
+
existingUsers: Array<Model>;
|
|
474
|
+
}): Promise<void> {
|
|
475
|
+
const newEmail: string = data.newEmail.toString().toLowerCase();
|
|
476
|
+
|
|
477
|
+
for (const user of data.existingUsers) {
|
|
478
|
+
if (!user.id) {
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
const currentEmail: string | undefined = user.email
|
|
483
|
+
?.toString()
|
|
484
|
+
.toLowerCase();
|
|
485
|
+
|
|
486
|
+
if (currentEmail === newEmail) {
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
await this.updateOneById({
|
|
491
|
+
id: user.id,
|
|
492
|
+
data: {
|
|
493
|
+
resetPasswordToken: null!,
|
|
494
|
+
resetPasswordExpires: null!,
|
|
495
|
+
},
|
|
496
|
+
/*
|
|
497
|
+
* Root because `resetPasswordToken` is declared with `update: []` --
|
|
498
|
+
* no permission can write it -- and hook-free because this IS the
|
|
499
|
+
* update hook; re-entering it would have this write go looking for an
|
|
500
|
+
* email change of its own.
|
|
501
|
+
*/
|
|
502
|
+
props: {
|
|
503
|
+
isRoot: true,
|
|
504
|
+
ignoreHooks: true,
|
|
505
|
+
},
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
415
510
|
@CaptureSpan()
|
|
416
511
|
protected override async onBeforeDelete(
|
|
417
512
|
deleteBy: DeleteBy<Model>,
|
|
@@ -656,7 +656,7 @@ export default class QueryHelper {
|
|
|
656
656
|
}
|
|
657
657
|
|
|
658
658
|
@CaptureSpan()
|
|
659
|
-
public static greaterThan<T extends number | Date>(
|
|
659
|
+
public static greaterThan<T extends number | Date | ObjectID>(
|
|
660
660
|
value: T,
|
|
661
661
|
): FindWhereProperty<any> {
|
|
662
662
|
const rid: string = Text.generateRandomText(10);
|
|
@@ -665,7 +665,7 @@ export default class QueryHelper {
|
|
|
665
665
|
return `(${alias} > :${rid})`;
|
|
666
666
|
},
|
|
667
667
|
{
|
|
668
|
-
[rid]: value,
|
|
668
|
+
[rid]: value instanceof ObjectID ? value.toString() : value,
|
|
669
669
|
},
|
|
670
670
|
) as FindWhereProperty<any>;
|
|
671
671
|
}
|
|
@@ -61,14 +61,25 @@ function buildEntityContextGuidance(context: AIChatPageContext): string {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
/*
|
|
65
|
+
* Per-area guidance for list and explorer pages. This text is the only
|
|
66
|
+
* capability claim in the request that is scoped to the page the user is on,
|
|
67
|
+
* so the model weighs it against the tool schemas — which means it must never
|
|
68
|
+
* describe a tool as NARROWER than it is. It previously summarised
|
|
69
|
+
* query_incidents as "recent incidents, or one by incidentId", and the model
|
|
70
|
+
* paraphrased that back as "I have no tool to list active incidents, give me
|
|
71
|
+
* an incidentId" on the very page whose own suggested prompt card asks
|
|
72
|
+
* "which incidents are currently active or unresolved?". Every affordance an
|
|
73
|
+
* area page's suggested prompts depend on has to be named here.
|
|
74
|
+
*/
|
|
64
75
|
function buildAreaContextGuidance(type: AIChatPageContextType): string {
|
|
65
76
|
switch (type) {
|
|
66
77
|
case AIChatPageContextType.IncidentsList:
|
|
67
|
-
return `the incidents list. Questions about "these incidents" or incident activity are answered with query_incidents (
|
|
78
|
+
return `the incidents list. Questions about "these incidents" or incident activity are answered with query_incidents: pass state="active" to list every incident that is unresolved RIGHT NOW (this drops the time window, so incidents opened weeks ago are still returned), leave state unset for recent activity in a window, or pass incidentId for one incident's full details. search_incidents does free-text search over past incidents.`;
|
|
68
79
|
case AIChatPageContextType.AlertsList:
|
|
69
|
-
return `the alerts list. Questions about alert activity are answered with query_alerts.`;
|
|
80
|
+
return `the alerts list. Questions about alert activity are answered with query_alerts: pass state="active" to list every alert that is unresolved RIGHT NOW regardless of age, leave state unset for recent activity in a window, or pass alertId for one alert's full details.`;
|
|
70
81
|
case AIChatPageContextType.MonitorsList:
|
|
71
|
-
return `the monitors list. Questions about monitors and their status are answered with query_monitors.`;
|
|
82
|
+
return `the monitors list. Questions about monitors and their status are answered with query_monitors: pass problemsOnly=true to list the monitors that are NOT operational right now, or monitorId for one monitor's details and its recent status timeline.`;
|
|
72
83
|
case AIChatPageContextType.ScheduledMaintenanceList:
|
|
73
84
|
return `the scheduled maintenance list. Questions about maintenance windows are answered with query_scheduled_maintenance (past, ongoing and upcoming events; one event by scheduledMaintenanceId). recent_changes also merges maintenance into a chronological feed alongside other changes.`;
|
|
74
85
|
case AIChatPageContextType.LogsExplorer:
|
|
@@ -4,6 +4,8 @@ import SortOrder from "../../../../../../Types/BaseDatabase/SortOrder";
|
|
|
4
4
|
import InBetween from "../../../../../../Types/BaseDatabase/InBetween";
|
|
5
5
|
import PositiveNumber from "../../../../../../Types/PositiveNumber";
|
|
6
6
|
import { JSONObject } from "../../../../../../Types/JSON";
|
|
7
|
+
import IncludesNone from "../../../../../../Types/BaseDatabase/IncludesNone";
|
|
8
|
+
import { NON_ACTIONABLE_ERROR_CLASSES } from "../../../../../../Types/Telemetry/ErrorClass";
|
|
7
9
|
import { LIMIT_PER_PROJECT } from "../../../../../../Types/Database/LimitMax";
|
|
8
10
|
import AIInsightType from "../../../../../../Types/AI/AIInsightType";
|
|
9
11
|
import AIInsightSeverity from "../../../../../../Types/AI/AIInsightSeverity";
|
|
@@ -176,6 +178,14 @@ export default class ExceptionSpikeDetector implements InsightDetector {
|
|
|
176
178
|
firstSeenAt: QueryHelper.lessThan(establishedBefore),
|
|
177
179
|
isResolved: false,
|
|
178
180
|
isArchived: false,
|
|
181
|
+
/*
|
|
182
|
+
* Muted fault domains never file an insight. A spike in rejected
|
|
183
|
+
* logins or malformed input is a traffic story, not a code defect —
|
|
184
|
+
* and each candidate costs two ClickHouse counts before it can even
|
|
185
|
+
* be dropped, so excluding them here saves the scan as well as the
|
|
186
|
+
* LLM budget. Mirrors the Issues list scope.
|
|
187
|
+
*/
|
|
188
|
+
errorClass: new IncludesNone([...NON_ACTIONABLE_ERROR_CLASSES]),
|
|
179
189
|
};
|
|
180
190
|
|
|
181
191
|
const exceptions: Array<TelemetryException> =
|
|
@@ -2,6 +2,8 @@ import ObjectID from "../../../../../../Types/ObjectID";
|
|
|
2
2
|
import OneUptimeDate from "../../../../../../Types/Date";
|
|
3
3
|
import SortOrder from "../../../../../../Types/BaseDatabase/SortOrder";
|
|
4
4
|
import { JSONObject } from "../../../../../../Types/JSON";
|
|
5
|
+
import IncludesNone from "../../../../../../Types/BaseDatabase/IncludesNone";
|
|
6
|
+
import { NON_ACTIONABLE_ERROR_CLASSES } from "../../../../../../Types/Telemetry/ErrorClass";
|
|
5
7
|
import AIInsightType from "../../../../../../Types/AI/AIInsightType";
|
|
6
8
|
import AIInsightSeverity from "../../../../../../Types/AI/AIInsightSeverity";
|
|
7
9
|
import TelemetryException from "../../../../../../Models/DatabaseModels/TelemetryException";
|
|
@@ -171,6 +173,14 @@ export default class NewExceptionDetector implements InsightDetector {
|
|
|
171
173
|
firstSeenAt: QueryHelper.greaterThanEqualTo(firstSeenSince),
|
|
172
174
|
isResolved: false,
|
|
173
175
|
isArchived: false,
|
|
176
|
+
/*
|
|
177
|
+
* Muted fault domains never file an insight. A user-error or an
|
|
178
|
+
* expected-denial group is not a defect in this code, so triaging it
|
|
179
|
+
* would spend an LLM budget grant to be told exactly what the
|
|
180
|
+
* emitting code already declared. Mirrors the Issues list scope, so
|
|
181
|
+
* the inbox and the list agree on what counts as a real failure.
|
|
182
|
+
*/
|
|
183
|
+
errorClass: new IncludesNone([...NON_ACTIONABLE_ERROR_CLASSES]),
|
|
174
184
|
occuranceCount: QueryHelper.greaterThanEqualTo(
|
|
175
185
|
NEW_EXCEPTION_MIN_OCCURRENCE_COUNT,
|
|
176
186
|
),
|
|
@@ -215,7 +215,9 @@ export default class InsightTriageRunner {
|
|
|
215
215
|
*
|
|
216
216
|
* 1. Stamp the verdict onto the exception group row (aiClassification)
|
|
217
217
|
* so the exceptions list can filter on it and the fix lane can skip
|
|
218
|
-
* known-non-defects without re-triaging
|
|
218
|
+
* known-non-defects without re-triaging, and PROMOTE it into the
|
|
219
|
+
* platform-wide errorClass when nothing better has claimed that field
|
|
220
|
+
* yet (see below).
|
|
219
221
|
* 2. code-fault → route the automatic fix (InsightFixRouting owns every
|
|
220
222
|
* gate: enableAi, enableInsightFixTasks, budget, readiness, dedupe)
|
|
221
223
|
* and flip the insight to FixOpened when a run was queued.
|
|
@@ -244,6 +246,12 @@ export default class InsightTriageRunner {
|
|
|
244
246
|
* meantime gets no PR and keeps its terminal status.
|
|
245
247
|
*/
|
|
246
248
|
if (insight.telemetryExceptionId) {
|
|
249
|
+
/*
|
|
250
|
+
* aiClassification is the AUDIT RECORD of what the LLM said and is
|
|
251
|
+
* written unconditionally — it must stay readable even when a
|
|
252
|
+
* stronger source owns errorClass, so a human comparing the two can
|
|
253
|
+
* see where the model disagreed.
|
|
254
|
+
*/
|
|
247
255
|
await TelemetryExceptionService.updateOneById({
|
|
248
256
|
id: insight.telemetryExceptionId,
|
|
249
257
|
data: {
|
|
@@ -251,6 +259,59 @@ export default class InsightTriageRunner {
|
|
|
251
259
|
},
|
|
252
260
|
props: { isRoot: true },
|
|
253
261
|
});
|
|
262
|
+
|
|
263
|
+
/*
|
|
264
|
+
* errorClass is the ACTED-ON field (Issues scope, emit-path
|
|
265
|
+
* suppression, fix routing), and its precedence is
|
|
266
|
+
* declared > manual > ai > default. A class the throwing code
|
|
267
|
+
* declared for itself is a site-level statement by a developer, and
|
|
268
|
+
* 'manual' is a human's verdict on this exact group; a probabilistic
|
|
269
|
+
* LLM answer outranks neither. So the promotion is guarded on the
|
|
270
|
+
* source still being 'default' — nobody has classified this group.
|
|
271
|
+
*
|
|
272
|
+
* The guard is a WHERE clause rather than a read-then-write: the
|
|
273
|
+
* triage run has been in flight for minutes, so a 'declared' event
|
|
274
|
+
* ingesting or a human reclassifying between a read and this write
|
|
275
|
+
* is a real race, and a conditional UPDATE cannot clobber either.
|
|
276
|
+
* (Same conditional-flip idiom as the ActionRequired -> FixOpened
|
|
277
|
+
* write below.)
|
|
278
|
+
*/
|
|
279
|
+
try {
|
|
280
|
+
const promotedRowCount: number =
|
|
281
|
+
await TelemetryExceptionService.updateOneBy({
|
|
282
|
+
query: {
|
|
283
|
+
_id: insight.telemetryExceptionId.toString(),
|
|
284
|
+
errorClassSource: "default",
|
|
285
|
+
},
|
|
286
|
+
data: {
|
|
287
|
+
errorClass: classification,
|
|
288
|
+
errorClassSource: "ai",
|
|
289
|
+
},
|
|
290
|
+
props: { isRoot: true },
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
if (promotedRowCount === 0) {
|
|
294
|
+
logger.debug(
|
|
295
|
+
`AI insights: kept the existing error class on exception ${insight.telemetryExceptionId.toString()} — a declared or manual classification outranks the AI verdict ${classification}.`,
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
} catch (err) {
|
|
299
|
+
/*
|
|
300
|
+
* Non-fatal on purpose. This is a secondary, self-healing write: the
|
|
301
|
+
* audit record above already landed, and live traffic re-stamps
|
|
302
|
+
* errorClass from the declared class on the group's next occurrence.
|
|
303
|
+
*
|
|
304
|
+
* The auto-archive decision below IS user-visible and irreversible by
|
|
305
|
+
* comparison, so it must not be lost to a failure here. Without this
|
|
306
|
+
* guard the two are coupled only by statement order, which is exactly
|
|
307
|
+
* the kind of coupling nobody notices until an incident.
|
|
308
|
+
*/
|
|
309
|
+
logger.warn(
|
|
310
|
+
`AI insights: could not promote the error class on exception ${insight.telemetryExceptionId.toString()}: ${
|
|
311
|
+
err instanceof Error ? err.message : String(err)
|
|
312
|
+
}`,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
254
315
|
}
|
|
255
316
|
|
|
256
317
|
const currentInsight: AIInsight | null = await AIInsightService.findOneById(
|
|
@@ -42,7 +42,7 @@ type AlertStateFilter = "active" | "resolved" | "any";
|
|
|
42
42
|
export const QueryAlertsTool: ObservabilityTool = {
|
|
43
43
|
name: "query_alerts",
|
|
44
44
|
description:
|
|
45
|
-
"Query alerts in this project with their current state and severity. To answer 'which alerts are active/firing right now?' pass state='active' — it returns every unresolved alert regardless of age (no time window unless createdWithinHours is passed explicitly). state='resolved' returns only resolved alerts; the default 'any' returns both, limited to the createdWithinHours window. Results are newest-first; the result reports the total match count — pass skip to page through more. Pass alertId to get full details of one alert, including its description and its owners (teams and users).",
|
|
45
|
+
"Query alerts in this project with their current state and severity. Every row also carries the monitor the alert was raised for, so counting rows by monitor answers 'which monitor or source is the noisiest?'. To answer 'which alerts are active/firing right now?' pass state='active' — it returns every unresolved alert regardless of age (no time window unless createdWithinHours is passed explicitly). state='resolved' returns only resolved alerts; the default 'any' returns both, limited to the createdWithinHours window. Results are newest-first; the result reports the total match count — pass skip to page through more. Pass alertId to get full details of one alert, including its description and its owners (teams and users).",
|
|
46
46
|
inputSchema: {
|
|
47
47
|
type: "object",
|
|
48
48
|
properties: {
|
|
@@ -97,6 +97,9 @@ export const QueryAlertsTool: ObservabilityTool = {
|
|
|
97
97
|
alertSeverity: {
|
|
98
98
|
name: true,
|
|
99
99
|
},
|
|
100
|
+
monitor: {
|
|
101
|
+
name: true,
|
|
102
|
+
},
|
|
100
103
|
},
|
|
101
104
|
props: ctx.props,
|
|
102
105
|
});
|
|
@@ -177,6 +180,7 @@ export const QueryAlertsTool: ObservabilityTool = {
|
|
|
177
180
|
description: alert.description,
|
|
178
181
|
state: alert.currentAlertState?.name,
|
|
179
182
|
severity: alert.alertSeverity?.name,
|
|
183
|
+
monitor: alert.monitor?.name,
|
|
180
184
|
createdAt: alert.createdAt,
|
|
181
185
|
ownerTeams: ownerTeamNames || undefined,
|
|
182
186
|
ownerUsers: ownerUserNames || undefined,
|
|
@@ -286,6 +290,15 @@ export const QueryAlertsTool: ObservabilityTool = {
|
|
|
286
290
|
alertSeverity: {
|
|
287
291
|
name: true,
|
|
288
292
|
},
|
|
293
|
+
/*
|
|
294
|
+
* The monitor an alert was raised for is what turns a list of alerts
|
|
295
|
+
* into "which source is noisiest" — the question the alerts page
|
|
296
|
+
* offers as a first-class suggested prompt. Without it the model can
|
|
297
|
+
* only guess a source from alert titles.
|
|
298
|
+
*/
|
|
299
|
+
monitor: {
|
|
300
|
+
name: true,
|
|
301
|
+
},
|
|
289
302
|
},
|
|
290
303
|
sort: {
|
|
291
304
|
createdAt: SortOrder.Descending,
|
|
@@ -309,6 +322,7 @@ export const QueryAlertsTool: ObservabilityTool = {
|
|
|
309
322
|
title: alert.title,
|
|
310
323
|
state: alert.currentAlertState?.name,
|
|
311
324
|
severity: alert.alertSeverity?.name,
|
|
325
|
+
monitor: alert.monitor?.name,
|
|
312
326
|
createdAt: alert.createdAt,
|
|
313
327
|
};
|
|
314
328
|
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import GlobalCache from "../../Infrastructure/GlobalCache";
|
|
2
|
+
import logger from "../Logger";
|
|
3
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
4
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* Why this file exists.
|
|
8
|
+
*
|
|
9
|
+
* The auto-recharge paths in NotificationService and AIBillingService run
|
|
10
|
+
* inline on every notification attempt, so when a card is declined they used
|
|
11
|
+
* to mail every project owner once per paging attempt - a genuine mail bomb
|
|
12
|
+
* arriving during the exact outage the pages were about.
|
|
13
|
+
*
|
|
14
|
+
* The obvious fix - gate the mail on the project's existing
|
|
15
|
+
* failed...NotificationSentToOwners boolean, which is only cleared by a
|
|
16
|
+
* SUCCESSFUL recharge - trades a storm for something worse: permanent silence.
|
|
17
|
+
* A project with no payment method mails once and latches; the owner adds a
|
|
18
|
+
* card; the card is declined; the recharge can therefore never succeed, so the
|
|
19
|
+
* latch can never clear, and the owner is never told the new card failed. SMS
|
|
20
|
+
* and voice paging simply stops working and nobody hears about it.
|
|
21
|
+
*
|
|
22
|
+
* So this is a WINDOW, not a latch. At most one failure notice per project per
|
|
23
|
+
* day, per kind of failure, and the window expires on its own whether or not
|
|
24
|
+
* anything is ever fixed. A storm collapses to one email a day; a new and
|
|
25
|
+
* newly-actionable failure is still reported within a day.
|
|
26
|
+
*
|
|
27
|
+
* It FAILS OPEN. If Redis is unreachable the notice is sent, which is the same
|
|
28
|
+
* behaviour the product had before any of this existed. Failing closed would
|
|
29
|
+
* mean a Redis blip could silently suppress "we cannot page anyone for you",
|
|
30
|
+
* and there is no worse thing for a monitoring product to lose.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
const BILLING_FAILURE_NOTICE_NAMESPACE: string = "billing-failure-notice";
|
|
34
|
+
|
|
35
|
+
export enum BillingFailureNoticeKind {
|
|
36
|
+
SmsAndCallRechargeFailed = "sms-and-call-recharge-failed",
|
|
37
|
+
AiCreditRechargeFailed = "ai-credit-recharge-failed",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type ShouldSendBillingFailureNoticeFunction = (data: {
|
|
41
|
+
projectId: ObjectID;
|
|
42
|
+
kind: BillingFailureNoticeKind;
|
|
43
|
+
}) => Promise<boolean>;
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* Claims the day's window for this (project, kind). True means "you own it,
|
|
47
|
+
* send the email"; false means somebody already told them today.
|
|
48
|
+
*/
|
|
49
|
+
export const shouldSendBillingFailureNotice: ShouldSendBillingFailureNoticeFunction =
|
|
50
|
+
async (data: {
|
|
51
|
+
projectId: ObjectID;
|
|
52
|
+
kind: BillingFailureNoticeKind;
|
|
53
|
+
}): Promise<boolean> => {
|
|
54
|
+
const key: string = `${data.projectId.toString()}-${data.kind}`;
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
/*
|
|
58
|
+
* SET NX rather than read-then-write: several notification attempts
|
|
59
|
+
* failing at once is the normal case here, not the edge one, and a
|
|
60
|
+
* check-then-act would let every one of them decide it was first.
|
|
61
|
+
*/
|
|
62
|
+
return await GlobalCache.setStringIfNotExists(
|
|
63
|
+
BILLING_FAILURE_NOTICE_NAMESPACE,
|
|
64
|
+
key,
|
|
65
|
+
ObjectID.generate().toString(),
|
|
66
|
+
{
|
|
67
|
+
expiresInSeconds: OneUptimeDate.getSecondsInDays(1),
|
|
68
|
+
},
|
|
69
|
+
);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
logger.warn(
|
|
72
|
+
`Billing failure notice throttle: the shared cache is unavailable, so the 24h window for project ${data.projectId.toString()} (${
|
|
73
|
+
data.kind
|
|
74
|
+
}) is not enforced. Sending, because a suppressed billing failure is worse than a duplicated one.`,
|
|
75
|
+
);
|
|
76
|
+
logger.warn(err);
|
|
77
|
+
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
};
|