@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
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* These tests exercise pure attribute-key helpers only — nothing here
|
|
3
|
+
* touches Postgres. Stub the DatabaseService base class out before
|
|
4
|
+
* TelemetryUtil's import graph (MetricTypeService -> DatabaseService ->
|
|
5
|
+
* PasswordHash, which has a known TS5.9 compile failure under ts-jest)
|
|
6
|
+
* drags the whole server-side service layer into the suite. Mirrors
|
|
7
|
+
* App/Tests/Telemetry/MetricRowIngestionStamp.test.ts.
|
|
8
|
+
*/
|
|
9
|
+
jest.mock("../../../../Server/Services/DatabaseService", () => {
|
|
10
|
+
/*
|
|
11
|
+
* Service constructors touch a little base-class API before any database
|
|
12
|
+
* work happens, so the stub has to answer it. `hardDeleteItemsOlderThanInDays`
|
|
13
|
+
* is the one that bites: ~100 services call it from their constructor, but
|
|
14
|
+
* only `if (IsBillingEnabled)` — which is off in a plain local checkout and
|
|
15
|
+
* ON in CI (Common/test-setup.sh writes BILLING_ENABLED=true). A bare
|
|
16
|
+
* `class {}` therefore passes locally and dies in CI the moment this test's
|
|
17
|
+
* import graph reaches one of those services, with a suite-level
|
|
18
|
+
* "hardDeleteItemsOlderThanInDays is not a function" and no failing test to
|
|
19
|
+
* point at. Anything genuinely used by the code under test belongs in the
|
|
20
|
+
* test's own mocks, not here.
|
|
21
|
+
*/
|
|
22
|
+
return {
|
|
23
|
+
__esModule: true,
|
|
24
|
+
default: class DatabaseServiceStub {
|
|
25
|
+
public hardDeleteItemsOlderThanInDays(): void {
|
|
26
|
+
// no-op: retention config, nothing for a pure unit test to do.
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public setDoNotAllowDelete(): void {
|
|
30
|
+
// no-op: delete-permission config, same.
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
import TelemetryUtil, {
|
|
37
|
+
AttributeType,
|
|
38
|
+
} from "../../../../Server/Utils/Telemetry/Telemetry";
|
|
39
|
+
import Dictionary from "../../../../Types/Dictionary";
|
|
40
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
41
|
+
import { describe, expect, test } from "@jest/globals";
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* The two helpers the OTel ingest hot-path restructure leans on:
|
|
45
|
+
*
|
|
46
|
+
* 1. mergeAttributeKeysWithSortedBase — the per-datapoint replacement for
|
|
47
|
+
* `Object.keys(mergedAttributes).sort()`. Its whole contract is ORDER
|
|
48
|
+
* IDENTITY with the full sort: metric rows store attributeKeys sorted,
|
|
49
|
+
* and the pipeline rule engine re-sorts after attribute mutations, so
|
|
50
|
+
* any divergence between "merge of two sorted lists" and "sort of the
|
|
51
|
+
* union" would make rule-touched and untouched rows disagree. Every
|
|
52
|
+
* test here therefore asserts against the reference derivation
|
|
53
|
+
* (`Object.keys(Object.assign({}, base, extra)).sort()`), not against
|
|
54
|
+
* hand-written expectations that could encode the same mistake twice.
|
|
55
|
+
*
|
|
56
|
+
* 2. getPrefixedScopeAttributes — the once-per-scope replacement for the
|
|
57
|
+
* per-record `scope.` prefix loop the three ingest services carried.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
type MergeInput = {
|
|
61
|
+
sortedBaseAttributeKeys: Array<string>;
|
|
62
|
+
additionalAttributeKeys: Array<string>;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
function referenceSortedUnion(
|
|
66
|
+
baseKeys: Array<string>,
|
|
67
|
+
additionalKeys: Array<string>,
|
|
68
|
+
): Array<string> {
|
|
69
|
+
const union: Record<string, boolean> = {};
|
|
70
|
+
for (const key of baseKeys) {
|
|
71
|
+
union[key] = true;
|
|
72
|
+
}
|
|
73
|
+
for (const key of additionalKeys) {
|
|
74
|
+
union[key] = true;
|
|
75
|
+
}
|
|
76
|
+
return Object.keys(union).sort();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function merge(data: MergeInput): Array<string> {
|
|
80
|
+
return TelemetryUtil.mergeAttributeKeysWithSortedBase(data);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
describe("TelemetryUtil.mergeAttributeKeysWithSortedBase", () => {
|
|
84
|
+
test("empty additional keys returns the base list content unchanged", () => {
|
|
85
|
+
const base: Array<string> = ["a", "b", "c"];
|
|
86
|
+
|
|
87
|
+
expect(
|
|
88
|
+
merge({ sortedBaseAttributeKeys: base, additionalAttributeKeys: [] }),
|
|
89
|
+
).toEqual(["a", "b", "c"]);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("empty additional keys returns a FRESH array, never the base reference", () => {
|
|
93
|
+
/*
|
|
94
|
+
* Rows must not share an attributeKeys array: pipeline rules replace a
|
|
95
|
+
* row's key list independently of its siblings, and the base list is
|
|
96
|
+
* reused for every datapoint of a metric.
|
|
97
|
+
*/
|
|
98
|
+
const base: Array<string> = ["a", "b"];
|
|
99
|
+
const merged: Array<string> = merge({
|
|
100
|
+
sortedBaseAttributeKeys: base,
|
|
101
|
+
additionalAttributeKeys: [],
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
expect(merged).not.toBe(base);
|
|
105
|
+
merged.push("mutated");
|
|
106
|
+
expect(base).toEqual(["a", "b"]);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test("does not mutate either input list", () => {
|
|
110
|
+
const base: Array<string> = ["a", "m", "z"];
|
|
111
|
+
const additional: Array<string> = ["c", "b"];
|
|
112
|
+
|
|
113
|
+
merge({
|
|
114
|
+
sortedBaseAttributeKeys: base,
|
|
115
|
+
additionalAttributeKeys: additional,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
expect(base).toEqual(["a", "m", "z"]);
|
|
119
|
+
// In particular the internal sort must run on a copy.
|
|
120
|
+
expect(additional).toEqual(["c", "b"]);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("interleaved keys merge into the exact full-sort order", () => {
|
|
124
|
+
const base: Array<string> = ["alpha", "gamma", "omega"];
|
|
125
|
+
const additional: Array<string> = ["zeta", "beta", "delta"];
|
|
126
|
+
|
|
127
|
+
expect(
|
|
128
|
+
merge({
|
|
129
|
+
sortedBaseAttributeKeys: base,
|
|
130
|
+
additionalAttributeKeys: additional,
|
|
131
|
+
}),
|
|
132
|
+
).toEqual(referenceSortedUnion(base, additional));
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("a per-row key overriding a base key appears exactly once", () => {
|
|
136
|
+
const base: Array<string> = ["resource.service.name", "shared.key"];
|
|
137
|
+
const additional: Array<string> = ["shared.key", "datapoint.only"];
|
|
138
|
+
|
|
139
|
+
const merged: Array<string> = merge({
|
|
140
|
+
sortedBaseAttributeKeys: base,
|
|
141
|
+
additionalAttributeKeys: additional,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
expect(merged).toEqual(referenceSortedUnion(base, additional));
|
|
145
|
+
expect(
|
|
146
|
+
merged.filter((key: string) => {
|
|
147
|
+
return key === "shared.key";
|
|
148
|
+
}),
|
|
149
|
+
).toHaveLength(1);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test("all additional keys sorting before the base keys", () => {
|
|
153
|
+
const base: Array<string> = ["x", "y", "z"];
|
|
154
|
+
const additional: Array<string> = ["c", "a", "b"];
|
|
155
|
+
|
|
156
|
+
expect(
|
|
157
|
+
merge({
|
|
158
|
+
sortedBaseAttributeKeys: base,
|
|
159
|
+
additionalAttributeKeys: additional,
|
|
160
|
+
}),
|
|
161
|
+
).toEqual(["a", "b", "c", "x", "y", "z"]);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test("all additional keys sorting after the base keys", () => {
|
|
165
|
+
const base: Array<string> = ["a", "b"];
|
|
166
|
+
const additional: Array<string> = ["z", "y"];
|
|
167
|
+
|
|
168
|
+
expect(
|
|
169
|
+
merge({
|
|
170
|
+
sortedBaseAttributeKeys: base,
|
|
171
|
+
additionalAttributeKeys: additional,
|
|
172
|
+
}),
|
|
173
|
+
).toEqual(["a", "b", "y", "z"]);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("empty base list yields the sorted additional keys", () => {
|
|
177
|
+
expect(
|
|
178
|
+
merge({
|
|
179
|
+
sortedBaseAttributeKeys: [],
|
|
180
|
+
additionalAttributeKeys: ["b", "a"],
|
|
181
|
+
}),
|
|
182
|
+
).toEqual(["a", "b"]);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("both lists empty yields an empty list", () => {
|
|
186
|
+
expect(
|
|
187
|
+
merge({ sortedBaseAttributeKeys: [], additionalAttributeKeys: [] }),
|
|
188
|
+
).toEqual([]);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test("UTF-16 code-unit ordering matches the default sort (uppercase before lowercase, multibyte last)", () => {
|
|
192
|
+
/*
|
|
193
|
+
* The default Array.prototype.sort comparator orders by UTF-16 code
|
|
194
|
+
* units: "Z" (0x5A) < "a" (0x61) < "é" (0xE9) < "日" (0x65E5). The
|
|
195
|
+
* merge relies on `<`/`>` applying the same ordering — this test fails
|
|
196
|
+
* if anyone "fixes" either side to use localeCompare.
|
|
197
|
+
*/
|
|
198
|
+
const base: Array<string> = ["Zebra", "apple"].sort();
|
|
199
|
+
const additional: Array<string> = ["日本語", "é-accent", "Banana"];
|
|
200
|
+
|
|
201
|
+
expect(
|
|
202
|
+
merge({
|
|
203
|
+
sortedBaseAttributeKeys: base,
|
|
204
|
+
additionalAttributeKeys: additional,
|
|
205
|
+
}),
|
|
206
|
+
).toEqual(referenceSortedUnion(base, additional));
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test("integer-like keys follow string sort order, not the Object.keys numeric-first order", () => {
|
|
210
|
+
/*
|
|
211
|
+
* Object.keys lists integer-like keys first in ascending numeric order
|
|
212
|
+
* ("2" before "10"), but the stored attributeKeys was always the
|
|
213
|
+
* SORTED list, where "10" < "2" lexicographically. The merge must
|
|
214
|
+
* reproduce the sorted view.
|
|
215
|
+
*/
|
|
216
|
+
const attributes: Dictionary<AttributeType> = {
|
|
217
|
+
"10": "ten",
|
|
218
|
+
"2": "two",
|
|
219
|
+
name: "x",
|
|
220
|
+
};
|
|
221
|
+
const base: Array<string> = Object.keys(attributes).sort();
|
|
222
|
+
const additional: Array<string> = ["11", "1"];
|
|
223
|
+
|
|
224
|
+
expect(
|
|
225
|
+
merge({
|
|
226
|
+
sortedBaseAttributeKeys: base,
|
|
227
|
+
additionalAttributeKeys: additional,
|
|
228
|
+
}),
|
|
229
|
+
).toEqual(referenceSortedUnion(base, additional));
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("randomized inputs always equal the reference full sort (order included)", () => {
|
|
233
|
+
/*
|
|
234
|
+
* Deterministic pseudo-random sweep: many shapes of overlap, sizes and
|
|
235
|
+
* key alphabets, each checked element-for-element against the
|
|
236
|
+
* reference derivation the old per-datapoint code used.
|
|
237
|
+
*/
|
|
238
|
+
let seed: number = 42;
|
|
239
|
+
const nextRandom: () => number = (): number => {
|
|
240
|
+
// Park-Miller minimal standard PRNG — deterministic across runs.
|
|
241
|
+
seed = (seed * 16807) % 2147483647;
|
|
242
|
+
return seed / 2147483647;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
const alphabet: Array<string> = [
|
|
246
|
+
"a",
|
|
247
|
+
"B",
|
|
248
|
+
"resource.service.name",
|
|
249
|
+
"scope.name",
|
|
250
|
+
"http.status_code",
|
|
251
|
+
"0",
|
|
252
|
+
"10",
|
|
253
|
+
"2",
|
|
254
|
+
"é",
|
|
255
|
+
"日本",
|
|
256
|
+
"_underscore",
|
|
257
|
+
"UPPER",
|
|
258
|
+
"shared.key",
|
|
259
|
+
"z.last",
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
for (let round: number = 0; round < 200; round++) {
|
|
263
|
+
const baseSet: Record<string, boolean> = {};
|
|
264
|
+
const additionalSet: Record<string, boolean> = {};
|
|
265
|
+
|
|
266
|
+
for (const key of alphabet) {
|
|
267
|
+
if (nextRandom() < 0.5) {
|
|
268
|
+
baseSet[key] = true;
|
|
269
|
+
}
|
|
270
|
+
if (nextRandom() < 0.3) {
|
|
271
|
+
additionalSet[key] = true;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const base: Array<string> = Object.keys(baseSet).sort();
|
|
276
|
+
const additional: Array<string> = Object.keys(additionalSet);
|
|
277
|
+
|
|
278
|
+
expect(
|
|
279
|
+
merge({
|
|
280
|
+
sortedBaseAttributeKeys: base,
|
|
281
|
+
additionalAttributeKeys: additional,
|
|
282
|
+
}),
|
|
283
|
+
).toEqual(referenceSortedUnion(base, additional));
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
describe("TelemetryUtil.getPrefixedScopeAttributes", () => {
|
|
289
|
+
test("prefixes every scope key with 'scope.'", () => {
|
|
290
|
+
const scope: JSONObject = {
|
|
291
|
+
name: "my-instrumentation",
|
|
292
|
+
version: "1.2.3",
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
expect(TelemetryUtil.getPrefixedScopeAttributes(scope)).toEqual({
|
|
296
|
+
"scope.name": "my-instrumentation",
|
|
297
|
+
"scope.version": "1.2.3",
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test("preserves values verbatim, including non-string ones", () => {
|
|
302
|
+
/*
|
|
303
|
+
* The historical inline loop cast whatever the scope object carried
|
|
304
|
+
* (`scopeAttributes[key] as AttributeType`) without transforming it —
|
|
305
|
+
* the helper must not start coercing.
|
|
306
|
+
*/
|
|
307
|
+
const nested: JSONObject = { droppedAttributesCount: 0 };
|
|
308
|
+
const scope: JSONObject = {
|
|
309
|
+
name: "scope-with-odd-values",
|
|
310
|
+
attributes: nested,
|
|
311
|
+
flag: true,
|
|
312
|
+
count: 7,
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
const prefixed: Dictionary<AttributeType | Array<AttributeType>> =
|
|
316
|
+
TelemetryUtil.getPrefixedScopeAttributes(scope);
|
|
317
|
+
|
|
318
|
+
expect(prefixed["scope.name"]).toBe("scope-with-odd-values");
|
|
319
|
+
expect(prefixed["scope.attributes"]).toBe(
|
|
320
|
+
nested as unknown as AttributeType,
|
|
321
|
+
);
|
|
322
|
+
expect(prefixed["scope.flag"]).toBe(true);
|
|
323
|
+
expect(prefixed["scope.count"]).toBe(7);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
test("undefined, null and empty scopes all produce an empty map", () => {
|
|
327
|
+
expect(TelemetryUtil.getPrefixedScopeAttributes(undefined)).toEqual({});
|
|
328
|
+
expect(TelemetryUtil.getPrefixedScopeAttributes(null)).toEqual({});
|
|
329
|
+
expect(TelemetryUtil.getPrefixedScopeAttributes({})).toEqual({});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
test("returns a fresh object per call (scopes must not share prefixed maps)", () => {
|
|
333
|
+
const first: Dictionary<AttributeType | Array<AttributeType>> =
|
|
334
|
+
TelemetryUtil.getPrefixedScopeAttributes({});
|
|
335
|
+
const second: Dictionary<AttributeType | Array<AttributeType>> =
|
|
336
|
+
TelemetryUtil.getPrefixedScopeAttributes({});
|
|
337
|
+
|
|
338
|
+
expect(first).not.toBe(second);
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
test("merging the prefixed map last reproduces the historical per-record loop", () => {
|
|
342
|
+
/*
|
|
343
|
+
* The ingest services replaced `spread resource+record attrs, then loop
|
|
344
|
+
* scope keys in` with `Object.assign({}, resource, record, prefixed)`.
|
|
345
|
+
* Equivalence proof at the helper level: same winners on collision and
|
|
346
|
+
* same key insertion order as the loop-based construction.
|
|
347
|
+
*/
|
|
348
|
+
const resourceAttributes: Dictionary<AttributeType> = {
|
|
349
|
+
"resource.service.name": "svc",
|
|
350
|
+
"scope.name": "resource-level-collision",
|
|
351
|
+
};
|
|
352
|
+
const recordAttributes: Dictionary<AttributeType> = {
|
|
353
|
+
"http.method": "GET",
|
|
354
|
+
"scope.name": "record-level-collision",
|
|
355
|
+
};
|
|
356
|
+
const scope: JSONObject = { name: "the-scope", version: "9" };
|
|
357
|
+
|
|
358
|
+
// Historical construction.
|
|
359
|
+
const legacy: Dictionary<AttributeType> = {
|
|
360
|
+
...resourceAttributes,
|
|
361
|
+
...recordAttributes,
|
|
362
|
+
};
|
|
363
|
+
for (const key of Object.keys(scope)) {
|
|
364
|
+
legacy[`scope.${key}`] = scope[key] as AttributeType;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// New construction.
|
|
368
|
+
const merged: Dictionary<AttributeType | Array<AttributeType>> =
|
|
369
|
+
Object.assign(
|
|
370
|
+
{},
|
|
371
|
+
resourceAttributes,
|
|
372
|
+
recordAttributes,
|
|
373
|
+
TelemetryUtil.getPrefixedScopeAttributes(scope),
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
expect(merged).toEqual(legacy);
|
|
377
|
+
expect(Object.keys(merged)).toEqual(Object.keys(legacy));
|
|
378
|
+
// Scope wins the collision, exactly as the loop-based code had it.
|
|
379
|
+
expect(merged["scope.name"]).toBe("the-scope");
|
|
380
|
+
});
|
|
381
|
+
});
|
|
@@ -74,6 +74,55 @@ describe("Telemetry.getExceptionAttributes", () => {
|
|
|
74
74
|
expect(typeof attributes["exception.stacktrace"]).toBe("string");
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
+
/*
|
|
78
|
+
* exception.type is the exception's identity downstream: it is hashed into
|
|
79
|
+
* the TelemetryException group fingerprint and it is what the Issues list
|
|
80
|
+
* and the AI insight titles show. An Error subclass that never assigns
|
|
81
|
+
* `this.name` inherits the generic "Error" from Error.prototype — which is
|
|
82
|
+
* every exception OneUptime raises — so the constructor name is the one
|
|
83
|
+
* that carries information.
|
|
84
|
+
*/
|
|
85
|
+
test("a subclass that never sets `name` is typed by its constructor, not 'Error'", () => {
|
|
86
|
+
class NotAuthenticatedException extends Error {
|
|
87
|
+
public code: number = 401;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const attributes: ExceptionAttributes = getAttributes(
|
|
91
|
+
new NotAuthenticatedException("Authenticated user is needed"),
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
expect(attributes["exception.type"]).toBe("NotAuthenticatedException");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("an explicit name still wins over the constructor", () => {
|
|
98
|
+
const error: Error = new Error("boom");
|
|
99
|
+
error.name = "ValidationError";
|
|
100
|
+
|
|
101
|
+
expect(getAttributes(error)["exception.type"]).toBe("ValidationError");
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* Node system errors carry a descriptive string code; HTTP statuses and
|
|
106
|
+
* Postgres SQLSTATEs carry a numeric one that says less than the class.
|
|
107
|
+
*/
|
|
108
|
+
test("a descriptive string code is used, a numeric one is not", () => {
|
|
109
|
+
const systemError: Error = Object.assign(new Error("connect failed"), {
|
|
110
|
+
code: "ECONNREFUSED",
|
|
111
|
+
});
|
|
112
|
+
expect(getAttributes(systemError)["exception.type"]).toBe("ECONNREFUSED");
|
|
113
|
+
|
|
114
|
+
class ServerException extends Error {
|
|
115
|
+
public code: number = 500;
|
|
116
|
+
}
|
|
117
|
+
expect(getAttributes(new ServerException("boom"))["exception.type"]).toBe(
|
|
118
|
+
"ServerException",
|
|
119
|
+
);
|
|
120
|
+
// The numeric code is not lost — it keeps its own attribute.
|
|
121
|
+
expect(getAttributes(new ServerException("boom"))["exception.code"]).toBe(
|
|
122
|
+
"500",
|
|
123
|
+
);
|
|
124
|
+
});
|
|
125
|
+
|
|
77
126
|
test("handles a thrown string", () => {
|
|
78
127
|
const attributes: ExceptionAttributes = getAttributes("kaboom");
|
|
79
128
|
|
|
@@ -229,6 +278,44 @@ describe("Telemetry.recordExceptionMarkSpanAsErrorAndEndSpan", () => {
|
|
|
229
278
|
expect((state.attributes || {})["exception.message"]).toBe("kaboom");
|
|
230
279
|
});
|
|
231
280
|
|
|
281
|
+
/*
|
|
282
|
+
* THE REGRESSION THIS GUARDS. The OTel SDK reads `exception.code` BEFORE
|
|
283
|
+
* `exception.name` when it derives the exception event's `exception.type`,
|
|
284
|
+
* and OneUptime's Exception base exposes an HTTP STATUS as `code`. Handing
|
|
285
|
+
* the raw thrown value to recordException therefore typed every exception
|
|
286
|
+
* this platform raises "401"/"400"/"500" — which is hashed into the
|
|
287
|
+
* TelemetryException group fingerprint and rendered as the AI insight
|
|
288
|
+
* title, collapsing a service's unrelated failures into one indistinct row.
|
|
289
|
+
* A normalized {name, message, stack} has no `code` for the SDK to prefer.
|
|
290
|
+
*/
|
|
291
|
+
test("records a normalized exception so the SDK cannot type it by an HTTP status", () => {
|
|
292
|
+
class NotAuthenticatedException extends Error {
|
|
293
|
+
public code: number = 401;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const state: FakeSpanState = {
|
|
297
|
+
attributes: null,
|
|
298
|
+
status: null,
|
|
299
|
+
recorded: null,
|
|
300
|
+
ended: 0,
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
Telemetry.recordExceptionMarkSpanAsErrorAndEndSpan({
|
|
304
|
+
span: makeFakeSpan(state),
|
|
305
|
+
exception: new NotAuthenticatedException("needs an API key"),
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
const recorded: Record<string, unknown> = state.recorded as Record<
|
|
309
|
+
string,
|
|
310
|
+
unknown
|
|
311
|
+
>;
|
|
312
|
+
|
|
313
|
+
expect(recorded["code"]).toBeUndefined();
|
|
314
|
+
expect(recorded["name"]).toBe("NotAuthenticatedException");
|
|
315
|
+
expect(recorded["message"]).toBe("needs an API key");
|
|
316
|
+
expect(typeof recorded["stack"]).toBe("string");
|
|
317
|
+
});
|
|
318
|
+
|
|
232
319
|
test("still ends and flags the span even if a span write throws", () => {
|
|
233
320
|
const state: FakeSpanState = {
|
|
234
321
|
attributes: null,
|