@oneuptime/common 11.7.2 → 11.7.4
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/KubernetesCostAllocation.ts +103 -0
- package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Index.ts +5 -0
- package/Models/DatabaseModels/LogDropFilter.ts +89 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
- package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
- package/Models/DatabaseModels/TableView.ts +40 -0
- package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
- package/Server/API/AlertAPI.ts +32 -17
- package/Server/API/BaseAPI.ts +31 -2
- package/Server/API/BaseAnalyticsAPI.ts +36 -2
- package/Server/API/CommonAPI.ts +57 -0
- package/Server/API/IncidentAPI.ts +60 -33
- package/Server/API/IncidentEpisodeAPI.ts +31 -16
- package/Server/API/MonitorAPI.ts +30 -0
- package/Server/API/MonitorTemplateAPI.ts +8 -0
- package/Server/API/ProbeAPI.ts +196 -15
- package/Server/API/ProjectAPI.ts +79 -1
- package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
- package/Server/API/StatusPageAPI.ts +74 -37
- package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AlertEpisodeService.ts +47 -0
- package/Server/Services/AlertService.ts +125 -0
- package/Server/Services/BillingService.ts +98 -0
- package/Server/Services/DatabaseService.ts +184 -20
- package/Server/Services/IncidentEpisodeService.ts +47 -0
- package/Server/Services/IncidentService.ts +123 -0
- package/Server/Services/IncidentTemplateService.ts +123 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/LogDropFilterService.ts +133 -0
- package/Server/Services/MonitorProbeService.ts +94 -4
- package/Server/Services/MonitorService.ts +48 -43
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
- package/Server/Services/ProbeService.ts +66 -0
- package/Server/Services/ProjectService.ts +131 -7
- package/Server/Services/RecommendationDismissalService.ts +52 -0
- package/Server/Services/RunbookAgentJobService.ts +68 -7
- package/Server/Services/ScheduledMaintenanceService.ts +103 -0
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
- package/Server/Services/StatusPageGroupService.ts +186 -0
- package/Server/Services/TraceDropFilterService.ts +133 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
- package/Server/Types/Workflow/Components/API/Get.ts +12 -0
- package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
- package/Server/Types/Workflow/Components/API/Post.ts +12 -0
- package/Server/Types/Workflow/Components/API/Put.ts +13 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
- package/Server/Utils/DropFilterValidation.ts +127 -0
- package/Server/Utils/Errors.ts +5 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
- package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
- package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
- package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
- package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
- package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
- package/Tests/Server/API/ProbeAPI.test.ts +422 -53
- package/Tests/Server/API/ProjectAPI.test.ts +180 -0
- package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
- package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
- package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
- package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
- package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
- package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
- package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
- package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
- package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
- package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
- package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
- package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
- package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
- package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
- package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
- package/Tests/Types/DateUserTimezone.test.ts +52 -0
- package/Tests/Types/JSONFunctions.test.ts +103 -1
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
- package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
- package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
- package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
- package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
- package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
- package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
- package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
- package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
- package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
- package/Tests/UI/Components/InfoCard.test.tsx +358 -0
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
- package/Tests/UI/Components/Modal.test.tsx +43 -5
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
- package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +999 -0
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
- package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
- package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
- package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
- package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
- package/Tests/Utils/UserPreferences.test.ts +563 -0
- package/Types/Date.ts +15 -6
- package/Types/JSONFunctions.ts +7 -2
- package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
- package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
- package/Types/Permission.ts +45 -0
- package/Types/Recommendation/RecommendationType.ts +20 -0
- package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
- package/Types/Runbook/RunbookStepTimeout.ts +202 -0
- package/Types/Telemetry/DropFilterSampling.ts +92 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
- package/UI/Components/Accordion/Accordion.tsx +10 -2
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
- package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
- package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
- package/UI/Components/Error/PageError.tsx +0 -4
- package/UI/Components/ErrorBoundary.tsx +252 -15
- package/UI/Components/InfoCard/InfoCard.tsx +58 -1
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
- package/UI/Components/MasterPage/MasterPage.tsx +65 -0
- package/UI/Components/Modal/Modal.tsx +16 -60
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
- package/UI/Components/ModelTable/BaseModelTable.tsx +503 -71
- package/UI/Components/ModelTable/Column.ts +17 -0
- package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +523 -0
- package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
- package/UI/Components/ModelTable/TableView.tsx +24 -2
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
- package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
- package/UI/Components/SideMenu/SideMenu.tsx +24 -4
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
- package/UI/Components/Table/Table.tsx +14 -1
- package/UI/Components/Table/TableRow.tsx +180 -175
- package/UI/Components/Table/Types/Column.ts +2 -0
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
- package/UI/Utils/DropdownAlignment.ts +162 -0
- package/UI/Utils/TableFilterUrlState.ts +59 -20
- package/Utils/API.ts +106 -2
- package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
- package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
- package/Utils/StatusPage/GroupTree.ts +307 -0
- package/Utils/StatusPage/ResourceUptime.ts +90 -17
- package/Utils/UserPreferences.ts +53 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
- package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
- package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TableView.js +40 -0
- package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +22 -13
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +22 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +42 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +43 -26
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +23 -0
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
- package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
- package/build/dist/Server/API/ProbeAPI.js +131 -15
- package/build/dist/Server/API/ProbeAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +62 -3
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +61 -33
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
- package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +95 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +71 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +140 -17
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +100 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogDropFilterService.js +93 -0
- package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +73 -5
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +34 -39
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +64 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +103 -7
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
- package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
- package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
- package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
- package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
- package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
- package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
- package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
- package/build/dist/Server/Utils/Errors.js +3 -0
- package/build/dist/Server/Utils/Errors.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Types/Date.js +14 -4
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +8 -3
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +40 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
- package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
- package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
- package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
- package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
- package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
- package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Error/PageError.js +1 -3
- package/build/dist/UI/Components/Error/PageError.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +145 -11
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
- package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +4 -32
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +308 -40
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +230 -0
- package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
- package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
- package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
- package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +15 -2
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +11 -6
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
- package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
- package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
- package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
- package/build/dist/Utils/API.js +39 -2
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
- package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
- package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/UserPreferences.js +33 -0
- package/build/dist/Utils/UserPreferences.js.map +1 -1
- package/package.json +1 -1
|
@@ -28,6 +28,9 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
28
28
|
import PositiveNumber from "../../Types/PositiveNumber";
|
|
29
29
|
import Typeof from "../../Types/Typeof";
|
|
30
30
|
import { applyIncidentSelfPrivacyFilter } from "../Utils/Incident/IncidentPrivacyFilter";
|
|
31
|
+
import ProjectScopedReferenceValidator, {
|
|
32
|
+
resolveReferenceId,
|
|
33
|
+
} from "../Utils/Database/ProjectScopedReferenceValidator";
|
|
31
34
|
import UserNotificationEventType from "../../Types/UserNotification/UserNotificationEventType";
|
|
32
35
|
import StatusPageSubscriberNotificationStatus from "../../Types/StatusPage/StatusPageSubscriberNotificationStatus";
|
|
33
36
|
import DockerHost from "../../Models/DatabaseModels/DockerHost";
|
|
@@ -442,6 +445,8 @@ export class Service extends DatabaseService<Model> {
|
|
|
442
445
|
updateBy.data.isVisibleOnStatusPage = false;
|
|
443
446
|
}
|
|
444
447
|
|
|
448
|
+
await this.validateProjectScopedReferences(updateBy);
|
|
449
|
+
|
|
445
450
|
const carryForward: UpdateCarryForward = {};
|
|
446
451
|
|
|
447
452
|
if (
|
|
@@ -552,6 +557,90 @@ export class Service extends DatabaseService<Model> {
|
|
|
552
557
|
};
|
|
553
558
|
}
|
|
554
559
|
|
|
560
|
+
/*
|
|
561
|
+
* An update can repoint an incident at another project's state, severity or
|
|
562
|
+
* monitor status just as easily as a create can, and the result is the same:
|
|
563
|
+
* the referenced project can no longer be deleted. Only the columns actually
|
|
564
|
+
* being written are checked, so ordinary updates cost no extra queries.
|
|
565
|
+
*/
|
|
566
|
+
private async validateProjectScopedReferences(
|
|
567
|
+
updateBy: UpdateBy<Model>,
|
|
568
|
+
): Promise<void> {
|
|
569
|
+
const incidentStateId: ObjectID | string | undefined =
|
|
570
|
+
resolveReferenceId(updateBy.data.currentIncidentStateId) ||
|
|
571
|
+
resolveReferenceId(updateBy.data.currentIncidentState);
|
|
572
|
+
|
|
573
|
+
const incidentSeverityId: ObjectID | string | undefined =
|
|
574
|
+
resolveReferenceId(updateBy.data.incidentSeverityId) ||
|
|
575
|
+
resolveReferenceId(updateBy.data.incidentSeverity);
|
|
576
|
+
|
|
577
|
+
const changeMonitorStatusToId: ObjectID | string | undefined =
|
|
578
|
+
resolveReferenceId(updateBy.data.changeMonitorStatusToId) ||
|
|
579
|
+
resolveReferenceId(updateBy.data.changeMonitorStatusTo);
|
|
580
|
+
|
|
581
|
+
if (!incidentStateId && !incidentSeverityId && !changeMonitorStatusToId) {
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/*
|
|
586
|
+
* Root/API updates do not always carry a tenantId, so fall back to the
|
|
587
|
+
* project of each incident the query actually matches.
|
|
588
|
+
*/
|
|
589
|
+
const projectIds: Array<ObjectID> = updateBy.props.tenantId
|
|
590
|
+
? [updateBy.props.tenantId]
|
|
591
|
+
: await this.getProjectIdsForUpdateQuery(updateBy);
|
|
592
|
+
|
|
593
|
+
for (const projectId of projectIds) {
|
|
594
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject({
|
|
595
|
+
projectId: projectId,
|
|
596
|
+
subject: "incident",
|
|
597
|
+
references: [
|
|
598
|
+
{
|
|
599
|
+
modelName: "Incident State",
|
|
600
|
+
id: incidentStateId,
|
|
601
|
+
service: IncidentStateService,
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
modelName: "Incident Severity",
|
|
605
|
+
id: incidentSeverityId,
|
|
606
|
+
service: IncidentSeverityService,
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
modelName: "Monitor Status",
|
|
610
|
+
id: changeMonitorStatusToId,
|
|
611
|
+
service: MonitorStatusService,
|
|
612
|
+
},
|
|
613
|
+
],
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
private async getProjectIdsForUpdateQuery(
|
|
619
|
+
updateBy: UpdateBy<Model>,
|
|
620
|
+
): Promise<Array<ObjectID>> {
|
|
621
|
+
const incidents: Array<Model> = await this.findBy({
|
|
622
|
+
query: updateBy.query,
|
|
623
|
+
select: {
|
|
624
|
+
projectId: true,
|
|
625
|
+
},
|
|
626
|
+
limit: LIMIT_MAX,
|
|
627
|
+
skip: 0,
|
|
628
|
+
props: {
|
|
629
|
+
isRoot: true,
|
|
630
|
+
},
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
const projectIds: Dictionary<ObjectID> = {};
|
|
634
|
+
|
|
635
|
+
for (const incident of incidents) {
|
|
636
|
+
if (incident.projectId) {
|
|
637
|
+
projectIds[incident.projectId.toString()] = incident.projectId;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
return Object.values(projectIds);
|
|
642
|
+
}
|
|
643
|
+
|
|
555
644
|
@CaptureSpan()
|
|
556
645
|
protected override async onBeforeCreate(
|
|
557
646
|
createBy: CreateBy<Model>,
|
|
@@ -832,6 +921,40 @@ export class Service extends DatabaseService<Model> {
|
|
|
832
921
|
initialIncidentStateId = incidentState.id;
|
|
833
922
|
}
|
|
834
923
|
|
|
924
|
+
/*
|
|
925
|
+
* The severity and the monitor status to switch to can arrive from an API
|
|
926
|
+
* caller, an incident template or a monitor criteria, and none of those
|
|
927
|
+
* paths checked that the record belongs to this project. Persisting
|
|
928
|
+
* another project's id leaves that project undeletable, so reject it here.
|
|
929
|
+
* Runs before the counter increment so a rejected create does not burn an
|
|
930
|
+
* incident number.
|
|
931
|
+
*/
|
|
932
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject({
|
|
933
|
+
projectId: projectId,
|
|
934
|
+
subject: "incident",
|
|
935
|
+
references: [
|
|
936
|
+
{
|
|
937
|
+
modelName: "Incident State",
|
|
938
|
+
id: initialIncidentStateId,
|
|
939
|
+
service: IncidentStateService,
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
modelName: "Incident Severity",
|
|
943
|
+
id:
|
|
944
|
+
resolveReferenceId(createBy.data.incidentSeverityId) ||
|
|
945
|
+
resolveReferenceId(createBy.data.incidentSeverity),
|
|
946
|
+
service: IncidentSeverityService,
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
modelName: "Monitor Status",
|
|
950
|
+
id:
|
|
951
|
+
resolveReferenceId(createBy.data.changeMonitorStatusToId) ||
|
|
952
|
+
resolveReferenceId(createBy.data.changeMonitorStatusTo),
|
|
953
|
+
service: MonitorStatusService,
|
|
954
|
+
},
|
|
955
|
+
],
|
|
956
|
+
});
|
|
957
|
+
|
|
835
958
|
const incidentCounterResult: {
|
|
836
959
|
counter: number;
|
|
837
960
|
prefix: string | undefined;
|
|
@@ -1,20 +1,142 @@
|
|
|
1
|
-
import { OnCreate } from "../Types/Database/Hooks";
|
|
1
|
+
import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
|
|
2
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
3
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
2
4
|
import DatabaseService from "./DatabaseService";
|
|
3
5
|
import IncidentTemplateOwnerTeamService from "./IncidentTemplateOwnerTeamService";
|
|
4
6
|
import IncidentTemplateOwnerUserService from "./IncidentTemplateOwnerUserService";
|
|
7
|
+
import IncidentSeverityService from "./IncidentSeverityService";
|
|
8
|
+
import IncidentStateService from "./IncidentStateService";
|
|
9
|
+
import MonitorStatusService from "./MonitorStatusService";
|
|
5
10
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
11
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
12
|
+
import Dictionary from "../../Types/Dictionary";
|
|
6
13
|
import ObjectID from "../../Types/ObjectID";
|
|
7
14
|
import Typeof from "../../Types/Typeof";
|
|
8
15
|
import Model from "../../Models/DatabaseModels/IncidentTemplate";
|
|
9
16
|
import IncidentTemplateOwnerTeam from "../../Models/DatabaseModels/IncidentTemplateOwnerTeam";
|
|
10
17
|
import IncidentTemplateOwnerUser from "../../Models/DatabaseModels/IncidentTemplateOwnerUser";
|
|
18
|
+
import ProjectScopedReferenceValidator, {
|
|
19
|
+
ProjectScopedReference,
|
|
20
|
+
resolveReferenceId,
|
|
21
|
+
} from "../Utils/Database/ProjectScopedReferenceValidator";
|
|
11
22
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
23
|
+
import QueryDeepPartialEntity from "../../Types/Database/PartialEntity";
|
|
12
24
|
|
|
13
25
|
export class Service extends DatabaseService<Model> {
|
|
14
26
|
public constructor() {
|
|
15
27
|
super(Model);
|
|
16
28
|
}
|
|
17
29
|
|
|
30
|
+
/*
|
|
31
|
+
* A template is copied onto every incident created from it, so an id
|
|
32
|
+
* belonging to another project here becomes a cross-project reference on
|
|
33
|
+
* each of those incidents — and the referenced project can then no longer be
|
|
34
|
+
* deleted. Reject it where it enters instead.
|
|
35
|
+
*/
|
|
36
|
+
@CaptureSpan()
|
|
37
|
+
protected override async onBeforeCreate(
|
|
38
|
+
createBy: CreateBy<Model>,
|
|
39
|
+
): Promise<OnCreate<Model>> {
|
|
40
|
+
const projectId: ObjectID | undefined =
|
|
41
|
+
createBy.props.tenantId || createBy.data.projectId;
|
|
42
|
+
|
|
43
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject({
|
|
44
|
+
projectId: projectId,
|
|
45
|
+
subject: "incident template",
|
|
46
|
+
references: this.getProjectScopedReferences(createBy.data),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return { createBy, carryForward: null };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@CaptureSpan()
|
|
53
|
+
protected override async onBeforeUpdate(
|
|
54
|
+
updateBy: UpdateBy<Model>,
|
|
55
|
+
): Promise<OnUpdate<Model>> {
|
|
56
|
+
const references: Array<ProjectScopedReference> =
|
|
57
|
+
this.getProjectScopedReferences(updateBy.data);
|
|
58
|
+
|
|
59
|
+
if (
|
|
60
|
+
references.every((reference: ProjectScopedReference) => {
|
|
61
|
+
return !reference.id;
|
|
62
|
+
})
|
|
63
|
+
) {
|
|
64
|
+
return { updateBy, carryForward: null };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* Root/API updates do not always carry a tenantId, so fall back to the
|
|
69
|
+
* project of each template the query actually matches.
|
|
70
|
+
*/
|
|
71
|
+
const projectIds: Array<ObjectID> = updateBy.props.tenantId
|
|
72
|
+
? [updateBy.props.tenantId]
|
|
73
|
+
: await this.getProjectIdsForUpdateQuery(updateBy);
|
|
74
|
+
|
|
75
|
+
for (const projectId of projectIds) {
|
|
76
|
+
await ProjectScopedReferenceValidator.validateReferencesBelongToProject({
|
|
77
|
+
projectId: projectId,
|
|
78
|
+
subject: "incident template",
|
|
79
|
+
references: references,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return { updateBy, carryForward: null };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private getProjectScopedReferences(
|
|
87
|
+
data: Model | QueryDeepPartialEntity<Model>,
|
|
88
|
+
): Array<ProjectScopedReference> {
|
|
89
|
+
return [
|
|
90
|
+
{
|
|
91
|
+
modelName: "Incident State",
|
|
92
|
+
id:
|
|
93
|
+
resolveReferenceId(data.initialIncidentStateId) ||
|
|
94
|
+
resolveReferenceId(data.initialIncidentState),
|
|
95
|
+
service: IncidentStateService,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
modelName: "Incident Severity",
|
|
99
|
+
id:
|
|
100
|
+
resolveReferenceId(data.incidentSeverityId) ||
|
|
101
|
+
resolveReferenceId(data.incidentSeverity),
|
|
102
|
+
service: IncidentSeverityService,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
modelName: "Monitor Status",
|
|
106
|
+
id:
|
|
107
|
+
resolveReferenceId(data.changeMonitorStatusToId) ||
|
|
108
|
+
resolveReferenceId(data.changeMonitorStatusTo),
|
|
109
|
+
service: MonitorStatusService,
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private async getProjectIdsForUpdateQuery(
|
|
115
|
+
updateBy: UpdateBy<Model>,
|
|
116
|
+
): Promise<Array<ObjectID>> {
|
|
117
|
+
const templates: Array<Model> = await this.findBy({
|
|
118
|
+
query: updateBy.query,
|
|
119
|
+
select: {
|
|
120
|
+
projectId: true,
|
|
121
|
+
},
|
|
122
|
+
limit: LIMIT_MAX,
|
|
123
|
+
skip: 0,
|
|
124
|
+
props: {
|
|
125
|
+
isRoot: true,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const projectIds: Dictionary<ObjectID> = {};
|
|
130
|
+
|
|
131
|
+
for (const template of templates) {
|
|
132
|
+
if (template.projectId) {
|
|
133
|
+
projectIds[template.projectId.toString()] = template.projectId;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return Object.values(projectIds);
|
|
138
|
+
}
|
|
139
|
+
|
|
18
140
|
@CaptureSpan()
|
|
19
141
|
protected override async onCreateSuccess(
|
|
20
142
|
onCreate: OnCreate<Model>,
|
package/Server/Services/Index.ts
CHANGED
|
@@ -134,6 +134,7 @@ import EnterpriseLicenseService from "./EnterpriseLicenseService";
|
|
|
134
134
|
import EnterpriseLicenseInstanceService from "./EnterpriseLicenseInstanceService";
|
|
135
135
|
import MarketingConversionService from "./MarketingConversionService";
|
|
136
136
|
import OpenSourceDeploymentService from "./OpenSourceDeploymentService";
|
|
137
|
+
import RecommendationDismissalService from "./RecommendationDismissalService";
|
|
137
138
|
import ResellerPlanService from "./ResellerPlanService";
|
|
138
139
|
import ResellerService from "./ResellerService";
|
|
139
140
|
import ScheduledMaintenanceCustomFieldService from "./ScheduledMaintenanceCustomFieldService";
|
|
@@ -286,6 +287,7 @@ const services: Array<BaseService> = [
|
|
|
286
287
|
|
|
287
288
|
ResellerService,
|
|
288
289
|
ResellerPlanService,
|
|
290
|
+
RecommendationDismissalService,
|
|
289
291
|
// Import all services in current folder here.
|
|
290
292
|
AccessTokenService,
|
|
291
293
|
ApiKeyPermissionService,
|
|
@@ -1,10 +1,143 @@
|
|
|
1
1
|
import DatabaseService from "./DatabaseService";
|
|
2
2
|
import Model from "../../Models/DatabaseModels/LogDropFilter";
|
|
3
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
4
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
5
|
+
import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
|
|
6
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
7
|
+
import ObjectID from "../../Types/ObjectID";
|
|
8
|
+
import OneUptimeDate from "../../Types/Date";
|
|
9
|
+
import PartialEntity from "../../Types/Database/PartialEntity";
|
|
10
|
+
import {
|
|
11
|
+
DropFilterCandidate,
|
|
12
|
+
DropFilterValidationOptions,
|
|
13
|
+
isSqlExpressionValue,
|
|
14
|
+
validateDropFilter,
|
|
15
|
+
} from "../Utils/DropFilterValidation";
|
|
16
|
+
|
|
17
|
+
const VALIDATION_OPTIONS: DropFilterValidationOptions = {
|
|
18
|
+
recordNoun: "logs",
|
|
19
|
+
};
|
|
3
20
|
|
|
4
21
|
export class Service extends DatabaseService<Model> {
|
|
5
22
|
public constructor() {
|
|
6
23
|
super(Model);
|
|
7
24
|
}
|
|
25
|
+
|
|
26
|
+
protected override async onBeforeCreate(
|
|
27
|
+
createBy: CreateBy<Model>,
|
|
28
|
+
): Promise<OnCreate<Model>> {
|
|
29
|
+
validateDropFilter(
|
|
30
|
+
{
|
|
31
|
+
action: createBy.data.action,
|
|
32
|
+
samplePercentage: createBy.data.samplePercentage,
|
|
33
|
+
filterQuery: createBy.data.filterQuery as string | undefined,
|
|
34
|
+
},
|
|
35
|
+
VALIDATION_OPTIONS,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
return { createBy, carryForward: null };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected override async onBeforeUpdate(
|
|
42
|
+
updateBy: UpdateBy<Model>,
|
|
43
|
+
): Promise<OnUpdate<Model>> {
|
|
44
|
+
/*
|
|
45
|
+
* An update can make a row invalid without naming every field: flipping
|
|
46
|
+
* `action` to "sample" while the stored `samplePercentage` is null, or
|
|
47
|
+
* blanking `filterQuery` on a row whose action is already "drop". So
|
|
48
|
+
* validate the MERGED row, not the incoming partial.
|
|
49
|
+
*
|
|
50
|
+
* Only pay for the SELECT when the update actually touches one of the
|
|
51
|
+
* three fields that can break the row. Drop-filter edits are rare,
|
|
52
|
+
* human-driven config changes — this is not a hot path.
|
|
53
|
+
*/
|
|
54
|
+
const incomingAction: unknown = updateBy.data.action;
|
|
55
|
+
const incomingSamplePercentage: unknown = updateBy.data.samplePercentage;
|
|
56
|
+
const incomingFilterQuery: unknown = updateBy.data.filterQuery;
|
|
57
|
+
|
|
58
|
+
const touchesValidatedFields: boolean =
|
|
59
|
+
incomingAction !== undefined ||
|
|
60
|
+
incomingSamplePercentage !== undefined ||
|
|
61
|
+
incomingFilterQuery !== undefined;
|
|
62
|
+
|
|
63
|
+
if (!touchesValidatedFields) {
|
|
64
|
+
return { updateBy, carryForward: null };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (
|
|
68
|
+
isSqlExpressionValue(incomingAction) ||
|
|
69
|
+
isSqlExpressionValue(incomingSamplePercentage) ||
|
|
70
|
+
isSqlExpressionValue(incomingFilterQuery)
|
|
71
|
+
) {
|
|
72
|
+
// Cannot evaluate a raw SQL expression here. See isSqlExpressionValue.
|
|
73
|
+
return { updateBy, carryForward: null };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const existingRows: Array<Model> = await this.findBy({
|
|
77
|
+
query: updateBy.query,
|
|
78
|
+
skip: 0,
|
|
79
|
+
limit: LIMIT_MAX,
|
|
80
|
+
select: {
|
|
81
|
+
_id: true,
|
|
82
|
+
action: true,
|
|
83
|
+
samplePercentage: true,
|
|
84
|
+
filterQuery: true,
|
|
85
|
+
},
|
|
86
|
+
props: {
|
|
87
|
+
isRoot: true,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
for (const existing of existingRows) {
|
|
92
|
+
const merged: DropFilterCandidate = {
|
|
93
|
+
action:
|
|
94
|
+
incomingAction !== undefined
|
|
95
|
+
? (incomingAction as string | null)
|
|
96
|
+
: existing.action,
|
|
97
|
+
samplePercentage:
|
|
98
|
+
incomingSamplePercentage !== undefined
|
|
99
|
+
? (incomingSamplePercentage as number | null)
|
|
100
|
+
: existing.samplePercentage,
|
|
101
|
+
filterQuery:
|
|
102
|
+
incomingFilterQuery !== undefined
|
|
103
|
+
? (incomingFilterQuery as string | null)
|
|
104
|
+
: (existing.filterQuery as string | null),
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
validateDropFilter(merged, VALIDATION_OPTIONS);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return { updateBy, carryForward: null };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
* Ingest-path counter flush: add `count` drops to this filter's running
|
|
115
|
+
* total and stamp `lastDroppedAt`, in one atomic statement.
|
|
116
|
+
*
|
|
117
|
+
* Called from the telemetry ingest workers on a throttle (many dropped
|
|
118
|
+
* log records batched into one UPDATE), never once per record, and never
|
|
119
|
+
* on the request path. Runs no hooks and does not bump `version`, so it
|
|
120
|
+
* cannot conflict with a human editing the same filter in the dashboard.
|
|
121
|
+
*
|
|
122
|
+
* See App/FeatureSet/Telemetry/Utils/DropFilterDropRecorder.ts.
|
|
123
|
+
*/
|
|
124
|
+
public async addToDroppedCount(data: {
|
|
125
|
+
id: ObjectID;
|
|
126
|
+
count: number;
|
|
127
|
+
lastDroppedAt?: Date | undefined;
|
|
128
|
+
}): Promise<void> {
|
|
129
|
+
if (!data.count || data.count <= 0) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
await this.atomicAddToColumnsByIdWithoutHooks({
|
|
134
|
+
id: data.id,
|
|
135
|
+
add: { droppedCount: data.count },
|
|
136
|
+
set: {
|
|
137
|
+
lastDroppedAt: data.lastDroppedAt || OneUptimeDate.getCurrentDate(),
|
|
138
|
+
} as PartialEntity<Model>,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
8
141
|
}
|
|
9
142
|
|
|
10
143
|
export default new Service();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import ObjectID from "../../Types/ObjectID";
|
|
2
2
|
import CreateBy from "../Types/Database/CreateBy";
|
|
3
|
-
import
|
|
3
|
+
import DeleteBy from "../Types/Database/DeleteBy";
|
|
4
|
+
import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
4
5
|
import DatabaseService, { EntityManager } from "./DatabaseService";
|
|
5
6
|
import OneUptimeDate from "../../Types/Date";
|
|
6
7
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
@@ -9,6 +10,7 @@ import Monitor from "../../Models/DatabaseModels/Monitor";
|
|
|
9
10
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
10
11
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
11
12
|
import MonitorService from "./MonitorService";
|
|
13
|
+
import ProbeService from "./ProbeService";
|
|
12
14
|
import { MonitorTypeHelper } from "../../Types/Monitor/MonitorType";
|
|
13
15
|
import CronTab from "../Utils/CronTab";
|
|
14
16
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
@@ -270,6 +272,31 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
270
272
|
}
|
|
271
273
|
}
|
|
272
274
|
|
|
275
|
+
/*
|
|
276
|
+
* The probe id on a create comes straight from the browser (the
|
|
277
|
+
* Monitor > Probes table posts it), so it has to be checked against the
|
|
278
|
+
* tenant exactly like the monitor-create path does - otherwise another
|
|
279
|
+
* project's probe can be attached to this monitor.
|
|
280
|
+
*/
|
|
281
|
+
const probeId: ObjectID | undefined | null =
|
|
282
|
+
createBy.data.probeId || createBy.data.probe?.id;
|
|
283
|
+
const projectId: ObjectID | undefined | null =
|
|
284
|
+
createBy.data.projectId || createBy.data.project?.id;
|
|
285
|
+
|
|
286
|
+
if (probeId && projectId) {
|
|
287
|
+
const isProbeAttachable: boolean =
|
|
288
|
+
await ProbeService.isProbeAttachableToProject({
|
|
289
|
+
probeId: probeId,
|
|
290
|
+
projectId: projectId,
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
if (!isProbeAttachable) {
|
|
294
|
+
throw new BadDataException(
|
|
295
|
+
"Probe not found or it does not belong to this project.",
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
273
300
|
// Check if the monitor type supports probes
|
|
274
301
|
const monitorId: ObjectID | undefined | null =
|
|
275
302
|
createBy.data.monitorId || createBy.data.monitor?.id;
|
|
@@ -362,12 +389,75 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
362
389
|
return onUpdate;
|
|
363
390
|
}
|
|
364
391
|
|
|
392
|
+
/*
|
|
393
|
+
* Removing a probe from a monitor changes the same aggregate that adding one
|
|
394
|
+
* or toggling isEnabled changes - Monitor.isNoProbeEnabledOnThisMonitor and
|
|
395
|
+
* isAllProbesDisconnectedFromThisMonitor. Without these hooks, deleting the
|
|
396
|
+
* last probe left the monitor claiming it was still being watched: no
|
|
397
|
+
* "Probes Not Enabled" banner and no owner notification, even though nothing
|
|
398
|
+
* was monitoring it any more.
|
|
399
|
+
*
|
|
400
|
+
* The monitorIds have to be read before the delete, because after it the
|
|
401
|
+
* rows are gone.
|
|
402
|
+
*/
|
|
403
|
+
protected override async onBeforeDelete(
|
|
404
|
+
deleteBy: DeleteBy<MonitorProbe>,
|
|
405
|
+
): Promise<OnDelete<MonitorProbe>> {
|
|
406
|
+
const itemsToDelete: Array<MonitorProbe> = await this.findBy({
|
|
407
|
+
query: deleteBy.query,
|
|
408
|
+
limit: deleteBy.limit,
|
|
409
|
+
skip: deleteBy.skip,
|
|
410
|
+
select: {
|
|
411
|
+
monitorId: true,
|
|
412
|
+
},
|
|
413
|
+
props: {
|
|
414
|
+
isRoot: true,
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
deleteBy,
|
|
420
|
+
carryForward: {
|
|
421
|
+
monitorIds: itemsToDelete
|
|
422
|
+
.map((item: MonitorProbe) => {
|
|
423
|
+
return item.monitorId;
|
|
424
|
+
})
|
|
425
|
+
.filter((monitorId: ObjectID | undefined) => {
|
|
426
|
+
return Boolean(monitorId);
|
|
427
|
+
}) as Array<ObjectID>,
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
protected override async onDeleteSuccess(
|
|
433
|
+
onDelete: OnDelete<MonitorProbe>,
|
|
434
|
+
_itemIdsBeforeDelete: Array<ObjectID>,
|
|
435
|
+
): Promise<OnDelete<MonitorProbe>> {
|
|
436
|
+
const monitorIds: Array<ObjectID> =
|
|
437
|
+
(onDelete.carryForward?.monitorIds as Array<ObjectID>) || [];
|
|
438
|
+
|
|
439
|
+
const refreshedMonitorIds: Set<string> = new Set();
|
|
440
|
+
|
|
441
|
+
for (const monitorId of monitorIds) {
|
|
442
|
+
// A bulk delete can touch the same monitor many times over.
|
|
443
|
+
if (refreshedMonitorIds.has(monitorId.toString())) {
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
refreshedMonitorIds.add(monitorId.toString());
|
|
448
|
+
|
|
449
|
+
await this.refreshMonitorStatusSafely(monitorId);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return onDelete;
|
|
453
|
+
}
|
|
454
|
+
|
|
365
455
|
/*
|
|
366
456
|
* Refresh a single monitor's aggregate probe status without letting a
|
|
367
457
|
* failure bubble up. These refreshes run in post-commit hooks
|
|
368
|
-
* (onCreateSuccess / onUpdateSuccess) after the
|
|
369
|
-
* persisted, so a status-refresh error must not
|
|
370
|
-
* a 500 for the user — log it instead.
|
|
458
|
+
* (onCreateSuccess / onUpdateSuccess / onDeleteSuccess) after the
|
|
459
|
+
* MonitorProbe row is already persisted, so a status-refresh error must not
|
|
460
|
+
* turn a successful save into a 500 for the user — log it instead.
|
|
371
461
|
*/
|
|
372
462
|
private async refreshMonitorStatusSafely(monitorId: ObjectID): Promise<void> {
|
|
373
463
|
try {
|