@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,65 @@
|
|
|
1
|
+
import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
|
|
2
|
+
import DashboardBaseComponent from "../../../Types/Dashboard/DashboardComponents/DashboardBaseComponent";
|
|
3
|
+
import DashboardComponentType, {
|
|
4
|
+
isDataSourceComponentType,
|
|
5
|
+
} from "../../../Types/Dashboard/DashboardComponentType";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Sanitizer for the dashboard config served to ANONYMOUS public-dashboard
|
|
9
|
+
* viewers.
|
|
10
|
+
*
|
|
11
|
+
* The external Data Source widgets never render on a public dashboard —
|
|
12
|
+
* the anonymous API deliberately exposes no /data-source/query surface, so
|
|
13
|
+
* the client draws a placeholder instead. But the widget's stored config
|
|
14
|
+
* would still travel to the viewer inside dashboardViewConfig, and that
|
|
15
|
+
* config is the query itself: raw SQL naming internal tables and columns,
|
|
16
|
+
* a PromQL expression naming internal jobs and instances, plus the id of
|
|
17
|
+
* the connected Data Source. None of that is something an unauthenticated
|
|
18
|
+
* viewer should be able to read out of a page that cannot even display it.
|
|
19
|
+
*
|
|
20
|
+
* So the widgets are dropped outright rather than field-stripped: the
|
|
21
|
+
* placeholder the client renders needs nothing from the config, and
|
|
22
|
+
* dropping leaves no room for a later-added field to leak by omission.
|
|
23
|
+
*/
|
|
24
|
+
export default class PublicDashboardViewConfig {
|
|
25
|
+
public static sanitize(
|
|
26
|
+
dashboardViewConfig: DashboardViewConfig | null | undefined,
|
|
27
|
+
): DashboardViewConfig | null {
|
|
28
|
+
if (!dashboardViewConfig) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const components: Array<DashboardBaseComponent> =
|
|
33
|
+
dashboardViewConfig.components || [];
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
...dashboardViewConfig,
|
|
37
|
+
components: components.filter((component: DashboardBaseComponent) => {
|
|
38
|
+
return !PublicDashboardViewConfig.isDataSourceComponent(component);
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* Tolerant of malformed stored config: componentType is typed but arrives
|
|
45
|
+
* from JSONB, so a row written by an older or hand-edited client can carry
|
|
46
|
+
* anything. Anything that is not recognisably a Data Source widget is kept
|
|
47
|
+
* — the sanitizer's job is to remove, not to validate.
|
|
48
|
+
*/
|
|
49
|
+
public static isDataSourceComponent(
|
|
50
|
+
component: DashboardBaseComponent | null | undefined,
|
|
51
|
+
): boolean {
|
|
52
|
+
if (!component || typeof component !== "object") {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const componentType: unknown = (component as { componentType?: unknown })
|
|
57
|
+
.componentType;
|
|
58
|
+
|
|
59
|
+
if (typeof componentType !== "string") {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return isDataSourceComponentType(componentType as DashboardComponentType);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
2
|
+
import DataSourceType from "../../../Types/DataSource/DataSourceType";
|
|
3
|
+
import { DataSourceConnector } from "./Types";
|
|
4
|
+
import PrometheusConnector from "./Connectors/PrometheusConnector";
|
|
5
|
+
import PostgresConnector from "./Connectors/PostgresConnector";
|
|
6
|
+
import MySqlConnector from "./Connectors/MySqlConnector";
|
|
7
|
+
import SqlServerConnector from "./Connectors/SqlServerConnector";
|
|
8
|
+
import ClickHouseConnector from "./Connectors/ClickHouseConnector";
|
|
9
|
+
import LokiConnector from "./Connectors/LokiConnector";
|
|
10
|
+
import ElasticsearchConnector from "./Connectors/ElasticsearchConnector";
|
|
11
|
+
import RestApiConnector from "./Connectors/RestApiConnector";
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* One connector instance per DataSourceType. Connectors are stateless
|
|
15
|
+
* (each call opens and tears down its own connection), so singletons are
|
|
16
|
+
* safe to share across requests.
|
|
17
|
+
*/
|
|
18
|
+
export default class ConnectorRegistry {
|
|
19
|
+
private static connectors: Array<DataSourceConnector> = [
|
|
20
|
+
new PrometheusConnector(),
|
|
21
|
+
new PostgresConnector(),
|
|
22
|
+
new MySqlConnector(),
|
|
23
|
+
new SqlServerConnector(),
|
|
24
|
+
new ClickHouseConnector(),
|
|
25
|
+
new LokiConnector(),
|
|
26
|
+
new ElasticsearchConnector(),
|
|
27
|
+
new RestApiConnector(),
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
public static getConnector(
|
|
31
|
+
dataSourceType: DataSourceType,
|
|
32
|
+
): DataSourceConnector {
|
|
33
|
+
const connector: DataSourceConnector | undefined = this.connectors.find(
|
|
34
|
+
(candidate: DataSourceConnector) => {
|
|
35
|
+
return candidate.dataSourceType === dataSourceType;
|
|
36
|
+
},
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (!connector) {
|
|
40
|
+
throw new BadDataException(
|
|
41
|
+
`No connector is registered for data source type: ${dataSourceType}`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return connector;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public static getRegisteredTypes(): Array<DataSourceType> {
|
|
49
|
+
return this.connectors.map((connector: DataSourceConnector) => {
|
|
50
|
+
return connector.dataSourceType;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import https from "https";
|
|
2
|
+
import { ClickHouseClient, createClient } from "@clickhouse/client";
|
|
3
|
+
import AggregatedResult from "../../../../Types/BaseDatabase/AggregatedResult";
|
|
4
|
+
import {
|
|
5
|
+
DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
|
|
6
|
+
DATA_SOURCE_MAX_TABLE_ROWS,
|
|
7
|
+
DATA_SOURCE_MAX_TIME_SERIES_ROWS,
|
|
8
|
+
DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
|
|
9
|
+
} from "../../../../Types/DataSource/DataSourceLimits";
|
|
10
|
+
import DataSourceTableResult from "../../../../Types/DataSource/DataSourceTableResult";
|
|
11
|
+
import DataSourceType from "../../../../Types/DataSource/DataSourceType";
|
|
12
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
13
|
+
import DataSourceEgressGuard from "../EgressGuard";
|
|
14
|
+
import SqlQueryGuard from "../SqlQueryGuard";
|
|
15
|
+
import SqlResultShaper from "../SqlResultShaper";
|
|
16
|
+
import {
|
|
17
|
+
DataSourceConnectionSettings,
|
|
18
|
+
DataSourceConnector,
|
|
19
|
+
DataSourceQueryWindow,
|
|
20
|
+
} from "../Types";
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* ClickHouse Data Source connector.
|
|
24
|
+
*
|
|
25
|
+
* Talks to ClickHouse over its HTTP interface via @clickhouse/client. Safety
|
|
26
|
+
* layers, in order:
|
|
27
|
+
* - DataSourceEgressGuard validates the host BEFORE any socket is opened;
|
|
28
|
+
* - SqlQueryGuard rejects anything that is not a single read-only statement;
|
|
29
|
+
* - every query runs with the server-enforced `readonly: 1` session setting,
|
|
30
|
+
* `max_execution_time` and a `max_result_rows` cap (fetched as cap+1 so
|
|
31
|
+
* truncation is detectable by the shared shaper).
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* The exact client configuration this connector builds. Structurally a subset
|
|
36
|
+
* of @clickhouse/client's NodeClickHouseClientConfigOptions, declared here so
|
|
37
|
+
* tests can assert on it without importing driver internals.
|
|
38
|
+
*/
|
|
39
|
+
export interface ClickHouseClientConfig {
|
|
40
|
+
url: string;
|
|
41
|
+
username: string;
|
|
42
|
+
password: string;
|
|
43
|
+
database?: string;
|
|
44
|
+
application: string;
|
|
45
|
+
request_timeout: number;
|
|
46
|
+
max_open_connections: number;
|
|
47
|
+
compression: {
|
|
48
|
+
request: boolean;
|
|
49
|
+
response: boolean;
|
|
50
|
+
};
|
|
51
|
+
http_agent?: https.Agent;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* Narrow view of the ClickHouse client — exactly the three calls this
|
|
56
|
+
* connector makes. `json<T>()` is typed as "the caller declares the whole
|
|
57
|
+
* response shape", which is what the real ResultSet returns at runtime for
|
|
58
|
+
* format "JSON".
|
|
59
|
+
*/
|
|
60
|
+
export interface ClickHouseClientLike {
|
|
61
|
+
query(params: {
|
|
62
|
+
query: string;
|
|
63
|
+
format: "JSON";
|
|
64
|
+
clickhouse_settings?: Record<string, unknown>;
|
|
65
|
+
}): Promise<{ json<T>(): Promise<T> }>;
|
|
66
|
+
ping(): Promise<{ success: boolean }>;
|
|
67
|
+
close(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// DI seam so tests can hand in a fake client instead of a real driver.
|
|
71
|
+
export type ClickHouseClientFactory = (
|
|
72
|
+
config: ClickHouseClientConfig,
|
|
73
|
+
) => ClickHouseClientLike;
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* Shape of a ClickHouse HTTP JSON response — the rows live under `data`
|
|
77
|
+
* (alongside `meta`, `rows`, `statistics`, which this connector ignores).
|
|
78
|
+
*/
|
|
79
|
+
export interface ClickHouseJsonResponse {
|
|
80
|
+
data?: Array<Record<string, unknown>>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const defaultClientFactory: ClickHouseClientFactory = (
|
|
84
|
+
config: ClickHouseClientConfig,
|
|
85
|
+
): ClickHouseClientLike => {
|
|
86
|
+
const client: ClickHouseClient = createClient(config);
|
|
87
|
+
/*
|
|
88
|
+
* The real ResultSet types json<T>() as Promise<ResponseJSON<T>> while the
|
|
89
|
+
* seam narrows it to Promise<T> (callers pass the full response type as T).
|
|
90
|
+
* The runtime object satisfies the seam; only the generic bookkeeping
|
|
91
|
+
* differs, hence the cast.
|
|
92
|
+
*/
|
|
93
|
+
return client as unknown as ClickHouseClientLike;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export default class ClickHouseConnector implements DataSourceConnector {
|
|
97
|
+
public dataSourceType: DataSourceType = DataSourceType.ClickHouse;
|
|
98
|
+
|
|
99
|
+
private clientFactory: ClickHouseClientFactory;
|
|
100
|
+
|
|
101
|
+
public constructor(clientFactory?: ClickHouseClientFactory | undefined) {
|
|
102
|
+
this.clientFactory = clientFactory || defaultClientFactory;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public async testConnection(
|
|
106
|
+
settings: DataSourceConnectionSettings,
|
|
107
|
+
): Promise<void> {
|
|
108
|
+
this.assertDatabaseHost(settings);
|
|
109
|
+
|
|
110
|
+
// SSRF gate: validate the resolved target before any socket is opened.
|
|
111
|
+
await DataSourceEgressGuard.assertHostnameAllowed(settings.databaseHost!);
|
|
112
|
+
|
|
113
|
+
/*
|
|
114
|
+
* Connection tests get the (shorter) connect timeout — a ping does no
|
|
115
|
+
* server-side work, so there is no execution time to wait out.
|
|
116
|
+
*/
|
|
117
|
+
const client: ClickHouseClientLike = this.clientFactory(
|
|
118
|
+
this.buildClientConfig(settings, DATA_SOURCE_CONNECT_TIMEOUT_IN_MS),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
let pingResult: { success: boolean };
|
|
123
|
+
try {
|
|
124
|
+
pingResult = await client.ping();
|
|
125
|
+
} catch (error) {
|
|
126
|
+
throw new BadDataException(
|
|
127
|
+
SqlResultShaper.sanitizeError(error, this.getSecrets(settings)),
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!pingResult.success) {
|
|
132
|
+
throw new BadDataException(
|
|
133
|
+
"Could not connect to ClickHouse: ping failed. Check the database host, port, credentials and TLS settings.",
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
} finally {
|
|
137
|
+
await this.closeQuietly(client);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public async queryTimeSeries(
|
|
142
|
+
settings: DataSourceConnectionSettings,
|
|
143
|
+
query: string,
|
|
144
|
+
window: DataSourceQueryWindow,
|
|
145
|
+
): Promise<AggregatedResult> {
|
|
146
|
+
const rows: Array<Record<string, unknown>> = await this.runQuery(
|
|
147
|
+
settings,
|
|
148
|
+
query,
|
|
149
|
+
window,
|
|
150
|
+
DATA_SOURCE_MAX_TIME_SERIES_ROWS,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
return SqlResultShaper.rowsToTimeSeries(rows, {
|
|
154
|
+
maxRows: DATA_SOURCE_MAX_TIME_SERIES_ROWS,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public async queryTable(
|
|
159
|
+
settings: DataSourceConnectionSettings,
|
|
160
|
+
query: string,
|
|
161
|
+
window: DataSourceQueryWindow,
|
|
162
|
+
): Promise<DataSourceTableResult> {
|
|
163
|
+
const rows: Array<Record<string, unknown>> = await this.runQuery(
|
|
164
|
+
settings,
|
|
165
|
+
query,
|
|
166
|
+
window,
|
|
167
|
+
DATA_SOURCE_MAX_TABLE_ROWS,
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
return SqlResultShaper.rowsToTable(rows, {
|
|
171
|
+
maxRows: DATA_SOURCE_MAX_TABLE_ROWS,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private assertDatabaseHost(settings: DataSourceConnectionSettings): void {
|
|
176
|
+
if (!settings.databaseHost) {
|
|
177
|
+
throw new BadDataException(
|
|
178
|
+
"Database host is required for a ClickHouse data source.",
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
private getSecrets(
|
|
184
|
+
settings: DataSourceConnectionSettings,
|
|
185
|
+
): Array<string | undefined> {
|
|
186
|
+
return [
|
|
187
|
+
settings.password,
|
|
188
|
+
settings.apiToken,
|
|
189
|
+
settings.databaseHost,
|
|
190
|
+
settings.username,
|
|
191
|
+
];
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private buildClientConfig(
|
|
195
|
+
settings: DataSourceConnectionSettings,
|
|
196
|
+
requestTimeoutInMs: number,
|
|
197
|
+
): ClickHouseClientConfig {
|
|
198
|
+
const sslEnabled: boolean =
|
|
199
|
+
settings.additionalOptions?.["sslEnabled"] === true;
|
|
200
|
+
const rejectUnauthorized: boolean =
|
|
201
|
+
settings.additionalOptions?.["sslRejectUnauthorized"] !== false;
|
|
202
|
+
|
|
203
|
+
const scheme: string = sslEnabled ? "https" : "http";
|
|
204
|
+
const port: number = settings.databasePort ?? 8123;
|
|
205
|
+
|
|
206
|
+
const config: ClickHouseClientConfig = {
|
|
207
|
+
url: `${scheme}://${settings.databaseHost}:${port}`,
|
|
208
|
+
username: settings.username ?? "default",
|
|
209
|
+
password: settings.password ?? "",
|
|
210
|
+
application: "oneuptime-datasource",
|
|
211
|
+
/*
|
|
212
|
+
* request_timeout is an IDLE-SOCKET timer in @clickhouse/client, not a
|
|
213
|
+
* wall-clock bound on the query: it only fires when the socket goes
|
|
214
|
+
* silent. The real execution bound is the server-side
|
|
215
|
+
* max_execution_time query setting; query callers pass the query
|
|
216
|
+
* timeout + 5s of padding so the server limit fires first, and
|
|
217
|
+
* testConnection passes the connect timeout.
|
|
218
|
+
*/
|
|
219
|
+
request_timeout: requestTimeoutInMs,
|
|
220
|
+
max_open_connections: 1,
|
|
221
|
+
/*
|
|
222
|
+
* REQUIRED off, both directions: enabling response compression makes
|
|
223
|
+
* the client send enable_http_compression=1 as a query-level setting,
|
|
224
|
+
* and a readonly=1 session REJECTS changing that setting — every query
|
|
225
|
+
* this connector runs would fail with "Cannot modify
|
|
226
|
+
* 'enable_http_compression' setting in readonly mode".
|
|
227
|
+
*/
|
|
228
|
+
compression: {
|
|
229
|
+
request: false,
|
|
230
|
+
response: false,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
if (settings.databaseName) {
|
|
235
|
+
config.database = settings.databaseName;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (sslEnabled && !rejectUnauthorized) {
|
|
239
|
+
/*
|
|
240
|
+
* A custom agent is the only way @clickhouse/client can skip TLS
|
|
241
|
+
* certificate verification. The custom agent takes over connection
|
|
242
|
+
* pooling (max_open_connections is ignored when http_agent is set), so
|
|
243
|
+
* the single-connection cap is mirrored here via maxSockets.
|
|
244
|
+
*/
|
|
245
|
+
config.http_agent = new https.Agent({
|
|
246
|
+
rejectUnauthorized: false,
|
|
247
|
+
maxSockets: 1,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return config;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
private async runQuery(
|
|
255
|
+
settings: DataSourceConnectionSettings,
|
|
256
|
+
query: string,
|
|
257
|
+
window: DataSourceQueryWindow,
|
|
258
|
+
maxRows: number,
|
|
259
|
+
): Promise<Array<Record<string, unknown>>> {
|
|
260
|
+
this.assertDatabaseHost(settings);
|
|
261
|
+
|
|
262
|
+
// SSRF gate: validate the resolved target before any socket is opened.
|
|
263
|
+
await DataSourceEgressGuard.assertHostnameAllowed(settings.databaseHost!);
|
|
264
|
+
|
|
265
|
+
const finalSql: string = SqlQueryGuard.applyTimeMacros(
|
|
266
|
+
query,
|
|
267
|
+
window.startDate,
|
|
268
|
+
window.endDate,
|
|
269
|
+
);
|
|
270
|
+
SqlQueryGuard.assertReadOnlyQuery(finalSql);
|
|
271
|
+
|
|
272
|
+
/*
|
|
273
|
+
* The client appends "FORMAT JSON" to the statement; a trailing
|
|
274
|
+
* semicolon would produce "... ; FORMAT JSON", a syntax error. Nothing
|
|
275
|
+
* else about the statement is rewritten.
|
|
276
|
+
*/
|
|
277
|
+
const executedSql: string = finalSql.replace(/;\s*$/, "");
|
|
278
|
+
|
|
279
|
+
const client: ClickHouseClientLike = this.clientFactory(
|
|
280
|
+
this.buildClientConfig(settings, DATA_SOURCE_QUERY_TIMEOUT_IN_MS + 5000),
|
|
281
|
+
);
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
const result: { json<T>(): Promise<T> } = await client.query({
|
|
285
|
+
query: executedSql,
|
|
286
|
+
format: "JSON",
|
|
287
|
+
clickhouse_settings: {
|
|
288
|
+
/*
|
|
289
|
+
* Server-enforced read-only session — second layer behind
|
|
290
|
+
* SqlQueryGuard's classifier.
|
|
291
|
+
*/
|
|
292
|
+
readonly: 1,
|
|
293
|
+
// Wall-clock bound, enforced by the server (seconds).
|
|
294
|
+
max_execution_time: Math.ceil(DATA_SOURCE_QUERY_TIMEOUT_IN_MS / 1000),
|
|
295
|
+
/*
|
|
296
|
+
* cap+1 with "break" (stop, don't error) so the shaper can tell
|
|
297
|
+
* "exactly cap rows" apart from "more than cap" and set truncated.
|
|
298
|
+
*/
|
|
299
|
+
max_result_rows: maxRows + 1,
|
|
300
|
+
result_overflow_mode: "break",
|
|
301
|
+
},
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
const response: ClickHouseJsonResponse | null =
|
|
305
|
+
await result.json<ClickHouseJsonResponse | null>();
|
|
306
|
+
|
|
307
|
+
if (!response || !Array.isArray(response.data)) {
|
|
308
|
+
throw new BadDataException(
|
|
309
|
+
"ClickHouse returned an unexpected response shape (missing data array). Ensure the query is a single SELECT statement.",
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return response.data.filter((row: Record<string, unknown>) => {
|
|
314
|
+
return row !== null && typeof row === "object" && !Array.isArray(row);
|
|
315
|
+
});
|
|
316
|
+
} catch (error) {
|
|
317
|
+
if (error instanceof BadDataException) {
|
|
318
|
+
throw error;
|
|
319
|
+
}
|
|
320
|
+
throw new BadDataException(
|
|
321
|
+
SqlResultShaper.sanitizeError(error, this.getSecrets(settings)),
|
|
322
|
+
);
|
|
323
|
+
} finally {
|
|
324
|
+
await this.closeQuietly(client);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
private async closeQuietly(client: ClickHouseClientLike): Promise<void> {
|
|
329
|
+
try {
|
|
330
|
+
await client.close();
|
|
331
|
+
} catch {
|
|
332
|
+
/*
|
|
333
|
+
* Best-effort close — the query result (or its error) already decided
|
|
334
|
+
* this call's outcome.
|
|
335
|
+
*/
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|