@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
@@ -41,6 +41,7 @@ import CloudResourceService from "./CloudResourceService";
41
41
  import RumApplicationService from "./RumApplicationService";
42
42
  import IoTFleetService from "./IoTFleetService";
43
43
  import GlobalCache from "../Infrastructure/GlobalCache";
44
+ import InProcessMemo from "../Utils/InProcessMemo";
44
45
  import ColumnLength from "../../Types/Database/ColumnLength";
45
46
  import EntityType from "../../Types/Telemetry/EntityType";
46
47
  import { ExtractedEntity } from "../Utils/Telemetry/TelemetryEntity";
@@ -228,6 +229,44 @@ const SERVICE_RESOLUTION_CACHE_TTL_SECONDS: number = 5 * 60;
228
229
  const serviceResolutionInProcessCache: Map<string, CachedServiceResolution> =
229
230
  new Map();
230
231
 
232
+ /*
233
+ * Per-resource retention overrides for non-Service telemetry (Host,
234
+ * DockerHost, KubernetesCluster, …), as read by `getResourceRetention`.
235
+ */
236
+ interface ResourceRetention {
237
+ retainTelemetryDataForDays: number | null;
238
+ telemetryRetentionConfig: TelemetryRetentionConfig | null;
239
+ }
240
+
241
+ /*
242
+ * Per-process memo for `(entityType, entityId) -> retention override`,
243
+ * mirroring the service-resolution memo above but with no Redis layer —
244
+ * the lookup underneath is a single-row findOneById by primary key, so the
245
+ * only cost worth removing is the per-resource-block Postgres round trip,
246
+ * and a Redis GET would cost the same round trip it saves.
247
+ *
248
+ * This memo is what actually removes those round trips. The signal
249
+ * services' per-batch `serviceDictionary` cannot: all three populate it
250
+ * AFTER `resolveTelemetryResource` returns and never consult it before
251
+ * calling in, so every resource block of every batch reached this lookup
252
+ * uncached — for hostmetrics payloads that is one Postgres SELECT per
253
+ * ResourceMetrics entry per job, fleet-wide.
254
+ *
255
+ * Staleness: a user editing a resource's retention settings is picked up
256
+ * within the 60-second TTL, which is acceptable — retention is applied at
257
+ * row-stamp time, so a minute of new rows carrying the previous retention
258
+ * matches the lag the project-retention cache above already accepts (and
259
+ * that one tolerates five minutes). Bounded at 10k entries because entity
260
+ * ids arrive from collector-controlled payloads.
261
+ */
262
+ const RESOURCE_RETENTION_MEMO_TTL_IN_MS: number = 60 * 1000;
263
+ const RESOURCE_RETENTION_MEMO_MAX_ENTRIES: number = 10_000;
264
+ const resourceRetentionInProcessMemo: InProcessMemo<ResourceRetention> =
265
+ new InProcessMemo<ResourceRetention>({
266
+ ttlInMs: RESOURCE_RETENTION_MEMO_TTL_IN_MS,
267
+ maxEntries: RESOURCE_RETENTION_MEMO_MAX_ENTRIES,
268
+ });
269
+
231
270
  export default class OTelIngestService {
232
271
  /*
233
272
  * Read a single string-valued OTel resource attribute out of the raw
@@ -817,13 +856,8 @@ export default class OTelIngestService {
817
856
  const projectContext: ProjectRetentionContext =
818
857
  await this.getProjectRetentionContext(data.projectId);
819
858
 
820
- const resourceRetention: {
821
- retainTelemetryDataForDays: number | null;
822
- telemetryRetentionConfig: TelemetryRetentionConfig | null;
823
- } = await this.getResourceRetention(
824
- data.resourceId,
825
- data.primaryEntityType,
826
- );
859
+ const resourceRetention: ResourceRetention =
860
+ await this.getResourceRetention(data.resourceId, data.primaryEntityType);
827
861
 
828
862
  return {
829
863
  serviceName: data.serviceName,
@@ -840,22 +874,120 @@ export default class OTelIngestService {
840
874
  }
841
875
 
842
876
  /*
843
- * Look up per-resource retention overrides for non-Service telemetry.
844
- * One small SELECT per batch the caller caches the resulting
845
- * TelemetryServiceMetadata under `serviceDictionary[serviceName]`
846
- * so steady-state ingest skips this lookup after the first row.
877
+ * Look up per-resource retention overrides for non-Service telemetry,
878
+ * memoized per (entityType, entityId) for 60 seconds.
879
+ *
880
+ * The memo lives HERE, in the callee, because no caller caches this. An
881
+ * earlier comment claimed the signal services cache the resulting
882
+ * TelemetryServiceMetadata under `serviceDictionary[serviceName]` — they
883
+ * do store it there, but only AFTER `resolveTelemetryResource` has
884
+ * already run, and none of the three (logs / traces / metrics) reads the
885
+ * dictionary before calling in. Every resource block therefore reached
886
+ * this lookup uncached: one Postgres findOneById per ResourceMetrics /
887
+ * ResourceLogs / ResourceSpans entry per job. A retention edit made in
888
+ * the UI propagates to newly stamped rows within the memo TTL (60s),
889
+ * which is acceptable — see the memo declaration for the full staleness
890
+ * rationale.
891
+ *
892
+ * Lookup errors are NOT memoized: a transient Postgres failure falls
893
+ * back to "no override" for this call only, and the next resource block
894
+ * retries — the same per-call fallback behaviour as before the memo.
847
895
  */
848
896
  @CaptureSpan()
849
897
  private static async getResourceRetention(
850
898
  resourceId: ObjectID,
851
899
  primaryEntityType: ServiceType,
852
- ): Promise<{
853
- retainTelemetryDataForDays: number | null;
854
- telemetryRetentionConfig: TelemetryRetentionConfig | null;
855
- }> {
900
+ ): Promise<ResourceRetention> {
901
+ const memoKey: string = `${primaryEntityType}:${resourceId.toString()}`;
902
+
903
+ // L1: in-process memo. Zero network cost.
904
+ const memoedRetention: ResourceRetention | undefined =
905
+ resourceRetentionInProcessMemo.get(memoKey);
906
+ if (memoedRetention) {
907
+ return memoedRetention;
908
+ }
909
+
856
910
  try {
857
- if (primaryEntityType === ServiceType.Host) {
858
- const host: Host | null = await HostService.findOneById({
911
+ const retention: ResourceRetention = await this.findResourceRetention(
912
+ resourceId,
913
+ primaryEntityType,
914
+ );
915
+ resourceRetentionInProcessMemo.set(memoKey, retention);
916
+ return retention;
917
+ } catch (err) {
918
+ logger.warn(
919
+ `Per-resource retention lookup failed for ${primaryEntityType} ${resourceId.toString()}: ${
920
+ err instanceof Error ? err.message : String(err)
921
+ }`,
922
+ );
923
+ }
924
+ return {
925
+ retainTelemetryDataForDays: null,
926
+ telemetryRetentionConfig: null,
927
+ };
928
+ }
929
+
930
+ /*
931
+ * The uncached per-entity-type lookup underneath getResourceRetention.
932
+ * Entity types that carry no retention override (Monitor, Unknown) fall
933
+ * through to the "no override" default — that result is memoized too,
934
+ * since re-deriving it is what the memo exists to avoid.
935
+ */
936
+ private static async findResourceRetention(
937
+ resourceId: ObjectID,
938
+ primaryEntityType: ServiceType,
939
+ ): Promise<ResourceRetention> {
940
+ if (primaryEntityType === ServiceType.Host) {
941
+ const host: Host | null = await HostService.findOneById({
942
+ id: resourceId,
943
+ select: {
944
+ retainTelemetryDataForDays: true,
945
+ telemetryRetentionConfig: true,
946
+ },
947
+ props: { isRoot: true },
948
+ });
949
+ return {
950
+ retainTelemetryDataForDays: host?.retainTelemetryDataForDays ?? null,
951
+ telemetryRetentionConfig: host?.telemetryRetentionConfig ?? null,
952
+ };
953
+ }
954
+ if (primaryEntityType === ServiceType.DockerHost) {
955
+ const dockerHost: DockerHost | null = await DockerHostService.findOneById(
956
+ {
957
+ id: resourceId,
958
+ select: {
959
+ retainTelemetryDataForDays: true,
960
+ telemetryRetentionConfig: true,
961
+ },
962
+ props: { isRoot: true },
963
+ },
964
+ );
965
+ return {
966
+ retainTelemetryDataForDays:
967
+ dockerHost?.retainTelemetryDataForDays ?? null,
968
+ telemetryRetentionConfig: dockerHost?.telemetryRetentionConfig ?? null,
969
+ };
970
+ }
971
+ if (primaryEntityType === ServiceType.PodmanHost) {
972
+ const podmanHost: PodmanHost | null = await PodmanHostService.findOneById(
973
+ {
974
+ id: resourceId,
975
+ select: {
976
+ retainTelemetryDataForDays: true,
977
+ telemetryRetentionConfig: true,
978
+ },
979
+ props: { isRoot: true },
980
+ },
981
+ );
982
+ return {
983
+ retainTelemetryDataForDays:
984
+ podmanHost?.retainTelemetryDataForDays ?? null,
985
+ telemetryRetentionConfig: podmanHost?.telemetryRetentionConfig ?? null,
986
+ };
987
+ }
988
+ if (primaryEntityType === ServiceType.KubernetesCluster) {
989
+ const cluster: KubernetesCluster | null =
990
+ await KubernetesClusterService.findOneById({
859
991
  id: resourceId,
860
992
  select: {
861
993
  retainTelemetryDataForDays: true,
@@ -863,79 +995,14 @@ export default class OTelIngestService {
863
995
  },
864
996
  props: { isRoot: true },
865
997
  });
866
- return {
867
- retainTelemetryDataForDays: host?.retainTelemetryDataForDays ?? null,
868
- telemetryRetentionConfig: host?.telemetryRetentionConfig ?? null,
869
- };
870
- }
871
- if (primaryEntityType === ServiceType.DockerHost) {
872
- const dockerHost: DockerHost | null =
873
- await DockerHostService.findOneById({
874
- id: resourceId,
875
- select: {
876
- retainTelemetryDataForDays: true,
877
- telemetryRetentionConfig: true,
878
- },
879
- props: { isRoot: true },
880
- });
881
- return {
882
- retainTelemetryDataForDays:
883
- dockerHost?.retainTelemetryDataForDays ?? null,
884
- telemetryRetentionConfig:
885
- dockerHost?.telemetryRetentionConfig ?? null,
886
- };
887
- }
888
- if (primaryEntityType === ServiceType.PodmanHost) {
889
- const podmanHost: PodmanHost | null =
890
- await PodmanHostService.findOneById({
891
- id: resourceId,
892
- select: {
893
- retainTelemetryDataForDays: true,
894
- telemetryRetentionConfig: true,
895
- },
896
- props: { isRoot: true },
897
- });
898
- return {
899
- retainTelemetryDataForDays:
900
- podmanHost?.retainTelemetryDataForDays ?? null,
901
- telemetryRetentionConfig:
902
- podmanHost?.telemetryRetentionConfig ?? null,
903
- };
904
- }
905
- if (primaryEntityType === ServiceType.KubernetesCluster) {
906
- const cluster: KubernetesCluster | null =
907
- await KubernetesClusterService.findOneById({
908
- id: resourceId,
909
- select: {
910
- retainTelemetryDataForDays: true,
911
- telemetryRetentionConfig: true,
912
- },
913
- props: { isRoot: true },
914
- });
915
- return {
916
- retainTelemetryDataForDays:
917
- cluster?.retainTelemetryDataForDays ?? null,
918
- telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
919
- };
920
- }
921
- if (primaryEntityType === ServiceType.ProxmoxCluster) {
922
- const cluster: ProxmoxCluster | null =
923
- await ProxmoxClusterService.findOneById({
924
- id: resourceId,
925
- select: {
926
- retainTelemetryDataForDays: true,
927
- telemetryRetentionConfig: true,
928
- },
929
- props: { isRoot: true },
930
- });
931
- return {
932
- retainTelemetryDataForDays:
933
- cluster?.retainTelemetryDataForDays ?? null,
934
- telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
935
- };
936
- }
937
- if (primaryEntityType === ServiceType.IoTDevice) {
938
- const fleet: IoTFleet | null = await IoTFleetService.findOneById({
998
+ return {
999
+ retainTelemetryDataForDays: cluster?.retainTelemetryDataForDays ?? null,
1000
+ telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
1001
+ };
1002
+ }
1003
+ if (primaryEntityType === ServiceType.ProxmoxCluster) {
1004
+ const cluster: ProxmoxCluster | null =
1005
+ await ProxmoxClusterService.findOneById({
939
1006
  id: resourceId,
940
1007
  select: {
941
1008
  retainTelemetryDataForDays: true,
@@ -943,100 +1010,104 @@ export default class OTelIngestService {
943
1010
  },
944
1011
  props: { isRoot: true },
945
1012
  });
946
- return {
947
- retainTelemetryDataForDays: fleet?.retainTelemetryDataForDays ?? null,
948
- telemetryRetentionConfig: fleet?.telemetryRetentionConfig ?? null,
949
- };
950
- }
951
- if (primaryEntityType === ServiceType.CephCluster) {
952
- const cluster: CephCluster | null =
953
- await CephClusterService.findOneById({
954
- id: resourceId,
955
- select: {
956
- retainTelemetryDataForDays: true,
957
- telemetryRetentionConfig: true,
958
- },
959
- props: { isRoot: true },
960
- });
961
- return {
962
- retainTelemetryDataForDays:
963
- cluster?.retainTelemetryDataForDays ?? null,
964
- telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
965
- };
966
- }
967
- if (primaryEntityType === ServiceType.DockerSwarmCluster) {
968
- const cluster: DockerSwarmCluster | null =
969
- await DockerSwarmClusterService.findOneById({
970
- id: resourceId,
971
- select: {
972
- retainTelemetryDataForDays: true,
973
- telemetryRetentionConfig: true,
974
- },
975
- props: { isRoot: true },
976
- });
977
- return {
978
- retainTelemetryDataForDays:
979
- cluster?.retainTelemetryDataForDays ?? null,
980
- telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
981
- };
982
- }
983
- if (primaryEntityType === ServiceType.ServerlessFunction) {
984
- const serverlessFunction: ServerlessFunction | null =
985
- await ServerlessFunctionService.findOneById({
986
- id: resourceId,
987
- select: {
988
- retainTelemetryDataForDays: true,
989
- telemetryRetentionConfig: true,
990
- },
991
- props: { isRoot: true },
992
- });
993
- return {
994
- retainTelemetryDataForDays:
995
- serverlessFunction?.retainTelemetryDataForDays ?? null,
996
- telemetryRetentionConfig:
997
- serverlessFunction?.telemetryRetentionConfig ?? null,
998
- };
999
- }
1000
- if (primaryEntityType === ServiceType.CloudResource) {
1001
- const cloudResource: CloudResource | null =
1002
- await CloudResourceService.findOneById({
1003
- id: resourceId,
1004
- select: {
1005
- retainTelemetryDataForDays: true,
1006
- telemetryRetentionConfig: true,
1007
- },
1008
- props: { isRoot: true },
1009
- });
1010
- return {
1011
- retainTelemetryDataForDays:
1012
- cloudResource?.retainTelemetryDataForDays ?? null,
1013
- telemetryRetentionConfig:
1014
- cloudResource?.telemetryRetentionConfig ?? null,
1015
- };
1016
- }
1017
- if (primaryEntityType === ServiceType.RealUserMonitor) {
1018
- const rumApplication: RumApplication | null =
1019
- await RumApplicationService.findOneById({
1020
- id: resourceId,
1021
- select: {
1022
- retainTelemetryDataForDays: true,
1023
- telemetryRetentionConfig: true,
1024
- },
1025
- props: { isRoot: true },
1026
- });
1027
- return {
1028
- retainTelemetryDataForDays:
1029
- rumApplication?.retainTelemetryDataForDays ?? null,
1030
- telemetryRetentionConfig:
1031
- rumApplication?.telemetryRetentionConfig ?? null,
1032
- };
1033
- }
1034
- } catch (err) {
1035
- logger.warn(
1036
- `Per-resource retention lookup failed for ${primaryEntityType} ${resourceId.toString()}: ${
1037
- err instanceof Error ? err.message : String(err)
1038
- }`,
1039
- );
1013
+ return {
1014
+ retainTelemetryDataForDays: cluster?.retainTelemetryDataForDays ?? null,
1015
+ telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
1016
+ };
1017
+ }
1018
+ if (primaryEntityType === ServiceType.IoTDevice) {
1019
+ const fleet: IoTFleet | null = await IoTFleetService.findOneById({
1020
+ id: resourceId,
1021
+ select: {
1022
+ retainTelemetryDataForDays: true,
1023
+ telemetryRetentionConfig: true,
1024
+ },
1025
+ props: { isRoot: true },
1026
+ });
1027
+ return {
1028
+ retainTelemetryDataForDays: fleet?.retainTelemetryDataForDays ?? null,
1029
+ telemetryRetentionConfig: fleet?.telemetryRetentionConfig ?? null,
1030
+ };
1031
+ }
1032
+ if (primaryEntityType === ServiceType.CephCluster) {
1033
+ const cluster: CephCluster | null = await CephClusterService.findOneById({
1034
+ id: resourceId,
1035
+ select: {
1036
+ retainTelemetryDataForDays: true,
1037
+ telemetryRetentionConfig: true,
1038
+ },
1039
+ props: { isRoot: true },
1040
+ });
1041
+ return {
1042
+ retainTelemetryDataForDays: cluster?.retainTelemetryDataForDays ?? null,
1043
+ telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
1044
+ };
1045
+ }
1046
+ if (primaryEntityType === ServiceType.DockerSwarmCluster) {
1047
+ const cluster: DockerSwarmCluster | null =
1048
+ await DockerSwarmClusterService.findOneById({
1049
+ id: resourceId,
1050
+ select: {
1051
+ retainTelemetryDataForDays: true,
1052
+ telemetryRetentionConfig: true,
1053
+ },
1054
+ props: { isRoot: true },
1055
+ });
1056
+ return {
1057
+ retainTelemetryDataForDays: cluster?.retainTelemetryDataForDays ?? null,
1058
+ telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
1059
+ };
1060
+ }
1061
+ if (primaryEntityType === ServiceType.ServerlessFunction) {
1062
+ const serverlessFunction: ServerlessFunction | null =
1063
+ await ServerlessFunctionService.findOneById({
1064
+ id: resourceId,
1065
+ select: {
1066
+ retainTelemetryDataForDays: true,
1067
+ telemetryRetentionConfig: true,
1068
+ },
1069
+ props: { isRoot: true },
1070
+ });
1071
+ return {
1072
+ retainTelemetryDataForDays:
1073
+ serverlessFunction?.retainTelemetryDataForDays ?? null,
1074
+ telemetryRetentionConfig:
1075
+ serverlessFunction?.telemetryRetentionConfig ?? null,
1076
+ };
1077
+ }
1078
+ if (primaryEntityType === ServiceType.CloudResource) {
1079
+ const cloudResource: CloudResource | null =
1080
+ await CloudResourceService.findOneById({
1081
+ id: resourceId,
1082
+ select: {
1083
+ retainTelemetryDataForDays: true,
1084
+ telemetryRetentionConfig: true,
1085
+ },
1086
+ props: { isRoot: true },
1087
+ });
1088
+ return {
1089
+ retainTelemetryDataForDays:
1090
+ cloudResource?.retainTelemetryDataForDays ?? null,
1091
+ telemetryRetentionConfig:
1092
+ cloudResource?.telemetryRetentionConfig ?? null,
1093
+ };
1094
+ }
1095
+ if (primaryEntityType === ServiceType.RealUserMonitor) {
1096
+ const rumApplication: RumApplication | null =
1097
+ await RumApplicationService.findOneById({
1098
+ id: resourceId,
1099
+ select: {
1100
+ retainTelemetryDataForDays: true,
1101
+ telemetryRetentionConfig: true,
1102
+ },
1103
+ props: { isRoot: true },
1104
+ });
1105
+ return {
1106
+ retainTelemetryDataForDays:
1107
+ rumApplication?.retainTelemetryDataForDays ?? null,
1108
+ telemetryRetentionConfig:
1109
+ rumApplication?.telemetryRetentionConfig ?? null,
1110
+ };
1040
1111
  }
1041
1112
  return {
1042
1113
  retainTelemetryDataForDays: null,
@@ -6,36 +6,22 @@ import OneUptimeDate from "../../Types/Date";
6
6
  import CreateBy from "../Types/Database/CreateBy";
7
7
  import { OnCreate } from "../Types/Database/Hooks";
8
8
  import QueryHelper from "../Types/Database/QueryHelper";
9
+ import PostgresErrorTranslator from "../Utils/Database/PostgresErrorTranslator";
9
10
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
10
11
 
11
- /* Postgres unique_violation. https://www.postgresql.org/docs/current/errcodes-appendix.html */
12
- const UNIQUE_VIOLATION: string = "23505";
13
-
14
12
  type IsUniqueViolationFunction = (error: unknown) => boolean;
15
13
 
16
14
  /*
17
- * TypeORM wraps driver failures in QueryFailedError, which hoists the pg
18
- * fields onto itself but also keeps the original under `driverError`.
19
- * Check both rather than assuming which one carries the code.
15
+ * Detection lives in PostgresErrorTranslator because DatabaseService.create
16
+ * runs every failure through it before rethrowing, so what lands in the catch
17
+ * below is a BadDataException carrying the SQLSTATE not the raw
18
+ * QueryFailedError. A local `code === "23505"` check would silently stop
19
+ * matching and take the race recovery with it.
20
20
  */
21
21
  const isUniqueViolation: IsUniqueViolationFunction = (
22
22
  error: unknown,
23
23
  ): boolean => {
24
- if (!error || typeof error !== "object") {
25
- return false;
26
- }
27
-
28
- if ((error as { code?: string | undefined }).code === UNIQUE_VIOLATION) {
29
- return true;
30
- }
31
-
32
- const driverError: unknown = (error as { driverError?: unknown }).driverError;
33
-
34
- return Boolean(
35
- driverError &&
36
- typeof driverError === "object" &&
37
- (driverError as { code?: string | undefined }).code === UNIQUE_VIOLATION,
38
- );
24
+ return PostgresErrorTranslator.isUniqueViolation(error);
39
25
  };
40
26
 
41
27
  /*
@@ -37,6 +37,7 @@ import NumberUtil from "../../Utils/Number";
37
37
  import SlackUtil from "../Utils/Workspace/Slack/Slack";
38
38
  import MicrosoftTeamsUtil from "../Utils/Workspace/MicrosoftTeams/MicrosoftTeams";
39
39
  import StatusPageSubscriberWebhookUtil from "../Utils/StatusPageSubscriberWebhook";
40
+ import SSRFProtection from "../Utils/SSRFProtection";
40
41
  import StatusPageSubscriberNotificationTemplateService, {
41
42
  Service as StatusPageSubscriberNotificationTemplateServiceClass,
42
43
  } from "./StatusPageSubscriberNotificationTemplateService";
@@ -335,6 +336,18 @@ export class Service extends DatabaseService<Model> {
335
336
  }
336
337
  }
337
338
 
339
+ /*
340
+ * Validate the generic subscriber webhook URL if provided. Subscriber
341
+ * creation is publicly accessible (Permission.Public), so an unauthenticated
342
+ * user can supply this URL. Reject targets that point at private, loopback,
343
+ * link-local, or cloud metadata addresses to prevent SSRF.
344
+ */
345
+ if (data.data.subscriberWebhook) {
346
+ await SSRFProtection.validateWebhookTargetIsSafe(
347
+ data.data.subscriberWebhook,
348
+ );
349
+ }
350
+
338
351
  data.data.subscriptionConfirmationToken = NumberUtil.getRandomNumber(
339
352
  100000,
340
353
  999999,