@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.
Files changed (383) hide show
  1. package/Models/DatabaseModels/AutoRemediationSuggestion.ts +60 -0
  2. package/Models/DatabaseModels/CephCluster.ts +213 -0
  3. package/Models/DatabaseModels/DatabaseServer.ts +213 -0
  4. package/Models/DatabaseModels/DockerHost.ts +213 -0
  5. package/Models/DatabaseModels/DockerSwarmCluster.ts +213 -0
  6. package/Models/DatabaseModels/GlobalConfig.ts +1 -1
  7. package/Models/DatabaseModels/Host.ts +213 -0
  8. package/Models/DatabaseModels/Index.ts +2 -0
  9. package/Models/DatabaseModels/PodmanHost.ts +213 -0
  10. package/Models/DatabaseModels/ProxmoxCluster.ts +213 -0
  11. package/Models/DatabaseModels/ResourceAiAgent.ts +419 -0
  12. package/Models/DatabaseModels/RunnerJob.ts +144 -0
  13. package/Models/DatabaseModels/VMwareVCenter.ts +213 -0
  14. package/Server/API/AutoRemediationAPI.ts +392 -1
  15. package/Server/API/ResourceAiAccessAPI.ts +1669 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.ts +423 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  18. package/Server/Infrastructure/Semaphore.ts +22 -0
  19. package/Server/Middleware/TelemetryIngest.ts +15 -5
  20. package/Server/Services/AnalyticsDatabaseService.ts +45 -1
  21. package/Server/Services/AutoRemediationRuleEngineService.ts +940 -112
  22. package/Server/Services/CephClusterService.ts +109 -1
  23. package/Server/Services/DatabaseServerService.ts +116 -1
  24. package/Server/Services/DockerHostService.ts +109 -1
  25. package/Server/Services/DockerSwarmClusterService.ts +113 -1
  26. package/Server/Services/HostService.ts +126 -4
  27. package/Server/Services/MetricRecordingRuleService.ts +47 -0
  28. package/Server/Services/PodmanHostService.ts +109 -1
  29. package/Server/Services/ProxmoxClusterService.ts +110 -1
  30. package/Server/Services/ResourceAiAccessService.ts +1439 -0
  31. package/Server/Services/ResourceAiAgentJobService.ts +202 -0
  32. package/Server/Services/ResourceAiAgentService.ts +2432 -0
  33. package/Server/Services/RunnerJobService.ts +611 -4
  34. package/Server/Services/TelemetryUsageBillingService.ts +28 -0
  35. package/Server/Services/TraceRecordingRuleService.ts +33 -0
  36. package/Server/Services/VMwareVCenterService.ts +110 -1
  37. package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1434 -32
  38. package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +935 -21
  39. package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +25 -1
  40. package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +577 -0
  41. package/Server/Utils/AI/ResourceAccess/ResourceAccessContext.ts +271 -0
  42. package/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.ts +45 -0
  43. package/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.ts +964 -0
  44. package/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.ts +333 -0
  45. package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +873 -0
  46. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +72 -2
  47. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +72 -5
  48. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +72 -5
  49. package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +396 -13
  50. package/Server/Utils/AutoRemediation/RemediationVerifier.ts +35 -2
  51. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +9 -1
  52. package/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.ts +920 -0
  53. package/Server/Utils/SessionReplay/SessionReplayUsage.ts +84 -6
  54. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +35 -15
  55. package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +33 -15
  56. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +21 -1
  57. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +298 -224
  58. package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +35 -15
  59. package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +389 -175
  60. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +366 -143
  61. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.ts +163 -0
  62. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.ts +396 -0
  63. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.ts +418 -0
  64. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.ts +152 -0
  65. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.ts +251 -0
  66. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.ts +214 -0
  67. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +93 -0
  68. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +18 -6
  69. package/Tests/App/Dashboard/InvestigationInfrastructureTools.test.tsx +506 -0
  70. package/Tests/App/Dashboard/RemediationSuggestionCardDescription.test.tsx +209 -0
  71. package/Tests/App/Dashboard/RemediationSuggestionCardResource.test.tsx +317 -0
  72. package/Tests/App/Dashboard/ResourceAiAccessSettingsUtil.test.ts +921 -0
  73. package/Tests/App/Dashboard/ResourceAiAgentInstall.test.ts +860 -0
  74. package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +1721 -0
  75. package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +1002 -0
  76. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +931 -0
  77. package/Tests/App/Dashboard/ResourceAiNavigation.test.tsx +575 -0
  78. package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +38 -7
  79. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +33 -1
  80. package/Tests/Models/DatabaseModels/ResourceAiAccessColumns.test.ts +738 -0
  81. package/Tests/Models/DatabaseModels/ResourceAiAgentModel.test.ts +842 -0
  82. package/Tests/Server/API/AutoRemediationApproveResourceRound.test.ts +835 -0
  83. package/Tests/Server/API/ResourceAiAccessAPI.test.ts +2730 -0
  84. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +60 -0
  85. package/Tests/Server/Infrastructure/Postgres/AddResourceAiAgentsMigration.test.ts +659 -0
  86. package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +31 -0
  87. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +63 -5
  88. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +103 -5
  89. package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +19 -1
  90. package/Tests/Server/Services/AutoRemediationResourceRuleEngine.test.ts +1279 -0
  91. package/Tests/Server/Services/DatabaseServerService.test.ts +55 -0
  92. package/Tests/Server/Services/GroupTelemetryUsageExcludeNames.test.ts +299 -0
  93. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +44 -0
  94. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +45 -6
  95. package/Tests/Server/Services/RecordingRuleReservedMetricName.test.ts +171 -0
  96. package/Tests/Server/Services/ResourceAiAccessChangeAuthorization.test.ts +256 -0
  97. package/Tests/Server/Services/ResourceAiAccessService.test.ts +1373 -0
  98. package/Tests/Server/Services/ResourceAiAgentJobService.test.ts +375 -0
  99. package/Tests/Server/Services/ResourceAiAgentServiceHelpers.test.ts +1114 -0
  100. package/Tests/Server/Services/ResourceAiAgentServiceLifecycle.test.ts +1050 -0
  101. package/Tests/Server/Services/ResourceAiAgentServiceRegister.test.ts +2251 -0
  102. package/Tests/Server/Services/ResourceAiSettingsCreate.test.ts +373 -0
  103. package/Tests/Server/Services/ResourceAiSettingsPermission.test.ts +1042 -0
  104. package/Tests/Server/Services/ResourceServiceDeleteCleansUpAi.test.ts +319 -0
  105. package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +105 -0
  106. package/Tests/Server/Services/RunnerJobEnqueueResourceCommand.test.ts +986 -0
  107. package/Tests/Server/Services/RunnerJobResourceCommandLane.test.ts +211 -0
  108. package/Tests/Server/Services/RunnerJobResourceCommandTimeoutAndRedaction.test.ts +352 -0
  109. package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +218 -0
  110. package/Tests/Server/TestingUtils/Services/FakeRunnerJobCount.ts +145 -0
  111. package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +453 -0
  112. package/Tests/Server/Utils/AI/InvestigationInfrastructureReport.test.ts +721 -0
  113. package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +94 -1
  114. package/Tests/Server/Utils/AI/RemediationCommandToolsResource.test.ts +1530 -0
  115. package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +1249 -0
  116. package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +117 -0
  117. package/Tests/Server/Utils/AI/RemediationResourceCopyParity.test.ts +463 -0
  118. package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +722 -0
  119. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAccessContext.test.ts +266 -0
  120. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.test.ts +1220 -0
  121. package/Tests/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.test.ts +569 -0
  122. package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +830 -0
  123. package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorResource.test.ts +717 -0
  124. package/Tests/Server/Utils/AutoRemediation/RemediationVerifierResourceFollowUp.test.ts +338 -0
  125. package/Tests/Server/Utils/Monitor/Criteria/SessionReplayBudgetTemplateCriteria.test.ts +422 -0
  126. package/Tests/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.test.ts +1647 -0
  127. package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +143 -1
  128. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +33 -3
  129. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsAccountNotLinked.test.ts +1093 -0
  130. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.test.ts +1049 -0
  131. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.test.ts +1676 -0
  132. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCards.test.ts +2884 -0
  133. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.test.ts +2490 -0
  134. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmit.test.ts +2293 -0
  135. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateSubmitServerTimezone.test.ts +386 -0
  136. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.test.ts +1477 -0
  137. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.test.ts +1967 -0
  138. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsStripHtmlTags.test.ts +92 -0
  139. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsSubmittedFormRemoval.test.ts +1819 -0
  140. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.test.ts +1033 -0
  141. package/Tests/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezoneServerZone.test.ts +610 -0
  142. package/Tests/Server/Utils/Workspace/MicrosoftTeamsBotMessageHandling.test.ts +2610 -0
  143. package/Tests/Server/Utils/Workspace/MicrosoftTeamsCreateCommandsEndToEnd.test.ts +4672 -0
  144. package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +190 -65
  145. package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +10 -4
  146. package/Tests/Types/AutoRemediation/AiRemediationCommandPlanResourceCommand.test.ts +305 -0
  147. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +277 -13
  148. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +113 -0
  149. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +773 -2
  150. package/Tests/Types/ResourceAiAgent/AiResourceType.test.ts +419 -0
  151. package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +517 -0
  152. package/Tests/Types/Runbook/RunbookStepType.test.ts +147 -8
  153. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +769 -1
  154. package/Tests/Utils/AiRemediation/Resource/CephCommandPolicy.test.ts +1653 -0
  155. package/Tests/Utils/AiRemediation/Resource/CephOutputRedaction.test.ts +204 -0
  156. package/Tests/Utils/AiRemediation/Resource/DatabaseCommandPolicy.test.ts +1077 -0
  157. package/Tests/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.test.ts +558 -0
  158. package/Tests/Utils/AiRemediation/Resource/DatabaseQueryRedactor.test.ts +834 -0
  159. package/Tests/Utils/AiRemediation/Resource/DockerCliGrammar.test.ts +747 -0
  160. package/Tests/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.test.ts +1259 -0
  161. package/Tests/Utils/AiRemediation/Resource/DockerOutputRedaction.test.ts +386 -0
  162. package/Tests/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.test.ts +782 -0
  163. package/Tests/Utils/AiRemediation/Resource/GovcCommandPolicy.test.ts +2259 -0
  164. package/Tests/Utils/AiRemediation/Resource/HostCommandPolicy.test.ts +2019 -0
  165. package/Tests/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.test.ts +2497 -0
  166. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicy.test.ts +1305 -0
  167. package/Tests/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.test.ts +585 -0
  168. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactor.test.ts +334 -0
  169. package/Tests/Utils/AiRemediation/Resource/ResourceOutputRedactorCopyParity.test.ts +98 -0
  170. package/Tests/Utils/AiRemediation/Resource/ResourcePolicyImportClosure.test.ts +391 -0
  171. package/Tests/Utils/AiRemediation/ResourceAiAgentPolicyCopyParity.test.ts +497 -0
  172. package/Tests/Utils/SessionReplay/SessionReplayBudgetMetricType.test.ts +383 -0
  173. package/Types/AI/ResourceAiAccessApi.ts +140 -0
  174. package/Types/AI/ResourceAiAccessPermissions.ts +126 -0
  175. package/Types/AutoRemediation/AiRemediationCommandPlan.ts +183 -2
  176. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +55 -22
  177. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +35 -3
  178. package/Types/Monitor/RumAlertTemplates.ts +351 -4
  179. package/Types/ResourceAiAgent/AiResourceType.ts +310 -0
  180. package/Types/ResourceAiAgent/ResourceAiAccess.ts +574 -0
  181. package/Types/Rum/SessionReplayBudgetMetricType.ts +47 -0
  182. package/Types/Runbook/RunbookStepType.ts +29 -0
  183. package/Types/Telemetry/TelemetryIngestSurface.ts +14 -2
  184. package/Utils/AI/InvestigationReport.ts +121 -15
  185. package/Utils/AiRemediation/Resource/CephCommandPolicy.ts +1936 -0
  186. package/Utils/AiRemediation/Resource/DatabaseCommandPolicy.ts +166 -0
  187. package/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.ts +1532 -0
  188. package/Utils/AiRemediation/Resource/DatabaseQueryRedactor.ts +1394 -0
  189. package/Utils/AiRemediation/Resource/DockerCliGrammar.ts +1839 -0
  190. package/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.ts +490 -0
  191. package/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.ts +687 -0
  192. package/Utils/AiRemediation/Resource/GovcCommandPolicy.ts +2096 -0
  193. package/Utils/AiRemediation/Resource/HostCommandPolicy.ts +2982 -0
  194. package/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.ts +1679 -0
  195. package/Utils/AiRemediation/Resource/ResourceCommandPolicy.ts +851 -0
  196. package/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.ts +593 -0
  197. package/Utils/AiRemediation/Resource/ResourceOutputRedactor.ts +2812 -0
  198. package/Utils/SessionReplay/SessionReplayBudgetMetricType.ts +184 -0
  199. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
  200. package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
  201. package/build/dist/Models/DatabaseModels/CephCluster.js +219 -0
  202. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  203. package/build/dist/Models/DatabaseModels/DatabaseServer.js +219 -0
  204. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
  205. package/build/dist/Models/DatabaseModels/DockerHost.js +219 -0
  206. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  207. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +219 -0
  208. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  209. package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
  210. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  211. package/build/dist/Models/DatabaseModels/Host.js +219 -0
  212. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  214. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/PodmanHost.js +219 -0
  216. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +219 -0
  218. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js +439 -0
  220. package/build/dist/Models/DatabaseModels/ResourceAiAgent.js.map +1 -0
  221. package/build/dist/Models/DatabaseModels/RunnerJob.js +145 -0
  222. package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/VMwareVCenter.js +219 -0
  224. package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
  225. package/build/dist/Server/API/AutoRemediationAPI.js +231 -1
  226. package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
  227. package/build/dist/Server/API/ResourceAiAccessAPI.js +1119 -0
  228. package/build/dist/Server/API/ResourceAiAccessAPI.js.map +1 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js +168 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796300000000-AddResourceAiAgents.js.map +1 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  233. package/build/dist/Server/Infrastructure/Semaphore.js +6 -0
  234. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  235. package/build/dist/Server/Middleware/TelemetryIngest.js +12 -5
  236. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  237. package/build/dist/Server/Services/AnalyticsDatabaseService.js +26 -1
  238. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  239. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +601 -3
  240. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  241. package/build/dist/Server/Services/CephClusterService.js +104 -0
  242. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  243. package/build/dist/Server/Services/DatabaseServerService.js +99 -0
  244. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -1
  245. package/build/dist/Server/Services/DockerHostService.js +104 -0
  246. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  247. package/build/dist/Server/Services/DockerSwarmClusterService.js +104 -0
  248. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  249. package/build/dist/Server/Services/HostService.js +114 -2
  250. package/build/dist/Server/Services/HostService.js.map +1 -1
  251. package/build/dist/Server/Services/MetricRecordingRuleService.js +46 -0
  252. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  253. package/build/dist/Server/Services/PodmanHostService.js +104 -0
  254. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  255. package/build/dist/Server/Services/ProxmoxClusterService.js +104 -0
  256. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  257. package/build/dist/Server/Services/ResourceAiAccessService.js +1028 -0
  258. package/build/dist/Server/Services/ResourceAiAccessService.js.map +1 -0
  259. package/build/dist/Server/Services/ResourceAiAgentJobService.js +173 -0
  260. package/build/dist/Server/Services/ResourceAiAgentJobService.js.map +1 -0
  261. package/build/dist/Server/Services/ResourceAiAgentService.js +1687 -0
  262. package/build/dist/Server/Services/ResourceAiAgentService.js.map +1 -0
  263. package/build/dist/Server/Services/RunnerJobService.js +344 -5
  264. package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
  265. package/build/dist/Server/Services/TelemetryUsageBillingService.js +26 -0
  266. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  267. package/build/dist/Server/Services/TraceRecordingRuleService.js +37 -0
  268. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  269. package/build/dist/Server/Services/VMwareVCenterService.js +104 -0
  270. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  271. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1029 -30
  272. package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
  273. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +633 -28
  274. package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
  275. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +21 -1
  276. package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
  277. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +330 -0
  278. package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -0
  279. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js +160 -0
  280. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessContext.js.map +1 -0
  281. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js +33 -0
  282. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAccessToolNames.js.map +1 -0
  283. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js +640 -0
  284. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiAccessSettings.js.map +1 -0
  285. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js +226 -0
  286. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceAiDeleteCleanup.js.map +1 -0
  287. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +600 -0
  288. package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -0
  289. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +50 -4
  290. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  291. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +55 -4
  292. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  293. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +55 -4
  294. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  295. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +290 -13
  296. package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
  297. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +29 -1
  298. package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
  299. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +9 -1
  300. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  301. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js +627 -0
  302. package/build/dist/Server/Utils/SessionReplay/SessionReplayBudgetMetrics.js.map +1 -0
  303. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js +60 -5
  304. package/build/dist/Server/Utils/SessionReplay/SessionReplayUsage.js.map +1 -1
  305. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +19 -15
  306. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  307. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +19 -15
  308. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
  309. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +17 -1
  310. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  311. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +183 -209
  312. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  313. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +19 -15
  314. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
  315. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +233 -167
  316. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
  317. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +263 -110
  318. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  319. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js +129 -0
  320. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsActivityDeduplicator.js.map +1 -0
  321. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js +266 -0
  322. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCardChoices.js.map +1 -0
  323. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js +258 -0
  324. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsCreateCommands.js.map +1 -0
  325. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js +104 -0
  326. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsMessageSize.js.map +1 -0
  327. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js +183 -0
  328. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsReplies.js.map +1 -0
  329. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js +123 -0
  330. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsTimezone.js.map +1 -0
  331. package/build/dist/Types/AI/ResourceAiAccessApi.js +30 -0
  332. package/build/dist/Types/AI/ResourceAiAccessApi.js.map +1 -0
  333. package/build/dist/Types/AI/ResourceAiAccessPermissions.js +98 -0
  334. package/build/dist/Types/AI/ResourceAiAccessPermissions.js.map +1 -0
  335. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +116 -29
  336. package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
  337. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +47 -21
  338. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  339. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +5 -0
  340. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  341. package/build/dist/Types/Monitor/RumAlertTemplates.js +199 -3
  342. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  343. package/build/dist/Types/ResourceAiAgent/AiResourceType.js +242 -0
  344. package/build/dist/Types/ResourceAiAgent/AiResourceType.js.map +1 -0
  345. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +275 -0
  346. package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -0
  347. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js +45 -0
  348. package/build/dist/Types/Rum/SessionReplayBudgetMetricType.js.map +1 -0
  349. package/build/dist/Types/Runbook/RunbookStepType.js +27 -0
  350. package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
  351. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +13 -2
  352. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
  353. package/build/dist/Utils/AI/InvestigationReport.js +71 -11
  354. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
  355. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js +1462 -0
  356. package/build/dist/Utils/AiRemediation/Resource/CephCommandPolicy.js.map +1 -0
  357. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js +122 -0
  358. package/build/dist/Utils/AiRemediation/Resource/DatabaseCommandPolicy.js.map +1 -0
  359. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js +1139 -0
  360. package/build/dist/Utils/AiRemediation/Resource/DatabaseDiagnosticCatalog.js.map +1 -0
  361. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js +1060 -0
  362. package/build/dist/Utils/AiRemediation/Resource/DatabaseQueryRedactor.js.map +1 -0
  363. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js +1301 -0
  364. package/build/dist/Utils/AiRemediation/Resource/DockerCliGrammar.js.map +1 -0
  365. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js +370 -0
  366. package/build/dist/Utils/AiRemediation/Resource/DockerEngineCommandPolicy.js.map +1 -0
  367. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js +498 -0
  368. package/build/dist/Utils/AiRemediation/Resource/DockerSwarmCommandPolicy.js.map +1 -0
  369. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js +1565 -0
  370. package/build/dist/Utils/AiRemediation/Resource/GovcCommandPolicy.js.map +1 -0
  371. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js +2206 -0
  372. package/build/dist/Utils/AiRemediation/Resource/HostCommandPolicy.js.map +1 -0
  373. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js +1129 -0
  374. package/build/dist/Utils/AiRemediation/Resource/ProxmoxCommandPolicy.js.map +1 -0
  375. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js +565 -0
  376. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicy.js.map +1 -0
  377. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js +408 -0
  378. package/build/dist/Utils/AiRemediation/Resource/ResourceCommandPolicyCore.js.map +1 -0
  379. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js +1910 -0
  380. package/build/dist/Utils/AiRemediation/Resource/ResourceOutputRedactor.js.map +1 -0
  381. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js +160 -0
  382. package/build/dist/Utils/SessionReplay/SessionReplayBudgetMetricType.js.map +1 -0
  383. 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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"}