@oneuptime/common 12.0.5 → 12.0.6

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 (528) hide show
  1. package/Models/DatabaseModels/AIRun.ts +33 -0
  2. package/Models/DatabaseModels/DataSource.ts +744 -0
  3. package/Models/DatabaseModels/Index.ts +3 -0
  4. package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
  5. package/Models/DatabaseModels/User.ts +2 -0
  6. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  7. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  8. package/Models/DatabaseModels/UserSession.ts +2 -0
  9. package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
  10. package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
  11. package/Server/API/AIInsightAPI.ts +47 -4
  12. package/Server/API/AIInvestigationAPI.ts +25 -0
  13. package/Server/API/DashboardAPI.ts +176 -492
  14. package/Server/API/DataSourceAPI.ts +268 -0
  15. package/Server/API/StatusPageAPI.ts +11 -1
  16. package/Server/API/UserAPI.ts +119 -0
  17. package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  22. package/Server/Infrastructure/Queue.ts +26 -0
  23. package/Server/Infrastructure/QueueWorker.ts +17 -0
  24. package/Server/Middleware/TelemetryIngest.ts +8 -3
  25. package/Server/Services/AIInsightService.ts +132 -12
  26. package/Server/Services/AIRunService.ts +34 -0
  27. package/Server/Services/AIService.ts +17 -2
  28. package/Server/Services/AlertService.ts +38 -32
  29. package/Server/Services/AnalyticsDatabaseService.ts +8 -4
  30. package/Server/Services/DataSourceService.ts +200 -0
  31. package/Server/Services/HostService.ts +92 -0
  32. package/Server/Services/IncidentService.ts +45 -0
  33. package/Server/Services/Index.ts +2 -0
  34. package/Server/Services/MonitorService.ts +49 -0
  35. package/Server/Services/MonitorStatusService.ts +166 -0
  36. package/Server/Services/OpenTelemetryIngestService.ts +255 -184
  37. package/Server/Services/RumSessionPinService.ts +7 -21
  38. package/Server/Services/StatusPageSubscriberService.ts +13 -0
  39. package/Server/Services/UserService.ts +280 -9
  40. package/Server/Static/Vendor/README.md +62 -0
  41. package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
  42. package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
  43. package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
  44. package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
  45. package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
  46. package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
  47. package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
  48. package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
  49. package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
  50. package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
  51. package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
  52. package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
  53. package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
  54. package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
  55. package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
  56. package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
  57. package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
  58. package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
  59. package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
  60. package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
  61. package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
  62. package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
  63. package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
  64. package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
  65. package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
  66. package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
  67. package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
  68. package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
  69. package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
  70. package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
  71. package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
  72. package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
  73. package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
  74. package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
  75. package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
  76. package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
  77. package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
  78. package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
  79. package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
  80. package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
  81. package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
  82. package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
  83. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
  84. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
  85. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
  86. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
  87. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
  88. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
  89. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
  90. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
  91. package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
  92. package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
  93. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
  94. package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
  95. package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
  96. package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
  97. package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
  98. package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
  99. package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
  100. package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
  101. package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
  102. package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
  103. package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
  104. package/Server/Utils/DataSource/EgressGuard.ts +446 -0
  105. package/Server/Utils/DataSource/HttpFetch.ts +221 -0
  106. package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
  107. package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
  108. package/Server/Utils/DataSource/Types.ts +93 -0
  109. package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
  110. package/Server/Utils/InProcessMemo.ts +141 -0
  111. package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
  112. package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
  113. package/Server/Utils/Monitor/MonitorResource.ts +14 -0
  114. package/Server/Utils/Response.ts +12 -1
  115. package/Server/Utils/SSRFProtection.ts +237 -0
  116. package/Server/Utils/StartServer.ts +8 -0
  117. package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
  118. package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
  119. package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
  120. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
  121. package/Server/Utils/Telemetry/Telemetry.ts +112 -1
  122. package/Server/Utils/Telemetry.ts +104 -3
  123. package/Server/Utils/VendorAssets.ts +165 -0
  124. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
  125. package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
  126. package/Server/Views/Partials/Head.ejs +21 -7
  127. package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
  128. package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
  129. package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
  130. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
  131. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
  132. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
  133. package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
  134. package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
  135. package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
  136. package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
  137. package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
  138. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
  139. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
  140. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
  141. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
  142. package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
  143. package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
  144. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
  145. package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
  146. package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
  147. package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
  148. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
  149. package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
  150. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
  151. package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
  152. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
  153. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
  154. package/Tests/Server/Services/AIInsightService.test.ts +266 -11
  155. package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
  156. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
  157. package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
  158. package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
  159. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
  160. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
  161. package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
  162. package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
  163. package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
  164. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
  165. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
  166. package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
  167. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
  168. package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
  169. package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
  170. package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
  171. package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
  172. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
  173. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
  174. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
  175. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
  176. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
  177. package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
  178. package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
  179. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
  180. package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
  181. package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
  182. package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
  183. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
  184. package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
  185. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
  186. package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
  187. package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
  188. package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
  189. package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
  190. package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
  191. package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
  192. package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
  193. package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
  194. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
  195. package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
  196. package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
  197. package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
  198. package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
  199. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
  200. package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
  201. package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
  202. package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
  203. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
  204. package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
  205. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
  206. package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
  207. package/Tests/Server/Utils/Telemetry.test.ts +87 -0
  208. package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
  209. package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
  210. package/Tests/Server/Views/OfflineRender.test.ts +297 -0
  211. package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
  212. package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
  213. package/Tests/Types/Password.test.ts +363 -0
  214. package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
  215. package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
  216. package/Tests/UI/Components/Modal.test.tsx +281 -1
  217. package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
  218. package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
  219. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
  220. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  221. package/Tests/Utils/Analytics.test.ts +23 -0
  222. package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
  223. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
  224. package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
  225. package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
  226. package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
  227. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
  228. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
  229. package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
  230. package/Types/AI/AIInsightEvidence.ts +6 -0
  231. package/Types/Analytics/RevenueEvent.ts +31 -0
  232. package/Types/Dashboard/DashboardComponentType.ts +31 -0
  233. package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
  234. package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
  235. package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
  236. package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
  237. package/Types/DataSource/DataSourceLimits.ts +62 -0
  238. package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
  239. package/Types/DataSource/DataSourceTableResult.ts +38 -0
  240. package/Types/DataSource/DataSourceType.ts +213 -0
  241. package/Types/Date.ts +43 -3
  242. package/Types/Password.ts +64 -0
  243. package/Types/Permission.ts +46 -0
  244. package/Types/UserAuthenticationStatus.ts +34 -0
  245. package/UI/Components/Button/Button.tsx +1 -1
  246. package/UI/Components/ErrorBoundary.tsx +459 -108
  247. package/UI/Components/Icon/Icon.tsx +10 -9
  248. package/UI/Components/Modal/ConfirmModal.tsx +6 -1
  249. package/UI/Components/Modal/Modal.tsx +267 -35
  250. package/UI/Components/Modal/ModalFooter.tsx +6 -1
  251. package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
  252. package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
  253. package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
  254. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
  255. package/UI/Components/StatusPage/ResourceList.tsx +570 -0
  256. package/UI/Styles/Theme.css +18 -0
  257. package/UI/Utils/API/RequestOptions.ts +7 -0
  258. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
  259. package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
  260. package/UI/Utils/TestDataSource.ts +61 -0
  261. package/UI/esbuild-config.js +45 -0
  262. package/Utils/Analytics.ts +15 -0
  263. package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
  264. package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
  265. package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
  266. package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
  267. package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
  268. package/Utils/Dashboard/Components/Index.ts +28 -0
  269. package/Utils/DataSource/DataSourceQueryText.ts +94 -0
  270. package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
  271. package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
  272. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
  273. package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
  274. package/Utils/StatusPage/ResourceExplorer.ts +853 -0
  275. package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
  276. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
  278. package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
  279. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  280. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
  282. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/User.js +2 -0
  284. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  286. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  288. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
  290. package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
  292. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
  294. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  295. package/build/dist/Server/API/AIInsightAPI.js +34 -4
  296. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  297. package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
  298. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  299. package/build/dist/Server/API/DashboardAPI.js +119 -433
  300. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  301. package/build/dist/Server/API/DataSourceAPI.js +173 -0
  302. package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
  303. package/build/dist/Server/API/StatusPageAPI.js +11 -1
  304. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  305. package/build/dist/Server/API/UserAPI.js +94 -2
  306. package/build/dist/Server/API/UserAPI.js.map +1 -1
  307. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
  308. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  309. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
  310. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
  311. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
  312. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
  313. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
  314. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
  315. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  316. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  317. package/build/dist/Server/Infrastructure/Queue.js +27 -0
  318. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  319. package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
  320. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  321. package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
  322. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  323. package/build/dist/Server/Services/AIInsightService.js +110 -10
  324. package/build/dist/Server/Services/AIInsightService.js.map +1 -1
  325. package/build/dist/Server/Services/AIRunService.js +34 -0
  326. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  327. package/build/dist/Server/Services/AIService.js +16 -2
  328. package/build/dist/Server/Services/AIService.js.map +1 -1
  329. package/build/dist/Server/Services/AlertService.js +28 -35
  330. package/build/dist/Server/Services/AlertService.js.map +1 -1
  331. package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
  332. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  333. package/build/dist/Server/Services/DataSourceService.js +159 -0
  334. package/build/dist/Server/Services/DataSourceService.js.map +1 -0
  335. package/build/dist/Server/Services/HostService.js +74 -0
  336. package/build/dist/Server/Services/HostService.js.map +1 -1
  337. package/build/dist/Server/Services/IncidentService.js +35 -24
  338. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  339. package/build/dist/Server/Services/Index.js +2 -0
  340. package/build/dist/Server/Services/Index.js.map +1 -1
  341. package/build/dist/Server/Services/MonitorService.js +45 -0
  342. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  343. package/build/dist/Server/Services/MonitorStatusService.js +129 -0
  344. package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
  345. package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
  346. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  347. package/build/dist/Server/Services/RumSessionPinService.js +7 -15
  348. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  349. package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
  350. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  351. package/build/dist/Server/Services/UserService.js +241 -10
  352. package/build/dist/Server/Services/UserService.js.map +1 -1
  353. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
  354. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
  356. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
  358. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
  360. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  361. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
  362. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  363. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
  364. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  365. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
  366. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
  368. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  369. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
  372. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  373. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
  374. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  375. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
  376. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
  377. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
  378. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
  379. package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
  380. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
  381. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
  382. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
  383. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
  384. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
  385. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
  386. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
  387. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
  388. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
  389. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
  390. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
  391. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
  392. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
  393. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
  394. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
  395. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
  396. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
  397. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
  398. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
  399. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
  400. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
  401. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
  402. package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
  403. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
  404. package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
  405. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
  407. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
  408. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
  409. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
  410. package/build/dist/Server/Utils/DataSource/Types.js +2 -0
  411. package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
  412. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
  413. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  414. package/build/dist/Server/Utils/InProcessMemo.js +113 -0
  415. package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
  416. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
  417. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
  418. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
  419. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  420. package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
  421. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  422. package/build/dist/Server/Utils/Response.js +9 -1
  423. package/build/dist/Server/Utils/Response.js.map +1 -1
  424. package/build/dist/Server/Utils/SSRFProtection.js +192 -0
  425. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
  426. package/build/dist/Server/Utils/StartServer.js +7 -0
  427. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  428. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
  429. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  430. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
  431. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  432. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
  433. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
  434. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
  435. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
  436. package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
  437. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  438. package/build/dist/Server/Utils/Telemetry.js +93 -6
  439. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  440. package/build/dist/Server/Utils/VendorAssets.js +121 -0
  441. package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
  442. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
  443. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  444. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
  445. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  446. package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
  447. package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
  448. package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
  449. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  450. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
  451. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
  452. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
  453. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
  454. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
  455. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
  456. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
  457. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
  458. package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
  459. package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
  460. package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
  461. package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
  462. package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
  463. package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
  464. package/build/dist/Types/DataSource/DataSourceType.js +183 -0
  465. package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
  466. package/build/dist/Types/Date.js +38 -3
  467. package/build/dist/Types/Date.js.map +1 -1
  468. package/build/dist/Types/Password.js +56 -0
  469. package/build/dist/Types/Password.js.map +1 -0
  470. package/build/dist/Types/Permission.js +42 -0
  471. package/build/dist/Types/Permission.js.map +1 -1
  472. package/build/dist/Types/UserAuthenticationStatus.js +2 -0
  473. package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
  474. package/build/dist/UI/Components/ErrorBoundary.js +388 -72
  475. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  476. package/build/dist/UI/Components/Icon/Icon.js +10 -4
  477. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  478. package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
  479. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  480. package/build/dist/UI/Components/Modal/Modal.js +178 -19
  481. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  482. package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
  483. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  484. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
  485. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  486. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
  487. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  488. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
  489. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
  490. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
  491. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
  492. package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
  493. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
  494. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
  495. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  496. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
  497. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  498. package/build/dist/UI/Utils/TestDataSource.js +39 -0
  499. package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
  500. package/build/dist/Utils/Analytics.js +4 -0
  501. package/build/dist/Utils/Analytics.js.map +1 -1
  502. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
  503. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
  504. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
  505. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
  506. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
  507. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
  508. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
  509. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
  510. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
  511. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
  512. package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
  513. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  514. package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
  515. package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
  516. package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
  517. package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
  518. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
  519. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
  520. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
  521. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
  522. package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
  523. package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
  524. package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
  525. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
  526. package/jest.config.json +1 -0
  527. package/package.json +5 -1
  528. package/tsconfig.json +12 -10
@@ -560,6 +560,32 @@ export default class Queue {
560
560
  return waitingCount + activeCount + delayedCount;
561
561
  }
562
562
 
563
+ /*
564
+ * Backlog = jobs still waiting for a worker (waiting + delayed), for
565
+ * autoscaling signals. ACTIVE jobs are deliberately excluded: they are
566
+ * already being served, so to a scaler they are capacity, not demand.
567
+ * Telemetry jobs in particular sit in the active state for the fan-in
568
+ * writer's full flush window (up to TELEMETRY_FANIN_MAX_WAIT_MS) while
569
+ * awaiting their ClickHouse ack, so a fleet scaled on an active-inclusive
570
+ * count converges on pod count = job rate x ack latency — every new pod
571
+ * just parks more jobs without shortening the flush window. Scaling on
572
+ * waiting + delayed only breaks that feedback loop. getQueueSize above
573
+ * keeps the active-inclusive sum for ingest backpressure checks, where
574
+ * in-flight work genuinely counts against capacity.
575
+ */
576
+ @CaptureSpan()
577
+ public static async getQueueBacklogSize(
578
+ queueName: QueueName,
579
+ ): Promise<number> {
580
+ const queue: BullQueue = this.getQueue(queueName);
581
+ const [waitingCount, delayedCount]: [number, number] = await Promise.all([
582
+ queue.getWaitingCount(),
583
+ queue.getDelayedCount(),
584
+ ]);
585
+
586
+ return waitingCount + delayedCount;
587
+ }
588
+
563
589
  @CaptureSpan()
564
590
  public static async getQueueStats(queueName: QueueName): Promise<{
565
591
  waiting: number;
@@ -16,6 +16,7 @@ import Telemetry, {
16
16
  } from "../Utils/Telemetry";
17
17
  import Redis from "./Redis";
18
18
  import GracefulShutdown, { ShutdownPriority } from "../Utils/GracefulShutdown";
19
+ import logger from "../Utils/Logger";
19
20
 
20
21
  export default class QueueWorker {
21
22
  @CaptureSpan()
@@ -120,6 +121,22 @@ export default class QueueWorker {
120
121
  : {}),
121
122
  });
122
123
 
124
+ /*
125
+ * Always log job failures to the container log, independent of telemetry
126
+ * configuration. Error visibility used to ride on @CaptureSpan's
127
+ * exception path, but the decorator is a passthrough when no span
128
+ * exporter is installed — without this listener a job that throws on
129
+ * such a deployment lands in the Redis failed set with no log line.
130
+ */
131
+ worker.on("failed", (job: QueueJob | undefined, error: Error) => {
132
+ logger.error(
133
+ `Queue job failed: ${queueName}/${job?.name || "unknown"} (job ${
134
+ job?.id ?? "unknown"
135
+ })`,
136
+ );
137
+ logger.error(error);
138
+ });
139
+
123
140
  /*
124
141
  * Stop pulling new jobs and let in-flight ones finish on shutdown. Runs in
125
142
  * the Workers tier — before datastores are drained — so jobs mid-flight can
@@ -73,16 +73,21 @@ export default class TelemetryIngest {
73
73
  );
74
74
 
75
75
  if (!projectId) {
76
+ /*
77
+ * The token value itself is deliberately NOT logged: ingestion
78
+ * keys are secrets, and a mistyped-but-nearly-valid token in a
79
+ * log line is a credential leak. The request attributes give
80
+ * operators enough to correlate with the sender.
81
+ */
76
82
  logger.error(
77
- "Invalid service token: " + oneuptimeToken,
83
+ "Invalid service token.",
78
84
  getLogAttributesFromRequest(req as any),
79
85
  );
80
86
 
81
87
  /*
82
88
  * 401 is deliberate (see the missing-token branch above): a
83
89
  * silent 200 drops the payload while the client believes the
84
- * export succeeded. The token value is logged server-side but
85
- * intentionally not echoed back in the response body.
90
+ * export succeeded.
86
91
  */
87
92
  return Response.sendErrorResponse(
88
93
  req,
@@ -8,7 +8,9 @@ import ObjectID from "../../Types/ObjectID";
8
8
  import OneUptimeDate from "../../Types/Date";
9
9
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
10
10
  import BadDataException from "../../Types/Exception/BadDataException";
11
- import AIInsightStatus from "../../Types/AI/AIInsightStatus";
11
+ import AIInsightStatus, {
12
+ AIInsightStatusHelper,
13
+ } from "../../Types/AI/AIInsightStatus";
12
14
  import AIInsightHumanVerdict from "../../Types/AI/AIInsightHumanVerdict";
13
15
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
14
16
 
@@ -25,6 +27,18 @@ export class Service extends DatabaseService<AIInsight> {
25
27
  super(AIInsight);
26
28
  }
27
29
 
30
+ /*
31
+ * The open state an insight returns to when a human takes a terminal
32
+ * action back: FixOpened when an AI fix task was queued for it (that run
33
+ * is still the live thread of work), else ActionRequired — the same two
34
+ * states the scanner routes a freshly detected insight to.
35
+ */
36
+ private getReopenStatus(insight: AIInsight): AIInsightStatus {
37
+ return insight.fixAiRunId
38
+ ? AIInsightStatus.FixOpened
39
+ : AIInsightStatus.ActionRequired;
40
+ }
41
+
28
42
  /*
29
43
  * Human verdict capture — this IS the G11 precision measurement:
30
44
  * confirm/dismiss rates per insight type tell us how precise each
@@ -32,34 +46,123 @@ export class Service extends DatabaseService<AIInsight> {
32
46
  *
33
47
  * Overwriting an existing verdict is deliberate — people change their
34
48
  * minds; the latest verdict wins (per-insight state, not an audit trail).
35
- * Dismissed is a human terminal state, so it also closes the insight;
36
- * Confirmed leaves the status untouched (the insight stays open until a
37
- * human resolves it or a fix lands).
49
+ * Dismissed is a human terminal state, so it also closes the insight.
50
+ *
51
+ * Confirmed normally leaves the status untouched (the insight stays open
52
+ * until a human resolves it or a fix lands) — with one exception: an
53
+ * insight closed AS Dismissed is closed on the grounds that it was noise,
54
+ * which a Confirmed verdict directly contradicts. Leaving it closed there
55
+ * produced the "Dismissed / Confirmed" pill pair with no way back, and
56
+ * kept the InsightStore dismissal cooldown suppressing the very finding
57
+ * the human just called real. So confirming a dismissed insight reopens
58
+ * it, which is also what makes Confirm a working undo for a misclick.
38
59
  *
39
60
  * Callers must have already access-checked the insight under the USER's
40
61
  * permissions — insight rows are server-authored (empty update ACL), so
41
- * this writes as root.
62
+ * this reads and writes as root.
42
63
  */
43
64
  @CaptureSpan()
44
65
  public async applyHumanVerdict(data: {
45
66
  insightId: ObjectID;
46
67
  verdict: AIInsightHumanVerdict;
47
68
  byUserId: ObjectID;
48
- }): Promise<{ insightId: ObjectID; verdict: AIInsightHumanVerdict }> {
49
- await this.updateOneById({
69
+ }): Promise<{
70
+ insightId: ObjectID;
71
+ verdict: AIInsightHumanVerdict;
72
+ status: AIInsightStatus | null;
73
+ }> {
74
+ const insight: AIInsight | null = await this.findOneById({
50
75
  id: data.insightId,
76
+ select: { _id: true, status: true, fixAiRunId: true },
77
+ props: { isRoot: true },
78
+ });
79
+
80
+ if (!insight || !insight.id) {
81
+ throw new BadDataException("AI insight not found.");
82
+ }
83
+
84
+ let nextStatus: AIInsightStatus | null = null;
85
+
86
+ if (data.verdict === AIInsightHumanVerdict.Dismissed) {
87
+ nextStatus = AIInsightStatus.Dismissed;
88
+ } else if (insight.status === AIInsightStatus.Dismissed) {
89
+ nextStatus = this.getReopenStatus(insight);
90
+ }
91
+
92
+ await this.updateOneById({
93
+ id: insight.id,
51
94
  data: {
52
95
  humanVerdict: data.verdict,
53
96
  humanVerdictAt: OneUptimeDate.getCurrentDate(),
54
97
  humanVerdictByUserId: data.byUserId,
55
- ...(data.verdict === AIInsightHumanVerdict.Dismissed
56
- ? { status: AIInsightStatus.Dismissed }
57
- : {}),
98
+ ...(nextStatus ? { status: nextStatus } : {}),
99
+ },
100
+ props: { isRoot: true },
101
+ });
102
+
103
+ return {
104
+ insightId: insight.id,
105
+ verdict: data.verdict,
106
+ status: nextStatus || insight.status || null,
107
+ };
108
+ }
109
+
110
+ /*
111
+ * Undo a terminal action: put a Resolved or Dismissed insight back into
112
+ * the open queue and drop the human verdict that closed it.
113
+ *
114
+ * Both terminal states are one click away from a full stop — a dismissal
115
+ * additionally suppresses the same fingerprint for the whole InsightStore
116
+ * cooldown, so a misclick silently blinds the project to that finding for
117
+ * days. Reopening is the way back: the status returns to the open state
118
+ * the scanner would have routed to, and the verdict is CLEARED rather
119
+ * than kept, because a verdict the human has taken back must not keep
120
+ * counting toward the per-detector precision measurement (and a stale
121
+ * humanVerdictAt would otherwise anchor a future cooldown).
122
+ *
123
+ * Idempotent: reopening an already-open insight is a no-op that reports
124
+ * the current status, so a double click (or two people clicking at once)
125
+ * cannot rewrite a status somebody else just set.
126
+ *
127
+ * Callers must have already access-checked the insight under the USER's
128
+ * permissions — this reads and writes as root.
129
+ */
130
+ @CaptureSpan()
131
+ public async reopenInsight(data: {
132
+ insightId: ObjectID;
133
+ }): Promise<{ insightId: ObjectID; status: AIInsightStatus }> {
134
+ const insight: AIInsight | null = await this.findOneById({
135
+ id: data.insightId,
136
+ select: { _id: true, status: true, fixAiRunId: true },
137
+ props: { isRoot: true },
138
+ });
139
+
140
+ if (!insight || !insight.id) {
141
+ throw new BadDataException("AI insight not found.");
142
+ }
143
+
144
+ if (
145
+ insight.status &&
146
+ !AIInsightStatusHelper.isTerminalStatus(insight.status)
147
+ ) {
148
+ return { insightId: insight.id, status: insight.status };
149
+ }
150
+
151
+ const status: AIInsightStatus = this.getReopenStatus(insight);
152
+
153
+ await this.updateOneById({
154
+ id: insight.id,
155
+ data: {
156
+ status: status,
157
+ // Explicit nulls — the columns are cleared, not left as they were.
158
+ humanVerdict: null as unknown as AIInsightHumanVerdict,
159
+ humanVerdictAt: null as unknown as Date,
160
+ humanVerdictByUserId: null as unknown as ObjectID,
58
161
  },
59
162
  props: { isRoot: true },
60
163
  });
61
164
 
62
- return { insightId: data.insightId, verdict: data.verdict };
165
+ return { insightId: insight.id, status: status };
63
166
  }
64
167
 
65
168
  /*
@@ -79,7 +182,7 @@ export class Service extends DatabaseService<AIInsight> {
79
182
  }): Promise<{ insightId: ObjectID; status: AIInsightStatus }> {
80
183
  const insight: AIInsight | null = await this.findOneById({
81
184
  id: data.insightId,
82
- select: { _id: true, humanVerdict: true },
185
+ select: { _id: true, humanVerdict: true, status: true },
83
186
  props: { isRoot: true },
84
187
  });
85
188
 
@@ -87,6 +190,23 @@ export class Service extends DatabaseService<AIInsight> {
87
190
  throw new BadDataException("AI insight not found.");
88
191
  }
89
192
 
193
+ /*
194
+ * Closing an already-closed insight is a no-op the caller should know
195
+ * about — and resolving a DISMISSED one is actively harmful: the store's
196
+ * re-file cooldown is keyed on the current terminal status, so the flip
197
+ * would silently trade a dismissal's 7-day quiet for a resolve's 24-hour
198
+ * one and let a finding a human called noise come back. The dashboard
199
+ * hides both actions on terminal insights; this closes the API path.
200
+ */
201
+ if (
202
+ insight.status &&
203
+ AIInsightStatusHelper.isTerminalStatus(insight.status)
204
+ ) {
205
+ throw new BadDataException(
206
+ `This AI insight is already ${insight.status.toLowerCase()} and cannot be resolved again.`,
207
+ );
208
+ }
209
+
90
210
  await this.updateOneById({
91
211
  id: insight.id,
92
212
  data: {
@@ -99,6 +99,40 @@ export class Service extends DatabaseService<Model> {
99
99
  return result.affected || 0;
100
100
  }
101
101
 
102
+ /*
103
+ * Persist the AI-written TL;DR of a completed investigation's analysis.
104
+ * Display-only, so this is a plain conditional UPDATE rather than a claim,
105
+ * but it is still write-once: scoped to the run, to the Completed state,
106
+ * and to a row that has no summary yet.
107
+ *
108
+ * The IS NULL guard is what makes the invariant structural rather than
109
+ * incidental. A stale attempt — one that lost the Completed CAS because the
110
+ * sweeper falsely requeued it — is kept out today only by statement order
111
+ * in the engine, and by then the WINNER has already written both the report
112
+ * and its summary, so a status-only guard would happily let the loser
113
+ * overwrite a summary that describes a different analysis. Returns the rows
114
+ * changed; 0 means the run moved on, was removed, or is already summarized.
115
+ */
116
+ @CaptureSpan()
117
+ public async setInvestigationAnalysisTldr(data: {
118
+ aiRunId: ObjectID;
119
+ analysisTldr: string;
120
+ }): Promise<number> {
121
+ const result: UpdateResult = await this.getRepository()
122
+ .createQueryBuilder()
123
+ .update(Model)
124
+ .set({
125
+ analysisTldr: data.analysisTldr,
126
+ } as QueryDeepPartialEntity<Model>)
127
+ .where('"_id" = :id', { id: data.aiRunId.toString() })
128
+ .andWhere('"status" = :status', { status: AIRunStatus.Completed })
129
+ .andWhere('"analysisTldr" IS NULL')
130
+ .andWhere('"deletedAt" IS NULL')
131
+ .execute();
132
+
133
+ return result.affected || 0;
134
+ }
135
+
102
136
  /*
103
137
  * Atomically settle the code-fix decision written as Pending by the
104
138
  * winning investigation completion transition. The recommendation and
@@ -88,6 +88,15 @@ export const AI_INVESTIGATION_GRADING_FEATURE: string =
88
88
  export const AI_CONFIDENCE_CLASSIFICATION_FEATURE: string =
89
89
  "AI Confidence Classification";
90
90
 
91
+ /*
92
+ * The LlmLog feature name for the investigation TL;DR (InvestigationTldr) —
93
+ * one constrained call per completed investigation that has an analysis,
94
+ * outside the per-run caps but inside this daily budget. A budget rejection
95
+ * (or any other failure) simply leaves the run without a TL;DR; the report
96
+ * is still published and the panel omits the block.
97
+ */
98
+ export const AI_INVESTIGATION_TLDR_FEATURE: string = "AI Investigation TLDR";
99
+
91
100
  /*
92
101
  * The LlmLog feature name for server-mediated code-fix agent completions
93
102
  * (B4 Tier 0) — the in-house coding agent's tool loop routes every LLM call
@@ -196,6 +205,12 @@ export const AUTONOMOUS_AI_FEATURES: Array<string> = [
196
205
  AI_INVESTIGATION_GRADING_FEATURE,
197
206
  // One constrained call per completed investigation (ConfidenceSignal).
198
207
  AI_CONFIDENCE_CLASSIFICATION_FEATURE,
208
+ /*
209
+ * One constrained call per completed investigation that produced an
210
+ * analysis (InvestigationTldr) — same storm shape as the classification
211
+ * above, so the same daily budget must cover it.
212
+ */
213
+ AI_INVESTIGATION_TLDR_FEATURE,
199
214
  /*
200
215
  * Server-mediated code-fix agent completions (B4 Tier 0). Fix runs are
201
216
  * user-triggered, but the tool loop then runs unattended for up to ~40
@@ -563,9 +578,9 @@ export class Service extends BaseService {
563
578
 
564
579
  if (budget.exhausted) {
565
580
  const settingsLocation: string = request.incidentId
566
- ? "Incidents > Settings > AI"
581
+ ? "Incidents > AI > Investigation"
567
582
  : request.alertId
568
- ? "Alerts > Settings > AI"
583
+ ? "Alerts > AI > Investigation"
569
584
  : "Project Settings > AI > AI Guardrails";
570
585
  const budgetMessage: string = `Daily autonomous AI token budget exhausted (${budget.usedTokensToday.toLocaleString()} of ${budget.limitInTokens?.toLocaleString()} tokens used today). Autonomous AI requests resume tomorrow (UTC) — raise or unset the limit under ${settingsLocation}.`;
571
586
 
@@ -39,6 +39,7 @@ import { IsBillingEnabled } from "../EnvironmentConfig";
39
39
  import logger, { LogAttributes } from "../Utils/Logger";
40
40
  import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
41
41
  import TelemetryUtil from "../Utils/Telemetry/Telemetry";
42
+ import MetricResourceAttributeUtil from "../../Utils/Metrics/MetricResourceAttributeUtil";
42
43
  import MutableMetricService from "./MutableMetricService";
43
44
  import GlobalConfigService from "./GlobalConfigService";
44
45
  import GlobalConfig from "../../Models/DatabaseModels/GlobalConfig";
@@ -1616,6 +1617,16 @@ ${alertSeverity.name}
1616
1617
  _id: true,
1617
1618
  name: true,
1618
1619
  },
1620
+ /*
1621
+ * A project's own taxonomy. Both become metric attributes below so
1622
+ * dashboards can group MTTA/MTTR by the dimensions the project
1623
+ * actually thinks in.
1624
+ */
1625
+ labels: {
1626
+ _id: true,
1627
+ name: true,
1628
+ },
1629
+ customFields: true,
1619
1630
  },
1620
1631
  props: {
1621
1632
  isRoot: true,
@@ -1692,6 +1703,29 @@ ${alertSeverity.name}
1692
1703
  metricRetentionDays,
1693
1704
  );
1694
1705
 
1706
+ /*
1707
+ * Dimensions shared by every alert metric. Built once so all four
1708
+ * metrics below record the identical attribute set — a dashboard that
1709
+ * groups by oneuptime.label.product must not find the dimension on
1710
+ * AlertCount but missing from TimeToResolve.
1711
+ */
1712
+ const baseMetricAttributes: JSONObject = {
1713
+ alertId: data.alertId.toString(),
1714
+ projectId: alert.projectId.toString(),
1715
+ monitorId: alert.monitor?._id?.toString(),
1716
+ monitorName: alert.monitor?.name?.toString(),
1717
+ alertSeverityId: alert.alertSeverity?._id?.toString(),
1718
+ alertSeverityName: alert.alertSeverity?.name?.toString(),
1719
+ /*
1720
+ * oneuptime.label.* / oneuptime.customField.* — namespaced, so they can
1721
+ * never collide with the unprefixed dimensions above.
1722
+ */
1723
+ ...MetricResourceAttributeUtil.getResourceAttributes({
1724
+ labels: alert.labels,
1725
+ customFields: alert.customFields,
1726
+ }),
1727
+ };
1728
+
1695
1729
  // now we need to create new metrics for this alert - TimeToAcknowledge, TimeToResolve, AlertCount, AlertDuration
1696
1730
  const alertStartsAt: Date =
1697
1731
  firstAlertStateTimeline?.startsAt ||
@@ -1714,14 +1748,7 @@ ${alertSeverity.name}
1714
1748
  alertCountMetric.name = AlertMetricType.AlertCount;
1715
1749
  alertCountMetric.metricPointId = AlertMetricType.AlertCount;
1716
1750
  alertCountMetric.value = 1;
1717
- alertCountMetric.attributes = {
1718
- alertId: data.alertId.toString(),
1719
- projectId: alert.projectId.toString(),
1720
- monitorId: alert.monitor?._id?.toString(),
1721
- monitorName: alert.monitor?.name?.toString(),
1722
- alertSeverityId: alert.alertSeverity?._id?.toString(),
1723
- alertSeverityName: alert.alertSeverity?.name?.toString(),
1724
- };
1751
+ alertCountMetric.attributes = { ...baseMetricAttributes };
1725
1752
  alertCountMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
1726
1753
  alertCountMetric.attributes,
1727
1754
  );
@@ -1768,14 +1795,7 @@ ${alertSeverity.name}
1768
1795
  ackAlertStateTimeline?.startsAt || OneUptimeDate.getCurrentDate(),
1769
1796
  alertStartsAt,
1770
1797
  );
1771
- timeToAcknowledgeMetric.attributes = {
1772
- alertId: data.alertId.toString(),
1773
- projectId: alert.projectId.toString(),
1774
- monitorId: alert.monitor?._id?.toString(),
1775
- monitorName: alert.monitor?.name?.toString(),
1776
- alertSeverityId: alert.alertSeverity?._id?.toString(),
1777
- alertSeverityName: alert.alertSeverity?.name?.toString(),
1778
- };
1798
+ timeToAcknowledgeMetric.attributes = { ...baseMetricAttributes };
1779
1799
  timeToAcknowledgeMetric.attributeKeys =
1780
1800
  TelemetryUtil.getAttributeKeys(timeToAcknowledgeMetric.attributes);
1781
1801
 
@@ -1825,14 +1845,7 @@ ${alertSeverity.name}
1825
1845
  OneUptimeDate.getCurrentDate(),
1826
1846
  alertStartsAt,
1827
1847
  );
1828
- timeToResolveMetric.attributes = {
1829
- alertId: data.alertId.toString(),
1830
- projectId: alert.projectId.toString(),
1831
- monitorId: alert.monitor?._id?.toString(),
1832
- monitorName: alert.monitor?.name?.toString(),
1833
- alertSeverityId: alert.alertSeverity?._id?.toString(),
1834
- alertSeverityName: alert.alertSeverity?.name?.toString(),
1835
- };
1848
+ timeToResolveMetric.attributes = { ...baseMetricAttributes };
1836
1849
  timeToResolveMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
1837
1850
  timeToResolveMetric.attributes,
1838
1851
  );
@@ -1872,14 +1885,7 @@ ${alertSeverity.name}
1872
1885
  alertEndsAt,
1873
1886
  alertStartsAt,
1874
1887
  );
1875
- alertDurationMetric.attributes = {
1876
- alertId: data.alertId.toString(),
1877
- projectId: alert.projectId.toString(),
1878
- monitorId: alert.monitor?._id?.toString(),
1879
- monitorName: alert.monitor?.name?.toString(),
1880
- alertSeverityId: alert.alertSeverity?._id?.toString(),
1881
- alertSeverityName: alert.alertSeverity?.name?.toString(),
1882
- };
1888
+ alertDurationMetric.attributes = { ...baseMetricAttributes };
1883
1889
  alertDurationMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
1884
1890
  alertDurationMetric.attributes,
1885
1891
  );
@@ -175,10 +175,14 @@ export const MigrationExecuteOptions: ClickhouseExecuteOptions = {
175
175
  * TelemetryFanInWriter can consume deterministic tokens without an import
176
176
  * cycle. Re-exported here for existing callers.
177
177
  *
178
- * HTTP-path inserts run outside the context and are always fire-and-forget
179
- * (wait_for_async_insert=0) flush waiting, when opted into via
180
- * TELEMETRY_WAIT_FOR_ASYNC_INSERT, is only affordable off the request
181
- * thread and therefore only applies to tokened (queue-job) inserts.
178
+ * The ack mode is independent of tokening: TELEMETRY_WAIT_FOR_ASYNC_INSERT
179
+ * (shouldWaitForAsyncInsert below) is applied to EVERY insertJsonRows call,
180
+ * with or without a dedup token. Whether a telemetry queue job's writes
181
+ * carry per-job tokens from this context is a separate policy decided in
182
+ * the worker: the high-volume signals (traces/logs/metrics) run untokened
183
+ * so the fan-in writer can merge them into cross-job INSERTs under minted
184
+ * per-batch tokens — see shouldUseInsertDedup in
185
+ * App/FeatureSet/Telemetry/Jobs/TelemetryIngest/ProcessTelemetry.ts.
182
186
  */
183
187
  export {
184
188
  runWithInsertDedup,