@oneuptime/common 12.0.15 → 12.0.17
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/Index.ts +10 -0
- package/Models/AnalyticsModels/LogCountBaseline.ts +174 -0
- package/Models/AnalyticsModels/SecurityEvent.ts +794 -0
- package/Models/AnalyticsModels/Span.ts +29 -1
- package/Models/AnalyticsModels/SpanCountBaseline.ts +198 -0
- package/Models/DatabaseModels/Alert.ts +42 -0
- package/Models/DatabaseModels/AlertMeasurement.ts +1114 -0
- package/Models/DatabaseModels/AlertMeasurementValue.ts +501 -0
- package/Models/DatabaseModels/AlertStateTimeline.ts +10 -2
- package/Models/DatabaseModels/BillingPaymentMethod.ts +8 -10
- package/Models/DatabaseModels/DetectionRule.ts +568 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +382 -0
- package/Models/DatabaseModels/Incident.ts +42 -0
- package/Models/DatabaseModels/IncidentMeasurement.ts +1114 -0
- package/Models/DatabaseModels/IncidentMeasurementValue.ts +501 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +10 -2
- package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +36 -0
- package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +42 -0
- package/Models/DatabaseModels/Index.ts +20 -0
- package/Models/DatabaseModels/Label.ts +11 -0
- package/Models/DatabaseModels/LlmCostBudget.ts +655 -0
- package/Models/DatabaseModels/LlmModelPrice.ts +481 -0
- package/Models/DatabaseModels/LogSavedView.ts +87 -0
- package/Models/DatabaseModels/MarketingConversion.ts +210 -8
- package/Models/DatabaseModels/MetricSavedView.ts +59 -0
- package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +36 -0
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +42 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +36 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +42 -0
- package/Models/DatabaseModels/Probe.ts +21 -0
- package/Models/DatabaseModels/RunbookLabelRule.ts +36 -0
- package/Models/DatabaseModels/RunbookOwnerRule.ts +42 -0
- package/Models/DatabaseModels/ScheduledMaintenanceMeasurement.ts +1104 -0
- package/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.ts +491 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +10 -2
- package/Models/DatabaseModels/StatusPageLabelRule.ts +36 -0
- package/Models/DatabaseModels/StatusPageOwnerRule.ts +42 -0
- package/Models/DatabaseModels/TableView.ts +15 -0
- package/Models/DatabaseModels/Team.ts +13 -0
- package/Models/DatabaseModels/TeamMember.ts +8 -0
- package/Models/DatabaseModels/TraceSavedView.ts +52 -0
- package/Models/DatabaseModels/WorkflowLabelRule.ts +36 -0
- package/Models/DatabaseModels/WorkflowOwnerRule.ts +42 -0
- package/Server/API/TelemetryAPI.ts +252 -6
- package/Server/API/UserAPI.ts +88 -0
- package/Server/EnvironmentConfig.ts +36 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.ts +88 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.ts +457 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.ts +105 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.ts +77 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788600000000-AddDetectionRuleIncidentColumns.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Middleware/IdentityRateLimit.ts +672 -0
- package/Server/Services/AccessTokenService.ts +15 -2
- package/Server/Services/AlertMeasurementService.ts +302 -0
- package/Server/Services/AlertMeasurementValueService.ts +508 -0
- package/Server/Services/AlertService.ts +50 -0
- package/Server/Services/AlertStateTimelineService.ts +54 -0
- package/Server/Services/DetectionRuleService.ts +74 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +89 -0
- package/Server/Services/IncidentMeasurementService.ts +304 -0
- package/Server/Services/IncidentMeasurementValueService.ts +523 -0
- package/Server/Services/IncidentService.ts +51 -0
- package/Server/Services/IncidentStateTimelineService.ts +54 -0
- package/Server/Services/Index.ts +30 -0
- package/Server/Services/LlmCostBudgetService.ts +93 -0
- package/Server/Services/LlmModelPriceService.ts +202 -0
- package/Server/Services/LogAggregationService.ts +1106 -2
- package/Server/Services/LogCountBaselineService.ts +163 -0
- package/Server/Services/MutableMetricService.ts +30 -9
- package/Server/Services/ScheduledMaintenanceMeasurementService.ts +311 -0
- package/Server/Services/ScheduledMaintenanceMeasurementValueService.ts +546 -0
- package/Server/Services/ScheduledMaintenanceService.ts +53 -0
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +188 -1
- package/Server/Services/SecurityEventService.ts +104 -0
- package/Server/Services/SpanCountBaselineService.ts +173 -0
- package/Server/Services/StatusPageService.ts +4 -3
- package/Server/Services/TelemetryUsageBillingService.ts +17 -2
- package/Server/Services/UserService.ts +284 -51
- package/Server/Services/UserTotpAuthService.ts +27 -86
- package/Server/Services/UserWebAuthnService.ts +26 -86
- package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +14 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +10 -0
- package/Server/Types/Database/QueryHelper.ts +1 -1
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/Toolbox/Index.ts +6 -0
- package/Server/Utils/AI/Toolbox/SecurityEventTools.ts +349 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -4
- package/Server/Utils/Attribution.ts +130 -34
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +98 -16
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +70 -7
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +54 -16
- package/Server/Utils/Marketing/Providers/Meta.ts +52 -18
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +37 -10
- package/Server/Utils/Marketing/Providers/Reddit.ts +45 -15
- package/Server/Utils/Measurement/MeasurementDefinitionValidator.ts +209 -0
- package/Server/Utils/Measurement/MeasurementMetricWriter.ts +189 -0
- package/Server/Utils/Monitor/Criteria/CountAnomaly.ts +182 -0
- package/Server/Utils/Monitor/Criteria/LogMonitorCriteria.ts +132 -0
- package/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.ts +35 -0
- package/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.ts +132 -0
- package/Server/Utils/Monitor/DataToProcess.ts +2 -0
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +15 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +20 -0
- package/Server/Utils/Monitor/MonitorResource.ts +16 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +1 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +805 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +262 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +212 -0
- package/Server/Utils/SecurityEvent/SecurityEventRow.ts +101 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +635 -0
- package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +379 -0
- package/Server/Utils/Telemetry/LlmSpan.ts +83 -4
- package/Server/Utils/Telemetry/LogErrorPatternSql.ts +136 -0
- package/Server/Utils/UserPermission/UserPermission.ts +57 -1
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +4 -0
- package/Tests/App/Dashboard/CreatePageEntryPointPermissions.test.tsx +306 -0
- package/Tests/App/Dashboard/DangerZone.test.tsx +11 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +4 -0
- package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +459 -0
- package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +24 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +6 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +250 -0
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +106 -0
- package/Tests/App/Dashboard/SecurityEventsMonitorsPage.test.tsx +185 -0
- package/Tests/App/Dashboard/SecurityEventsSetupGuide.test.tsx +200 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +323 -0
- package/Tests/Models/DatabaseModels/ProjectSharedResources.test.ts +386 -0
- package/Tests/Models/DetectionRuleCreateContract.test.ts +35 -0
- package/Tests/Server/API/LogErrorPatternAPI.test.ts +811 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +11 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +11 -2
- package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +918 -0
- package/Tests/Server/Infrastructure/LocalCache.test.ts +149 -0
- package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +249 -0
- package/Tests/Server/Services/AlertMeasurementService.test.ts +665 -0
- package/Tests/Server/Services/AlertMeasurementValueService.test.ts +389 -0
- package/Tests/Server/Services/DetectionRuleService.test.ts +254 -0
- package/Tests/Server/Services/IncidentMeasurementService.test.ts +394 -0
- package/Tests/Server/Services/IncidentMeasurementValueService.test.ts +816 -0
- package/Tests/Server/Services/LlmCostBudgetService.test.ts +104 -0
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +405 -0
- package/Tests/Server/Services/LogErrorPatternAggregation.test.ts +804 -0
- package/Tests/Server/Services/MutableMetricNameRouting.test.ts +83 -0
- package/Tests/Server/Services/ScheduledMaintenanceMeasurementService.test.ts +750 -0
- package/Tests/Server/Services/ScheduledMaintenanceMeasurementValueService.test.ts +478 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +216 -4
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +1190 -0
- package/Tests/Server/Types/Database/Permissions/ScopedRoleSharedResourceAccess.test.ts +466 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +265 -0
- package/Tests/Server/Types/Database/QueryHelperTextAndStructuralOperators.test.ts +206 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +6 -0
- package/Tests/Server/Utils/AnalyticsDatabase/FractionalAttributeThreshold.test.ts +224 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +172 -2
- package/Tests/Server/Utils/Attribution.test.ts +228 -1
- package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +153 -92
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +123 -6
- package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +253 -1
- package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +282 -0
- package/Tests/Server/Utils/Marketing/Meta.test.ts +304 -0
- package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +263 -0
- package/Tests/Server/Utils/Marketing/Reddit.test.ts +259 -0
- package/Tests/Server/Utils/Measurement/MeasurementDefinitionValidator.test.ts +322 -0
- package/Tests/Server/Utils/Measurement/MeasurementMetricWriter.test.ts +373 -0
- package/Tests/Server/Utils/Monitor/Criteria/CountAnomaly.test.ts +221 -0
- package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.test.ts +147 -0
- package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +274 -0
- package/Tests/Server/Utils/Monitor/SecurityEventsMonitorDataExtractor.test.ts +93 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +1098 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +308 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +271 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventRow.test.ts +272 -0
- package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +511 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +497 -0
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +380 -0
- package/Tests/Server/Utils/Telemetry/LogErrorPatternSql.test.ts +207 -0
- package/Tests/Server/Utils/UserPermission/ProjectUserGrant.test.ts +293 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +194 -0
- package/Tests/Types/Monitor/MonitorStepSecurityEventsMonitor.test.ts +201 -0
- package/Tests/Types/SecurityEvent/OcsfEventClass.test.ts +105 -0
- package/Tests/Types/SecurityEvent/OcsfSeverity.test.ts +111 -0
- package/Tests/Types/Telemetry/LlmCostCatalog.test.ts +516 -0
- package/Tests/UI/Components/ActiveFilterChipsOperatorValues.test.tsx +222 -0
- package/Tests/UI/Components/BulkActionPermissionGating.test.tsx +296 -0
- package/Tests/UI/Components/CardModelDetailPermissionGating.test.tsx +305 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +23 -0
- package/Tests/UI/Components/DictionaryFilterOperatorDisplay.test.ts +239 -0
- package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +267 -0
- package/Tests/UI/Components/DuplicateModel.test.tsx +37 -0
- package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +348 -0
- package/Tests/UI/Components/ModelDelete.test.tsx +25 -1
- package/Tests/UI/Components/ModelFormCreatePermission.test.tsx +342 -0
- package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +680 -0
- package/Tests/UI/Components/OrderedStatesListCreateGate.test.tsx +174 -0
- package/Tests/UI/Components/SavedViewsDropdownSearch.test.tsx +1127 -0
- package/Tests/UI/Components/SavedViewsFacetSection.test.tsx +958 -0
- package/Tests/UI/Components/SavedViewsList.test.ts +699 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +640 -0
- package/Tests/UI/Components/SavedViewsSurfaceParity.test.tsx +679 -0
- package/Tests/UI/Components/TableViewLoadFailure.test.tsx +248 -0
- package/Tests/UI/Types/UseComponentOutsideClick.test.tsx +226 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +467 -0
- package/Tests/Utils/Measurement/MeasurementEvaluator.test.ts +639 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +285 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +433 -0
- package/Tests/Utils/SecurityEvent/GenericNormalizer.test.ts +204 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +252 -0
- package/Tests/Utils/SecurityEvent/NormalizerHelpers.test.ts +274 -0
- package/Tests/Utils/SecurityEvent/OcsfNormalizer.test.ts +208 -0
- package/Tests/Utils/SecurityEvent/SecurityEventNormalizer.test.ts +172 -0
- package/Tests/Utils/SecurityEvent/SigmaRuleParser.test.ts +471 -0
- package/Tests/Utils/SecurityEvent/UdmNormalizer.test.ts +361 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +82 -0
- package/Tests/Utils/Telemetry/LogErrorPattern.test.ts +463 -0
- package/Types/AI/AIChatTypes.ts +1 -0
- package/Types/Alerts/AlertMeasurementAnchorType.ts +14 -0
- package/Types/Alerts/AlertStateRole.ts +11 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
- package/Types/Dashboard/Chart/ChartType.ts +1 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.ts +18 -0
- package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.ts +16 -0
- package/Types/Incident/IncidentMeasurementAnchorType.ts +34 -0
- package/Types/Incident/IncidentStateRole.ts +14 -0
- package/Types/Marketing/Attribution.ts +75 -0
- package/Types/Marketing/MarketingConversion.ts +37 -7
- package/Types/Measurement/MeasurementAggregationType.ts +43 -0
- package/Types/Measurement/MeasurementAnchorKind.ts +23 -0
- package/Types/Measurement/MeasurementOccurrence.ts +14 -0
- package/Types/Measurement/MeasurementStatus.ts +34 -0
- package/Types/MeteredPlan/ProductType.ts +1 -0
- package/Types/Monitor/CriteriaFilter.ts +3 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +64 -0
- package/Types/Monitor/MonitorStep.ts +28 -0
- package/Types/Monitor/MonitorStepSecurityEventsMonitor.ts +100 -0
- package/Types/Monitor/MonitorType.ts +20 -0
- package/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.ts +17 -0
- package/Types/Permission.ts +399 -2
- package/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.ts +20 -0
- package/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.ts +16 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +24 -0
- package/Types/SecurityEvent/NormalizedSecurityEvent.ts +92 -0
- package/Types/SecurityEvent/OcsfEventClass.ts +205 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +88 -0
- package/Types/SecurityEvent/SecurityEventFormat.ts +23 -0
- package/Types/SecurityEvent/SigmaRule.ts +70 -0
- package/Types/Telemetry/LlmConventions.ts +20 -1
- package/Types/Telemetry/LlmCostCatalog.ts +557 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Types/Telemetry/TelemetryRetentionConfig.ts +5 -1
- package/Types/Telemetry/TelemetryType.ts +1 -0
- package/Types/TwoFactorAuthStatus.ts +42 -0
- package/Types/UserAuthenticationStatus.ts +18 -0
- package/UI/Components/ActionButton/ActionButtonSchema.ts +7 -0
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +35 -2
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +34 -1
- package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +45 -1
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +3 -0
- package/UI/Components/Button/Button.tsx +37 -2
- package/UI/Components/Card/Card.tsx +6 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +24 -1
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +57 -0
- package/UI/Components/DuplicateModel/DuplicateModel.tsx +16 -0
- package/UI/Components/Forms/ModelForm.tsx +54 -2
- package/UI/Components/List/ListRow.tsx +6 -0
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +34 -7
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +7 -40
- package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +155 -3
- package/UI/Components/ModelDelete/ModelDelete.tsx +20 -0
- package/UI/Components/ModelDetail/CardModelDetail.tsx +36 -23
- package/UI/Components/ModelList/ModelList.tsx +21 -2
- package/UI/Components/ModelList/StaticModelList.tsx +11 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +168 -62
- package/UI/Components/ModelTable/ModelTable.tsx +16 -10
- package/UI/Components/ModelTable/TableView.tsx +36 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +36 -4
- package/UI/Components/OrderedStatesList/Item.tsx +6 -0
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +81 -47
- package/UI/Components/ResetObjectID/ResetObjectID.tsx +16 -0
- package/UI/Components/SavedViews/SavedViewsFacetSection.tsx +242 -0
- package/UI/Components/SavedViews/SavedViewsList.ts +168 -0
- package/UI/Components/SavedViews/SavedViewsSearchInput.tsx +46 -0
- package/UI/Components/SavedViews/SavedViewsShowMoreButton.tsx +44 -0
- package/UI/Components/Table/TableRow.tsx +12 -0
- package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +152 -2
- package/UI/Types/UseComponentOutsideClick.ts +47 -0
- package/UI/Utils/PermissionGate.ts +277 -0
- package/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.ts +84 -0
- package/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.ts +110 -0
- package/Utils/Dashboard/Components/Index.ts +14 -0
- package/Utils/Measurement/MeasurementEvaluator.ts +359 -0
- package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +1 -0
- package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +93 -11
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +231 -0
- package/Utils/SecurityEvent/GenericNormalizer.ts +208 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +206 -0
- package/Utils/SecurityEvent/NormalizerHelpers.ts +263 -0
- package/Utils/SecurityEvent/OcsfNormalizer.ts +194 -0
- package/Utils/SecurityEvent/SecurityEventNormalizer.ts +82 -0
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +579 -0
- package/Utils/SecurityEvent/UdmNormalizer.ts +442 -0
- package/Utils/Telemetry/CrossSignalScope.ts +46 -9
- package/Utils/Telemetry/LogErrorPattern.ts +350 -0
- package/build/dist/Models/AnalyticsModels/Index.js +10 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/LogCountBaseline.js +159 -0
- package/build/dist/Models/AnalyticsModels/LogCountBaseline.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +596 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/Span.js +24 -1
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js +181 -0
- package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Alert.js +43 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertMeasurement.js +1143 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js +523 -0
- package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js +10 -11
- package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +598 -0
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +410 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +43 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentMeasurement.js +1143 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js +523 -0
- package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +20 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Label.js +11 -0
- package/build/dist/Models/DatabaseModels/Label.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LlmCostBudget.js +681 -0
- package/build/dist/Models/DatabaseModels/LlmCostBudget.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LlmModelPrice.js +503 -0
- package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js +87 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +224 -8
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricSavedView.js +59 -0
- package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Probe.js +21 -0
- package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js +1133 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js +515 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +9 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TableView.js +15 -0
- package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Team.js +13 -0
- package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +8 -0
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceSavedView.js +52 -0
- package/build/dist/Models/DatabaseModels/TraceSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +36 -0
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +42 -0
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +136 -0
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +75 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +29 -1
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js +162 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js +52 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788600000000-AddDetectionRuleIncidentColumns.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788600000000-AddDetectionRuleIncidentColumns.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/Middleware/IdentityRateLimit.js +491 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AccessTokenService.js +13 -2
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertMeasurementService.js +250 -0
- package/build/dist/Server/Services/AlertMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/AlertMeasurementValueService.js +400 -0
- package/build/dist/Server/Services/AlertMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +37 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +48 -0
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +50 -0
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +55 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -0
- package/build/dist/Server/Services/IncidentMeasurementService.js +252 -0
- package/build/dist/Server/Services/IncidentMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/IncidentMeasurementValueService.js +413 -0
- package/build/dist/Server/Services/IncidentMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/IncidentService.js +41 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +50 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +30 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LlmCostBudgetService.js +89 -0
- package/build/dist/Server/Services/LlmCostBudgetService.js.map +1 -0
- package/build/dist/Server/Services/LlmModelPriceService.js +163 -0
- package/build/dist/Server/Services/LlmModelPriceService.js.map +1 -0
- package/build/dist/Server/Services/LogAggregationService.js +709 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogCountBaselineService.js +112 -0
- package/build/dist/Server/Services/LogCountBaselineService.js.map +1 -0
- package/build/dist/Server/Services/MutableMetricService.js +28 -9
- package/build/dist/Server/Services/MutableMetricService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js +254 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js +434 -0
- package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js.map +1 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +37 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +134 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventService.js +64 -0
- package/build/dist/Server/Services/SecurityEventService.js.map +1 -0
- package/build/dist/Server/Services/SpanCountBaselineService.js +122 -0
- package/build/dist/Server/Services/SpanCountBaselineService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageService.js +4 -3
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +15 -3
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +262 -42
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTotpAuthService.js +0 -73
- package/build/dist/Server/Services/UserTotpAuthService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +1 -73
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +13 -0
- package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.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 +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +3 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js +257 -0
- package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -4
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js +77 -33
- package/build/dist/Server/Utils/Attribution.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +46 -9
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +52 -8
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +41 -17
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +42 -18
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +24 -11
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +34 -15
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
- package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js +109 -0
- package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js.map +1 -0
- package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js +131 -0
- package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js +111 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js +84 -1
- package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js +35 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js +84 -1
- package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.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 +12 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +10 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +6 -5
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +600 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +145 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +176 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js +69 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +317 -0
- package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +56 -4
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js +112 -0
- package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js.map +1 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +46 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +1 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js +15 -0
- package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/Alerts/AlertStateRole.js +12 -0
- package/build/dist/Types/Alerts/AlertStateRole.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/Dashboard/Chart/ChartType.js +1 -0
- package/build/dist/Types/Dashboard/Chart/ChartType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js.map +1 -0
- package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js +29 -0
- package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/Incident/IncidentStateRole.js +15 -0
- package/build/dist/Types/Incident/IncidentStateRole.js.map +1 -0
- package/build/dist/Types/Marketing/Attribution.js +68 -0
- package/build/dist/Types/Marketing/Attribution.js.map +1 -0
- package/build/dist/Types/Marketing/MarketingConversion.js +36 -7
- package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
- package/build/dist/Types/Measurement/MeasurementAggregationType.js +40 -0
- package/build/dist/Types/Measurement/MeasurementAggregationType.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementAnchorKind.js +22 -0
- package/build/dist/Types/Measurement/MeasurementAnchorKind.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementOccurrence.js +15 -0
- package/build/dist/Types/Measurement/MeasurementOccurrence.js.map +1 -0
- package/build/dist/Types/Measurement/MeasurementStatus.js +32 -0
- package/build/dist/Types/Measurement/MeasurementStatus.js.map +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
- package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +2 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +59 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +17 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js +64 -0
- package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +19 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js +2 -0
- package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js.map +1 -0
- package/build/dist/Types/Permission.js +347 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js +19 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js.map +1 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js +17 -0
- package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js.map +1 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +18 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -0
- package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js +2 -0
- package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js.map +1 -0
- package/build/dist/Types/SecurityEvent/OcsfEventClass.js +181 -0
- package/build/dist/Types/SecurityEvent/OcsfEventClass.js.map +1 -0
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +81 -0
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -0
- package/build/dist/Types/SecurityEvent/SecurityEventFormat.js +21 -0
- package/build/dist/Types/SecurityEvent/SecurityEventFormat.js.map +1 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js +16 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -0
- package/build/dist/Types/Telemetry/LlmConventions.js +19 -1
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmCostCatalog.js +484 -0
- package/build/dist/Types/Telemetry/LlmCostCatalog.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryType.js +1 -0
- package/build/dist/Types/Telemetry/TelemetryType.js.map +1 -1
- package/build/dist/Types/TwoFactorAuthStatus.js +41 -0
- package/build/dist/Types/TwoFactorAuthStatus.js.map +1 -0
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +16 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +15 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +20 -1
- package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -1
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +14 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +47 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js +8 -0
- package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +40 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/List/ListRow.js +4 -1
- package/build/dist/UI/Components/List/ListRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +32 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +2 -17
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +93 -4
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js +13 -0
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +27 -11
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +13 -2
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelList/StaticModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/StaticModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +101 -40
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +9 -7
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +32 -4
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +19 -2
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js +4 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +33 -32
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +8 -0
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
- package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js +98 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsList.js +99 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsList.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js +17 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js.map +1 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js +15 -0
- package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +8 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +93 -4
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Types/UseComponentOutsideClick.js +39 -0
- package/build/dist/UI/Types/UseComponentOutsideClick.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +164 -0
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js +70 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js +92 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Measurement/MeasurementEvaluator.js +210 -0
- package/build/dist/Utils/Measurement/MeasurementEvaluator.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +1 -0
- package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +51 -10
- package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +108 -0
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GenericNormalizer.js +176 -0
- package/build/dist/Utils/SecurityEvent/GenericNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +146 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js +196 -0
- package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js +136 -0
- package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js +64 -0
- package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +388 -0
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/UdmNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/UdmNormalizer.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +29 -7
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/LogErrorPattern.js +284 -0
- package/build/dist/Utils/Telemetry/LogErrorPattern.js.map +1 -0
- package/package.json +3 -1
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import axios, { AxiosResponse } from "axios";
|
|
2
|
-
import crypto from "crypto";
|
|
3
2
|
import {
|
|
4
3
|
RedditAdsAccountId,
|
|
5
4
|
RedditAdsOAuthClientId,
|
|
@@ -8,9 +7,11 @@ import {
|
|
|
8
7
|
} from "../../../EnvironmentConfig";
|
|
9
8
|
import ConversionUploadProvider, {
|
|
10
9
|
ConversionSkip,
|
|
10
|
+
ConversionTypeMapping,
|
|
11
11
|
ConversionUploadBatchResult,
|
|
12
12
|
} from "../ConversionUploadProvider";
|
|
13
13
|
import { JSONObject } from "../../../../Types/JSON";
|
|
14
|
+
import { MarketingConversionType } from "../../../../Types/Marketing/MarketingConversion";
|
|
14
15
|
import MarketingConversion from "../../../../Models/DatabaseModels/MarketingConversion";
|
|
15
16
|
|
|
16
17
|
const REQUEST_TIMEOUT_MS: number = 30000;
|
|
@@ -21,9 +22,10 @@ const REDDIT_MAX_EVENT_AGE_IN_DAYS: number = 7;
|
|
|
21
22
|
/*
|
|
22
23
|
* Reddit Conversions API
|
|
23
24
|
* (ads-api.reddit.com/api/v2.0/conversions/events/{accountId}) using the
|
|
24
|
-
* rdt_cid click id
|
|
25
|
-
*
|
|
26
|
-
* basic auth against
|
|
25
|
+
* rdt_cid click id or a SHA-256 email, whichever the conversion carries.
|
|
26
|
+
* conversion_id (the conversion row id) makes retried uploads idempotent on
|
|
27
|
+
* Reddit's side. OAuth2 refresh-token flow with HTTP basic auth against
|
|
28
|
+
* reddit.com.
|
|
27
29
|
*/
|
|
28
30
|
export default class RedditProvider extends ConversionUploadProvider {
|
|
29
31
|
public override readonly key: string = "reddit";
|
|
@@ -44,9 +46,19 @@ export default class RedditProvider extends ConversionUploadProvider {
|
|
|
44
46
|
protected override getProviderSkipReason(
|
|
45
47
|
conversion: MarketingConversion,
|
|
46
48
|
): ConversionSkip | null {
|
|
47
|
-
if (
|
|
49
|
+
if (
|
|
50
|
+
!this.getClickId(conversion, "rdt_cid") &&
|
|
51
|
+
!this.getHashedEmail(conversion)
|
|
52
|
+
) {
|
|
48
53
|
return {
|
|
49
|
-
reason: "No Reddit click id (rdt_cid)",
|
|
54
|
+
reason: "No Reddit click id (rdt_cid) and no email to match on",
|
|
55
|
+
isPermanent: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!this.getTrackingType(conversion)) {
|
|
60
|
+
return {
|
|
61
|
+
reason: "No Reddit tracking type mapped for this conversion type",
|
|
50
62
|
isPermanent: true,
|
|
51
63
|
};
|
|
52
64
|
}
|
|
@@ -61,11 +73,19 @@ export default class RedditProvider extends ConversionUploadProvider {
|
|
|
61
73
|
return null;
|
|
62
74
|
}
|
|
63
75
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
76
|
+
/*
|
|
77
|
+
* Reddit standard tracking types. A booked meeting is `Lead`: Reddit has no
|
|
78
|
+
* distinct "meeting booked" type, and reporting it as Purchase would put a
|
|
79
|
+
* demo into the same optimisation pool as revenue.
|
|
80
|
+
*/
|
|
81
|
+
private getTrackingType(conversion: MarketingConversion): string | undefined {
|
|
82
|
+
const mapping: ConversionTypeMapping<string> = {
|
|
83
|
+
[MarketingConversionType.SignUp]: "SignUp",
|
|
84
|
+
[MarketingConversionType.MeetingBooked]: "Lead",
|
|
85
|
+
[MarketingConversionType.PaidSubscription]: "Purchase",
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
return this.resolveByConversionType(conversion, mapping);
|
|
69
89
|
}
|
|
70
90
|
|
|
71
91
|
private async getAccessToken(): Promise<string> {
|
|
@@ -136,16 +156,26 @@ export default class RedditProvider extends ConversionUploadProvider {
|
|
|
136
156
|
|
|
137
157
|
const payload: JSONObject = {
|
|
138
158
|
event_at: eventAt.toISOString(),
|
|
139
|
-
click_id: this.getClickId(conversion, "rdt_cid") || "",
|
|
140
159
|
event_type: {
|
|
141
|
-
tracking_type: this.
|
|
160
|
+
tracking_type: this.getTrackingType(conversion) || "Lead",
|
|
142
161
|
},
|
|
143
162
|
event_metadata: eventMetadata,
|
|
144
163
|
};
|
|
145
164
|
|
|
146
|
-
|
|
165
|
+
const clickId: string | undefined = this.getClickId(
|
|
166
|
+
conversion,
|
|
167
|
+
"rdt_cid",
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
if (clickId) {
|
|
171
|
+
payload["click_id"] = clickId;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const hashedEmail: string | undefined = this.getHashedEmail(conversion);
|
|
175
|
+
|
|
176
|
+
if (hashedEmail) {
|
|
147
177
|
payload["user"] = {
|
|
148
|
-
email:
|
|
178
|
+
email: hashedEmail,
|
|
149
179
|
};
|
|
150
180
|
}
|
|
151
181
|
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
2
|
+
import MeasurementOccurrence from "../../../Types/Measurement/MeasurementOccurrence";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Validation shared by the incident, alert and scheduled maintenance
|
|
6
|
+
* measurement services.
|
|
7
|
+
*
|
|
8
|
+
* Every rule here exists to stop a definition that would silently produce a
|
|
9
|
+
* confidently wrong number -- a constant zero, or a duration that can never
|
|
10
|
+
* complete with nothing anywhere saying so.
|
|
11
|
+
*/
|
|
12
|
+
export default class MeasurementDefinitionValidator {
|
|
13
|
+
/*
|
|
14
|
+
* The key becomes part of the metric name, which lands in ClickHouse, in
|
|
15
|
+
* the dashboard chart picker and in the API. It is immutable after
|
|
16
|
+
* creation, so it is worth rejecting a bad one loudly at the only moment
|
|
17
|
+
* it can still be changed.
|
|
18
|
+
*/
|
|
19
|
+
public static readonly KEY_PATTERN: RegExp = /^[a-z0-9][a-z0-9-]{0,49}$/;
|
|
20
|
+
|
|
21
|
+
public static validateKey(key: string | undefined): void {
|
|
22
|
+
if (!key) {
|
|
23
|
+
throw new BadDataException(
|
|
24
|
+
"A measurement needs a key. Use lowercase letters, numbers and hyphens, for example: time-to-detect",
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!MeasurementDefinitionValidator.KEY_PATTERN.test(key)) {
|
|
29
|
+
throw new BadDataException(
|
|
30
|
+
`"${key}" is not a valid measurement key. Keys start with a lowercase letter or number, contain only lowercase letters, numbers and hyphens, and are at most 50 characters. For example: time-to-detect`,
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public static validateAnchorPair(data: {
|
|
36
|
+
startAnchorType?: string | undefined;
|
|
37
|
+
endAnchorType?: string | undefined;
|
|
38
|
+
stateEnteredAnchor: string;
|
|
39
|
+
stateRoleEnteredAnchor: string;
|
|
40
|
+
/*
|
|
41
|
+
* Maps each timestamp anchor type onto the column it actually reads.
|
|
42
|
+
* Several anchors are aliases -- an alert's "Timeline Start" and
|
|
43
|
+
* "Created At" are both createdAt -- so comparing the enum values alone
|
|
44
|
+
* would wave through a definition that is a constant zero by
|
|
45
|
+
* construction.
|
|
46
|
+
*/
|
|
47
|
+
timestampAnchorSources?: Record<string, string> | undefined;
|
|
48
|
+
startStateId?: string | undefined;
|
|
49
|
+
endStateId?: string | undefined;
|
|
50
|
+
startStateRole?: string | undefined;
|
|
51
|
+
endStateRole?: string | undefined;
|
|
52
|
+
startOccurrence?: string | undefined;
|
|
53
|
+
endOccurrence?: string | undefined;
|
|
54
|
+
}): void {
|
|
55
|
+
if (!data.startAnchorType) {
|
|
56
|
+
throw new BadDataException("A measurement needs a starting point.");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!data.endAnchorType) {
|
|
60
|
+
throw new BadDataException("A measurement needs an ending point.");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (
|
|
64
|
+
data.startAnchorType === data.stateEnteredAnchor &&
|
|
65
|
+
!data.startStateId
|
|
66
|
+
) {
|
|
67
|
+
throw new BadDataException(
|
|
68
|
+
"Pick the state this measurement starts from.",
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (data.endAnchorType === data.stateEnteredAnchor && !data.endStateId) {
|
|
73
|
+
throw new BadDataException("Pick the state this measurement ends at.");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (
|
|
77
|
+
data.startAnchorType === data.stateRoleEnteredAnchor &&
|
|
78
|
+
!data.startStateRole
|
|
79
|
+
) {
|
|
80
|
+
throw new BadDataException(
|
|
81
|
+
"Pick the kind of state this measurement starts from.",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (
|
|
86
|
+
data.endAnchorType === data.stateRoleEnteredAnchor &&
|
|
87
|
+
!data.endStateRole
|
|
88
|
+
) {
|
|
89
|
+
throw new BadDataException(
|
|
90
|
+
"Pick the kind of state this measurement ends at.",
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
MeasurementDefinitionValidator.rejectIdenticalAnchors(data);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/*
|
|
98
|
+
* Two identical endpoints always measure zero. Shipping that produces a
|
|
99
|
+
* chart that reads "we do this instantly" on every incident -- which is
|
|
100
|
+
* strictly worse than having no chart, because it looks like an answer.
|
|
101
|
+
*/
|
|
102
|
+
private static rejectIdenticalAnchors(data: {
|
|
103
|
+
startAnchorType?: string | undefined;
|
|
104
|
+
endAnchorType?: string | undefined;
|
|
105
|
+
stateEnteredAnchor: string;
|
|
106
|
+
stateRoleEnteredAnchor: string;
|
|
107
|
+
timestampAnchorSources?: Record<string, string> | undefined;
|
|
108
|
+
startStateId?: string | undefined;
|
|
109
|
+
endStateId?: string | undefined;
|
|
110
|
+
startStateRole?: string | undefined;
|
|
111
|
+
endStateRole?: string | undefined;
|
|
112
|
+
startOccurrence?: string | undefined;
|
|
113
|
+
endOccurrence?: string | undefined;
|
|
114
|
+
}): void {
|
|
115
|
+
const startSource: string =
|
|
116
|
+
MeasurementDefinitionValidator.resolveAnchorSource(
|
|
117
|
+
data.startAnchorType,
|
|
118
|
+
data.timestampAnchorSources,
|
|
119
|
+
);
|
|
120
|
+
const endSource: string =
|
|
121
|
+
MeasurementDefinitionValidator.resolveAnchorSource(
|
|
122
|
+
data.endAnchorType,
|
|
123
|
+
data.timestampAnchorSources,
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
if (startSource !== endSource) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const startOccurrence: string =
|
|
131
|
+
data.startOccurrence || MeasurementOccurrence.First;
|
|
132
|
+
const endOccurrence: string =
|
|
133
|
+
data.endOccurrence || MeasurementOccurrence.First;
|
|
134
|
+
|
|
135
|
+
if (data.startAnchorType === data.stateEnteredAnchor) {
|
|
136
|
+
if (
|
|
137
|
+
data.startStateId === data.endStateId &&
|
|
138
|
+
startOccurrence === endOccurrence
|
|
139
|
+
) {
|
|
140
|
+
throw new BadDataException(
|
|
141
|
+
"This measurement starts and ends at the same point, so it would always be zero. Pick two different points.",
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (data.startAnchorType === data.stateRoleEnteredAnchor) {
|
|
149
|
+
if (
|
|
150
|
+
data.startStateRole === data.endStateRole &&
|
|
151
|
+
startOccurrence === endOccurrence
|
|
152
|
+
) {
|
|
153
|
+
throw new BadDataException(
|
|
154
|
+
"This measurement starts and ends at the same point, so it would always be zero. Pick two different points.",
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Two identical timestamp anchors. Always zero, no exceptions.
|
|
162
|
+
throw new BadDataException(
|
|
163
|
+
"This measurement starts and ends at the same point, so it would always be zero. Pick two different points.",
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* The column an anchor reads, so two differently-named anchors that read
|
|
169
|
+
* the same column are recognised as the same point in time.
|
|
170
|
+
*/
|
|
171
|
+
private static resolveAnchorSource(
|
|
172
|
+
anchorType: string | undefined,
|
|
173
|
+
sources: Record<string, string> | undefined,
|
|
174
|
+
): string {
|
|
175
|
+
if (!anchorType) {
|
|
176
|
+
return "";
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return sources?.[anchorType] || anchorType;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/*
|
|
183
|
+
* States are entered in strictly increasing order, so an end state ordered
|
|
184
|
+
* at or before the start state describes a duration that can never
|
|
185
|
+
* complete. Without this the definition looks fine and every incident
|
|
186
|
+
* reports "not applicable" forever.
|
|
187
|
+
*/
|
|
188
|
+
public static validateStateOrder(data: {
|
|
189
|
+
startStateName?: string | undefined;
|
|
190
|
+
startStateOrder?: number | undefined;
|
|
191
|
+
endStateName?: string | undefined;
|
|
192
|
+
endStateOrder?: number | undefined;
|
|
193
|
+
}): void {
|
|
194
|
+
if (
|
|
195
|
+
data.startStateOrder === undefined ||
|
|
196
|
+
data.endStateOrder === undefined
|
|
197
|
+
) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (data.endStateOrder > data.startStateOrder) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
throw new BadDataException(
|
|
206
|
+
`"${data.endStateName}" comes before "${data.startStateName}" in this project's state order, so this measurement could never complete. Swap the two, or pick a later ending state.`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import MetricType from "../../../Models/DatabaseModels/MetricType";
|
|
2
|
+
import MutableMetric from "../../../Models/AnalyticsModels/MutableMetric";
|
|
3
|
+
import { MetricPointType } from "../../../Models/AnalyticsModels/Metric";
|
|
4
|
+
import GlobalConfigService from "../../Services/GlobalConfigService";
|
|
5
|
+
import MutableMetricService from "../../Services/MutableMetricService";
|
|
6
|
+
import GlobalConfig from "../../../Models/DatabaseModels/GlobalConfig";
|
|
7
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
8
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
9
|
+
import ServiceType from "../../../Types/Telemetry/ServiceType";
|
|
10
|
+
import TelemetryUtil from "../Telemetry/Telemetry";
|
|
11
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
12
|
+
import logger from "../Logger";
|
|
13
|
+
|
|
14
|
+
export interface MeasurementMetricPoint {
|
|
15
|
+
metricName: string;
|
|
16
|
+
measurementId: string;
|
|
17
|
+
measurementKey: string;
|
|
18
|
+
measurementName: string;
|
|
19
|
+
description?: string | undefined;
|
|
20
|
+
unit?: string | undefined;
|
|
21
|
+
valueInSeconds: number;
|
|
22
|
+
time: Date;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const DEFAULT_METRIC_RETENTION_IN_DAYS: number = 180;
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* Writes measurement values into the existing mutable-metric pipeline.
|
|
29
|
+
*
|
|
30
|
+
* The one thing this must get right is the tombstone scope.
|
|
31
|
+
* MutableMetricService.replaceEntityMetrics tombstones every live metric
|
|
32
|
+
* point whose name is in `metricNames` and which is not in the desired set it
|
|
33
|
+
* was handed. So the measurement writer owns its OWN name list -- the
|
|
34
|
+
* project's measurement metric names, and nothing else -- and never appends
|
|
35
|
+
* those names to the built-in refresh's replace list. Doing the latter would
|
|
36
|
+
* make every state change tombstone every measurement point, silently, since
|
|
37
|
+
* the built-in refresh has no measurement points in its desired set.
|
|
38
|
+
*/
|
|
39
|
+
export default class MeasurementMetricWriter {
|
|
40
|
+
public static async write(data: {
|
|
41
|
+
projectId: ObjectID;
|
|
42
|
+
primaryEntityId: ObjectID;
|
|
43
|
+
primaryEntityType: ServiceType;
|
|
44
|
+
// Every measurement metric name in the project, enabled or not.
|
|
45
|
+
allMeasurementMetricNames: Array<string>;
|
|
46
|
+
// Only the points that actually have a value; disabled ones are omitted.
|
|
47
|
+
points: Array<MeasurementMetricPoint>;
|
|
48
|
+
baseAttributes: JSONObject;
|
|
49
|
+
}): Promise<void> {
|
|
50
|
+
if (data.allMeasurementMetricNames.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const retentionDate: Date = OneUptimeDate.addRemoveDays(
|
|
55
|
+
OneUptimeDate.getCurrentDate(),
|
|
56
|
+
await MeasurementMetricWriter.getMetricRetentionInDays(),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const metrics: Array<MutableMetric> = [];
|
|
60
|
+
const metricTypesMap: Record<string, MetricType> = {};
|
|
61
|
+
|
|
62
|
+
for (const point of data.points) {
|
|
63
|
+
const metric: MutableMetric = new MutableMetric();
|
|
64
|
+
|
|
65
|
+
metric.projectId = data.projectId;
|
|
66
|
+
metric.primaryEntityId = data.primaryEntityId;
|
|
67
|
+
metric.primaryEntityType = data.primaryEntityType;
|
|
68
|
+
metric.name = point.metricName;
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* Per-definition point identity, mirroring the built-in
|
|
72
|
+
* `time-in-state:<timelineRowId>` shape. Sharing one identity across
|
|
73
|
+
* definitions would make each refresh overwrite the others.
|
|
74
|
+
*/
|
|
75
|
+
metric.metricPointId = `measurement:${point.measurementId}`;
|
|
76
|
+
metric.value = point.valueInSeconds;
|
|
77
|
+
metric.time = point.time;
|
|
78
|
+
metric.timeUnixNano = OneUptimeDate.toUnixNano(point.time);
|
|
79
|
+
metric.metricPointType = MetricPointType.Sum;
|
|
80
|
+
metric.retentionDate = retentionDate;
|
|
81
|
+
|
|
82
|
+
metric.attributes = {
|
|
83
|
+
...data.baseAttributes,
|
|
84
|
+
/*
|
|
85
|
+
* Namespaced, following the oneuptime.label.* / oneuptime.customField.*
|
|
86
|
+
* convention, so they cannot collide with the unprefixed camelCase
|
|
87
|
+
* dimensions the built-in metrics carry.
|
|
88
|
+
*/
|
|
89
|
+
"oneuptime.measurement.id": point.measurementId,
|
|
90
|
+
"oneuptime.measurement.key": point.measurementKey,
|
|
91
|
+
"oneuptime.measurement.name": point.measurementName,
|
|
92
|
+
};
|
|
93
|
+
metric.attributeKeys = TelemetryUtil.getAttributeKeys(metric.attributes);
|
|
94
|
+
|
|
95
|
+
metrics.push(metric);
|
|
96
|
+
|
|
97
|
+
const metricType: MetricType = new MetricType();
|
|
98
|
+
metricType.name = point.metricName;
|
|
99
|
+
metricType.description =
|
|
100
|
+
point.description ||
|
|
101
|
+
`${point.measurementName}, a measurement defined for this project`;
|
|
102
|
+
metricType.unit = point.unit || "seconds";
|
|
103
|
+
metricTypesMap[point.metricName] = metricType;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
await MutableMetricService.replaceEntityMetrics({
|
|
107
|
+
projectId: data.projectId,
|
|
108
|
+
primaryEntityId: data.primaryEntityId,
|
|
109
|
+
primaryEntityType: data.primaryEntityType,
|
|
110
|
+
metricNames: data.allMeasurementMetricNames,
|
|
111
|
+
metrics: metrics,
|
|
112
|
+
retentionDate: retentionDate,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
if (Object.keys(metricTypesMap).length === 0) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
* Registering the name is what makes a measurement appear in the
|
|
121
|
+
* dashboard chart picker -- the picker reads MetricType rows, not any
|
|
122
|
+
* enum, so no dashboard code is needed for a new measurement.
|
|
123
|
+
*/
|
|
124
|
+
TelemetryUtil.indexMetricNameServiceNameMap({
|
|
125
|
+
metricNameServiceNameMap: metricTypesMap,
|
|
126
|
+
projectId: data.projectId,
|
|
127
|
+
}).catch((err: Error) => {
|
|
128
|
+
logger.error(err);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
* Tombstones every measurement point for one entity. Used when the entity
|
|
134
|
+
* is deleted, so its points leave the charts rather than lingering until
|
|
135
|
+
* the retention date.
|
|
136
|
+
*/
|
|
137
|
+
public static async tombstoneAll(data: {
|
|
138
|
+
projectId: ObjectID;
|
|
139
|
+
primaryEntityId: ObjectID;
|
|
140
|
+
primaryEntityType: ServiceType;
|
|
141
|
+
allMeasurementMetricNames: Array<string>;
|
|
142
|
+
}): Promise<void> {
|
|
143
|
+
if (data.allMeasurementMetricNames.length === 0) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const retentionDate: Date = OneUptimeDate.addRemoveDays(
|
|
148
|
+
OneUptimeDate.getCurrentDate(),
|
|
149
|
+
await MeasurementMetricWriter.getMetricRetentionInDays(),
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
await MutableMetricService.tombstoneEntityMetrics({
|
|
153
|
+
projectId: data.projectId,
|
|
154
|
+
primaryEntityId: data.primaryEntityId,
|
|
155
|
+
primaryEntityType: data.primaryEntityType,
|
|
156
|
+
metricNames: data.allMeasurementMetricNames,
|
|
157
|
+
retentionDate: retentionDate,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private static async getMetricRetentionInDays(): Promise<number> {
|
|
162
|
+
try {
|
|
163
|
+
const globalConfig: GlobalConfig | null =
|
|
164
|
+
await GlobalConfigService.findOneBy({
|
|
165
|
+
query: {
|
|
166
|
+
_id: ObjectID.getZeroObjectID().toString(),
|
|
167
|
+
},
|
|
168
|
+
props: {
|
|
169
|
+
isRoot: true,
|
|
170
|
+
},
|
|
171
|
+
select: {
|
|
172
|
+
monitorMetricRetentionInDays: true,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
if (
|
|
177
|
+
globalConfig &&
|
|
178
|
+
globalConfig.monitorMetricRetentionInDays !== undefined &&
|
|
179
|
+
globalConfig.monitorMetricRetentionInDays !== null
|
|
180
|
+
) {
|
|
181
|
+
return globalConfig.monitorMetricRetentionInDays;
|
|
182
|
+
}
|
|
183
|
+
} catch (err) {
|
|
184
|
+
logger.error(err as Error);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return DEFAULT_METRIC_RETENTION_IN_DAYS;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AnomalyDetectionMethod,
|
|
3
|
+
FilterType,
|
|
4
|
+
} from "../../../../Types/Monitor/CriteriaFilter";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Consistency constant that maps a Median Absolute Deviation to the
|
|
8
|
+
* standard deviation of a Gaussian (σ ≈ 1.4826 × MAD), so the same
|
|
9
|
+
* sigmaCount sensitivity levels apply to both anomaly methods.
|
|
10
|
+
*/
|
|
11
|
+
export const MAD_TO_SIGMA: number = 1.4826;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Descriptive statistics of a set of per-minute telemetry counts —
|
|
15
|
+
* one hour-of-week baseline cell aggregated over a rolling window.
|
|
16
|
+
* Computed in app code (not SQL) so the math is pure and unit-testable;
|
|
17
|
+
* the input is at most `60 × ceil(windowDays / 7)` numbers.
|
|
18
|
+
*/
|
|
19
|
+
export interface CountBaselineStats {
|
|
20
|
+
/** Number of non-empty minute cells that contributed. */
|
|
21
|
+
sampleCount: number;
|
|
22
|
+
mean: number;
|
|
23
|
+
/** Population standard deviation. */
|
|
24
|
+
stddev: number;
|
|
25
|
+
median: number;
|
|
26
|
+
/** MAD × 1.4826 → σ-equivalent, used by the MedianMad method. */
|
|
27
|
+
madSigma: number;
|
|
28
|
+
minObserved: number;
|
|
29
|
+
maxObserved: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Baseline summary returned by the span/log count baseline services:
|
|
34
|
+
* the stats plus the reliability verdict and lookup coordinates.
|
|
35
|
+
* Mirrors `BaselineSummary` from MetricBaselineService.
|
|
36
|
+
*/
|
|
37
|
+
export interface CountBaselineSummary extends CountBaselineStats {
|
|
38
|
+
/**
|
|
39
|
+
* Whether this cell meets the minimum sample threshold to be trusted.
|
|
40
|
+
* Callers must refuse to evaluate against an unreliable baseline —
|
|
41
|
+
* the "Learning" cold-start state.
|
|
42
|
+
*/
|
|
43
|
+
isReliable: boolean;
|
|
44
|
+
/** Window the baseline was computed over (days). */
|
|
45
|
+
windowDays: number;
|
|
46
|
+
hourOfWeek: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface CountAnomalyEvaluation {
|
|
50
|
+
breaches: boolean;
|
|
51
|
+
/** (observed - center) / spread — signed sigma distance. */
|
|
52
|
+
observedSigma: number;
|
|
53
|
+
expectedHigh: number;
|
|
54
|
+
expectedLow: number;
|
|
55
|
+
/** Baseline center actually compared against (mean or median). */
|
|
56
|
+
center: number;
|
|
57
|
+
/** Baseline spread actually compared against (stddev or MAD×1.4826). */
|
|
58
|
+
spread: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Pure math for count-based anomaly criteria (CheckOn.SpanCount /
|
|
63
|
+
* CheckOn.LogCount with FilterType.AnomalouslyHigh/Low/Anomalous).
|
|
64
|
+
* The services compute stats through here so the write-side MV cells
|
|
65
|
+
* and the eval-time comparison agree on what a "sample" is.
|
|
66
|
+
*/
|
|
67
|
+
export default class CountAnomaly {
|
|
68
|
+
/**
|
|
69
|
+
* Compute baseline stats over a cell's per-minute counts. Returns
|
|
70
|
+
* null for an empty input — the caller treats that as "no baseline"
|
|
71
|
+
* (Learning), same as a missing row.
|
|
72
|
+
*/
|
|
73
|
+
public static computeStats(counts: Array<number>): CountBaselineStats | null {
|
|
74
|
+
if (counts.length === 0) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
let sum: number = 0;
|
|
79
|
+
let min: number = counts[0]!;
|
|
80
|
+
let max: number = counts[0]!;
|
|
81
|
+
for (const value of counts) {
|
|
82
|
+
sum += value;
|
|
83
|
+
if (value < min) {
|
|
84
|
+
min = value;
|
|
85
|
+
}
|
|
86
|
+
if (value > max) {
|
|
87
|
+
max = value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const mean: number = sum / counts.length;
|
|
91
|
+
|
|
92
|
+
let sumSquaredDeviation: number = 0;
|
|
93
|
+
for (const value of counts) {
|
|
94
|
+
sumSquaredDeviation += (value - mean) * (value - mean);
|
|
95
|
+
}
|
|
96
|
+
const stddev: number = Math.sqrt(sumSquaredDeviation / counts.length);
|
|
97
|
+
|
|
98
|
+
const median: number = CountAnomaly.medianOf(counts);
|
|
99
|
+
const absoluteDeviations: Array<number> = counts.map((value: number) => {
|
|
100
|
+
return Math.abs(value - median);
|
|
101
|
+
});
|
|
102
|
+
const madSigma: number =
|
|
103
|
+
CountAnomaly.medianOf(absoluteDeviations) * MAD_TO_SIGMA;
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
sampleCount: counts.length,
|
|
107
|
+
mean,
|
|
108
|
+
stddev,
|
|
109
|
+
median,
|
|
110
|
+
madSigma,
|
|
111
|
+
minObserved: min,
|
|
112
|
+
maxObserved: max,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Compare an observed per-minute rate to a baseline cell. Returns
|
|
118
|
+
* null when the baseline has zero spread — any deviation at all would
|
|
119
|
+
* fire, so the caller must skip rather than alert (mirrors the metric
|
|
120
|
+
* evaluator's zero-variance guard).
|
|
121
|
+
*/
|
|
122
|
+
public static evaluate(input: {
|
|
123
|
+
observedPerMinute: number;
|
|
124
|
+
stats: CountBaselineStats;
|
|
125
|
+
sigmaCount: number;
|
|
126
|
+
method: AnomalyDetectionMethod;
|
|
127
|
+
filterType: FilterType | undefined;
|
|
128
|
+
}): CountAnomalyEvaluation | null {
|
|
129
|
+
const isMedianMad: boolean =
|
|
130
|
+
input.method === AnomalyDetectionMethod.MedianMad;
|
|
131
|
+
const center: number = isMedianMad ? input.stats.median : input.stats.mean;
|
|
132
|
+
const spread: number = isMedianMad
|
|
133
|
+
? input.stats.madSigma
|
|
134
|
+
: input.stats.stddev;
|
|
135
|
+
|
|
136
|
+
if (!Number.isFinite(spread) || spread <= 0) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const expectedHigh: number = center + input.sigmaCount * spread;
|
|
141
|
+
const expectedLow: number = center - input.sigmaCount * spread;
|
|
142
|
+
const observedSigma: number = (input.observedPerMinute - center) / spread;
|
|
143
|
+
|
|
144
|
+
const isHighBreach: boolean = input.observedPerMinute > expectedHigh;
|
|
145
|
+
const isLowBreach: boolean = input.observedPerMinute < expectedLow;
|
|
146
|
+
|
|
147
|
+
let breaches: boolean = false;
|
|
148
|
+
switch (input.filterType) {
|
|
149
|
+
case FilterType.AnomalouslyHigh:
|
|
150
|
+
breaches = isHighBreach;
|
|
151
|
+
break;
|
|
152
|
+
case FilterType.AnomalouslyLow:
|
|
153
|
+
breaches = isLowBreach;
|
|
154
|
+
break;
|
|
155
|
+
case FilterType.Anomalous:
|
|
156
|
+
breaches = isHighBreach || isLowBreach;
|
|
157
|
+
break;
|
|
158
|
+
default:
|
|
159
|
+
breaches = false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
breaches,
|
|
164
|
+
observedSigma,
|
|
165
|
+
expectedHigh,
|
|
166
|
+
expectedLow,
|
|
167
|
+
center,
|
|
168
|
+
spread,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private static medianOf(values: Array<number>): number {
|
|
173
|
+
const sorted: Array<number> = [...values].sort((a: number, b: number) => {
|
|
174
|
+
return a - b;
|
|
175
|
+
});
|
|
176
|
+
const mid: number = Math.floor(sorted.length / 2);
|
|
177
|
+
if (sorted.length % 2 === 0) {
|
|
178
|
+
return (sorted[mid - 1]! + sorted[mid]!) / 2;
|
|
179
|
+
}
|
|
180
|
+
return sorted[mid]!;
|
|
181
|
+
}
|
|
182
|
+
}
|