@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
|
@@ -11,6 +11,7 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
11
11
|
import Dashboard from "../../Models/DatabaseModels/Dashboard";
|
|
12
12
|
import { DASHBOARD_MASTER_PASSWORD_INVALID_MESSAGE } from "../../Types/Dashboard/MasterPassword";
|
|
13
13
|
import JSONFunctions from "../../Types/JSONFunctions";
|
|
14
|
+
import PublicDashboardViewConfig from "../Utils/Dashboard/PublicDashboardViewConfig";
|
|
14
15
|
import TelemetryAttributeService from "../Services/TelemetryAttributeService";
|
|
15
16
|
import TelemetryType from "../../Types/Telemetry/TelemetryType";
|
|
16
17
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
@@ -50,8 +51,9 @@ import SpanService from "../Services/SpanService";
|
|
|
50
51
|
import LogService from "../Services/LogService";
|
|
51
52
|
import DashboardComponentType from "../../Types/Dashboard/DashboardComponentType";
|
|
52
53
|
import { DashboardVariableType } from "../../Types/Dashboard/DashboardVariable";
|
|
53
|
-
import
|
|
54
|
-
|
|
54
|
+
import PublicDashboardResourceListPolicy from "../Utils/Dashboard/PublicDashboardResourceListPolicy";
|
|
55
|
+
import { applyIncidentSelfPrivacyFilter } from "../Utils/Incident/IncidentPrivacyFilter";
|
|
56
|
+
import { applyAlertSelfPrivacyFilter } from "../Utils/Alert/AlertPrivacyFilter";
|
|
55
57
|
const PUBLIC_DASHBOARD_RESOURCES = {
|
|
56
58
|
incident: {
|
|
57
59
|
modelType: Incident,
|
|
@@ -59,20 +61,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
59
61
|
widgets: {
|
|
60
62
|
[DashboardComponentType.IncidentList]: null,
|
|
61
63
|
},
|
|
62
|
-
allowedQueryKeys: [
|
|
63
|
-
"currentIncidentState",
|
|
64
|
-
"currentIncidentStateId",
|
|
65
|
-
"incidentSeverityId",
|
|
66
|
-
"monitors",
|
|
67
|
-
"labels",
|
|
68
|
-
],
|
|
69
|
-
select: {
|
|
70
|
-
_id: true,
|
|
71
|
-
title: true,
|
|
72
|
-
createdAt: true,
|
|
73
|
-
currentIncidentState: { name: true, color: true },
|
|
74
|
-
incidentSeverity: { name: true, color: true },
|
|
75
|
-
},
|
|
76
64
|
},
|
|
77
65
|
alert: {
|
|
78
66
|
modelType: Alert,
|
|
@@ -80,20 +68,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
80
68
|
widgets: {
|
|
81
69
|
[DashboardComponentType.AlertList]: null,
|
|
82
70
|
},
|
|
83
|
-
allowedQueryKeys: [
|
|
84
|
-
"currentAlertState",
|
|
85
|
-
"currentAlertStateId",
|
|
86
|
-
"alertSeverityId",
|
|
87
|
-
"monitorId",
|
|
88
|
-
"labels",
|
|
89
|
-
],
|
|
90
|
-
select: {
|
|
91
|
-
_id: true,
|
|
92
|
-
title: true,
|
|
93
|
-
createdAt: true,
|
|
94
|
-
currentAlertState: { name: true, color: true },
|
|
95
|
-
alertSeverity: { name: true, color: true },
|
|
96
|
-
},
|
|
97
71
|
},
|
|
98
72
|
monitor: {
|
|
99
73
|
modelType: Monitor,
|
|
@@ -101,18 +75,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
101
75
|
widgets: {
|
|
102
76
|
[DashboardComponentType.MonitorList]: null,
|
|
103
77
|
},
|
|
104
|
-
allowedQueryKeys: [
|
|
105
|
-
"currentMonitorStatus",
|
|
106
|
-
"currentMonitorStatusId",
|
|
107
|
-
"monitorType",
|
|
108
|
-
"labels",
|
|
109
|
-
],
|
|
110
|
-
select: {
|
|
111
|
-
_id: true,
|
|
112
|
-
name: true,
|
|
113
|
-
monitorType: true,
|
|
114
|
-
currentMonitorStatus: { name: true, color: true },
|
|
115
|
-
},
|
|
116
78
|
},
|
|
117
79
|
"network-site": {
|
|
118
80
|
modelType: NetworkSite,
|
|
@@ -120,36 +82,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
120
82
|
widgets: {
|
|
121
83
|
[DashboardComponentType.NetworkMap]: null,
|
|
122
84
|
},
|
|
123
|
-
/*
|
|
124
|
-
* The map filters by site type and by whether the rolled-up status is
|
|
125
|
-
* operational — nothing else. Notably NOT `parentSiteId` or
|
|
126
|
-
* `materializedPath`: the widget draws a flat set of pins rather than
|
|
127
|
-
* walking a hierarchy, so exposing the tree shape here would hand an
|
|
128
|
-
* anonymous viewer a structure the map never shows them.
|
|
129
|
-
*/
|
|
130
|
-
allowedQueryKeys: [
|
|
131
|
-
"networkSiteTypeId",
|
|
132
|
-
"currentMonitorStatus",
|
|
133
|
-
"currentMonitorStatusId",
|
|
134
|
-
],
|
|
135
|
-
select: {
|
|
136
|
-
_id: true,
|
|
137
|
-
name: true,
|
|
138
|
-
/*
|
|
139
|
-
* The type NAME comes from the networkSiteType relation. NetworkSite
|
|
140
|
-
* .siteType is the deprecated pre-lookup-table string and is dropped
|
|
141
|
-
* in a follow-up PR, so it must not be read from new code.
|
|
142
|
-
*/
|
|
143
|
-
networkSiteType: { name: true },
|
|
144
|
-
latitude: true,
|
|
145
|
-
longitude: true,
|
|
146
|
-
currentMonitorStatus: {
|
|
147
|
-
name: true,
|
|
148
|
-
color: true,
|
|
149
|
-
priority: true,
|
|
150
|
-
isOperationalState: true,
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
85
|
},
|
|
154
86
|
host: {
|
|
155
87
|
modelType: Host,
|
|
@@ -157,23 +89,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
157
89
|
widgets: {
|
|
158
90
|
[DashboardComponentType.HostList]: null,
|
|
159
91
|
},
|
|
160
|
-
allowedQueryKeys: [
|
|
161
|
-
"name",
|
|
162
|
-
"hostIdentifier",
|
|
163
|
-
"otelCollectorStatus",
|
|
164
|
-
"osType",
|
|
165
|
-
],
|
|
166
|
-
select: {
|
|
167
|
-
_id: true,
|
|
168
|
-
name: true,
|
|
169
|
-
hostIdentifier: true,
|
|
170
|
-
otelCollectorStatus: true,
|
|
171
|
-
osType: true,
|
|
172
|
-
osVersion: true,
|
|
173
|
-
cpuCores: true,
|
|
174
|
-
totalMemoryBytes: true,
|
|
175
|
-
lastSeenAt: true,
|
|
176
|
-
},
|
|
177
92
|
},
|
|
178
93
|
"kubernetes-resource": {
|
|
179
94
|
modelType: KubernetesResource,
|
|
@@ -188,33 +103,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
188
103
|
[DashboardComponentType.KubernetesJobList]: "Job",
|
|
189
104
|
[DashboardComponentType.KubernetesCronJobList]: "CronJob",
|
|
190
105
|
},
|
|
191
|
-
allowedQueryKeys: [
|
|
192
|
-
"kubernetesClusterId",
|
|
193
|
-
"namespaceKey",
|
|
194
|
-
"name",
|
|
195
|
-
"phase",
|
|
196
|
-
"isReady",
|
|
197
|
-
],
|
|
198
|
-
select: {
|
|
199
|
-
_id: true,
|
|
200
|
-
name: true,
|
|
201
|
-
namespaceKey: true,
|
|
202
|
-
kind: true,
|
|
203
|
-
phase: true,
|
|
204
|
-
isReady: true,
|
|
205
|
-
hasMemoryPressure: true,
|
|
206
|
-
hasDiskPressure: true,
|
|
207
|
-
hasPidPressure: true,
|
|
208
|
-
containerCount: true,
|
|
209
|
-
latestCpuPercent: true,
|
|
210
|
-
latestMemoryBytes: true,
|
|
211
|
-
controllerDeploymentName: true,
|
|
212
|
-
controllerCronJobName: true,
|
|
213
|
-
resourceCreationTimestamp: true,
|
|
214
|
-
lastSeenAt: true,
|
|
215
|
-
kubernetesClusterId: true,
|
|
216
|
-
kubernetesCluster: { name: true },
|
|
217
|
-
},
|
|
218
106
|
},
|
|
219
107
|
"docker-host": {
|
|
220
108
|
modelType: DockerHost,
|
|
@@ -222,17 +110,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
222
110
|
widgets: {
|
|
223
111
|
[DashboardComponentType.DockerHostList]: null,
|
|
224
112
|
},
|
|
225
|
-
allowedQueryKeys: ["name", "otelCollectorStatus"],
|
|
226
|
-
select: {
|
|
227
|
-
_id: true,
|
|
228
|
-
name: true,
|
|
229
|
-
otelCollectorStatus: true,
|
|
230
|
-
containersRunning: true,
|
|
231
|
-
containersStopped: true,
|
|
232
|
-
containersPaused: true,
|
|
233
|
-
osType: true,
|
|
234
|
-
osVersion: true,
|
|
235
|
-
},
|
|
236
113
|
},
|
|
237
114
|
"docker-container": {
|
|
238
115
|
modelType: DockerResource,
|
|
@@ -240,17 +117,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
240
117
|
widgets: {
|
|
241
118
|
[DashboardComponentType.DockerContainerList]: "Container",
|
|
242
119
|
},
|
|
243
|
-
allowedQueryKeys: ["dockerHostId", "name", "imageName"],
|
|
244
|
-
select: {
|
|
245
|
-
_id: true,
|
|
246
|
-
name: true,
|
|
247
|
-
imageName: true,
|
|
248
|
-
state: true,
|
|
249
|
-
latestCpuPercent: true,
|
|
250
|
-
latestMemoryBytes: true,
|
|
251
|
-
dockerHostId: true,
|
|
252
|
-
dockerHost: { name: true },
|
|
253
|
-
},
|
|
254
120
|
},
|
|
255
121
|
"docker-image": {
|
|
256
122
|
modelType: DockerResource,
|
|
@@ -258,14 +124,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
258
124
|
widgets: {
|
|
259
125
|
[DashboardComponentType.DockerImageList]: "Image",
|
|
260
126
|
},
|
|
261
|
-
allowedQueryKeys: ["dockerHostId", "name"],
|
|
262
|
-
select: {
|
|
263
|
-
_id: true,
|
|
264
|
-
name: true,
|
|
265
|
-
containerId: true,
|
|
266
|
-
dockerHostId: true,
|
|
267
|
-
dockerHost: { name: true },
|
|
268
|
-
},
|
|
269
127
|
},
|
|
270
128
|
"docker-network": {
|
|
271
129
|
modelType: DockerResource,
|
|
@@ -273,14 +131,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
273
131
|
widgets: {
|
|
274
132
|
[DashboardComponentType.DockerNetworkList]: "Network",
|
|
275
133
|
},
|
|
276
|
-
allowedQueryKeys: ["dockerHostId"],
|
|
277
|
-
select: {
|
|
278
|
-
_id: true,
|
|
279
|
-
name: true,
|
|
280
|
-
state: true,
|
|
281
|
-
dockerHostId: true,
|
|
282
|
-
dockerHost: { name: true },
|
|
283
|
-
},
|
|
284
134
|
},
|
|
285
135
|
"docker-volume": {
|
|
286
136
|
modelType: DockerResource,
|
|
@@ -288,14 +138,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
288
138
|
widgets: {
|
|
289
139
|
[DashboardComponentType.DockerVolumeList]: "Volume",
|
|
290
140
|
},
|
|
291
|
-
allowedQueryKeys: ["dockerHostId"],
|
|
292
|
-
select: {
|
|
293
|
-
_id: true,
|
|
294
|
-
name: true,
|
|
295
|
-
state: true,
|
|
296
|
-
dockerHostId: true,
|
|
297
|
-
dockerHost: { name: true },
|
|
298
|
-
},
|
|
299
141
|
},
|
|
300
142
|
"podman-host": {
|
|
301
143
|
modelType: PodmanHost,
|
|
@@ -303,17 +145,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
303
145
|
widgets: {
|
|
304
146
|
[DashboardComponentType.PodmanHostList]: null,
|
|
305
147
|
},
|
|
306
|
-
allowedQueryKeys: ["name", "otelCollectorStatus"],
|
|
307
|
-
select: {
|
|
308
|
-
_id: true,
|
|
309
|
-
name: true,
|
|
310
|
-
otelCollectorStatus: true,
|
|
311
|
-
containersRunning: true,
|
|
312
|
-
containersStopped: true,
|
|
313
|
-
containersPaused: true,
|
|
314
|
-
osType: true,
|
|
315
|
-
osVersion: true,
|
|
316
|
-
},
|
|
317
148
|
},
|
|
318
149
|
"podman-container": {
|
|
319
150
|
modelType: PodmanResource,
|
|
@@ -321,17 +152,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
321
152
|
widgets: {
|
|
322
153
|
[DashboardComponentType.PodmanContainerList]: "Container",
|
|
323
154
|
},
|
|
324
|
-
allowedQueryKeys: ["podmanHostId", "name", "imageName"],
|
|
325
|
-
select: {
|
|
326
|
-
_id: true,
|
|
327
|
-
name: true,
|
|
328
|
-
imageName: true,
|
|
329
|
-
state: true,
|
|
330
|
-
latestCpuPercent: true,
|
|
331
|
-
latestMemoryBytes: true,
|
|
332
|
-
podmanHostId: true,
|
|
333
|
-
podmanHost: { name: true },
|
|
334
|
-
},
|
|
335
155
|
},
|
|
336
156
|
"podman-image": {
|
|
337
157
|
modelType: PodmanResource,
|
|
@@ -339,14 +159,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
339
159
|
widgets: {
|
|
340
160
|
[DashboardComponentType.PodmanImageList]: "Image",
|
|
341
161
|
},
|
|
342
|
-
allowedQueryKeys: ["podmanHostId", "name"],
|
|
343
|
-
select: {
|
|
344
|
-
_id: true,
|
|
345
|
-
name: true,
|
|
346
|
-
containerId: true,
|
|
347
|
-
podmanHostId: true,
|
|
348
|
-
podmanHost: { name: true },
|
|
349
|
-
},
|
|
350
162
|
},
|
|
351
163
|
"podman-network": {
|
|
352
164
|
modelType: PodmanResource,
|
|
@@ -354,14 +166,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
354
166
|
widgets: {
|
|
355
167
|
[DashboardComponentType.PodmanNetworkList]: "Network",
|
|
356
168
|
},
|
|
357
|
-
allowedQueryKeys: ["podmanHostId"],
|
|
358
|
-
select: {
|
|
359
|
-
_id: true,
|
|
360
|
-
name: true,
|
|
361
|
-
state: true,
|
|
362
|
-
podmanHostId: true,
|
|
363
|
-
podmanHost: { name: true },
|
|
364
|
-
},
|
|
365
169
|
},
|
|
366
170
|
"podman-volume": {
|
|
367
171
|
modelType: PodmanResource,
|
|
@@ -369,14 +173,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
369
173
|
widgets: {
|
|
370
174
|
[DashboardComponentType.PodmanVolumeList]: "Volume",
|
|
371
175
|
},
|
|
372
|
-
allowedQueryKeys: ["podmanHostId"],
|
|
373
|
-
select: {
|
|
374
|
-
_id: true,
|
|
375
|
-
name: true,
|
|
376
|
-
state: true,
|
|
377
|
-
podmanHostId: true,
|
|
378
|
-
podmanHost: { name: true },
|
|
379
|
-
},
|
|
380
176
|
},
|
|
381
177
|
"proxmox-resource": {
|
|
382
178
|
modelType: ProxmoxResource,
|
|
@@ -385,23 +181,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
385
181
|
[DashboardComponentType.ProxmoxNodeList]: "Node",
|
|
386
182
|
[DashboardComponentType.ProxmoxGuestList]: "Guest",
|
|
387
183
|
},
|
|
388
|
-
allowedQueryKeys: ["proxmoxClusterId", "guestType", "isUp", "name"],
|
|
389
|
-
select: {
|
|
390
|
-
_id: true,
|
|
391
|
-
name: true,
|
|
392
|
-
externalId: true,
|
|
393
|
-
kind: true,
|
|
394
|
-
vmid: true,
|
|
395
|
-
guestType: true,
|
|
396
|
-
parentNodeName: true,
|
|
397
|
-
isUp: true,
|
|
398
|
-
haState: true,
|
|
399
|
-
latestCpuPercent: true,
|
|
400
|
-
latestMemoryPercent: true,
|
|
401
|
-
lastSeenAt: true,
|
|
402
|
-
proxmoxClusterId: true,
|
|
403
|
-
proxmoxCluster: { name: true },
|
|
404
|
-
},
|
|
405
184
|
},
|
|
406
185
|
"ceph-resource": {
|
|
407
186
|
modelType: CephResource,
|
|
@@ -410,25 +189,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
410
189
|
[DashboardComponentType.CephOsdList]: "Osd",
|
|
411
190
|
[DashboardComponentType.CephPoolList]: "Pool",
|
|
412
191
|
},
|
|
413
|
-
allowedQueryKeys: ["cephClusterId", "isUp", "isIn", "externalId"],
|
|
414
|
-
select: {
|
|
415
|
-
_id: true,
|
|
416
|
-
name: true,
|
|
417
|
-
externalId: true,
|
|
418
|
-
kind: true,
|
|
419
|
-
hostname: true,
|
|
420
|
-
deviceClass: true,
|
|
421
|
-
isUp: true,
|
|
422
|
-
isIn: true,
|
|
423
|
-
statBytes: true,
|
|
424
|
-
statBytesUsed: true,
|
|
425
|
-
storedBytes: true,
|
|
426
|
-
maxAvailBytes: true,
|
|
427
|
-
objects: true,
|
|
428
|
-
lastSeenAt: true,
|
|
429
|
-
cephClusterId: true,
|
|
430
|
-
cephCluster: { name: true },
|
|
431
|
-
},
|
|
432
192
|
},
|
|
433
193
|
"docker-swarm-resource": {
|
|
434
194
|
modelType: DockerSwarmResource,
|
|
@@ -437,30 +197,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
437
197
|
[DashboardComponentType.DockerSwarmNodeList]: "Node",
|
|
438
198
|
[DashboardComponentType.DockerSwarmServiceList]: "Service",
|
|
439
199
|
},
|
|
440
|
-
allowedQueryKeys: [
|
|
441
|
-
"dockerSwarmClusterId",
|
|
442
|
-
"role",
|
|
443
|
-
"serviceMode",
|
|
444
|
-
"isReady",
|
|
445
|
-
],
|
|
446
|
-
select: {
|
|
447
|
-
_id: true,
|
|
448
|
-
name: true,
|
|
449
|
-
externalId: true,
|
|
450
|
-
kind: true,
|
|
451
|
-
role: true,
|
|
452
|
-
state: true,
|
|
453
|
-
serviceMode: true,
|
|
454
|
-
desiredReplicas: true,
|
|
455
|
-
runningReplicas: true,
|
|
456
|
-
image: true,
|
|
457
|
-
isReady: true,
|
|
458
|
-
latestCpuPercent: true,
|
|
459
|
-
latestMemoryPercent: true,
|
|
460
|
-
lastSeenAt: true,
|
|
461
|
-
dockerSwarmClusterId: true,
|
|
462
|
-
dockerSwarmCluster: { name: true },
|
|
463
|
-
},
|
|
464
200
|
},
|
|
465
201
|
span: {
|
|
466
202
|
modelType: Span,
|
|
@@ -468,17 +204,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
468
204
|
widgets: {
|
|
469
205
|
[DashboardComponentType.TraceList]: null,
|
|
470
206
|
},
|
|
471
|
-
allowedQueryKeys: ["startTime", "statusCode"],
|
|
472
|
-
select: {
|
|
473
|
-
startTime: true,
|
|
474
|
-
name: true,
|
|
475
|
-
statusCode: true,
|
|
476
|
-
durationUnixNano: true,
|
|
477
|
-
traceId: true,
|
|
478
|
-
spanId: true,
|
|
479
|
-
kind: true,
|
|
480
|
-
primaryEntityId: true,
|
|
481
|
-
},
|
|
482
207
|
},
|
|
483
208
|
log: {
|
|
484
209
|
modelType: Log,
|
|
@@ -486,16 +211,6 @@ const PUBLIC_DASHBOARD_RESOURCES = {
|
|
|
486
211
|
widgets: {
|
|
487
212
|
[DashboardComponentType.LogStream]: null,
|
|
488
213
|
},
|
|
489
|
-
allowedQueryKeys: ["time", "severityText", "body", "attributes"],
|
|
490
|
-
select: {
|
|
491
|
-
time: true,
|
|
492
|
-
severityText: true,
|
|
493
|
-
body: true,
|
|
494
|
-
primaryEntityId: true,
|
|
495
|
-
traceId: true,
|
|
496
|
-
spanId: true,
|
|
497
|
-
attributes: true,
|
|
498
|
-
},
|
|
499
214
|
},
|
|
500
215
|
};
|
|
501
216
|
/*
|
|
@@ -646,18 +361,20 @@ export default class DashboardAPI extends BaseAPI {
|
|
|
646
361
|
/*
|
|
647
362
|
* Everything below is derived from columns the public /metadata and
|
|
648
363
|
* /view-config endpoints already serve to anonymous viewers — the
|
|
649
|
-
* overview only reshapes them into a single GET-able document
|
|
364
|
+
* overview only reshapes them into a single GET-able document, and
|
|
365
|
+
* applies the same external-Data-Source strip /view-config does.
|
|
650
366
|
*/
|
|
367
|
+
const publicViewConfig = PublicDashboardViewConfig.sanitize(dashboard.dashboardViewConfig);
|
|
651
368
|
return Response.sendJsonObjectResponse(req, res, {
|
|
652
369
|
_id: ((_a = dashboard._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
|
|
653
370
|
name: dashboard.name || "Dashboard",
|
|
654
371
|
description: dashboard.description || "",
|
|
655
372
|
pageTitle: dashboard.pageTitle || "",
|
|
656
373
|
pageDescription: dashboard.pageDescription || "",
|
|
657
|
-
components: DashboardAPI.buildPublicComponentSummaries(
|
|
658
|
-
metricsUsed: Array.from(DashboardAPI.collectDashboardMetricNames(
|
|
659
|
-
dashboardViewConfig:
|
|
660
|
-
? JSONFunctions.serialize(
|
|
374
|
+
components: DashboardAPI.buildPublicComponentSummaries(publicViewConfig),
|
|
375
|
+
metricsUsed: Array.from(DashboardAPI.collectDashboardMetricNames(publicViewConfig)).sort(),
|
|
376
|
+
dashboardViewConfig: publicViewConfig
|
|
377
|
+
? JSONFunctions.serialize(publicViewConfig)
|
|
661
378
|
: null,
|
|
662
379
|
});
|
|
663
380
|
}
|
|
@@ -791,6 +508,7 @@ export default class DashboardAPI extends BaseAPI {
|
|
|
791
508
|
if (!dashboard) {
|
|
792
509
|
throw new NotFoundException("Dashboard not found");
|
|
793
510
|
}
|
|
511
|
+
const publicViewConfig = PublicDashboardViewConfig.sanitize(dashboard.dashboardViewConfig);
|
|
794
512
|
return Response.sendJsonObjectResponse(req, res, {
|
|
795
513
|
_id: ((_a = dashboard._id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
|
|
796
514
|
name: dashboard.name || "Dashboard",
|
|
@@ -798,8 +516,19 @@ export default class DashboardAPI extends BaseAPI {
|
|
|
798
516
|
pageTitle: dashboard.pageTitle || "",
|
|
799
517
|
pageDescription: dashboard.pageDescription || "",
|
|
800
518
|
logoFile: DashboardAPI.getFileAsBase64JSONObject(dashboard.logoFile),
|
|
801
|
-
|
|
802
|
-
|
|
519
|
+
/*
|
|
520
|
+
* External Data Source widgets are stripped: they cannot render
|
|
521
|
+
* for an anonymous viewer, and their config IS the query — raw
|
|
522
|
+
* SQL / PromQL naming internal tables, jobs, and instances.
|
|
523
|
+
*
|
|
524
|
+
* The null stays null. JSONFunctions.serialize(null) returns
|
|
525
|
+
* `{}`, and the public page falls back to a default config only
|
|
526
|
+
* on a FALSY value — an empty object is truthy, so it would sail
|
|
527
|
+
* through and the canvas would read `.components.length` off
|
|
528
|
+
* undefined.
|
|
529
|
+
*/
|
|
530
|
+
dashboardViewConfig: publicViewConfig
|
|
531
|
+
? JSONFunctions.serialize(publicViewConfig)
|
|
803
532
|
: null,
|
|
804
533
|
});
|
|
805
534
|
}
|
|
@@ -1155,8 +884,8 @@ export default class DashboardAPI extends BaseAPI {
|
|
|
1155
884
|
* Public resource lists for non-metric dashboard widgets (incident /
|
|
1156
885
|
* alert / monitor / trace / log / kubernetes / docker / host lists).
|
|
1157
886
|
*
|
|
1158
|
-
* Each widget renders a fixed set of columns; the server
|
|
1159
|
-
* to exactly those columns
|
|
887
|
+
* Each widget renders a fixed set of columns; the server-owned widget
|
|
888
|
+
* policy pins the select to exactly those columns and forces the
|
|
1160
889
|
* project scope to the dashboard's project, so a public viewer can only
|
|
1161
890
|
* read the data the widget was built to show, for this dashboard's
|
|
1162
891
|
* project. Authorization reuses DashboardService.hasReadAccess.
|
|
@@ -1471,84 +1200,75 @@ export default class DashboardAPI extends BaseAPI {
|
|
|
1471
1200
|
return groupByColumns;
|
|
1472
1201
|
}
|
|
1473
1202
|
/*
|
|
1474
|
-
*
|
|
1475
|
-
*
|
|
1476
|
-
*
|
|
1477
|
-
* dashboard was actually built to show — a dashboard with a monitor list
|
|
1478
|
-
* on it must not double as a project-wide log or incident reader.
|
|
1203
|
+
* Read only the real, top-level dashboard components. Recursively scanning
|
|
1204
|
+
* arbitrary widget arguments would let a nested object carrying a
|
|
1205
|
+
* `componentType` masquerade as a widget and become an authorization input.
|
|
1479
1206
|
*/
|
|
1480
|
-
static
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
const componentType = obj["componentType"];
|
|
1494
|
-
if (typeof componentType === "string" && componentType.length > 0) {
|
|
1495
|
-
componentTypes.add(componentType);
|
|
1496
|
-
}
|
|
1497
|
-
for (const key of Object.keys(obj)) {
|
|
1498
|
-
walk(obj[key]);
|
|
1499
|
-
}
|
|
1500
|
-
};
|
|
1501
|
-
walk(dashboardViewConfig);
|
|
1502
|
-
return componentTypes;
|
|
1207
|
+
static collectDashboardWidgets(dashboardViewConfig) {
|
|
1208
|
+
if (!dashboardViewConfig ||
|
|
1209
|
+
typeof dashboardViewConfig !== "object" ||
|
|
1210
|
+
Array.isArray(dashboardViewConfig)) {
|
|
1211
|
+
return [];
|
|
1212
|
+
}
|
|
1213
|
+
const components = dashboardViewConfig["components"];
|
|
1214
|
+
if (!Array.isArray(components)) {
|
|
1215
|
+
return [];
|
|
1216
|
+
}
|
|
1217
|
+
return components.filter((component) => {
|
|
1218
|
+
return Boolean(component && typeof component === "object" && !Array.isArray(component));
|
|
1219
|
+
});
|
|
1503
1220
|
}
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
* column used as a blind oracle — is dropped rather than merged.
|
|
1509
|
-
*/
|
|
1510
|
-
static sanitizePublicResourceQuery(data) {
|
|
1511
|
-
const { query, allowedQueryKeys } = data;
|
|
1512
|
-
const sanitized = {};
|
|
1513
|
-
if (!query || typeof query !== "object" || Array.isArray(query)) {
|
|
1514
|
-
return sanitized;
|
|
1221
|
+
static readDashboardWidgetComponentId(widget) {
|
|
1222
|
+
const componentId = widget["componentId"];
|
|
1223
|
+
if (componentId instanceof ObjectID) {
|
|
1224
|
+
return componentId.toString();
|
|
1515
1225
|
}
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1226
|
+
if (typeof componentId === "string" && componentId.length > 0) {
|
|
1227
|
+
return componentId;
|
|
1228
|
+
}
|
|
1229
|
+
if (componentId &&
|
|
1230
|
+
typeof componentId === "object" &&
|
|
1231
|
+
!Array.isArray(componentId)) {
|
|
1232
|
+
const value = componentId["value"];
|
|
1233
|
+
if (typeof value === "string" && value.length > 0) {
|
|
1234
|
+
return value;
|
|
1521
1235
|
}
|
|
1522
1236
|
}
|
|
1523
|
-
return
|
|
1237
|
+
return null;
|
|
1524
1238
|
}
|
|
1525
1239
|
/*
|
|
1526
|
-
*
|
|
1527
|
-
*
|
|
1528
|
-
*
|
|
1240
|
+
* Select the exact stored widget whose policy will be executed. A legacy
|
|
1241
|
+
* caller may omit componentId only when there is exactly one matching
|
|
1242
|
+
* widget, so two differently-filtered widgets are never conflated.
|
|
1529
1243
|
*/
|
|
1530
|
-
static
|
|
1531
|
-
const
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1244
|
+
static selectPublicResourceWidget(data) {
|
|
1245
|
+
const matchingWidgets = DashboardAPI.collectDashboardWidgets(data.dashboardViewConfig).filter((widget) => {
|
|
1246
|
+
const componentType = widget["componentType"];
|
|
1247
|
+
return (typeof componentType === "string" &&
|
|
1248
|
+
Object.prototype.hasOwnProperty.call(data.config.widgets, componentType));
|
|
1249
|
+
});
|
|
1250
|
+
if (matchingWidgets.length === 0) {
|
|
1251
|
+
throw new BadDataException("This resource is not part of this dashboard.");
|
|
1535
1252
|
}
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
continue;
|
|
1541
|
-
}
|
|
1542
|
-
const order = sortObject[key];
|
|
1543
|
-
if (typeof order === "string" &&
|
|
1544
|
-
order.toUpperCase() === SortOrder.Descending) {
|
|
1545
|
-
sanitized[key] = SortOrder.Descending;
|
|
1546
|
-
}
|
|
1547
|
-
else {
|
|
1548
|
-
sanitized[key] = SortOrder.Ascending;
|
|
1253
|
+
if (data.requestedComponentId === undefined ||
|
|
1254
|
+
data.requestedComponentId === null) {
|
|
1255
|
+
if (matchingWidgets.length === 1) {
|
|
1256
|
+
return matchingWidgets[0];
|
|
1549
1257
|
}
|
|
1258
|
+
throw new BadDataException("A componentId is required to read this resource from this dashboard.");
|
|
1259
|
+
}
|
|
1260
|
+
if (typeof data.requestedComponentId !== "string") {
|
|
1261
|
+
throw new BadDataException("componentId must be a string UUID.");
|
|
1262
|
+
}
|
|
1263
|
+
ObjectID.validateUUID(data.requestedComponentId);
|
|
1264
|
+
const selectedWidget = matchingWidgets.find((widget) => {
|
|
1265
|
+
return (DashboardAPI.readDashboardWidgetComponentId(widget) ===
|
|
1266
|
+
data.requestedComponentId);
|
|
1267
|
+
});
|
|
1268
|
+
if (!selectedWidget) {
|
|
1269
|
+
throw new BadDataException("This resource is not part of this dashboard.");
|
|
1550
1270
|
}
|
|
1551
|
-
return
|
|
1271
|
+
return selectedWidget;
|
|
1552
1272
|
}
|
|
1553
1273
|
/*
|
|
1554
1274
|
* Shared handler for the public resource-list endpoint. Loads the
|
|
@@ -1579,84 +1299,50 @@ export default class DashboardAPI extends BaseAPI {
|
|
|
1579
1299
|
if (!dashboard || !dashboard.projectId) {
|
|
1580
1300
|
throw new NotFoundException("Dashboard not found");
|
|
1581
1301
|
}
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
* dashboard's own widgets are the owner's opt-in, so they are the
|
|
1587
|
-
* allowlist.
|
|
1588
|
-
*/
|
|
1589
|
-
const dashboardComponentTypes = DashboardAPI.collectDashboardComponentTypes(dashboard.dashboardViewConfig);
|
|
1590
|
-
const presentWidgets = Object.keys(config.widgets).filter((componentType) => {
|
|
1591
|
-
return dashboardComponentTypes.has(componentType);
|
|
1302
|
+
const widget = DashboardAPI.selectPublicResourceWidget({
|
|
1303
|
+
dashboardViewConfig: dashboard.dashboardViewConfig,
|
|
1304
|
+
config,
|
|
1305
|
+
requestedComponentId: req.body ? req.body["componentId"] : undefined,
|
|
1592
1306
|
});
|
|
1593
|
-
|
|
1594
|
-
throw new BadDataException("This resource is not part of this dashboard.");
|
|
1595
|
-
}
|
|
1596
|
-
const clientQuery = req.body && req.body["query"]
|
|
1307
|
+
const requestedQuery = req.body && req.body["query"]
|
|
1597
1308
|
? JSONFunctions.deserialize(req.body["query"])
|
|
1598
1309
|
: {};
|
|
1599
|
-
const
|
|
1600
|
-
|
|
1601
|
-
|
|
1310
|
+
const policy = PublicDashboardResourceListPolicy.build({
|
|
1311
|
+
widget,
|
|
1312
|
+
dashboardViewConfig: dashboard.dashboardViewConfig,
|
|
1313
|
+
requestedVariables: req.body ? req.body["variables"] : undefined,
|
|
1314
|
+
requestedQuery,
|
|
1602
1315
|
});
|
|
1316
|
+
const requestedResourceType = req.params["resourceType"];
|
|
1317
|
+
if (policy.resourceType !== requestedResourceType) {
|
|
1318
|
+
throw new BadDataException("This resource is not part of this dashboard.");
|
|
1319
|
+
}
|
|
1320
|
+
let query = Object.assign({}, policy.query);
|
|
1603
1321
|
/*
|
|
1604
|
-
*
|
|
1605
|
-
*
|
|
1322
|
+
* IncidentService and AlertService normally apply privacy in their
|
|
1323
|
+
* onBeforeFind hooks. The root read below intentionally bypasses those
|
|
1324
|
+
* hooks' user context, so apply the anonymous form explicitly first:
|
|
1325
|
+
* public dashboards may show public rows, never private tenant rows.
|
|
1606
1326
|
*/
|
|
1607
|
-
|
|
1327
|
+
if (requestedResourceType === "incident") {
|
|
1328
|
+
query = applyIncidentSelfPrivacyFilter(query, {});
|
|
1329
|
+
}
|
|
1330
|
+
else if (requestedResourceType === "alert") {
|
|
1331
|
+
query = applyAlertSelfPrivacyFilter(query, {});
|
|
1332
|
+
}
|
|
1608
1333
|
/*
|
|
1609
|
-
*
|
|
1610
|
-
*
|
|
1611
|
-
*
|
|
1612
|
-
*
|
|
1613
|
-
* rejected, and a request that names no kind gets all of them.
|
|
1334
|
+
* Project scope is the final query invariant. Neither the request nor a
|
|
1335
|
+
* future policy builder may redirect this root read to another project.
|
|
1336
|
+
* Resource kind, where applicable, comes solely from the selected
|
|
1337
|
+
* widget's policy query.
|
|
1614
1338
|
*/
|
|
1615
|
-
|
|
1616
|
-
.map((componentType) => {
|
|
1617
|
-
return config.widgets[componentType];
|
|
1618
|
-
})
|
|
1619
|
-
.filter((kind) => {
|
|
1620
|
-
return Boolean(kind);
|
|
1621
|
-
});
|
|
1622
|
-
if (allowedKinds.length > 0) {
|
|
1623
|
-
const requestedKind = clientQuery["kind"];
|
|
1624
|
-
if (requestedKind !== undefined && requestedKind !== null) {
|
|
1625
|
-
if (typeof requestedKind !== "string" ||
|
|
1626
|
-
!allowedKinds.includes(requestedKind)) {
|
|
1627
|
-
throw new BadDataException("This resource is not part of this dashboard.");
|
|
1628
|
-
}
|
|
1629
|
-
query["kind"] = requestedKind;
|
|
1630
|
-
}
|
|
1631
|
-
else if (allowedKinds.length === 1) {
|
|
1632
|
-
query["kind"] = allowedKinds[0];
|
|
1633
|
-
}
|
|
1634
|
-
else {
|
|
1635
|
-
query["kind"] = new Includes(allowedKinds);
|
|
1636
|
-
}
|
|
1637
|
-
}
|
|
1638
|
-
const sort = DashboardAPI.sanitizePublicResourceSort({
|
|
1639
|
-
sort: req.body && req.body["sort"]
|
|
1640
|
-
? JSONFunctions.deserialize(req.body["sort"])
|
|
1641
|
-
: {},
|
|
1642
|
-
select: config.select,
|
|
1643
|
-
});
|
|
1644
|
-
const requestedLimit = req.query["limit"]
|
|
1645
|
-
? parseInt(req.query["limit"], 10)
|
|
1646
|
-
: DEFAULT_DASHBOARD_RESOURCE_LIMIT;
|
|
1647
|
-
const limit = Math.min(Number.isFinite(requestedLimit) && requestedLimit > 0
|
|
1648
|
-
? requestedLimit
|
|
1649
|
-
: DEFAULT_DASHBOARD_RESOURCE_LIMIT, LIMIT_PER_PROJECT);
|
|
1650
|
-
const requestedSkip = req.query["skip"]
|
|
1651
|
-
? parseInt(req.query["skip"], 10)
|
|
1652
|
-
: 0;
|
|
1653
|
-
const skip = Number.isFinite(requestedSkip) && requestedSkip > 0 ? requestedSkip : 0;
|
|
1339
|
+
query["projectId"] = dashboard.projectId;
|
|
1654
1340
|
const list = await config.service.findBy({
|
|
1655
1341
|
query: query,
|
|
1656
|
-
select:
|
|
1657
|
-
sort: sort,
|
|
1658
|
-
limit: limit,
|
|
1659
|
-
skip:
|
|
1342
|
+
select: policy.select,
|
|
1343
|
+
sort: policy.sort,
|
|
1344
|
+
limit: policy.limit,
|
|
1345
|
+
skip: 0,
|
|
1660
1346
|
props: {
|
|
1661
1347
|
isRoot: true,
|
|
1662
1348
|
},
|