@oneuptime/common 14.0.9 → 14.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
- package/Models/DatabaseModels/CephCluster.ts +213 -0
- package/Models/DatabaseModels/DatabaseServer.ts +213 -0
- package/Models/DatabaseModels/DockerHost.ts +213 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Host.ts +213 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/PodmanHost.ts +213 -0
- package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
- package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
- package/Models/DatabaseModels/RunnerJob.ts +144 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
- package/Server/API/AutoRemediationAPI.ts +392 -1
- package/Server/API/ResourceAiAccessAPI.ts +1669 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Infrastructure/Semaphore.ts +22 -0
- package/Server/Middleware/TelemetryIngest.ts +15 -5
- package/Server/Services/AnalyticsDatabaseService.ts +45 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
- package/Server/Services/CephClusterService.ts +109 -1
- package/Server/Services/DatabaseServerService.ts +116 -1
- package/Server/Services/DockerHostService.ts +109 -1
- package/Server/Services/DockerSwarmClusterService.ts +113 -1
- package/Server/Services/HostService.ts +126 -4
- package/Server/Services/MetricRecordingRuleService.ts +47 -0
- package/Server/Services/PodmanHostService.ts +109 -1
- package/Server/Services/ProxmoxClusterService.ts +110 -1
- package/Server/Services/ResourceAiAccessService.ts +1439 -0
- package/Server/Services/ResourceAiAgentJobService.ts +202 -0
- package/Server/Services/ResourceAiAgentService.ts +2432 -0
- package/Server/Services/RunnerJobService.ts +611 -4
- package/Server/Services/TelemetryUsageBillingService.ts +28 -0
- package/Server/Services/TraceRecordingRuleService.ts +33 -0
- package/Server/Services/VMwareVCenterService.ts +110 -1
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1434 -32
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +935 -21
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
- package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +72 -2
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
- package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
- package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +366 -143
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +93 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
- package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
- package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
- package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
- package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
- package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
- package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
- package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
- package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
- package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
- package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
- package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
- package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
- package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
- package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
- package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
- package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
- package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
- package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
- package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
- package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
- package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
- package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
- package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
- package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
- package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
- package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
- package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
- package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
- package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
- package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
- package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
- package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
- package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
- package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
- package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
- package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
- package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
- package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
- package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
- package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
- package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
- package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
- package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
- package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
- package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
- package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
- package/Types/AI/ResourceAiAccessApi.ts +140 -0
- package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
- package/Types/Monitor/RumAlertTemplates.ts +351 -4
- package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
- package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
- package/Types/Runbook/RunbookStepType.ts +29 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
- package/Utils/AI/InvestigationReport.ts +121 -15
- package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
- package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
- package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
- package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
- package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
- package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
- package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
- package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
- package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
- package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
- package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
- package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
- package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +219 -0
- package/build/dist/Models/DatabaseModels/Host.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/PodmanHost.js +219 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
- package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
- package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +104 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerService.js +99 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +104 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +114 -2
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
- package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +104 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
- package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
- package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
- package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/RunnerJobService.js +344 -5
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
- package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1029 -30
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +633 -28
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +50 -4
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +263 -110
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
- package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
- package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
- package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
- package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/Utils/AI/InvestigationReport.js +71 -11
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
- package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
- package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
- package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
- package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
- package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
- package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
- package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
- package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import logger from "../Logger";
|
|
11
|
+
import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
12
|
+
import TelemetryUtil from "../Telemetry/Telemetry";
|
|
13
|
+
import SessionReplayUsage from "./SessionReplayUsage";
|
|
14
|
+
import GlobalConfigService from "../../Services/GlobalConfigService";
|
|
15
|
+
import MetricService from "../../Services/MetricService";
|
|
16
|
+
import ProjectService from "../../Services/ProjectService";
|
|
17
|
+
import RumApplicationService from "../../Services/RumApplicationService";
|
|
18
|
+
import QueryHelper from "../../Types/Database/QueryHelper";
|
|
19
|
+
import { MetricPointType } from "../../../Models/AnalyticsModels/Metric";
|
|
20
|
+
import MetricType from "../../../Models/DatabaseModels/MetricType";
|
|
21
|
+
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
22
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
23
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
24
|
+
import SessionReplayBudgetMetricType from "../../../Types/Rum/SessionReplayBudgetMetricType";
|
|
25
|
+
import ServiceType from "../../../Types/Telemetry/ServiceType";
|
|
26
|
+
import SessionReplayBudgetMetricTypeUtil, { SESSION_REPLAY_BUDGET_METRIC_PROJECT_ID_ATTRIBUTE, SESSION_REPLAY_BUDGET_METRIC_RUM_APPLICATION_ID_ATTRIBUTE, SESSION_REPLAY_BUDGET_METRIC_RUM_APPLICATION_NAME_ATTRIBUTE, } from "../../../Utils/SessionReplay/SessionReplayBudgetMetricType";
|
|
27
|
+
/*
|
|
28
|
+
* Publishes the two session replay storage budgets as metrics, so running out
|
|
29
|
+
* of one can page someone instead of only turning a meter red on the Replay
|
|
30
|
+
* Health page.
|
|
31
|
+
*
|
|
32
|
+
* The budgets themselves are Redis counters the ingest gate charges
|
|
33
|
+
* (SessionReplayUsage keys, SessionReplayRateLimiter): one per project per
|
|
34
|
+
* UTC day against the deployment's daily limit, and one per application per
|
|
35
|
+
* UTC month against the budget a customer set on it. Once either is spent
|
|
36
|
+
* the recorders are told to stop, quietly - which is the whole problem this
|
|
37
|
+
* solves. The worker job (App/FeatureSet/Workers/Jobs/Rum/
|
|
38
|
+
* PublishSessionReplayBudgetMetrics.ts) calls publishAll() every five
|
|
39
|
+
* minutes, and it posts the `oneuptime.rum.session.replay.budget.*` gauges
|
|
40
|
+
* (SessionReplayBudgetMetricType) that ordinary Metrics monitors - and the
|
|
41
|
+
* RUM application's one-click alert templates - alert on. Same shape as the
|
|
42
|
+
* LLM cost budgets: the budget never alerts directly.
|
|
43
|
+
*
|
|
44
|
+
* What a point means, and when there is none:
|
|
45
|
+
*
|
|
46
|
+
* - Rows are keyed to a RUM application (primaryEntityId = its id,
|
|
47
|
+
* RealUserMonitor), because that is the scope a monitor on one
|
|
48
|
+
* application filters by. The project's daily figure is therefore posted
|
|
49
|
+
* under EVERY application of the project that records, with the same
|
|
50
|
+
* value, and carries only a projectId attribute: it is the project's
|
|
51
|
+
* budget, not that application's usage.
|
|
52
|
+
* - Only applications that have ever recorded a replay are swept
|
|
53
|
+
* (sessionReplayLastChunkReceivedAt set). Replay is on by default for
|
|
54
|
+
* every RUM application, so "enabled" alone would post the project's
|
|
55
|
+
* figure under applications that only send web vitals.
|
|
56
|
+
* - The monthly series exists only while the application has a monthly
|
|
57
|
+
* budget, because the gate only charges the monthly counter then.
|
|
58
|
+
* - Zero usage posts nothing: a zero cannot cross a threshold, and five
|
|
59
|
+
* minutes of rows for every idle application would buy no alert.
|
|
60
|
+
* - An unreadable counter posts nothing, never 0 - a 0 would read as "no
|
|
61
|
+
* usage" to every monitor watching the series.
|
|
62
|
+
*
|
|
63
|
+
* A monitor on these series must use a window of at least three sweeps
|
|
64
|
+
* (15 minutes): a window with no point in it resolves open incidents.
|
|
65
|
+
*/
|
|
66
|
+
// Applications per keyset page. Two MGETs of at most 500 keys each.
|
|
67
|
+
export const SESSION_REPLAY_BUDGET_SWEEP_PAGE_SIZE = 500;
|
|
68
|
+
/*
|
|
69
|
+
* A page whose Project query or insert throws is skipped and the sweep moves
|
|
70
|
+
* on - but three in a row means ClickHouse or Postgres is down for everyone,
|
|
71
|
+
* and the remaining pages would only repeat the same error. (A failed catalog
|
|
72
|
+
* write does not fail its page: the rows are already written, and a later
|
|
73
|
+
* sweep registers the names.)
|
|
74
|
+
*/
|
|
75
|
+
export const SESSION_REPLAY_BUDGET_SWEEP_MAX_CONSECUTIVE_FAILED_PAGES = 3;
|
|
76
|
+
/*
|
|
77
|
+
* Same knob and default as monitor and SLO metrics
|
|
78
|
+
* (GlobalConfig.monitorMetricRetentionInDays). Never longer: the metric table
|
|
79
|
+
* drops whole daily partitions (ttl_only_drop_parts), so a long retention on
|
|
80
|
+
* any row pins its day for that long.
|
|
81
|
+
*/
|
|
82
|
+
const DEFAULT_RETENTION_DAYS = 30;
|
|
83
|
+
// "GB" in session replay is GiB everywhere: the gate, /config and the UI.
|
|
84
|
+
const BYTES_PER_GIB = 1024 * 1024 * 1024;
|
|
85
|
+
export default class SessionReplayBudgetMetrics {
|
|
86
|
+
/*
|
|
87
|
+
* Percent of a budget used, rounded DOWN to 0.01 so that ">= 100" holds
|
|
88
|
+
* exactly when the gate considers the budget spent (counter >= limit):
|
|
89
|
+
* rounding to nearest would read 100.00 a byte early, while the gate is
|
|
90
|
+
* still letting uploads through, and page someone for a stop that has not
|
|
91
|
+
* happened. Not capped at 100 - the request that crosses the limit stays
|
|
92
|
+
* charged, and a budget lowered below usage is honestly over it.
|
|
93
|
+
*
|
|
94
|
+
* null when there is no usable limit; a negative count (a refund that
|
|
95
|
+
* straddled 00:00 UTC) reads as 0.
|
|
96
|
+
*/
|
|
97
|
+
static computePercentUsed(data) {
|
|
98
|
+
if (!Number.isFinite(data.limitBytes) || data.limitBytes <= 0) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
if (!Number.isFinite(data.usedBytes)) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const usedBytes = Math.max(0, data.usedBytes);
|
|
105
|
+
return Math.floor((usedBytes / data.limitBytes) * 10000) / 100;
|
|
106
|
+
}
|
|
107
|
+
/*
|
|
108
|
+
* An application's monthly budget in bytes, or null for "no budget" - the
|
|
109
|
+
* gate's rule exactly: only a finite number above 0 is a ceiling, and it is
|
|
110
|
+
* GiB rounded down to a whole byte.
|
|
111
|
+
*/
|
|
112
|
+
static getMonthlyBudgetInBytes(monthlyBudgetInGB) {
|
|
113
|
+
const gigabytes = typeof monthlyBudgetInGB === "number"
|
|
114
|
+
? monthlyBudgetInGB
|
|
115
|
+
: typeof monthlyBudgetInGB === "string" &&
|
|
116
|
+
monthlyBudgetInGB.trim().length > 0
|
|
117
|
+
? Number(monthlyBudgetInGB)
|
|
118
|
+
: NaN;
|
|
119
|
+
if (!Number.isFinite(gigabytes) || gigabytes <= 0) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return Math.floor(gigabytes * BYTES_PER_GIB);
|
|
123
|
+
}
|
|
124
|
+
/*
|
|
125
|
+
* Once a sweep has seen more than twice the limit on a daily counter, the
|
|
126
|
+
* worker and the ingest pods are almost certainly reading different values
|
|
127
|
+
* of SESSION_REPLAY_MAX_BYTES_PER_PROJECT_PER_DAY: the gate leaves a spent
|
|
128
|
+
* counter at most one request over its own limit. The percentages this
|
|
129
|
+
* worker posts are then measured against the wrong limit.
|
|
130
|
+
*/
|
|
131
|
+
static isDailyLimitMismatchSuspected(data) {
|
|
132
|
+
return (Number.isFinite(data.dailyByteLimit) &&
|
|
133
|
+
data.dailyByteLimit > 0 &&
|
|
134
|
+
data.usedBytes > data.dailyByteLimit * 2);
|
|
135
|
+
}
|
|
136
|
+
/*
|
|
137
|
+
* The rows one application gets in one sweep: the project's daily pair when
|
|
138
|
+
* the project has used anything today, and its own monthly pair when it has
|
|
139
|
+
* a budget and has used any of it. Pure, so the series shape is testable
|
|
140
|
+
* without a sweep around it.
|
|
141
|
+
*/
|
|
142
|
+
static buildApplicationRows(data) {
|
|
143
|
+
const rows = [];
|
|
144
|
+
const pushPair = (pair) => {
|
|
145
|
+
if (pair.usedBytes === null || !Number.isFinite(pair.usedBytes)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const usedBytes = Math.max(0, pair.usedBytes);
|
|
149
|
+
if (usedBytes === 0) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
rows.push(this.buildMetricRow({
|
|
153
|
+
projectId: data.application.projectId,
|
|
154
|
+
rumApplicationId: data.application.rumApplicationId,
|
|
155
|
+
metricType: pair.bytesMetric,
|
|
156
|
+
value: usedBytes,
|
|
157
|
+
attributes: pair.attributes,
|
|
158
|
+
ingestionDate: data.ingestionDate,
|
|
159
|
+
retentionDate: data.retentionDate,
|
|
160
|
+
}));
|
|
161
|
+
const percentUsed = pair.limitBytes === null
|
|
162
|
+
? null
|
|
163
|
+
: this.computePercentUsed({
|
|
164
|
+
usedBytes: usedBytes,
|
|
165
|
+
limitBytes: pair.limitBytes,
|
|
166
|
+
});
|
|
167
|
+
if (percentUsed !== null) {
|
|
168
|
+
rows.push(this.buildMetricRow({
|
|
169
|
+
projectId: data.application.projectId,
|
|
170
|
+
rumApplicationId: data.application.rumApplicationId,
|
|
171
|
+
metricType: pair.percentMetric,
|
|
172
|
+
value: percentUsed,
|
|
173
|
+
attributes: pair.attributes,
|
|
174
|
+
ingestionDate: data.ingestionDate,
|
|
175
|
+
retentionDate: data.retentionDate,
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
pushPair({
|
|
180
|
+
bytesMetric: SessionReplayBudgetMetricType.ProjectDailyUsedBytes,
|
|
181
|
+
percentMetric: SessionReplayBudgetMetricType.ProjectDailyUsedPercent,
|
|
182
|
+
usedBytes: data.projectDailyUsedBytes,
|
|
183
|
+
limitBytes: data.dailyByteLimit,
|
|
184
|
+
attributes: {
|
|
185
|
+
[SESSION_REPLAY_BUDGET_METRIC_PROJECT_ID_ATTRIBUTE]: data.application.projectId.toString(),
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
if (data.application.monthlyBudgetInBytes !== null) {
|
|
189
|
+
const monthlyAttributes = {
|
|
190
|
+
[SESSION_REPLAY_BUDGET_METRIC_PROJECT_ID_ATTRIBUTE]: data.application.projectId.toString(),
|
|
191
|
+
[SESSION_REPLAY_BUDGET_METRIC_RUM_APPLICATION_ID_ATTRIBUTE]: data.application.rumApplicationId.toString(),
|
|
192
|
+
};
|
|
193
|
+
if (data.application.name.trim().length > 0) {
|
|
194
|
+
monthlyAttributes[SESSION_REPLAY_BUDGET_METRIC_RUM_APPLICATION_NAME_ATTRIBUTE] = data.application.name;
|
|
195
|
+
}
|
|
196
|
+
pushPair({
|
|
197
|
+
bytesMetric: SessionReplayBudgetMetricType.ApplicationMonthlyUsedBytes,
|
|
198
|
+
percentMetric: SessionReplayBudgetMetricType.ApplicationMonthlyUsedPercent,
|
|
199
|
+
usedBytes: data.applicationMonthlyUsedBytes,
|
|
200
|
+
limitBytes: data.application.monthlyBudgetInBytes,
|
|
201
|
+
attributes: monthlyAttributes,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return rows;
|
|
205
|
+
}
|
|
206
|
+
// Row shape must stay in lockstep with MonitorMetricUtil.buildMonitorMetricRow.
|
|
207
|
+
static buildMetricRow(data) {
|
|
208
|
+
const ingestionTimestamp = OneUptimeDate.toClickhouseDateTime(data.ingestionDate);
|
|
209
|
+
const timeUnixNano = OneUptimeDate.toUnixNano(data.ingestionDate).toString();
|
|
210
|
+
// A copy per row, so no two rows share (and can mutate) one object.
|
|
211
|
+
const attributes = Object.assign({}, data.attributes);
|
|
212
|
+
const attributeKeys = TelemetryUtil.getAttributeKeys(attributes);
|
|
213
|
+
return {
|
|
214
|
+
_id: ObjectID.generateTimeOrdered().toString(),
|
|
215
|
+
createdAt: ingestionTimestamp,
|
|
216
|
+
projectId: data.projectId.toString(),
|
|
217
|
+
primaryEntityId: data.rumApplicationId.toString(),
|
|
218
|
+
primaryEntityType: ServiceType.RealUserMonitor,
|
|
219
|
+
name: data.metricType,
|
|
220
|
+
aggregationTemporality: null,
|
|
221
|
+
// A reading of a counter at one moment, i.e. a Gauge.
|
|
222
|
+
metricPointType: MetricPointType.Gauge,
|
|
223
|
+
time: ingestionTimestamp,
|
|
224
|
+
startTime: null,
|
|
225
|
+
timeUnixNano: timeUnixNano,
|
|
226
|
+
startTimeUnixNano: null,
|
|
227
|
+
attributes: attributes,
|
|
228
|
+
attributeKeys: attributeKeys,
|
|
229
|
+
isMonotonic: null,
|
|
230
|
+
count: null,
|
|
231
|
+
sum: null,
|
|
232
|
+
min: null,
|
|
233
|
+
max: null,
|
|
234
|
+
bucketCounts: [],
|
|
235
|
+
explicitBounds: [],
|
|
236
|
+
value: data.value,
|
|
237
|
+
retentionDate: OneUptimeDate.toClickhouseDateTime(data.retentionDate),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
/*
|
|
241
|
+
* Read an application row into what the sweep needs. null for a row that
|
|
242
|
+
* cannot be keyed (no id or no project), which the sweep skips.
|
|
243
|
+
*/
|
|
244
|
+
static toBudgetApplication(application) {
|
|
245
|
+
const rumApplicationId = application.id;
|
|
246
|
+
const projectId = application.projectId;
|
|
247
|
+
if (!rumApplicationId || !projectId) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
rumApplicationId: rumApplicationId,
|
|
252
|
+
projectId: projectId,
|
|
253
|
+
name: typeof application.name === "string" ? application.name : "",
|
|
254
|
+
monthlyBudgetInBytes: this.getMonthlyBudgetInBytes(application["sessionReplayMonthlyBudgetInGB"]),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/*
|
|
258
|
+
* One sweep over every application that records session replay. Never
|
|
259
|
+
* throws: every failure ends in the summary and the logs, and the next tick
|
|
260
|
+
* starts over.
|
|
261
|
+
*/
|
|
262
|
+
static async publishAll(options) {
|
|
263
|
+
const summary = {
|
|
264
|
+
stopReason: "done",
|
|
265
|
+
dailyByteLimit: options.dailyByteLimit,
|
|
266
|
+
pagesScanned: 0,
|
|
267
|
+
pagesFailed: 0,
|
|
268
|
+
applicationsScanned: 0,
|
|
269
|
+
rowsWritten: 0,
|
|
270
|
+
dailyLimitMismatchSuspected: false,
|
|
271
|
+
};
|
|
272
|
+
/*
|
|
273
|
+
* One timestamp for the whole sweep, so every application's points from
|
|
274
|
+
* this tick land on the same x and the project's shared daily value reads
|
|
275
|
+
* as one reading, not as many.
|
|
276
|
+
*/
|
|
277
|
+
const ingestionDate = OneUptimeDate.getCurrentDate();
|
|
278
|
+
const retentionDate = OneUptimeDate.addRemoveDays(ingestionDate, await this.getRetentionDays());
|
|
279
|
+
// (project, metric name) pairs already put in the catalog this tick.
|
|
280
|
+
const registeredMetricNames = new Set();
|
|
281
|
+
let cursor = undefined;
|
|
282
|
+
let consecutiveFailedPages = 0;
|
|
283
|
+
for (;;) {
|
|
284
|
+
if (options.shouldContinue && !options.shouldContinue()) {
|
|
285
|
+
summary.stopReason = "lock-lost";
|
|
286
|
+
logger.warn(`SessionReplayBudgetMetrics: stopping after ${summary.pagesScanned} page(s) - the sweep lock was lost.`);
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
if (options.deadline &&
|
|
290
|
+
OneUptimeDate.getCurrentDate().getTime() >= options.deadline.getTime()) {
|
|
291
|
+
summary.stopReason = "deadline";
|
|
292
|
+
logger.warn(`SessionReplayBudgetMetrics: stopping after ${summary.pagesScanned} page(s) - the sweep ran out of time; the next tick starts over.`);
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
let rows;
|
|
296
|
+
try {
|
|
297
|
+
rows = await RumApplicationService.findBy({
|
|
298
|
+
query: Object.assign({ isSessionReplayEnabled: true, sessionReplayLastChunkReceivedAt: QueryHelper.notNull() }, (cursor ? { _id: QueryHelper.greaterThan(cursor) } : {})),
|
|
299
|
+
select: {
|
|
300
|
+
_id: true,
|
|
301
|
+
projectId: true,
|
|
302
|
+
name: true,
|
|
303
|
+
sessionReplayMonthlyBudgetInGB: true,
|
|
304
|
+
},
|
|
305
|
+
sort: {
|
|
306
|
+
_id: SortOrder.Ascending,
|
|
307
|
+
},
|
|
308
|
+
skip: 0,
|
|
309
|
+
limit: SESSION_REPLAY_BUDGET_SWEEP_PAGE_SIZE,
|
|
310
|
+
props: {
|
|
311
|
+
isRoot: true,
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
/*
|
|
317
|
+
* Without the page there is no cursor to move past it, so the rest of
|
|
318
|
+
* the sweep cannot run.
|
|
319
|
+
*/
|
|
320
|
+
summary.stopReason = "page-fetch-failed";
|
|
321
|
+
logger.error(`SessionReplayBudgetMetrics: could not read the applications after ${cursor ? cursor.toString() : "the start"}; ending this sweep.`);
|
|
322
|
+
logger.error(err);
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
if (rows.length === 0) {
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
const lastId = rows[rows.length - 1].id;
|
|
329
|
+
if (!lastId || (cursor && lastId.toString() <= cursor.toString())) {
|
|
330
|
+
summary.stopReason = "page-fetch-failed";
|
|
331
|
+
logger.error(`SessionReplayBudgetMetrics: the application page after ${cursor ? cursor.toString() : "the start"} did not advance the cursor; ending this sweep.`);
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
// Moved before the page is processed, so a failed page is never retried.
|
|
335
|
+
const pageStart = cursor ? cursor.toString() : "the start";
|
|
336
|
+
cursor = lastId;
|
|
337
|
+
summary.pagesScanned++;
|
|
338
|
+
summary.applicationsScanned += rows.length;
|
|
339
|
+
try {
|
|
340
|
+
const result = await this.publishPage({
|
|
341
|
+
rows: rows,
|
|
342
|
+
dailyByteLimit: options.dailyByteLimit,
|
|
343
|
+
ingestionDate: ingestionDate,
|
|
344
|
+
retentionDate: retentionDate,
|
|
345
|
+
registeredMetricNames: registeredMetricNames,
|
|
346
|
+
});
|
|
347
|
+
if (!result.countersAvailable) {
|
|
348
|
+
summary.stopReason = "counters-unavailable";
|
|
349
|
+
logger.warn(`SessionReplayBudgetMetrics: the budget counters could not be read from Redis, so the applications after ${pageStart} are not published this tick (${summary.rowsWritten} row(s) from earlier pages were; an unknown count is never posted as 0).`);
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
summary.rowsWritten += result.rowsWritten;
|
|
353
|
+
if (result.dailyLimitMismatchSuspected) {
|
|
354
|
+
summary.dailyLimitMismatchSuspected = true;
|
|
355
|
+
}
|
|
356
|
+
consecutiveFailedPages = 0;
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
summary.pagesFailed++;
|
|
360
|
+
consecutiveFailedPages++;
|
|
361
|
+
logger.error(`SessionReplayBudgetMetrics: could not publish the ${rows.length} application(s) after ${pageStart}; skipping them this tick.`);
|
|
362
|
+
logger.error(err);
|
|
363
|
+
if (consecutiveFailedPages >=
|
|
364
|
+
SESSION_REPLAY_BUDGET_SWEEP_MAX_CONSECUTIVE_FAILED_PAGES) {
|
|
365
|
+
summary.stopReason = "too-many-failed-pages";
|
|
366
|
+
logger.error(`SessionReplayBudgetMetrics: ${consecutiveFailedPages} pages in a row failed; ending this sweep.`);
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (rows.length < SESSION_REPLAY_BUDGET_SWEEP_PAGE_SIZE) {
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (summary.dailyLimitMismatchSuspected) {
|
|
375
|
+
logger.warn(`SessionReplayBudgetMetrics: a project's daily session replay counter is more than twice the daily limit this worker uses (${options.dailyByteLimit} bytes). The ingest pods probably read a different SESSION_REPLAY_MAX_BYTES_PER_PROJECT_PER_DAY, so the published daily percentages are measured against the wrong limit - set it for every component (on Helm, in the chart-wide extraEnv, and also in app.extraEnv or worker.extraEnv if either is set, because a component's own list replaces the chart-wide one).`);
|
|
376
|
+
}
|
|
377
|
+
logger.debug(`SessionReplayBudgetMetrics: ${summary.stopReason} - ${summary.applicationsScanned} application(s) in ${summary.pagesScanned} page(s), ${summary.rowsWritten} row(s) written, ${summary.pagesFailed} page(s) failed, daily limit ${options.dailyByteLimit} bytes.`);
|
|
378
|
+
return summary;
|
|
379
|
+
}
|
|
380
|
+
/*
|
|
381
|
+
* One page: drop applications whose project has replay switched off, read
|
|
382
|
+
* every counter the page needs in one batch, write the rows, and register
|
|
383
|
+
* the names written. Throws on a Project query or insert failure (the
|
|
384
|
+
* sweep skips the page); a catalog failure is logged and swallowed in
|
|
385
|
+
* registerMetricNames. Reports unreadable counters separately, because
|
|
386
|
+
* those end the sweep.
|
|
387
|
+
*/
|
|
388
|
+
static async publishPage(data) {
|
|
389
|
+
const candidates = [];
|
|
390
|
+
for (const row of data.rows) {
|
|
391
|
+
const application = this.toBudgetApplication(row);
|
|
392
|
+
if (application) {
|
|
393
|
+
candidates.push(application);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const projectIds = Array.from(new Set(candidates.map((application) => {
|
|
397
|
+
return application.projectId.toString();
|
|
398
|
+
})));
|
|
399
|
+
if (projectIds.length === 0) {
|
|
400
|
+
return {
|
|
401
|
+
countersAvailable: true,
|
|
402
|
+
rowsWritten: 0,
|
|
403
|
+
dailyLimitMismatchSuspected: false,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
/*
|
|
407
|
+
* The project-wide switch. The gate refuses every upload of a project
|
|
408
|
+
* that has it off before charging a byte, so its counters can only hold
|
|
409
|
+
* what was sent before it was switched off today.
|
|
410
|
+
*/
|
|
411
|
+
const allowedProjects = await ProjectService.findBy({
|
|
412
|
+
query: {
|
|
413
|
+
_id: QueryHelper.any(projectIds),
|
|
414
|
+
isSessionReplayAllowed: true,
|
|
415
|
+
},
|
|
416
|
+
select: {
|
|
417
|
+
_id: true,
|
|
418
|
+
},
|
|
419
|
+
skip: 0,
|
|
420
|
+
limit: projectIds.length,
|
|
421
|
+
props: {
|
|
422
|
+
isRoot: true,
|
|
423
|
+
},
|
|
424
|
+
});
|
|
425
|
+
const allowedProjectIds = new Set(allowedProjects
|
|
426
|
+
.map((project) => {
|
|
427
|
+
var _a;
|
|
428
|
+
return ((_a = project.id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
|
|
429
|
+
})
|
|
430
|
+
.filter((id) => {
|
|
431
|
+
return id.length > 0;
|
|
432
|
+
}));
|
|
433
|
+
const applications = candidates.filter((application) => {
|
|
434
|
+
return allowedProjectIds.has(application.projectId.toString());
|
|
435
|
+
});
|
|
436
|
+
if (applications.length === 0) {
|
|
437
|
+
return {
|
|
438
|
+
countersAvailable: true,
|
|
439
|
+
rowsWritten: 0,
|
|
440
|
+
dailyLimitMismatchSuspected: false,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
/*
|
|
444
|
+
* One daily key per project (it is the project's counter, however many of
|
|
445
|
+
* its applications are on the page) and one monthly key per application
|
|
446
|
+
* with a budget, all in one batch.
|
|
447
|
+
*/
|
|
448
|
+
const keys = [];
|
|
449
|
+
const dailyKeyIndexByProject = new Map();
|
|
450
|
+
const monthlyKeyIndexByApplication = new Map();
|
|
451
|
+
for (const application of applications) {
|
|
452
|
+
const projectKey = application.projectId.toString();
|
|
453
|
+
if (!dailyKeyIndexByProject.has(projectKey)) {
|
|
454
|
+
dailyKeyIndexByProject.set(projectKey, keys.length);
|
|
455
|
+
keys.push(SessionReplayUsage.getDailyProjectByteKey(application.projectId));
|
|
456
|
+
}
|
|
457
|
+
if (application.monthlyBudgetInBytes !== null) {
|
|
458
|
+
monthlyKeyIndexByApplication.set(application.rumApplicationId.toString(), keys.length);
|
|
459
|
+
keys.push(SessionReplayUsage.getMonthlyApplicationByteKey({
|
|
460
|
+
projectId: application.projectId,
|
|
461
|
+
rumApplicationId: application.rumApplicationId,
|
|
462
|
+
}));
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
const counters = await SessionReplayUsage.readByteCounters(keys);
|
|
466
|
+
if (counters === null) {
|
|
467
|
+
return {
|
|
468
|
+
countersAvailable: false,
|
|
469
|
+
rowsWritten: 0,
|
|
470
|
+
dailyLimitMismatchSuspected: false,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
const readCounter = (index) => {
|
|
474
|
+
if (index === undefined) {
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
const value = counters[index];
|
|
478
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
479
|
+
};
|
|
480
|
+
let dailyLimitMismatchSuspected = false;
|
|
481
|
+
for (const index of dailyKeyIndexByProject.values()) {
|
|
482
|
+
const usedBytes = readCounter(index);
|
|
483
|
+
if (usedBytes !== null &&
|
|
484
|
+
this.isDailyLimitMismatchSuspected({
|
|
485
|
+
usedBytes: usedBytes,
|
|
486
|
+
dailyByteLimit: data.dailyByteLimit,
|
|
487
|
+
})) {
|
|
488
|
+
dailyLimitMismatchSuspected = true;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
const metricRows = [];
|
|
492
|
+
const metricNamesByProject = new Map();
|
|
493
|
+
for (const application of applications) {
|
|
494
|
+
const applicationRows = this.buildApplicationRows({
|
|
495
|
+
application: application,
|
|
496
|
+
projectDailyUsedBytes: readCounter(dailyKeyIndexByProject.get(application.projectId.toString())),
|
|
497
|
+
applicationMonthlyUsedBytes: readCounter(monthlyKeyIndexByApplication.get(application.rumApplicationId.toString())),
|
|
498
|
+
dailyByteLimit: data.dailyByteLimit,
|
|
499
|
+
ingestionDate: data.ingestionDate,
|
|
500
|
+
retentionDate: data.retentionDate,
|
|
501
|
+
});
|
|
502
|
+
if (applicationRows.length === 0) {
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
const projectKey = application.projectId.toString();
|
|
506
|
+
const names = metricNamesByProject.get(projectKey) ||
|
|
507
|
+
new Set();
|
|
508
|
+
for (const row of applicationRows) {
|
|
509
|
+
metricRows.push(row);
|
|
510
|
+
names.add(row["name"]);
|
|
511
|
+
}
|
|
512
|
+
metricNamesByProject.set(projectKey, names);
|
|
513
|
+
}
|
|
514
|
+
if (metricRows.length === 0) {
|
|
515
|
+
return {
|
|
516
|
+
countersAvailable: true,
|
|
517
|
+
rowsWritten: 0,
|
|
518
|
+
dailyLimitMismatchSuspected: dailyLimitMismatchSuspected,
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
// One insert per page, however many applications it covers.
|
|
522
|
+
await MetricService.insertJsonRows(metricRows);
|
|
523
|
+
await this.registerMetricNames({
|
|
524
|
+
metricNamesByProject: metricNamesByProject,
|
|
525
|
+
registeredMetricNames: data.registeredMetricNames,
|
|
526
|
+
});
|
|
527
|
+
return {
|
|
528
|
+
countersAvailable: true,
|
|
529
|
+
rowsWritten: metricRows.length,
|
|
530
|
+
dailyLimitMismatchSuspected: dailyLimitMismatchSuspected,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
/*
|
|
534
|
+
* Registering a name is what puts the series in the metric picker and the
|
|
535
|
+
* Metrics-monitor builder (they read MetricType rows), with the unit charts
|
|
536
|
+
* and thresholds convert from. Awaited one project at a time and only once
|
|
537
|
+
* per (project, name) per sweep: a page can span hundreds of projects, and
|
|
538
|
+
* each registration can reach Postgres whenever its cache fence has lapsed.
|
|
539
|
+
* Only names actually written, and never with services - RUM applications
|
|
540
|
+
* are not Service rows.
|
|
541
|
+
*/
|
|
542
|
+
static async registerMetricNames(data) {
|
|
543
|
+
for (const [projectId, names] of data.metricNamesByProject) {
|
|
544
|
+
const metricNameServiceNameMap = {};
|
|
545
|
+
for (const name of names) {
|
|
546
|
+
const registrationKey = `${projectId}:${name}`;
|
|
547
|
+
if (data.registeredMetricNames.has(registrationKey)) {
|
|
548
|
+
continue;
|
|
549
|
+
}
|
|
550
|
+
const metricType = new MetricType();
|
|
551
|
+
metricType.name = name;
|
|
552
|
+
metricType.description =
|
|
553
|
+
SessionReplayBudgetMetricTypeUtil.getDescription(name);
|
|
554
|
+
metricType.unit = SessionReplayBudgetMetricTypeUtil.getUnit(name);
|
|
555
|
+
metricNameServiceNameMap[name] = metricType;
|
|
556
|
+
}
|
|
557
|
+
const newNames = Object.keys(metricNameServiceNameMap);
|
|
558
|
+
if (newNames.length === 0) {
|
|
559
|
+
continue;
|
|
560
|
+
}
|
|
561
|
+
try {
|
|
562
|
+
await TelemetryUtil.indexMetricNameServiceNameMap({
|
|
563
|
+
projectId: new ObjectID(projectId),
|
|
564
|
+
metricNameServiceNameMap: metricNameServiceNameMap,
|
|
565
|
+
});
|
|
566
|
+
for (const name of newNames) {
|
|
567
|
+
data.registeredMetricNames.add(`${projectId}:${name}`);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
catch (err) {
|
|
571
|
+
/*
|
|
572
|
+
* The rows are already written; a catalog miss only delays the names
|
|
573
|
+
* appearing in the picker until a later sweep registers them.
|
|
574
|
+
*/
|
|
575
|
+
logger.error(`SessionReplayBudgetMetrics: could not register the session replay budget metric names for project ${projectId}.`);
|
|
576
|
+
logger.error(err);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
/*
|
|
581
|
+
* Read once per sweep: the sweep runs every five minutes, so there is no
|
|
582
|
+
* burst of lookups to cache away.
|
|
583
|
+
*/
|
|
584
|
+
static async getRetentionDays() {
|
|
585
|
+
try {
|
|
586
|
+
const globalConfig = await GlobalConfigService.findOneBy({
|
|
587
|
+
query: {
|
|
588
|
+
_id: ObjectID.getZeroObjectID().toString(),
|
|
589
|
+
},
|
|
590
|
+
select: {
|
|
591
|
+
monitorMetricRetentionInDays: true,
|
|
592
|
+
},
|
|
593
|
+
props: {
|
|
594
|
+
isRoot: true,
|
|
595
|
+
},
|
|
596
|
+
});
|
|
597
|
+
const retentionInDays = globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.monitorMetricRetentionInDays;
|
|
598
|
+
/*
|
|
599
|
+
* Zero or less would stamp a retention date at or before the row's own
|
|
600
|
+
* time, and ClickHouse would drop the point as soon as its part merged.
|
|
601
|
+
*/
|
|
602
|
+
if (typeof retentionInDays === "number" &&
|
|
603
|
+
Number.isFinite(retentionInDays) &&
|
|
604
|
+
retentionInDays > 0) {
|
|
605
|
+
return retentionInDays;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
catch (err) {
|
|
609
|
+
logger.error("SessionReplayBudgetMetrics: could not read the monitor metric retention; using the default.");
|
|
610
|
+
logger.error(err);
|
|
611
|
+
}
|
|
612
|
+
return DEFAULT_RETENTION_DAYS;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
__decorate([
|
|
616
|
+
CaptureSpan(),
|
|
617
|
+
__metadata("design:type", Function),
|
|
618
|
+
__metadata("design:paramtypes", [Object]),
|
|
619
|
+
__metadata("design:returntype", Promise)
|
|
620
|
+
], SessionReplayBudgetMetrics, "publishAll", null);
|
|
621
|
+
__decorate([
|
|
622
|
+
CaptureSpan(),
|
|
623
|
+
__metadata("design:type", Function),
|
|
624
|
+
__metadata("design:paramtypes", [Object]),
|
|
625
|
+
__metadata("design:returntype", Promise)
|
|
626
|
+
], SessionReplayBudgetMetrics, "publishPage", null);
|
|
627
|
+
//# sourceMappingURL=SessionReplayBudgetMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionReplayBudgetMetrics.js","sourceRoot":"","sources":["../../../../../Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts"],"names":[],"mappings":"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"}
|