@oneuptime/common 12.0.4 → 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 +71 -1
- package/Models/DatabaseModels/AlertFeed.ts +30 -0
- package/Models/DatabaseModels/Dashboard.ts +28 -0
- package/Models/DatabaseModels/DataSource.ts +744 -0
- package/Models/DatabaseModels/Incident.ts +2 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentFeed.ts +30 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/LogSavedView.ts +33 -0
- package/Models/DatabaseModels/Project.ts +231 -9
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
- package/Models/DatabaseModels/StatusPage.ts +28 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
- 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/AIAgentDataAPI.ts +44 -55
- package/Server/API/AIInsightAPI.ts +47 -4
- package/Server/API/AIInvestigationAPI.ts +200 -17
- package/Server/API/DashboardAPI.ts +186 -502
- package/Server/API/DataSourceAPI.ts +268 -0
- package/Server/API/StatusPageAPI.ts +49 -20
- package/Server/API/UserAPI.ts +119 -0
- package/Server/EnvironmentConfig.ts +16 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +74 -1
- package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -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 +16 -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 +112 -10
- package/Server/Services/AIService.ts +109 -22
- package/Server/Services/AlertFeedService.ts +5 -0
- package/Server/Services/AlertService.ts +38 -32
- package/Server/Services/AnalyticsDatabaseService.ts +37 -4
- package/Server/Services/DataSourceService.ts +200 -0
- package/Server/Services/DatabaseService.ts +43 -2
- package/Server/Services/HostService.ts +92 -0
- package/Server/Services/IncidentFeedService.ts +5 -0
- package/Server/Services/IncidentService.ts +45 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/LlmLogService.ts +46 -2
- 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/Chat/ObservabilityAssistant.ts +6 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +311 -31
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +26 -24
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +26 -24
- 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/InstrumentationTaskTrigger.ts +47 -13
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
- package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
- package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
- package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
- package/Server/Utils/AI/SRE/README.md +1 -1
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
- package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -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/Criteria/APIRequestCriteria.ts +29 -0
- package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +104 -0
- package/Server/Utils/Monitor/MonitorResource.ts +14 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/PasswordHash.ts +28 -4
- 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/AIInvestigationHeaderStatus.test.tsx +251 -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/EventStatusPanel.test.tsx +747 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1695 -0
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
- package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
- 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/PublicStatusPageAPIErrorHandling.test.ts +117 -0
- package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
- package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
- package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
- package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +781 -0
- package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
- package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
- 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/StatusPageMasterPasswordAPI.test.ts +335 -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/AIRunCodeFixClaim.test.ts +59 -5
- package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +400 -20
- package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
- package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +25 -1
- package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
- package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +45 -35
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
- package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
- package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
- 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/InstrumentationTaskTrigger.test.ts +173 -14
- package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -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/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -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/AIAlertGating.test.ts +37 -4
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
- package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
- package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
- 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/InvestigationQueueInsightSubject.test.ts +2 -0
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
- package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +605 -20
- package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
- package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
- package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
- package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -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/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
- package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
- package/Tests/Server/Utils/PasswordHash.test.ts +30 -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/DashboardTemplates.test.ts +111 -0
- package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
- package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
- package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
- package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
- package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
- package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
- package/Tests/Types/Password.test.ts +363 -0
- package/Tests/Types/Permission.test.ts +137 -0
- package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
- package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +211 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
- package/Tests/UI/Components/Modal.test.tsx +281 -1
- package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
- package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
- package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
- package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
- package/Tests/UI/Utils/Project.test.ts +31 -0
- package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
- package/Tests/Utils/Analytics.test.ts +23 -0
- package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
- package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
- package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -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/Monitor/MonitorMetricType.test.ts +117 -0
- package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
- package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
- package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -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/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
- package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
- package/Types/AI/AIInsightEvidence.ts +6 -0
- package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
- package/Types/AI/CodeFixTaskContext.ts +63 -3
- package/Types/AI/CodeFixTaskType.ts +3 -3
- 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/HashedString.ts +4 -3
- package/Types/Monitor/CriteriaFilter.ts +4 -0
- package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
- package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
- package/Types/Monitor/MonitorMetricType.ts +8 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
- package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
- package/Types/Password.ts +64 -0
- package/Types/Permission.ts +69 -175
- package/Types/Probe/ProbeMonitorResponse.ts +6 -0
- package/Types/UserAuthenticationStatus.ts +34 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
- package/UI/Components/Button/Button.tsx +1 -1
- package/UI/Components/ErrorBoundary.tsx +549 -71
- package/UI/Components/Feed/FeedItem.tsx +9 -2
- 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/ModelDetail/CardModelDetail.tsx +0 -12
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +301 -98
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +13 -5
- 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/DownloadFile.ts +16 -8
- package/UI/Utils/ErrorSupportBundle.ts +805 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -8
- package/UI/Utils/Project.ts +4 -0
- package/UI/Utils/StatusPage.ts +8 -2
- package/UI/Utils/TestDataSource.ts +61 -0
- package/UI/Utils/UseDashboardGridDnd.ts +917 -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/Dashboard/DashboardViewConfig.ts +80 -36
- package/Utils/Dashboard/GridLayout.ts +523 -0
- package/Utils/DataSource/DataSourceQueryText.ts +94 -0
- package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
- package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
- package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
- package/Utils/Monitor/MonitorMetricType.ts +44 -2
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
- package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
- package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
- package/Utils/StatusPage/GroupTree.ts +157 -66
- package/Utils/StatusPage/ResourceExplorer.ts +853 -0
- package/Utils/StatusPage/ResourceUptime.ts +37 -2
- package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
- package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +73 -1
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
- package/build/dist/Models/DatabaseModels/Dashboard.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/Incident.js +2 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +241 -11
- package/build/dist/Models/DatabaseModels/Project.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/ScheduledMaintenance.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.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/AIAgentDataAPI.js +28 -46
- package/build/dist/Server/API/AIAgentDataAPI.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 +134 -11
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +127 -438
- 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 +40 -12
- 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/EnvironmentConfig.js +14 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +61 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
- 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/1786400000000-AddMasterPasswordSalt.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.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 +16 -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 +92 -12
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +88 -21
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertFeedService.js +3 -0
- package/build/dist/Server/Services/AlertFeedService.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 +37 -5
- 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/DatabaseService.js +21 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +74 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFeedService.js +3 -0
- package/build/dist/Server/Services/IncidentFeedService.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/LlmLogService.js +22 -1
- package/build/dist/Server/Services/LlmLogService.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/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +222 -34
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +22 -19
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +22 -19
- 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/InstrumentationTaskTrigger.js +33 -9
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
- 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/AI/SRE/PostedRootCause.js +61 -14
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
- 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/Criteria/APIRequestCriteria.js +20 -3
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +67 -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/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/PasswordHash.js +25 -4
- package/build/dist/Server/Utils/PasswordHash.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/AI/AIRunCodeFixRecommendation.js +18 -0
- package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
- 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/HashedString.js +4 -3
- package/build/dist/Types/HashedString.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
- package/build/dist/Types/Password.js +56 -0
- package/build/dist/Types/Password.js.map +1 -0
- package/build/dist/Types/Permission.js +65 -155
- 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/BulkUpdate/BulkUpdateForm.js +2 -5
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +427 -52
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
- package/build/dist/UI/Components/Feed/FeedItem.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/ModelDetail/CardModelDetail.js +0 -12
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +197 -66
- 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/DownloadFile.js +15 -8
- package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
- package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
- package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +20 -15
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Project.js +3 -0
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/UI/Utils/StatusPage.js +4 -4
- package/build/dist/UI/Utils/StatusPage.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/UI/Utils/UseDashboardGridDnd.js +551 -0
- package/build/dist/UI/Utils/UseDashboardGridDnd.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/Dashboard/DashboardViewConfig.js +42 -26
- package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
- package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
- package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
- 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/Metrics/RecordingRuleExpression.js +19 -17
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- 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/GroupNestingLayout.js +46 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +5 -1
- package/tsconfig.json +12 -10
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import UserMiddleware from "../Middleware/UserAuthorization";
|
|
2
|
+
import CommonAPI from "./CommonAPI";
|
|
3
|
+
import DataSourceService, {
|
|
4
|
+
Service as DataSourceServiceType,
|
|
5
|
+
} from "../Services/DataSourceService";
|
|
6
|
+
import {
|
|
7
|
+
ExpressRequest,
|
|
8
|
+
ExpressResponse,
|
|
9
|
+
NextFunction,
|
|
10
|
+
} from "../Utils/Express";
|
|
11
|
+
import Response from "../Utils/Response";
|
|
12
|
+
import BaseAPI from "./BaseAPI";
|
|
13
|
+
import DataSource from "../../Models/DatabaseModels/DataSource";
|
|
14
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
15
|
+
import Exception from "../../Types/Exception/Exception";
|
|
16
|
+
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
17
|
+
import { JSONObject } from "../../Types/JSON";
|
|
18
|
+
import ObjectID from "../../Types/ObjectID";
|
|
19
|
+
import AggregatedResult from "../../Types/BaseDatabase/AggregatedResult";
|
|
20
|
+
import DataSourceTableResult from "../../Types/DataSource/DataSourceTableResult";
|
|
21
|
+
import { DataSourceResultKind } from "../../Types/DataSource/DataSourceQueryConfig";
|
|
22
|
+
import {
|
|
23
|
+
DataSourceConnectionSettings,
|
|
24
|
+
DataSourceConnector,
|
|
25
|
+
} from "../Utils/DataSource/Types";
|
|
26
|
+
import ConnectorRegistry from "../Utils/DataSource/ConnectorRegistry";
|
|
27
|
+
import logger from "../Utils/Logger";
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Upper bound on stored/ad-hoc query text. Real PromQL/SQL/DSL queries are
|
|
31
|
+
* a few KB; anything beyond this is abuse or a mistake.
|
|
32
|
+
*/
|
|
33
|
+
const MAX_QUERY_LENGTH: number = 100_000;
|
|
34
|
+
|
|
35
|
+
export default class DataSourceAPI extends BaseAPI<
|
|
36
|
+
DataSource,
|
|
37
|
+
DataSourceServiceType
|
|
38
|
+
> {
|
|
39
|
+
public constructor() {
|
|
40
|
+
super(DataSource, DataSourceService);
|
|
41
|
+
|
|
42
|
+
/*
|
|
43
|
+
* Test a data source's connectivity + credentials. Authenticated
|
|
44
|
+
* users only; access is checked by reading the record with the
|
|
45
|
+
* caller's own permissions before any root read of credentials.
|
|
46
|
+
*/
|
|
47
|
+
this.router.post(
|
|
48
|
+
`${new this.entityType().getCrudApiPath()?.toString()}/test`,
|
|
49
|
+
UserMiddleware.getUserMiddleware,
|
|
50
|
+
UserMiddleware.requireUserAuthentication,
|
|
51
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
52
|
+
try {
|
|
53
|
+
const body: JSONObject = req.body;
|
|
54
|
+
|
|
55
|
+
const dataSource: DataSource = await this.getAccessibleDataSource({
|
|
56
|
+
req,
|
|
57
|
+
dataSourceId: body["dataSourceId"] as string,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const settings: DataSourceConnectionSettings =
|
|
61
|
+
await this.getConnectionSettings(dataSource);
|
|
62
|
+
|
|
63
|
+
const connector: DataSourceConnector = ConnectorRegistry.getConnector(
|
|
64
|
+
settings.dataSourceType,
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
await connector.testConnection(settings);
|
|
69
|
+
} catch (err) {
|
|
70
|
+
logger.error(err);
|
|
71
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
72
|
+
ok: false,
|
|
73
|
+
message: this.toFriendlyErrorMessage(err),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
78
|
+
ok: true,
|
|
79
|
+
message: "Connection successful.",
|
|
80
|
+
});
|
|
81
|
+
} catch (err) {
|
|
82
|
+
next(err);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
/*
|
|
88
|
+
* Execute a query against a data source and return normalized time
|
|
89
|
+
* series (for chart/value/gauge widgets) or rows (for the table
|
|
90
|
+
* widget).
|
|
91
|
+
*
|
|
92
|
+
* SECURITY: authenticated project users only — this route must NEVER
|
|
93
|
+
* be reachable from the anonymous public-dashboard surface, because
|
|
94
|
+
* it executes caller-supplied query text. Public dashboards render a
|
|
95
|
+
* placeholder for data-source widgets instead.
|
|
96
|
+
*/
|
|
97
|
+
this.router.post(
|
|
98
|
+
`${new this.entityType().getCrudApiPath()?.toString()}/query`,
|
|
99
|
+
UserMiddleware.getUserMiddleware,
|
|
100
|
+
UserMiddleware.requireUserAuthentication,
|
|
101
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
102
|
+
try {
|
|
103
|
+
const body: JSONObject = req.body;
|
|
104
|
+
|
|
105
|
+
const query: string = (body["query"] as string) || "";
|
|
106
|
+
if (!query || query.trim().length === 0) {
|
|
107
|
+
return Response.sendErrorResponse(
|
|
108
|
+
req,
|
|
109
|
+
res,
|
|
110
|
+
new BadDataException("query is required"),
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
if (query.length > MAX_QUERY_LENGTH) {
|
|
114
|
+
return Response.sendErrorResponse(
|
|
115
|
+
req,
|
|
116
|
+
res,
|
|
117
|
+
new BadDataException("query is too long"),
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const resultKind: DataSourceResultKind =
|
|
122
|
+
body["resultKind"] === DataSourceResultKind.Table
|
|
123
|
+
? DataSourceResultKind.Table
|
|
124
|
+
: DataSourceResultKind.TimeSeries;
|
|
125
|
+
|
|
126
|
+
const startDate: Date = new Date(body["startDate"] as string);
|
|
127
|
+
const endDate: Date = new Date(body["endDate"] as string);
|
|
128
|
+
if (
|
|
129
|
+
isNaN(startDate.getTime()) ||
|
|
130
|
+
isNaN(endDate.getTime()) ||
|
|
131
|
+
startDate.getTime() >= endDate.getTime()
|
|
132
|
+
) {
|
|
133
|
+
return Response.sendErrorResponse(
|
|
134
|
+
req,
|
|
135
|
+
res,
|
|
136
|
+
new BadDataException(
|
|
137
|
+
"A valid startDate and endDate are required (startDate must be before endDate).",
|
|
138
|
+
),
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let stepInSeconds: number | undefined = undefined;
|
|
143
|
+
if (body["stepInSeconds"] !== undefined) {
|
|
144
|
+
const parsedStep: number = Number(body["stepInSeconds"]);
|
|
145
|
+
if (Number.isFinite(parsedStep) && parsedStep > 0) {
|
|
146
|
+
// Floor, but never to 0 — Loki/Prometheus reject step=0.
|
|
147
|
+
stepInSeconds = Math.max(1, Math.floor(parsedStep));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const dataSource: DataSource = await this.getAccessibleDataSource({
|
|
152
|
+
req,
|
|
153
|
+
dataSourceId: body["dataSourceId"] as string,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const settings: DataSourceConnectionSettings =
|
|
157
|
+
await this.getConnectionSettings(dataSource);
|
|
158
|
+
|
|
159
|
+
const connector: DataSourceConnector = ConnectorRegistry.getConnector(
|
|
160
|
+
settings.dataSourceType,
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
if (resultKind === DataSourceResultKind.Table) {
|
|
165
|
+
const tableResult: DataSourceTableResult =
|
|
166
|
+
await connector.queryTable(settings, query, {
|
|
167
|
+
startDate,
|
|
168
|
+
endDate,
|
|
169
|
+
stepInSeconds,
|
|
170
|
+
});
|
|
171
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
172
|
+
resultKind: DataSourceResultKind.Table,
|
|
173
|
+
result: tableResult as unknown as JSONObject,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const timeSeriesResult: AggregatedResult =
|
|
178
|
+
await connector.queryTimeSeries(settings, query, {
|
|
179
|
+
startDate,
|
|
180
|
+
endDate,
|
|
181
|
+
stepInSeconds,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
185
|
+
resultKind: DataSourceResultKind.TimeSeries,
|
|
186
|
+
result: timeSeriesResult as unknown as JSONObject,
|
|
187
|
+
});
|
|
188
|
+
} catch (err) {
|
|
189
|
+
logger.error(err);
|
|
190
|
+
return Response.sendErrorResponse(
|
|
191
|
+
req,
|
|
192
|
+
res,
|
|
193
|
+
new BadDataException(
|
|
194
|
+
`Data source query failed: ${this.toFriendlyErrorMessage(err)}`,
|
|
195
|
+
),
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
} catch (err) {
|
|
199
|
+
next(err);
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/*
|
|
206
|
+
* Two-phase access pattern (same as LlmProviderAPI /test): first read
|
|
207
|
+
* the record with the CALLER'S permissions — wrong project or missing
|
|
208
|
+
* ReadDataSource yields null — and only then may callers proceed to a
|
|
209
|
+
* root read of credentials.
|
|
210
|
+
*/
|
|
211
|
+
private async getAccessibleDataSource(data: {
|
|
212
|
+
req: ExpressRequest;
|
|
213
|
+
dataSourceId: string;
|
|
214
|
+
}): Promise<DataSource> {
|
|
215
|
+
if (!data.dataSourceId) {
|
|
216
|
+
throw new BadDataException("dataSourceId is required");
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (!ObjectID.isValidUUID(data.dataSourceId)) {
|
|
220
|
+
throw new BadDataException(
|
|
221
|
+
"Data source not found, or you do not have access to it.",
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const props: DatabaseCommonInteractionProps =
|
|
226
|
+
await CommonAPI.getDatabaseCommonInteractionProps(data.req);
|
|
227
|
+
|
|
228
|
+
const accessibleDataSource: DataSource | null =
|
|
229
|
+
await DataSourceService.findOneById({
|
|
230
|
+
id: new ObjectID(data.dataSourceId),
|
|
231
|
+
select: {
|
|
232
|
+
_id: true,
|
|
233
|
+
projectId: true,
|
|
234
|
+
dataSourceType: true,
|
|
235
|
+
},
|
|
236
|
+
props: props,
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
if (!accessibleDataSource) {
|
|
240
|
+
throw new BadDataException(
|
|
241
|
+
"Data source not found, or you do not have access to it.",
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return accessibleDataSource;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private async getConnectionSettings(
|
|
249
|
+
dataSource: DataSource,
|
|
250
|
+
): Promise<DataSourceConnectionSettings> {
|
|
251
|
+
const settings: DataSourceConnectionSettings | null =
|
|
252
|
+
await DataSourceService.getConnectionSettingsById(dataSource.id!);
|
|
253
|
+
|
|
254
|
+
if (!settings) {
|
|
255
|
+
throw new BadDataException("Data source configuration is incomplete.");
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return settings;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private toFriendlyErrorMessage(err: unknown): string {
|
|
262
|
+
const message: string =
|
|
263
|
+
err instanceof Exception
|
|
264
|
+
? err.message
|
|
265
|
+
: "Could not reach the data source. Please verify the connection details.";
|
|
266
|
+
return message.substring(0, 1000);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
@@ -53,7 +53,6 @@ import JSONFunctions from "../../Types/JSONFunctions";
|
|
|
53
53
|
import ObjectID from "../../Types/ObjectID";
|
|
54
54
|
import Phone from "../../Types/Phone";
|
|
55
55
|
import PositiveNumber from "../../Types/PositiveNumber";
|
|
56
|
-
import HashedString from "../../Types/HashedString";
|
|
57
56
|
import AcmeChallenge from "../../Models/DatabaseModels/AcmeChallenge";
|
|
58
57
|
import Incident from "../../Models/DatabaseModels/Incident";
|
|
59
58
|
import IncidentEpisode from "../../Models/DatabaseModels/IncidentEpisode";
|
|
@@ -85,7 +84,9 @@ import StatusPageOIDC from "../../Models/DatabaseModels/StatusPageOidc";
|
|
|
85
84
|
import StatusPageSubscriber from "../../Models/DatabaseModels/StatusPageSubscriber";
|
|
86
85
|
import StatusPageEventType from "../../Types/StatusPage/StatusPageEventType";
|
|
87
86
|
import StatusPageResourceUptimeUtil from "../../Utils/StatusPage/ResourceUptime";
|
|
88
|
-
import StatusPageGroupTreeUtil
|
|
87
|
+
import StatusPageGroupTreeUtil, {
|
|
88
|
+
StatusPageGroupTreeIndex,
|
|
89
|
+
} from "../../Utils/StatusPage/GroupTree";
|
|
89
90
|
import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
|
|
90
91
|
import { Green } from "../../Types/BrandColors";
|
|
91
92
|
import UptimeUtil, { UptimeWindow } from "../../Utils/Uptime/UptimeUtil";
|
|
@@ -100,7 +101,6 @@ import Hostname from "../../Types/API/Hostname";
|
|
|
100
101
|
import Protocol from "../../Types/API/Protocol";
|
|
101
102
|
import DatabaseConfig from "../DatabaseConfig";
|
|
102
103
|
import CookieUtil from "../Utils/Cookie";
|
|
103
|
-
import { EncryptionSecret } from "../EnvironmentConfig";
|
|
104
104
|
import { StatusPageApiRoute } from "../../ServiceRoute";
|
|
105
105
|
import ProjectSmtpConfigService from "../Services/ProjectSmtpConfigService";
|
|
106
106
|
import ForbiddenException from "../../Types/Exception/ForbiddenException";
|
|
@@ -941,10 +941,9 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
941
941
|
req.params["statusPageId"] as string,
|
|
942
942
|
);
|
|
943
943
|
|
|
944
|
-
const password:
|
|
945
|
-
req.body && (req.body["password"] as string);
|
|
944
|
+
const password: unknown = req.body && req.body["password"];
|
|
946
945
|
|
|
947
|
-
if (!password) {
|
|
946
|
+
if (typeof password !== "string" || !password) {
|
|
948
947
|
throw new BadDataException("Master password is required.");
|
|
949
948
|
}
|
|
950
949
|
|
|
@@ -956,6 +955,7 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
956
955
|
projectId: true,
|
|
957
956
|
enableMasterPassword: true,
|
|
958
957
|
masterPassword: true,
|
|
958
|
+
masterPasswordSalt: true,
|
|
959
959
|
isPublicStatusPage: true,
|
|
960
960
|
},
|
|
961
961
|
props: {
|
|
@@ -979,12 +979,14 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
979
979
|
);
|
|
980
980
|
}
|
|
981
981
|
|
|
982
|
-
const
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
982
|
+
const isMasterPasswordValid: boolean =
|
|
983
|
+
await StatusPageService.verifyHashedColumnValue({
|
|
984
|
+
item: statusPage,
|
|
985
|
+
columnName: "masterPassword",
|
|
986
|
+
plainValue: password,
|
|
987
|
+
});
|
|
986
988
|
|
|
987
|
-
if (
|
|
989
|
+
if (!isMasterPasswordValid) {
|
|
988
990
|
throw new BadDataException(MASTER_PASSWORD_INVALID_MESSAGE);
|
|
989
991
|
}
|
|
990
992
|
|
|
@@ -1407,19 +1409,35 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
1407
1409
|
const resourceUptimesByGroupId: Dictionary<Array<ResourceUptime>> =
|
|
1408
1410
|
{};
|
|
1409
1411
|
|
|
1412
|
+
/*
|
|
1413
|
+
* Keyed the same way, so the loop below can look a group's uptime up
|
|
1414
|
+
* instead of scanning the whole list for it. A status page can carry
|
|
1415
|
+
* well over a thousand groups, and a scan per group is a scan of the
|
|
1416
|
+
* whole list per group.
|
|
1417
|
+
*/
|
|
1418
|
+
const groupUptimeByGroupId: Dictionary<StatusPageGroupUptime> = {};
|
|
1419
|
+
|
|
1410
1420
|
for (const groupUptime of groupUptimes) {
|
|
1411
|
-
|
|
1412
|
-
groupUptime.statusPageGroupId?.toString() || ""
|
|
1413
|
-
|
|
1421
|
+
const groupId: string =
|
|
1422
|
+
groupUptime.statusPageGroupId?.toString() || "";
|
|
1423
|
+
|
|
1424
|
+
resourceUptimesByGroupId[groupId] =
|
|
1425
|
+
groupUptime.statusPageResourceUptimes;
|
|
1426
|
+
groupUptimeByGroupId[groupId] = groupUptime;
|
|
1414
1427
|
}
|
|
1415
1428
|
|
|
1429
|
+
/*
|
|
1430
|
+
* One index for every subtree walk below, rather than one
|
|
1431
|
+
* re-bucketing of the group list per group.
|
|
1432
|
+
*/
|
|
1433
|
+
const statusPageGroupTreeIndex: StatusPageGroupTreeIndex =
|
|
1434
|
+
StatusPageGroupTreeUtil.buildIndex({
|
|
1435
|
+
statusPageGroups: statusPageGroups,
|
|
1436
|
+
});
|
|
1437
|
+
|
|
1416
1438
|
for (const group of statusPageGroups) {
|
|
1417
1439
|
const groupUptime: StatusPageGroupUptime | undefined =
|
|
1418
|
-
|
|
1419
|
-
return (
|
|
1420
|
-
item.statusPageGroupId?.toString() === group.id?.toString()
|
|
1421
|
-
);
|
|
1422
|
-
});
|
|
1440
|
+
groupUptimeByGroupId[group.id?.toString() || ""];
|
|
1423
1441
|
|
|
1424
1442
|
if (!groupUptime) {
|
|
1425
1443
|
continue;
|
|
@@ -1429,6 +1447,7 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
1429
1447
|
StatusPageGroupTreeUtil.getGroupAndDescendants({
|
|
1430
1448
|
statusPageGroup: group,
|
|
1431
1449
|
statusPageGroups: statusPageGroups,
|
|
1450
|
+
index: statusPageGroupTreeIndex,
|
|
1432
1451
|
}).flatMap((groupInSubtree: StatusPageGroup) => {
|
|
1433
1452
|
return (
|
|
1434
1453
|
resourceUptimesByGroupId[
|
|
@@ -3834,9 +3853,19 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
3834
3853
|
`Updating existing subscriber with ID: ${subscriberId} for status page with ID: ${objectId}`,
|
|
3835
3854
|
getLogAttributesFromRequest(req as any),
|
|
3836
3855
|
);
|
|
3856
|
+
/*
|
|
3857
|
+
* Scope the lookup to the status page in the route. This endpoint only
|
|
3858
|
+
* checks read access on that status page, so without the statusPageId
|
|
3859
|
+
* clause anyone holding a subscriber UUID could pass any status page they
|
|
3860
|
+
* can read and edit a subscriber belonging to a different — possibly
|
|
3861
|
+
* private — status page. A subscriber on another page must be
|
|
3862
|
+
* indistinguishable from one that does not exist, so that the shared
|
|
3863
|
+
* "Subscriber not found" below cannot be used to probe for valid UUIDs.
|
|
3864
|
+
*/
|
|
3837
3865
|
statusPageSubscriber = await StatusPageSubscriberService.findOneBy({
|
|
3838
3866
|
query: {
|
|
3839
3867
|
_id: subscriberId.toString(),
|
|
3868
|
+
statusPageId: objectId,
|
|
3840
3869
|
},
|
|
3841
3870
|
props: {
|
|
3842
3871
|
isRoot: true,
|
|
@@ -3845,7 +3874,7 @@ export default class StatusPageAPI extends BaseAPI<
|
|
|
3845
3874
|
|
|
3846
3875
|
if (!statusPageSubscriber) {
|
|
3847
3876
|
logger.debug(
|
|
3848
|
-
`Subscriber not found with ID: ${subscriberId}`,
|
|
3877
|
+
`Subscriber not found with ID: ${subscriberId} on status page with ID: ${objectId}`,
|
|
3849
3878
|
getLogAttributesFromRequest(req as any),
|
|
3850
3879
|
);
|
|
3851
3880
|
throw new BadDataException("Subscriber not found");
|
package/Server/API/UserAPI.ts
CHANGED
|
@@ -12,8 +12,10 @@ import PositiveNumber from "../../Types/PositiveNumber";
|
|
|
12
12
|
import TeamMembersByProject, {
|
|
13
13
|
UserProjectMembership,
|
|
14
14
|
} from "../../Utils/TeamMembersByProject";
|
|
15
|
+
import Email from "../../Types/Email";
|
|
15
16
|
import MasterAdminAuthorization from "../Middleware/MasterAdminAuthorization";
|
|
16
17
|
import TeamMemberService from "../Services/TeamMemberService";
|
|
18
|
+
import UserAuthenticationStatus from "../../Types/UserAuthenticationStatus";
|
|
17
19
|
import UserService, {
|
|
18
20
|
Service as UserServiceType,
|
|
19
21
|
} from "../Services/UserService";
|
|
@@ -191,6 +193,123 @@ export default class UserAPI extends BaseAPI<User, UserServiceType> {
|
|
|
191
193
|
},
|
|
192
194
|
);
|
|
193
195
|
|
|
196
|
+
/*
|
|
197
|
+
* How one user can sign in, for Admin Dashboard > User > Authentication.
|
|
198
|
+
*
|
|
199
|
+
* A dedicated endpoint rather than extra columns on the CRUD read, because
|
|
200
|
+
* the interesting fact -- "does this account have a password at all?" --
|
|
201
|
+
* cannot be answered from the CRUD API without shipping the password
|
|
202
|
+
* column itself. A master admin bypasses column read permissions, so
|
|
203
|
+
* selecting `password` in the browser would put every user's scrypt digest
|
|
204
|
+
* in a page's network tab. The booleans below are derived server-side and
|
|
205
|
+
* nothing secret crosses the wire.
|
|
206
|
+
*/
|
|
207
|
+
this.router.get(
|
|
208
|
+
`${new this.entityType().getCrudApiPath()?.toString()}/:userId/authentication-status`,
|
|
209
|
+
MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware,
|
|
210
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
211
|
+
try {
|
|
212
|
+
const userId: ObjectID = UserAPI.getUserIdFromParams(req);
|
|
213
|
+
|
|
214
|
+
const status: UserAuthenticationStatus =
|
|
215
|
+
await UserService.getAuthenticationStatus(userId);
|
|
216
|
+
|
|
217
|
+
/*
|
|
218
|
+
* Whether an account has a password is exactly the sort of answer a
|
|
219
|
+
* shared cache must not keep -- and it changes the moment either
|
|
220
|
+
* action below is used.
|
|
221
|
+
*/
|
|
222
|
+
Response.setNoCacheHeaders(res);
|
|
223
|
+
|
|
224
|
+
return Response.sendJsonObjectResponse(
|
|
225
|
+
req,
|
|
226
|
+
res,
|
|
227
|
+
status as unknown as JSONObject,
|
|
228
|
+
);
|
|
229
|
+
} catch (err) {
|
|
230
|
+
return next(err);
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
/*
|
|
236
|
+
* Set a user's password on their behalf.
|
|
237
|
+
*
|
|
238
|
+
* Master-admin only, and deliberately its own route rather than a PUT to
|
|
239
|
+
* /user/:id with a password in it. That generic write would work -- a
|
|
240
|
+
* master admin bypasses the password column's `update: [CurrentUser]` ACL
|
|
241
|
+
* -- but nothing about the URL would say so, the password policy could not
|
|
242
|
+
* be enforced, and the payload would have to be a hand-serialized
|
|
243
|
+
* HashedString. Here the gate is a middleware anyone can grep for, and the
|
|
244
|
+
* body is a plain string.
|
|
245
|
+
*
|
|
246
|
+
* Session revocation and the "Password Changed." email happen in
|
|
247
|
+
* UserService's update hook, not here, so they cannot be forgotten by a
|
|
248
|
+
* caller and cannot fire twice.
|
|
249
|
+
*/
|
|
250
|
+
this.router.post(
|
|
251
|
+
`${new this.entityType().getCrudApiPath()?.toString()}/:userId/set-password`,
|
|
252
|
+
MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware,
|
|
253
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
254
|
+
try {
|
|
255
|
+
const userId: ObjectID = UserAPI.getUserIdFromParams(req);
|
|
256
|
+
|
|
257
|
+
const password: unknown = req.body?.["password"];
|
|
258
|
+
|
|
259
|
+
/*
|
|
260
|
+
* Type-checked rather than cast. `as string` on a JSON body is a
|
|
261
|
+
* lie the moment somebody posts {"password": {...}} or a number, and
|
|
262
|
+
* the value flows into the hasher.
|
|
263
|
+
*/
|
|
264
|
+
if (typeof password !== "string") {
|
|
265
|
+
throw new BadDataException("Password is required");
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
await UserService.setPassword({
|
|
269
|
+
userId: userId,
|
|
270
|
+
password: password,
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
return Response.sendEmptySuccessResponse(req, res);
|
|
274
|
+
} catch (err) {
|
|
275
|
+
return next(err);
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
/*
|
|
281
|
+
* Email the user a link that lets them choose their own password.
|
|
282
|
+
*
|
|
283
|
+
* The counterpart to setting one for them: it never puts the operator in
|
|
284
|
+
* possession of the user's credentials, which is the better default when
|
|
285
|
+
* the point is simply to get somebody back into a locked-out account. The
|
|
286
|
+
* link is the same one /forgot-password sends, redeemed by the same page.
|
|
287
|
+
*/
|
|
288
|
+
this.router.post(
|
|
289
|
+
`${new this.entityType().getCrudApiPath()?.toString()}/:userId/send-password-reset-link`,
|
|
290
|
+
MasterAdminAuthorization.isAuthorizedMasterAdminMiddleware,
|
|
291
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
292
|
+
try {
|
|
293
|
+
const userId: ObjectID = UserAPI.getUserIdFromParams(req);
|
|
294
|
+
|
|
295
|
+
const email: Email = await UserService.sendPasswordResetLink({
|
|
296
|
+
userId: userId,
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
/*
|
|
300
|
+
* Echoed back so the page can say where the link went. The caller is
|
|
301
|
+
* a master admin who can already read this user's email through the
|
|
302
|
+
* CRUD API, so this discloses nothing new.
|
|
303
|
+
*/
|
|
304
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
305
|
+
email: email.toString(),
|
|
306
|
+
});
|
|
307
|
+
} catch (err) {
|
|
308
|
+
return next(err);
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
);
|
|
312
|
+
|
|
194
313
|
this.router.get(
|
|
195
314
|
`${new this.entityType().getCrudApiPath()?.toString()}/profile-picture/:userId`,
|
|
196
315
|
async (req: ExpressRequest, res: ExpressResponse) => {
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
HomeRoute,
|
|
9
9
|
} from "../ServiceRoute";
|
|
10
10
|
import BillingConfig from "./BillingConfig";
|
|
11
|
+
import { getDistributedDdlTaskTimeoutSeconds } from "./Utils/AnalyticsDatabase/ClusterConfig";
|
|
11
12
|
import Protocol from "../Types/API/Protocol";
|
|
12
13
|
import URL from "../Types/API/URL";
|
|
13
14
|
import Route from "../Types/API/Route";
|
|
@@ -569,6 +570,21 @@ export const ClickhouseClusterName: string =
|
|
|
569
570
|
export const ClickhouseShardingKeyOverride: string =
|
|
570
571
|
process.env["CLICKHOUSE_SHARDING_KEY"] || "";
|
|
571
572
|
|
|
573
|
+
/*
|
|
574
|
+
* How long migration / schema-sync ON CLUSTER DDL waits for every host to
|
|
575
|
+
* report completion before giving up on confirmation (the statement itself
|
|
576
|
+
* stays queued and still executes on every host in the background). Default
|
|
577
|
+
* 180 — the ClickHouse server default. Raise this on clusters whose DDL queue
|
|
578
|
+
* drains slowly; the migration pool's socket-idle ceiling scales with it (see
|
|
579
|
+
* ClickhouseConfig.ts). 0 returns immediately (async); a negative value
|
|
580
|
+
* removes the server-side wait limit but the client still gives up at the
|
|
581
|
+
* migration pool's socket-idle ceiling (30-minute floor), so prefer a finite
|
|
582
|
+
* value. Mirrors the live reader getDistributedDdlTaskTimeoutSeconds() in
|
|
583
|
+
* ClusterConfig.ts, which is the single source of parsing truth.
|
|
584
|
+
*/
|
|
585
|
+
export const ClickhouseDistributedDdlTaskTimeoutSeconds: number =
|
|
586
|
+
getDistributedDdlTaskTimeoutSeconds();
|
|
587
|
+
|
|
572
588
|
export const GitSha: string = process.env["GIT_SHA"] || "unknown";
|
|
573
589
|
|
|
574
590
|
export const AppVersion: string = process.env["APP_VERSION"] || "unknown";
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
MaxClickhouseIngestConnections,
|
|
14
14
|
ShouldClickhouseSslEnable,
|
|
15
15
|
} from "../EnvironmentConfig";
|
|
16
|
+
import { getDistributedDdlTaskTimeoutSeconds } from "../Utils/AnalyticsDatabase/ClusterConfig";
|
|
16
17
|
import Hostname from "../../Types/API/Hostname";
|
|
17
18
|
|
|
18
19
|
export type ClickHouseClientConfigOptions = NodeClickHouseClientConfigOptions;
|
|
@@ -22,6 +23,52 @@ const hostProtocol: string = ClickHouseIsHostHttps ? "https" : "http";
|
|
|
22
23
|
const clickhouseHost: Hostname = ClickhouseHost || new Hostname("clickhouse");
|
|
23
24
|
const clickhousePort: string = (ClickhousePort || 8123).toString();
|
|
24
25
|
|
|
26
|
+
/*
|
|
27
|
+
* How long the client keeps an idle pooled HTTP socket alive before
|
|
28
|
+
* destroying it (keep_alive.idle_socket_ttl). @clickhouse/client enables
|
|
29
|
+
* keep-alive by default but expires idle sockets after only 2500ms, while
|
|
30
|
+
* the telemetry fan-in writer's flush window (TELEMETRY_FANIN_MAX_WAIT_MS,
|
|
31
|
+
* see TelemetryFanInWriter.ts) defaults to 5000ms — so under sub-saturation
|
|
32
|
+
* ingest load every pooled socket was destroyed between flushes and every
|
|
33
|
+
* flush paid TCP (+TLS) connection setup again. The default here is bounded
|
|
34
|
+
* on both sides:
|
|
35
|
+
*
|
|
36
|
+
* - ABOVE the 5000ms fan-in flush window, so the socket a flush opened is
|
|
37
|
+
* still alive when the next flush fires and gets reused instead of
|
|
38
|
+
* being re-established;
|
|
39
|
+
* - BELOW the ClickHouse server's keep_alive_timeout of 10s (the bundled
|
|
40
|
+
* Clickhouse/config.xml pins <keep_alive_timeout>10</keep_alive_timeout>,
|
|
41
|
+
* which is also the server default since 23.11), so the CLIENT always
|
|
42
|
+
* retires an idle socket before the SERVER does. Operators who lower
|
|
43
|
+
* the server's keep_alive_timeout below this TTL must lower
|
|
44
|
+
* CLICKHOUSE_KEEP_ALIVE_IDLE_SOCKET_TTL_MS along with it (keeping it a
|
|
45
|
+
* fair bit under the server value) — otherwise the client reuses
|
|
46
|
+
* sockets the server has already closed and requests fail with
|
|
47
|
+
* ECONNRESET.
|
|
48
|
+
*
|
|
49
|
+
* The value must be a positive number of milliseconds; unset, non-numeric,
|
|
50
|
+
* zero and negative values all fall back to the default. Zero is rejected
|
|
51
|
+
* deliberately: the client treats 0 as "disable idle-socket reaping
|
|
52
|
+
* entirely", which reintroduces the server-closes-first ECONNRESET failure
|
|
53
|
+
* mode this TTL exists to prevent.
|
|
54
|
+
*/
|
|
55
|
+
const DEFAULT_KEEP_ALIVE_IDLE_SOCKET_TTL_MS: number = 8000;
|
|
56
|
+
|
|
57
|
+
const keepAliveIdleSocketTtlRawValue: string = (
|
|
58
|
+
process.env["CLICKHOUSE_KEEP_ALIVE_IDLE_SOCKET_TTL_MS"] || ""
|
|
59
|
+
).trim();
|
|
60
|
+
|
|
61
|
+
const keepAliveIdleSocketTtlParsedValue: number = parseInt(
|
|
62
|
+
keepAliveIdleSocketTtlRawValue,
|
|
63
|
+
10,
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const keepAliveIdleSocketTtlInMs: number =
|
|
67
|
+
Number.isFinite(keepAliveIdleSocketTtlParsedValue) &&
|
|
68
|
+
keepAliveIdleSocketTtlParsedValue > 0
|
|
69
|
+
? keepAliveIdleSocketTtlParsedValue
|
|
70
|
+
: DEFAULT_KEEP_ALIVE_IDLE_SOCKET_TTL_MS;
|
|
71
|
+
|
|
25
72
|
const options: ClickHouseClientConfigOptions = {
|
|
26
73
|
url: `${hostProtocol}://${clickhouseHost.toString()}:${clickhousePort}`,
|
|
27
74
|
username: ClickhouseUsername,
|
|
@@ -71,6 +118,19 @@ const options: ClickHouseClientConfigOptions = {
|
|
|
71
118
|
request: true,
|
|
72
119
|
response: true,
|
|
73
120
|
},
|
|
121
|
+
/*
|
|
122
|
+
* Reuse pooled sockets across fan-in flush windows — see the note on
|
|
123
|
+
* keepAliveIdleSocketTtlInMs above for both bounds on the TTL and the
|
|
124
|
+
* operator warning about the server's keep_alive_timeout. `enabled: true`
|
|
125
|
+
* restates the client default explicitly so the pairing with
|
|
126
|
+
* idle_socket_ttl is visible here rather than implied. This lives on the
|
|
127
|
+
* shared `options` object, so every pool derived from it (query, ingest,
|
|
128
|
+
* migration, test) gets the same keep-alive behavior.
|
|
129
|
+
*/
|
|
130
|
+
keep_alive: {
|
|
131
|
+
enabled: true,
|
|
132
|
+
idle_socket_ttl: keepAliveIdleSocketTtlInMs,
|
|
133
|
+
},
|
|
74
134
|
};
|
|
75
135
|
|
|
76
136
|
if (ShouldClickhouseSslEnable && ClickhouseTlsCa) {
|
|
@@ -114,10 +174,23 @@ export const ingestDataSourceOptions: ClickHouseClientConfigOptions = {
|
|
|
114
174
|
* additionally carry send_progress_in_http_headers (see MigrationExecuteOptions
|
|
115
175
|
* in AnalyticsDatabaseService) so the socket stays non-idle, and a server-side
|
|
116
176
|
* SETTINGS max_execution_time so ClickHouse remains the authoritative cap.
|
|
177
|
+
*
|
|
178
|
+
* The ON CLUSTER confirmation wait (distributed_ddl_task_timeout) streams zero
|
|
179
|
+
* bytes while pending, so this idle ceiling is the effective upper bound on any
|
|
180
|
+
* DDL confirmation wait. When CLICKHOUSE_DISTRIBUTED_DDL_TASK_TIMEOUT_SECONDS
|
|
181
|
+
* is raised past the 30-minute floor, scale the ceiling with it (plus slack)
|
|
182
|
+
* so the longer wait isn't killed client-side. A negative (infinite) DDL
|
|
183
|
+
* timeout is still bounded by the 30-minute floor — the client must not hang
|
|
184
|
+
* forever on a dead socket.
|
|
117
185
|
*/
|
|
186
|
+
const migrationRequestTimeoutInMs: number = Math.max(
|
|
187
|
+
30 * 60 * 1000, // 30-minute floor
|
|
188
|
+
(getDistributedDdlTaskTimeoutSeconds() + 120) * 1000,
|
|
189
|
+
);
|
|
190
|
+
|
|
118
191
|
export const migrationDataSourceOptions: ClickHouseClientConfigOptions = {
|
|
119
192
|
...options,
|
|
120
|
-
request_timeout:
|
|
193
|
+
request_timeout: migrationRequestTimeoutInMs,
|
|
121
194
|
};
|
|
122
195
|
|
|
123
196
|
export const testDataSourceOptions: ClickHouseClientConfigOptions =
|