@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,717 @@
|
|
|
1
|
+
import AggregatedModel from "../../../../Types/BaseDatabase/AggregatedModel";
|
|
2
|
+
import AggregatedResult from "../../../../Types/BaseDatabase/AggregatedResult";
|
|
3
|
+
import {
|
|
4
|
+
DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
|
|
5
|
+
DATA_SOURCE_MAX_SERIES,
|
|
6
|
+
DATA_SOURCE_MAX_TABLE_ROWS,
|
|
7
|
+
DATA_SOURCE_MAX_TIME_SERIES_ROWS,
|
|
8
|
+
DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
|
|
9
|
+
} from "../../../../Types/DataSource/DataSourceLimits";
|
|
10
|
+
import DataSourceTableResult from "../../../../Types/DataSource/DataSourceTableResult";
|
|
11
|
+
import DataSourceType from "../../../../Types/DataSource/DataSourceType";
|
|
12
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
13
|
+
import DataSourceEgressGuard from "../EgressGuard";
|
|
14
|
+
import DataSourceHttpFetch, {
|
|
15
|
+
DataSourceHttpRequest,
|
|
16
|
+
DataSourceHttpResponse,
|
|
17
|
+
} from "../HttpFetch";
|
|
18
|
+
import SqlResultShaper from "../SqlResultShaper";
|
|
19
|
+
import {
|
|
20
|
+
DataSourceConnectionSettings,
|
|
21
|
+
DataSourceConnector,
|
|
22
|
+
DataSourceQueryWindow,
|
|
23
|
+
} from "../Types";
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* Connector for Elasticsearch and OpenSearch clusters. Queries are written
|
|
27
|
+
* as Query DSL JSON and POSTed to {url}/{index}/_search; all requests go
|
|
28
|
+
* through DataSourceHttpFetch, which egress-validates the URL and pins the
|
|
29
|
+
* resolved addresses before dialing (the connector additionally runs the
|
|
30
|
+
* egress guard itself before every request).
|
|
31
|
+
*
|
|
32
|
+
* Authentication: DataSourceHttpFetch.buildAuthHeaders sends
|
|
33
|
+
* "Authorization: Bearer <apiToken>" when an API token is set, else HTTP
|
|
34
|
+
* basic auth from username/password. Elasticsearch API keys that need the
|
|
35
|
+
* "Authorization: ApiKey <base64>" scheme should be configured as a custom
|
|
36
|
+
* header named "Authorization" instead — custom headers override the
|
|
37
|
+
* computed Authorization header.
|
|
38
|
+
*
|
|
39
|
+
* Chart queries must contain a date_histogram aggregation (optionally
|
|
40
|
+
* wrapped in a terms aggregation for one series per term); table queries
|
|
41
|
+
* render hits[]._source rows.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
const ERROR_TEXT_MAX_LENGTH: number = 500;
|
|
45
|
+
|
|
46
|
+
// Table widgets cap columns so a wide _source cannot flood the UI.
|
|
47
|
+
const MAX_TABLE_COLUMNS: number = 50;
|
|
48
|
+
|
|
49
|
+
// Bucket keys that are histogram metadata rather than sub-aggregations.
|
|
50
|
+
const DATE_BUCKET_META_KEYS: Array<string> = [
|
|
51
|
+
"key",
|
|
52
|
+
"key_as_string",
|
|
53
|
+
"doc_count",
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
export interface ElasticsearchTimeSeriesParseOptions {
|
|
57
|
+
maxSeries?: number | undefined;
|
|
58
|
+
maxPoints?: number | undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface ElasticsearchTableParseOptions {
|
|
62
|
+
maxRows?: number | undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type UnknownRecord = Record<string, unknown>;
|
|
66
|
+
|
|
67
|
+
function asRecord(value: unknown): UnknownRecord | null {
|
|
68
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
|
|
69
|
+
return value as UnknownRecord;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function coerceFiniteNumber(value: unknown): number | null {
|
|
75
|
+
if (typeof value === "number") {
|
|
76
|
+
return Number.isFinite(value) ? value : null;
|
|
77
|
+
}
|
|
78
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
79
|
+
const numeric: number = Number(value);
|
|
80
|
+
return Number.isFinite(numeric) ? numeric : null;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/*
|
|
86
|
+
* Replace dashboard time macros in the RAW query text before JSON parsing.
|
|
87
|
+
* $__startTimeMs/$__endTimeMs become epoch-millisecond numbers (usable as
|
|
88
|
+
* JSON numbers in range filters); $__startTime/$__endTime become ISO-8601
|
|
89
|
+
* strings WITHOUT quotes — they are meant to sit inside existing JSON
|
|
90
|
+
* string quotes, e.g. "gte": "$__startTime". The Ms variants are replaced
|
|
91
|
+
* first so the shorter token cannot corrupt them.
|
|
92
|
+
*/
|
|
93
|
+
export function applyElasticsearchTimeMacros(
|
|
94
|
+
queryText: string,
|
|
95
|
+
startDate: Date,
|
|
96
|
+
endDate: Date,
|
|
97
|
+
): string {
|
|
98
|
+
return queryText
|
|
99
|
+
.replace(/\$__startTimeMs\b/g, startDate.getTime().toString())
|
|
100
|
+
.replace(/\$__endTimeMs\b/g, endDate.getTime().toString())
|
|
101
|
+
.replace(/\$__startTime\b/g, startDate.toISOString())
|
|
102
|
+
.replace(/\$__endTime\b/g, endDate.toISOString());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* Macro-substitute and parse the query text into a Query DSL body object.
|
|
107
|
+
* Pure — exported for direct testing.
|
|
108
|
+
*/
|
|
109
|
+
export function parseQueryDsl(
|
|
110
|
+
queryText: string,
|
|
111
|
+
startDate: Date,
|
|
112
|
+
endDate: Date,
|
|
113
|
+
): UnknownRecord {
|
|
114
|
+
if (!queryText || queryText.trim() === "") {
|
|
115
|
+
throw new BadDataException(
|
|
116
|
+
"Query is required. Provide an Elasticsearch Query DSL JSON object (for example a query with a date_histogram aggregation).",
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const substituted: string = applyElasticsearchTimeMacros(
|
|
121
|
+
queryText,
|
|
122
|
+
startDate,
|
|
123
|
+
endDate,
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
let parsed: unknown = undefined;
|
|
127
|
+
try {
|
|
128
|
+
parsed = JSON.parse(substituted);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
throw new BadDataException(
|
|
131
|
+
`Query is not valid JSON: ${
|
|
132
|
+
error instanceof Error ? error.message : String(error)
|
|
133
|
+
}. Elasticsearch queries must be a single Query DSL JSON object.`,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const record: UnknownRecord | null = asRecord(parsed);
|
|
138
|
+
if (!record) {
|
|
139
|
+
throw new BadDataException(
|
|
140
|
+
"Query must be a JSON object (Elasticsearch Query DSL), not an array or primitive value.",
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return record;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/*
|
|
148
|
+
* Build the _search URL: {url}/{encodedIndex}/_search, index taken from
|
|
149
|
+
* additionalOptions.elasticsearchIndex (default "*", matching every
|
|
150
|
+
* index the credentials can read).
|
|
151
|
+
*/
|
|
152
|
+
export function buildElasticsearchSearchUrl(
|
|
153
|
+
settings: DataSourceConnectionSettings,
|
|
154
|
+
): string {
|
|
155
|
+
const baseUrl: string = getTrimmedBaseUrl(settings);
|
|
156
|
+
|
|
157
|
+
const rawIndex: unknown = settings.additionalOptions?.["elasticsearchIndex"];
|
|
158
|
+
const index: string =
|
|
159
|
+
typeof rawIndex === "string" && rawIndex.trim() !== ""
|
|
160
|
+
? rawIndex.trim()
|
|
161
|
+
: "*";
|
|
162
|
+
|
|
163
|
+
return `${baseUrl}/${encodeURIComponent(index)}/_search`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function getTrimmedBaseUrl(settings: DataSourceConnectionSettings): string {
|
|
167
|
+
if (!settings.url) {
|
|
168
|
+
throw new BadDataException(
|
|
169
|
+
"Elasticsearch data source is missing a URL. Set the base URL of the cluster's HTTP endpoint (for example https://elasticsearch.example.com:9200).",
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
return settings.url.trim().replace(/\/+$/, "");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
interface BucketAggregation {
|
|
176
|
+
name: string;
|
|
177
|
+
buckets: Array<unknown>;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* First entry in `record` whose value is an object carrying a `buckets`
|
|
182
|
+
* array — how both date_histogram and terms aggregations shape their
|
|
183
|
+
* responses (ES 6/7/8 and OpenSearch alike). Keyed (`"keyed": true`)
|
|
184
|
+
* responses use an object instead of an array and are not recognized.
|
|
185
|
+
*/
|
|
186
|
+
function findBucketAggregation(
|
|
187
|
+
record: UnknownRecord,
|
|
188
|
+
): BucketAggregation | null {
|
|
189
|
+
for (const name of Object.keys(record)) {
|
|
190
|
+
const candidate: UnknownRecord | null = asRecord(record[name]);
|
|
191
|
+
if (candidate && Array.isArray(candidate["buckets"])) {
|
|
192
|
+
return { name: name, buckets: candidate["buckets"] as Array<unknown> };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
* String bucket keys must LOOK like dates (YYYY-MM-DD...) before they are
|
|
200
|
+
* fed to Date parsing — V8's lenient parser turns terms keys like "host-1"
|
|
201
|
+
* into valid dates, which would make a plain terms aggregation
|
|
202
|
+
* indistinguishable from a date_histogram.
|
|
203
|
+
*/
|
|
204
|
+
const DATE_LIKE_STRING_REGEX: RegExp = /^\d{4}-\d{2}-\d{2}/;
|
|
205
|
+
|
|
206
|
+
function parseDateLikeString(value: string): Date | null {
|
|
207
|
+
if (!DATE_LIKE_STRING_REGEX.test(value.trim())) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
return SqlResultShaper.coerceTimestamp(value);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/*
|
|
214
|
+
* Timestamp of one date_histogram bucket: `key` is epoch milliseconds in
|
|
215
|
+
* every Elasticsearch/OpenSearch version; `key_as_string` is the formatted
|
|
216
|
+
* fallback when key is absent or non-numeric.
|
|
217
|
+
*/
|
|
218
|
+
function bucketTimestamp(bucket: UnknownRecord): Date | null {
|
|
219
|
+
const key: unknown = bucket["key"];
|
|
220
|
+
if (typeof key === "number" && Number.isFinite(key)) {
|
|
221
|
+
return new Date(key);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const keyAsString: unknown = bucket["key_as_string"];
|
|
225
|
+
if (typeof keyAsString === "string") {
|
|
226
|
+
return parseDateLikeString(keyAsString);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (typeof key === "string") {
|
|
230
|
+
return parseDateLikeString(key);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/*
|
|
237
|
+
* Value of one date_histogram bucket: the first sub-aggregation object
|
|
238
|
+
* owning a numeric `value` (metric aggs like avg/sum/max return
|
|
239
|
+
* { "value": n }; string numbers are coerced), else the bucket's own
|
|
240
|
+
* doc_count. Nested bucket aggregations are skipped.
|
|
241
|
+
*/
|
|
242
|
+
function bucketValue(bucket: UnknownRecord): number | null {
|
|
243
|
+
for (const key of Object.keys(bucket)) {
|
|
244
|
+
if (DATE_BUCKET_META_KEYS.includes(key)) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const subAggregation: UnknownRecord | null = asRecord(bucket[key]);
|
|
248
|
+
if (!subAggregation || Array.isArray(subAggregation["buckets"])) {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
const numeric: number | null = coerceFiniteNumber(subAggregation["value"]);
|
|
252
|
+
if (numeric !== null) {
|
|
253
|
+
return numeric;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return coerceFiniteNumber(bucket["doc_count"]);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function termBucketLabel(bucket: UnknownRecord): string {
|
|
261
|
+
const keyAsString: unknown = bucket["key_as_string"];
|
|
262
|
+
if (typeof keyAsString === "string") {
|
|
263
|
+
return keyAsString;
|
|
264
|
+
}
|
|
265
|
+
const key: unknown = bucket["key"];
|
|
266
|
+
if (key === undefined || key === null) {
|
|
267
|
+
return "(unset)";
|
|
268
|
+
}
|
|
269
|
+
return String(key);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function throwDateHistogramRequired(aggregationName?: string): never {
|
|
273
|
+
const prefix: string = aggregationName
|
|
274
|
+
? `The "${aggregationName}" aggregation does not look like a date_histogram (bucket keys are not timestamps)`
|
|
275
|
+
: "Elasticsearch response contained no date_histogram aggregation";
|
|
276
|
+
throw new BadDataException(
|
|
277
|
+
`${prefix}. Chart queries must include a date_histogram aggregation under "aggs" (optionally wrapped in a terms aggregation for one series per term); keyed bucket responses ("keyed": true) are not supported. Use the Table widget for hit lists.`,
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/*
|
|
282
|
+
* Parse a _search response's aggregations into the AggregatedResult shape
|
|
283
|
+
* chart widgets consume. Supports a single date_histogram aggregation (any
|
|
284
|
+
* name) and a terms aggregation wrapping a date_histogram (one series per
|
|
285
|
+
* term bucket, labeled via attributes[termsAggName]). Pure — exported for
|
|
286
|
+
* direct testing.
|
|
287
|
+
*/
|
|
288
|
+
export function parseTimeSeriesAggregations(
|
|
289
|
+
body: unknown,
|
|
290
|
+
options?: ElasticsearchTimeSeriesParseOptions,
|
|
291
|
+
): AggregatedResult {
|
|
292
|
+
const maxSeries: number = options?.maxSeries ?? DATA_SOURCE_MAX_SERIES;
|
|
293
|
+
const maxPoints: number =
|
|
294
|
+
options?.maxPoints ?? DATA_SOURCE_MAX_TIME_SERIES_ROWS;
|
|
295
|
+
|
|
296
|
+
const envelope: UnknownRecord | null = asRecord(body);
|
|
297
|
+
if (!envelope) {
|
|
298
|
+
throw new BadDataException(
|
|
299
|
+
"Elasticsearch returned an unexpected response shape (expected a JSON object).",
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const aggregations: UnknownRecord | null = asRecord(envelope["aggregations"]);
|
|
304
|
+
if (!aggregations) {
|
|
305
|
+
throwDateHistogramRequired();
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const outer: BucketAggregation | null = findBucketAggregation(aggregations);
|
|
309
|
+
if (!outer) {
|
|
310
|
+
throwDateHistogramRequired();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const firstBucket: UnknownRecord | null =
|
|
314
|
+
outer.buckets
|
|
315
|
+
.map((bucket: unknown) => {
|
|
316
|
+
return asRecord(bucket);
|
|
317
|
+
})
|
|
318
|
+
.find((bucket: UnknownRecord | null) => {
|
|
319
|
+
return bucket !== null;
|
|
320
|
+
}) ?? null;
|
|
321
|
+
|
|
322
|
+
if (!firstBucket) {
|
|
323
|
+
return { data: [], truncated: false };
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const nested: BucketAggregation | null = findBucketAggregation(firstBucket);
|
|
327
|
+
if (nested) {
|
|
328
|
+
return parseTermsWrappedHistogram(outer, maxSeries, maxPoints);
|
|
329
|
+
}
|
|
330
|
+
return parseSingleHistogram(outer, maxPoints);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function parseSingleHistogram(
|
|
334
|
+
aggregation: BucketAggregation,
|
|
335
|
+
maxPoints: number,
|
|
336
|
+
): AggregatedResult {
|
|
337
|
+
let truncated: boolean = false;
|
|
338
|
+
let sawRecordBucket: boolean = false;
|
|
339
|
+
let sawTimestamp: boolean = false;
|
|
340
|
+
const points: Array<AggregatedModel> = [];
|
|
341
|
+
|
|
342
|
+
for (const rawBucket of aggregation.buckets) {
|
|
343
|
+
const bucket: UnknownRecord | null = asRecord(rawBucket);
|
|
344
|
+
if (!bucket) {
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
sawRecordBucket = true;
|
|
348
|
+
|
|
349
|
+
const timestamp: Date | null = bucketTimestamp(bucket);
|
|
350
|
+
if (!timestamp) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
sawTimestamp = true;
|
|
354
|
+
|
|
355
|
+
const value: number | null = bucketValue(bucket);
|
|
356
|
+
if (value === null) {
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (points.length >= maxPoints) {
|
|
361
|
+
truncated = true;
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
points.push({ timestamp: timestamp, value: value } as AggregatedModel);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (sawRecordBucket && !sawTimestamp) {
|
|
369
|
+
throwDateHistogramRequired(aggregation.name);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return { data: points, truncated: truncated };
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function parseTermsWrappedHistogram(
|
|
376
|
+
termsAggregation: BucketAggregation,
|
|
377
|
+
maxSeries: number,
|
|
378
|
+
maxPoints: number,
|
|
379
|
+
): AggregatedResult {
|
|
380
|
+
let truncated: boolean = false;
|
|
381
|
+
|
|
382
|
+
let termBuckets: Array<unknown> = termsAggregation.buckets;
|
|
383
|
+
if (termBuckets.length > maxSeries) {
|
|
384
|
+
termBuckets = termBuckets.slice(0, maxSeries);
|
|
385
|
+
truncated = true;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
let sawInnerRecordBucket: boolean = false;
|
|
389
|
+
let sawInnerTimestamp: boolean = false;
|
|
390
|
+
const points: Array<AggregatedModel> = [];
|
|
391
|
+
|
|
392
|
+
outer: for (const rawTermBucket of termBuckets) {
|
|
393
|
+
const termBucket: UnknownRecord | null = asRecord(rawTermBucket);
|
|
394
|
+
if (!termBucket) {
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const inner: BucketAggregation | null = findBucketAggregation(termBucket);
|
|
399
|
+
if (!inner) {
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
const seriesLabel: string = termBucketLabel(termBucket);
|
|
404
|
+
|
|
405
|
+
for (const rawDateBucket of inner.buckets) {
|
|
406
|
+
const dateBucket: UnknownRecord | null = asRecord(rawDateBucket);
|
|
407
|
+
if (!dateBucket) {
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
sawInnerRecordBucket = true;
|
|
411
|
+
|
|
412
|
+
const timestamp: Date | null = bucketTimestamp(dateBucket);
|
|
413
|
+
if (!timestamp) {
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
sawInnerTimestamp = true;
|
|
417
|
+
|
|
418
|
+
const value: number | null = bucketValue(dateBucket);
|
|
419
|
+
if (value === null) {
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (points.length >= maxPoints) {
|
|
424
|
+
truncated = true;
|
|
425
|
+
break outer;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
const point: AggregatedModel = {
|
|
429
|
+
timestamp: timestamp,
|
|
430
|
+
value: value,
|
|
431
|
+
} as AggregatedModel;
|
|
432
|
+
(point as UnknownRecord)["attributes"] = {
|
|
433
|
+
[termsAggregation.name]: seriesLabel,
|
|
434
|
+
};
|
|
435
|
+
points.push(point);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
if (sawInnerRecordBucket && !sawInnerTimestamp) {
|
|
440
|
+
throwDateHistogramRequired(termsAggregation.name);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return { data: points, truncated: truncated };
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function readTotalHits(total: unknown): number | null {
|
|
447
|
+
// ES 6 (and REST APIs mimicking it) return a bare number.
|
|
448
|
+
if (typeof total === "number" && Number.isFinite(total)) {
|
|
449
|
+
return total;
|
|
450
|
+
}
|
|
451
|
+
// ES 7/8 and OpenSearch return { value, relation }.
|
|
452
|
+
const totalRecord: UnknownRecord | null = asRecord(total);
|
|
453
|
+
if (totalRecord && typeof totalRecord["value"] === "number") {
|
|
454
|
+
return totalRecord["value"] as number;
|
|
455
|
+
}
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/*
|
|
460
|
+
* Parse a _search response's hits into the table shape: one row per hit,
|
|
461
|
+
* columns _id and _index plus the union of _source keys across rows
|
|
462
|
+
* (capped at MAX_TABLE_COLUMNS), cells coerced to JSON-safe primitives.
|
|
463
|
+
* Pure — exported for direct testing.
|
|
464
|
+
*/
|
|
465
|
+
export function parseHitsToTable(
|
|
466
|
+
body: unknown,
|
|
467
|
+
options?: ElasticsearchTableParseOptions,
|
|
468
|
+
): DataSourceTableResult {
|
|
469
|
+
const maxRows: number = options?.maxRows ?? DATA_SOURCE_MAX_TABLE_ROWS;
|
|
470
|
+
|
|
471
|
+
const envelope: UnknownRecord | null = asRecord(body);
|
|
472
|
+
if (!envelope) {
|
|
473
|
+
throw new BadDataException(
|
|
474
|
+
"Elasticsearch returned an unexpected response shape (expected a JSON object).",
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const hitsEnvelope: UnknownRecord | null = asRecord(envelope["hits"]);
|
|
479
|
+
if (!hitsEnvelope || !Array.isArray(hitsEnvelope["hits"])) {
|
|
480
|
+
throw new BadDataException(
|
|
481
|
+
"Elasticsearch response is missing hits.hits — expected a standard _search response.",
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
const hitList: Array<unknown> = hitsEnvelope["hits"] as Array<unknown>;
|
|
486
|
+
|
|
487
|
+
const rawRows: Array<Record<string, unknown>> = [];
|
|
488
|
+
for (const rawHit of hitList) {
|
|
489
|
+
const hit: UnknownRecord | null = asRecord(rawHit);
|
|
490
|
+
if (!hit) {
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
const row: Record<string, unknown> = {
|
|
495
|
+
_id: hit["_id"] ?? null,
|
|
496
|
+
_index: hit["_index"] ?? null,
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
const source: UnknownRecord | null = asRecord(hit["_source"]);
|
|
500
|
+
if (source) {
|
|
501
|
+
for (const key of Object.keys(source)) {
|
|
502
|
+
if (key === "_id" || key === "_index") {
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
row[key] = source[key];
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
rawRows.push(row);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
const columnNames: Array<string> = [];
|
|
513
|
+
for (const row of rawRows) {
|
|
514
|
+
for (const name of Object.keys(row)) {
|
|
515
|
+
if (
|
|
516
|
+
!columnNames.includes(name) &&
|
|
517
|
+
columnNames.length < MAX_TABLE_COLUMNS
|
|
518
|
+
) {
|
|
519
|
+
columnNames.push(name);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
const strippedRows: Array<Record<string, unknown>> = rawRows.map(
|
|
525
|
+
(row: Record<string, unknown>) => {
|
|
526
|
+
const stripped: Record<string, unknown> = {};
|
|
527
|
+
for (const name of columnNames) {
|
|
528
|
+
if (name in row) {
|
|
529
|
+
stripped[name] = row[name];
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return stripped;
|
|
533
|
+
},
|
|
534
|
+
);
|
|
535
|
+
|
|
536
|
+
const table: DataSourceTableResult = SqlResultShaper.rowsToTable(
|
|
537
|
+
strippedRows,
|
|
538
|
+
{ maxRows: maxRows },
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
/*
|
|
542
|
+
* The request's size was clamped at the cap — when the page is full and
|
|
543
|
+
* the cluster reports more matching documents, the result is truncated.
|
|
544
|
+
*/
|
|
545
|
+
const totalHits: number | null = readTotalHits(hitsEnvelope["total"]);
|
|
546
|
+
if (
|
|
547
|
+
totalHits !== null &&
|
|
548
|
+
table.rows.length >= maxRows &&
|
|
549
|
+
totalHits > table.rows.length
|
|
550
|
+
) {
|
|
551
|
+
table.truncated = true;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
return table;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
function remapAuthenticationError(error: unknown): Error {
|
|
558
|
+
const message: string =
|
|
559
|
+
error instanceof Error ? error.message : String(error);
|
|
560
|
+
if (message.includes("HTTP 401")) {
|
|
561
|
+
return new BadDataException(
|
|
562
|
+
"Elasticsearch rejected the credentials (HTTP 401 Unauthorized). Check the username/password or API token configured on this data source.",
|
|
563
|
+
);
|
|
564
|
+
}
|
|
565
|
+
if (message.includes("HTTP 403")) {
|
|
566
|
+
return new BadDataException(
|
|
567
|
+
"Elasticsearch denied access (HTTP 403 Forbidden). The configured credentials do not have permission for this cluster or index.",
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
return error instanceof Error ? error : new Error(message);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
export default class ElasticsearchConnector implements DataSourceConnector {
|
|
574
|
+
public dataSourceType: DataSourceType = DataSourceType.Elasticsearch;
|
|
575
|
+
|
|
576
|
+
public async testConnection(
|
|
577
|
+
settings: DataSourceConnectionSettings,
|
|
578
|
+
): Promise<void> {
|
|
579
|
+
await this.withSanitizedErrors(settings, async (): Promise<void> => {
|
|
580
|
+
const rootUrl: string = `${getTrimmedBaseUrl(settings)}/`;
|
|
581
|
+
|
|
582
|
+
const response: DataSourceHttpResponse = await this.performFetch({
|
|
583
|
+
method: "GET",
|
|
584
|
+
url: rootUrl,
|
|
585
|
+
headers: DataSourceHttpFetch.buildAuthHeaders(settings),
|
|
586
|
+
timeoutInMs: DATA_SOURCE_CONNECT_TIMEOUT_IN_MS,
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
if (response.bodyJson === undefined) {
|
|
590
|
+
throw new BadDataException(
|
|
591
|
+
`The URL responded (HTTP ${
|
|
592
|
+
response.statusCode
|
|
593
|
+
}) but did not return the JSON cluster banner Elasticsearch serves at its root. Check that the URL points at the Elasticsearch/OpenSearch HTTP endpoint (usually port 9200). Response: ${response.bodyText.substring(
|
|
594
|
+
0,
|
|
595
|
+
200,
|
|
596
|
+
)}`,
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
public async queryTimeSeries(
|
|
603
|
+
settings: DataSourceConnectionSettings,
|
|
604
|
+
query: string,
|
|
605
|
+
window: DataSourceQueryWindow,
|
|
606
|
+
): Promise<AggregatedResult> {
|
|
607
|
+
return this.withSanitizedErrors(
|
|
608
|
+
settings,
|
|
609
|
+
async (): Promise<AggregatedResult> => {
|
|
610
|
+
const body: UnknownRecord = parseQueryDsl(
|
|
611
|
+
query,
|
|
612
|
+
window.startDate,
|
|
613
|
+
window.endDate,
|
|
614
|
+
);
|
|
615
|
+
|
|
616
|
+
// Charts read aggregations only — hits are dead weight on the wire.
|
|
617
|
+
body["size"] = 0;
|
|
618
|
+
|
|
619
|
+
const responseBody: unknown = await this.runSearch(settings, body);
|
|
620
|
+
return parseTimeSeriesAggregations(responseBody);
|
|
621
|
+
},
|
|
622
|
+
);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
public async queryTable(
|
|
626
|
+
settings: DataSourceConnectionSettings,
|
|
627
|
+
query: string,
|
|
628
|
+
window: DataSourceQueryWindow,
|
|
629
|
+
): Promise<DataSourceTableResult> {
|
|
630
|
+
return this.withSanitizedErrors(
|
|
631
|
+
settings,
|
|
632
|
+
async (): Promise<DataSourceTableResult> => {
|
|
633
|
+
const body: UnknownRecord = parseQueryDsl(
|
|
634
|
+
query,
|
|
635
|
+
window.startDate,
|
|
636
|
+
window.endDate,
|
|
637
|
+
);
|
|
638
|
+
|
|
639
|
+
const requestedSize: unknown = body["size"];
|
|
640
|
+
const effectiveSize: number =
|
|
641
|
+
typeof requestedSize === "number" &&
|
|
642
|
+
Number.isFinite(requestedSize) &&
|
|
643
|
+
requestedSize >= 0
|
|
644
|
+
? Math.floor(requestedSize)
|
|
645
|
+
: DATA_SOURCE_MAX_TABLE_ROWS;
|
|
646
|
+
body["size"] = Math.min(effectiveSize, DATA_SOURCE_MAX_TABLE_ROWS);
|
|
647
|
+
|
|
648
|
+
const responseBody: unknown = await this.runSearch(settings, body);
|
|
649
|
+
return parseHitsToTable(responseBody);
|
|
650
|
+
},
|
|
651
|
+
);
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
private async runSearch(
|
|
655
|
+
settings: DataSourceConnectionSettings,
|
|
656
|
+
body: UnknownRecord,
|
|
657
|
+
): Promise<unknown> {
|
|
658
|
+
const searchUrl: string = buildElasticsearchSearchUrl(settings);
|
|
659
|
+
|
|
660
|
+
const response: DataSourceHttpResponse = await this.performFetch({
|
|
661
|
+
method: "POST",
|
|
662
|
+
url: searchUrl,
|
|
663
|
+
headers: DataSourceHttpFetch.buildAuthHeaders(settings),
|
|
664
|
+
body: JSON.stringify(body),
|
|
665
|
+
timeoutInMs: DATA_SOURCE_QUERY_TIMEOUT_IN_MS,
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
if (response.bodyJson === undefined) {
|
|
669
|
+
throw new BadDataException(
|
|
670
|
+
`Elasticsearch returned a non-JSON response (HTTP ${
|
|
671
|
+
response.statusCode
|
|
672
|
+
}): ${response.bodyText.substring(0, ERROR_TEXT_MAX_LENGTH)}`,
|
|
673
|
+
);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
return response.bodyJson;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/*
|
|
680
|
+
* Egress-validate, then fetch. DataSourceHttpFetch re-validates and pins
|
|
681
|
+
* the resolved addresses; the explicit guard call here keeps the contract
|
|
682
|
+
* (validate before every connection) independent of the HTTP client's
|
|
683
|
+
* internals. Auth failures are remapped to operator-actionable messages.
|
|
684
|
+
*/
|
|
685
|
+
private async performFetch(
|
|
686
|
+
request: DataSourceHttpRequest,
|
|
687
|
+
): Promise<DataSourceHttpResponse> {
|
|
688
|
+
await DataSourceEgressGuard.assertUrlAllowed(request.url);
|
|
689
|
+
|
|
690
|
+
try {
|
|
691
|
+
return await DataSourceHttpFetch.fetch(request);
|
|
692
|
+
} catch (error) {
|
|
693
|
+
throw remapAuthenticationError(error);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/*
|
|
698
|
+
* Belt-and-braces: no matter where a failure originates (egress guard,
|
|
699
|
+
* HTTP layer echoing a response body, parsing), the message that surfaces
|
|
700
|
+
* has credentials scrubbed.
|
|
701
|
+
*/
|
|
702
|
+
private async withSanitizedErrors<T>(
|
|
703
|
+
settings: DataSourceConnectionSettings,
|
|
704
|
+
run: () => Promise<T>,
|
|
705
|
+
): Promise<T> {
|
|
706
|
+
try {
|
|
707
|
+
return await run();
|
|
708
|
+
} catch (error) {
|
|
709
|
+
throw new BadDataException(
|
|
710
|
+
SqlResultShaper.sanitizeError(
|
|
711
|
+
error,
|
|
712
|
+
SqlResultShaper.collectSecrets(settings),
|
|
713
|
+
),
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
}
|