@oneuptime/common 12.0.24 → 12.0.26
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/AnalyticsModels/Index.ts +2 -0
- package/Models/AnalyticsModels/Span.ts +101 -0
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +413 -0
- package/Models/DatabaseModels/AlertSeverity.ts +4 -1
- package/Models/DatabaseModels/CephClusterFeed.ts +625 -0
- package/Models/DatabaseModels/CloudResourceFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +13 -0
- package/Models/DatabaseModels/DetectionRule.ts +9 -3
- package/Models/DatabaseModels/DockerHostFeed.ts +625 -0
- package/Models/DatabaseModels/DockerSwarmClusterFeed.ts +628 -0
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +9 -3
- package/Models/DatabaseModels/HostFeed.ts +625 -0
- package/Models/DatabaseModels/IncidentSeverity.ts +4 -1
- package/Models/DatabaseModels/Index.ts +22 -0
- package/Models/DatabaseModels/KubernetesClusterFeed.ts +628 -0
- package/Models/DatabaseModels/Monitor.ts +87 -0
- package/Models/DatabaseModels/NetworkDevice.ts +96 -5
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +92 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +301 -31
- package/Models/DatabaseModels/NetworkSite.ts +120 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/PodmanHostFeed.ts +625 -0
- package/Models/DatabaseModels/ProxmoxClusterFeed.ts +626 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +67 -0
- package/Models/DatabaseModels/ServiceFeed.ts +625 -0
- package/Models/DatabaseModels/TelemetrySourceMap.ts +474 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +758 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +1 -0
- package/Models/DatabaseModels/UserTotpAuth.ts +1 -0
- package/Models/DatabaseModels/UserWebAuthn.ts +1 -0
- package/Server/API/AlertAPI.ts +23 -1
- package/Server/API/BaseAPI.ts +14 -27
- package/Server/API/IncidentAPI.ts +41 -1
- package/Server/API/IncidentEpisodeAPI.ts +23 -1
- package/Server/API/MicrosoftTeamsAPI.ts +31 -2
- package/Server/API/ScheduledMaintenanceAPI.ts +23 -1
- package/Server/API/SlackAPI.ts +48 -2
- package/Server/API/TelemetryAPI.ts +167 -42
- package/Server/API/UserOnCallLogTimelineAPI.ts +75 -61
- package/Server/API/UserTotpAuthAPI.ts +67 -1
- package/Server/API/UserWebAuthnAPI.ts +44 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.ts +54 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.ts +489 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +18 -0
- package/Server/Middleware/IdentityRateLimit.ts +53 -3
- package/Server/Middleware/SlackAuthorization.ts +96 -18
- package/Server/Services/AIService.ts +181 -41
- package/Server/Services/CephClusterFeedService.ts +99 -0
- package/Server/Services/CephClusterLabelRuleEngineService.ts +29 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/CephClusterOwnerTeamService.ts +129 -0
- package/Server/Services/CephClusterOwnerUserService.ts +123 -0
- package/Server/Services/CephClusterService.ts +223 -2
- package/Server/Services/CloudResourceFeedService.ts +99 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +30 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +33 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +129 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +123 -0
- package/Server/Services/CloudResourceService.ts +227 -2
- package/Server/Services/DatabaseService.ts +265 -0
- package/Server/Services/DockerHostFeedService.ts +99 -0
- package/Server/Services/DockerHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/DockerHostOwnerTeamService.ts +129 -0
- package/Server/Services/DockerHostOwnerUserService.ts +123 -0
- package/Server/Services/DockerHostService.ts +227 -2
- package/Server/Services/DockerSwarmClusterFeedService.ts +102 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +133 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +127 -0
- package/Server/Services/DockerSwarmClusterService.ts +229 -2
- package/Server/Services/EnterpriseLicenseService.ts +15 -7
- package/Server/Services/ExceptionAggregationService.ts +12 -2
- package/Server/Services/HostFeedService.ts +99 -0
- package/Server/Services/HostLabelRuleEngineService.ts +29 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostOwnerTeamService.ts +129 -0
- package/Server/Services/HostOwnerUserService.ts +123 -0
- package/Server/Services/HostService.ts +215 -2
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesClusterFeedService.ts +99 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/KubernetesClusterOwnerTeamService.ts +133 -0
- package/Server/Services/KubernetesClusterOwnerUserService.ts +127 -0
- package/Server/Services/KubernetesClusterService.ts +231 -2
- package/Server/Services/LogAggregationService.ts +23 -280
- package/Server/Services/MetricAggregationService.ts +98 -1
- package/Server/Services/MonitorService.ts +177 -13
- package/Server/Services/MonitorTemplateService.ts +111 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +777 -86
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +199 -16
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +1055 -14
- package/Server/Services/NetworkDeviceService.ts +750 -4
- package/Server/Services/NetworkInterfaceService.ts +415 -0
- package/Server/Services/NetworkSiteService.ts +485 -52
- package/Server/Services/PodmanHostFeedService.ts +99 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +29 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +23 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +129 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +123 -0
- package/Server/Services/PodmanHostService.ts +227 -2
- package/Server/Services/ProjectService.ts +16 -10
- package/Server/Services/ProxmoxClusterFeedService.ts +99 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +30 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +24 -0
- package/Server/Services/ProxmoxClusterOwnerTeamService.ts +131 -0
- package/Server/Services/ProxmoxClusterOwnerUserService.ts +124 -0
- package/Server/Services/ProxmoxClusterService.ts +225 -2
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +61 -0
- package/Server/Services/ServiceFeedService.ts +99 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ServiceOwnerRuleEngineService.ts +26 -0
- package/Server/Services/ServiceOwnerTeamService.ts +129 -0
- package/Server/Services/ServiceOwnerUserService.ts +123 -0
- package/Server/Services/ServiceService.ts +227 -3
- package/Server/Services/StatusPageSubscriberService.ts +7 -0
- package/Server/Services/TelemetryAttributeService.ts +13 -3
- package/Server/Services/TelemetrySourceMapService.ts +307 -0
- package/Server/Services/ThreatIntelFeedService.ts +222 -0
- package/Server/Services/ThreatIntelIndicatorService.ts +428 -0
- package/Server/Services/TraceAggregationService.ts +101 -11
- package/Server/Services/UserService.ts +13 -6
- package/Server/Services/UserTwoFactorBackupCodeService.ts +127 -0
- package/Server/Services/UserWebhookService.ts +11 -2
- package/Server/Static/Brand/README.md +38 -0
- package/Server/Static/Brand/favicons/apple-touch-icon.png +0 -0
- package/Server/Static/Brand/favicons/favicon-16x16.png +0 -0
- package/Server/Static/Brand/favicons/favicon-32x32.png +0 -0
- package/Server/Static/Brand/favicons/favicon.ico +0 -0
- package/Server/Static/Brand/favicons/safari-pinned-tab.svg +31 -0
- package/Server/Static/Brand/hou-wb.svg +1 -0
- package/Server/Static/Brand/oneuptime-logo.svg +1 -0
- package/Server/Static/Brand/ou-wb.svg +1 -0
- package/Server/Static/Vendor/README.md +4 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +13 -3
- package/Server/Types/Database/AggregateBy.ts +83 -0
- package/Server/Types/Database/AggregateResultUtil.ts +126 -0
- package/Server/Types/Database/JSONColumnQuery.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +40 -0
- package/Server/Types/Database/QueryUtil.ts +26 -0
- package/Server/Types/Workflow/Components/API/Utils.ts +10 -1
- package/Server/Types/Workflow/Components/JavaScript.ts +8 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +9 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +18 -0
- package/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.ts +422 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +176 -0
- package/Server/Utils/DataSource/HttpFetch.ts +18 -0
- package/Server/Utils/Database/RelationIdUtil.ts +42 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +38 -9
- package/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +34 -3
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +28 -10
- package/Server/Utils/Monitor/MonitorAlert.ts +541 -332
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +330 -64
- package/Server/Utils/Monitor/MonitorIncident.ts +640 -434
- package/Server/Utils/Monitor/MonitorResource.ts +226 -49
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +46 -3
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +23 -102
- package/Server/Utils/Monitor/PerEntityCriteriaFanOut.ts +329 -0
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +427 -0
- package/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.ts +310 -0
- package/Server/Utils/OnCallNotificationContext.ts +686 -0
- package/Server/Utils/PrivateNetworkWebhookConfig.ts +549 -0
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +139 -0
- package/Server/Utils/Response.ts +11 -1
- package/Server/Utils/SSRFProtection.ts +230 -60
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +106 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +84 -284
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +47 -20
- package/Server/Utils/SecurityEvent/SecurityEventAlerting.ts +318 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.ts +199 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.ts +252 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +739 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +533 -0
- package/Server/Utils/StartServer.ts +83 -56
- package/Server/Utils/StatusPageSubscriberWebhook.ts +3 -0
- package/Server/Utils/Telemetry/LlmMetricSpend.ts +56 -5
- package/Server/Utils/Telemetry/LlmSpan.ts +46 -0
- package/Server/Utils/Telemetry/SourceMapResolver.ts +480 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +106 -0
- package/Server/Utils/VM/VMAPI.ts +3 -0
- package/Server/Utils/VM/VMRunner.ts +27 -1
- package/Server/Utils/VendorAssets.ts +42 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +136 -6
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +0 -12
- package/Server/Views/AcknowledgeUserOnCallNotification.ejs +11 -9
- package/Server/Views/Partials/Head.ejs +9 -9
- package/Server/Views/Partials/OnCallNotificationDetails.ejs +48 -0
- package/Server/Views/ViewMessage.ejs +11 -9
- package/Tests/App/Accounts/LoginTwoFactorRecovery.test.tsx +972 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +401 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +707 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +1908 -18
- package/Tests/App/Dashboard/LlmCallsTableIdentity.test.tsx +322 -0
- package/Tests/App/Dashboard/LlmOverview.test.tsx +335 -0
- package/Tests/App/Dashboard/LlmSpanDisplay.test.ts +391 -0
- package/Tests/App/Dashboard/LlmUsageBreakdown.test.tsx +1007 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +230 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +216 -0
- package/Tests/App/Dashboard/TopologyAddToMonitoring.test.tsx +192 -0
- package/Tests/App/Dashboard/WorkspaceNotificationRuleConditions.test.tsx +439 -0
- package/Tests/Models/DatabaseModels/DateColumnDeserialization.test.ts +182 -0
- package/Tests/Models/DatabaseModels/RelationColumnModelTypeCoverage.test.ts +82 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +398 -0
- package/Tests/Models/DiscoveryScanNameColumn.test.ts +151 -16
- package/Tests/Models/DiscoveryScanSnmpEnabledColumn.test.ts +593 -0
- package/Tests/Models/NetworkDeviceCreateContract.test.ts +102 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +607 -0
- package/Tests/Server/API/AIGenerationRequestBudget.test.ts +355 -0
- package/Tests/Server/API/AIKillSwitchBackstop.test.ts +602 -0
- package/Tests/Server/API/BaseAPI.test.ts +41 -0
- package/Tests/Server/API/BaseAPIUpdateDateColumns.test.ts +154 -0
- package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +9 -16
- package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +335 -0
- package/Tests/Server/API/UserOnCallLogTimelineAcknowledgePage.test.ts +611 -0
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +498 -4
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +682 -0
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +595 -0
- package/Tests/Server/Middleware/SlackAuthorization.test.ts +262 -5
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +9 -0
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +6 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +18 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +590 -0
- package/Tests/Server/Services/DatabaseServiceUpdateWriteRouting.test.ts +12 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +162 -26
- package/Tests/Server/Services/EnterpriseLicenseServiceCreate.test.ts +292 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +119 -12
- package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +109 -0
- package/Tests/Server/Services/MetricAggregationAttributeOperators.test.ts +170 -0
- package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +383 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +997 -3
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +830 -0
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +528 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +3141 -1
- package/Tests/Server/Services/NetworkDeviceRegisteredHostnames.test.ts +1023 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignmentRuleSkip.test.ts +728 -0
- package/Tests/Server/Services/NetworkInterfaceServiceUpsert.test.ts +795 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +903 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +165 -24
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +5 -3
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +5 -2
- package/Tests/Server/Services/ResourceCreationFeedWrites.test.ts +304 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +269 -0
- package/Tests/Server/Services/ResourceOwnerFeedWrites.test.ts +245 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +792 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +483 -0
- package/Tests/Server/Services/ThreatIntelFeedService.test.ts +351 -0
- package/Tests/Server/Services/ThreatIntelIndicatorService.test.ts +366 -0
- package/Tests/Server/Services/TraceAggregationAttributeOperators.test.ts +507 -0
- package/Tests/Server/Services/UserTwoFactorBackupCodeGenerateIfNone.test.ts +705 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleOnCallDutyPolicy.test.ts +306 -0
- package/Tests/Server/Types/Database/AggregateResultUtil.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +424 -0
- package/Tests/Server/Types/Database/QueryHelperWildcard.test.ts +142 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentPrivateNetwork.test.ts +163 -0
- package/Tests/Server/Types/Workflow/Components/JavaScriptPrivateNetwork.test.ts +124 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +5 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +39 -1
- package/Tests/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.test.ts +338 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWildcard.test.ts +383 -0
- package/Tests/Server/Utils/Marketing/EmittedMarketingEvent.ts +23 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +51 -0
- package/Tests/Server/Utils/Monitor/Criteria/SyntheticMonitorCriteria.test.ts +259 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +557 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +12 -2
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +404 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +8 -2
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +125 -98
- package/Tests/Server/Utils/Monitor/PerEntityCriteriaFanOut.test.ts +444 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1112 -0
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +717 -0
- package/Tests/Server/Utils/NetworkDevice/RulePatternValidator.test.ts +78 -0
- package/Tests/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.test.ts +363 -0
- package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +35 -0
- package/Tests/Server/Utils/OnCallNotificationContext.test.ts +908 -0
- package/Tests/Server/Utils/PrivateNetworkWebhookConfig.test.ts +423 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +191 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +597 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +381 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +417 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +819 -0
- package/Tests/Server/Utils/SecurityEvent/SecurityEventAlerting.test.ts +246 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.test.ts +282 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.test.ts +312 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.test.ts +854 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.test.ts +437 -0
- package/Tests/Server/Utils/StartServerErrorStatus.test.ts +225 -0
- package/Tests/Server/Utils/StatusPage/MonitorRulePatternValidator.test.ts +62 -0
- package/Tests/Server/Utils/StatusPageSubscriberWebhookPrivateNetwork.test.ts +119 -0
- package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +37 -18
- package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +143 -2
- package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +804 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +542 -0
- package/Tests/Server/Utils/TwoFactorBackupCodeNotification.test.ts +272 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +111 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +117 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +101 -4
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstallStateDiagnostics.test.ts +922 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsRosterDiagnosticMessages.test.ts +642 -0
- package/Tests/Server/Views/OnCallAcknowledgePage.test.ts +430 -0
- package/Tests/Types/API/URLQueryString.test.ts +472 -0
- package/Tests/Types/BaseDatabase/Wildcard.test.ts +163 -0
- package/Tests/Types/BaseDatabase/WildcardPattern.test.ts +149 -0
- package/Tests/Types/Database/DateColumnValue.test.ts +265 -0
- package/Tests/Types/DateToIsoStringOrNull.test.ts +67 -0
- package/Tests/Types/Log/LogQueryToFilter.test.ts +218 -43
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +225 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +296 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +102 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +145 -0
- package/Tests/Types/NetworkSite/SiteHealthRollupPolicy.test.ts +58 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +15 -0
- package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +391 -0
- package/Tests/Types/Telemetry/TelemetrySearchQuery.test.ts +620 -0
- package/Tests/Types/WhatsApp/WhatsAppTemplates.test.ts +110 -0
- package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +76 -6
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +16 -4
- package/Tests/Types/Workspace/NotificationRules/OnCallDutyPolicyConditions.test.ts +669 -0
- package/Tests/UI/Components/DictionaryFilterOperatorWildcard.test.ts +175 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +377 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +332 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsInstallGuidanceContent.test.tsx +643 -0
- package/Tests/Utils/Monitor/InterfaceInventoryUtil.test.ts +824 -0
- package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +626 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +718 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +59 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +287 -2
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +73 -0
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilder.test.ts +317 -0
- package/Tests/Utils/NetworkDiscovery/RescanIntervalUtil.test.ts +262 -0
- package/Tests/Utils/NetworkDiscovery/ScanModeUtil.test.ts +474 -0
- package/Tests/Utils/NetworkDiscovery/SnmpScanConfigUtil.test.ts +2442 -0
- package/Tests/Utils/NetworkSite/SiteMaintenanceUtil.test.ts +188 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +522 -0
- package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +694 -0
- package/Tests/Utils/SecurityEvent/ThreatIntel/StixPatternParser.test.ts +281 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +87 -67
- package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +298 -0
- package/Types/API/URL.ts +45 -10
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +8 -0
- package/Types/BaseDatabase/NotWildcard.ts +86 -0
- package/Types/BaseDatabase/Wildcard.ts +89 -0
- package/Types/BaseDatabase/WildcardPattern.ts +176 -0
- package/Types/Database/DateColumnValue.ts +184 -0
- package/Types/Database/TableColumn.ts +40 -5
- package/Types/Date.ts +37 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/JSON.ts +8 -0
- package/Types/Log/LogQueryToFilter.ts +167 -129
- package/Types/Monitor/DockerAlertTemplates.ts +43 -12
- package/Types/Monitor/HostAlertTemplates.ts +31 -3
- package/Types/Monitor/KubernetesAlertTemplates.ts +98 -0
- package/Types/Monitor/MonitorStep.ts +49 -0
- package/Types/Monitor/PodmanAlertTemplates.ts +39 -12
- package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +14 -0
- package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +11 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +11 -4
- package/Types/NetworkAutomation/RuleRunResult.ts +191 -2
- package/Types/NetworkSite/SiteHealthRollupPolicy.ts +96 -0
- package/Types/Permission.ts +411 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +42 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +118 -0
- package/Types/SerializableObjectDictionary.ts +8 -0
- package/Types/Telemetry/LlmConventions.ts +255 -0
- package/Types/Telemetry/LlmMetricConventions.ts +212 -7
- package/Types/Telemetry/SourceMap.ts +56 -0
- package/Types/Telemetry/TelemetrySearchQuery.ts +949 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +12 -1
- package/UI/Components/Dictionary/DictionaryFilterOperator.ts +83 -0
- package/UI/Components/Icon/Icon.tsx +28 -1
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +26 -4
- package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +34 -16
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +15 -2
- package/Utils/Metrics/MetricExplorerUrl.ts +77 -15
- package/Utils/Monitor/InterfaceInventoryUtil.ts +251 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +333 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +249 -28
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +14 -6
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +2 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +49 -18
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +215 -0
- package/Utils/NetworkDiscovery/RescanIntervalUtil.ts +148 -0
- package/Utils/NetworkDiscovery/ScanModeUtil.ts +105 -0
- package/Utils/NetworkDiscovery/SnmpScanConfigUtil.ts +827 -0
- package/Utils/NetworkSite/SiteMaintenanceUtil.ts +110 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +350 -19
- package/Utils/NetworkSite/SiteUptimeUtil.ts +422 -21
- package/Utils/SecurityEvent/ThreatIntel/StixPatternParser.ts +383 -0
- package/Utils/Telemetry/CrossSignalScope.ts +37 -39
- package/Utils/Telemetry/LlmMetricQuery.ts +83 -0
- package/build/dist/Models/AnalyticsModels/Index.js +2 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +89 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +325 -0
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CephClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/CloudResourceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +11 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +9 -3
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +9 -3
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/HostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +22 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/KubernetesClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js +81 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +103 -7
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +91 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +276 -31
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +124 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/PodmanHostFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +66 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/ServiceFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js +496 -0
- package/build/dist/Models/DatabaseModels/TelemetrySourceMap.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +800 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js +1 -0
- package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +1 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +18 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +11 -20
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +35 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +18 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +30 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +18 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +45 -2
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +100 -35
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js +64 -59
- package/build/dist/Server/API/UserOnCallLogTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +65 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +42 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787923136162-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789600000000-AddAutoProvisionedNetworkDeviceMonitors.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js +88 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789700000000-AddNetworkScaleIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789800000000-WidenSecurityEventLastErrorColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789900000000-AddNetworkSiteRollupPolicyAndMaintenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000000-AddTelemetrySourceMap.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js +61 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790000000001-AddSnmpConfigsToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790003445000-AddSnmpEnabledToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js +179 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790100000000-AddResourceActivityFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +40 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SlackAuthorization.js +58 -7
- package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +177 -30
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterFeedService.js +89 -0
- package/build/dist/Server/Services/CephClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +175 -1
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceFeedService.js +89 -0
- package/build/dist/Server/Services/CloudResourceFeedService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +28 -3
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +177 -1
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +201 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostFeedService.js +89 -0
- package/build/dist/Server/Services/DockerHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +177 -1
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js +90 -0
- package/build/dist/Server/Services/DockerSwarmClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +175 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +40 -30
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +8 -2
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostFeedService.js +89 -0
- package/build/dist/Server/Services/HostFeedService.js.map +1 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/HostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/HostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +175 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +10 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterFeedService.js +89 -0
- package/build/dist/Server/Services/KubernetesClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +177 -1
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +19 -196
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +59 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +115 -13
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +86 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +561 -67
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +130 -16
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +850 -8
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +594 -5
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkInterfaceService.js +306 -0
- package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +408 -47
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostFeedService.js +89 -0
- package/build/dist/Server/Services/PodmanHostFeedService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +113 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +177 -1
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +40 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js +89 -0
- package/build/dist/Server/Services/ProxmoxClusterFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +175 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +56 -0
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceFeedService.js +89 -0
- package/build/dist/Server/Services/ServiceFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +27 -3
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +24 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerTeamService.js +120 -0
- package/build/dist/Server/Services/ServiceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerUserService.js +113 -0
- package/build/dist/Server/Services/ServiceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +173 -2
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +7 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +9 -3
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +265 -0
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js +157 -0
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js +276 -0
- package/build/dist/Server/Services/ThreatIntelIndicatorService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +62 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +22 -13
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js +120 -0
- package/build/dist/Server/Services/UserTwoFactorBackupCodeService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +11 -2
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +12 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/AggregateBy.js +2 -0
- package/build/dist/Server/Types/Database/AggregateBy.js.map +1 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js +90 -0
- package/build/dist/Server/Types/Database/AggregateResultUtil.js.map +1 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js +14 -0
- package/build/dist/Server/Types/Database/JSONColumnQuery.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +42 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +18 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +10 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +8 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +15 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js +266 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/AttributeFilterStatement.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +134 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +8 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationIdUtil.js +31 -0
- package/build/dist/Server/Utils/Database/RelationIdUtil.js.map +1 -1
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +26 -8
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js +42 -17
- package/build/dist/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +9 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js +15 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SyntheticMonitor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +386 -271
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +278 -64
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +469 -350
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +183 -44
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +46 -3
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +18 -91
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js +194 -0
- package/build/dist/Server/Utils/Monitor/PerEntityCriteriaFanOut.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +332 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js +279 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteMaintenanceSuppression.js.map +1 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js +415 -0
- package/build/dist/Server/Utils/OnCallNotificationContext.js.map +1 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js +424 -0
- package/build/dist/Server/Utils/PrivateNetworkWebhookConfig.js.map +1 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +108 -0
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +12 -1
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +160 -58
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +89 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +75 -234
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +41 -16
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js +217 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventAlerting.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js +103 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js +168 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +527 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +70 -44
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +3 -0
- package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +52 -3
- package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js +24 -1
- package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +327 -0
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +84 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +10 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +29 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +121 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +0 -10
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Types/API/URL.js +40 -10
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +8 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/BaseDatabase/NotWildcard.js +72 -0
- package/build/dist/Types/BaseDatabase/NotWildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js +75 -0
- package/build/dist/Types/BaseDatabase/Wildcard.js.map +1 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js +137 -0
- package/build/dist/Types/BaseDatabase/WildcardPattern.js.map +1 -0
- package/build/dist/Types/Database/DateColumnValue.js +125 -0
- package/build/dist/Types/Database/DateColumnValue.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +18 -2
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Date.js +31 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/JSON.js +2 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js +111 -108
- package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +40 -16
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +29 -7
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +98 -4
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +40 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +36 -16
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +90 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js +84 -0
- package/build/dist/Types/NetworkSite/SiteHealthRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +354 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +100 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +8 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmConventions.js +236 -0
- package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/LlmMetricConventions.js +197 -5
- package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -1
- package/build/dist/Types/Telemetry/SourceMap.js +9 -0
- package/build/dist/Types/Telemetry/SourceMap.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js +661 -0
- package/build/dist/Types/Telemetry/TelemetrySearchQuery.js.map +1 -0
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +12 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +67 -0
- package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +28 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +25 -4
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +36 -16
- package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +14 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +54 -9
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js +128 -0
- package/build/dist/Utils/Monitor/InterfaceInventoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +190 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +206 -28
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +14 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +34 -18
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +163 -0
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js +99 -0
- package/build/dist/Utils/NetworkDiscovery/RescanIntervalUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js +85 -0
- package/build/dist/Utils/NetworkDiscovery/ScanModeUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js +560 -0
- package/build/dist/Utils/NetworkDiscovery/SnmpScanConfigUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js +56 -0
- package/build/dist/Utils/NetworkSite/SiteMaintenanceUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +185 -10
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +248 -21
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js +255 -0
- package/build/dist/Utils/SecurityEvent/ThreatIntel/StixPatternParser.js.map +1 -0
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +27 -30
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js +57 -1
- package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -1
- package/package.json +2 -1
- package/Tests/Types/Log/LogQueryParser.test.ts +0 -186
- package/Types/Log/LogQueryParser.ts +0 -252
- package/build/dist/Types/Log/LogQueryParser.js +0 -200
- package/build/dist/Types/Log/LogQueryParser.js.map +0 -1
|
@@ -4,6 +4,14 @@ import LlmSpanUtil, {
|
|
|
4
4
|
import { AttributeType } from "../../../../Server/Utils/Telemetry/Telemetry";
|
|
5
5
|
import Dictionary from "../../../../Types/Dictionary";
|
|
6
6
|
import { LlmModelPrice } from "../../../../Types/Telemetry/LlmCostCatalog";
|
|
7
|
+
import {
|
|
8
|
+
LlmEndUserAttributeKeys,
|
|
9
|
+
LlmTeamAttributeKeys,
|
|
10
|
+
LlmUserEmailAttributeKeys,
|
|
11
|
+
LlmUserIdAttributeKeys,
|
|
12
|
+
RESOURCE_ATTRIBUTE_KEY_PREFIX,
|
|
13
|
+
withResourcePrefixedKeys,
|
|
14
|
+
} from "../../../../Types/Telemetry/LlmConventions";
|
|
7
15
|
import { describe, expect, test } from "@jest/globals";
|
|
8
16
|
|
|
9
17
|
type Attrs = Dictionary<AttributeType | Array<AttributeType>>;
|
|
@@ -542,3 +550,799 @@ describe("LlmSpanUtil.extract — project price overrides", () => {
|
|
|
542
550
|
expect(fields.llmCost).toBe(0);
|
|
543
551
|
});
|
|
544
552
|
});
|
|
553
|
+
|
|
554
|
+
/*
|
|
555
|
+
* Employee identity extraction.
|
|
556
|
+
*
|
|
557
|
+
* The class of bug this block prevents is WRONG INTERNAL CHARGEBACK, in three
|
|
558
|
+
* flavours, each of which is silent — the columns are populated, the
|
|
559
|
+
* dashboards render, and the numbers are simply attributed to the wrong
|
|
560
|
+
* person:
|
|
561
|
+
*
|
|
562
|
+
* 1. Preference-order drift. Every list here is ordered preferred-first and
|
|
563
|
+
* the extractor returns the FIRST present key. If someone reorders a
|
|
564
|
+
* list (or the getString loop stops short-circuiting), a span carrying
|
|
565
|
+
* both the semconv key and a vendor fallback flips to the fallback and
|
|
566
|
+
* the same human shows up under two different ids.
|
|
567
|
+
* 2. Customer/employee conflation. gen_ai.user, llm.user and LiteLLM's
|
|
568
|
+
* end_user_id carry the CALLER'S OWN CUSTOMER. Mapping one into the
|
|
569
|
+
* employee columns turns a support bot's 40k customers into 40k phantom
|
|
570
|
+
* employees and zeroes out the engineer who actually owns the spend.
|
|
571
|
+
* 3. Gate erosion. user.id / user.email / team.id are GENERIC OTel keys
|
|
572
|
+
* that RUM and plain HTTP spans carry. If the isLlmSpan gate is dropped,
|
|
573
|
+
* the columns and their skip indexes get stamped onto the entire span
|
|
574
|
+
* fleet — the highest-volume class there is — to serve a reader that
|
|
575
|
+
* only ever queries LLM rows.
|
|
576
|
+
* 4. Tier omission. Ingest flattens RESOURCE attributes with a "resource."
|
|
577
|
+
* prefix, so identity set once per process — which is the only thing
|
|
578
|
+
* OTEL_RESOURCE_ATTRIBUTES can do, and what Cursor documents for
|
|
579
|
+
* cursor.user.id — arrives as `resource.user.id`, never `user.id`. A
|
|
580
|
+
* list of bare keys alone matches nothing at all, and every column is
|
|
581
|
+
* silently empty.
|
|
582
|
+
*/
|
|
583
|
+
|
|
584
|
+
/*
|
|
585
|
+
* The FULL expected key order, written out as literals ON PURPOSE.
|
|
586
|
+
*
|
|
587
|
+
* Two tiers, in this order and no other: every SPAN spelling first, then the
|
|
588
|
+
* same list again resource-prefixed. A span attribute describes one call and
|
|
589
|
+
* a resource attribute describes the whole process, so the span attribute is
|
|
590
|
+
* the more specific statement and has to win when both are present.
|
|
591
|
+
*/
|
|
592
|
+
const EXPECTED_USER_ID_KEY_ORDER: Array<string> = [
|
|
593
|
+
"user.id",
|
|
594
|
+
"enduser.id",
|
|
595
|
+
"litellm.metadata.user_api_key_user_id",
|
|
596
|
+
"metadata.user_api_key_user_id",
|
|
597
|
+
"traceloop.association.properties.user_id",
|
|
598
|
+
"langfuse.user.id",
|
|
599
|
+
"user.account_uuid",
|
|
600
|
+
"user.account_id",
|
|
601
|
+
"cursor.user.id",
|
|
602
|
+
"resource.user.id",
|
|
603
|
+
"resource.enduser.id",
|
|
604
|
+
"resource.litellm.metadata.user_api_key_user_id",
|
|
605
|
+
"resource.metadata.user_api_key_user_id",
|
|
606
|
+
"resource.traceloop.association.properties.user_id",
|
|
607
|
+
"resource.langfuse.user.id",
|
|
608
|
+
"resource.user.account_uuid",
|
|
609
|
+
"resource.user.account_id",
|
|
610
|
+
"resource.cursor.user.id",
|
|
611
|
+
];
|
|
612
|
+
|
|
613
|
+
const EXPECTED_USER_EMAIL_KEY_ORDER: Array<string> = [
|
|
614
|
+
"user.email",
|
|
615
|
+
"litellm.metadata.user_api_key_user_email",
|
|
616
|
+
"metadata.user_api_key_user_email",
|
|
617
|
+
"traceloop.association.properties.user_email",
|
|
618
|
+
"enduser.email",
|
|
619
|
+
"resource.user.email",
|
|
620
|
+
"resource.litellm.metadata.user_api_key_user_email",
|
|
621
|
+
"resource.metadata.user_api_key_user_email",
|
|
622
|
+
"resource.traceloop.association.properties.user_email",
|
|
623
|
+
"resource.enduser.email",
|
|
624
|
+
];
|
|
625
|
+
|
|
626
|
+
const EXPECTED_TEAM_KEY_ORDER: Array<string> = [
|
|
627
|
+
"team.id",
|
|
628
|
+
"team",
|
|
629
|
+
"cost_center",
|
|
630
|
+
"department",
|
|
631
|
+
"litellm.metadata.user_api_key_team_id",
|
|
632
|
+
"litellm.team.id",
|
|
633
|
+
"metadata.user_api_key_team_id",
|
|
634
|
+
"cursor.team.id",
|
|
635
|
+
"resource.team.id",
|
|
636
|
+
"resource.team",
|
|
637
|
+
"resource.cost_center",
|
|
638
|
+
"resource.department",
|
|
639
|
+
"resource.litellm.metadata.user_api_key_team_id",
|
|
640
|
+
"resource.litellm.team.id",
|
|
641
|
+
"resource.metadata.user_api_key_team_id",
|
|
642
|
+
"resource.cursor.team.id",
|
|
643
|
+
];
|
|
644
|
+
|
|
645
|
+
describe("LlmSpanUtil.extract — employee identity", () => {
|
|
646
|
+
/*
|
|
647
|
+
* Every recognized key, on its own, populates its column. A key that is
|
|
648
|
+
* listed but never read is worse than one that is absent: the list is the
|
|
649
|
+
* documentation, and a reader trusts it.
|
|
650
|
+
*/
|
|
651
|
+
test.each(LlmUserIdAttributeKeys)(
|
|
652
|
+
"user id key %s is recognized on its own",
|
|
653
|
+
(key: string) => {
|
|
654
|
+
const attrs: Attrs = {
|
|
655
|
+
"gen_ai.system": "openai",
|
|
656
|
+
[key]: "employee-value",
|
|
657
|
+
};
|
|
658
|
+
|
|
659
|
+
expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("employee-value");
|
|
660
|
+
},
|
|
661
|
+
);
|
|
662
|
+
|
|
663
|
+
test.each(LlmUserEmailAttributeKeys)(
|
|
664
|
+
"user email key %s is recognized on its own",
|
|
665
|
+
(key: string) => {
|
|
666
|
+
const attrs: Attrs = {
|
|
667
|
+
"gen_ai.system": "openai",
|
|
668
|
+
[key]: "engineer@example.com",
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe(
|
|
672
|
+
"engineer@example.com",
|
|
673
|
+
);
|
|
674
|
+
},
|
|
675
|
+
);
|
|
676
|
+
|
|
677
|
+
test.each(LlmTeamAttributeKeys)(
|
|
678
|
+
"team key %s is recognized on its own",
|
|
679
|
+
(key: string) => {
|
|
680
|
+
const attrs: Attrs = {
|
|
681
|
+
"gen_ai.system": "openai",
|
|
682
|
+
[key]: "platform",
|
|
683
|
+
};
|
|
684
|
+
|
|
685
|
+
expect(LlmSpanUtil.extract(attrs).llmTeam).toBe("platform");
|
|
686
|
+
},
|
|
687
|
+
);
|
|
688
|
+
|
|
689
|
+
/*
|
|
690
|
+
* LiteLLM proxy, DEFAULT configuration.
|
|
691
|
+
*
|
|
692
|
+
* This block exists because we shipped the wrong spelling once. The
|
|
693
|
+
* "litellm."-namespaced attributes only appear under LiteLLM's opt-in
|
|
694
|
+
* OpenTelemetry v2 mode (LITELLM_OTEL_V2, which defaults to false). The
|
|
695
|
+
* default `otel` callback stamps its metadata with a bare "metadata."
|
|
696
|
+
* prefix instead — every key in METRIC_METADATA_KEYS, assigned as
|
|
697
|
+
* `common_attrs[f"metadata.{key}"]` in
|
|
698
|
+
* litellm/integrations/opentelemetry.py.
|
|
699
|
+
*
|
|
700
|
+
* The consequence of recognizing only the v2 spelling was silent and total:
|
|
701
|
+
* a stock LiteLLM proxy issuing one virtual key per employee — the exact
|
|
702
|
+
* architecture our AI-gateway guide recommends as the cleanest chargeback
|
|
703
|
+
* setup — produced no attribution at all, with every gateway dollar landing
|
|
704
|
+
* in the Unattributed row and nothing anywhere to explain why.
|
|
705
|
+
*
|
|
706
|
+
* The end-user assertions are the other half: LiteLLM carries the DOWNSTREAM
|
|
707
|
+
* CUSTOMER in the sibling key user_api_key_end_user_id (and, in v2, in the
|
|
708
|
+
* dedicated litellm.end_user.id). Those must never reach an employee column,
|
|
709
|
+
* or a SaaS customer's id gets billed to an engineer.
|
|
710
|
+
*/
|
|
711
|
+
test("a default LiteLLM proxy attributes the key owner, not nobody", () => {
|
|
712
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract({
|
|
713
|
+
"gen_ai.system": "openai",
|
|
714
|
+
"gen_ai.request.model": "gpt-4o",
|
|
715
|
+
"metadata.user_api_key_user_id": "user_42",
|
|
716
|
+
"metadata.user_api_key_user_email": "engineer@example.com",
|
|
717
|
+
"metadata.user_api_key_team_id": "team_platform",
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
expect(fields.llmUserId).toBe("user_42");
|
|
721
|
+
expect(fields.llmUserEmail).toBe("engineer@example.com");
|
|
722
|
+
expect(fields.llmTeam).toBe("team_platform");
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
test("a LiteLLM v2 proxy attributes the key owner too", () => {
|
|
726
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract({
|
|
727
|
+
"gen_ai.system": "anthropic",
|
|
728
|
+
"gen_ai.request.model": "claude-sonnet-4",
|
|
729
|
+
"litellm.metadata.user_api_key_user_id": "user_42",
|
|
730
|
+
"litellm.metadata.user_api_key_user_email": "engineer@example.com",
|
|
731
|
+
"litellm.team.id": "team_platform",
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
expect(fields.llmUserId).toBe("user_42");
|
|
735
|
+
expect(fields.llmUserEmail).toBe("engineer@example.com");
|
|
736
|
+
expect(fields.llmTeam).toBe("team_platform");
|
|
737
|
+
});
|
|
738
|
+
|
|
739
|
+
test.each([
|
|
740
|
+
["metadata.user_api_key_end_user_id", "v1 default spelling"],
|
|
741
|
+
["litellm.metadata.user_api_key_end_user_id", "v2 metadata spelling"],
|
|
742
|
+
["litellm.end_user.id", "v2 dedicated attribute"],
|
|
743
|
+
])(
|
|
744
|
+
"LiteLLM's downstream customer never becomes the employee (%s — %s)",
|
|
745
|
+
(key: string) => {
|
|
746
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract({
|
|
747
|
+
"gen_ai.system": "openai",
|
|
748
|
+
"gen_ai.request.model": "gpt-4o",
|
|
749
|
+
[key]: "customer_abc",
|
|
750
|
+
});
|
|
751
|
+
|
|
752
|
+
expect(fields.llmUserId).toBe("");
|
|
753
|
+
expect(fields.llmUserEmail).toBe("");
|
|
754
|
+
expect(fields.llmTeam).toBe("");
|
|
755
|
+
},
|
|
756
|
+
);
|
|
757
|
+
|
|
758
|
+
test("the key owner is billed even when a customer id rides along", () => {
|
|
759
|
+
/*
|
|
760
|
+
* The realistic shape: a SaaS product routing its own customers' traffic
|
|
761
|
+
* through a per-engineer virtual key. Both ids are present on one span and
|
|
762
|
+
* they must land in different places — the employee in the identity
|
|
763
|
+
* columns, the customer nowhere near them.
|
|
764
|
+
*/
|
|
765
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract({
|
|
766
|
+
"gen_ai.system": "openai",
|
|
767
|
+
"gen_ai.request.model": "gpt-4o",
|
|
768
|
+
"metadata.user_api_key_user_id": "user_42",
|
|
769
|
+
"metadata.user_api_key_end_user_id": "customer_abc",
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
expect(fields.llmUserId).toBe("user_42");
|
|
773
|
+
expect(fields.llmUserEmail).toBe("");
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
/*
|
|
777
|
+
* Preference order, pinned to LITERAL key strings in a LITERAL order.
|
|
778
|
+
*
|
|
779
|
+
* The obvious way to write this — derive the fixture and the expectation
|
|
780
|
+
* from the array under test — is worse than no test at all: it passes under
|
|
781
|
+
* ANY reordering of the array, so it certifies a property it cannot
|
|
782
|
+
* actually check while looking like it does. The literal constants above
|
|
783
|
+
* are the expectation; the toEqual tests below bolt each constant to its
|
|
784
|
+
* exported array, and the behavioural tests drive the extractor from the
|
|
785
|
+
* constant. Reorder the array and the toEqual fails; break the extractor's
|
|
786
|
+
* first-match-wins loop and the behavioural test fails.
|
|
787
|
+
*/
|
|
788
|
+
test("the user id list is exactly this order", () => {
|
|
789
|
+
expect(LlmUserIdAttributeKeys).toEqual(EXPECTED_USER_ID_KEY_ORDER);
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
test("the user email list is exactly this order", () => {
|
|
793
|
+
expect(LlmUserEmailAttributeKeys).toEqual(EXPECTED_USER_EMAIL_KEY_ORDER);
|
|
794
|
+
});
|
|
795
|
+
|
|
796
|
+
test("the team list is exactly this order", () => {
|
|
797
|
+
expect(LlmTeamAttributeKeys).toEqual(EXPECTED_TEAM_KEY_ORDER);
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
/*
|
|
801
|
+
* For each key, a span carrying it plus every key after it must resolve to
|
|
802
|
+
* that key. Driven off the literal orders above, so a single reorder
|
|
803
|
+
* anywhere fails.
|
|
804
|
+
*/
|
|
805
|
+
test.each(
|
|
806
|
+
EXPECTED_USER_ID_KEY_ORDER.map((key: string, index: number) => {
|
|
807
|
+
return [key, index] as [string, number];
|
|
808
|
+
}),
|
|
809
|
+
)("user id key %s beats every key after it", (key: string, index: number) => {
|
|
810
|
+
const attrs: Attrs = { "gen_ai.system": "openai" };
|
|
811
|
+
|
|
812
|
+
for (const lower of EXPECTED_USER_ID_KEY_ORDER.slice(index)) {
|
|
813
|
+
attrs[lower] = `value-of-${lower}`;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
expect(LlmSpanUtil.extract(attrs).llmUserId).toBe(`value-of-${key}`);
|
|
817
|
+
});
|
|
818
|
+
|
|
819
|
+
test.each(
|
|
820
|
+
EXPECTED_USER_EMAIL_KEY_ORDER.map((key: string, index: number) => {
|
|
821
|
+
return [key, index] as [string, number];
|
|
822
|
+
}),
|
|
823
|
+
)(
|
|
824
|
+
"user email key %s beats every key after it",
|
|
825
|
+
(key: string, index: number) => {
|
|
826
|
+
const attrs: Attrs = { "gen_ai.system": "openai" };
|
|
827
|
+
|
|
828
|
+
for (const lower of EXPECTED_USER_EMAIL_KEY_ORDER.slice(index)) {
|
|
829
|
+
attrs[lower] = `${lower}@example.com`;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe(
|
|
833
|
+
`${key}@example.com`,
|
|
834
|
+
);
|
|
835
|
+
},
|
|
836
|
+
);
|
|
837
|
+
|
|
838
|
+
test.each(
|
|
839
|
+
EXPECTED_TEAM_KEY_ORDER.map((key: string, index: number) => {
|
|
840
|
+
return [key, index] as [string, number];
|
|
841
|
+
}),
|
|
842
|
+
)("team key %s beats every key after it", (key: string, index: number) => {
|
|
843
|
+
const attrs: Attrs = { "gen_ai.system": "openai" };
|
|
844
|
+
|
|
845
|
+
for (const lower of EXPECTED_TEAM_KEY_ORDER.slice(index)) {
|
|
846
|
+
attrs[lower] = `team-${lower}`;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
expect(LlmSpanUtil.extract(attrs).llmTeam).toBe(`team-${key}`);
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
test("the semconv key beats the vendor fallback on a realistic gateway span", () => {
|
|
853
|
+
/*
|
|
854
|
+
* A LiteLLM-proxied call from a Claude Code session carries all three
|
|
855
|
+
* spellings at once. user.id is the key an organization can standardize
|
|
856
|
+
* on across every emitter, so it has to win.
|
|
857
|
+
*/
|
|
858
|
+
const attrs: Attrs = {
|
|
859
|
+
"gen_ai.system": "anthropic",
|
|
860
|
+
"gen_ai.request.model": "claude-sonnet-4-6",
|
|
861
|
+
"user.id": "u-semconv",
|
|
862
|
+
"litellm.metadata.user_api_key_user_id": "u-litellm",
|
|
863
|
+
"user.account_uuid": "u-claude-code",
|
|
864
|
+
};
|
|
865
|
+
|
|
866
|
+
expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("u-semconv");
|
|
867
|
+
});
|
|
868
|
+
|
|
869
|
+
test("a full coding-agent span populates all three identity columns", () => {
|
|
870
|
+
const attrs: Attrs = {
|
|
871
|
+
"gen_ai.system": "anthropic",
|
|
872
|
+
"gen_ai.request.model": "claude-opus-4-8",
|
|
873
|
+
"user.email": "ada@example.com",
|
|
874
|
+
"user.account_uuid": "acct-9f2",
|
|
875
|
+
cost_center: "RD-114",
|
|
876
|
+
"gen_ai.usage.input_tokens": 100,
|
|
877
|
+
"gen_ai.usage.output_tokens": 20,
|
|
878
|
+
};
|
|
879
|
+
|
|
880
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
881
|
+
|
|
882
|
+
expect(fields.llmUserId).toBe("acct-9f2");
|
|
883
|
+
expect(fields.llmUserEmail).toBe("ada@example.com");
|
|
884
|
+
expect(fields.llmTeam).toBe("RD-114");
|
|
885
|
+
});
|
|
886
|
+
|
|
887
|
+
/*
|
|
888
|
+
* THE exclusion. These keys carry the caller's own downstream customer, not
|
|
889
|
+
* the employee. A span carrying only them must leave the employee columns
|
|
890
|
+
* empty — silently mapping them would produce chargeback that is wrong
|
|
891
|
+
* rather than merely imprecise.
|
|
892
|
+
*/
|
|
893
|
+
test.each(LlmEndUserAttributeKeys)(
|
|
894
|
+
"downstream-customer key %s never populates the employee columns",
|
|
895
|
+
(key: string) => {
|
|
896
|
+
const attrs: Attrs = {
|
|
897
|
+
"gen_ai.system": "openai",
|
|
898
|
+
"gen_ai.request.model": "gpt-4o",
|
|
899
|
+
[key]: "customer-9001",
|
|
900
|
+
};
|
|
901
|
+
|
|
902
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
903
|
+
|
|
904
|
+
expect(fields.isLlmSpan).toBe(true);
|
|
905
|
+
expect(fields.llmUserId).toBe("");
|
|
906
|
+
expect(fields.llmUserEmail).toBe("");
|
|
907
|
+
},
|
|
908
|
+
);
|
|
909
|
+
|
|
910
|
+
test("a span carrying ONLY customer-identity keys yields empty identity", () => {
|
|
911
|
+
const attrs: Attrs = {
|
|
912
|
+
"gen_ai.user": "customer-1",
|
|
913
|
+
"llm.user": "customer-1",
|
|
914
|
+
"litellm.metadata.user_api_key_end_user_id": "customer-1",
|
|
915
|
+
};
|
|
916
|
+
|
|
917
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
918
|
+
|
|
919
|
+
// The llm./gen_ai. namespaces still mark it as an LLM span...
|
|
920
|
+
expect(fields.isLlmSpan).toBe(true);
|
|
921
|
+
// ...but nobody internal is charged for it.
|
|
922
|
+
expect(fields.llmUserId).toBe("");
|
|
923
|
+
expect(fields.llmUserEmail).toBe("");
|
|
924
|
+
expect(fields.llmTeam).toBe("");
|
|
925
|
+
});
|
|
926
|
+
|
|
927
|
+
test("the employee wins when both humans are on the same span", () => {
|
|
928
|
+
/*
|
|
929
|
+
* The realistic SaaS shape: an internal service calls OpenAI on behalf of
|
|
930
|
+
* a customer, passing the customer through as the `user` request param.
|
|
931
|
+
* The engineer's team owns the bill.
|
|
932
|
+
*/
|
|
933
|
+
const attrs: Attrs = {
|
|
934
|
+
"gen_ai.system": "openai",
|
|
935
|
+
"gen_ai.request.model": "gpt-4o",
|
|
936
|
+
"user.id": "employee-42",
|
|
937
|
+
"gen_ai.user": "customer-9001",
|
|
938
|
+
"litellm.metadata.user_api_key_user_id": "employee-42",
|
|
939
|
+
"litellm.metadata.user_api_key_end_user_id": "customer-9001",
|
|
940
|
+
};
|
|
941
|
+
|
|
942
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
943
|
+
|
|
944
|
+
expect(fields.llmUserId).toBe("employee-42");
|
|
945
|
+
});
|
|
946
|
+
|
|
947
|
+
/*
|
|
948
|
+
* The isLlmSpan gate. user.id / user.email / team.id are generic keys the
|
|
949
|
+
* RUM and HTTP fleet carries; those spans must stay untouched.
|
|
950
|
+
*/
|
|
951
|
+
test("a non-LLM RUM span with user.id gets no identity columns", () => {
|
|
952
|
+
const attrs: Attrs = {
|
|
953
|
+
"http.method": "GET",
|
|
954
|
+
"http.route": "/checkout",
|
|
955
|
+
"user.id": "rum-user-123",
|
|
956
|
+
"user.email": "shopper@example.com",
|
|
957
|
+
"team.id": "frontend",
|
|
958
|
+
};
|
|
959
|
+
|
|
960
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
961
|
+
|
|
962
|
+
expect(fields.isLlmSpan).toBe(false);
|
|
963
|
+
expect(fields.llmUserId).toBe("");
|
|
964
|
+
expect(fields.llmUserEmail).toBe("");
|
|
965
|
+
expect(fields.llmTeam).toBe("");
|
|
966
|
+
});
|
|
967
|
+
|
|
968
|
+
test("a non-LLM backend span with a full identity set stays empty", () => {
|
|
969
|
+
const attrs: Attrs = {
|
|
970
|
+
"db.system": "postgresql",
|
|
971
|
+
"enduser.id": "svc-account",
|
|
972
|
+
cost_center: "RD-114",
|
|
973
|
+
department: "platform",
|
|
974
|
+
};
|
|
975
|
+
|
|
976
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
977
|
+
|
|
978
|
+
expect(fields.isLlmSpan).toBe(false);
|
|
979
|
+
expect(fields).toEqual(LlmSpanUtil.empty());
|
|
980
|
+
});
|
|
981
|
+
|
|
982
|
+
test("absent identity yields empty strings, not undefined", () => {
|
|
983
|
+
const attrs: Attrs = {
|
|
984
|
+
"gen_ai.system": "openai",
|
|
985
|
+
"gen_ai.request.model": "gpt-4o",
|
|
986
|
+
};
|
|
987
|
+
|
|
988
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
989
|
+
|
|
990
|
+
expect(fields.llmUserId).toBe("");
|
|
991
|
+
expect(fields.llmUserEmail).toBe("");
|
|
992
|
+
expect(fields.llmTeam).toBe("");
|
|
993
|
+
});
|
|
994
|
+
|
|
995
|
+
/*
|
|
996
|
+
* Whitespace-only values. An emitter that stamps an unset env var produces
|
|
997
|
+
* "" or " "; treating that as a real identity would create a phantom
|
|
998
|
+
* employee whose name is a space and would shadow the genuine fallback key
|
|
999
|
+
* further down the list.
|
|
1000
|
+
*/
|
|
1001
|
+
test("a whitespace-only value yields an empty string, not whitespace", () => {
|
|
1002
|
+
const attrs: Attrs = {
|
|
1003
|
+
"gen_ai.system": "openai",
|
|
1004
|
+
"user.id": " ",
|
|
1005
|
+
"user.email": "\t\n",
|
|
1006
|
+
"team.id": " ",
|
|
1007
|
+
};
|
|
1008
|
+
|
|
1009
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
1010
|
+
|
|
1011
|
+
expect(fields.llmUserId).toBe("");
|
|
1012
|
+
expect(fields.llmUserEmail).toBe("");
|
|
1013
|
+
expect(fields.llmTeam).toBe("");
|
|
1014
|
+
});
|
|
1015
|
+
|
|
1016
|
+
test("a whitespace-only preferred key falls through to the next key", () => {
|
|
1017
|
+
const attrs: Attrs = {
|
|
1018
|
+
"gen_ai.system": "openai",
|
|
1019
|
+
"user.id": " ",
|
|
1020
|
+
"enduser.id": "employee-7",
|
|
1021
|
+
};
|
|
1022
|
+
|
|
1023
|
+
expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("employee-7");
|
|
1024
|
+
});
|
|
1025
|
+
|
|
1026
|
+
/*
|
|
1027
|
+
* Array-valued attributes. OTLP array values arrive as JS arrays; String()
|
|
1028
|
+
* on one would produce a comma-joined string that looks like a legitimate
|
|
1029
|
+
* id ("a,b") and would be indexed as one.
|
|
1030
|
+
*/
|
|
1031
|
+
test("an array-valued identity attribute is ignored, not stringified", () => {
|
|
1032
|
+
const attrs: Attrs = {
|
|
1033
|
+
"gen_ai.system": "openai",
|
|
1034
|
+
"user.id": ["u-1", "u-2"],
|
|
1035
|
+
"user.email": ["a@example.com"],
|
|
1036
|
+
"team.id": ["platform"],
|
|
1037
|
+
};
|
|
1038
|
+
|
|
1039
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
1040
|
+
|
|
1041
|
+
expect(fields.llmUserId).toBe("");
|
|
1042
|
+
expect(fields.llmUserEmail).toBe("");
|
|
1043
|
+
expect(fields.llmTeam).toBe("");
|
|
1044
|
+
});
|
|
1045
|
+
|
|
1046
|
+
test("an array-valued preferred key falls through to the next key", () => {
|
|
1047
|
+
const attrs: Attrs = {
|
|
1048
|
+
"gen_ai.system": "openai",
|
|
1049
|
+
"user.email": ["not", "a", "person"],
|
|
1050
|
+
"traceloop.association.properties.user_email": "grace@example.com",
|
|
1051
|
+
};
|
|
1052
|
+
|
|
1053
|
+
expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe("grace@example.com");
|
|
1054
|
+
});
|
|
1055
|
+
|
|
1056
|
+
test("a numeric identity value is coerced to its string form", () => {
|
|
1057
|
+
// Cursor's user id is an opaque integer, not a string.
|
|
1058
|
+
const attrs: Attrs = {
|
|
1059
|
+
"gen_ai.system": "anthropic",
|
|
1060
|
+
"cursor.user.id": 90210,
|
|
1061
|
+
};
|
|
1062
|
+
|
|
1063
|
+
expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("90210");
|
|
1064
|
+
});
|
|
1065
|
+
|
|
1066
|
+
test("identity does not change cost, tokens or LLM detection", () => {
|
|
1067
|
+
/*
|
|
1068
|
+
* A guard on the blast radius: adding identity must not perturb any
|
|
1069
|
+
* pre-existing column. Same span, with and without the identity keys.
|
|
1070
|
+
*/
|
|
1071
|
+
const base: Attrs = {
|
|
1072
|
+
"gen_ai.system": "openai",
|
|
1073
|
+
"gen_ai.request.model": "gpt-4o",
|
|
1074
|
+
"gen_ai.usage.input_tokens": 1_000_000,
|
|
1075
|
+
"gen_ai.usage.output_tokens": 100_000,
|
|
1076
|
+
};
|
|
1077
|
+
|
|
1078
|
+
const withIdentity: Attrs = {
|
|
1079
|
+
...base,
|
|
1080
|
+
"user.id": "employee-42",
|
|
1081
|
+
"user.email": "ada@example.com",
|
|
1082
|
+
"team.id": "platform",
|
|
1083
|
+
};
|
|
1084
|
+
|
|
1085
|
+
const before: LlmSpanFields = LlmSpanUtil.extract(base);
|
|
1086
|
+
const after: LlmSpanFields = LlmSpanUtil.extract(withIdentity);
|
|
1087
|
+
|
|
1088
|
+
expect({
|
|
1089
|
+
...after,
|
|
1090
|
+
llmUserId: "",
|
|
1091
|
+
llmUserEmail: "",
|
|
1092
|
+
llmTeam: "",
|
|
1093
|
+
}).toEqual(before);
|
|
1094
|
+
});
|
|
1095
|
+
});
|
|
1096
|
+
|
|
1097
|
+
/*
|
|
1098
|
+
* RESOURCE-attribute identity.
|
|
1099
|
+
*
|
|
1100
|
+
* The failure this block exists to catch is total and silent. All three OTLP
|
|
1101
|
+
* ingest services flatten resource attributes through
|
|
1102
|
+
* `TelemetryUtil.getAttributes({ items, prefixKeysWithString: "resource" })`,
|
|
1103
|
+
* so nothing an operator sets on the resource ever reaches the extractor
|
|
1104
|
+
* under its bare name. Concretely:
|
|
1105
|
+
*
|
|
1106
|
+
* OTEL_RESOURCE_ATTRIBUTES=team.id=platform,cost_center=RD-114
|
|
1107
|
+
*
|
|
1108
|
+
* — the mechanism the coding-agent docs present as THE way to attribute spend
|
|
1109
|
+
* to a cost centre — produces `resource.team.id` and `resource.cost_center`.
|
|
1110
|
+
* Against a bare-key-only list that matches nothing, every team column is
|
|
1111
|
+
* empty, and the AI / LLM Usage view shows a tidy, complete, entirely blank
|
|
1112
|
+
* team breakdown. Cursor is the same story: it documents cursor.user.id and
|
|
1113
|
+
* cursor.team.id as RESOURCE attributes.
|
|
1114
|
+
*
|
|
1115
|
+
* OtelTracesIngestService already hit this trap once with session replay and
|
|
1116
|
+
* fixed it the same way — see its `sessionIdAttributeKeys`, whose comment
|
|
1117
|
+
* notes that reading only the bare key "would look correct in a unit test and
|
|
1118
|
+
* fail in production". These tests are the unit tests that would not have
|
|
1119
|
+
* looked correct.
|
|
1120
|
+
*/
|
|
1121
|
+
describe("LlmSpanUtil.extract — resource-prefixed identity", () => {
|
|
1122
|
+
test.each([
|
|
1123
|
+
["resource.user.id", "employee-42"],
|
|
1124
|
+
["resource.user.email", "ada@example.com"],
|
|
1125
|
+
["resource.team.id", "platform"],
|
|
1126
|
+
["resource.cost_center", "RD-114"],
|
|
1127
|
+
["resource.cursor.user.id", "90210"],
|
|
1128
|
+
["resource.cursor.team.id", "team-7"],
|
|
1129
|
+
["resource.enduser.id", "svc-account"],
|
|
1130
|
+
["resource.department", "research"],
|
|
1131
|
+
])(
|
|
1132
|
+
"resource attribute %s is extracted, not ignored",
|
|
1133
|
+
(key: string, value: string) => {
|
|
1134
|
+
const attrs: Attrs = {
|
|
1135
|
+
"gen_ai.system": "anthropic",
|
|
1136
|
+
"gen_ai.request.model": "claude-sonnet-4-6",
|
|
1137
|
+
[key]: value,
|
|
1138
|
+
};
|
|
1139
|
+
|
|
1140
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
1141
|
+
|
|
1142
|
+
const populated: string =
|
|
1143
|
+
fields.llmUserId || fields.llmUserEmail || fields.llmTeam;
|
|
1144
|
+
|
|
1145
|
+
expect(populated).toBe(value);
|
|
1146
|
+
},
|
|
1147
|
+
);
|
|
1148
|
+
|
|
1149
|
+
test("OTEL_RESOURCE_ATTRIBUTES team attribution reaches the team column", () => {
|
|
1150
|
+
/*
|
|
1151
|
+
* The literal shape a Claude Code / Gemini CLI fleet produces once the
|
|
1152
|
+
* operator sets OTEL_RESOURCE_ATTRIBUTES and the CLI stamps the signed-in
|
|
1153
|
+
* account onto the resource too.
|
|
1154
|
+
*/
|
|
1155
|
+
const attrs: Attrs = {
|
|
1156
|
+
"gen_ai.system": "anthropic",
|
|
1157
|
+
"gen_ai.request.model": "claude-opus-4-8",
|
|
1158
|
+
"resource.team.id": "platform",
|
|
1159
|
+
"resource.cost_center": "RD-114",
|
|
1160
|
+
"resource.user.email": "ada@example.com",
|
|
1161
|
+
"resource.user.account_uuid": "acct-9f2",
|
|
1162
|
+
"gen_ai.usage.input_tokens": 100,
|
|
1163
|
+
"gen_ai.usage.output_tokens": 20,
|
|
1164
|
+
};
|
|
1165
|
+
|
|
1166
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
1167
|
+
|
|
1168
|
+
expect(fields.llmTeam).toBe("platform");
|
|
1169
|
+
expect(fields.llmUserEmail).toBe("ada@example.com");
|
|
1170
|
+
expect(fields.llmUserId).toBe("acct-9f2");
|
|
1171
|
+
});
|
|
1172
|
+
|
|
1173
|
+
/*
|
|
1174
|
+
* Tier precedence. A span attribute describes ONE call; a resource
|
|
1175
|
+
* attribute describes the whole process. When both are present the span
|
|
1176
|
+
* attribute is the more specific statement and must win — otherwise a
|
|
1177
|
+
* process-wide default would mask the per-call override that was set
|
|
1178
|
+
* deliberately to correct it.
|
|
1179
|
+
*/
|
|
1180
|
+
test.each([
|
|
1181
|
+
["user.id", "resource.user.id"],
|
|
1182
|
+
["cursor.user.id", "resource.user.id"],
|
|
1183
|
+
["user.account_id", "resource.user.id"],
|
|
1184
|
+
])(
|
|
1185
|
+
"span attribute %s beats resource attribute %s",
|
|
1186
|
+
(spanKey: string, resourceKey: string) => {
|
|
1187
|
+
const attrs: Attrs = {
|
|
1188
|
+
"gen_ai.system": "openai",
|
|
1189
|
+
[spanKey]: "from-span",
|
|
1190
|
+
[resourceKey]: "from-resource",
|
|
1191
|
+
};
|
|
1192
|
+
|
|
1193
|
+
expect(LlmSpanUtil.extract(attrs).llmUserId).toBe("from-span");
|
|
1194
|
+
},
|
|
1195
|
+
);
|
|
1196
|
+
|
|
1197
|
+
test("a span-level email beats a resource-level email", () => {
|
|
1198
|
+
const attrs: Attrs = {
|
|
1199
|
+
"gen_ai.system": "openai",
|
|
1200
|
+
"user.email": "span@example.com",
|
|
1201
|
+
"resource.user.email": "resource@example.com",
|
|
1202
|
+
};
|
|
1203
|
+
|
|
1204
|
+
expect(LlmSpanUtil.extract(attrs).llmUserEmail).toBe("span@example.com");
|
|
1205
|
+
});
|
|
1206
|
+
|
|
1207
|
+
test("a span-level team beats a resource-level team", () => {
|
|
1208
|
+
const attrs: Attrs = {
|
|
1209
|
+
"gen_ai.system": "openai",
|
|
1210
|
+
"cursor.team.id": "span-team",
|
|
1211
|
+
"resource.team.id": "resource-team",
|
|
1212
|
+
};
|
|
1213
|
+
|
|
1214
|
+
expect(LlmSpanUtil.extract(attrs).llmTeam).toBe("span-team");
|
|
1215
|
+
});
|
|
1216
|
+
|
|
1217
|
+
test("the resource tier is a suffix block, never interleaved", () => {
|
|
1218
|
+
/*
|
|
1219
|
+
* Pinned as a structural relation as well as by the literal orders above:
|
|
1220
|
+
* every bare key precedes every resource key. If someone "tidies" the
|
|
1221
|
+
* lists by grouping each key next to its own resource twin, a vendor
|
|
1222
|
+
* span attribute would start losing to a resource attribute of a
|
|
1223
|
+
* more-preferred key, silently changing which value lands in the column.
|
|
1224
|
+
*/
|
|
1225
|
+
for (const list of [
|
|
1226
|
+
LlmUserIdAttributeKeys,
|
|
1227
|
+
LlmUserEmailAttributeKeys,
|
|
1228
|
+
LlmTeamAttributeKeys,
|
|
1229
|
+
LlmEndUserAttributeKeys,
|
|
1230
|
+
]) {
|
|
1231
|
+
const firstResourceIndex: number = list.findIndex((key: string) => {
|
|
1232
|
+
return key.startsWith(RESOURCE_ATTRIBUTE_KEY_PREFIX);
|
|
1233
|
+
});
|
|
1234
|
+
|
|
1235
|
+
expect(firstResourceIndex).toBe(list.length / 2);
|
|
1236
|
+
|
|
1237
|
+
for (const key of list.slice(firstResourceIndex)) {
|
|
1238
|
+
expect(key.startsWith(RESOURCE_ATTRIBUTE_KEY_PREFIX)).toBe(true);
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
});
|
|
1242
|
+
|
|
1243
|
+
/*
|
|
1244
|
+
* The EXCLUSION has to cover the resource tier too. The employee lists now
|
|
1245
|
+
* carry both spellings, so if the end-user list stopped at the bare ones,
|
|
1246
|
+
* `resource.gen_ai.user` — a downstream CUSTOMER id — could be appended to
|
|
1247
|
+
* an employee list and every exclusion test would still pass.
|
|
1248
|
+
*/
|
|
1249
|
+
test.each([
|
|
1250
|
+
"resource.gen_ai.user",
|
|
1251
|
+
"resource.llm.user",
|
|
1252
|
+
"resource.litellm.metadata.user_api_key_end_user_id",
|
|
1253
|
+
])(
|
|
1254
|
+
"resource-prefixed customer key %s never populates the employee columns",
|
|
1255
|
+
(key: string) => {
|
|
1256
|
+
const attrs: Attrs = {
|
|
1257
|
+
"gen_ai.system": "openai",
|
|
1258
|
+
"gen_ai.request.model": "gpt-4o",
|
|
1259
|
+
[key]: "customer-9001",
|
|
1260
|
+
};
|
|
1261
|
+
|
|
1262
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
1263
|
+
|
|
1264
|
+
expect(fields.isLlmSpan).toBe(true);
|
|
1265
|
+
expect(fields.llmUserId).toBe("");
|
|
1266
|
+
expect(fields.llmUserEmail).toBe("");
|
|
1267
|
+
expect(fields.llmTeam).toBe("");
|
|
1268
|
+
},
|
|
1269
|
+
);
|
|
1270
|
+
|
|
1271
|
+
test("the exclusion list itself covers the resource tier", () => {
|
|
1272
|
+
for (const key of [
|
|
1273
|
+
"resource.gen_ai.user",
|
|
1274
|
+
"resource.llm.user",
|
|
1275
|
+
"resource.litellm.metadata.user_api_key_end_user_id",
|
|
1276
|
+
]) {
|
|
1277
|
+
expect(LlmEndUserAttributeKeys).toContain(key);
|
|
1278
|
+
expect(LlmUserIdAttributeKeys).not.toContain(key);
|
|
1279
|
+
expect(LlmUserEmailAttributeKeys).not.toContain(key);
|
|
1280
|
+
expect(LlmTeamAttributeKeys).not.toContain(key);
|
|
1281
|
+
}
|
|
1282
|
+
});
|
|
1283
|
+
|
|
1284
|
+
test("no employee key is also an end-user key, in either tier", () => {
|
|
1285
|
+
for (const key of LlmEndUserAttributeKeys) {
|
|
1286
|
+
expect(LlmUserIdAttributeKeys).not.toContain(key);
|
|
1287
|
+
expect(LlmUserEmailAttributeKeys).not.toContain(key);
|
|
1288
|
+
expect(LlmTeamAttributeKeys).not.toContain(key);
|
|
1289
|
+
}
|
|
1290
|
+
});
|
|
1291
|
+
|
|
1292
|
+
test("the isLlmSpan gate still applies to resource-level identity", () => {
|
|
1293
|
+
/*
|
|
1294
|
+
* A browser RUM fleet sets user.id on the resource for every single span
|
|
1295
|
+
* it emits. Widening the lists must not widen the gate.
|
|
1296
|
+
*/
|
|
1297
|
+
const attrs: Attrs = {
|
|
1298
|
+
"http.method": "GET",
|
|
1299
|
+
"http.route": "/checkout",
|
|
1300
|
+
"resource.user.id": "rum-user-123",
|
|
1301
|
+
"resource.user.email": "shopper@example.com",
|
|
1302
|
+
"resource.team.id": "frontend",
|
|
1303
|
+
};
|
|
1304
|
+
|
|
1305
|
+
const fields: LlmSpanFields = LlmSpanUtil.extract(attrs);
|
|
1306
|
+
|
|
1307
|
+
expect(fields.isLlmSpan).toBe(false);
|
|
1308
|
+
expect(fields).toEqual(LlmSpanUtil.empty());
|
|
1309
|
+
});
|
|
1310
|
+
});
|
|
1311
|
+
|
|
1312
|
+
/*
|
|
1313
|
+
* withResourcePrefixedKeys itself. It is the one function standing between an
|
|
1314
|
+
* operator's OTEL_RESOURCE_ATTRIBUTES and a populated column, so its shape is
|
|
1315
|
+
* worth pinning directly rather than only through the lists it produces.
|
|
1316
|
+
*/
|
|
1317
|
+
describe("withResourcePrefixedKeys", () => {
|
|
1318
|
+
test("appends the prefixed block after the bare block, order preserved", () => {
|
|
1319
|
+
expect(withResourcePrefixedKeys(["a.b", "c"])).toEqual([
|
|
1320
|
+
"a.b",
|
|
1321
|
+
"c",
|
|
1322
|
+
"resource.a.b",
|
|
1323
|
+
"resource.c",
|
|
1324
|
+
]);
|
|
1325
|
+
});
|
|
1326
|
+
|
|
1327
|
+
test("does not mutate its input", () => {
|
|
1328
|
+
const input: Array<string> = ["a.b"];
|
|
1329
|
+
|
|
1330
|
+
withResourcePrefixedKeys(input);
|
|
1331
|
+
|
|
1332
|
+
expect(input).toEqual(["a.b"]);
|
|
1333
|
+
});
|
|
1334
|
+
|
|
1335
|
+
test("the prefix is the string ingest actually stamps", () => {
|
|
1336
|
+
/*
|
|
1337
|
+
* TelemetryUtil.getAttributes is called with
|
|
1338
|
+
* prefixKeysWithString: "resource" and joins with a dot, so the key that
|
|
1339
|
+
* arrives is "resource.<key>". A prefix without the dot would match
|
|
1340
|
+
* nothing and no other test here would notice.
|
|
1341
|
+
*/
|
|
1342
|
+
expect(RESOURCE_ATTRIBUTE_KEY_PREFIX).toBe("resource.");
|
|
1343
|
+
});
|
|
1344
|
+
|
|
1345
|
+
test("an empty list stays empty", () => {
|
|
1346
|
+
expect(withResourcePrefixedKeys([])).toEqual([]);
|
|
1347
|
+
});
|
|
1348
|
+
});
|