@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.
- package/Models/DatabaseModels/AIRun.ts +33 -0
- package/Models/DatabaseModels/DataSource.ts +744 -0
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
- package/Models/DatabaseModels/User.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/UserSession.ts +2 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
- package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
- package/Server/API/AIInsightAPI.ts +47 -4
- package/Server/API/AIInvestigationAPI.ts +25 -0
- package/Server/API/DashboardAPI.ts +176 -492
- package/Server/API/DataSourceAPI.ts +268 -0
- package/Server/API/StatusPageAPI.ts +11 -1
- package/Server/API/UserAPI.ts +119 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Queue.ts +26 -0
- package/Server/Infrastructure/QueueWorker.ts +17 -0
- package/Server/Middleware/TelemetryIngest.ts +8 -3
- package/Server/Services/AIInsightService.ts +132 -12
- package/Server/Services/AIRunService.ts +34 -0
- package/Server/Services/AIService.ts +17 -2
- package/Server/Services/AlertService.ts +38 -32
- package/Server/Services/AnalyticsDatabaseService.ts +8 -4
- package/Server/Services/DataSourceService.ts +200 -0
- package/Server/Services/HostService.ts +92 -0
- package/Server/Services/IncidentService.ts +45 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +49 -0
- package/Server/Services/MonitorStatusService.ts +166 -0
- package/Server/Services/OpenTelemetryIngestService.ts +255 -184
- package/Server/Services/RumSessionPinService.ts +7 -21
- package/Server/Services/StatusPageSubscriberService.ts +13 -0
- package/Server/Services/UserService.ts +280 -9
- package/Server/Static/Vendor/README.md +62 -0
- package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
- package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
- package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
- package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
- package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
- package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
- package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
- package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
- package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
- package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
- package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
- package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
- package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
- package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
- package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
- package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
- package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
- package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
- package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
- package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
- package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
- package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
- package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
- package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
- package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
- package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
- package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
- package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
- package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
- package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
- package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
- package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
- package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
- package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
- package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
- package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
- package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
- package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
- package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
- package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
- package/Server/Utils/DataSource/EgressGuard.ts +446 -0
- package/Server/Utils/DataSource/HttpFetch.ts +221 -0
- package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
- package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
- package/Server/Utils/DataSource/Types.ts +93 -0
- package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
- package/Server/Utils/InProcessMemo.ts +141 -0
- package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
- package/Server/Utils/Monitor/MonitorResource.ts +14 -0
- package/Server/Utils/Response.ts +12 -1
- package/Server/Utils/SSRFProtection.ts +237 -0
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
- package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
- package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
- package/Server/Utils/Telemetry/Telemetry.ts +112 -1
- package/Server/Utils/Telemetry.ts +104 -3
- package/Server/Utils/VendorAssets.ts +165 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
- package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
- package/Server/Views/Partials/Head.ejs +21 -7
- package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
- package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
- package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
- package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
- package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
- package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
- package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
- package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
- package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
- package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
- package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
- package/Tests/Server/Services/AIInsightService.test.ts +266 -11
- package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
- package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
- package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
- package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
- package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
- package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
- package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
- package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
- package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
- package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
- package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
- package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
- package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
- package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
- package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
- package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
- package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
- package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
- package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
- package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
- package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
- package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
- package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
- package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
- package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
- package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
- package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
- package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
- package/Tests/Server/Utils/Telemetry.test.ts +87 -0
- package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
- package/Tests/Server/Views/OfflineRender.test.ts +297 -0
- package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
- package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
- package/Tests/Types/Password.test.ts +363 -0
- package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
- package/Tests/UI/Components/Modal.test.tsx +281 -1
- package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/Analytics.test.ts +23 -0
- package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
- package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
- package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
- package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
- package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
- package/Types/AI/AIInsightEvidence.ts +6 -0
- package/Types/Analytics/RevenueEvent.ts +31 -0
- package/Types/Dashboard/DashboardComponentType.ts +31 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
- package/Types/DataSource/DataSourceLimits.ts +62 -0
- package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
- package/Types/DataSource/DataSourceTableResult.ts +38 -0
- package/Types/DataSource/DataSourceType.ts +213 -0
- package/Types/Date.ts +43 -3
- package/Types/Password.ts +64 -0
- package/Types/Permission.ts +46 -0
- package/Types/UserAuthenticationStatus.ts +34 -0
- package/UI/Components/Button/Button.tsx +1 -1
- package/UI/Components/ErrorBoundary.tsx +459 -108
- package/UI/Components/Icon/Icon.tsx +10 -9
- package/UI/Components/Modal/ConfirmModal.tsx +6 -1
- package/UI/Components/Modal/Modal.tsx +267 -35
- package/UI/Components/Modal/ModalFooter.tsx +6 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
- package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
- package/UI/Components/StatusPage/ResourceList.tsx +570 -0
- package/UI/Styles/Theme.css +18 -0
- package/UI/Utils/API/RequestOptions.ts +7 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
- package/UI/Utils/TestDataSource.ts +61 -0
- package/UI/esbuild-config.js +45 -0
- package/Utils/Analytics.ts +15 -0
- package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
- package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
- package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
- package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +28 -0
- package/Utils/DataSource/DataSourceQueryText.ts +94 -0
- package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
- package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
- package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
- package/Utils/StatusPage/ResourceExplorer.ts +853 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
- package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +2 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
- package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +34 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +119 -433
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DataSourceAPI.js +173 -0
- package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +11 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +94 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +27 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +110 -10
- package/build/dist/Server/Services/AIInsightService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +34 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +16 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +28 -35
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DataSourceService.js +159 -0
- package/build/dist/Server/Services/DataSourceService.js.map +1 -0
- package/build/dist/Server/Services/HostService.js +74 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +35 -24
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusService.js +129 -0
- package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +7 -15
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +241 -10
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Types.js +2 -0
- package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/InProcessMemo.js +113 -0
- package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +9 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +192 -0
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +93 -6
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +121 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
- package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceType.js +183 -0
- package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
- package/build/dist/Types/Date.js +38 -3
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Password.js +56 -0
- package/build/dist/Types/Password.js.map +1 -0
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/UserAuthenticationStatus.js +2 -0
- package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
- package/build/dist/UI/Components/ErrorBoundary.js +388 -72
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +10 -4
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +178 -19
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TestDataSource.js +39 -0
- package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
- package/build/dist/Utils/Analytics.js +4 -0
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
- package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +5 -1
- 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
|
+
}
|