@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
@@ -0,0 +1,606 @@
1
+ import AggregatedModel from "../../../../Types/BaseDatabase/AggregatedModel";
2
+ import AggregatedResult from "../../../../Types/BaseDatabase/AggregatedResult";
3
+ import {
4
+ DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
5
+ DATA_SOURCE_MAX_SERIES,
6
+ DATA_SOURCE_MAX_TABLE_ROWS,
7
+ DATA_SOURCE_MAX_TIME_SERIES_ROWS,
8
+ DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
9
+ DataSourceLimitsUtil,
10
+ } from "../../../../Types/DataSource/DataSourceLimits";
11
+ import DataSourceTableResult from "../../../../Types/DataSource/DataSourceTableResult";
12
+ import DataSourceType from "../../../../Types/DataSource/DataSourceType";
13
+ import BadDataException from "../../../../Types/Exception/BadDataException";
14
+ import Dictionary from "../../../../Types/Dictionary";
15
+ import DataSourceHttpFetch, {
16
+ DataSourceHttpRequest,
17
+ DataSourceHttpResponse,
18
+ } from "../HttpFetch";
19
+ import SqlResultShaper from "../SqlResultShaper";
20
+ import {
21
+ DataSourceConnectionSettings,
22
+ DataSourceConnector,
23
+ DataSourceQueryWindow,
24
+ } from "../Types";
25
+
26
+ /*
27
+ * Connector for Grafana Loki (and Loki-compatible endpoints such as
28
+ * GrafanaCloud Logs). Queries are LogQL, executed through the
29
+ * /loki/api/v1/query_range endpoint:
30
+ *
31
+ * - LogQL METRIC queries (rate(), count_over_time(), ...) come back as a
32
+ * Prometheus-style "matrix" and map to chartable time series;
33
+ * - raw LOG queries come back as "streams" and are only representable as a
34
+ * table (one row per log line).
35
+ *
36
+ * Loki's HTTP API takes timestamps in UNIX NANOSECONDS. Millisecond epochs
37
+ * exceed Number.MAX_SAFE_INTEGER once multiplied by 1e6, so all
38
+ * nanosecond math in this file goes through BigInt — float arithmetic would
39
+ * silently corrupt the low digits of the window bounds.
40
+ */
41
+
42
+ export type LokiFetchFunction = (
43
+ request: DataSourceHttpRequest,
44
+ ) => Promise<DataSourceHttpResponse>;
45
+
46
+ export interface LokiQueryRangeData {
47
+ resultType: string;
48
+ result: Array<unknown>;
49
+ }
50
+
51
+ export interface LokiParsedPoint {
52
+ timestamp: Date;
53
+ value: number;
54
+ }
55
+
56
+ const NANOSECONDS_PER_MILLISECOND: bigint = BigInt(1000000);
57
+
58
+ // Optionally-signed base-10 integer string, the shape BigInt() accepts.
59
+ const INTEGER_STRING_REGEX: RegExp = /^-?\d+$/;
60
+
61
+ /*
62
+ * Exact unix-nanosecond string for a Date. BigInt math keeps every digit:
63
+ * 1699999999999 ms * 1e6 is above 2^53, where float multiplication would
64
+ * round the tail off.
65
+ */
66
+ export function toLokiNanoseconds(date: Date): string {
67
+ return (BigInt(date.getTime()) * NANOSECONDS_PER_MILLISECOND).toString();
68
+ }
69
+
70
+ /*
71
+ * Parse a Loki nanosecond timestamp (string in stream entries; tolerate a
72
+ * number for robustness). Returns null when unparseable. Strings are kept
73
+ * out of Number() entirely — 19-digit nanosecond epochs do not fit in a
74
+ * float.
75
+ */
76
+ export function parseLokiNanoseconds(raw: unknown): bigint | null {
77
+ if (typeof raw === "number" && Number.isFinite(raw)) {
78
+ return BigInt(Math.trunc(raw));
79
+ }
80
+ if (typeof raw !== "string") {
81
+ return null;
82
+ }
83
+ const trimmed: string = raw.trim();
84
+ if (!INTEGER_STRING_REGEX.test(trimmed)) {
85
+ return null;
86
+ }
87
+ return BigInt(trimmed);
88
+ }
89
+
90
+ /*
91
+ * Nanosecond epoch -> Date (millisecond precision; sub-millisecond digits
92
+ * are truncated). Division happens in BigInt space BEFORE converting to a
93
+ * Number so the millisecond value is exact.
94
+ */
95
+ export function lokiNanosecondsToDate(raw: unknown): Date | null {
96
+ const nanoseconds: bigint | null = parseLokiNanoseconds(raw);
97
+ if (nanoseconds === null) {
98
+ return null;
99
+ }
100
+ const date: Date = new Date(
101
+ Number(nanoseconds / NANOSECONDS_PER_MILLISECOND),
102
+ );
103
+ return isNaN(date.getTime()) ? null : date;
104
+ }
105
+
106
+ /*
107
+ * Validate the Loki response envelope ({ status: "success", data:
108
+ * { resultType, result } }) and return the data section. Throws
109
+ * operator-actionable BadDataExceptions for every malformed shape.
110
+ */
111
+ export function parseLokiResponseData(bodyJson: unknown): LokiQueryRangeData {
112
+ if (
113
+ bodyJson === null ||
114
+ bodyJson === undefined ||
115
+ typeof bodyJson !== "object" ||
116
+ Array.isArray(bodyJson)
117
+ ) {
118
+ throw new BadDataException(
119
+ "Loki did not return a JSON object. Check that the data source URL points at a Grafana Loki endpoint.",
120
+ );
121
+ }
122
+
123
+ const body: Record<string, unknown> = bodyJson as Record<string, unknown>;
124
+
125
+ if (body["status"] !== "success") {
126
+ const errorDetail: string =
127
+ typeof body["error"] === "string" ? `: ${body["error"]}` : ".";
128
+ throw new BadDataException(
129
+ `Loki query failed with status "${String(body["status"])}"${errorDetail}`,
130
+ );
131
+ }
132
+
133
+ const dataRaw: unknown = body["data"];
134
+ if (
135
+ dataRaw === null ||
136
+ dataRaw === undefined ||
137
+ typeof dataRaw !== "object" ||
138
+ Array.isArray(dataRaw)
139
+ ) {
140
+ throw new BadDataException(
141
+ "Loki response is missing the data object. Check that the data source URL points at a Grafana Loki endpoint.",
142
+ );
143
+ }
144
+
145
+ const data: Record<string, unknown> = dataRaw as Record<string, unknown>;
146
+ const resultType: unknown = data["resultType"];
147
+ const result: unknown = data["result"];
148
+
149
+ if (typeof resultType !== "string" || !Array.isArray(result)) {
150
+ throw new BadDataException(
151
+ "Loki response is missing data.resultType or data.result.",
152
+ );
153
+ }
154
+
155
+ return { resultType: resultType, result: result };
156
+ }
157
+
158
+ /*
159
+ * Extract string labels from a metric/stream label object, skipping the
160
+ * given keys. Non-object inputs yield an empty label set.
161
+ */
162
+ function extractLabels(
163
+ raw: unknown,
164
+ excludeKeys: Array<string>,
165
+ ): Record<string, string> {
166
+ const labels: Record<string, string> = {};
167
+ if (
168
+ raw === null ||
169
+ raw === undefined ||
170
+ typeof raw !== "object" ||
171
+ Array.isArray(raw)
172
+ ) {
173
+ return labels;
174
+ }
175
+ const rawRecord: Record<string, unknown> = raw as Record<string, unknown>;
176
+ for (const key of Object.keys(rawRecord)) {
177
+ if (excludeKeys.includes(key)) {
178
+ continue;
179
+ }
180
+ const value: unknown = rawRecord[key];
181
+ if (value === null || value === undefined) {
182
+ continue;
183
+ }
184
+ labels[key] = String(value);
185
+ }
186
+ return labels;
187
+ }
188
+
189
+ /*
190
+ * One matrix sample: [unixSeconds (may be fractional), "value"]. Returns
191
+ * null for malformed or unplottable (NaN/Inf) samples so single bad points
192
+ * do not fail the whole chart.
193
+ */
194
+ export function parseLokiMatrixPoint(raw: unknown): LokiParsedPoint | null {
195
+ if (!Array.isArray(raw) || raw.length < 2) {
196
+ return null;
197
+ }
198
+
199
+ const timestampRaw: unknown = raw[0];
200
+ const valueRaw: unknown = raw[1];
201
+
202
+ let seconds: number | null = null;
203
+ if (typeof timestampRaw === "number" && Number.isFinite(timestampRaw)) {
204
+ seconds = timestampRaw;
205
+ } else if (
206
+ typeof timestampRaw === "string" &&
207
+ timestampRaw.trim() !== "" &&
208
+ Number.isFinite(Number(timestampRaw))
209
+ ) {
210
+ seconds = Number(timestampRaw);
211
+ }
212
+ if (seconds === null || seconds <= 0) {
213
+ return null;
214
+ }
215
+
216
+ let value: number | null = null;
217
+ if (typeof valueRaw === "number") {
218
+ value = valueRaw;
219
+ } else if (typeof valueRaw === "string" && valueRaw.trim() !== "") {
220
+ value = Number(valueRaw);
221
+ }
222
+ if (value === null || !Number.isFinite(value)) {
223
+ return null;
224
+ }
225
+
226
+ return { timestamp: new Date(Math.round(seconds * 1000)), value: value };
227
+ }
228
+
229
+ /*
230
+ * "matrix" result -> AggregatedResult. Labels (minus __name__) become the
231
+ * per-point `attributes` object the chart layer groups series on; series
232
+ * without labels omit `attributes` entirely (single unnamed series).
233
+ * Applies the series cap and the total-point cap, flagging `truncated`.
234
+ */
235
+ export function lokiMatrixToTimeSeries(
236
+ result: Array<unknown>,
237
+ ): AggregatedResult {
238
+ const data: Array<AggregatedModel> = [];
239
+ let truncated: boolean = false;
240
+ let seriesUsed: number = 0;
241
+ let rowCapHit: boolean = false;
242
+
243
+ for (const rawSeries of result) {
244
+ if (
245
+ rawSeries === null ||
246
+ typeof rawSeries !== "object" ||
247
+ Array.isArray(rawSeries)
248
+ ) {
249
+ continue;
250
+ }
251
+
252
+ if (seriesUsed >= DATA_SOURCE_MAX_SERIES) {
253
+ truncated = true;
254
+ break;
255
+ }
256
+ seriesUsed += 1;
257
+
258
+ const series: Record<string, unknown> = rawSeries as Record<
259
+ string,
260
+ unknown
261
+ >;
262
+ const labels: Record<string, string> = extractLabels(series["metric"], [
263
+ "__name__",
264
+ ]);
265
+ const values: unknown = series["values"];
266
+ if (!Array.isArray(values)) {
267
+ continue;
268
+ }
269
+
270
+ for (const rawPoint of values) {
271
+ const parsed: LokiParsedPoint | null = parseLokiMatrixPoint(rawPoint);
272
+ if (!parsed) {
273
+ continue;
274
+ }
275
+ if (data.length >= DATA_SOURCE_MAX_TIME_SERIES_ROWS) {
276
+ truncated = true;
277
+ rowCapHit = true;
278
+ break;
279
+ }
280
+ const point: AggregatedModel = {
281
+ timestamp: parsed.timestamp,
282
+ value: parsed.value,
283
+ } as AggregatedModel;
284
+ if (Object.keys(labels).length > 0) {
285
+ (point as Record<string, unknown>)["attributes"] = { ...labels };
286
+ }
287
+ data.push(point);
288
+ }
289
+
290
+ if (rowCapHit) {
291
+ break;
292
+ }
293
+ }
294
+
295
+ return { data: data, truncated: truncated };
296
+ }
297
+
298
+ interface FlatLogEntry {
299
+ order: bigint;
300
+ row: Record<string, unknown>;
301
+ }
302
+
303
+ /*
304
+ * "streams" result -> flat table rows { timestamp: Date, line, ...stream
305
+ * labels }, sorted newest-first (interleaved across streams, the way a log
306
+ * table reads). The `timestamp` and `line` cells always hold the entry's
307
+ * real values — stream labels that happen to use those names are dropped
308
+ * rather than allowed to clobber them. Rows are NOT capped here; the caller
309
+ * clamps via SqlResultShaper so cap+1 fetches surface `truncated`.
310
+ */
311
+ export function lokiStreamsToTableRows(
312
+ result: Array<unknown>,
313
+ ): Array<Record<string, unknown>> {
314
+ const entries: Array<FlatLogEntry> = [];
315
+
316
+ for (const rawStream of result) {
317
+ if (
318
+ rawStream === null ||
319
+ typeof rawStream !== "object" ||
320
+ Array.isArray(rawStream)
321
+ ) {
322
+ continue;
323
+ }
324
+ const stream: Record<string, unknown> = rawStream as Record<
325
+ string,
326
+ unknown
327
+ >;
328
+ const labels: Record<string, string> = extractLabels(stream["stream"], []);
329
+ const values: unknown = stream["values"];
330
+ if (!Array.isArray(values)) {
331
+ continue;
332
+ }
333
+
334
+ for (const rawEntry of values) {
335
+ if (!Array.isArray(rawEntry) || rawEntry.length < 2) {
336
+ continue;
337
+ }
338
+ const nanoseconds: bigint | null = parseLokiNanoseconds(rawEntry[0]);
339
+ if (nanoseconds === null) {
340
+ continue;
341
+ }
342
+ const timestamp: Date = new Date(
343
+ Number(nanoseconds / NANOSECONDS_PER_MILLISECOND),
344
+ );
345
+ if (isNaN(timestamp.getTime())) {
346
+ continue;
347
+ }
348
+ const lineRaw: unknown = rawEntry[1];
349
+ const row: Record<string, unknown> = {
350
+ timestamp: timestamp,
351
+ line: typeof lineRaw === "string" ? lineRaw : String(lineRaw ?? ""),
352
+ };
353
+ for (const key of Object.keys(labels)) {
354
+ if (key !== "timestamp" && key !== "line") {
355
+ row[key] = labels[key];
356
+ }
357
+ }
358
+ entries.push({ order: nanoseconds, row: row });
359
+ }
360
+ }
361
+
362
+ entries.sort((a: FlatLogEntry, b: FlatLogEntry): number => {
363
+ if (a.order === b.order) {
364
+ return 0;
365
+ }
366
+ return a.order < b.order ? 1 : -1;
367
+ });
368
+
369
+ return entries.map((entry: FlatLogEntry): Record<string, unknown> => {
370
+ return entry.row;
371
+ });
372
+ }
373
+
374
+ /*
375
+ * "matrix" result -> flat table rows { timestamp: Date, value, ...labels }.
376
+ * As with streams, the reserved `timestamp`/`value` cells win over labels
377
+ * with the same name, and capping is left to the caller's SqlResultShaper
378
+ * pass.
379
+ */
380
+ export function lokiMatrixToTableRows(
381
+ result: Array<unknown>,
382
+ ): Array<Record<string, unknown>> {
383
+ const rows: Array<Record<string, unknown>> = [];
384
+
385
+ for (const rawSeries of result) {
386
+ if (
387
+ rawSeries === null ||
388
+ typeof rawSeries !== "object" ||
389
+ Array.isArray(rawSeries)
390
+ ) {
391
+ continue;
392
+ }
393
+ const series: Record<string, unknown> = rawSeries as Record<
394
+ string,
395
+ unknown
396
+ >;
397
+ const labels: Record<string, string> = extractLabels(series["metric"], [
398
+ "__name__",
399
+ ]);
400
+ const values: unknown = series["values"];
401
+ if (!Array.isArray(values)) {
402
+ continue;
403
+ }
404
+
405
+ for (const rawPoint of values) {
406
+ const parsed: LokiParsedPoint | null = parseLokiMatrixPoint(rawPoint);
407
+ if (!parsed) {
408
+ continue;
409
+ }
410
+ const row: Record<string, unknown> = {
411
+ timestamp: parsed.timestamp,
412
+ value: parsed.value,
413
+ };
414
+ for (const key of Object.keys(labels)) {
415
+ if (key !== "timestamp" && key !== "value") {
416
+ row[key] = labels[key];
417
+ }
418
+ }
419
+ rows.push(row);
420
+ }
421
+ }
422
+
423
+ return rows;
424
+ }
425
+
426
+ export default class LokiConnector implements DataSourceConnector {
427
+ public dataSourceType: DataSourceType = DataSourceType.Loki;
428
+
429
+ private fetchFunction: LokiFetchFunction;
430
+
431
+ /*
432
+ * The optional fetchFunction is a DI seam for tests. The default wrapper
433
+ * resolves DataSourceHttpFetch.fetch at CALL time so jest.spyOn on the
434
+ * static method also intercepts connectors constructed earlier.
435
+ */
436
+ public constructor(fetchFunction?: LokiFetchFunction | undefined) {
437
+ this.fetchFunction =
438
+ fetchFunction ||
439
+ ((request: DataSourceHttpRequest): Promise<DataSourceHttpResponse> => {
440
+ return DataSourceHttpFetch.fetch(request);
441
+ });
442
+ }
443
+
444
+ private getBaseUrl(settings: DataSourceConnectionSettings): string {
445
+ if (!settings.url || settings.url.trim() === "") {
446
+ throw new BadDataException(
447
+ "Loki data source requires a URL (e.g. http://loki.example.com:3100).",
448
+ );
449
+ }
450
+ return settings.url.trim().replace(/\/+$/, "");
451
+ }
452
+
453
+ /*
454
+ * All egress goes through DataSourceHttpFetch, which runs the SSRF egress
455
+ * guard and pins validated addresses before dialing. Errors are
456
+ * sanitized so credentials can never surface in an API response.
457
+ */
458
+ private async fetchSanitized(
459
+ settings: DataSourceConnectionSettings,
460
+ request: DataSourceHttpRequest,
461
+ ): Promise<DataSourceHttpResponse> {
462
+ try {
463
+ return await this.fetchFunction(request);
464
+ } catch (error) {
465
+ throw new BadDataException(
466
+ SqlResultShaper.sanitizeError(
467
+ error,
468
+ SqlResultShaper.collectSecrets(settings),
469
+ ),
470
+ );
471
+ }
472
+ }
473
+
474
+ public async testConnection(
475
+ settings: DataSourceConnectionSettings,
476
+ ): Promise<void> {
477
+ const baseUrl: string = this.getBaseUrl(settings);
478
+
479
+ const endDate: Date = new Date();
480
+ const startDate: Date = new Date(endDate.getTime() - 60 * 60 * 1000);
481
+
482
+ const params: URLSearchParams = new URLSearchParams();
483
+ params.set("start", toLokiNanoseconds(startDate));
484
+ params.set("end", toLokiNanoseconds(endDate));
485
+
486
+ const headers: Dictionary<string> =
487
+ DataSourceHttpFetch.buildAuthHeaders(settings);
488
+
489
+ const response: DataSourceHttpResponse = await this.fetchSanitized(
490
+ settings,
491
+ {
492
+ method: "GET",
493
+ url: `${baseUrl}/loki/api/v1/labels?${params.toString()}`,
494
+ headers: headers,
495
+ timeoutInMs: DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
496
+ },
497
+ );
498
+
499
+ const body: unknown = response.bodyJson;
500
+ if (
501
+ body === null ||
502
+ body === undefined ||
503
+ typeof body !== "object" ||
504
+ Array.isArray(body) ||
505
+ (body as Record<string, unknown>)["status"] !== "success"
506
+ ) {
507
+ throw new BadDataException(
508
+ 'Connected to the host, but it did not respond like a Grafana Loki API (expected { "status": "success" } from /loki/api/v1/labels). Check the URL — it should be the Loki base URL, e.g. http://loki.example.com:3100.',
509
+ );
510
+ }
511
+ }
512
+
513
+ private async runRangeQuery(
514
+ settings: DataSourceConnectionSettings,
515
+ query: string,
516
+ window: DataSourceQueryWindow,
517
+ limit: number,
518
+ ): Promise<LokiQueryRangeData> {
519
+ if (!query || query.trim() === "") {
520
+ throw new BadDataException("Query is required.");
521
+ }
522
+
523
+ const baseUrl: string = this.getBaseUrl(settings);
524
+
525
+ const stepInSeconds: number =
526
+ window.stepInSeconds ??
527
+ DataSourceLimitsUtil.getStepInSeconds(window.startDate, window.endDate);
528
+
529
+ const params: URLSearchParams = new URLSearchParams();
530
+ params.set("query", query);
531
+ params.set("start", toLokiNanoseconds(window.startDate));
532
+ params.set("end", toLokiNanoseconds(window.endDate));
533
+ params.set("step", `${stepInSeconds}s`);
534
+ params.set("limit", limit.toString());
535
+
536
+ const headers: Dictionary<string> =
537
+ DataSourceHttpFetch.buildAuthHeaders(settings);
538
+
539
+ const response: DataSourceHttpResponse = await this.fetchSanitized(
540
+ settings,
541
+ {
542
+ method: "GET",
543
+ url: `${baseUrl}/loki/api/v1/query_range?${params.toString()}`,
544
+ headers: headers,
545
+ timeoutInMs: DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
546
+ },
547
+ );
548
+
549
+ return parseLokiResponseData(response.bodyJson);
550
+ }
551
+
552
+ public async queryTimeSeries(
553
+ settings: DataSourceConnectionSettings,
554
+ query: string,
555
+ window: DataSourceQueryWindow,
556
+ ): Promise<AggregatedResult> {
557
+ const data: LokiQueryRangeData = await this.runRangeQuery(
558
+ settings,
559
+ query,
560
+ window,
561
+ DATA_SOURCE_MAX_TIME_SERIES_ROWS + 1,
562
+ );
563
+
564
+ if (data.resultType === "streams") {
565
+ throw new BadDataException(
566
+ 'This LogQL query returns raw log streams, which cannot be charted. Wrap it in a LogQL metric function such as rate() or count_over_time() — e.g. sum(rate({app="api"} [5m])) — or use the Table widget to view the log lines.',
567
+ );
568
+ }
569
+
570
+ if (data.resultType !== "matrix") {
571
+ throw new BadDataException(
572
+ `Loki returned an unexpected result type "${data.resultType}" for a range query. Charts require a LogQL metric query that produces a matrix result.`,
573
+ );
574
+ }
575
+
576
+ return lokiMatrixToTimeSeries(data.result);
577
+ }
578
+
579
+ public async queryTable(
580
+ settings: DataSourceConnectionSettings,
581
+ query: string,
582
+ window: DataSourceQueryWindow,
583
+ ): Promise<DataSourceTableResult> {
584
+ const data: LokiQueryRangeData = await this.runRangeQuery(
585
+ settings,
586
+ query,
587
+ window,
588
+ DATA_SOURCE_MAX_TABLE_ROWS + 1,
589
+ );
590
+
591
+ let rows: Array<Record<string, unknown>>;
592
+ if (data.resultType === "streams") {
593
+ rows = lokiStreamsToTableRows(data.result);
594
+ } else if (data.resultType === "matrix") {
595
+ rows = lokiMatrixToTableRows(data.result);
596
+ } else {
597
+ throw new BadDataException(
598
+ `Loki returned an unexpected result type "${data.resultType}" for a range query. Expected "streams" (raw logs) or "matrix" (metric query).`,
599
+ );
600
+ }
601
+
602
+ return SqlResultShaper.rowsToTable(rows, {
603
+ maxRows: DATA_SOURCE_MAX_TABLE_ROWS,
604
+ });
605
+ }
606
+ }