@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,288 @@
1
+ import { describe, expect, jest, test, beforeEach } from "@jest/globals";
2
+
3
+ /*
4
+ * Contract under test — @CaptureSpan's export gating.
5
+ *
6
+ * The decorator wraps ~hundreds of methods, some of which sit on per-record
7
+ * telemetry ingest paths. It must be a plain method call (no span, no
8
+ * attribute flattening, no AsyncLocalStorage transition) whenever no span
9
+ * exporter is installed — spans that are never exported are pure overhead —
10
+ * and only build the attribute object when there is actually something to
11
+ * attach. When an exporter IS installed it must keep the full original
12
+ * behavior: named span, OK status on success, recorded exception + rethrow
13
+ * on failure, for both sync and async methods.
14
+ */
15
+
16
+ type JestMock = ReturnType<typeof jest.fn>;
17
+
18
+ type FakeSpan = {
19
+ setStatus: JestMock;
20
+ end: JestMock;
21
+ };
22
+
23
+ const fakeSpan: FakeSpan = {
24
+ setStatus: jest.fn(),
25
+ end: jest.fn(),
26
+ };
27
+
28
+ let spanExportEnabled: boolean = false;
29
+
30
+ const startActiveSpanMock: JestMock = jest.fn((data: any) => {
31
+ return data.fn(fakeSpan);
32
+ });
33
+ const recordExceptionMock: JestMock = jest.fn();
34
+
35
+ jest.mock("../../../Server/Utils/Telemetry", () => {
36
+ return {
37
+ __esModule: true,
38
+ default: {
39
+ isSpanExportEnabled: (): boolean => {
40
+ return spanExportEnabled;
41
+ },
42
+ startActiveSpan: (data: unknown): unknown => {
43
+ return startActiveSpanMock(data);
44
+ },
45
+ recordExceptionMarkSpanAsErrorAndEndSpan: (data: unknown): unknown => {
46
+ return recordExceptionMock(data);
47
+ },
48
+ },
49
+ };
50
+ });
51
+
52
+ jest.mock("../../../Server/EnvironmentConfig", () => {
53
+ const actual: Record<string, unknown> = jest.requireActual(
54
+ "../../../Server/EnvironmentConfig",
55
+ ) as Record<string, unknown>;
56
+ return {
57
+ ...actual,
58
+ DisableTelemetry: false,
59
+ };
60
+ });
61
+
62
+ import CaptureSpan from "../../../Server/Utils/Telemetry/CaptureSpan";
63
+
64
+ /*
65
+ * Apply the decorator exactly the way TypeScript does for a static method,
66
+ * without relying on decorator syntax support in the test transform.
67
+ */
68
+ function decorate(
69
+ data: Parameters<typeof CaptureSpan>[0] | undefined,
70
+ fn: (...args: Array<any>) => any,
71
+ methodName: string = "method",
72
+ ): (...args: Array<any>) => any {
73
+ class Host {}
74
+ const descriptor: TypedPropertyDescriptor<any> = { value: fn };
75
+ CaptureSpan(data)(Host, methodName, descriptor);
76
+ return descriptor.value;
77
+ }
78
+
79
+ beforeEach(() => {
80
+ spanExportEnabled = false;
81
+ startActiveSpanMock.mockClear();
82
+ recordExceptionMock.mockClear();
83
+ fakeSpan.setStatus.mockClear();
84
+ fakeSpan.end.mockClear();
85
+ });
86
+
87
+ describe("CaptureSpan with no span exporter installed", () => {
88
+ test("calls the original method directly and creates no span", () => {
89
+ const original: JestMock = jest.fn().mockReturnValue("result");
90
+ const wrapped: (...args: Array<any>) => any = decorate(undefined, original);
91
+
92
+ expect(wrapped("a", 1)).toBe("result");
93
+ expect(original).toHaveBeenCalledWith("a", 1);
94
+ expect(startActiveSpanMock).not.toHaveBeenCalled();
95
+ });
96
+
97
+ test("preserves `this` binding", () => {
98
+ const wrapped: (...args: Array<any>) => any = decorate(
99
+ undefined,
100
+ function (this: { value: number }): number {
101
+ return this.value;
102
+ },
103
+ );
104
+
105
+ expect(wrapped.call({ value: 42 })).toBe(42);
106
+ });
107
+
108
+ test("async results and rejections pass through untouched", async () => {
109
+ const wrappedOk: (...args: Array<any>) => any = decorate(
110
+ undefined,
111
+ async (): Promise<string> => {
112
+ return "async-result";
113
+ },
114
+ );
115
+ await expect(wrappedOk()).resolves.toBe("async-result");
116
+
117
+ const boom: Error = new Error("boom");
118
+ const wrappedFail: (...args: Array<any>) => any = decorate(
119
+ undefined,
120
+ async (): Promise<never> => {
121
+ throw boom;
122
+ },
123
+ );
124
+ await expect(wrappedFail()).rejects.toBe(boom);
125
+ expect(startActiveSpanMock).not.toHaveBeenCalled();
126
+ });
127
+
128
+ test("sync throws pass through untouched", () => {
129
+ const boom: Error = new Error("sync-boom");
130
+ const wrapped: (...args: Array<any>) => any = decorate(undefined, () => {
131
+ throw boom;
132
+ });
133
+
134
+ expect(() => {
135
+ return wrapped();
136
+ }).toThrow(boom);
137
+ expect(startActiveSpanMock).not.toHaveBeenCalled();
138
+ });
139
+ });
140
+
141
+ describe("CaptureSpan with a span exporter installed", () => {
142
+ beforeEach(() => {
143
+ spanExportEnabled = true;
144
+ });
145
+
146
+ test("creates a span named Class.method and returns the result", () => {
147
+ const wrapped: (...args: Array<any>) => any = decorate(
148
+ undefined,
149
+ () => {
150
+ return "spanned";
151
+ },
152
+ "doWork",
153
+ );
154
+
155
+ expect(wrapped()).toBe("spanned");
156
+ expect(startActiveSpanMock).toHaveBeenCalledTimes(1);
157
+
158
+ const callData: any = startActiveSpanMock.mock.calls[0]![0];
159
+ expect(callData.name).toBe("Host.doWork");
160
+ expect(fakeSpan.setStatus).toHaveBeenCalledWith({ code: 1 }); // OK
161
+ expect(fakeSpan.end).toHaveBeenCalledTimes(1);
162
+ });
163
+
164
+ test("bare @CaptureSpan() attaches no attributes (flattening skipped)", () => {
165
+ const wrapped: (...args: Array<any>) => any = decorate(undefined, () => {
166
+ return "x";
167
+ });
168
+ wrapped("argument-that-must-not-be-captured");
169
+
170
+ const callData: any = startActiveSpanMock.mock.calls[0]![0];
171
+ expect(callData.options).toEqual({});
172
+ });
173
+
174
+ test("captureArguments flattens call arguments into span attributes", () => {
175
+ const wrapped: (...args: Array<any>) => any = decorate(
176
+ { captureArguments: true },
177
+ () => {
178
+ return "x";
179
+ },
180
+ );
181
+ wrapped("first", { nested: { key: "v" } });
182
+
183
+ const callData: any = startActiveSpanMock.mock.calls[0]![0];
184
+ expect(callData.options.attributes["arg0"]).toBe("first");
185
+ expect(callData.options.attributes["arg1.nested.key"]).toBe("v");
186
+ });
187
+
188
+ test("static attributes are attached", () => {
189
+ const wrapped: (...args: Array<any>) => any = decorate(
190
+ { attributes: { component: "test" } },
191
+ () => {
192
+ return "x";
193
+ },
194
+ );
195
+ wrapped();
196
+
197
+ const callData: any = startActiveSpanMock.mock.calls[0]![0];
198
+ expect(callData.options.attributes["component"]).toBe("test");
199
+ });
200
+
201
+ test("async success marks the span OK and ends it", async () => {
202
+ const wrapped: (...args: Array<any>) => any = decorate(
203
+ undefined,
204
+ async (): Promise<string> => {
205
+ return "ok";
206
+ },
207
+ );
208
+
209
+ await expect(wrapped()).resolves.toBe("ok");
210
+ expect(fakeSpan.setStatus).toHaveBeenCalledWith({ code: 1 });
211
+ expect(fakeSpan.end).toHaveBeenCalledTimes(1);
212
+ });
213
+
214
+ test("async failure records the exception, rethrows, and ends the span", async () => {
215
+ const boom: Error = new Error("async-span-boom");
216
+ const wrapped: (...args: Array<any>) => any = decorate(
217
+ undefined,
218
+ async (): Promise<never> => {
219
+ throw boom;
220
+ },
221
+ );
222
+
223
+ await expect(wrapped()).rejects.toBe(boom);
224
+ expect(recordExceptionMock).toHaveBeenCalledTimes(1);
225
+ expect(recordExceptionMock.mock.calls[0]![0]).toMatchObject({
226
+ exception: boom,
227
+ });
228
+ expect(fakeSpan.end).toHaveBeenCalledTimes(1);
229
+ });
230
+
231
+ test("sync failure records the exception and rethrows", () => {
232
+ const boom: Error = new Error("sync-span-boom");
233
+ const wrapped: (...args: Array<any>) => any = decorate(undefined, () => {
234
+ throw boom;
235
+ });
236
+
237
+ expect(() => {
238
+ return wrapped();
239
+ }).toThrow(boom);
240
+ expect(recordExceptionMock).toHaveBeenCalledTimes(1);
241
+ });
242
+ });
243
+
244
+ describe("export flag is consulted at call time, not decoration time", () => {
245
+ /*
246
+ * Decorators run at class-definition (import) time, long before
247
+ * Telemetry.init() installs an exporter and flips the flag. If the wrapper
248
+ * captured the flag when it was applied instead of reading it per call,
249
+ * every span in the process would be silently lost — decoration always
250
+ * happens while the flag is still false.
251
+ */
252
+ test("a method decorated before the exporter exists starts spanning once export turns on", () => {
253
+ const wrapped: (...args: Array<any>) => any = decorate(undefined, () => {
254
+ return "x";
255
+ });
256
+
257
+ expect(wrapped()).toBe("x");
258
+ expect(startActiveSpanMock).not.toHaveBeenCalled();
259
+
260
+ spanExportEnabled = true;
261
+ expect(wrapped()).toBe("x");
262
+ expect(startActiveSpanMock).toHaveBeenCalledTimes(1);
263
+ });
264
+
265
+ test("a method decorated while export was on drops to passthrough when it turns off", () => {
266
+ spanExportEnabled = true;
267
+ const wrapped: (...args: Array<any>) => any = decorate(undefined, () => {
268
+ return "y";
269
+ });
270
+
271
+ expect(wrapped()).toBe("y");
272
+ expect(startActiveSpanMock).toHaveBeenCalledTimes(1);
273
+
274
+ spanExportEnabled = false;
275
+ expect(wrapped()).toBe("y");
276
+ expect(startActiveSpanMock).toHaveBeenCalledTimes(1);
277
+ });
278
+ });
279
+
280
+ describe("Telemetry.isSpanExportEnabled (real module)", () => {
281
+ test("defaults to false before init installs a trace exporter", () => {
282
+ const RealTelemetry: any = (
283
+ jest.requireActual("../../../Server/Utils/Telemetry") as any
284
+ ).default;
285
+
286
+ expect(RealTelemetry.isSpanExportEnabled()).toBe(false);
287
+ });
288
+ });
@@ -0,0 +1,170 @@
1
+ import {
2
+ IngestionStamp,
3
+ getIngestionStamp,
4
+ getRetentionDateDb,
5
+ } from "../../../Server/Utils/Telemetry/IngestionTimestamp";
6
+ import OneUptimeDate from "../../../Types/Date";
7
+ import {
8
+ afterEach,
9
+ beforeEach,
10
+ describe,
11
+ expect,
12
+ jest,
13
+ test,
14
+ } from "@jest/globals";
15
+
16
+ /*
17
+ * Minimal structural view of a jest spy — the @jest/globals and @types/jest
18
+ * spy types disagree in this repo, so annotate with just the surface this
19
+ * test reads.
20
+ */
21
+ type SpyLike = {
22
+ mock: { calls: Array<Array<unknown>> };
23
+ mockRestore: () => void;
24
+ };
25
+
26
+ /*
27
+ * Contract under test — the per-second memo behind every ingested row's
28
+ * createdAt / retentionDate stamps.
29
+ *
30
+ * The Otel logs / traces / metrics row builders used to derive these per
31
+ * row (current Date + ClickHouse format + moment add-days + second format,
32
+ * per log record / span / metric datapoint). The memo must hand out values
33
+ * IDENTICAL to that per-row derivation — same second → same strings — and
34
+ * roll over crisply on the second boundary, or rows would carry stale
35
+ * createdAt / retention stamps.
36
+ */
37
+
38
+ describe("getIngestionStamp", () => {
39
+ beforeEach(() => {
40
+ jest.useFakeTimers();
41
+ });
42
+
43
+ afterEach(() => {
44
+ jest.useRealTimers();
45
+ });
46
+
47
+ test("db string matches toClickhouseDateTime of the stamp's date", () => {
48
+ jest.setSystemTime(new Date("2026-08-10T13:45:59.700Z"));
49
+
50
+ const stamp: IngestionStamp = getIngestionStamp();
51
+
52
+ expect(stamp.db).toBe(OneUptimeDate.toClickhouseDateTime(stamp.date));
53
+ expect(stamp.db).toBe("2026-08-10 13:45:59");
54
+ });
55
+
56
+ test("date is truncated to the second", () => {
57
+ jest.setSystemTime(new Date("2026-08-10T13:45:59.999Z"));
58
+
59
+ const stamp: IngestionStamp = getIngestionStamp();
60
+
61
+ expect(stamp.date.getMilliseconds()).toBe(0);
62
+ expect(stamp.date.getTime()).toBe(
63
+ new Date("2026-08-10T13:45:59.000Z").getTime(),
64
+ );
65
+ });
66
+
67
+ test("same second returns the identical stamp object (memo hit)", () => {
68
+ jest.setSystemTime(new Date("2026-08-10T13:45:59.100Z"));
69
+ const first: IngestionStamp = getIngestionStamp();
70
+
71
+ jest.setSystemTime(new Date("2026-08-10T13:45:59.900Z"));
72
+ const second: IngestionStamp = getIngestionStamp();
73
+
74
+ expect(second).toBe(first);
75
+ });
76
+
77
+ test("rolls over when the second changes", () => {
78
+ jest.setSystemTime(new Date("2026-08-10T13:45:59.900Z"));
79
+ const first: IngestionStamp = getIngestionStamp();
80
+
81
+ jest.setSystemTime(new Date("2026-08-10T13:46:00.000Z"));
82
+ const second: IngestionStamp = getIngestionStamp();
83
+
84
+ expect(second).not.toBe(first);
85
+ expect(first.db).toBe("2026-08-10 13:45:59");
86
+ expect(second.db).toBe("2026-08-10 13:46:00");
87
+ });
88
+ });
89
+
90
+ describe("getRetentionDateDb", () => {
91
+ beforeEach(() => {
92
+ jest.useFakeTimers();
93
+ jest.setSystemTime(new Date("2026-08-10T13:45:59.700Z"));
94
+ });
95
+
96
+ afterEach(() => {
97
+ jest.useRealTimers();
98
+ });
99
+
100
+ test("equals the per-row derivation it replaced (addRemoveDays + format)", () => {
101
+ const stamp: IngestionStamp = getIngestionStamp();
102
+
103
+ for (const days of [1, 15, 30, 90, 365]) {
104
+ expect(getRetentionDateDb(stamp, days)).toBe(
105
+ OneUptimeDate.toClickhouseDateTime(
106
+ OneUptimeDate.addRemoveDays(stamp.date, days),
107
+ ),
108
+ );
109
+ }
110
+ });
111
+
112
+ test("distinct retention windows produce distinct dates", () => {
113
+ const stamp: IngestionStamp = getIngestionStamp();
114
+
115
+ expect(getRetentionDateDb(stamp, 15)).toBe(
116
+ OneUptimeDate.toClickhouseDateTime(
117
+ OneUptimeDate.addRemoveDays(stamp.date, 15),
118
+ ),
119
+ );
120
+ expect(getRetentionDateDb(stamp, 30)).toBe(
121
+ OneUptimeDate.toClickhouseDateTime(
122
+ OneUptimeDate.addRemoveDays(stamp.date, 30),
123
+ ),
124
+ );
125
+ expect(getRetentionDateDb(stamp, 15)).not.toBe(
126
+ getRetentionDateDb(stamp, 30),
127
+ );
128
+ });
129
+
130
+ test("memoizes per retention window: addRemoveDays runs once per (second, days)", () => {
131
+ const stamp: IngestionStamp = getIngestionStamp();
132
+ const addRemoveDaysSpy: SpyLike = jest.spyOn(
133
+ OneUptimeDate,
134
+ "addRemoveDays",
135
+ ) as unknown as SpyLike;
136
+
137
+ const first: string = getRetentionDateDb(stamp, 15);
138
+ const callsAfterFirst: number = addRemoveDaysSpy.mock.calls.length;
139
+
140
+ for (let i: number = 0; i < 50; i++) {
141
+ expect(getRetentionDateDb(stamp, 15)).toBe(first);
142
+ }
143
+
144
+ expect(addRemoveDaysSpy.mock.calls.length).toBe(callsAfterFirst);
145
+ addRemoveDaysSpy.mockRestore();
146
+ });
147
+
148
+ test("stays consistent with the stamp's own second, not the current clock", () => {
149
+ const stamp: IngestionStamp = getIngestionStamp();
150
+ const expected: string = getRetentionDateDb(stamp, 15);
151
+
152
+ // Clock moves on; a held stamp must keep answering for ITS second.
153
+ jest.setSystemTime(new Date("2026-08-10T13:46:30.000Z"));
154
+
155
+ expect(getRetentionDateDb(stamp, 15)).toBe(expected);
156
+ });
157
+
158
+ test("computes correctly for a bare stamp that never went through the memo", () => {
159
+ const bareStamp: IngestionStamp = {
160
+ date: new Date("2026-01-01T00:00:00.000Z"),
161
+ db: "2026-01-01 00:00:00",
162
+ };
163
+
164
+ expect(getRetentionDateDb(bareStamp, 15)).toBe(
165
+ OneUptimeDate.toClickhouseDateTime(
166
+ OneUptimeDate.addRemoveDays(bareStamp.date, 15),
167
+ ),
168
+ );
169
+ });
170
+ });
@@ -30,6 +30,12 @@ export interface ExceptionInsightEvidence {
30
30
  spikeMultiplier?: number | undefined;
31
31
  // Lifetime occurrence count of the exception.
32
32
  totalOccurrenceCount?: number | undefined;
33
+ /*
34
+ * How many distinct TelemetryException groups (i.e. stack-trace variants of
35
+ * the same type + normalized message) this finding rolls up. 1 for the
36
+ * ordinary case; higher when one throw site surfaces on several call paths.
37
+ */
38
+ distinctExceptionGroupCount?: number | undefined;
33
39
  // ISO-8601 — when the exception was first ever seen.
34
40
  firstSeenAt?: string | undefined;
35
41
  }
@@ -0,0 +1,31 @@
1
+ import { JSONObject } from "../JSON";
2
+
3
+ /**
4
+ * Stable, versioned events used to measure the self-serve revenue funnel.
5
+ *
6
+ * Event names are intentionally GA4-compatible snake_case. Additive property
7
+ * changes are safe; breaking semantic changes require a new schema version.
8
+ */
9
+ export enum RevenueEventName {
10
+ SignupStarted = "signup_started",
11
+ SignupCompleted = "sign_up",
12
+ WorkspaceCreated = "workspace_created",
13
+ MonitorCreated = "monitor_created",
14
+ TeammateInvited = "teammate_invited",
15
+ SubscriptionUpgraded = "subscription_upgraded",
16
+ SubscriptionDowngraded = "subscription_downgraded",
17
+ }
18
+
19
+ export enum RevenueFunnelStage {
20
+ Acquisition = "acquisition",
21
+ Signup = "signup",
22
+ Activation = "activation",
23
+ Collaboration = "collaboration",
24
+ Revenue = "revenue",
25
+ }
26
+
27
+ export interface RevenueEventProperties extends JSONObject {
28
+ funnel_stage: RevenueFunnelStage;
29
+ }
30
+
31
+ export const REVENUE_EVENT_SCHEMA_VERSION: number = 1;
@@ -5,6 +5,17 @@ enum DashboardComponentType {
5
5
  Clock = `Clock`,
6
6
  Table = `Table`,
7
7
  Gauge = `Gauge`,
8
+ /*
9
+ * Widgets that read an EXTERNAL Data Source (Prometheus, SQL, ClickHouse,
10
+ * Loki, Elasticsearch, REST) rather than OneUptime's own telemetry. They
11
+ * are separate component types — not a mode of the metric widgets above —
12
+ * so each one can carry the query editor, defaults, and rendering its own
13
+ * source of data actually needs. Not available on public dashboards.
14
+ */
15
+ DataSourceChart = `DataSourceChart`,
16
+ DataSourceValue = `DataSourceValue`,
17
+ DataSourceGauge = `DataSourceGauge`,
18
+ DataSourceTable = `DataSourceTable`,
8
19
  LogStream = `LogStream`,
9
20
  LogChart = `LogChart`,
10
21
  TraceList = `TraceList`,
@@ -44,3 +55,23 @@ enum DashboardComponentType {
44
55
  }
45
56
 
46
57
  export default DashboardComponentType;
58
+
59
+ /*
60
+ * Every widget type that reads an EXTERNAL Data Source. Kept next to the
61
+ * enum so adding a fifth one is a single edit, and consumed by the widget
62
+ * settings form (which query editor to render) and by anything that has to
63
+ * treat external-data widgets as a class — notably the public dashboard,
64
+ * where they are unavailable.
65
+ */
66
+ export const DataSourceComponentTypes: ReadonlyArray<DashboardComponentType> = [
67
+ DashboardComponentType.DataSourceChart,
68
+ DashboardComponentType.DataSourceValue,
69
+ DashboardComponentType.DataSourceGauge,
70
+ DashboardComponentType.DataSourceTable,
71
+ ];
72
+
73
+ export function isDataSourceComponentType(
74
+ componentType: DashboardComponentType,
75
+ ): boolean {
76
+ return DataSourceComponentTypes.includes(componentType);
77
+ }
@@ -0,0 +1,27 @@
1
+ import DataSourceQueryConfig from "../../DataSource/DataSourceQueryConfig";
2
+ import ObjectID from "../../ObjectID";
3
+ import DashboardComponentType from "../DashboardComponentType";
4
+ import DashboardChartType from "../Chart/ChartType";
5
+ import BaseComponent from "./DashboardBaseComponent";
6
+
7
+ /*
8
+ * Time-series chart over one or more EXTERNAL Data Source queries (PromQL /
9
+ * SQL / LogQL / ES DSL / REST). The OneUptime-metrics chart is a separate
10
+ * widget (DashboardChartComponent) — this one never touches metric queries,
11
+ * formulas, or the metric explorer.
12
+ *
13
+ * Not available on public dashboards: the anonymous API has no data-source
14
+ * surface, by design.
15
+ */
16
+ export default interface DashboardDataSourceChartComponent
17
+ extends BaseComponent {
18
+ componentType: DashboardComponentType.DataSourceChart;
19
+ componentId: ObjectID;
20
+ arguments: {
21
+ // Each query becomes one overlaid set of series on the chart.
22
+ queries?: Array<DataSourceQueryConfig> | undefined;
23
+ chartTitle?: string | undefined;
24
+ chartDescription?: string | undefined;
25
+ chartType?: DashboardChartType | undefined;
26
+ };
27
+ }
@@ -0,0 +1,32 @@
1
+ import DataSourceQueryConfig from "../../DataSource/DataSourceQueryConfig";
2
+ import ObjectID from "../../ObjectID";
3
+ import DashboardComponentType from "../DashboardComponentType";
4
+ import BaseComponent from "./DashboardBaseComponent";
5
+ import { DataSourceValueReduce } from "./DashboardDataSourceValueComponent";
6
+
7
+ /*
8
+ * Radial gauge driven by an EXTERNAL Data Source query. The
9
+ * OneUptime-metrics equivalent is DashboardGaugeComponent.
10
+ *
11
+ * Not available on public dashboards.
12
+ */
13
+ export default interface DashboardDataSourceGaugeComponent
14
+ extends BaseComponent {
15
+ componentType: DashboardComponentType.DataSourceGauge;
16
+ componentId: ObjectID;
17
+ arguments: {
18
+ query?: DataSourceQueryConfig | undefined;
19
+ gaugeTitle?: string | undefined;
20
+ // See DashboardDataSourceValueComponent — same reduction, same default.
21
+ reduce?: DataSourceValueReduce | undefined;
22
+ /*
23
+ * Unit suffix for the centre value and the min/max footer. External
24
+ * queries carry no MetricType to derive one from.
25
+ */
26
+ unit?: string | undefined;
27
+ minValue?: number | undefined;
28
+ maxValue?: number | undefined;
29
+ warningThreshold?: number | undefined;
30
+ criticalThreshold?: number | undefined;
31
+ };
32
+ }
@@ -0,0 +1,30 @@
1
+ import DataSourceQueryConfig from "../../DataSource/DataSourceQueryConfig";
2
+ import ObjectID from "../../ObjectID";
3
+ import DashboardComponentType from "../DashboardComponentType";
4
+ import BaseComponent from "./DashboardBaseComponent";
5
+
6
+ /*
7
+ * Tabular rows straight from an EXTERNAL Data Source query. Columns come
8
+ * from the query result, not from widget config — the connector normalizes
9
+ * every source into DataSourceTableResult. The OneUptime-metrics
10
+ * equivalent (columns, formulas, group-by) is DashboardTableComponent.
11
+ *
12
+ * Not available on public dashboards.
13
+ */
14
+ export default interface DashboardDataSourceTableComponent
15
+ extends BaseComponent {
16
+ componentType: DashboardComponentType.DataSourceTable;
17
+ componentId: ObjectID;
18
+ arguments: {
19
+ query?: DataSourceQueryConfig | undefined;
20
+ tableTitle?: string | undefined;
21
+ tableDescription?: string | undefined;
22
+ /*
23
+ * Client-side cap on rendered rows, applied after sorting so "top 10 by
24
+ * this column" works. The connector's own row cap still applies first —
25
+ * this only trims what the widget draws. Absent ⇒ render every row the
26
+ * query returned.
27
+ */
28
+ maxRows?: number | undefined;
29
+ };
30
+ }
@@ -0,0 +1,55 @@
1
+ import DataSourceQueryConfig from "../../DataSource/DataSourceQueryConfig";
2
+ import ObjectID from "../../ObjectID";
3
+ import DashboardComponentType from "../DashboardComponentType";
4
+ import BaseComponent from "./DashboardBaseComponent";
5
+ import { DashboardValueTrendDirection } from "./DashboardValueComponent";
6
+
7
+ /*
8
+ * How the points a Data Source query returns over the dashboard's time
9
+ * window collapse into the single number the widget shows. The metric
10
+ * Value widget takes this from the metric query's "Aggregate by" picker;
11
+ * an external query has no such picker, so it is a widget argument here.
12
+ */
13
+ export enum DataSourceValueReduce {
14
+ Last = "Last",
15
+ First = "First",
16
+ Avg = "Avg",
17
+ Sum = "Sum",
18
+ Min = "Min",
19
+ Max = "Max",
20
+ }
21
+
22
+ /*
23
+ * Single big-number stat driven by an EXTERNAL Data Source query. The
24
+ * OneUptime-metrics equivalent is DashboardValueComponent; the two share a
25
+ * renderer but not a configuration surface.
26
+ *
27
+ * Not available on public dashboards.
28
+ */
29
+ export default interface DashboardDataSourceValueComponent
30
+ extends BaseComponent {
31
+ componentType: DashboardComponentType.DataSourceValue;
32
+ componentId: ObjectID;
33
+ arguments: {
34
+ query?: DataSourceQueryConfig | undefined;
35
+ title: string;
36
+ /*
37
+ * How the returned points reduce to one number. Absent ⇒ Last, which
38
+ * is what "the current value of this query" means for the overwhelming
39
+ * majority of external queries (a Prometheus instant-style rate, a SQL
40
+ * count per bucket).
41
+ */
42
+ reduce?: DataSourceValueReduce | undefined;
43
+ /*
44
+ * Unit suffix rendered after the number. External queries carry no
45
+ * OneUptime MetricType, so there is nothing to derive a unit from —
46
+ * the user names it. Known units also scale the value the same way
47
+ * metric units do ("Bytes" ⇒ 1.5 MB, "ms" ⇒ 2.4 sec, "%" ⇒ 99.9%).
48
+ * Empty/undefined ⇒ the raw number with no suffix.
49
+ */
50
+ unit?: string | undefined;
51
+ warningThreshold?: number | undefined;
52
+ criticalThreshold?: number | undefined;
53
+ trendDirection?: DashboardValueTrendDirection | undefined;
54
+ };
55
+ }