@oneuptime/common 10.8.2 → 11.0.0
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/AnalyticsBaseModel/AnalyticsBaseModel.ts +16 -18
- package/Models/AnalyticsModels/AuditLog.ts +3 -1
- package/Models/AnalyticsModels/ExceptionInstance.ts +200 -82
- package/Models/AnalyticsModels/Index.ts +7 -2
- package/Models/AnalyticsModels/Log.ts +197 -81
- package/Models/AnalyticsModels/Metric.ts +199 -86
- package/Models/AnalyticsModels/MetricBaselineHourly.ts +44 -25
- package/Models/AnalyticsModels/MetricItemAggMV1m.ts +23 -20
- package/Models/AnalyticsModels/{MetricItemAggMV1mByHost.ts → MetricItemAggMV1mByHostV2.ts} +58 -47
- package/Models/AnalyticsModels/MonitorLog.ts +5 -1
- package/Models/AnalyticsModels/Profile.ts +206 -85
- package/Models/AnalyticsModels/ProfileSample.ts +196 -83
- package/Models/AnalyticsModels/Span.ts +218 -85
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/Service.ts +29 -0
- package/Models/DatabaseModels/TelemetryEntity.ts +393 -0
- package/Models/DatabaseModels/TelemetryEntityRelationship.ts +294 -0
- package/Models/DatabaseModels/TelemetryException.ts +10 -10
- package/Models/DatabaseModels/TelemetryUsageBilling.ts +5 -5
- package/Server/API/AIAgentDataAPI.ts +13 -12
- package/Server/API/DashboardAPI.ts +2 -2
- package/Server/API/TelemetryAPI.ts +656 -141
- package/Server/API/TelemetryExceptionAPI.ts +2 -2
- package/Server/Infrastructure/ClickhouseConfig.ts +12 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.ts +48 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.ts +70 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.ts +207 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/Queue.ts +36 -3
- package/Server/Middleware/TelemetryIngest.ts +27 -22
- package/Server/Services/AlertService.ts +9 -9
- package/Server/Services/AnalyticsDatabaseService.ts +204 -35
- package/Server/Services/ExceptionAggregationService.ts +41 -18
- package/Server/Services/HostService.ts +2 -1
- package/Server/Services/IncidentService.ts +19 -19
- package/Server/Services/Index.ts +6 -2
- package/Server/Services/LogAggregationService.ts +116 -43
- package/Server/Services/MetricAggregationService.ts +29 -14
- package/Server/Services/MetricBaselineService.ts +34 -34
- package/Server/Services/MetricItemAggMV1mByHostV2Service.ts +30 -0
- package/Server/Services/MetricService.ts +119 -31
- package/Server/Services/OpenTelemetryIngestService.ts +186 -50
- package/Server/Services/ProfileAggregationService.ts +904 -126
- package/Server/Services/ServiceService.ts +6 -0
- package/Server/Services/SpanService.ts +274 -14
- package/Server/Services/TelemetryEntityRelationshipService.ts +71 -0
- package/Server/Services/TelemetryEntityService.ts +246 -0
- package/Server/Services/TelemetryExceptionService.ts +27 -23
- package/Server/Services/TelemetryUsageBillingService.ts +38 -31
- package/Server/Services/TraceAggregationService.ts +875 -43
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +43 -2
- package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -2
- package/Server/Types/Database/Permissions/BasePermission.ts +37 -1
- package/Server/Types/Database/Permissions/OwnedScopePermission.ts +21 -3
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +1 -0
- package/Server/Types/Database/QueryHelper.ts +41 -0
- package/Server/Utils/Alert/AlertPrivacyFilter.ts +9 -2
- package/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.ts +9 -2
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +95 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +133 -0
- package/Server/Utils/Incident/IncidentPrivacyFilter.ts +9 -2
- package/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.ts +9 -2
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +1 -1
- package/Server/Utils/Monitor/MonitorLogUtil.ts +1 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +3 -4
- package/Server/Utils/PrivacyFilterUtil.ts +72 -0
- package/Server/Utils/Profile/PprofEncoder.ts +135 -11
- package/Server/Utils/Telemetry/EntityRegistry.ts +316 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +5 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +783 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +79 -4
- package/Tests/Server/Services/LogAggregationService.test.ts +7 -2
- package/Tests/Server/Services/ProfileAggregationService.test.ts +280 -0
- package/Tests/Server/Services/ProfileBreakdown.test.ts +161 -0
- package/Tests/Server/Services/ProfileFunctionFocus.test.ts +349 -0
- package/Tests/Server/Services/TelemetryAttributeService.test.ts +1 -1
- package/Tests/Server/Services/TraceAggregationService.test.ts +403 -0
- package/Tests/Server/Types/AnalyticsDatabase/ModelPermissionOwnedScope.test.ts +114 -0
- package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +189 -0
- package/Tests/Server/Types/Database/Permissions/BasePermission.test.ts +118 -0
- package/Tests/Server/Types/Database/Permissions/OwnedScopePermission.test.ts +159 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +275 -8
- package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +177 -0
- package/Tests/Server/Utils/Profile/PprofEncoder.test.ts +276 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +761 -0
- package/Tests/Types/Monitor/MonitorStepEntityScope.test.ts +275 -0
- package/Tests/Types/Text.test.ts +52 -0
- package/Tests/Utils/Telemetry/EntityKey.test.ts +150 -0
- package/Tests/Utils/Telemetry/EntityKeySqlParity.test.ts +40 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +150 -0
- package/Tests/Utils/UUID.test.ts +47 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +14 -9
- package/Types/AnalyticsDatabase/TableColumnType.ts +1 -0
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +37 -0
- package/Types/Dashboard/DashboardTemplates.ts +4 -5
- package/Types/Log/LogQueryParser.ts +2 -2
- package/Types/Log/LogQueryToFilter.ts +2 -2
- package/Types/Monitor/MonitorStepExceptionMonitor.ts +19 -1
- package/Types/Monitor/MonitorStepLogMonitor.ts +20 -1
- package/Types/Monitor/MonitorStepMetricMonitor.ts +27 -0
- package/Types/Monitor/MonitorStepProfileMonitor.ts +19 -1
- package/Types/Monitor/MonitorStepTraceMonitor.ts +18 -1
- package/Types/Monitor/MonitorType.ts +8 -1
- package/Types/ObjectID.ts +10 -0
- package/Types/Telemetry/EntityRelationshipType.ts +31 -0
- package/Types/Telemetry/EntityType.ts +33 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +2 -0
- package/Types/Text.ts +34 -0
- package/Types/Trace/TraceAggregationType.ts +1 -0
- package/Types/Trace/TraceRecordingRuleDefinition.ts +74 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +12 -9
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +10 -9
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +1 -1
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +2 -2
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +4 -4
- package/UI/Components/LogsViewer/components/LogsTable.tsx +5 -3
- package/UI/Components/Navbar/NavBarMenuModal.tsx +81 -44
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +33 -10
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +18 -3
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +91 -68
- package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +9 -2
- package/UI/Utils/LogExport.ts +2 -2
- package/UI/Utils/TelemetryService.ts +20 -20
- package/Utils/Dashboard/Components/DashboardTraceChartComponent.ts +134 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/Telemetry/EntityKey.ts +151 -0
- package/Utils/Telemetry/EntityRelationship.ts +113 -0
- package/Utils/Traces/CriticalPath.ts +7 -7
- package/Utils/UUID.ts +57 -0
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js +14 -13
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js +2 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +125 -22
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Index.js +7 -2
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js +123 -22
- package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Metric.js +125 -27
- package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js +38 -21
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +17 -16
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/{MetricItemAggMV1mByHost.js → MetricItemAggMV1mByHostV2.js} +54 -42
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MonitorLog.js +4 -1
- package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Profile.js +132 -26
- package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js +121 -23
- package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +144 -26
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +30 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js +419 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +317 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +12 -12
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js +7 -7
- package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +14 -13
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +2 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +425 -129
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +2 -2
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.js +33 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.js +78 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +14 -3
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +16 -18
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +9 -9
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +115 -40
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +38 -18
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +2 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +19 -19
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -2
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +100 -42
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +27 -14
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricBaselineService.js +28 -28
- package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
- package/build/dist/Server/Services/MetricItemAggMV1mByHostV2Service.js +28 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByHostV2Service.js.map +1 -0
- package/build/dist/Server/Services/MetricService.js +116 -31
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +103 -36
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ProfileAggregationService.js +613 -105
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +9 -5
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +217 -15
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +72 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -0
- package/build/dist/Server/Services/TelemetryEntityService.js +201 -0
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -0
- package/build/dist/Server/Services/TelemetryExceptionService.js +18 -18
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -21
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +568 -43
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +38 -2
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +36 -2
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +25 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +17 -3
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +31 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +97 -3
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +1 -2
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +3 -4
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/PrivacyFilterUtil.js +47 -0
- package/build/dist/Server/Utils/PrivacyFilterUtil.js.map +1 -0
- package/build/dist/Server/Utils/Profile/PprofEncoder.js +132 -4
- package/build/dist/Server/Utils/Profile/PprofEncoder.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +228 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +5 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +569 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +14 -9
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/TableColumnType.js +1 -0
- package/build/dist/Types/AnalyticsDatabase/TableColumnType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +4 -5
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Log/LogQueryParser.js +2 -2
- package/build/dist/Types/Log/LogQueryParser.js.map +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepLogMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepLogMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +13 -0
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepProfileMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepProfileMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepTraceMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepTraceMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +8 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/ObjectID.js +9 -0
- package/build/dist/Types/ObjectID.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityRelationshipType.js +32 -0
- package/build/dist/Types/Telemetry/EntityRelationshipType.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +34 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -0
- package/build/dist/Types/Text.js +32 -1
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/Types/Trace/TraceAggregationType.js +1 -0
- package/build/dist/Types/Trace/TraceAggregationType.js.map +1 -1
- package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js +50 -1
- package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +10 -9
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +8 -8
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +2 -2
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +4 -4
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +3 -3
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +43 -30
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +6 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -3
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +18 -10
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +4 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
- package/build/dist/UI/Utils/LogExport.js +2 -2
- package/build/dist/UI/Utils/LogExport.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +16 -16
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardTraceChartComponent.js +110 -0
- package/build/dist/Utils/Dashboard/Components/DashboardTraceChartComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +115 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js +71 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -0
- package/build/dist/Utils/Traces/CriticalPath.js +5 -5
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
- package/build/dist/Utils/UUID.js +50 -0
- package/build/dist/Utils/UUID.js.map +1 -1
- package/package.json +2 -1
- package/tsconfig.json +10 -1
- package/Server/Services/MetricItemAggMV1mByHostService.ts +0 -30
- package/Types/Profile/ProfileMetricType.ts +0 -16
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHost.js.map +0 -1
- package/build/dist/Server/Services/MetricItemAggMV1mByHostService.js +0 -28
- package/build/dist/Server/Services/MetricItemAggMV1mByHostService.js.map +0 -1
- package/build/dist/Tests/MockType.js +0 -5
- package/build/dist/Tests/MockType.js.map +0 -1
- package/build/dist/Tests/Models/AnalyticsModels/Log.test.js +0 -12
- package/build/dist/Tests/Models/AnalyticsModels/Log.test.js.map +0 -1
- package/build/dist/Tests/Models/File.test.js +0 -10
- package/build/dist/Tests/Models/File.test.js.map +0 -1
- package/build/dist/Tests/Server/API/BaseAPI.test.js +0 -590
- package/build/dist/Tests/Server/API/BaseAPI.test.js.map +0 -1
- package/build/dist/Tests/Server/API/Helpers.js +0 -27
- package/build/dist/Tests/Server/API/Helpers.js.map +0 -1
- package/build/dist/Tests/Server/API/ProbeAPI.test.js +0 -84
- package/build/dist/Tests/Server/API/ProbeAPI.test.js.map +0 -1
- package/build/dist/Tests/Server/API/ProjectAPI.test.js +0 -170
- package/build/dist/Tests/Server/API/ProjectAPI.test.js.map +0 -1
- package/build/dist/Tests/Server/API/UserSmsApi.test.js +0 -177
- package/build/dist/Tests/Server/API/UserSmsApi.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/BearerTokenAuthorization.test.js +0 -63
- package/build/dist/Tests/Server/Middleware/BearerTokenAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/ClusterKeyAuthorization.test.js +0 -58
- package/build/dist/Tests/Server/Middleware/ClusterKeyAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/NotificationMiddleware.test.js +0 -101
- package/build/dist/Tests/Server/Middleware/NotificationMiddleware.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js +0 -160
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +0 -410
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js +0 -165
- package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js +0 -193
- package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js +0 -435
- package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js +0 -320
- package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js +0 -266
- package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/BillingService.test.js +0 -910
- package/build/dist/Tests/Server/Services/BillingService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/LogAggregationService.test.js +0 -75
- package/build/dist/Tests/Server/Services/LogAggregationService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/ProbeService.test.js +0 -127
- package/build/dist/Tests/Server/Services/ProbeService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js +0 -114
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/TeamMemberService.test.js +0 -106
- package/build/dist/Tests/Server/Services/TeamMemberService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js +0 -50
- package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Init.js +0 -4
- package/build/dist/Tests/Server/TestingUtils/Init.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Postgres/TestDataSourceOptions.js +0 -9
- package/build/dist/Tests/Server/TestingUtils/Postgres/TestDataSourceOptions.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Redis/TestRedisOptions.js +0 -16
- package/build/dist/Tests/Server/TestingUtils/Redis/TestRedisOptions.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/BillingServiceHelper.js +0 -125
- package/build/dist/Tests/Server/TestingUtils/Services/BillingServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/ProjectServiceHelper.js +0 -39
- package/build/dist/Tests/Server/TestingUtils/Services/ProjectServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceServiceHelper.js +0 -20
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceStateServiceHelper.js +0 -31
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceStateServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/TeamMemberServiceHelper.js +0 -14
- package/build/dist/Tests/Server/TestingUtils/Services/TeamMemberServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/TeamServiceHelper.js +0 -21
- package/build/dist/Tests/Server/TestingUtils/Services/TeamServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/Types.js +0 -2
- package/build/dist/Tests/Server/TestingUtils/Services/Types.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/UserServiceHelper.js +0 -37
- package/build/dist/Tests/Server/TestingUtils/Services/UserServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/__mocks__/Stripe.mock.js +0 -13
- package/build/dist/Tests/Server/TestingUtils/__mocks__/Stripe.mock.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/__mocks__/TestDatabase.mock.js +0 -22
- package/build/dist/Tests/Server/TestingUtils/__mocks__/TestDatabase.mock.js.map +0 -1
- package/build/dist/Tests/Server/Types/Domain.test.js +0 -78
- package/build/dist/Tests/Server/Types/Domain.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/Statement.test.js +0 -94
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/Statement.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js +0 -459
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Cookie.test.js +0 -83
- package/build/dist/Tests/Server/Utils/Cookie.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/CronTab.test.js +0 -29
- package/build/dist/Tests/Server/Utils/CronTab.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/JsonToCsv.test.js +0 -114
- package/build/dist/Tests/Server/Utils/JsonToCsv.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js +0 -606
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.js +0 -255
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.js +0 -142
- package/build/dist/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/StatusPageResource.test.js +0 -122
- package/build/dist/Tests/Server/Utils/StatusPageResource.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js +0 -0
- package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js +0 -205
- package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js.map +0 -1
- package/build/dist/Tests/Spy.js +0 -4
- package/build/dist/Tests/Spy.js.map +0 -1
- package/build/dist/Tests/Types/API/ErrorResponse.test.js +0 -13
- package/build/dist/Tests/Types/API/ErrorResponse.test.js.map +0 -1
- package/build/dist/Tests/Types/API/HTTPErrorResponse.test.js +0 -33
- package/build/dist/Tests/Types/API/HTTPErrorResponse.test.js.map +0 -1
- package/build/dist/Tests/Types/API/HTTPMethod.test.js +0 -16
- package/build/dist/Tests/Types/API/HTTPMethod.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Headers.test.js +0 -14
- package/build/dist/Tests/Types/API/Headers.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Hostname.test.js +0 -22
- package/build/dist/Tests/Types/API/Hostname.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Protocal.test.js +0 -19
- package/build/dist/Tests/Types/API/Protocal.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Response.test.js +0 -14
- package/build/dist/Tests/Types/API/Response.test.js.map +0 -1
- package/build/dist/Tests/Types/API/ResponseType.test.js +0 -13
- package/build/dist/Tests/Types/API/ResponseType.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Route.test.js +0 -30
- package/build/dist/Tests/Types/API/Route.test.js.map +0 -1
- package/build/dist/Tests/Types/API/StatusCode.test.js +0 -26
- package/build/dist/Tests/Types/API/StatusCode.test.js.map +0 -1
- package/build/dist/Tests/Types/API/URL.test.js +0 -33
- package/build/dist/Tests/Types/API/URL.test.js.map +0 -1
- package/build/dist/Tests/Types/Alerts/AlertEventType.test.js +0 -34
- package/build/dist/Tests/Types/Alerts/AlertEventType.test.js.map +0 -1
- package/build/dist/Tests/Types/Alerts/AlertType.test.js +0 -19
- package/build/dist/Tests/Types/Alerts/AlertType.test.js.map +0 -1
- package/build/dist/Tests/Types/AppEnvironment.test.js +0 -13
- package/build/dist/Tests/Types/AppEnvironment.test.js.map +0 -1
- package/build/dist/Tests/Types/ApplicationLog/ApplicationLogType.test.js +0 -13
- package/build/dist/Tests/Types/ApplicationLog/ApplicationLogType.test.js.map +0 -1
- package/build/dist/Tests/Types/ArrayUtil.test.js +0 -71
- package/build/dist/Tests/Types/ArrayUtil.test.js.map +0 -1
- package/build/dist/Tests/Types/Billing/SubscriptionPlan.test.js +0 -181
- package/build/dist/Tests/Types/Billing/SubscriptionPlan.test.js.map +0 -1
- package/build/dist/Tests/Types/BrandColors.test.js +0 -124
- package/build/dist/Tests/Types/BrandColors.test.js.map +0 -1
- package/build/dist/Tests/Types/Char.test.js +0 -82
- package/build/dist/Tests/Types/Char.test.js.map +0 -1
- package/build/dist/Tests/Types/Code/CodeType.test.js +0 -13
- package/build/dist/Tests/Types/Code/CodeType.test.js.map +0 -1
- package/build/dist/Tests/Types/Color.test.js +0 -44
- package/build/dist/Tests/Types/Color.test.js.map +0 -1
- package/build/dist/Tests/Types/Company/CompanySize.test.js +0 -20
- package/build/dist/Tests/Types/Company/CompanySize.test.js.map +0 -1
- package/build/dist/Tests/Types/Company/JobRole.test.js +0 -22
- package/build/dist/Tests/Types/Company/JobRole.test.js.map +0 -1
- package/build/dist/Tests/Types/Countries.test.js +0 -249
- package/build/dist/Tests/Types/Countries.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/ColumnLength.test.js +0 -43
- package/build/dist/Tests/Types/Database/ColumnLength.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/ColumnType.test.js +0 -79
- package/build/dist/Tests/Types/Database/ColumnType.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/Columns.test.js +0 -20
- package/build/dist/Tests/Types/Database/Columns.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/CompareBase.test.js +0 -37
- package/build/dist/Tests/Types/Database/CompareBase.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/Date.test.js +0 -62
- package/build/dist/Tests/Types/Database/Date.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/EqualTo.test.js +0 -65
- package/build/dist/Tests/Types/Database/EqualTo.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/EqualToOrNull.test.js +0 -62
- package/build/dist/Tests/Types/Database/EqualToOrNull.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/InBetween.test.js +0 -72
- package/build/dist/Tests/Types/Database/InBetween.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/LimitMax.test.js +0 -18
- package/build/dist/Tests/Types/Database/LimitMax.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/NotEqual.test.js +0 -19
- package/build/dist/Tests/Types/Database/NotEqual.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/Search.test.js +0 -10
- package/build/dist/Tests/Types/Database/Search.test.js.map +0 -1
- package/build/dist/Tests/Types/DatabaseType.test.js +0 -7
- package/build/dist/Tests/Types/DatabaseType.test.js.map +0 -1
- package/build/dist/Tests/Types/Date.test.js +0 -194
- package/build/dist/Tests/Types/Date.test.js.map +0 -1
- package/build/dist/Tests/Types/Dictionary.test.js +0 -25
- package/build/dist/Tests/Types/Dictionary.test.js.map +0 -1
- package/build/dist/Tests/Types/Domain.test.js +0 -54
- package/build/dist/Tests/Types/Domain.test.js.map +0 -1
- package/build/dist/Tests/Types/Email/Email.test.js +0 -51
- package/build/dist/Tests/Types/Email/Email.test.js.map +0 -1
- package/build/dist/Tests/Types/EmailWithName.test.js +0 -36
- package/build/dist/Tests/Types/EmailWithName.test.js.map +0 -1
- package/build/dist/Tests/Types/EncryptionAlgorithm.test.js +0 -7
- package/build/dist/Tests/Types/EncryptionAlgorithm.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/ApiException.test.js +0 -10
- package/build/dist/Tests/Types/Exception/ApiException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/BadDataException.test.js +0 -12
- package/build/dist/Tests/Types/Exception/BadDataException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/BadOperationException.test.js +0 -10
- package/build/dist/Tests/Types/Exception/BadOperationException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/BadRequestException.test.js +0 -12
- package/build/dist/Tests/Types/Exception/BadRequestException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/DatabaseNotConnectedException.test.js +0 -10
- package/build/dist/Tests/Types/Exception/DatabaseNotConnectedException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/Exception.test.js +0 -15
- package/build/dist/Tests/Types/Exception/Exception.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/NotImplementedException.test.js +0 -12
- package/build/dist/Tests/Types/Exception/NotImplementedException.test.js.map +0 -1
- package/build/dist/Tests/Types/File.test.js +0 -22
- package/build/dist/Tests/Types/File.test.js.map +0 -1
- package/build/dist/Tests/Types/HashedString.test.js +0 -51
- package/build/dist/Tests/Types/HashedString.test.js.map +0 -1
- package/build/dist/Tests/Types/Html.test.js +0 -8
- package/build/dist/Tests/Types/Html.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IP.test.js +0 -65
- package/build/dist/Tests/Types/IP/IP.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IPType.test.js +0 -10
- package/build/dist/Tests/Types/IP/IPType.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IPv4.test.js +0 -17
- package/build/dist/Tests/Types/IP/IPv4.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IPv6.test.js +0 -17
- package/build/dist/Tests/Types/IP/IPv6.test.js.map +0 -1
- package/build/dist/Tests/Types/JSON.test.js +0 -37
- package/build/dist/Tests/Types/JSON.test.js.map +0 -1
- package/build/dist/Tests/Types/JSONFunctions.test.js +0 -38
- package/build/dist/Tests/Types/JSONFunctions.test.js.map +0 -1
- package/build/dist/Tests/Types/ListData.test.js +0 -34
- package/build/dist/Tests/Types/ListData.test.js.map +0 -1
- package/build/dist/Tests/Types/Monitor/KubernetesAlertTemplates.test.js +0 -121
- package/build/dist/Tests/Types/Monitor/KubernetesAlertTemplates.test.js.map +0 -1
- package/build/dist/Tests/Types/Name.test.js +0 -26
- package/build/dist/Tests/Types/Name.test.js.map +0 -1
- package/build/dist/Tests/Types/ObjectID.test.js +0 -12
- package/build/dist/Tests/Types/ObjectID.test.js.map +0 -1
- package/build/dist/Tests/Types/OnCallDutyPolicy/LayerUtil.test.js +0 -530
- package/build/dist/Tests/Types/OnCallDutyPolicy/LayerUtil.test.js.map +0 -1
- package/build/dist/Tests/Types/Permission.test.js +0 -99
- package/build/dist/Tests/Types/Permission.test.js.map +0 -1
- package/build/dist/Tests/Types/Phone.test.js +0 -37
- package/build/dist/Tests/Types/Phone.test.js.map +0 -1
- package/build/dist/Tests/Types/Port.test.js +0 -35
- package/build/dist/Tests/Types/Port.test.js.map +0 -1
- package/build/dist/Tests/Types/PositiveNumber.test.js +0 -101
- package/build/dist/Tests/Types/PositiveNumber.test.js.map +0 -1
- package/build/dist/Tests/Types/SecuritySeverity.test.js +0 -16
- package/build/dist/Tests/Types/SecuritySeverity.test.js.map +0 -1
- package/build/dist/Tests/Types/SerializableObject.test.js +0 -37
- package/build/dist/Tests/Types/SerializableObject.test.js.map +0 -1
- package/build/dist/Tests/Types/Sleep.test.js +0 -14
- package/build/dist/Tests/Types/Sleep.test.js.map +0 -1
- package/build/dist/Tests/Types/Text.test.js +0 -8
- package/build/dist/Tests/Types/Text.test.js.map +0 -1
- package/build/dist/Tests/Types/Timezone.test.js +0 -596
- package/build/dist/Tests/Types/Timezone.test.js.map +0 -1
- package/build/dist/Tests/Types/Typeof.test.js +0 -16
- package/build/dist/Tests/Types/Typeof.test.js.map +0 -1
- package/build/dist/Tests/Types/UserType.test.js +0 -16
- package/build/dist/Tests/Types/UserType.test.js.map +0 -1
- package/build/dist/Tests/Types/Version.test.js +0 -35
- package/build/dist/Tests/Types/Version.test.js.map +0 -1
- package/build/dist/Tests/Types/XML.test.js +0 -35
- package/build/dist/Tests/Types/XML.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/404.test.js +0 -59
- package/build/dist/Tests/UI/Components/404.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Alert.test.js +0 -83
- package/build/dist/Tests/UI/Components/Alert.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Badge.test.js +0 -59
- package/build/dist/Tests/UI/Components/Badge.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/BasicForm.test.js +0 -92
- package/build/dist/Tests/UI/Components/BasicForm.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Breadcrumbs.test.js +0 -69
- package/build/dist/Tests/UI/Components/Breadcrumbs.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Button.test.js +0 -104
- package/build/dist/Tests/UI/Components/Button.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Card.test.js +0 -81
- package/build/dist/Tests/UI/Components/Card.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ColorViewer.test.js +0 -42
- package/build/dist/Tests/UI/Components/ColorViewer.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ComponentsModal.test.js +0 -233
- package/build/dist/Tests/UI/Components/ComponentsModal.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ConfirmModal.test.js +0 -57
- package/build/dist/Tests/UI/Components/ConfirmModal.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/DictionaryOfStrings.test.js +0 -84
- package/build/dist/Tests/UI/Components/DictionaryOfStrings.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Dropdown.test.js +0 -146
- package/build/dist/Tests/UI/Components/Dropdown.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/DuplicateModel.test.js +0 -229
- package/build/dist/Tests/UI/Components/DuplicateModel.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/EmptyState/EmptyState.test.js +0 -26
- package/build/dist/Tests/UI/Components/EmptyState/EmptyState.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ErrorBoundary.test.js +0 -32
- package/build/dist/Tests/UI/Components/ErrorBoundary.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/FilePicker.test.js +0 -342
- package/build/dist/Tests/UI/Components/FilePicker.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/HiddenText.test.js +0 -50
- package/build/dist/Tests/UI/Components/HiddenText.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Input.test.js +0 -223
- package/build/dist/Tests/UI/Components/Input.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Item.test.js +0 -58
- package/build/dist/Tests/UI/Components/Item.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/List.test.js +0 -83
- package/build/dist/Tests/UI/Components/List.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Loader.test.js +0 -19
- package/build/dist/Tests/UI/Components/Loader.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js +0 -85
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/MasterPage.test.js +0 -46
- package/build/dist/Tests/UI/Components/MasterPage.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Modal.test.js +0 -127
- package/build/dist/Tests/UI/Components/Modal.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/NavBar.test.js +0 -52
- package/build/dist/Tests/UI/Components/NavBar.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/OrderedStatesList.test.js +0 -86
- package/build/dist/Tests/UI/Components/OrderedStatesList.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Pagination.test.js +0 -137
- package/build/dist/Tests/UI/Components/Pagination.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Pill.test.js +0 -55
- package/build/dist/Tests/UI/Components/Pill.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Probe.test.js +0 -52
- package/build/dist/Tests/UI/Components/Probe.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ProgressBar.test.js +0 -41
- package/build/dist/Tests/UI/Components/ProgressBar.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/RadioButtons.test.js +0 -66
- package/build/dist/Tests/UI/Components/RadioButtons.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/SideMenuItem.test.js +0 -99
- package/build/dist/Tests/UI/Components/SideMenuItem.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/SideOver.test.js +0 -77
- package/build/dist/Tests/UI/Components/SideOver.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Tabs.test.js +0 -56
- package/build/dist/Tests/UI/Components/Tabs.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Template/Template.test.js +0 -15
- package/build/dist/Tests/UI/Components/Template/Template.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/TextArea.test.js +0 -112
- package/build/dist/Tests/UI/Components/TextArea.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/TimePicker/TimePicker.test.js +0 -352
- package/build/dist/Tests/UI/Components/TimePicker/TimePicker.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Toast.test.js +0 -48
- package/build/dist/Tests/UI/Components/Toast.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Toggle.test.js +0 -95
- package/build/dist/Tests/UI/Components/Toggle.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/TopSection.test.js +0 -33
- package/build/dist/Tests/UI/Components/TopSection.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/XAxis.test.js +0 -21
- package/build/dist/Tests/UI/Components/XAxis.test.js.map +0 -1
- package/build/dist/Tests/UI/Index.js +0 -2
- package/build/dist/Tests/UI/Index.js.map +0 -1
- package/build/dist/Tests/UI/Mocks/FileMock.js +0 -3
- package/build/dist/Tests/UI/Mocks/FileMock.js.map +0 -1
- package/build/dist/Tests/Utils/API.test.js +0 -399
- package/build/dist/Tests/Utils/API.test.js.map +0 -1
- package/build/dist/Tests/Utils/Analytics.test.js +0 -67
- package/build/dist/Tests/Utils/Analytics.test.js.map +0 -1
- package/build/dist/Tests/Utils/CronTime.test.js +0 -22
- package/build/dist/Tests/Utils/CronTime.test.js.map +0 -1
- package/build/dist/Tests/Utils/Faker.test.js +0 -27
- package/build/dist/Tests/Utils/Faker.test.js.map +0 -1
- package/build/dist/Tests/Utils/MetricUnitUtil.test.js +0 -187
- package/build/dist/Tests/Utils/MetricUnitUtil.test.js.map +0 -1
- package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js +0 -224
- package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js.map +0 -1
- package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js +0 -180
- package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js.map +0 -1
- package/build/dist/Tests/Utils/RecordingRuleExpression.test.js +0 -142
- package/build/dist/Tests/Utils/RecordingRuleExpression.test.js.map +0 -1
- package/build/dist/Tests/Utils/Slug.test.js +0 -20
- package/build/dist/Tests/Utils/Slug.test.js.map +0 -1
- package/build/dist/Tests/Utils/UUID.test.js +0 -48
- package/build/dist/Tests/Utils/UUID.test.js.map +0 -1
- package/build/dist/Tests/jest.setup.js +0 -30
- package/build/dist/Tests/jest.setup.js.map +0 -1
- package/build/dist/Types/Profile/ProfileMetricType.js +0 -17
- package/build/dist/Types/Profile/ProfileMetricType.js.map +0 -1
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
import {
|
|
2
|
+
computeEntityKey as computeEntityKeyShared,
|
|
3
|
+
canonicalizeEntityValue,
|
|
4
|
+
setSha256Provider,
|
|
5
|
+
} from "../../../Utils/Telemetry/EntityKey";
|
|
6
|
+
import EntityType from "../../../Types/Telemetry/EntityType";
|
|
7
|
+
import Dictionary from "../../../Types/Dictionary";
|
|
8
|
+
import logger from "../Logger";
|
|
9
|
+
import { ONEUPTIME_LABEL_ATTRIBUTE_PREFIX } from "./OneuptimeLabel";
|
|
10
|
+
import crypto from "crypto";
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* Generalized OpenTelemetry entity extraction (the identity layer of the
|
|
14
|
+
* entity model — see Internal/Docs/OpenTelemetryEntities.md, phase 1).
|
|
15
|
+
*
|
|
16
|
+
* An OTLP `Resource` is a composition of N entities. This module derives
|
|
17
|
+
* *all* of them from a flat resource-attribute dictionary and assigns
|
|
18
|
+
* each a stable, payload-derived `entityKey`. Two properties make this
|
|
19
|
+
* the keystone of the multi-entity design:
|
|
20
|
+
*
|
|
21
|
+
* 1. Pure & synchronous. The key is a hash of the resource attributes
|
|
22
|
+
* plus the projectId — no database round trip. So a signal can be
|
|
23
|
+
* stamped with `entityKeys` at ingest without blocking on registry
|
|
24
|
+
* resolution, which is reconciled asynchronously.
|
|
25
|
+
* 2. Deterministic & tenant-scoped. The same identifying attributes in
|
|
26
|
+
* the same project always produce the same key, and keys never
|
|
27
|
+
* collide across tenants (projectId is in the hash preimage).
|
|
28
|
+
*
|
|
29
|
+
* The same `computeEntityKey` MUST be used on the read side so a
|
|
30
|
+
* cross-cutting query (`has(entityKeys, :hostKey)`) computes the identical
|
|
31
|
+
* key that ingest stamped. The canonicalization here (trim + lowercase)
|
|
32
|
+
* mirrors `OtelIngestBaseService.canonicalizeHostName` and the
|
|
33
|
+
* case-insensitive Service lookup, so identity stays consistent end to end.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/*
|
|
37
|
+
* Ingest hashes an entity key per resolver per signal batch, so use the
|
|
38
|
+
* native node:crypto SHA-256 instead of EntityKey's pure-JS crypto-js
|
|
39
|
+
* default. Both emit identical lowercase hex, so keys do not fork against
|
|
40
|
+
* browser-computed read-side keys.
|
|
41
|
+
*/
|
|
42
|
+
setSha256Provider((input: string): string => {
|
|
43
|
+
return crypto.createHash("sha256").update(input).digest("hex");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
/** Scalar attribute value as seen after `TelemetryUtil.getAttributes`. */
|
|
47
|
+
export type EntityAttributeValue = string | number | boolean | null | undefined;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A flat resource-attribute map keyed by the *raw* semconv attribute name
|
|
51
|
+
* (e.g. `service.name`, `host.id`, `k8s.pod.name`) — i.e. NOT prefixed
|
|
52
|
+
* with `resource.`. Build it with
|
|
53
|
+
* `TelemetryUtil.getAttributes({ items, prefixKeysWithString: "" })`.
|
|
54
|
+
* Array/object values are ignored for identity purposes.
|
|
55
|
+
*/
|
|
56
|
+
export type EntityAttributes = Dictionary<
|
|
57
|
+
EntityAttributeValue | Array<EntityAttributeValue>
|
|
58
|
+
>;
|
|
59
|
+
|
|
60
|
+
/** One entity derived from a resource. */
|
|
61
|
+
export interface ExtractedEntity {
|
|
62
|
+
entityType: EntityType;
|
|
63
|
+
/** Stable 16-hex-char identity hash (per project + type + identity set). */
|
|
64
|
+
entityKey: string;
|
|
65
|
+
/**
|
|
66
|
+
* The canonicalized immutable identifying attribute set. This is the
|
|
67
|
+
* entity's identity — descriptive attributes (image tag, version, IP,
|
|
68
|
+
* ...) are deliberately excluded so they can change without changing
|
|
69
|
+
* the key.
|
|
70
|
+
*/
|
|
71
|
+
identifyingAttributes: Dictionary<string>;
|
|
72
|
+
/**
|
|
73
|
+
* A small allowlisted set of mutable, non-identifying attributes
|
|
74
|
+
* (os.type, sdk language, image tag, ...) persisted onto the registry
|
|
75
|
+
* row (last-writer-wins merge). NEVER part of identity — changing any
|
|
76
|
+
* of these MUST NOT change `entityKey`.
|
|
77
|
+
*/
|
|
78
|
+
descriptiveAttributes?: Record<string, string>;
|
|
79
|
+
/**
|
|
80
|
+
* Label names promoted from `oneuptime.label.<name>` resource
|
|
81
|
+
* attributes (the suffix after the prefix, trimmed). Non-identifying;
|
|
82
|
+
* the registry attaches them via the existing project label system.
|
|
83
|
+
*/
|
|
84
|
+
labels?: Array<string>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* A normalized OTLP `Resource.entity_refs` entry (proto `EntityRef`,
|
|
89
|
+
* Development status). When producers emit refs they are authoritative:
|
|
90
|
+
* `idKeys`/`descriptionKeys` partition the flat resource attributes
|
|
91
|
+
* into identity vs description for the entity of `type`.
|
|
92
|
+
*/
|
|
93
|
+
export interface ResourceEntityRef {
|
|
94
|
+
schemaUrl?: string | undefined;
|
|
95
|
+
type?: string | undefined;
|
|
96
|
+
idKeys?: Array<string> | undefined;
|
|
97
|
+
descriptionKeys?: Array<string> | undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export default class TelemetryEntity {
|
|
101
|
+
/**
|
|
102
|
+
* Compute the stable identity key for an entity. Pure: same inputs →
|
|
103
|
+
* same 16-char hex key. Keys are sorted so attribute order is
|
|
104
|
+
* irrelevant; values are trimmed + lowercased so casing drift (Windows
|
|
105
|
+
* host names, etc.) does not fork identity. projectId is folded into
|
|
106
|
+
* the preimage so keys are tenant-unique and a `has(entityKeys, key)`
|
|
107
|
+
* predicate is implicitly project-scoped.
|
|
108
|
+
*/
|
|
109
|
+
public static computeEntityKey(data: {
|
|
110
|
+
projectId: string;
|
|
111
|
+
entityType: EntityType;
|
|
112
|
+
identifyingAttributes: Dictionary<string>;
|
|
113
|
+
}): string {
|
|
114
|
+
/*
|
|
115
|
+
* Delegate to the shared isomorphic implementation so ingest (here) and
|
|
116
|
+
* reads (server/browser) produce byte-identical keys.
|
|
117
|
+
*/
|
|
118
|
+
return computeEntityKeyShared(data);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Derive every entity present in a resource. When the producer emitted
|
|
123
|
+
* OTLP `entity_refs`, those are authoritative and entities are built
|
|
124
|
+
* directly from them; otherwise (refs absent, or none usable) each
|
|
125
|
+
* supported type whose identifying attributes are all present is
|
|
126
|
+
* emitted exactly once via the heuristic resolvers; types with missing
|
|
127
|
+
* identity are skipped (no phantom entities). The result is deduped by
|
|
128
|
+
* key and stable-ordered. Descriptive attributes and labels are
|
|
129
|
+
* attached after identity is fixed — they NEVER feed the key.
|
|
130
|
+
*/
|
|
131
|
+
public static extractEntities(data: {
|
|
132
|
+
projectId: string;
|
|
133
|
+
attributes: EntityAttributes;
|
|
134
|
+
entityRefs?: Array<ResourceEntityRef> | undefined;
|
|
135
|
+
}): Array<ExtractedEntity> {
|
|
136
|
+
let out: Array<ExtractedEntity> = [];
|
|
137
|
+
|
|
138
|
+
if (data.entityRefs && data.entityRefs.length > 0) {
|
|
139
|
+
out = this.entitiesFromRefs({
|
|
140
|
+
projectId: data.projectId,
|
|
141
|
+
attributes: data.attributes,
|
|
142
|
+
entityRefs: data.entityRefs,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/*
|
|
147
|
+
* Fall back to the heuristic resolvers when no refs were provided —
|
|
148
|
+
* and also when every provided ref was unusable (unknown type /
|
|
149
|
+
* missing id values), so a producer with a malformed or
|
|
150
|
+
* unsupported-only ref set does not lose membership keys entirely.
|
|
151
|
+
*/
|
|
152
|
+
if (out.length === 0) {
|
|
153
|
+
out = this.entitiesFromResolvers(data);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const labels: Array<string> = this.extractLabels(data.attributes);
|
|
157
|
+
if (labels.length > 0) {
|
|
158
|
+
for (const entity of out) {
|
|
159
|
+
entity.labels = labels;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private static entitiesFromResolvers(data: {
|
|
167
|
+
projectId: string;
|
|
168
|
+
attributes: EntityAttributes;
|
|
169
|
+
}): Array<ExtractedEntity> {
|
|
170
|
+
const out: Array<ExtractedEntity> = [];
|
|
171
|
+
const seen: Set<string> = new Set<string>();
|
|
172
|
+
|
|
173
|
+
for (const resolve of this.resolvers) {
|
|
174
|
+
const identity: {
|
|
175
|
+
entityType: EntityType;
|
|
176
|
+
id: Dictionary<string>;
|
|
177
|
+
} | null = resolve(data.attributes);
|
|
178
|
+
|
|
179
|
+
if (!identity) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const entityKey: string = this.computeEntityKey({
|
|
184
|
+
projectId: data.projectId,
|
|
185
|
+
entityType: identity.entityType,
|
|
186
|
+
identifyingAttributes: identity.id,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
if (seen.has(entityKey)) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
seen.add(entityKey);
|
|
193
|
+
|
|
194
|
+
const descriptiveAttributes: Record<string, string> =
|
|
195
|
+
this.descriptiveAttributesFor(identity.entityType, data.attributes);
|
|
196
|
+
|
|
197
|
+
out.push({
|
|
198
|
+
entityType: identity.entityType,
|
|
199
|
+
entityKey,
|
|
200
|
+
identifyingAttributes: this.canonObject(identity.id),
|
|
201
|
+
...(Object.keys(descriptiveAttributes).length > 0
|
|
202
|
+
? { descriptiveAttributes }
|
|
203
|
+
: {}),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/*
|
|
211
|
+
* Build entities from OTLP `entity_refs` (the authoritative path).
|
|
212
|
+
* Identity = the values of the ref's `id_keys` read from the flat
|
|
213
|
+
* resource attributes; description = the `description_keys` values.
|
|
214
|
+
* Refs with a type outside our EntityType vocabulary, with no
|
|
215
|
+
* id_keys, or whose identifying values are missing from the resource
|
|
216
|
+
* are skipped (debug-logged) — never half-identified.
|
|
217
|
+
*/
|
|
218
|
+
private static entitiesFromRefs(data: {
|
|
219
|
+
projectId: string;
|
|
220
|
+
attributes: EntityAttributes;
|
|
221
|
+
entityRefs: Array<ResourceEntityRef>;
|
|
222
|
+
}): Array<ExtractedEntity> {
|
|
223
|
+
const out: Array<ExtractedEntity> = [];
|
|
224
|
+
const seen: Set<string> = new Set<string>();
|
|
225
|
+
|
|
226
|
+
for (const ref of data.entityRefs) {
|
|
227
|
+
const refType: string =
|
|
228
|
+
typeof ref.type === "string" ? ref.type.trim() : "";
|
|
229
|
+
const entityType: EntityType | undefined = this.entityTypeByRefType.get(
|
|
230
|
+
refType.toLowerCase(),
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
if (!entityType) {
|
|
234
|
+
logger.debug(
|
|
235
|
+
`Skipping OTLP entity_ref with unsupported type "${refType}" — not in the supported EntityType vocabulary.`,
|
|
236
|
+
);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const idKeys: Array<string> = (ref.idKeys || []).filter((key: string) => {
|
|
241
|
+
return typeof key === "string" && key.trim().length > 0;
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
if (idKeys.length === 0) {
|
|
245
|
+
logger.debug(
|
|
246
|
+
`Skipping OTLP entity_ref of type "${refType}" with no id_keys.`,
|
|
247
|
+
);
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const id: Dictionary<string> = {};
|
|
252
|
+
let missingIdValue: boolean = false;
|
|
253
|
+
|
|
254
|
+
for (const key of idKeys) {
|
|
255
|
+
const value: string | null = this.str(data.attributes, key);
|
|
256
|
+
if (!value) {
|
|
257
|
+
missingIdValue = true;
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
/*
|
|
261
|
+
* The producer's ref is honored verbatim — but a known-mutable
|
|
262
|
+
* attribute used as identity forks the entity key every time the
|
|
263
|
+
* value changes (image tag bump, redeploy, ...), inflating
|
|
264
|
+
* entity cardinality. Warn so the source can be fixed; do NOT
|
|
265
|
+
* drop the key (see OpenTelemetryEntities.md, Edge Cases).
|
|
266
|
+
*/
|
|
267
|
+
if (this.knownMutableAttributeKeys.has(key)) {
|
|
268
|
+
logger.warn(
|
|
269
|
+
`OTLP entity_ref of type "${refType}" declares mutable attribute "${key}" as identifying — honoring it, but this forks entity identity whenever the value changes (cardinality risk).`,
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
id[key] = value;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (missingIdValue) {
|
|
276
|
+
logger.debug(
|
|
277
|
+
`Skipping OTLP entity_ref of type "${refType}" — an id_keys attribute is missing from the resource attributes.`,
|
|
278
|
+
);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const entityKey: string = this.computeEntityKey({
|
|
283
|
+
projectId: data.projectId,
|
|
284
|
+
entityType,
|
|
285
|
+
identifyingAttributes: id,
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
if (seen.has(entityKey)) {
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
seen.add(entityKey);
|
|
292
|
+
|
|
293
|
+
const descriptiveAttributes: Record<string, string> = {};
|
|
294
|
+
for (const key of ref.descriptionKeys || []) {
|
|
295
|
+
if (typeof key !== "string" || key.trim().length === 0) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const value: string | null = this.strOrFirst(data.attributes, key);
|
|
299
|
+
if (value) {
|
|
300
|
+
descriptiveAttributes[key] = value;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
out.push({
|
|
305
|
+
entityType,
|
|
306
|
+
entityKey,
|
|
307
|
+
identifyingAttributes: this.canonObject(id),
|
|
308
|
+
...(Object.keys(descriptiveAttributes).length > 0
|
|
309
|
+
? { descriptiveAttributes }
|
|
310
|
+
: {}),
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return out;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Normalize a decoded OTLP `resource.entityRefs` JSON value (protobuf
|
|
319
|
+
* `.toJSON()` output or OTLP/JSON, camelCase or snake_case) into typed
|
|
320
|
+
* refs. Malformed entries are dropped, not thrown.
|
|
321
|
+
*/
|
|
322
|
+
public static parseEntityRefs(raw: unknown): Array<ResourceEntityRef> {
|
|
323
|
+
if (!raw || !Array.isArray(raw)) {
|
|
324
|
+
return [];
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const out: Array<ResourceEntityRef> = [];
|
|
328
|
+
|
|
329
|
+
for (const item of raw) {
|
|
330
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
const record: Record<string, unknown> = item as Record<string, unknown>;
|
|
334
|
+
const type: unknown = record["type"];
|
|
335
|
+
const schemaUrl: unknown = record["schemaUrl"] ?? record["schema_url"];
|
|
336
|
+
const idKeys: unknown = record["idKeys"] ?? record["id_keys"];
|
|
337
|
+
const descriptionKeys: unknown =
|
|
338
|
+
record["descriptionKeys"] ?? record["description_keys"];
|
|
339
|
+
|
|
340
|
+
out.push({
|
|
341
|
+
schemaUrl: typeof schemaUrl === "string" ? schemaUrl : undefined,
|
|
342
|
+
type: typeof type === "string" ? type : undefined,
|
|
343
|
+
idKeys: this.stringList(idKeys),
|
|
344
|
+
descriptionKeys: this.stringList(descriptionKeys),
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
return out;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Convenience: just the membership keys to stamp into the `entityKeys`
|
|
353
|
+
* Array(String) column on a signal. Sorted + deduped for a stable
|
|
354
|
+
* column value (which also compresses better in ClickHouse).
|
|
355
|
+
*/
|
|
356
|
+
public static extractEntityKeys(data: {
|
|
357
|
+
projectId: string;
|
|
358
|
+
attributes: EntityAttributes;
|
|
359
|
+
entityRefs?: Array<ResourceEntityRef> | undefined;
|
|
360
|
+
}): Array<string> {
|
|
361
|
+
return this.extractEntities(data)
|
|
362
|
+
.map((e: ExtractedEntity) => {
|
|
363
|
+
return e.entityKey;
|
|
364
|
+
})
|
|
365
|
+
.sort();
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Label names promoted from `oneuptime.label.<name>` resource
|
|
370
|
+
* attributes — the suffix after the prefix, trimmed, deduped, sorted.
|
|
371
|
+
* Purely descriptive; never identity-bearing.
|
|
372
|
+
*/
|
|
373
|
+
public static extractLabels(attrs: EntityAttributes): Array<string> {
|
|
374
|
+
const seen: Set<string> = new Set<string>();
|
|
375
|
+
|
|
376
|
+
for (const key of Object.keys(attrs || {})) {
|
|
377
|
+
if (!key.startsWith(ONEUPTIME_LABEL_ATTRIBUTE_PREFIX)) {
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
const labelName: string = key
|
|
381
|
+
.substring(ONEUPTIME_LABEL_ATTRIBUTE_PREFIX.length)
|
|
382
|
+
.trim();
|
|
383
|
+
if (labelName) {
|
|
384
|
+
seen.add(labelName);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return Array.from(seen).sort();
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/*
|
|
392
|
+
* ---- Per-type identity resolvers ----------------------------------
|
|
393
|
+
*
|
|
394
|
+
* Each resolver returns the entity's immutable identifying attribute
|
|
395
|
+
* set, or null when the resource carries no identity for that type.
|
|
396
|
+
* Identity sets are semconv-aligned (see OpenTelemetryEntities.md §1).
|
|
397
|
+
* Composite types (namespace/node/pod/deployment) fold in their parent
|
|
398
|
+
* cluster/namespace identity so e.g. the "default" namespace in two
|
|
399
|
+
* clusters does not collide.
|
|
400
|
+
*/
|
|
401
|
+
private static readonly resolvers: Array<
|
|
402
|
+
(
|
|
403
|
+
attrs: EntityAttributes,
|
|
404
|
+
) => { entityType: EntityType; id: Dictionary<string> } | null
|
|
405
|
+
> = [
|
|
406
|
+
// service — service.name (+ service.namespace if present).
|
|
407
|
+
(attrs: EntityAttributes) => {
|
|
408
|
+
const name: string | null = TelemetryEntity.str(attrs, "service.name");
|
|
409
|
+
if (!name) {
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
const id: Dictionary<string> = { "service.name": name };
|
|
413
|
+
TelemetryEntity.addIfPresent(id, attrs, "service.namespace");
|
|
414
|
+
return { entityType: EntityType.Service, id };
|
|
415
|
+
},
|
|
416
|
+
|
|
417
|
+
// service.instance — service.name + service.instance.id (+ namespace).
|
|
418
|
+
(attrs: EntityAttributes) => {
|
|
419
|
+
const name: string | null = TelemetryEntity.str(attrs, "service.name");
|
|
420
|
+
const instanceId: string | null = TelemetryEntity.str(
|
|
421
|
+
attrs,
|
|
422
|
+
"service.instance.id",
|
|
423
|
+
);
|
|
424
|
+
if (!name || !instanceId) {
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
const id: Dictionary<string> = {
|
|
428
|
+
"service.name": name,
|
|
429
|
+
"service.instance.id": instanceId,
|
|
430
|
+
};
|
|
431
|
+
TelemetryEntity.addIfPresent(id, attrs, "service.namespace");
|
|
432
|
+
return { entityType: EntityType.ServiceInstance, id };
|
|
433
|
+
},
|
|
434
|
+
|
|
435
|
+
/*
|
|
436
|
+
* host — keyed on host.name only (canonicalized via computeEntityKey),
|
|
437
|
+
* matching OneUptime's `hostIdentifier` (= canonicalized host.name; see
|
|
438
|
+
* OtelIngestBaseService.autoDiscoverHost / canonicalizeHostName). host.id
|
|
439
|
+
* is deliberately NOT part of host identity: existing Host rows and the
|
|
440
|
+
* host rollup MV (MetricItemAggMV1mByHost) key on host.name, so keying
|
|
441
|
+
* here on host.id would make the host entity key unmatchable on the read
|
|
442
|
+
* side (`TelemetryEntity.keyForHost(hostIdentifier)`). Moving host
|
|
443
|
+
* identity to host.id is a separate, deferred hardening that would
|
|
444
|
+
* migrate the MV and this identity together. A k8s node (which carries
|
|
445
|
+
* k8s.node.name, not host.name, and is rejected by autoDiscoverHost) is
|
|
446
|
+
* cataloged via the dedicated `k8s.node` entity, not as a host.
|
|
447
|
+
*/
|
|
448
|
+
(attrs: EntityAttributes) => {
|
|
449
|
+
const hostName: string | null = TelemetryEntity.str(attrs, "host.name");
|
|
450
|
+
if (!hostName) {
|
|
451
|
+
return null;
|
|
452
|
+
}
|
|
453
|
+
return { entityType: EntityType.Host, id: { "host.name": hostName } };
|
|
454
|
+
},
|
|
455
|
+
|
|
456
|
+
// k8s.cluster — k8s.cluster.name only (see k8sClusterIdentity).
|
|
457
|
+
(attrs: EntityAttributes) => {
|
|
458
|
+
const id: Dictionary<string> | null =
|
|
459
|
+
TelemetryEntity.k8sClusterIdentity(attrs);
|
|
460
|
+
return id ? { entityType: EntityType.KubernetesCluster, id } : null;
|
|
461
|
+
},
|
|
462
|
+
|
|
463
|
+
// k8s.namespace — cluster + k8s.namespace.name.
|
|
464
|
+
(attrs: EntityAttributes) => {
|
|
465
|
+
const ns: string | null = TelemetryEntity.str(
|
|
466
|
+
attrs,
|
|
467
|
+
"k8s.namespace.name",
|
|
468
|
+
);
|
|
469
|
+
if (!ns) {
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
const id: Dictionary<string> = {
|
|
473
|
+
...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
|
|
474
|
+
"k8s.namespace.name": ns,
|
|
475
|
+
};
|
|
476
|
+
return { entityType: EntityType.KubernetesNamespace, id };
|
|
477
|
+
},
|
|
478
|
+
|
|
479
|
+
// k8s.node — cluster + k8s.node.uid/k8s.node.name.
|
|
480
|
+
(attrs: EntityAttributes) => {
|
|
481
|
+
const nodeUid: string | null = TelemetryEntity.str(attrs, "k8s.node.uid");
|
|
482
|
+
const nodeName: string | null = TelemetryEntity.str(
|
|
483
|
+
attrs,
|
|
484
|
+
"k8s.node.name",
|
|
485
|
+
);
|
|
486
|
+
if (!nodeUid && !nodeName) {
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
const id: Dictionary<string> = {
|
|
490
|
+
...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
|
|
491
|
+
};
|
|
492
|
+
if (nodeUid) {
|
|
493
|
+
id["k8s.node.uid"] = nodeUid;
|
|
494
|
+
} else if (nodeName) {
|
|
495
|
+
id["k8s.node.name"] = nodeName;
|
|
496
|
+
}
|
|
497
|
+
return { entityType: EntityType.KubernetesNode, id };
|
|
498
|
+
},
|
|
499
|
+
|
|
500
|
+
// k8s.pod — cluster + namespace + k8s.pod.uid/k8s.pod.name.
|
|
501
|
+
(attrs: EntityAttributes) => {
|
|
502
|
+
const podUid: string | null = TelemetryEntity.str(attrs, "k8s.pod.uid");
|
|
503
|
+
const podName: string | null = TelemetryEntity.str(attrs, "k8s.pod.name");
|
|
504
|
+
if (!podUid && !podName) {
|
|
505
|
+
return null;
|
|
506
|
+
}
|
|
507
|
+
const id: Dictionary<string> = {
|
|
508
|
+
...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
|
|
509
|
+
};
|
|
510
|
+
TelemetryEntity.addIfPresent(id, attrs, "k8s.namespace.name");
|
|
511
|
+
if (podUid) {
|
|
512
|
+
id["k8s.pod.uid"] = podUid;
|
|
513
|
+
} else if (podName) {
|
|
514
|
+
id["k8s.pod.name"] = podName;
|
|
515
|
+
}
|
|
516
|
+
return { entityType: EntityType.KubernetesPod, id };
|
|
517
|
+
},
|
|
518
|
+
|
|
519
|
+
// k8s.deployment — cluster + namespace + k8s.deployment.name.
|
|
520
|
+
(attrs: EntityAttributes) => {
|
|
521
|
+
const dep: string | null = TelemetryEntity.str(
|
|
522
|
+
attrs,
|
|
523
|
+
"k8s.deployment.name",
|
|
524
|
+
);
|
|
525
|
+
if (!dep) {
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
528
|
+
const id: Dictionary<string> = {
|
|
529
|
+
...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
|
|
530
|
+
};
|
|
531
|
+
TelemetryEntity.addIfPresent(id, attrs, "k8s.namespace.name");
|
|
532
|
+
id["k8s.deployment.name"] = dep;
|
|
533
|
+
return { entityType: EntityType.KubernetesDeployment, id };
|
|
534
|
+
},
|
|
535
|
+
|
|
536
|
+
/*
|
|
537
|
+
* container — container.id. High-churn: flows as a membership key but
|
|
538
|
+
* is membership-only by default (not promoted to a registry row
|
|
539
|
+
* unless a project opts in — see OpenTelemetryEntities.md Edge Cases).
|
|
540
|
+
*/
|
|
541
|
+
(attrs: EntityAttributes) => {
|
|
542
|
+
const containerId: string | null = TelemetryEntity.str(
|
|
543
|
+
attrs,
|
|
544
|
+
"container.id",
|
|
545
|
+
);
|
|
546
|
+
return containerId
|
|
547
|
+
? {
|
|
548
|
+
entityType: EntityType.Container,
|
|
549
|
+
id: { "container.id": containerId },
|
|
550
|
+
}
|
|
551
|
+
: null;
|
|
552
|
+
},
|
|
553
|
+
|
|
554
|
+
/*
|
|
555
|
+
* process — host identity + process.pid (+ process.start_time if
|
|
556
|
+
* present, which disambiguates pid reuse). High-churn: membership-only
|
|
557
|
+
* by default, same as container.
|
|
558
|
+
*/
|
|
559
|
+
(attrs: EntityAttributes) => {
|
|
560
|
+
const pid: string | null = TelemetryEntity.str(attrs, "process.pid");
|
|
561
|
+
if (!pid) {
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
const id: Dictionary<string> = { "process.pid": pid };
|
|
565
|
+
const hostId: string | null = TelemetryEntity.str(attrs, "host.id");
|
|
566
|
+
const hostName: string | null = TelemetryEntity.str(attrs, "host.name");
|
|
567
|
+
if (hostId) {
|
|
568
|
+
id["host.id"] = hostId;
|
|
569
|
+
} else if (hostName) {
|
|
570
|
+
id["host.name"] = hostName;
|
|
571
|
+
}
|
|
572
|
+
TelemetryEntity.addIfPresent(id, attrs, "process.start_time");
|
|
573
|
+
return { entityType: EntityType.Process, id };
|
|
574
|
+
},
|
|
575
|
+
|
|
576
|
+
/*
|
|
577
|
+
* telemetry.sdk — telemetry.sdk.name (+ language). Low value as a
|
|
578
|
+
* first-class entity; membership-only. Very low cardinality.
|
|
579
|
+
*/
|
|
580
|
+
(attrs: EntityAttributes) => {
|
|
581
|
+
const sdkName: string | null = TelemetryEntity.str(
|
|
582
|
+
attrs,
|
|
583
|
+
"telemetry.sdk.name",
|
|
584
|
+
);
|
|
585
|
+
if (!sdkName) {
|
|
586
|
+
return null;
|
|
587
|
+
}
|
|
588
|
+
const id: Dictionary<string> = { "telemetry.sdk.name": sdkName };
|
|
589
|
+
TelemetryEntity.addIfPresent(id, attrs, "telemetry.sdk.language");
|
|
590
|
+
return { entityType: EntityType.TelemetrySdk, id };
|
|
591
|
+
},
|
|
592
|
+
];
|
|
593
|
+
|
|
594
|
+
/*
|
|
595
|
+
* OTLP `entity_refs.type` values are the same semconv-style dotted
|
|
596
|
+
* names our EntityType enum uses as values ("service", "host",
|
|
597
|
+
* "k8s.pod", ...), so the map is just value → enum member. Unknown
|
|
598
|
+
* types are skipped by the caller.
|
|
599
|
+
*/
|
|
600
|
+
private static readonly entityTypeByRefType: Map<string, EntityType> =
|
|
601
|
+
new Map(
|
|
602
|
+
Object.values(EntityType).map((entityType: EntityType) => {
|
|
603
|
+
return [String(entityType), entityType];
|
|
604
|
+
}),
|
|
605
|
+
);
|
|
606
|
+
|
|
607
|
+
/*
|
|
608
|
+
* Attributes our model treats as mutable/descriptive (image tag,
|
|
609
|
+
* version, IP, command line, ...). Advisory only: when a producer's
|
|
610
|
+
* entity_ref declares one as identifying we honor it but log a
|
|
611
|
+
* cardinality warning (see OpenTelemetryEntities.md, Edge Cases).
|
|
612
|
+
*/
|
|
613
|
+
private static readonly knownMutableAttributeKeys: ReadonlySet<string> =
|
|
614
|
+
new Set([
|
|
615
|
+
"service.version",
|
|
616
|
+
"telemetry.sdk.version",
|
|
617
|
+
"host.ip",
|
|
618
|
+
"host.image.id",
|
|
619
|
+
"os.version",
|
|
620
|
+
"os.description",
|
|
621
|
+
"container.image.tag",
|
|
622
|
+
"container.image.tags",
|
|
623
|
+
"container.image.id",
|
|
624
|
+
"process.command_line",
|
|
625
|
+
"process.command_args",
|
|
626
|
+
]);
|
|
627
|
+
|
|
628
|
+
/*
|
|
629
|
+
* Per-type descriptive allowlists (heuristic path). Deliberately tiny
|
|
630
|
+
* (<= ~6 keys each): the registry merges these last-writer-wins, so
|
|
631
|
+
* only stable, dashboard-worthy metadata belongs here. Types not
|
|
632
|
+
* listed emit no descriptive attributes.
|
|
633
|
+
*/
|
|
634
|
+
private static readonly descriptiveAttributeKeysByType: Partial<
|
|
635
|
+
Record<EntityType, Array<string>>
|
|
636
|
+
> = {
|
|
637
|
+
[EntityType.Host]: [
|
|
638
|
+
"os.type",
|
|
639
|
+
"host.arch",
|
|
640
|
+
"cloud.provider",
|
|
641
|
+
"cloud.region",
|
|
642
|
+
"cloud.availability_zone",
|
|
643
|
+
],
|
|
644
|
+
[EntityType.Service]: [
|
|
645
|
+
"telemetry.sdk.language",
|
|
646
|
+
"telemetry.sdk.name",
|
|
647
|
+
"telemetry.sdk.version",
|
|
648
|
+
],
|
|
649
|
+
[EntityType.KubernetesNode]: ["node.kubernetes.io/instance-type"],
|
|
650
|
+
[EntityType.Container]: [
|
|
651
|
+
"container.image.name",
|
|
652
|
+
"container.image.tag",
|
|
653
|
+
"container.image.tags",
|
|
654
|
+
],
|
|
655
|
+
};
|
|
656
|
+
|
|
657
|
+
private static descriptiveAttributesFor(
|
|
658
|
+
entityType: EntityType,
|
|
659
|
+
attrs: EntityAttributes,
|
|
660
|
+
): Record<string, string> {
|
|
661
|
+
const out: Record<string, string> = {};
|
|
662
|
+
const keys: Array<string> | undefined =
|
|
663
|
+
this.descriptiveAttributeKeysByType[entityType];
|
|
664
|
+
|
|
665
|
+
if (!keys) {
|
|
666
|
+
return out;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
for (const key of keys) {
|
|
670
|
+
const value: string | null = this.strOrFirst(attrs, key);
|
|
671
|
+
if (value) {
|
|
672
|
+
out[key] = value;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
return out;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* Like `str`, but additionally accepts an array-valued attribute by
|
|
681
|
+
* taking its first scalar element (e.g. semconv `container.image.tags`
|
|
682
|
+
* is an array). Descriptive use only — identity stays scalar-strict.
|
|
683
|
+
*/
|
|
684
|
+
private static strOrFirst(
|
|
685
|
+
attrs: EntityAttributes,
|
|
686
|
+
key: string,
|
|
687
|
+
): string | null {
|
|
688
|
+
const direct: string | null = this.str(attrs, key);
|
|
689
|
+
if (direct) {
|
|
690
|
+
return direct;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
const value: EntityAttributeValue | Array<EntityAttributeValue> = attrs
|
|
694
|
+
? attrs[key]
|
|
695
|
+
: undefined;
|
|
696
|
+
|
|
697
|
+
if (Array.isArray(value)) {
|
|
698
|
+
for (const item of value) {
|
|
699
|
+
if (typeof item === "string" && item.trim().length > 0) {
|
|
700
|
+
return item.trim();
|
|
701
|
+
}
|
|
702
|
+
if (typeof item === "number" || typeof item === "boolean") {
|
|
703
|
+
return String(item);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
private static stringList(value: unknown): Array<string> {
|
|
712
|
+
if (!Array.isArray(value)) {
|
|
713
|
+
return [];
|
|
714
|
+
}
|
|
715
|
+
return value.filter((item: unknown): item is string => {
|
|
716
|
+
return typeof item === "string" && item.trim().length > 0;
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
/*
|
|
721
|
+
* k8s cluster identity — k8s.cluster.name only, for the same reason host
|
|
722
|
+
* identity is host.name-only (see the host resolver above): the typed
|
|
723
|
+
* Postgres row (KubernetesCluster.clusterIdentifier) and the
|
|
724
|
+
* primary-entity discovery path (getClusterNameFromAttributes) are
|
|
725
|
+
* name-based, so a uid-keyed entity would be unmatchable by the read
|
|
726
|
+
* side (`EntityKey.keyForKubernetesCluster(clusterIdentifier)`).
|
|
727
|
+
* uid-based cluster identity is deferred alongside the host.id
|
|
728
|
+
* hardening. This identity is also folded into the composite k8s
|
|
729
|
+
* namespace/node/pod/deployment identities, which must stay name-based
|
|
730
|
+
* with it.
|
|
731
|
+
*/
|
|
732
|
+
private static k8sClusterIdentity(
|
|
733
|
+
attrs: EntityAttributes,
|
|
734
|
+
): Dictionary<string> | null {
|
|
735
|
+
const name: string | null = this.str(attrs, "k8s.cluster.name");
|
|
736
|
+
if (name) {
|
|
737
|
+
return { "k8s.cluster.name": name };
|
|
738
|
+
}
|
|
739
|
+
return null;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/** Copy `key` from attrs into `id` (canonicalized) when scalar & present. */
|
|
743
|
+
private static addIfPresent(
|
|
744
|
+
id: Dictionary<string>,
|
|
745
|
+
attrs: EntityAttributes,
|
|
746
|
+
key: string,
|
|
747
|
+
): void {
|
|
748
|
+
const value: string | null = this.str(attrs, key);
|
|
749
|
+
if (value) {
|
|
750
|
+
id[key] = value;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/**
|
|
755
|
+
* Read a scalar attribute as a trimmed string. Numbers/booleans coerce;
|
|
756
|
+
* null/undefined/empty/arrays/objects return null (not identity-bearing).
|
|
757
|
+
*/
|
|
758
|
+
private static str(attrs: EntityAttributes, key: string): string | null {
|
|
759
|
+
const value: EntityAttributeValue | Array<EntityAttributeValue> = attrs
|
|
760
|
+
? attrs[key]
|
|
761
|
+
: undefined;
|
|
762
|
+
|
|
763
|
+
if (value === undefined || value === null) {
|
|
764
|
+
return null;
|
|
765
|
+
}
|
|
766
|
+
if (typeof value === "string") {
|
|
767
|
+
const trimmed: string = value.trim();
|
|
768
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
769
|
+
}
|
|
770
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
771
|
+
return String(value);
|
|
772
|
+
}
|
|
773
|
+
return null;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
private static canonObject(id: Dictionary<string>): Dictionary<string> {
|
|
777
|
+
const out: Dictionary<string> = {};
|
|
778
|
+
for (const key of Object.keys(id)) {
|
|
779
|
+
out[key] = canonicalizeEntityValue(id[key]);
|
|
780
|
+
}
|
|
781
|
+
return out;
|
|
782
|
+
}
|
|
783
|
+
}
|