@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
|
@@ -22,6 +22,8 @@ import { DASHBOARD_MASTER_PASSWORD_INVALID_MESSAGE } from "../../Types/Dashboard
|
|
|
22
22
|
import NotAuthenticatedException from "../../Types/Exception/NotAuthenticatedException";
|
|
23
23
|
import ForbiddenException from "../../Types/Exception/ForbiddenException";
|
|
24
24
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
25
|
+
import DashboardViewConfig from "../../Types/Dashboard/DashboardViewConfig";
|
|
26
|
+
import PublicDashboardViewConfig from "../Utils/Dashboard/PublicDashboardViewConfig";
|
|
25
27
|
import TelemetryAttributeService from "../Services/TelemetryAttributeService";
|
|
26
28
|
import TelemetryType from "../../Types/Telemetry/TelemetryType";
|
|
27
29
|
import { JSONObject } from "../../Types/JSON";
|
|
@@ -68,26 +70,24 @@ import SpanService from "../Services/SpanService";
|
|
|
68
70
|
import LogService from "../Services/LogService";
|
|
69
71
|
import DashboardComponentType from "../../Types/Dashboard/DashboardComponentType";
|
|
70
72
|
import { DashboardVariableType } from "../../Types/Dashboard/DashboardVariable";
|
|
71
|
-
import
|
|
73
|
+
import PublicDashboardResourceListPolicy, {
|
|
74
|
+
PublicDashboardResourceListPolicyResult,
|
|
75
|
+
} from "../Utils/Dashboard/PublicDashboardResourceListPolicy";
|
|
76
|
+
import { applyIncidentSelfPrivacyFilter } from "../Utils/Incident/IncidentPrivacyFilter";
|
|
77
|
+
import { applyAlertSelfPrivacyFilter } from "../Utils/Alert/AlertPrivacyFilter";
|
|
72
78
|
|
|
73
79
|
/*
|
|
74
80
|
* Registry of the non-metric widgets a public dashboard may render.
|
|
75
81
|
*
|
|
76
|
-
* Nothing on this endpoint is taken from the client except a narrow set of
|
|
77
|
-
* filter values:
|
|
78
|
-
*
|
|
79
|
-
* - `select` is the FIXED set of columns the corresponding widget displays,
|
|
80
|
-
* so an anonymous viewer can only ever read these columns.
|
|
81
82
|
* - `widgets` lists the dashboard widgets that render this resource, mapped
|
|
82
83
|
* to the `kind` each one shows (null when the model is not partitioned by
|
|
83
84
|
* kind). The dashboard must actually contain one of these widgets before
|
|
84
85
|
* the endpoint will serve the resource at all, and the query is pinned to
|
|
85
86
|
* the kinds those widgets render. Adding a widget to a public dashboard is
|
|
86
87
|
* therefore the owner's explicit — and only — opt-in to exposing this data.
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
* widget never exposes.
|
|
88
|
+
* Query, select, sort and pagination policy are rebuilt from the exact stored
|
|
89
|
+
* widget by PublicDashboardResourceListPolicy. Client copies of those fields
|
|
90
|
+
* are never authoritative on this unauthenticated route.
|
|
91
91
|
*/
|
|
92
92
|
interface PublicDashboardResourceConfig {
|
|
93
93
|
modelType: { new (): BaseModel | AnalyticsDataModel };
|
|
@@ -95,12 +95,8 @@ interface PublicDashboardResourceConfig {
|
|
|
95
95
|
findBy: (findBy: any) => Promise<Array<BaseModel | AnalyticsDataModel>>;
|
|
96
96
|
};
|
|
97
97
|
widgets: Partial<Record<DashboardComponentType, string | null>>;
|
|
98
|
-
allowedQueryKeys: Array<string>;
|
|
99
|
-
select: JSONObject;
|
|
100
98
|
}
|
|
101
99
|
|
|
102
|
-
const DEFAULT_DASHBOARD_RESOURCE_LIMIT: number = 100;
|
|
103
|
-
|
|
104
100
|
const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
105
101
|
string,
|
|
106
102
|
PublicDashboardResourceConfig
|
|
@@ -111,20 +107,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
111
107
|
widgets: {
|
|
112
108
|
[DashboardComponentType.IncidentList]: null,
|
|
113
109
|
},
|
|
114
|
-
allowedQueryKeys: [
|
|
115
|
-
"currentIncidentState",
|
|
116
|
-
"currentIncidentStateId",
|
|
117
|
-
"incidentSeverityId",
|
|
118
|
-
"monitors",
|
|
119
|
-
"labels",
|
|
120
|
-
],
|
|
121
|
-
select: {
|
|
122
|
-
_id: true,
|
|
123
|
-
title: true,
|
|
124
|
-
createdAt: true,
|
|
125
|
-
currentIncidentState: { name: true, color: true },
|
|
126
|
-
incidentSeverity: { name: true, color: true },
|
|
127
|
-
},
|
|
128
110
|
},
|
|
129
111
|
alert: {
|
|
130
112
|
modelType: Alert,
|
|
@@ -132,20 +114,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
132
114
|
widgets: {
|
|
133
115
|
[DashboardComponentType.AlertList]: null,
|
|
134
116
|
},
|
|
135
|
-
allowedQueryKeys: [
|
|
136
|
-
"currentAlertState",
|
|
137
|
-
"currentAlertStateId",
|
|
138
|
-
"alertSeverityId",
|
|
139
|
-
"monitorId",
|
|
140
|
-
"labels",
|
|
141
|
-
],
|
|
142
|
-
select: {
|
|
143
|
-
_id: true,
|
|
144
|
-
title: true,
|
|
145
|
-
createdAt: true,
|
|
146
|
-
currentAlertState: { name: true, color: true },
|
|
147
|
-
alertSeverity: { name: true, color: true },
|
|
148
|
-
},
|
|
149
117
|
},
|
|
150
118
|
monitor: {
|
|
151
119
|
modelType: Monitor,
|
|
@@ -153,18 +121,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
153
121
|
widgets: {
|
|
154
122
|
[DashboardComponentType.MonitorList]: null,
|
|
155
123
|
},
|
|
156
|
-
allowedQueryKeys: [
|
|
157
|
-
"currentMonitorStatus",
|
|
158
|
-
"currentMonitorStatusId",
|
|
159
|
-
"monitorType",
|
|
160
|
-
"labels",
|
|
161
|
-
],
|
|
162
|
-
select: {
|
|
163
|
-
_id: true,
|
|
164
|
-
name: true,
|
|
165
|
-
monitorType: true,
|
|
166
|
-
currentMonitorStatus: { name: true, color: true },
|
|
167
|
-
},
|
|
168
124
|
},
|
|
169
125
|
"network-site": {
|
|
170
126
|
modelType: NetworkSite,
|
|
@@ -172,36 +128,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
172
128
|
widgets: {
|
|
173
129
|
[DashboardComponentType.NetworkMap]: null,
|
|
174
130
|
},
|
|
175
|
-
/*
|
|
176
|
-
* The map filters by site type and by whether the rolled-up status is
|
|
177
|
-
* operational — nothing else. Notably NOT `parentSiteId` or
|
|
178
|
-
* `materializedPath`: the widget draws a flat set of pins rather than
|
|
179
|
-
* walking a hierarchy, so exposing the tree shape here would hand an
|
|
180
|
-
* anonymous viewer a structure the map never shows them.
|
|
181
|
-
*/
|
|
182
|
-
allowedQueryKeys: [
|
|
183
|
-
"networkSiteTypeId",
|
|
184
|
-
"currentMonitorStatus",
|
|
185
|
-
"currentMonitorStatusId",
|
|
186
|
-
],
|
|
187
|
-
select: {
|
|
188
|
-
_id: true,
|
|
189
|
-
name: true,
|
|
190
|
-
/*
|
|
191
|
-
* The type NAME comes from the networkSiteType relation. NetworkSite
|
|
192
|
-
* .siteType is the deprecated pre-lookup-table string and is dropped
|
|
193
|
-
* in a follow-up PR, so it must not be read from new code.
|
|
194
|
-
*/
|
|
195
|
-
networkSiteType: { name: true },
|
|
196
|
-
latitude: true,
|
|
197
|
-
longitude: true,
|
|
198
|
-
currentMonitorStatus: {
|
|
199
|
-
name: true,
|
|
200
|
-
color: true,
|
|
201
|
-
priority: true,
|
|
202
|
-
isOperationalState: true,
|
|
203
|
-
},
|
|
204
|
-
},
|
|
205
131
|
},
|
|
206
132
|
host: {
|
|
207
133
|
modelType: Host,
|
|
@@ -209,23 +135,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
209
135
|
widgets: {
|
|
210
136
|
[DashboardComponentType.HostList]: null,
|
|
211
137
|
},
|
|
212
|
-
allowedQueryKeys: [
|
|
213
|
-
"name",
|
|
214
|
-
"hostIdentifier",
|
|
215
|
-
"otelCollectorStatus",
|
|
216
|
-
"osType",
|
|
217
|
-
],
|
|
218
|
-
select: {
|
|
219
|
-
_id: true,
|
|
220
|
-
name: true,
|
|
221
|
-
hostIdentifier: true,
|
|
222
|
-
otelCollectorStatus: true,
|
|
223
|
-
osType: true,
|
|
224
|
-
osVersion: true,
|
|
225
|
-
cpuCores: true,
|
|
226
|
-
totalMemoryBytes: true,
|
|
227
|
-
lastSeenAt: true,
|
|
228
|
-
},
|
|
229
138
|
},
|
|
230
139
|
"kubernetes-resource": {
|
|
231
140
|
modelType: KubernetesResource,
|
|
@@ -240,33 +149,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
240
149
|
[DashboardComponentType.KubernetesJobList]: "Job",
|
|
241
150
|
[DashboardComponentType.KubernetesCronJobList]: "CronJob",
|
|
242
151
|
},
|
|
243
|
-
allowedQueryKeys: [
|
|
244
|
-
"kubernetesClusterId",
|
|
245
|
-
"namespaceKey",
|
|
246
|
-
"name",
|
|
247
|
-
"phase",
|
|
248
|
-
"isReady",
|
|
249
|
-
],
|
|
250
|
-
select: {
|
|
251
|
-
_id: true,
|
|
252
|
-
name: true,
|
|
253
|
-
namespaceKey: true,
|
|
254
|
-
kind: true,
|
|
255
|
-
phase: true,
|
|
256
|
-
isReady: true,
|
|
257
|
-
hasMemoryPressure: true,
|
|
258
|
-
hasDiskPressure: true,
|
|
259
|
-
hasPidPressure: true,
|
|
260
|
-
containerCount: true,
|
|
261
|
-
latestCpuPercent: true,
|
|
262
|
-
latestMemoryBytes: true,
|
|
263
|
-
controllerDeploymentName: true,
|
|
264
|
-
controllerCronJobName: true,
|
|
265
|
-
resourceCreationTimestamp: true,
|
|
266
|
-
lastSeenAt: true,
|
|
267
|
-
kubernetesClusterId: true,
|
|
268
|
-
kubernetesCluster: { name: true },
|
|
269
|
-
},
|
|
270
152
|
},
|
|
271
153
|
"docker-host": {
|
|
272
154
|
modelType: DockerHost,
|
|
@@ -274,17 +156,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
274
156
|
widgets: {
|
|
275
157
|
[DashboardComponentType.DockerHostList]: null,
|
|
276
158
|
},
|
|
277
|
-
allowedQueryKeys: ["name", "otelCollectorStatus"],
|
|
278
|
-
select: {
|
|
279
|
-
_id: true,
|
|
280
|
-
name: true,
|
|
281
|
-
otelCollectorStatus: true,
|
|
282
|
-
containersRunning: true,
|
|
283
|
-
containersStopped: true,
|
|
284
|
-
containersPaused: true,
|
|
285
|
-
osType: true,
|
|
286
|
-
osVersion: true,
|
|
287
|
-
},
|
|
288
159
|
},
|
|
289
160
|
"docker-container": {
|
|
290
161
|
modelType: DockerResource,
|
|
@@ -292,17 +163,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
292
163
|
widgets: {
|
|
293
164
|
[DashboardComponentType.DockerContainerList]: "Container",
|
|
294
165
|
},
|
|
295
|
-
allowedQueryKeys: ["dockerHostId", "name", "imageName"],
|
|
296
|
-
select: {
|
|
297
|
-
_id: true,
|
|
298
|
-
name: true,
|
|
299
|
-
imageName: true,
|
|
300
|
-
state: true,
|
|
301
|
-
latestCpuPercent: true,
|
|
302
|
-
latestMemoryBytes: true,
|
|
303
|
-
dockerHostId: true,
|
|
304
|
-
dockerHost: { name: true },
|
|
305
|
-
},
|
|
306
166
|
},
|
|
307
167
|
"docker-image": {
|
|
308
168
|
modelType: DockerResource,
|
|
@@ -310,14 +170,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
310
170
|
widgets: {
|
|
311
171
|
[DashboardComponentType.DockerImageList]: "Image",
|
|
312
172
|
},
|
|
313
|
-
allowedQueryKeys: ["dockerHostId", "name"],
|
|
314
|
-
select: {
|
|
315
|
-
_id: true,
|
|
316
|
-
name: true,
|
|
317
|
-
containerId: true,
|
|
318
|
-
dockerHostId: true,
|
|
319
|
-
dockerHost: { name: true },
|
|
320
|
-
},
|
|
321
173
|
},
|
|
322
174
|
"docker-network": {
|
|
323
175
|
modelType: DockerResource,
|
|
@@ -325,14 +177,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
325
177
|
widgets: {
|
|
326
178
|
[DashboardComponentType.DockerNetworkList]: "Network",
|
|
327
179
|
},
|
|
328
|
-
allowedQueryKeys: ["dockerHostId"],
|
|
329
|
-
select: {
|
|
330
|
-
_id: true,
|
|
331
|
-
name: true,
|
|
332
|
-
state: true,
|
|
333
|
-
dockerHostId: true,
|
|
334
|
-
dockerHost: { name: true },
|
|
335
|
-
},
|
|
336
180
|
},
|
|
337
181
|
"docker-volume": {
|
|
338
182
|
modelType: DockerResource,
|
|
@@ -340,14 +184,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
340
184
|
widgets: {
|
|
341
185
|
[DashboardComponentType.DockerVolumeList]: "Volume",
|
|
342
186
|
},
|
|
343
|
-
allowedQueryKeys: ["dockerHostId"],
|
|
344
|
-
select: {
|
|
345
|
-
_id: true,
|
|
346
|
-
name: true,
|
|
347
|
-
state: true,
|
|
348
|
-
dockerHostId: true,
|
|
349
|
-
dockerHost: { name: true },
|
|
350
|
-
},
|
|
351
187
|
},
|
|
352
188
|
"podman-host": {
|
|
353
189
|
modelType: PodmanHost,
|
|
@@ -355,17 +191,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
355
191
|
widgets: {
|
|
356
192
|
[DashboardComponentType.PodmanHostList]: null,
|
|
357
193
|
},
|
|
358
|
-
allowedQueryKeys: ["name", "otelCollectorStatus"],
|
|
359
|
-
select: {
|
|
360
|
-
_id: true,
|
|
361
|
-
name: true,
|
|
362
|
-
otelCollectorStatus: true,
|
|
363
|
-
containersRunning: true,
|
|
364
|
-
containersStopped: true,
|
|
365
|
-
containersPaused: true,
|
|
366
|
-
osType: true,
|
|
367
|
-
osVersion: true,
|
|
368
|
-
},
|
|
369
194
|
},
|
|
370
195
|
"podman-container": {
|
|
371
196
|
modelType: PodmanResource,
|
|
@@ -373,17 +198,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
373
198
|
widgets: {
|
|
374
199
|
[DashboardComponentType.PodmanContainerList]: "Container",
|
|
375
200
|
},
|
|
376
|
-
allowedQueryKeys: ["podmanHostId", "name", "imageName"],
|
|
377
|
-
select: {
|
|
378
|
-
_id: true,
|
|
379
|
-
name: true,
|
|
380
|
-
imageName: true,
|
|
381
|
-
state: true,
|
|
382
|
-
latestCpuPercent: true,
|
|
383
|
-
latestMemoryBytes: true,
|
|
384
|
-
podmanHostId: true,
|
|
385
|
-
podmanHost: { name: true },
|
|
386
|
-
},
|
|
387
201
|
},
|
|
388
202
|
"podman-image": {
|
|
389
203
|
modelType: PodmanResource,
|
|
@@ -391,14 +205,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
391
205
|
widgets: {
|
|
392
206
|
[DashboardComponentType.PodmanImageList]: "Image",
|
|
393
207
|
},
|
|
394
|
-
allowedQueryKeys: ["podmanHostId", "name"],
|
|
395
|
-
select: {
|
|
396
|
-
_id: true,
|
|
397
|
-
name: true,
|
|
398
|
-
containerId: true,
|
|
399
|
-
podmanHostId: true,
|
|
400
|
-
podmanHost: { name: true },
|
|
401
|
-
},
|
|
402
208
|
},
|
|
403
209
|
"podman-network": {
|
|
404
210
|
modelType: PodmanResource,
|
|
@@ -406,14 +212,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
406
212
|
widgets: {
|
|
407
213
|
[DashboardComponentType.PodmanNetworkList]: "Network",
|
|
408
214
|
},
|
|
409
|
-
allowedQueryKeys: ["podmanHostId"],
|
|
410
|
-
select: {
|
|
411
|
-
_id: true,
|
|
412
|
-
name: true,
|
|
413
|
-
state: true,
|
|
414
|
-
podmanHostId: true,
|
|
415
|
-
podmanHost: { name: true },
|
|
416
|
-
},
|
|
417
215
|
},
|
|
418
216
|
"podman-volume": {
|
|
419
217
|
modelType: PodmanResource,
|
|
@@ -421,14 +219,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
421
219
|
widgets: {
|
|
422
220
|
[DashboardComponentType.PodmanVolumeList]: "Volume",
|
|
423
221
|
},
|
|
424
|
-
allowedQueryKeys: ["podmanHostId"],
|
|
425
|
-
select: {
|
|
426
|
-
_id: true,
|
|
427
|
-
name: true,
|
|
428
|
-
state: true,
|
|
429
|
-
podmanHostId: true,
|
|
430
|
-
podmanHost: { name: true },
|
|
431
|
-
},
|
|
432
222
|
},
|
|
433
223
|
"proxmox-resource": {
|
|
434
224
|
modelType: ProxmoxResource,
|
|
@@ -437,23 +227,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
437
227
|
[DashboardComponentType.ProxmoxNodeList]: "Node",
|
|
438
228
|
[DashboardComponentType.ProxmoxGuestList]: "Guest",
|
|
439
229
|
},
|
|
440
|
-
allowedQueryKeys: ["proxmoxClusterId", "guestType", "isUp", "name"],
|
|
441
|
-
select: {
|
|
442
|
-
_id: true,
|
|
443
|
-
name: true,
|
|
444
|
-
externalId: true,
|
|
445
|
-
kind: true,
|
|
446
|
-
vmid: true,
|
|
447
|
-
guestType: true,
|
|
448
|
-
parentNodeName: true,
|
|
449
|
-
isUp: true,
|
|
450
|
-
haState: true,
|
|
451
|
-
latestCpuPercent: true,
|
|
452
|
-
latestMemoryPercent: true,
|
|
453
|
-
lastSeenAt: true,
|
|
454
|
-
proxmoxClusterId: true,
|
|
455
|
-
proxmoxCluster: { name: true },
|
|
456
|
-
},
|
|
457
230
|
},
|
|
458
231
|
"ceph-resource": {
|
|
459
232
|
modelType: CephResource,
|
|
@@ -462,25 +235,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
462
235
|
[DashboardComponentType.CephOsdList]: "Osd",
|
|
463
236
|
[DashboardComponentType.CephPoolList]: "Pool",
|
|
464
237
|
},
|
|
465
|
-
allowedQueryKeys: ["cephClusterId", "isUp", "isIn", "externalId"],
|
|
466
|
-
select: {
|
|
467
|
-
_id: true,
|
|
468
|
-
name: true,
|
|
469
|
-
externalId: true,
|
|
470
|
-
kind: true,
|
|
471
|
-
hostname: true,
|
|
472
|
-
deviceClass: true,
|
|
473
|
-
isUp: true,
|
|
474
|
-
isIn: true,
|
|
475
|
-
statBytes: true,
|
|
476
|
-
statBytesUsed: true,
|
|
477
|
-
storedBytes: true,
|
|
478
|
-
maxAvailBytes: true,
|
|
479
|
-
objects: true,
|
|
480
|
-
lastSeenAt: true,
|
|
481
|
-
cephClusterId: true,
|
|
482
|
-
cephCluster: { name: true },
|
|
483
|
-
},
|
|
484
238
|
},
|
|
485
239
|
"docker-swarm-resource": {
|
|
486
240
|
modelType: DockerSwarmResource,
|
|
@@ -489,30 +243,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
489
243
|
[DashboardComponentType.DockerSwarmNodeList]: "Node",
|
|
490
244
|
[DashboardComponentType.DockerSwarmServiceList]: "Service",
|
|
491
245
|
},
|
|
492
|
-
allowedQueryKeys: [
|
|
493
|
-
"dockerSwarmClusterId",
|
|
494
|
-
"role",
|
|
495
|
-
"serviceMode",
|
|
496
|
-
"isReady",
|
|
497
|
-
],
|
|
498
|
-
select: {
|
|
499
|
-
_id: true,
|
|
500
|
-
name: true,
|
|
501
|
-
externalId: true,
|
|
502
|
-
kind: true,
|
|
503
|
-
role: true,
|
|
504
|
-
state: true,
|
|
505
|
-
serviceMode: true,
|
|
506
|
-
desiredReplicas: true,
|
|
507
|
-
runningReplicas: true,
|
|
508
|
-
image: true,
|
|
509
|
-
isReady: true,
|
|
510
|
-
latestCpuPercent: true,
|
|
511
|
-
latestMemoryPercent: true,
|
|
512
|
-
lastSeenAt: true,
|
|
513
|
-
dockerSwarmClusterId: true,
|
|
514
|
-
dockerSwarmCluster: { name: true },
|
|
515
|
-
},
|
|
516
246
|
},
|
|
517
247
|
span: {
|
|
518
248
|
modelType: Span,
|
|
@@ -520,17 +250,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
520
250
|
widgets: {
|
|
521
251
|
[DashboardComponentType.TraceList]: null,
|
|
522
252
|
},
|
|
523
|
-
allowedQueryKeys: ["startTime", "statusCode"],
|
|
524
|
-
select: {
|
|
525
|
-
startTime: true,
|
|
526
|
-
name: true,
|
|
527
|
-
statusCode: true,
|
|
528
|
-
durationUnixNano: true,
|
|
529
|
-
traceId: true,
|
|
530
|
-
spanId: true,
|
|
531
|
-
kind: true,
|
|
532
|
-
primaryEntityId: true,
|
|
533
|
-
},
|
|
534
253
|
},
|
|
535
254
|
log: {
|
|
536
255
|
modelType: Log,
|
|
@@ -538,16 +257,6 @@ const PUBLIC_DASHBOARD_RESOURCES: Record<
|
|
|
538
257
|
widgets: {
|
|
539
258
|
[DashboardComponentType.LogStream]: null,
|
|
540
259
|
},
|
|
541
|
-
allowedQueryKeys: ["time", "severityText", "body", "attributes"],
|
|
542
|
-
select: {
|
|
543
|
-
time: true,
|
|
544
|
-
severityText: true,
|
|
545
|
-
body: true,
|
|
546
|
-
primaryEntityId: true,
|
|
547
|
-
traceId: true,
|
|
548
|
-
spanId: true,
|
|
549
|
-
attributes: true,
|
|
550
|
-
},
|
|
551
260
|
},
|
|
552
261
|
};
|
|
553
262
|
|
|
@@ -763,24 +472,25 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
763
472
|
/*
|
|
764
473
|
* Everything below is derived from columns the public /metadata and
|
|
765
474
|
* /view-config endpoints already serve to anonymous viewers — the
|
|
766
|
-
* overview only reshapes them into a single GET-able document
|
|
475
|
+
* overview only reshapes them into a single GET-able document, and
|
|
476
|
+
* applies the same external-Data-Source strip /view-config does.
|
|
767
477
|
*/
|
|
478
|
+
const publicViewConfig: DashboardViewConfig | null =
|
|
479
|
+
PublicDashboardViewConfig.sanitize(dashboard.dashboardViewConfig);
|
|
480
|
+
|
|
768
481
|
return Response.sendJsonObjectResponse(req, res, {
|
|
769
482
|
_id: dashboard._id?.toString() || "",
|
|
770
483
|
name: dashboard.name || "Dashboard",
|
|
771
484
|
description: dashboard.description || "",
|
|
772
485
|
pageTitle: dashboard.pageTitle || "",
|
|
773
486
|
pageDescription: dashboard.pageDescription || "",
|
|
774
|
-
components:
|
|
775
|
-
|
|
776
|
-
),
|
|
487
|
+
components:
|
|
488
|
+
DashboardAPI.buildPublicComponentSummaries(publicViewConfig),
|
|
777
489
|
metricsUsed: Array.from(
|
|
778
|
-
DashboardAPI.collectDashboardMetricNames(
|
|
779
|
-
dashboard.dashboardViewConfig,
|
|
780
|
-
),
|
|
490
|
+
DashboardAPI.collectDashboardMetricNames(publicViewConfig),
|
|
781
491
|
).sort(),
|
|
782
|
-
dashboardViewConfig:
|
|
783
|
-
? JSONFunctions.serialize(
|
|
492
|
+
dashboardViewConfig: publicViewConfig
|
|
493
|
+
? JSONFunctions.serialize(publicViewConfig as any)
|
|
784
494
|
: null,
|
|
785
495
|
});
|
|
786
496
|
} catch (err) {
|
|
@@ -966,6 +676,9 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
966
676
|
throw new NotFoundException("Dashboard not found");
|
|
967
677
|
}
|
|
968
678
|
|
|
679
|
+
const publicViewConfig: DashboardViewConfig | null =
|
|
680
|
+
PublicDashboardViewConfig.sanitize(dashboard.dashboardViewConfig);
|
|
681
|
+
|
|
969
682
|
return Response.sendJsonObjectResponse(req, res, {
|
|
970
683
|
_id: dashboard._id?.toString() || "",
|
|
971
684
|
name: dashboard.name || "Dashboard",
|
|
@@ -975,8 +688,19 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
975
688
|
logoFile: DashboardAPI.getFileAsBase64JSONObject(
|
|
976
689
|
dashboard.logoFile,
|
|
977
690
|
),
|
|
978
|
-
|
|
979
|
-
|
|
691
|
+
/*
|
|
692
|
+
* External Data Source widgets are stripped: they cannot render
|
|
693
|
+
* for an anonymous viewer, and their config IS the query — raw
|
|
694
|
+
* SQL / PromQL naming internal tables, jobs, and instances.
|
|
695
|
+
*
|
|
696
|
+
* The null stays null. JSONFunctions.serialize(null) returns
|
|
697
|
+
* `{}`, and the public page falls back to a default config only
|
|
698
|
+
* on a FALSY value — an empty object is truthy, so it would sail
|
|
699
|
+
* through and the canvas would read `.components.length` off
|
|
700
|
+
* undefined.
|
|
701
|
+
*/
|
|
702
|
+
dashboardViewConfig: publicViewConfig
|
|
703
|
+
? JSONFunctions.serialize(publicViewConfig as any)
|
|
980
704
|
: null,
|
|
981
705
|
});
|
|
982
706
|
} catch (err) {
|
|
@@ -1494,8 +1218,8 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
1494
1218
|
* Public resource lists for non-metric dashboard widgets (incident /
|
|
1495
1219
|
* alert / monitor / trace / log / kubernetes / docker / host lists).
|
|
1496
1220
|
*
|
|
1497
|
-
* Each widget renders a fixed set of columns; the server
|
|
1498
|
-
* to exactly those columns
|
|
1221
|
+
* Each widget renders a fixed set of columns; the server-owned widget
|
|
1222
|
+
* policy pins the select to exactly those columns and forces the
|
|
1499
1223
|
* project scope to the dashboard's project, so a public viewer can only
|
|
1500
1224
|
* read the data the widget was built to show, for this dashboard's
|
|
1501
1225
|
* project. Authorization reuses DashboardService.hasReadAccess.
|
|
@@ -1926,119 +1650,130 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
1926
1650
|
}
|
|
1927
1651
|
|
|
1928
1652
|
/*
|
|
1929
|
-
*
|
|
1930
|
-
*
|
|
1931
|
-
*
|
|
1932
|
-
* dashboard was actually built to show — a dashboard with a monitor list
|
|
1933
|
-
* on it must not double as a project-wide log or incident reader.
|
|
1653
|
+
* Read only the real, top-level dashboard components. Recursively scanning
|
|
1654
|
+
* arbitrary widget arguments would let a nested object carrying a
|
|
1655
|
+
* `componentType` masquerade as a widget and become an authorization input.
|
|
1934
1656
|
*/
|
|
1935
|
-
private static
|
|
1657
|
+
private static collectDashboardWidgets(
|
|
1936
1658
|
dashboardViewConfig: unknown,
|
|
1937
|
-
):
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
if (Array.isArray(node)) {
|
|
1946
|
-
for (const item of node) {
|
|
1947
|
-
walk(item);
|
|
1948
|
-
}
|
|
1949
|
-
return;
|
|
1950
|
-
}
|
|
1951
|
-
|
|
1952
|
-
const obj: Record<string, unknown> = node as Record<string, unknown>;
|
|
1953
|
-
|
|
1954
|
-
const componentType: unknown = obj["componentType"];
|
|
1955
|
-
if (typeof componentType === "string" && componentType.length > 0) {
|
|
1956
|
-
componentTypes.add(componentType);
|
|
1957
|
-
}
|
|
1659
|
+
): Array<JSONObject> {
|
|
1660
|
+
if (
|
|
1661
|
+
!dashboardViewConfig ||
|
|
1662
|
+
typeof dashboardViewConfig !== "object" ||
|
|
1663
|
+
Array.isArray(dashboardViewConfig)
|
|
1664
|
+
) {
|
|
1665
|
+
return [];
|
|
1666
|
+
}
|
|
1958
1667
|
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
};
|
|
1668
|
+
const components: unknown = (
|
|
1669
|
+
dashboardViewConfig as Record<string, unknown>
|
|
1670
|
+
)["components"];
|
|
1963
1671
|
|
|
1964
|
-
|
|
1672
|
+
if (!Array.isArray(components)) {
|
|
1673
|
+
return [];
|
|
1674
|
+
}
|
|
1965
1675
|
|
|
1966
|
-
return
|
|
1676
|
+
return components.filter((component: unknown): component is JSONObject => {
|
|
1677
|
+
return Boolean(
|
|
1678
|
+
component && typeof component === "object" && !Array.isArray(component),
|
|
1679
|
+
);
|
|
1680
|
+
});
|
|
1967
1681
|
}
|
|
1968
1682
|
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
* column used as a blind oracle — is dropped rather than merged.
|
|
1974
|
-
*/
|
|
1975
|
-
private static sanitizePublicResourceQuery(data: {
|
|
1976
|
-
query: unknown;
|
|
1977
|
-
allowedQueryKeys: Array<string>;
|
|
1978
|
-
}): JSONObject {
|
|
1979
|
-
const { query, allowedQueryKeys } = data;
|
|
1683
|
+
private static readDashboardWidgetComponentId(
|
|
1684
|
+
widget: JSONObject,
|
|
1685
|
+
): string | null {
|
|
1686
|
+
const componentId: unknown = widget["componentId"];
|
|
1980
1687
|
|
|
1981
|
-
|
|
1688
|
+
if (componentId instanceof ObjectID) {
|
|
1689
|
+
return componentId.toString();
|
|
1690
|
+
}
|
|
1982
1691
|
|
|
1983
|
-
if (
|
|
1984
|
-
return
|
|
1692
|
+
if (typeof componentId === "string" && componentId.length > 0) {
|
|
1693
|
+
return componentId;
|
|
1985
1694
|
}
|
|
1986
1695
|
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
) {
|
|
1997
|
-
sanitized[key] = queryObject[key];
|
|
1696
|
+
if (
|
|
1697
|
+
componentId &&
|
|
1698
|
+
typeof componentId === "object" &&
|
|
1699
|
+
!Array.isArray(componentId)
|
|
1700
|
+
) {
|
|
1701
|
+
const value: unknown = (componentId as Record<string, unknown>)["value"];
|
|
1702
|
+
|
|
1703
|
+
if (typeof value === "string" && value.length > 0) {
|
|
1704
|
+
return value;
|
|
1998
1705
|
}
|
|
1999
1706
|
}
|
|
2000
1707
|
|
|
2001
|
-
return
|
|
1708
|
+
return null;
|
|
2002
1709
|
}
|
|
2003
1710
|
|
|
2004
1711
|
/*
|
|
2005
|
-
*
|
|
2006
|
-
*
|
|
2007
|
-
*
|
|
1712
|
+
* Select the exact stored widget whose policy will be executed. A legacy
|
|
1713
|
+
* caller may omit componentId only when there is exactly one matching
|
|
1714
|
+
* widget, so two differently-filtered widgets are never conflated.
|
|
2008
1715
|
*/
|
|
2009
|
-
private static
|
|
2010
|
-
|
|
2011
|
-
|
|
1716
|
+
private static selectPublicResourceWidget(data: {
|
|
1717
|
+
dashboardViewConfig: unknown;
|
|
1718
|
+
config: PublicDashboardResourceConfig;
|
|
1719
|
+
requestedComponentId: unknown;
|
|
2012
1720
|
}): JSONObject {
|
|
2013
|
-
const
|
|
1721
|
+
const matchingWidgets: Array<JSONObject> =
|
|
1722
|
+
DashboardAPI.collectDashboardWidgets(data.dashboardViewConfig).filter(
|
|
1723
|
+
(widget: JSONObject): boolean => {
|
|
1724
|
+
const componentType: unknown = widget["componentType"];
|
|
1725
|
+
|
|
1726
|
+
return (
|
|
1727
|
+
typeof componentType === "string" &&
|
|
1728
|
+
Object.prototype.hasOwnProperty.call(
|
|
1729
|
+
data.config.widgets,
|
|
1730
|
+
componentType,
|
|
1731
|
+
)
|
|
1732
|
+
);
|
|
1733
|
+
},
|
|
1734
|
+
);
|
|
1735
|
+
|
|
1736
|
+
if (matchingWidgets.length === 0) {
|
|
1737
|
+
throw new BadDataException(
|
|
1738
|
+
"This resource is not part of this dashboard.",
|
|
1739
|
+
);
|
|
1740
|
+
}
|
|
2014
1741
|
|
|
2015
|
-
|
|
1742
|
+
if (
|
|
1743
|
+
data.requestedComponentId === undefined ||
|
|
1744
|
+
data.requestedComponentId === null
|
|
1745
|
+
) {
|
|
1746
|
+
if (matchingWidgets.length === 1) {
|
|
1747
|
+
return matchingWidgets[0] as JSONObject;
|
|
1748
|
+
}
|
|
2016
1749
|
|
|
2017
|
-
|
|
2018
|
-
|
|
1750
|
+
throw new BadDataException(
|
|
1751
|
+
"A componentId is required to read this resource from this dashboard.",
|
|
1752
|
+
);
|
|
2019
1753
|
}
|
|
2020
1754
|
|
|
2021
|
-
|
|
1755
|
+
if (typeof data.requestedComponentId !== "string") {
|
|
1756
|
+
throw new BadDataException("componentId must be a string UUID.");
|
|
1757
|
+
}
|
|
2022
1758
|
|
|
2023
|
-
|
|
2024
|
-
// Only scalar columns of the fixed select are sortable.
|
|
2025
|
-
if (select[key] !== true) {
|
|
2026
|
-
continue;
|
|
2027
|
-
}
|
|
1759
|
+
ObjectID.validateUUID(data.requestedComponentId);
|
|
2028
1760
|
|
|
2029
|
-
|
|
1761
|
+
const selectedWidget: JSONObject | undefined = matchingWidgets.find(
|
|
1762
|
+
(widget: JSONObject): boolean => {
|
|
1763
|
+
return (
|
|
1764
|
+
DashboardAPI.readDashboardWidgetComponentId(widget) ===
|
|
1765
|
+
data.requestedComponentId
|
|
1766
|
+
);
|
|
1767
|
+
},
|
|
1768
|
+
);
|
|
2030
1769
|
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
)
|
|
2035
|
-
sanitized[key] = SortOrder.Descending;
|
|
2036
|
-
} else {
|
|
2037
|
-
sanitized[key] = SortOrder.Ascending;
|
|
2038
|
-
}
|
|
1770
|
+
if (!selectedWidget) {
|
|
1771
|
+
throw new BadDataException(
|
|
1772
|
+
"This resource is not part of this dashboard.",
|
|
1773
|
+
);
|
|
2039
1774
|
}
|
|
2040
1775
|
|
|
2041
|
-
return
|
|
1776
|
+
return selectedWidget;
|
|
2042
1777
|
}
|
|
2043
1778
|
|
|
2044
1779
|
/*
|
|
@@ -2087,117 +1822,66 @@ export default class DashboardAPI extends BaseAPI<
|
|
|
2087
1822
|
throw new NotFoundException("Dashboard not found");
|
|
2088
1823
|
}
|
|
2089
1824
|
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
* allowlist.
|
|
2096
|
-
*/
|
|
2097
|
-
const dashboardComponentTypes: Set<string> =
|
|
2098
|
-
DashboardAPI.collectDashboardComponentTypes(
|
|
2099
|
-
dashboard.dashboardViewConfig,
|
|
2100
|
-
);
|
|
2101
|
-
|
|
2102
|
-
const presentWidgets: Array<string> = Object.keys(config.widgets).filter(
|
|
2103
|
-
(componentType: string) => {
|
|
2104
|
-
return dashboardComponentTypes.has(componentType);
|
|
2105
|
-
},
|
|
2106
|
-
);
|
|
2107
|
-
|
|
2108
|
-
if (presentWidgets.length === 0) {
|
|
2109
|
-
throw new BadDataException(
|
|
2110
|
-
"This resource is not part of this dashboard.",
|
|
2111
|
-
);
|
|
2112
|
-
}
|
|
1825
|
+
const widget: JSONObject = DashboardAPI.selectPublicResourceWidget({
|
|
1826
|
+
dashboardViewConfig: dashboard.dashboardViewConfig,
|
|
1827
|
+
config,
|
|
1828
|
+
requestedComponentId: req.body ? req.body["componentId"] : undefined,
|
|
1829
|
+
});
|
|
2113
1830
|
|
|
2114
|
-
const
|
|
1831
|
+
const requestedQuery: JSONObject =
|
|
2115
1832
|
req.body && req.body["query"]
|
|
2116
1833
|
? (JSONFunctions.deserialize(
|
|
2117
1834
|
req.body["query"] as JSONObject,
|
|
2118
1835
|
) as JSONObject)
|
|
2119
1836
|
: {};
|
|
2120
1837
|
|
|
2121
|
-
const
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
* Security: pin to the dashboard's project; never trust a client-supplied
|
|
2128
|
-
* projectId on a public, unauthenticated endpoint.
|
|
2129
|
-
*/
|
|
2130
|
-
(query as Record<string, unknown>)["projectId"] = dashboard.projectId;
|
|
2131
|
-
|
|
2132
|
-
/*
|
|
2133
|
-
* Models that pack several resource kinds into one table (Kubernetes,
|
|
2134
|
-
* Docker, Podman, Proxmox, Ceph, Swarm) are constrained to the kinds the
|
|
2135
|
-
* dashboard's widgets render, so a "volumes" widget cannot be used to
|
|
2136
|
-
* list containers. A widget may pick one of those kinds; anything else is
|
|
2137
|
-
* rejected, and a request that names no kind gets all of them.
|
|
2138
|
-
*/
|
|
2139
|
-
const allowedKinds: Array<string> = presentWidgets
|
|
2140
|
-
.map((componentType: string) => {
|
|
2141
|
-
return config.widgets[componentType as DashboardComponentType];
|
|
2142
|
-
})
|
|
2143
|
-
.filter((kind: string | null | undefined): kind is string => {
|
|
2144
|
-
return Boolean(kind);
|
|
1838
|
+
const policy: PublicDashboardResourceListPolicyResult =
|
|
1839
|
+
PublicDashboardResourceListPolicy.build({
|
|
1840
|
+
widget,
|
|
1841
|
+
dashboardViewConfig: dashboard.dashboardViewConfig,
|
|
1842
|
+
requestedVariables: req.body ? req.body["variables"] : undefined,
|
|
1843
|
+
requestedQuery,
|
|
2145
1844
|
});
|
|
2146
1845
|
|
|
2147
|
-
|
|
2148
|
-
const requestedKind: unknown = (clientQuery as Record<string, unknown>)[
|
|
2149
|
-
"kind"
|
|
2150
|
-
];
|
|
2151
|
-
|
|
2152
|
-
if (requestedKind !== undefined && requestedKind !== null) {
|
|
2153
|
-
if (
|
|
2154
|
-
typeof requestedKind !== "string" ||
|
|
2155
|
-
!allowedKinds.includes(requestedKind)
|
|
2156
|
-
) {
|
|
2157
|
-
throw new BadDataException(
|
|
2158
|
-
"This resource is not part of this dashboard.",
|
|
2159
|
-
);
|
|
2160
|
-
}
|
|
1846
|
+
const requestedResourceType: string = req.params["resourceType"] as string;
|
|
2161
1847
|
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
(query as Record<string, unknown>)["kind"] = new Includes(allowedKinds);
|
|
2167
|
-
}
|
|
1848
|
+
if (policy.resourceType !== requestedResourceType) {
|
|
1849
|
+
throw new BadDataException(
|
|
1850
|
+
"This resource is not part of this dashboard.",
|
|
1851
|
+
);
|
|
2168
1852
|
}
|
|
2169
1853
|
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
? JSONFunctions.deserialize(req.body["sort"] as JSONObject)
|
|
2174
|
-
: {},
|
|
2175
|
-
select: config.select,
|
|
2176
|
-
});
|
|
1854
|
+
let query: JSONObject = {
|
|
1855
|
+
...policy.query,
|
|
1856
|
+
};
|
|
2177
1857
|
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
)
|
|
1858
|
+
/*
|
|
1859
|
+
* IncidentService and AlertService normally apply privacy in their
|
|
1860
|
+
* onBeforeFind hooks. The root read below intentionally bypasses those
|
|
1861
|
+
* hooks' user context, so apply the anonymous form explicitly first:
|
|
1862
|
+
* public dashboards may show public rows, never private tenant rows.
|
|
1863
|
+
*/
|
|
1864
|
+
if (requestedResourceType === "incident") {
|
|
1865
|
+
query = applyIncidentSelfPrivacyFilter(query, {});
|
|
1866
|
+
} else if (requestedResourceType === "alert") {
|
|
1867
|
+
query = applyAlertSelfPrivacyFilter(query, {});
|
|
1868
|
+
}
|
|
2187
1869
|
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
1870
|
+
/*
|
|
1871
|
+
* Project scope is the final query invariant. Neither the request nor a
|
|
1872
|
+
* future policy builder may redirect this root read to another project.
|
|
1873
|
+
* Resource kind, where applicable, comes solely from the selected
|
|
1874
|
+
* widget's policy query.
|
|
1875
|
+
*/
|
|
1876
|
+
query["projectId"] = dashboard.projectId;
|
|
2193
1877
|
|
|
2194
1878
|
const list: Array<BaseModel | AnalyticsDataModel> =
|
|
2195
1879
|
await config.service.findBy({
|
|
2196
1880
|
query: query,
|
|
2197
|
-
select:
|
|
2198
|
-
sort: sort,
|
|
2199
|
-
limit: limit,
|
|
2200
|
-
skip:
|
|
1881
|
+
select: policy.select,
|
|
1882
|
+
sort: policy.sort,
|
|
1883
|
+
limit: policy.limit,
|
|
1884
|
+
skip: 0,
|
|
2201
1885
|
props: {
|
|
2202
1886
|
isRoot: true,
|
|
2203
1887
|
},
|