@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
|
@@ -38,35 +38,47 @@ function CaptureSpan(data?: {
|
|
|
38
38
|
data?.name || `${className}.${propertyKey}`;
|
|
39
39
|
|
|
40
40
|
descriptor.value = function (...args: any[]) {
|
|
41
|
-
|
|
41
|
+
/*
|
|
42
|
+
* Skip the span machinery entirely when telemetry is disabled OR no
|
|
43
|
+
* span exporter is installed. Without an exporter the span is never
|
|
44
|
+
* shipped anywhere, but creating it still costs attribute flattening,
|
|
45
|
+
* a span allocation, and an AsyncLocalStorage context transition —
|
|
46
|
+
* decorated methods sit on ingest hot paths that run millions of
|
|
47
|
+
* times per minute, so this must be a plain method call there.
|
|
48
|
+
*/
|
|
49
|
+
if (DisableTelemetry || !Telemetry.isSpanExportEnabled()) {
|
|
42
50
|
return originalMethod.apply(this, args);
|
|
43
51
|
}
|
|
44
52
|
|
|
45
|
-
|
|
53
|
+
/*
|
|
54
|
+
* Only pay for attribute flattening when there is something to
|
|
55
|
+
* flatten — the overwhelmingly common bare @CaptureSpan() form has
|
|
56
|
+
* neither captured arguments nor static attributes.
|
|
57
|
+
*/
|
|
58
|
+
let spanAttributes: { [key: string]: any } | undefined = undefined;
|
|
46
59
|
|
|
47
|
-
if (data?.captureArguments) {
|
|
48
|
-
functionArguments =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
60
|
+
if (data?.captureArguments || data?.attributes) {
|
|
61
|
+
let functionArguments: JSONObject = {};
|
|
62
|
+
|
|
63
|
+
if (data?.captureArguments) {
|
|
64
|
+
functionArguments = args.reduce(
|
|
65
|
+
(acc: { [key: string]: any }, arg: any, index: number) => {
|
|
66
|
+
acc[`arg${index}`] = arg;
|
|
67
|
+
return acc;
|
|
68
|
+
},
|
|
69
|
+
{},
|
|
70
|
+
);
|
|
71
|
+
}
|
|
56
72
|
|
|
57
|
-
|
|
58
|
-
JSONFunctions.flattenObject({
|
|
73
|
+
spanAttributes = JSONFunctions.flattenObject({
|
|
59
74
|
...functionArguments,
|
|
60
75
|
...data?.attributes,
|
|
61
76
|
}) as { [key: string]: any };
|
|
77
|
+
}
|
|
62
78
|
|
|
63
79
|
return Telemetry.startActiveSpan({
|
|
64
80
|
name: name,
|
|
65
|
-
options: {
|
|
66
|
-
attributes: {
|
|
67
|
-
...spanAttributes,
|
|
68
|
-
},
|
|
69
|
-
},
|
|
81
|
+
options: spanAttributes ? { attributes: spanAttributes } : {},
|
|
70
82
|
fn: (span: Span) => {
|
|
71
83
|
let result: any = null;
|
|
72
84
|
try {
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Per-second memo for the wall-clock stamps every ingested telemetry row
|
|
5
|
+
* carries (createdAt and retentionDate, both stored with second
|
|
6
|
+
* granularity).
|
|
7
|
+
*
|
|
8
|
+
* The Otel logs / traces / metrics row builders used to derive these per
|
|
9
|
+
* row: a current-Date allocation, a ClickHouse DateTime format, a
|
|
10
|
+
* moment-based add-days, and a second format — for every log record, span,
|
|
11
|
+
* and metric datapoint. All of that output only changes once per second
|
|
12
|
+
* (createdAt has no sub-second component) and once per distinct retention
|
|
13
|
+
* window, so a burst of rows in the same second re-derived identical
|
|
14
|
+
* strings millions of times. This memo pays the derivation once per second
|
|
15
|
+
* (and once per retention window within that second) instead.
|
|
16
|
+
*
|
|
17
|
+
* Not thread-shared state to worry about: workers are single-threaded, and
|
|
18
|
+
* the memo is replaced wholesale when the second rolls over, so the map of
|
|
19
|
+
* retention strings can never grow past the number of distinct retention
|
|
20
|
+
* windows seen within one second.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export interface IngestionStamp {
|
|
24
|
+
/** Current time truncated to the second the stamp was minted. */
|
|
25
|
+
date: Date;
|
|
26
|
+
/** ClickHouse DateTime string ("YYYY-MM-DD HH:mm:ss", UTC) of `date`. */
|
|
27
|
+
db: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type CachedStamp = IngestionStamp & {
|
|
31
|
+
epochSecond: number;
|
|
32
|
+
retentionDbByDays: Map<number, string>;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
let cachedStamp: CachedStamp | null = null;
|
|
36
|
+
|
|
37
|
+
export function getIngestionStamp(): IngestionStamp {
|
|
38
|
+
const epochSecond: number = Math.floor(Date.now() / 1000);
|
|
39
|
+
|
|
40
|
+
if (!cachedStamp || cachedStamp.epochSecond !== epochSecond) {
|
|
41
|
+
const date: Date = new Date(epochSecond * 1000);
|
|
42
|
+
cachedStamp = {
|
|
43
|
+
epochSecond: epochSecond,
|
|
44
|
+
date: date,
|
|
45
|
+
db: OneUptimeDate.toClickhouseDateTime(date),
|
|
46
|
+
retentionDbByDays: new Map<number, string>(),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return cachedStamp;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* ClickHouse DateTime string for `stamp.date + retentionDays`, memoized per
|
|
55
|
+
* (stamp second, retention window). Must be called with a stamp obtained
|
|
56
|
+
* from getIngestionStamp() in the same row-building pass, so the retention
|
|
57
|
+
* date stays consistent with the row's createdAt.
|
|
58
|
+
*/
|
|
59
|
+
export function getRetentionDateDb(
|
|
60
|
+
stamp: IngestionStamp,
|
|
61
|
+
retentionDays: number,
|
|
62
|
+
): string {
|
|
63
|
+
const cached: CachedStamp = stamp as CachedStamp;
|
|
64
|
+
|
|
65
|
+
let db: string | undefined = cached.retentionDbByDays?.get(retentionDays);
|
|
66
|
+
|
|
67
|
+
if (db === undefined) {
|
|
68
|
+
db = OneUptimeDate.toClickhouseDateTime(
|
|
69
|
+
OneUptimeDate.addRemoveDays(stamp.date, retentionDays),
|
|
70
|
+
);
|
|
71
|
+
cached.retentionDbByDays?.set(retentionDays, db);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return db;
|
|
75
|
+
}
|
|
@@ -3,6 +3,7 @@ import QueryDeepPartialEntity from "../../../Types/Database/PartialEntity";
|
|
|
3
3
|
import ObjectID from "../../../Types/ObjectID";
|
|
4
4
|
import DatabaseService from "../../Services/DatabaseService";
|
|
5
5
|
import GlobalCache from "../../Infrastructure/GlobalCache";
|
|
6
|
+
import InProcessMemo from "../InProcessMemo";
|
|
6
7
|
import SingleFlight from "../SingleFlight";
|
|
7
8
|
import logger from "../Logger";
|
|
8
9
|
|
|
@@ -116,10 +117,55 @@ function writeWindowNamespace(cacheNamespace: string): string {
|
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
export default class ResourceHeartbeat {
|
|
120
|
+
/*
|
|
121
|
+
* Time-based L1 over the whole gate cascade. SingleFlight collapses
|
|
122
|
+
* CONCURRENT duplicates, but sequential batches — the next job for the
|
|
123
|
+
* same host arriving a second later — each still paid 1-3 Redis round
|
|
124
|
+
* trips (liveness SET NX, fingerprint compare-and-claim, rate-limit
|
|
125
|
+
* SET NX) to be told "nothing to do". Once THIS process has settled a
|
|
126
|
+
* heartbeat for a (resource, fingerprint), that answer holds for the
|
|
127
|
+
* rest of the window, so re-asking Redis per batch buys nothing.
|
|
128
|
+
*
|
|
129
|
+
* The memo key includes the FINGERPRINT, so a genuinely changed payload
|
|
130
|
+
* bypasses the memo and reaches the compare-and-claim gate as promptly
|
|
131
|
+
* as it did before — the L1 only ever suppresses re-asking a question
|
|
132
|
+
* whose inputs are identical.
|
|
133
|
+
*
|
|
134
|
+
* Entries live for min(60s, the caller's liveness window, pre-jitter).
|
|
135
|
+
* Within that span the Redis liveness key this process (or another pod)
|
|
136
|
+
* claimed cannot have expired yet (its jittered TTL is >= the window),
|
|
137
|
+
* so a skipped probe would have been refused anyway. The one real trade
|
|
138
|
+
* is cross-pod lastSeen PRECISION: when a DIFFERENT pod's claim expires
|
|
139
|
+
* mid-window, this pod would previously have won the reopened gate on
|
|
140
|
+
* its next batch, and now reacts up to one memo TTL later (any other pod
|
|
141
|
+
* still reacts immediately). That delay is bounded by the existing
|
|
142
|
+
* window — the same staleness the jittered TTL already permits — and
|
|
143
|
+
* sits far inside the 15-minute markDisconnected* thresholds.
|
|
144
|
+
*
|
|
145
|
+
* Outcomes that must retry are NEVER memoized: a failed or lock-skipped
|
|
146
|
+
* metadata write (those release their Redis gates precisely so the next
|
|
147
|
+
* batch retries) and any outcome where a gate probe threw (a Redis
|
|
148
|
+
* outage must keep failing open per batch, not once per memo TTL).
|
|
149
|
+
*/
|
|
150
|
+
private static readonly recentHeartbeatMemo: InProcessMemo<boolean> =
|
|
151
|
+
new InProcessMemo<boolean>({
|
|
152
|
+
ttlInMs: 60 * 1000,
|
|
153
|
+
maxEntries: 10_000,
|
|
154
|
+
});
|
|
155
|
+
|
|
119
156
|
public static async write<TBaseModel extends BaseModel>(
|
|
120
157
|
input: ResourceHeartbeatWrite<TBaseModel>,
|
|
121
158
|
): Promise<void> {
|
|
122
159
|
const cacheKey: string = input.id.toString();
|
|
160
|
+
const memoKey: string = `${input.cacheNamespace}:${cacheKey}:${input.fingerprint}`;
|
|
161
|
+
|
|
162
|
+
/*
|
|
163
|
+
* L1: this process already settled this exact heartbeat within the
|
|
164
|
+
* window. Zero network cost, no gates touched.
|
|
165
|
+
*/
|
|
166
|
+
if (this.recentHeartbeatMemo.get(memoKey)) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
123
169
|
|
|
124
170
|
/*
|
|
125
171
|
* Collapse duplicate concurrent callers inside THIS process first. One
|
|
@@ -128,18 +174,41 @@ export default class ResourceHeartbeat {
|
|
|
128
174
|
* and without this every one of them independently asks Redis the same
|
|
129
175
|
* question and throws the answer away.
|
|
130
176
|
*/
|
|
131
|
-
await SingleFlight.run(
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
177
|
+
await SingleFlight.run(memoKey, async () => {
|
|
178
|
+
await this.writeOnce(input, cacheKey, memoKey);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Drop the recent-heartbeat memo. For tests only — suites that reuse one
|
|
184
|
+
* resource id across cases simulate the memo TTL expiring with this, the
|
|
185
|
+
* same way they already clear their fake Redis maps and SingleFlight.
|
|
186
|
+
*/
|
|
187
|
+
public static clearRecentHeartbeatMemo(): void {
|
|
188
|
+
this.recentHeartbeatMemo.clear();
|
|
137
189
|
}
|
|
138
190
|
|
|
139
191
|
private static async writeOnce<TBaseModel extends BaseModel>(
|
|
140
192
|
input: ResourceHeartbeatWrite<TBaseModel>,
|
|
141
193
|
cacheKey: string,
|
|
194
|
+
memoKey: string,
|
|
142
195
|
): Promise<void> {
|
|
196
|
+
/*
|
|
197
|
+
* Whether every Redis gate we consulted actually answered. A probe that
|
|
198
|
+
* THREW fell back to a hardcoded outcome (open for liveness, closed for
|
|
199
|
+
* enrichment) — that outcome is a per-batch policy, not a fact about the
|
|
200
|
+
* window, so it must never be memoized into the L1.
|
|
201
|
+
*/
|
|
202
|
+
let gatesAnswered: boolean = true;
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* The memo must expire no later than the PRE-JITTER window, because that
|
|
206
|
+
* is the earliest instant the Redis liveness key claimed alongside it
|
|
207
|
+
* could expire — and never later than the 60-second norm.
|
|
208
|
+
*/
|
|
209
|
+
const memoTtlInMs: number =
|
|
210
|
+
Math.min(60, Math.max(input.throttleInSeconds, 0)) * 1000;
|
|
211
|
+
|
|
143
212
|
/*
|
|
144
213
|
* Liveness gate. Presence-only and jittered: a fleet-wide restart would
|
|
145
214
|
* otherwise re-synchronise every resource's window and rebuild the herd on
|
|
@@ -163,6 +232,7 @@ export default class ResourceHeartbeat {
|
|
|
163
232
|
* the write below cannot queue.
|
|
164
233
|
*/
|
|
165
234
|
writeLiveness = true;
|
|
235
|
+
gatesAnswered = false;
|
|
166
236
|
}
|
|
167
237
|
|
|
168
238
|
const hasMetadata: boolean =
|
|
@@ -194,6 +264,7 @@ export default class ResourceHeartbeat {
|
|
|
194
264
|
* write storm this exists to prevent.
|
|
195
265
|
*/
|
|
196
266
|
metadataChanged = false;
|
|
267
|
+
gatesAnswered = false;
|
|
197
268
|
}
|
|
198
269
|
}
|
|
199
270
|
|
|
@@ -218,11 +289,19 @@ export default class ResourceHeartbeat {
|
|
|
218
289
|
);
|
|
219
290
|
} catch {
|
|
220
291
|
writeMetadata = false;
|
|
292
|
+
gatesAnswered = false;
|
|
221
293
|
}
|
|
222
294
|
}
|
|
223
295
|
|
|
224
296
|
if (!writeLiveness && !writeMetadata) {
|
|
225
|
-
|
|
297
|
+
/*
|
|
298
|
+
* Nothing to say. Issue no statement at all — and remember that for
|
|
299
|
+
* the memo TTL, since every gate answered and the same inputs can
|
|
300
|
+
* only produce the same silence for the rest of the window.
|
|
301
|
+
*/
|
|
302
|
+
if (gatesAnswered) {
|
|
303
|
+
this.recentHeartbeatMemo.set(memoKey, true, memoTtlInMs);
|
|
304
|
+
}
|
|
226
305
|
return;
|
|
227
306
|
}
|
|
228
307
|
|
|
@@ -283,6 +362,19 @@ export default class ResourceHeartbeat {
|
|
|
283
362
|
* statement that returns immediately when contended.
|
|
284
363
|
*/
|
|
285
364
|
await this.releaseGates(input.cacheNamespace, cacheKey, true);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/*
|
|
369
|
+
* The write LANDED: nothing is left for this exact input to do this
|
|
370
|
+
* window, so remember that. Memoized only when every gate genuinely
|
|
371
|
+
* answered (an outage outcome is per-batch policy, never a fact) and
|
|
372
|
+
* NOT for the liveness-only lock-skip above `wrote === false` — that
|
|
373
|
+
* case is rare, already free of gate churn next batch, and memoizing
|
|
374
|
+
* a write we did not perform is a subtlety not worth carrying.
|
|
375
|
+
*/
|
|
376
|
+
if (wrote && gatesAnswered) {
|
|
377
|
+
this.recentHeartbeatMemo.set(memoKey, true, memoTtlInMs);
|
|
286
378
|
}
|
|
287
379
|
}
|
|
288
380
|
|
|
@@ -451,7 +451,6 @@ export default class TelemetryUtil {
|
|
|
451
451
|
};
|
|
452
452
|
}
|
|
453
453
|
|
|
454
|
-
@CaptureSpan()
|
|
455
454
|
public static getAttributes(data: {
|
|
456
455
|
prefixKeysWithString: string;
|
|
457
456
|
items: JSONArray;
|
|
@@ -655,4 +654,116 @@ export default class TelemetryUtil {
|
|
|
655
654
|
|
|
656
655
|
return Object.keys(attributes).sort();
|
|
657
656
|
}
|
|
657
|
+
|
|
658
|
+
/*
|
|
659
|
+
* OTLP scope attributes, prefixed for row storage. The three OTel ingest
|
|
660
|
+
* services stamp every key of the scope envelope onto the row's attribute
|
|
661
|
+
* map under a `scope.` prefix. The scope object is invariant for every
|
|
662
|
+
* record/span/datapoint inside its scopeLogs/scopeSpans/scopeMetrics
|
|
663
|
+
* envelope, so callers build this map ONCE per scope and merge it per row
|
|
664
|
+
* — instead of re-deriving the prefixed key strings for every row, which
|
|
665
|
+
* was a visible per-record cost on large batches.
|
|
666
|
+
*
|
|
667
|
+
* A missing/empty scope returns an empty map, which merges to a no-op —
|
|
668
|
+
* exactly what the previous inline `if (scope && keys.length > 0)` guard
|
|
669
|
+
* produced.
|
|
670
|
+
*/
|
|
671
|
+
public static getPrefixedScopeAttributes(
|
|
672
|
+
scope: JSONObject | undefined | null,
|
|
673
|
+
): Dictionary<AttributeType | Array<AttributeType>> {
|
|
674
|
+
const prefixedScopeAttributes: Dictionary<
|
|
675
|
+
AttributeType | Array<AttributeType>
|
|
676
|
+
> = {};
|
|
677
|
+
|
|
678
|
+
if (!scope || typeof scope !== "object") {
|
|
679
|
+
return prefixedScopeAttributes;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
for (const key of Object.keys(scope)) {
|
|
683
|
+
prefixedScopeAttributes[`scope.${key}`] = scope[key] as AttributeType;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
return prefixedScopeAttributes;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/*
|
|
690
|
+
* Sorted attribute-key union for rows whose attribute map is "large
|
|
691
|
+
* invariant base + few per-row keys" (metric datapoints). Produces exactly
|
|
692
|
+
* `Object.keys(mergedAttributes).sort()` — same elements, same order —
|
|
693
|
+
* without re-sorting the full key set per row:
|
|
694
|
+
*
|
|
695
|
+
* - `sortedBaseAttributeKeys` is the base map's key list, sorted once by
|
|
696
|
+
* the caller (per metric, not per datapoint);
|
|
697
|
+
* - `additionalAttributeKeys` is the per-row key list (typically 0-5
|
|
698
|
+
* keys), sorted here at its own tiny cost;
|
|
699
|
+
* - a linear two-pointer merge then yields the sorted, de-duplicated
|
|
700
|
+
* union.
|
|
701
|
+
*
|
|
702
|
+
* Order equivalence holds because Array.prototype.sort's default
|
|
703
|
+
* comparator orders strings by UTF-16 code units, and the `<` / `>`
|
|
704
|
+
* relational operators used in the merge apply the same code-unit
|
|
705
|
+
* comparison — so merging two lists sorted by that comparator gives the
|
|
706
|
+
* same sequence a full sort of the union would.
|
|
707
|
+
*
|
|
708
|
+
* Precondition: each input list is duplicate-free (both come from
|
|
709
|
+
* Object.keys, whose output cannot repeat a key). Duplicates ACROSS the
|
|
710
|
+
* two lists (a per-row key overriding a base key) collapse to one entry,
|
|
711
|
+
* matching Object.keys on the merged map.
|
|
712
|
+
*/
|
|
713
|
+
public static mergeAttributeKeysWithSortedBase(data: {
|
|
714
|
+
sortedBaseAttributeKeys: Array<string>;
|
|
715
|
+
additionalAttributeKeys: Array<string>;
|
|
716
|
+
}): Array<string> {
|
|
717
|
+
const { sortedBaseAttributeKeys, additionalAttributeKeys } = data;
|
|
718
|
+
|
|
719
|
+
/*
|
|
720
|
+
* Always return a fresh array: rows must never share an attributeKeys
|
|
721
|
+
* reference, because downstream pipeline rules replace a row's key list
|
|
722
|
+
* independently of its siblings.
|
|
723
|
+
*/
|
|
724
|
+
if (additionalAttributeKeys.length === 0) {
|
|
725
|
+
return sortedBaseAttributeKeys.slice();
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
const sortedAdditionalKeys: Array<string> = additionalAttributeKeys
|
|
729
|
+
.slice()
|
|
730
|
+
.sort();
|
|
731
|
+
|
|
732
|
+
const mergedKeys: Array<string> = [];
|
|
733
|
+
let baseIndex: number = 0;
|
|
734
|
+
let additionalIndex: number = 0;
|
|
735
|
+
|
|
736
|
+
while (
|
|
737
|
+
baseIndex < sortedBaseAttributeKeys.length &&
|
|
738
|
+
additionalIndex < sortedAdditionalKeys.length
|
|
739
|
+
) {
|
|
740
|
+
const baseKey: string = sortedBaseAttributeKeys[baseIndex]!;
|
|
741
|
+
const additionalKey: string = sortedAdditionalKeys[additionalIndex]!;
|
|
742
|
+
|
|
743
|
+
if (baseKey < additionalKey) {
|
|
744
|
+
mergedKeys.push(baseKey);
|
|
745
|
+
baseIndex++;
|
|
746
|
+
} else if (baseKey > additionalKey) {
|
|
747
|
+
mergedKeys.push(additionalKey);
|
|
748
|
+
additionalIndex++;
|
|
749
|
+
} else {
|
|
750
|
+
// Same key in base and per-row attributes — the map holds it once.
|
|
751
|
+
mergedKeys.push(baseKey);
|
|
752
|
+
baseIndex++;
|
|
753
|
+
additionalIndex++;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
while (baseIndex < sortedBaseAttributeKeys.length) {
|
|
758
|
+
mergedKeys.push(sortedBaseAttributeKeys[baseIndex]!);
|
|
759
|
+
baseIndex++;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
while (additionalIndex < sortedAdditionalKeys.length) {
|
|
763
|
+
mergedKeys.push(sortedAdditionalKeys[additionalIndex]!);
|
|
764
|
+
additionalIndex++;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
return mergedKeys;
|
|
768
|
+
}
|
|
658
769
|
}
|
|
@@ -87,6 +87,13 @@ export enum SpanStatusCode {
|
|
|
87
87
|
ERROR = 2,
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
/*
|
|
91
|
+
* Tells a descriptive error `code` ("ECONNREFUSED") from one that is really a
|
|
92
|
+
* status number in disguise (an HTTP status, a Postgres SQLSTATE). See
|
|
93
|
+
* Telemetry.getExceptionTypeName.
|
|
94
|
+
*/
|
|
95
|
+
const NUMERIC_ONLY_REGEX: RegExp = /^\d+$/;
|
|
96
|
+
|
|
90
97
|
export default class Telemetry {
|
|
91
98
|
public static sdk: opentelemetry.NodeSDK | null = null;
|
|
92
99
|
|
|
@@ -102,6 +109,20 @@ export default class Telemetry {
|
|
|
102
109
|
|
|
103
110
|
public static serviceName: string | null = null;
|
|
104
111
|
|
|
112
|
+
/*
|
|
113
|
+
* True only when init() installed a real OTLP span exporter. @CaptureSpan
|
|
114
|
+
* consults this to skip span creation entirely on deployments that never
|
|
115
|
+
* export traces — without an exporter the spans go nowhere, but the wrapper
|
|
116
|
+
* would still pay attribute flattening, span allocation, and an
|
|
117
|
+
* AsyncLocalStorage context switch on every decorated call, which includes
|
|
118
|
+
* hot ingest paths that run millions of times per minute.
|
|
119
|
+
*/
|
|
120
|
+
private static spanExportEnabled: boolean = false;
|
|
121
|
+
|
|
122
|
+
public static isSpanExportEnabled(): boolean {
|
|
123
|
+
return this.spanExportEnabled;
|
|
124
|
+
}
|
|
125
|
+
|
|
105
126
|
public static getHeaders(): Dictionary<string> {
|
|
106
127
|
if (!process.env["OPENTELEMETRY_EXPORTER_OTLP_HEADERS"]) {
|
|
107
128
|
return {};
|
|
@@ -192,6 +213,7 @@ export default class Telemetry {
|
|
|
192
213
|
headers: headers,
|
|
193
214
|
compression: CompressionAlgorithm.GZIP,
|
|
194
215
|
}) as unknown as SpanExporter;
|
|
216
|
+
this.spanExportEnabled = true;
|
|
195
217
|
}
|
|
196
218
|
|
|
197
219
|
if (this.getOltpMetricsEndpoint() && hasHeaders) {
|
|
@@ -546,7 +568,36 @@ export default class Telemetry {
|
|
|
546
568
|
* empty "Error" status.
|
|
547
569
|
*/
|
|
548
570
|
span.setAttributes(exceptionAttributes);
|
|
549
|
-
|
|
571
|
+
|
|
572
|
+
/*
|
|
573
|
+
* A NORMALIZED {name, message, stack} is handed to recordException
|
|
574
|
+
* rather than the raw thrown value, because the OTel SDK reads
|
|
575
|
+
* `exception.code` BEFORE `exception.name` when deciding
|
|
576
|
+
* `exception.type` (sdk-trace-base Span.recordException). OneUptime's
|
|
577
|
+
* Exception base class exposes an HTTP STATUS as `code`
|
|
578
|
+
* (NotAuthenticatedException = 401, BadDataException = 400,
|
|
579
|
+
* ServerException = 500 — see Types/Exception/ExceptionCode), so every
|
|
580
|
+
* exception this platform raises was being typed "401"/"400"/"500".
|
|
581
|
+
*
|
|
582
|
+
* That type is the exception event's identity downstream: it is hashed
|
|
583
|
+
* into the TelemetryException group fingerprint and it is what the
|
|
584
|
+
* Issues list and the AI insight titles show. A whole service's worth of
|
|
585
|
+
* unrelated failures collapsed into "401", telling nobody anything.
|
|
586
|
+
*
|
|
587
|
+
* The payload is built from the attributes getExceptionAttributes has
|
|
588
|
+
* already extracted, which means it inherits their truncation (4k
|
|
589
|
+
* message, 8k stack) and their crash-safety — a hostile thrown value is
|
|
590
|
+
* read exactly once, defensively, rather than twice.
|
|
591
|
+
*/
|
|
592
|
+
span.recordException({
|
|
593
|
+
name: (exceptionAttributes["exception.type"] as string) || "Error",
|
|
594
|
+
message: (exceptionAttributes["exception.message"] as string) || "",
|
|
595
|
+
...(exceptionAttributes["exception.stacktrace"]
|
|
596
|
+
? {
|
|
597
|
+
stack: exceptionAttributes["exception.stacktrace"] as string,
|
|
598
|
+
}
|
|
599
|
+
: {}),
|
|
600
|
+
} as SpanException);
|
|
550
601
|
span.setStatus({
|
|
551
602
|
code: SpanStatusCode.ERROR,
|
|
552
603
|
message:
|
|
@@ -588,8 +639,7 @@ export default class Telemetry {
|
|
|
588
639
|
}
|
|
589
640
|
|
|
590
641
|
if (exception instanceof Error) {
|
|
591
|
-
attributes["exception.type"] =
|
|
592
|
-
exception.name || exception.constructor?.name || "Error";
|
|
642
|
+
attributes["exception.type"] = this.getExceptionTypeName(exception);
|
|
593
643
|
attributes["exception.message"] = this.truncate(
|
|
594
644
|
exception.message || "",
|
|
595
645
|
4000,
|
|
@@ -661,6 +711,57 @@ export default class Telemetry {
|
|
|
661
711
|
return attributes;
|
|
662
712
|
}
|
|
663
713
|
|
|
714
|
+
/*
|
|
715
|
+
* The most specific type name available for a thrown Error, in the order a
|
|
716
|
+
* human would want to read it in the Issues list.
|
|
717
|
+
*
|
|
718
|
+
* `name` is checked first but "Error" is rejected: an Error subclass that
|
|
719
|
+
* never assigns `this.name` inherits the generic "Error" from
|
|
720
|
+
* Error.prototype, and OneUptime's own Exception base does exactly that —
|
|
721
|
+
* so `name` alone reports "Error" for NotAuthenticatedException,
|
|
722
|
+
* BadDataException and every other one of them.
|
|
723
|
+
*
|
|
724
|
+
* A `code` is only used when it is a NON-NUMERIC string. That keeps the
|
|
725
|
+
* genuinely descriptive Node system codes (ECONNREFUSED, ENOTFOUND) while
|
|
726
|
+
* rejecting numeric ones — HTTP statuses on OneUptime's Exception and
|
|
727
|
+
* Postgres SQLSTATEs ("23505"), for which the constructor name
|
|
728
|
+
* (QueryFailedError) says far more. The numeric code is not lost — it keeps
|
|
729
|
+
* its own `exception.code` attribute.
|
|
730
|
+
*
|
|
731
|
+
* Never throws: it runs on the universal error path and the thrown value
|
|
732
|
+
* can be a Proxy or carry throwing getters.
|
|
733
|
+
*/
|
|
734
|
+
private static getExceptionTypeName(exception: Error): string {
|
|
735
|
+
try {
|
|
736
|
+
const name: unknown = exception.name;
|
|
737
|
+
if (typeof name === "string" && name.trim() !== "" && name !== "Error") {
|
|
738
|
+
return name;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
const code: unknown = (exception as { code?: unknown }).code;
|
|
742
|
+
if (
|
|
743
|
+
typeof code === "string" &&
|
|
744
|
+
code.trim() !== "" &&
|
|
745
|
+
!NUMERIC_ONLY_REGEX.test(code.trim())
|
|
746
|
+
) {
|
|
747
|
+
return code.trim();
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
const constructorName: unknown = exception.constructor?.name;
|
|
751
|
+
if (
|
|
752
|
+
typeof constructorName === "string" &&
|
|
753
|
+
constructorName.trim() !== "" &&
|
|
754
|
+
constructorName !== "Object"
|
|
755
|
+
) {
|
|
756
|
+
return constructorName;
|
|
757
|
+
}
|
|
758
|
+
} catch {
|
|
759
|
+
// Fall through to the generic name below.
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
return "Error";
|
|
763
|
+
}
|
|
764
|
+
|
|
664
765
|
private static truncate(value: string, maxLength: number): string {
|
|
665
766
|
return value.length > maxLength ? value.substring(0, maxLength) : value;
|
|
666
767
|
}
|