@oneuptime/common 12.0.5 → 12.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/AIRun.ts +33 -0
- package/Models/DatabaseModels/DataSource.ts +744 -0
- package/Models/DatabaseModels/Index.ts +3 -0
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
- package/Models/DatabaseModels/User.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/UserSession.ts +2 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
- package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
- package/Server/API/AIInsightAPI.ts +47 -4
- package/Server/API/AIInvestigationAPI.ts +25 -0
- package/Server/API/DashboardAPI.ts +176 -492
- package/Server/API/DataSourceAPI.ts +268 -0
- package/Server/API/StatusPageAPI.ts +11 -1
- package/Server/API/UserAPI.ts +119 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Queue.ts +26 -0
- package/Server/Infrastructure/QueueWorker.ts +17 -0
- package/Server/Middleware/TelemetryIngest.ts +8 -3
- package/Server/Services/AIInsightService.ts +132 -12
- package/Server/Services/AIRunService.ts +34 -0
- package/Server/Services/AIService.ts +17 -2
- package/Server/Services/AlertService.ts +38 -32
- package/Server/Services/AnalyticsDatabaseService.ts +8 -4
- package/Server/Services/DataSourceService.ts +200 -0
- package/Server/Services/HostService.ts +92 -0
- package/Server/Services/IncidentService.ts +45 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +49 -0
- package/Server/Services/MonitorStatusService.ts +166 -0
- package/Server/Services/OpenTelemetryIngestService.ts +255 -184
- package/Server/Services/RumSessionPinService.ts +7 -21
- package/Server/Services/StatusPageSubscriberService.ts +13 -0
- package/Server/Services/UserService.ts +280 -9
- package/Server/Static/Vendor/README.md +62 -0
- package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
- package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
- package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
- package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
- package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
- package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
- package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
- package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
- package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
- package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
- package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
- package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
- package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
- package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
- package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
- package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
- package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
- package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
- package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
- package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
- package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
- package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
- package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
- package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
- package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
- package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
- package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
- package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
- package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
- package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
- package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
- package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
- package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
- package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
- package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
- package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
- package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
- package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
- package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
- package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
- package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
- package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
- package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
- package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
- package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
- package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
- package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
- package/Server/Utils/DataSource/EgressGuard.ts +446 -0
- package/Server/Utils/DataSource/HttpFetch.ts +221 -0
- package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
- package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
- package/Server/Utils/DataSource/Types.ts +93 -0
- package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
- package/Server/Utils/InProcessMemo.ts +141 -0
- package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
- package/Server/Utils/Monitor/MonitorResource.ts +14 -0
- package/Server/Utils/Response.ts +12 -1
- package/Server/Utils/SSRFProtection.ts +237 -0
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
- package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
- package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
- package/Server/Utils/Telemetry/Telemetry.ts +112 -1
- package/Server/Utils/Telemetry.ts +104 -3
- package/Server/Utils/VendorAssets.ts +165 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
- package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
- package/Server/Views/Partials/Head.ejs +21 -7
- package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
- package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
- package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
- package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
- package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
- package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
- package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
- package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
- package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
- package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
- package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
- package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
- package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
- package/Tests/Server/Services/AIInsightService.test.ts +266 -11
- package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
- package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
- package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
- package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
- package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
- package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
- package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
- package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
- package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
- package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
- package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
- package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
- package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
- package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
- package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
- package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
- package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
- package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
- package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
- package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
- package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
- package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
- package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
- package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
- package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
- package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
- package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
- package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
- package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
- package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
- package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
- package/Tests/Server/Utils/Telemetry.test.ts +87 -0
- package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
- package/Tests/Server/Views/OfflineRender.test.ts +297 -0
- package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
- package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
- package/Tests/Types/Password.test.ts +363 -0
- package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
- package/Tests/UI/Components/Modal.test.tsx +281 -1
- package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/Analytics.test.ts +23 -0
- package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
- package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
- package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
- package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
- package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
- package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
- package/Types/AI/AIInsightEvidence.ts +6 -0
- package/Types/Analytics/RevenueEvent.ts +31 -0
- package/Types/Dashboard/DashboardComponentType.ts +31 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
- package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
- package/Types/DataSource/DataSourceLimits.ts +62 -0
- package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
- package/Types/DataSource/DataSourceTableResult.ts +38 -0
- package/Types/DataSource/DataSourceType.ts +213 -0
- package/Types/Date.ts +43 -3
- package/Types/Password.ts +64 -0
- package/Types/Permission.ts +46 -0
- package/Types/UserAuthenticationStatus.ts +34 -0
- package/UI/Components/Button/Button.tsx +1 -1
- package/UI/Components/ErrorBoundary.tsx +459 -108
- package/UI/Components/Icon/Icon.tsx +10 -9
- package/UI/Components/Modal/ConfirmModal.tsx +6 -1
- package/UI/Components/Modal/Modal.tsx +267 -35
- package/UI/Components/Modal/ModalFooter.tsx +6 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
- package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
- package/UI/Components/StatusPage/ResourceList.tsx +570 -0
- package/UI/Styles/Theme.css +18 -0
- package/UI/Utils/API/RequestOptions.ts +7 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
- package/UI/Utils/TestDataSource.ts +61 -0
- package/UI/esbuild-config.js +45 -0
- package/Utils/Analytics.ts +15 -0
- package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
- package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
- package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
- package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +28 -0
- package/Utils/DataSource/DataSourceQueryText.ts +94 -0
- package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
- package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
- package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
- package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
- package/Utils/StatusPage/ResourceExplorer.ts +853 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
- package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +2 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
- package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +34 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +119 -433
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DataSourceAPI.js +173 -0
- package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +11 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +94 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +27 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +110 -10
- package/build/dist/Server/Services/AIInsightService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +34 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +16 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +28 -35
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DataSourceService.js +159 -0
- package/build/dist/Server/Services/DataSourceService.js.map +1 -0
- package/build/dist/Server/Services/HostService.js +74 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +35 -24
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusService.js +129 -0
- package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +7 -15
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +241 -10
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
- package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
- package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
- package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
- package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
- package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
- package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
- package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
- package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
- package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
- package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/Types.js +2 -0
- package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/InProcessMemo.js +113 -0
- package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
- package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +9 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +192 -0
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
- package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +93 -6
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +121 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
- package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
- package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
- package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
- package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
- package/build/dist/Types/DataSource/DataSourceType.js +183 -0
- package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
- package/build/dist/Types/Date.js +38 -3
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Password.js +56 -0
- package/build/dist/Types/Password.js.map +1 -0
- package/build/dist/Types/Permission.js +42 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/UserAuthenticationStatus.js +2 -0
- package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
- package/build/dist/UI/Components/ErrorBoundary.js +388 -72
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +10 -4
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +178 -19
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/TestDataSource.js +39 -0
- package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
- package/build/dist/Utils/Analytics.js +4 -0
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
- package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
- package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
- package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
- package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
- package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
- package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +5 -1
- package/tsconfig.json +12 -10
|
@@ -560,6 +560,32 @@ export default class Queue {
|
|
|
560
560
|
return waitingCount + activeCount + delayedCount;
|
|
561
561
|
}
|
|
562
562
|
|
|
563
|
+
/*
|
|
564
|
+
* Backlog = jobs still waiting for a worker (waiting + delayed), for
|
|
565
|
+
* autoscaling signals. ACTIVE jobs are deliberately excluded: they are
|
|
566
|
+
* already being served, so to a scaler they are capacity, not demand.
|
|
567
|
+
* Telemetry jobs in particular sit in the active state for the fan-in
|
|
568
|
+
* writer's full flush window (up to TELEMETRY_FANIN_MAX_WAIT_MS) while
|
|
569
|
+
* awaiting their ClickHouse ack, so a fleet scaled on an active-inclusive
|
|
570
|
+
* count converges on pod count = job rate x ack latency — every new pod
|
|
571
|
+
* just parks more jobs without shortening the flush window. Scaling on
|
|
572
|
+
* waiting + delayed only breaks that feedback loop. getQueueSize above
|
|
573
|
+
* keeps the active-inclusive sum for ingest backpressure checks, where
|
|
574
|
+
* in-flight work genuinely counts against capacity.
|
|
575
|
+
*/
|
|
576
|
+
@CaptureSpan()
|
|
577
|
+
public static async getQueueBacklogSize(
|
|
578
|
+
queueName: QueueName,
|
|
579
|
+
): Promise<number> {
|
|
580
|
+
const queue: BullQueue = this.getQueue(queueName);
|
|
581
|
+
const [waitingCount, delayedCount]: [number, number] = await Promise.all([
|
|
582
|
+
queue.getWaitingCount(),
|
|
583
|
+
queue.getDelayedCount(),
|
|
584
|
+
]);
|
|
585
|
+
|
|
586
|
+
return waitingCount + delayedCount;
|
|
587
|
+
}
|
|
588
|
+
|
|
563
589
|
@CaptureSpan()
|
|
564
590
|
public static async getQueueStats(queueName: QueueName): Promise<{
|
|
565
591
|
waiting: number;
|
|
@@ -16,6 +16,7 @@ import Telemetry, {
|
|
|
16
16
|
} from "../Utils/Telemetry";
|
|
17
17
|
import Redis from "./Redis";
|
|
18
18
|
import GracefulShutdown, { ShutdownPriority } from "../Utils/GracefulShutdown";
|
|
19
|
+
import logger from "../Utils/Logger";
|
|
19
20
|
|
|
20
21
|
export default class QueueWorker {
|
|
21
22
|
@CaptureSpan()
|
|
@@ -120,6 +121,22 @@ export default class QueueWorker {
|
|
|
120
121
|
: {}),
|
|
121
122
|
});
|
|
122
123
|
|
|
124
|
+
/*
|
|
125
|
+
* Always log job failures to the container log, independent of telemetry
|
|
126
|
+
* configuration. Error visibility used to ride on @CaptureSpan's
|
|
127
|
+
* exception path, but the decorator is a passthrough when no span
|
|
128
|
+
* exporter is installed — without this listener a job that throws on
|
|
129
|
+
* such a deployment lands in the Redis failed set with no log line.
|
|
130
|
+
*/
|
|
131
|
+
worker.on("failed", (job: QueueJob | undefined, error: Error) => {
|
|
132
|
+
logger.error(
|
|
133
|
+
`Queue job failed: ${queueName}/${job?.name || "unknown"} (job ${
|
|
134
|
+
job?.id ?? "unknown"
|
|
135
|
+
})`,
|
|
136
|
+
);
|
|
137
|
+
logger.error(error);
|
|
138
|
+
});
|
|
139
|
+
|
|
123
140
|
/*
|
|
124
141
|
* Stop pulling new jobs and let in-flight ones finish on shutdown. Runs in
|
|
125
142
|
* the Workers tier — before datastores are drained — so jobs mid-flight can
|
|
@@ -73,16 +73,21 @@ export default class TelemetryIngest {
|
|
|
73
73
|
);
|
|
74
74
|
|
|
75
75
|
if (!projectId) {
|
|
76
|
+
/*
|
|
77
|
+
* The token value itself is deliberately NOT logged: ingestion
|
|
78
|
+
* keys are secrets, and a mistyped-but-nearly-valid token in a
|
|
79
|
+
* log line is a credential leak. The request attributes give
|
|
80
|
+
* operators enough to correlate with the sender.
|
|
81
|
+
*/
|
|
76
82
|
logger.error(
|
|
77
|
-
"Invalid service token
|
|
83
|
+
"Invalid service token.",
|
|
78
84
|
getLogAttributesFromRequest(req as any),
|
|
79
85
|
);
|
|
80
86
|
|
|
81
87
|
/*
|
|
82
88
|
* 401 is deliberate (see the missing-token branch above): a
|
|
83
89
|
* silent 200 drops the payload while the client believes the
|
|
84
|
-
* export succeeded.
|
|
85
|
-
* intentionally not echoed back in the response body.
|
|
90
|
+
* export succeeded.
|
|
86
91
|
*/
|
|
87
92
|
return Response.sendErrorResponse(
|
|
88
93
|
req,
|
|
@@ -8,7 +8,9 @@ import ObjectID from "../../Types/ObjectID";
|
|
|
8
8
|
import OneUptimeDate from "../../Types/Date";
|
|
9
9
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
10
10
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
11
|
-
import AIInsightStatus
|
|
11
|
+
import AIInsightStatus, {
|
|
12
|
+
AIInsightStatusHelper,
|
|
13
|
+
} from "../../Types/AI/AIInsightStatus";
|
|
12
14
|
import AIInsightHumanVerdict from "../../Types/AI/AIInsightHumanVerdict";
|
|
13
15
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
14
16
|
|
|
@@ -25,6 +27,18 @@ export class Service extends DatabaseService<AIInsight> {
|
|
|
25
27
|
super(AIInsight);
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
/*
|
|
31
|
+
* The open state an insight returns to when a human takes a terminal
|
|
32
|
+
* action back: FixOpened when an AI fix task was queued for it (that run
|
|
33
|
+
* is still the live thread of work), else ActionRequired — the same two
|
|
34
|
+
* states the scanner routes a freshly detected insight to.
|
|
35
|
+
*/
|
|
36
|
+
private getReopenStatus(insight: AIInsight): AIInsightStatus {
|
|
37
|
+
return insight.fixAiRunId
|
|
38
|
+
? AIInsightStatus.FixOpened
|
|
39
|
+
: AIInsightStatus.ActionRequired;
|
|
40
|
+
}
|
|
41
|
+
|
|
28
42
|
/*
|
|
29
43
|
* Human verdict capture — this IS the G11 precision measurement:
|
|
30
44
|
* confirm/dismiss rates per insight type tell us how precise each
|
|
@@ -32,34 +46,123 @@ export class Service extends DatabaseService<AIInsight> {
|
|
|
32
46
|
*
|
|
33
47
|
* Overwriting an existing verdict is deliberate — people change their
|
|
34
48
|
* minds; the latest verdict wins (per-insight state, not an audit trail).
|
|
35
|
-
* Dismissed is a human terminal state, so it also closes the insight
|
|
36
|
-
*
|
|
37
|
-
*
|
|
49
|
+
* Dismissed is a human terminal state, so it also closes the insight.
|
|
50
|
+
*
|
|
51
|
+
* Confirmed normally leaves the status untouched (the insight stays open
|
|
52
|
+
* until a human resolves it or a fix lands) — with one exception: an
|
|
53
|
+
* insight closed AS Dismissed is closed on the grounds that it was noise,
|
|
54
|
+
* which a Confirmed verdict directly contradicts. Leaving it closed there
|
|
55
|
+
* produced the "Dismissed / Confirmed" pill pair with no way back, and
|
|
56
|
+
* kept the InsightStore dismissal cooldown suppressing the very finding
|
|
57
|
+
* the human just called real. So confirming a dismissed insight reopens
|
|
58
|
+
* it, which is also what makes Confirm a working undo for a misclick.
|
|
38
59
|
*
|
|
39
60
|
* Callers must have already access-checked the insight under the USER's
|
|
40
61
|
* permissions — insight rows are server-authored (empty update ACL), so
|
|
41
|
-
* this writes as root.
|
|
62
|
+
* this reads and writes as root.
|
|
42
63
|
*/
|
|
43
64
|
@CaptureSpan()
|
|
44
65
|
public async applyHumanVerdict(data: {
|
|
45
66
|
insightId: ObjectID;
|
|
46
67
|
verdict: AIInsightHumanVerdict;
|
|
47
68
|
byUserId: ObjectID;
|
|
48
|
-
}): Promise<{
|
|
49
|
-
|
|
69
|
+
}): Promise<{
|
|
70
|
+
insightId: ObjectID;
|
|
71
|
+
verdict: AIInsightHumanVerdict;
|
|
72
|
+
status: AIInsightStatus | null;
|
|
73
|
+
}> {
|
|
74
|
+
const insight: AIInsight | null = await this.findOneById({
|
|
50
75
|
id: data.insightId,
|
|
76
|
+
select: { _id: true, status: true, fixAiRunId: true },
|
|
77
|
+
props: { isRoot: true },
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
if (!insight || !insight.id) {
|
|
81
|
+
throw new BadDataException("AI insight not found.");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let nextStatus: AIInsightStatus | null = null;
|
|
85
|
+
|
|
86
|
+
if (data.verdict === AIInsightHumanVerdict.Dismissed) {
|
|
87
|
+
nextStatus = AIInsightStatus.Dismissed;
|
|
88
|
+
} else if (insight.status === AIInsightStatus.Dismissed) {
|
|
89
|
+
nextStatus = this.getReopenStatus(insight);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
await this.updateOneById({
|
|
93
|
+
id: insight.id,
|
|
51
94
|
data: {
|
|
52
95
|
humanVerdict: data.verdict,
|
|
53
96
|
humanVerdictAt: OneUptimeDate.getCurrentDate(),
|
|
54
97
|
humanVerdictByUserId: data.byUserId,
|
|
55
|
-
...(
|
|
56
|
-
|
|
57
|
-
|
|
98
|
+
...(nextStatus ? { status: nextStatus } : {}),
|
|
99
|
+
},
|
|
100
|
+
props: { isRoot: true },
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
insightId: insight.id,
|
|
105
|
+
verdict: data.verdict,
|
|
106
|
+
status: nextStatus || insight.status || null,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
* Undo a terminal action: put a Resolved or Dismissed insight back into
|
|
112
|
+
* the open queue and drop the human verdict that closed it.
|
|
113
|
+
*
|
|
114
|
+
* Both terminal states are one click away from a full stop — a dismissal
|
|
115
|
+
* additionally suppresses the same fingerprint for the whole InsightStore
|
|
116
|
+
* cooldown, so a misclick silently blinds the project to that finding for
|
|
117
|
+
* days. Reopening is the way back: the status returns to the open state
|
|
118
|
+
* the scanner would have routed to, and the verdict is CLEARED rather
|
|
119
|
+
* than kept, because a verdict the human has taken back must not keep
|
|
120
|
+
* counting toward the per-detector precision measurement (and a stale
|
|
121
|
+
* humanVerdictAt would otherwise anchor a future cooldown).
|
|
122
|
+
*
|
|
123
|
+
* Idempotent: reopening an already-open insight is a no-op that reports
|
|
124
|
+
* the current status, so a double click (or two people clicking at once)
|
|
125
|
+
* cannot rewrite a status somebody else just set.
|
|
126
|
+
*
|
|
127
|
+
* Callers must have already access-checked the insight under the USER's
|
|
128
|
+
* permissions — this reads and writes as root.
|
|
129
|
+
*/
|
|
130
|
+
@CaptureSpan()
|
|
131
|
+
public async reopenInsight(data: {
|
|
132
|
+
insightId: ObjectID;
|
|
133
|
+
}): Promise<{ insightId: ObjectID; status: AIInsightStatus }> {
|
|
134
|
+
const insight: AIInsight | null = await this.findOneById({
|
|
135
|
+
id: data.insightId,
|
|
136
|
+
select: { _id: true, status: true, fixAiRunId: true },
|
|
137
|
+
props: { isRoot: true },
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if (!insight || !insight.id) {
|
|
141
|
+
throw new BadDataException("AI insight not found.");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (
|
|
145
|
+
insight.status &&
|
|
146
|
+
!AIInsightStatusHelper.isTerminalStatus(insight.status)
|
|
147
|
+
) {
|
|
148
|
+
return { insightId: insight.id, status: insight.status };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const status: AIInsightStatus = this.getReopenStatus(insight);
|
|
152
|
+
|
|
153
|
+
await this.updateOneById({
|
|
154
|
+
id: insight.id,
|
|
155
|
+
data: {
|
|
156
|
+
status: status,
|
|
157
|
+
// Explicit nulls — the columns are cleared, not left as they were.
|
|
158
|
+
humanVerdict: null as unknown as AIInsightHumanVerdict,
|
|
159
|
+
humanVerdictAt: null as unknown as Date,
|
|
160
|
+
humanVerdictByUserId: null as unknown as ObjectID,
|
|
58
161
|
},
|
|
59
162
|
props: { isRoot: true },
|
|
60
163
|
});
|
|
61
164
|
|
|
62
|
-
return { insightId:
|
|
165
|
+
return { insightId: insight.id, status: status };
|
|
63
166
|
}
|
|
64
167
|
|
|
65
168
|
/*
|
|
@@ -79,7 +182,7 @@ export class Service extends DatabaseService<AIInsight> {
|
|
|
79
182
|
}): Promise<{ insightId: ObjectID; status: AIInsightStatus }> {
|
|
80
183
|
const insight: AIInsight | null = await this.findOneById({
|
|
81
184
|
id: data.insightId,
|
|
82
|
-
select: { _id: true, humanVerdict: true },
|
|
185
|
+
select: { _id: true, humanVerdict: true, status: true },
|
|
83
186
|
props: { isRoot: true },
|
|
84
187
|
});
|
|
85
188
|
|
|
@@ -87,6 +190,23 @@ export class Service extends DatabaseService<AIInsight> {
|
|
|
87
190
|
throw new BadDataException("AI insight not found.");
|
|
88
191
|
}
|
|
89
192
|
|
|
193
|
+
/*
|
|
194
|
+
* Closing an already-closed insight is a no-op the caller should know
|
|
195
|
+
* about — and resolving a DISMISSED one is actively harmful: the store's
|
|
196
|
+
* re-file cooldown is keyed on the current terminal status, so the flip
|
|
197
|
+
* would silently trade a dismissal's 7-day quiet for a resolve's 24-hour
|
|
198
|
+
* one and let a finding a human called noise come back. The dashboard
|
|
199
|
+
* hides both actions on terminal insights; this closes the API path.
|
|
200
|
+
*/
|
|
201
|
+
if (
|
|
202
|
+
insight.status &&
|
|
203
|
+
AIInsightStatusHelper.isTerminalStatus(insight.status)
|
|
204
|
+
) {
|
|
205
|
+
throw new BadDataException(
|
|
206
|
+
`This AI insight is already ${insight.status.toLowerCase()} and cannot be resolved again.`,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
90
210
|
await this.updateOneById({
|
|
91
211
|
id: insight.id,
|
|
92
212
|
data: {
|
|
@@ -99,6 +99,40 @@ export class Service extends DatabaseService<Model> {
|
|
|
99
99
|
return result.affected || 0;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
+
/*
|
|
103
|
+
* Persist the AI-written TL;DR of a completed investigation's analysis.
|
|
104
|
+
* Display-only, so this is a plain conditional UPDATE rather than a claim,
|
|
105
|
+
* but it is still write-once: scoped to the run, to the Completed state,
|
|
106
|
+
* and to a row that has no summary yet.
|
|
107
|
+
*
|
|
108
|
+
* The IS NULL guard is what makes the invariant structural rather than
|
|
109
|
+
* incidental. A stale attempt — one that lost the Completed CAS because the
|
|
110
|
+
* sweeper falsely requeued it — is kept out today only by statement order
|
|
111
|
+
* in the engine, and by then the WINNER has already written both the report
|
|
112
|
+
* and its summary, so a status-only guard would happily let the loser
|
|
113
|
+
* overwrite a summary that describes a different analysis. Returns the rows
|
|
114
|
+
* changed; 0 means the run moved on, was removed, or is already summarized.
|
|
115
|
+
*/
|
|
116
|
+
@CaptureSpan()
|
|
117
|
+
public async setInvestigationAnalysisTldr(data: {
|
|
118
|
+
aiRunId: ObjectID;
|
|
119
|
+
analysisTldr: string;
|
|
120
|
+
}): Promise<number> {
|
|
121
|
+
const result: UpdateResult = await this.getRepository()
|
|
122
|
+
.createQueryBuilder()
|
|
123
|
+
.update(Model)
|
|
124
|
+
.set({
|
|
125
|
+
analysisTldr: data.analysisTldr,
|
|
126
|
+
} as QueryDeepPartialEntity<Model>)
|
|
127
|
+
.where('"_id" = :id', { id: data.aiRunId.toString() })
|
|
128
|
+
.andWhere('"status" = :status', { status: AIRunStatus.Completed })
|
|
129
|
+
.andWhere('"analysisTldr" IS NULL')
|
|
130
|
+
.andWhere('"deletedAt" IS NULL')
|
|
131
|
+
.execute();
|
|
132
|
+
|
|
133
|
+
return result.affected || 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
102
136
|
/*
|
|
103
137
|
* Atomically settle the code-fix decision written as Pending by the
|
|
104
138
|
* winning investigation completion transition. The recommendation and
|
|
@@ -88,6 +88,15 @@ export const AI_INVESTIGATION_GRADING_FEATURE: string =
|
|
|
88
88
|
export const AI_CONFIDENCE_CLASSIFICATION_FEATURE: string =
|
|
89
89
|
"AI Confidence Classification";
|
|
90
90
|
|
|
91
|
+
/*
|
|
92
|
+
* The LlmLog feature name for the investigation TL;DR (InvestigationTldr) —
|
|
93
|
+
* one constrained call per completed investigation that has an analysis,
|
|
94
|
+
* outside the per-run caps but inside this daily budget. A budget rejection
|
|
95
|
+
* (or any other failure) simply leaves the run without a TL;DR; the report
|
|
96
|
+
* is still published and the panel omits the block.
|
|
97
|
+
*/
|
|
98
|
+
export const AI_INVESTIGATION_TLDR_FEATURE: string = "AI Investigation TLDR";
|
|
99
|
+
|
|
91
100
|
/*
|
|
92
101
|
* The LlmLog feature name for server-mediated code-fix agent completions
|
|
93
102
|
* (B4 Tier 0) — the in-house coding agent's tool loop routes every LLM call
|
|
@@ -196,6 +205,12 @@ export const AUTONOMOUS_AI_FEATURES: Array<string> = [
|
|
|
196
205
|
AI_INVESTIGATION_GRADING_FEATURE,
|
|
197
206
|
// One constrained call per completed investigation (ConfidenceSignal).
|
|
198
207
|
AI_CONFIDENCE_CLASSIFICATION_FEATURE,
|
|
208
|
+
/*
|
|
209
|
+
* One constrained call per completed investigation that produced an
|
|
210
|
+
* analysis (InvestigationTldr) — same storm shape as the classification
|
|
211
|
+
* above, so the same daily budget must cover it.
|
|
212
|
+
*/
|
|
213
|
+
AI_INVESTIGATION_TLDR_FEATURE,
|
|
199
214
|
/*
|
|
200
215
|
* Server-mediated code-fix agent completions (B4 Tier 0). Fix runs are
|
|
201
216
|
* user-triggered, but the tool loop then runs unattended for up to ~40
|
|
@@ -563,9 +578,9 @@ export class Service extends BaseService {
|
|
|
563
578
|
|
|
564
579
|
if (budget.exhausted) {
|
|
565
580
|
const settingsLocation: string = request.incidentId
|
|
566
|
-
? "Incidents >
|
|
581
|
+
? "Incidents > AI > Investigation"
|
|
567
582
|
: request.alertId
|
|
568
|
-
? "Alerts >
|
|
583
|
+
? "Alerts > AI > Investigation"
|
|
569
584
|
: "Project Settings > AI > AI Guardrails";
|
|
570
585
|
const budgetMessage: string = `Daily autonomous AI token budget exhausted (${budget.usedTokensToday.toLocaleString()} of ${budget.limitInTokens?.toLocaleString()} tokens used today). Autonomous AI requests resume tomorrow (UTC) — raise or unset the limit under ${settingsLocation}.`;
|
|
571
586
|
|
|
@@ -39,6 +39,7 @@ import { IsBillingEnabled } from "../EnvironmentConfig";
|
|
|
39
39
|
import logger, { LogAttributes } from "../Utils/Logger";
|
|
40
40
|
import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
|
|
41
41
|
import TelemetryUtil from "../Utils/Telemetry/Telemetry";
|
|
42
|
+
import MetricResourceAttributeUtil from "../../Utils/Metrics/MetricResourceAttributeUtil";
|
|
42
43
|
import MutableMetricService from "./MutableMetricService";
|
|
43
44
|
import GlobalConfigService from "./GlobalConfigService";
|
|
44
45
|
import GlobalConfig from "../../Models/DatabaseModels/GlobalConfig";
|
|
@@ -1616,6 +1617,16 @@ ${alertSeverity.name}
|
|
|
1616
1617
|
_id: true,
|
|
1617
1618
|
name: true,
|
|
1618
1619
|
},
|
|
1620
|
+
/*
|
|
1621
|
+
* A project's own taxonomy. Both become metric attributes below so
|
|
1622
|
+
* dashboards can group MTTA/MTTR by the dimensions the project
|
|
1623
|
+
* actually thinks in.
|
|
1624
|
+
*/
|
|
1625
|
+
labels: {
|
|
1626
|
+
_id: true,
|
|
1627
|
+
name: true,
|
|
1628
|
+
},
|
|
1629
|
+
customFields: true,
|
|
1619
1630
|
},
|
|
1620
1631
|
props: {
|
|
1621
1632
|
isRoot: true,
|
|
@@ -1692,6 +1703,29 @@ ${alertSeverity.name}
|
|
|
1692
1703
|
metricRetentionDays,
|
|
1693
1704
|
);
|
|
1694
1705
|
|
|
1706
|
+
/*
|
|
1707
|
+
* Dimensions shared by every alert metric. Built once so all four
|
|
1708
|
+
* metrics below record the identical attribute set — a dashboard that
|
|
1709
|
+
* groups by oneuptime.label.product must not find the dimension on
|
|
1710
|
+
* AlertCount but missing from TimeToResolve.
|
|
1711
|
+
*/
|
|
1712
|
+
const baseMetricAttributes: JSONObject = {
|
|
1713
|
+
alertId: data.alertId.toString(),
|
|
1714
|
+
projectId: alert.projectId.toString(),
|
|
1715
|
+
monitorId: alert.monitor?._id?.toString(),
|
|
1716
|
+
monitorName: alert.monitor?.name?.toString(),
|
|
1717
|
+
alertSeverityId: alert.alertSeverity?._id?.toString(),
|
|
1718
|
+
alertSeverityName: alert.alertSeverity?.name?.toString(),
|
|
1719
|
+
/*
|
|
1720
|
+
* oneuptime.label.* / oneuptime.customField.* — namespaced, so they can
|
|
1721
|
+
* never collide with the unprefixed dimensions above.
|
|
1722
|
+
*/
|
|
1723
|
+
...MetricResourceAttributeUtil.getResourceAttributes({
|
|
1724
|
+
labels: alert.labels,
|
|
1725
|
+
customFields: alert.customFields,
|
|
1726
|
+
}),
|
|
1727
|
+
};
|
|
1728
|
+
|
|
1695
1729
|
// now we need to create new metrics for this alert - TimeToAcknowledge, TimeToResolve, AlertCount, AlertDuration
|
|
1696
1730
|
const alertStartsAt: Date =
|
|
1697
1731
|
firstAlertStateTimeline?.startsAt ||
|
|
@@ -1714,14 +1748,7 @@ ${alertSeverity.name}
|
|
|
1714
1748
|
alertCountMetric.name = AlertMetricType.AlertCount;
|
|
1715
1749
|
alertCountMetric.metricPointId = AlertMetricType.AlertCount;
|
|
1716
1750
|
alertCountMetric.value = 1;
|
|
1717
|
-
alertCountMetric.attributes = {
|
|
1718
|
-
alertId: data.alertId.toString(),
|
|
1719
|
-
projectId: alert.projectId.toString(),
|
|
1720
|
-
monitorId: alert.monitor?._id?.toString(),
|
|
1721
|
-
monitorName: alert.monitor?.name?.toString(),
|
|
1722
|
-
alertSeverityId: alert.alertSeverity?._id?.toString(),
|
|
1723
|
-
alertSeverityName: alert.alertSeverity?.name?.toString(),
|
|
1724
|
-
};
|
|
1751
|
+
alertCountMetric.attributes = { ...baseMetricAttributes };
|
|
1725
1752
|
alertCountMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
|
|
1726
1753
|
alertCountMetric.attributes,
|
|
1727
1754
|
);
|
|
@@ -1768,14 +1795,7 @@ ${alertSeverity.name}
|
|
|
1768
1795
|
ackAlertStateTimeline?.startsAt || OneUptimeDate.getCurrentDate(),
|
|
1769
1796
|
alertStartsAt,
|
|
1770
1797
|
);
|
|
1771
|
-
timeToAcknowledgeMetric.attributes = {
|
|
1772
|
-
alertId: data.alertId.toString(),
|
|
1773
|
-
projectId: alert.projectId.toString(),
|
|
1774
|
-
monitorId: alert.monitor?._id?.toString(),
|
|
1775
|
-
monitorName: alert.monitor?.name?.toString(),
|
|
1776
|
-
alertSeverityId: alert.alertSeverity?._id?.toString(),
|
|
1777
|
-
alertSeverityName: alert.alertSeverity?.name?.toString(),
|
|
1778
|
-
};
|
|
1798
|
+
timeToAcknowledgeMetric.attributes = { ...baseMetricAttributes };
|
|
1779
1799
|
timeToAcknowledgeMetric.attributeKeys =
|
|
1780
1800
|
TelemetryUtil.getAttributeKeys(timeToAcknowledgeMetric.attributes);
|
|
1781
1801
|
|
|
@@ -1825,14 +1845,7 @@ ${alertSeverity.name}
|
|
|
1825
1845
|
OneUptimeDate.getCurrentDate(),
|
|
1826
1846
|
alertStartsAt,
|
|
1827
1847
|
);
|
|
1828
|
-
timeToResolveMetric.attributes = {
|
|
1829
|
-
alertId: data.alertId.toString(),
|
|
1830
|
-
projectId: alert.projectId.toString(),
|
|
1831
|
-
monitorId: alert.monitor?._id?.toString(),
|
|
1832
|
-
monitorName: alert.monitor?.name?.toString(),
|
|
1833
|
-
alertSeverityId: alert.alertSeverity?._id?.toString(),
|
|
1834
|
-
alertSeverityName: alert.alertSeverity?.name?.toString(),
|
|
1835
|
-
};
|
|
1848
|
+
timeToResolveMetric.attributes = { ...baseMetricAttributes };
|
|
1836
1849
|
timeToResolveMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
|
|
1837
1850
|
timeToResolveMetric.attributes,
|
|
1838
1851
|
);
|
|
@@ -1872,14 +1885,7 @@ ${alertSeverity.name}
|
|
|
1872
1885
|
alertEndsAt,
|
|
1873
1886
|
alertStartsAt,
|
|
1874
1887
|
);
|
|
1875
|
-
alertDurationMetric.attributes = {
|
|
1876
|
-
alertId: data.alertId.toString(),
|
|
1877
|
-
projectId: alert.projectId.toString(),
|
|
1878
|
-
monitorId: alert.monitor?._id?.toString(),
|
|
1879
|
-
monitorName: alert.monitor?.name?.toString(),
|
|
1880
|
-
alertSeverityId: alert.alertSeverity?._id?.toString(),
|
|
1881
|
-
alertSeverityName: alert.alertSeverity?.name?.toString(),
|
|
1882
|
-
};
|
|
1888
|
+
alertDurationMetric.attributes = { ...baseMetricAttributes };
|
|
1883
1889
|
alertDurationMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
|
|
1884
1890
|
alertDurationMetric.attributes,
|
|
1885
1891
|
);
|
|
@@ -175,10 +175,14 @@ export const MigrationExecuteOptions: ClickhouseExecuteOptions = {
|
|
|
175
175
|
* TelemetryFanInWriter can consume deterministic tokens without an import
|
|
176
176
|
* cycle. Re-exported here for existing callers.
|
|
177
177
|
*
|
|
178
|
-
*
|
|
179
|
-
* (
|
|
180
|
-
*
|
|
181
|
-
*
|
|
178
|
+
* The ack mode is independent of tokening: TELEMETRY_WAIT_FOR_ASYNC_INSERT
|
|
179
|
+
* (shouldWaitForAsyncInsert below) is applied to EVERY insertJsonRows call,
|
|
180
|
+
* with or without a dedup token. Whether a telemetry queue job's writes
|
|
181
|
+
* carry per-job tokens from this context is a separate policy decided in
|
|
182
|
+
* the worker: the high-volume signals (traces/logs/metrics) run untokened
|
|
183
|
+
* so the fan-in writer can merge them into cross-job INSERTs under minted
|
|
184
|
+
* per-batch tokens — see shouldUseInsertDedup in
|
|
185
|
+
* App/FeatureSet/Telemetry/Jobs/TelemetryIngest/ProcessTelemetry.ts.
|
|
182
186
|
*/
|
|
183
187
|
export {
|
|
184
188
|
runWithInsertDedup,
|