@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
|
@@ -127,6 +127,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
127
127
|
serviceNamespace?: string | undefined;
|
|
128
128
|
runtimeName?: string | undefined;
|
|
129
129
|
runtimeVersion?: string | undefined;
|
|
130
|
+
telemetrySdkLanguage?: string | undefined;
|
|
130
131
|
cloudProvider?: string | undefined;
|
|
131
132
|
cloudPlatform?: string | undefined;
|
|
132
133
|
cloudRegion?: string | undefined;
|
|
@@ -181,6 +182,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
181
182
|
if (extra?.runtimeVersion) {
|
|
182
183
|
data.runtimeVersion = extra.runtimeVersion;
|
|
183
184
|
}
|
|
185
|
+
if (extra?.telemetrySdkLanguage) {
|
|
186
|
+
data.telemetrySdkLanguage = extra.telemetrySdkLanguage;
|
|
187
|
+
}
|
|
184
188
|
if (extra?.cloudProvider) {
|
|
185
189
|
data.cloudProvider = extra.cloudProvider;
|
|
186
190
|
}
|
|
@@ -209,6 +213,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
209
213
|
serviceNamespace?: string | undefined;
|
|
210
214
|
runtimeName?: string | undefined;
|
|
211
215
|
runtimeVersion?: string | undefined;
|
|
216
|
+
telemetrySdkLanguage?: string | undefined;
|
|
212
217
|
cloudProvider?: string | undefined;
|
|
213
218
|
cloudPlatform?: string | undefined;
|
|
214
219
|
cloudRegion?: string | undefined;
|
|
@@ -220,6 +225,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
220
225
|
serviceNamespace: extra?.serviceNamespace ?? null,
|
|
221
226
|
runtimeName: extra?.runtimeName ?? null,
|
|
222
227
|
runtimeVersion: extra?.runtimeVersion ?? null,
|
|
228
|
+
telemetrySdkLanguage: extra?.telemetrySdkLanguage ?? null,
|
|
223
229
|
cloudProvider: extra?.cloudProvider ?? null,
|
|
224
230
|
cloudPlatform: extra?.cloudPlatform ?? null,
|
|
225
231
|
cloudRegion: extra?.cloudRegion ?? null,
|
|
@@ -2,8 +2,14 @@ import ClickhouseDatabase from "../Infrastructure/ClickhouseDatabase";
|
|
|
2
2
|
import AnalyticsDatabaseService from "./AnalyticsDatabaseService";
|
|
3
3
|
import Span from "../../Models/AnalyticsModels/Span";
|
|
4
4
|
import CountBy from "../Types/AnalyticsDatabase/CountBy";
|
|
5
|
+
import AggregateBy, {
|
|
6
|
+
AggregateUtil,
|
|
7
|
+
} from "../Types/AnalyticsDatabase/AggregateBy";
|
|
5
8
|
import { SQL, Statement } from "../Utils/AnalyticsDatabase/Statement";
|
|
9
|
+
import { getQuerySettings } from "../Utils/AnalyticsDatabase/QuerySettingsHelper";
|
|
6
10
|
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
|
|
11
|
+
import AggregationType from "../../Types/BaseDatabase/AggregationType";
|
|
12
|
+
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
7
13
|
import InBetween from "../../Types/BaseDatabase/InBetween";
|
|
8
14
|
import Includes from "../../Types/BaseDatabase/Includes";
|
|
9
15
|
import ObjectID from "../../Types/ObjectID";
|
|
@@ -19,7 +25,7 @@ const PROJECTION_ELIGIBLE_KEYS: Set<string> = new Set([
|
|
|
19
25
|
"projectId",
|
|
20
26
|
"startTime",
|
|
21
27
|
"isRootSpan",
|
|
22
|
-
"
|
|
28
|
+
"primaryEntityId",
|
|
23
29
|
"statusCode",
|
|
24
30
|
]);
|
|
25
31
|
|
|
@@ -48,9 +54,9 @@ export class SpanService extends AnalyticsDatabaseService<Span> {
|
|
|
48
54
|
/**
|
|
49
55
|
* Override the count statement to route eligible queries through the
|
|
50
56
|
* proj_hist_by_minute projection. The projection is keyed on
|
|
51
|
-
* (projectId, toStartOfMinute(startTime),
|
|
52
|
-
* so its WHERE clause must reference the projection's exact
|
|
53
|
-
* filtering on raw `startTime` won't trigger projection use.
|
|
57
|
+
* (projectId, toStartOfMinute(startTime), primaryEntityId, statusCode,
|
|
58
|
+
* isRootSpan) so its WHERE clause must reference the projection's exact
|
|
59
|
+
* expressions — filtering on raw `startTime` won't trigger projection use.
|
|
54
60
|
*
|
|
55
61
|
* Trade-off: time bounds get rounded to the minute, so the count can be
|
|
56
62
|
* inflated by spans that started in the same minute as the boundary. For
|
|
@@ -132,23 +138,23 @@ export class SpanService extends AnalyticsDatabaseService<Span> {
|
|
|
132
138
|
);
|
|
133
139
|
}
|
|
134
140
|
|
|
135
|
-
const
|
|
136
|
-
if (
|
|
141
|
+
const primaryEntityIdValue: unknown = query["primaryEntityId"];
|
|
142
|
+
if (primaryEntityIdValue instanceof ObjectID) {
|
|
137
143
|
statement.append(
|
|
138
|
-
SQL` AND
|
|
144
|
+
SQL` AND primaryEntityId = ${{
|
|
139
145
|
type: TableColumnType.ObjectID,
|
|
140
|
-
value:
|
|
146
|
+
value: primaryEntityIdValue,
|
|
141
147
|
}}`,
|
|
142
148
|
);
|
|
143
|
-
} else if (
|
|
149
|
+
} else if (primaryEntityIdValue instanceof Includes) {
|
|
144
150
|
statement.append(
|
|
145
|
-
SQL` AND
|
|
151
|
+
SQL` AND primaryEntityId IN (${{
|
|
146
152
|
type: TableColumnType.ObjectID,
|
|
147
|
-
value:
|
|
153
|
+
value: primaryEntityIdValue,
|
|
148
154
|
}})`,
|
|
149
155
|
);
|
|
150
|
-
} else if (
|
|
151
|
-
// Unrecognized
|
|
156
|
+
} else if (primaryEntityIdValue !== undefined) {
|
|
157
|
+
// Unrecognized primaryEntityId form — let the generic path handle it.
|
|
152
158
|
return null;
|
|
153
159
|
}
|
|
154
160
|
|
|
@@ -177,11 +183,265 @@ export class SpanService extends AnalyticsDatabaseService<Span> {
|
|
|
177
183
|
* in depth — projection scans should complete in <1s.
|
|
178
184
|
*/
|
|
179
185
|
statement.append(
|
|
180
|
-
|
|
186
|
+
getQuerySettings({
|
|
187
|
+
maxExecutionTimeInSeconds: 45,
|
|
188
|
+
timeoutOverflowMode: "break",
|
|
189
|
+
additionalSettings: { optimize_use_projections: 1 },
|
|
190
|
+
}),
|
|
181
191
|
);
|
|
182
192
|
|
|
183
193
|
return statement;
|
|
184
194
|
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Route eligible duration aggregations through the proj_agg_by_service
|
|
198
|
+
* projection (projectId, primaryEntityId, toStartOfMinute(startTime) ->
|
|
199
|
+
* count() / avg(durationUnixNano) / quantile(0.99)(durationUnixNano)).
|
|
200
|
+
* The projection stores aggregate-function STATES, so re-grouping its
|
|
201
|
+
* minute rows into coarser buckets merges those states — results are
|
|
202
|
+
* identical to scanning the raw table, at a fraction of the read
|
|
203
|
+
* (verified on dev with EXPLAIN indexes=1: ReadFromMergeTree
|
|
204
|
+
* (proj_agg_by_service), 9/2136 granules for a full-day window).
|
|
205
|
+
*
|
|
206
|
+
* Count queries may additionally filter on statusCode / isRootSpan: the
|
|
207
|
+
* optimizer then serves them from proj_hist_by_minute, whose key is
|
|
208
|
+
* (projectId, minute, primaryEntityId, statusCode, isRootSpan). This is
|
|
209
|
+
* the error-rate series on the Service / RUM / Serverless overview
|
|
210
|
+
* pages. Those filters stay rejected for Avg/P99 — proj_agg_by_service
|
|
211
|
+
* cannot evaluate them, and quantile states for different levels do not
|
|
212
|
+
* merge.
|
|
213
|
+
*
|
|
214
|
+
* Two things are load-bearing for the optimizer to pick the projection:
|
|
215
|
+
* 1. The time predicates AND the bucket expression must be written
|
|
216
|
+
* over toStartOfMinute(startTime) — the projection's key
|
|
217
|
+
* expression — never raw startTime.
|
|
218
|
+
* 2. The aggregate must byte-match a stored expression: count() (NOT
|
|
219
|
+
* count(durationUnixNano) — equivalent here since the column is
|
|
220
|
+
* non-nullable), avg(durationUnixNano) or
|
|
221
|
+
* quantile(0.99)(durationUnixNano).
|
|
222
|
+
*
|
|
223
|
+
* Trade-off (same as the count override): window edges round to the
|
|
224
|
+
* minute, so the boundary buckets may include spans from the partial
|
|
225
|
+
* boundary minute.
|
|
226
|
+
*/
|
|
227
|
+
public override toAggregateStatement(aggregateBy: AggregateBy<Span>): {
|
|
228
|
+
statement: Statement;
|
|
229
|
+
columns: Array<string>;
|
|
230
|
+
} {
|
|
231
|
+
const projectionStatement: {
|
|
232
|
+
statement: Statement;
|
|
233
|
+
columns: Array<string>;
|
|
234
|
+
} | null = this.tryBuildProjectionAggregateStatement(aggregateBy);
|
|
235
|
+
if (projectionStatement) {
|
|
236
|
+
return projectionStatement;
|
|
237
|
+
}
|
|
238
|
+
return super.toAggregateStatement(aggregateBy);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
private tryBuildProjectionAggregateStatement(
|
|
242
|
+
aggregateBy: AggregateBy<Span>,
|
|
243
|
+
): { statement: Statement; columns: Array<string> } | null {
|
|
244
|
+
if (aggregateBy.aggregateColumnName?.toString() !== "durationUnixNano") {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/*
|
|
249
|
+
* Only the aggregates whose states the projection stores. P95 etc.
|
|
250
|
+
* must fall back: the projection has no quantile(0.95) state and
|
|
251
|
+
* quantile states for different levels do not merge into each other.
|
|
252
|
+
*/
|
|
253
|
+
const aggregateExpressionByType: Partial<Record<AggregationType, string>> =
|
|
254
|
+
{
|
|
255
|
+
[AggregationType.Count]: "count()",
|
|
256
|
+
[AggregationType.Avg]: "avg(durationUnixNano)",
|
|
257
|
+
[AggregationType.P99]: "quantile(0.99)(durationUnixNano)",
|
|
258
|
+
};
|
|
259
|
+
const aggregateExpression: string | undefined =
|
|
260
|
+
aggregateExpressionByType[aggregateBy.aggregationType];
|
|
261
|
+
if (!aggregateExpression) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (
|
|
266
|
+
aggregateBy.aggregationTimestampColumnName?.toString() !== "startTime"
|
|
267
|
+
) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (aggregateBy.groupBy && Object.keys(aggregateBy.groupBy).length > 0) {
|
|
272
|
+
// Extra GROUP BY dimensions aren't all projection columns; fall back.
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (!aggregateBy.startTimestamp || !aggregateBy.endTimestamp) {
|
|
277
|
+
// Needed to derive the bucket interval (mirrors the generic path).
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const query: Record<string, unknown> = (aggregateBy.query ||
|
|
282
|
+
{}) as unknown as Record<string, unknown>;
|
|
283
|
+
|
|
284
|
+
/*
|
|
285
|
+
* Filters the projections can evaluate. Avg/P99 are served by
|
|
286
|
+
* proj_agg_by_service, which is keyed only on (projectId,
|
|
287
|
+
* primaryEntityId, minute) — a statusCode/isRootSpan filter must bail.
|
|
288
|
+
* Count is also served by proj_hist_by_minute, whose key includes
|
|
289
|
+
* statusCode and isRootSpan, so those filters stay projection-servable
|
|
290
|
+
* for Count (this is the error-rate series on the overview pages).
|
|
291
|
+
*/
|
|
292
|
+
const eligibleKeys: Array<string> = [
|
|
293
|
+
"projectId",
|
|
294
|
+
"startTime",
|
|
295
|
+
"primaryEntityId",
|
|
296
|
+
];
|
|
297
|
+
if (aggregateBy.aggregationType === AggregationType.Count) {
|
|
298
|
+
eligibleKeys.push("statusCode", "isRootSpan");
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Bail out on any filter the projections cannot evaluate.
|
|
302
|
+
for (const key of Object.keys(query)) {
|
|
303
|
+
if (!eligibleKeys.includes(key)) {
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const projectId: ObjectID | undefined = query["projectId"] as
|
|
309
|
+
| ObjectID
|
|
310
|
+
| undefined;
|
|
311
|
+
const startTimeFilter: unknown = query["startTime"];
|
|
312
|
+
|
|
313
|
+
if (!projectId || !(startTimeFilter instanceof InBetween)) {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const startValue: Date | null = SpanService.coerceToDate(
|
|
318
|
+
startTimeFilter.startValue,
|
|
319
|
+
);
|
|
320
|
+
const endValue: Date | null = SpanService.coerceToDate(
|
|
321
|
+
startTimeFilter.endValue,
|
|
322
|
+
);
|
|
323
|
+
if (!startValue || !endValue) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (!this.database) {
|
|
328
|
+
this.useDefaultDatabase();
|
|
329
|
+
}
|
|
330
|
+
const databaseName: string = this.database.getDatasourceOptions().database!;
|
|
331
|
+
|
|
332
|
+
const aggregationInterval: string = AggregateUtil.getAggregationInterval({
|
|
333
|
+
startDate: aggregateBy.startTimestamp,
|
|
334
|
+
endDate: aggregateBy.endTimestamp,
|
|
335
|
+
}).toLowerCase();
|
|
336
|
+
|
|
337
|
+
/*
|
|
338
|
+
* Bucket expression derived from the projection key: for the minute
|
|
339
|
+
* interval date_trunc is a no-op, for coarser intervals truncating
|
|
340
|
+
* the minute equals truncating the raw timestamp. Aliased to the
|
|
341
|
+
* timestamp column name so the generic result parsing applies.
|
|
342
|
+
*/
|
|
343
|
+
const statement: Statement = new Statement();
|
|
344
|
+
statement.append(
|
|
345
|
+
`SELECT ${aggregateExpression} as durationUnixNano, date_trunc('${aggregationInterval}', toStartOfMinute(startTime)) as startTime`,
|
|
346
|
+
);
|
|
347
|
+
statement.append(
|
|
348
|
+
SQL` FROM ${databaseName}.${this.model.tableName} WHERE projectId = ${{
|
|
349
|
+
type: TableColumnType.ObjectID,
|
|
350
|
+
value: projectId,
|
|
351
|
+
}} AND toStartOfMinute(startTime) >= toStartOfMinute(${{
|
|
352
|
+
type: TableColumnType.Date,
|
|
353
|
+
value: startValue,
|
|
354
|
+
}}) AND toStartOfMinute(startTime) <= toStartOfMinute(${{
|
|
355
|
+
type: TableColumnType.Date,
|
|
356
|
+
value: endValue,
|
|
357
|
+
}})`,
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
const primaryEntityIdValue: unknown = query["primaryEntityId"];
|
|
361
|
+
if (primaryEntityIdValue instanceof ObjectID) {
|
|
362
|
+
statement.append(
|
|
363
|
+
SQL` AND primaryEntityId = ${{
|
|
364
|
+
type: TableColumnType.ObjectID,
|
|
365
|
+
value: primaryEntityIdValue,
|
|
366
|
+
}}`,
|
|
367
|
+
);
|
|
368
|
+
} else if (primaryEntityIdValue instanceof Includes) {
|
|
369
|
+
statement.append(
|
|
370
|
+
SQL` AND primaryEntityId IN (${{
|
|
371
|
+
type: TableColumnType.ObjectID,
|
|
372
|
+
value: primaryEntityIdValue,
|
|
373
|
+
}})`,
|
|
374
|
+
);
|
|
375
|
+
} else if (primaryEntityIdValue !== undefined) {
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/*
|
|
380
|
+
* Only reachable for Count (the whitelist above rejects these keys for
|
|
381
|
+
* Avg/P99). Predicate translation mirrors
|
|
382
|
+
* tryBuildProjectionCountStatement: scalar = equality, Includes = IN,
|
|
383
|
+
* anything else = bail to the generic path.
|
|
384
|
+
*/
|
|
385
|
+
if (query["isRootSpan"] !== undefined) {
|
|
386
|
+
statement.append(
|
|
387
|
+
SQL` AND isRootSpan = ${{
|
|
388
|
+
type: TableColumnType.Boolean,
|
|
389
|
+
value: Boolean(query["isRootSpan"]),
|
|
390
|
+
}}`,
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
const statusCodeValue: unknown = query["statusCode"];
|
|
395
|
+
if (typeof statusCodeValue === "number") {
|
|
396
|
+
statement.append(
|
|
397
|
+
SQL` AND statusCode = ${{
|
|
398
|
+
type: TableColumnType.Number,
|
|
399
|
+
value: statusCodeValue,
|
|
400
|
+
}}`,
|
|
401
|
+
);
|
|
402
|
+
} else if (statusCodeValue instanceof Includes) {
|
|
403
|
+
statement.append(
|
|
404
|
+
SQL` AND statusCode IN (${{
|
|
405
|
+
type: TableColumnType.Number,
|
|
406
|
+
value: statusCodeValue,
|
|
407
|
+
}})`,
|
|
408
|
+
);
|
|
409
|
+
} else if (statusCodeValue !== undefined) {
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
statement.append(" GROUP BY startTime");
|
|
414
|
+
|
|
415
|
+
const sortOrder: SortOrder | undefined = aggregateBy.sort
|
|
416
|
+
? (Object.values(aggregateBy.sort)[0] as SortOrder | undefined)
|
|
417
|
+
: undefined;
|
|
418
|
+
statement.append(
|
|
419
|
+
` ORDER BY startTime ${sortOrder === SortOrder.Ascending ? "ASC" : "DESC"}`,
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
statement.append(
|
|
423
|
+
SQL` LIMIT ${{
|
|
424
|
+
type: TableColumnType.Number,
|
|
425
|
+
value: Number(aggregateBy.limit) || 10,
|
|
426
|
+
}} OFFSET ${{
|
|
427
|
+
type: TableColumnType.Number,
|
|
428
|
+
value: Number(aggregateBy.skip) || 0,
|
|
429
|
+
}}`,
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
statement.append(
|
|
433
|
+
getQuerySettings({
|
|
434
|
+
maxExecutionTimeInSeconds: 45,
|
|
435
|
+
timeoutOverflowMode: "break",
|
|
436
|
+
additionalSettings: { optimize_use_projections: 1 },
|
|
437
|
+
}),
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
return {
|
|
441
|
+
statement,
|
|
442
|
+
columns: ["durationUnixNano", "startTime"],
|
|
443
|
+
};
|
|
444
|
+
}
|
|
185
445
|
}
|
|
186
446
|
|
|
187
447
|
export default new SpanService();
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/TelemetryEntityRelationship";
|
|
3
|
+
import ObjectID from "../../Types/ObjectID";
|
|
4
|
+
import OneUptimeDate from "../../Types/Date";
|
|
5
|
+
import logger from "../Utils/Logger";
|
|
6
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
7
|
+
import { EntityRelationshipEdge } from "../../Utils/Telemetry/EntityRelationship";
|
|
8
|
+
import { reconcileByNaturalKey } from "../Utils/Telemetry/EntityRegistry";
|
|
9
|
+
|
|
10
|
+
export class TelemetryEntityRelationshipService extends DatabaseService<Model> {
|
|
11
|
+
public constructor() {
|
|
12
|
+
super(Model);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Forward-only topology reconciliation: upsert a row per directed edge and
|
|
17
|
+
* bump `lastSeenAt`. Resilient — a topology-graph failure must never break
|
|
18
|
+
* signal ingest, so every error is swallowed (logged). Callers throttle
|
|
19
|
+
* this (see `reconcileEntityRegistryThrottled` in
|
|
20
|
+
* `Common/Server/Utils/Telemetry/EntityRegistry`), and only pass edges
|
|
21
|
+
* among registry-promoted entities so every edge endpoint has a row.
|
|
22
|
+
*/
|
|
23
|
+
@CaptureSpan()
|
|
24
|
+
public async reconcileRelationships(data: {
|
|
25
|
+
projectId: ObjectID;
|
|
26
|
+
edges: Array<EntityRelationshipEdge>;
|
|
27
|
+
}): Promise<void> {
|
|
28
|
+
for (const edge of data.edges) {
|
|
29
|
+
try {
|
|
30
|
+
await this.upsertRelationship({ projectId: data.projectId, edge });
|
|
31
|
+
} catch (err) {
|
|
32
|
+
logger.error(
|
|
33
|
+
`TelemetryEntityRelationshipService: failed to upsert edge ${edge.fromEntityKey}-[${edge.relationshipType}]->${edge.toEntityKey}:`,
|
|
34
|
+
);
|
|
35
|
+
logger.error(err as Error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private async upsertRelationship(data: {
|
|
41
|
+
projectId: ObjectID;
|
|
42
|
+
edge: EntityRelationshipEdge;
|
|
43
|
+
}): Promise<void> {
|
|
44
|
+
const { projectId, edge } = data;
|
|
45
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
46
|
+
|
|
47
|
+
await reconcileByNaturalKey({
|
|
48
|
+
service: this,
|
|
49
|
+
query: {
|
|
50
|
+
projectId,
|
|
51
|
+
fromEntityKey: edge.fromEntityKey,
|
|
52
|
+
toEntityKey: edge.toEntityKey,
|
|
53
|
+
relationshipType: edge.relationshipType,
|
|
54
|
+
},
|
|
55
|
+
lastSeenAt: now,
|
|
56
|
+
describe: `edge ${edge.fromEntityKey}-[${edge.relationshipType}]->${edge.toEntityKey}`,
|
|
57
|
+
buildModel: () => {
|
|
58
|
+
const model: Model = new Model();
|
|
59
|
+
model.projectId = projectId;
|
|
60
|
+
model.fromEntityKey = edge.fromEntityKey;
|
|
61
|
+
model.toEntityKey = edge.toEntityKey;
|
|
62
|
+
model.relationshipType = edge.relationshipType;
|
|
63
|
+
model.firstSeenAt = now;
|
|
64
|
+
model.lastSeenAt = now;
|
|
65
|
+
return model;
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default new TelemetryEntityRelationshipService();
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/TelemetryEntity";
|
|
3
|
+
import ObjectID from "../../Types/ObjectID";
|
|
4
|
+
import OneUptimeDate from "../../Types/Date";
|
|
5
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
6
|
+
import QueryDeepPartialEntity from "../../Types/Database/PartialEntity";
|
|
7
|
+
import { JSONObject } from "../../Types/JSON";
|
|
8
|
+
import EntityType from "../../Types/Telemetry/EntityType";
|
|
9
|
+
import logger from "../Utils/Logger";
|
|
10
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
11
|
+
import { ExtractedEntity } from "../Utils/Telemetry/TelemetryEntity";
|
|
12
|
+
import {
|
|
13
|
+
getEntityBudget,
|
|
14
|
+
reconcileByNaturalKey,
|
|
15
|
+
REGISTRY_PROMOTED_TYPES,
|
|
16
|
+
shouldWarnEntityBudgetOnce,
|
|
17
|
+
} from "../Utils/Telemetry/EntityRegistry";
|
|
18
|
+
|
|
19
|
+
export class TelemetryEntityService extends DatabaseService<Model> {
|
|
20
|
+
public constructor() {
|
|
21
|
+
super(Model);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Forward-only registry reconciliation: upsert a catalog row per
|
|
26
|
+
* discovered entity, bump `lastSeenAt`, merge descriptive attributes
|
|
27
|
+
* (last-writer-wins) and union labels. High-churn membership-only
|
|
28
|
+
* types (container / process / service.instance / telemetry.sdk — see
|
|
29
|
+
* `REGISTRY_PROMOTED_TYPES`) are skipped: their keys still flow into
|
|
30
|
+
* the `entityKeys` column on signals, they just never mint registry
|
|
31
|
+
* rows. New rows are additionally gated by a per-(project, type)
|
|
32
|
+
* entity budget. Resilient by design — a registry failure must never break
|
|
33
|
+
* signal ingest, so every error is swallowed (logged). Callers are
|
|
34
|
+
* expected to throttle this (it should not run on every batch); see
|
|
35
|
+
* `reconcileEntityRegistryThrottled` in
|
|
36
|
+
* `Common/Server/Utils/Telemetry/EntityRegistry`.
|
|
37
|
+
*/
|
|
38
|
+
@CaptureSpan()
|
|
39
|
+
public async reconcileEntities(data: {
|
|
40
|
+
projectId: ObjectID;
|
|
41
|
+
entities: Array<ExtractedEntity>;
|
|
42
|
+
}): Promise<void> {
|
|
43
|
+
/*
|
|
44
|
+
* Per-reconcile budget count cache: at most one countBy per entity
|
|
45
|
+
* type per reconcile (the fence already throttles reconciles to one
|
|
46
|
+
* per entity-set per window, so this stays cheap). Creates within
|
|
47
|
+
* this reconcile increment the cached count so a single batch cannot
|
|
48
|
+
* blow past the budget.
|
|
49
|
+
*/
|
|
50
|
+
const countByType: Map<EntityType, number> = new Map<EntityType, number>();
|
|
51
|
+
|
|
52
|
+
for (const entity of data.entities) {
|
|
53
|
+
if (!REGISTRY_PROMOTED_TYPES.has(entity.entityType)) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await this.upsertEntity({
|
|
58
|
+
projectId: data.projectId,
|
|
59
|
+
entity,
|
|
60
|
+
countByType,
|
|
61
|
+
});
|
|
62
|
+
} catch (err) {
|
|
63
|
+
logger.error(
|
|
64
|
+
`TelemetryEntityService: failed to upsert entity ${entity.entityType}/${entity.entityKey}:`,
|
|
65
|
+
);
|
|
66
|
+
logger.error(err as Error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private async upsertEntity(data: {
|
|
72
|
+
projectId: ObjectID;
|
|
73
|
+
entity: ExtractedEntity;
|
|
74
|
+
countByType: Map<EntityType, number>;
|
|
75
|
+
}): Promise<void> {
|
|
76
|
+
const { projectId, entity, countByType } = data;
|
|
77
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
78
|
+
|
|
79
|
+
await reconcileByNaturalKey({
|
|
80
|
+
service: this,
|
|
81
|
+
query: {
|
|
82
|
+
projectId,
|
|
83
|
+
entityType: entity.entityType,
|
|
84
|
+
entityKey: entity.entityKey,
|
|
85
|
+
},
|
|
86
|
+
lastSeenAt: now,
|
|
87
|
+
describe: `entity ${entity.entityType}/${entity.entityKey}`,
|
|
88
|
+
select: { descriptiveAttributes: true, labels: true },
|
|
89
|
+
buildUpdate: (existing: Model): QueryDeepPartialEntity<Model> => {
|
|
90
|
+
return TelemetryEntityService.buildDescriptiveUpdate(entity, existing);
|
|
91
|
+
},
|
|
92
|
+
/*
|
|
93
|
+
* Entity budget (doc §Edge Cases): existing rows always get their
|
|
94
|
+
* bump above; only NEW rows are gated. Counted via the
|
|
95
|
+
* (projectId, entityType) index; over budget the row is skipped —
|
|
96
|
+
* its key still flows in `entityKeys` on signals.
|
|
97
|
+
*/
|
|
98
|
+
beforeCreate: async (): Promise<boolean> => {
|
|
99
|
+
const budget: number = getEntityBudget(entity.entityType);
|
|
100
|
+
|
|
101
|
+
let count: number | undefined = countByType.get(entity.entityType);
|
|
102
|
+
if (count === undefined) {
|
|
103
|
+
count = (
|
|
104
|
+
await this.countBy({
|
|
105
|
+
query: { projectId, entityType: entity.entityType },
|
|
106
|
+
props: { isRoot: true },
|
|
107
|
+
})
|
|
108
|
+
).toNumber();
|
|
109
|
+
countByType.set(entity.entityType, count);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (count < budget) {
|
|
113
|
+
countByType.set(entity.entityType, count + 1);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (
|
|
118
|
+
await shouldWarnEntityBudgetOnce({
|
|
119
|
+
projectId,
|
|
120
|
+
entityType: entity.entityType,
|
|
121
|
+
})
|
|
122
|
+
) {
|
|
123
|
+
logger.warn(
|
|
124
|
+
`TelemetryEntityService: entity budget reached for project ${projectId.toString()} type ${entity.entityType} (${count} >= ${budget}); skipping new registry rows. Membership keys still flow on signals.`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
},
|
|
129
|
+
buildModel: () => {
|
|
130
|
+
const model: Model = new Model();
|
|
131
|
+
model.projectId = projectId;
|
|
132
|
+
model.entityType = entity.entityType;
|
|
133
|
+
model.entityKey = entity.entityKey;
|
|
134
|
+
model.identifyingAttributes = entity.identifyingAttributes;
|
|
135
|
+
if (
|
|
136
|
+
entity.descriptiveAttributes &&
|
|
137
|
+
Object.keys(entity.descriptiveAttributes).length > 0
|
|
138
|
+
) {
|
|
139
|
+
model.descriptiveAttributes = entity.descriptiveAttributes;
|
|
140
|
+
}
|
|
141
|
+
if (entity.labels && entity.labels.length > 0) {
|
|
142
|
+
model.labels = TelemetryEntityService.normalizeLabels(entity.labels);
|
|
143
|
+
}
|
|
144
|
+
// varchar(ShortText) column; k8s names can run to 253 chars.
|
|
145
|
+
model.displayName = TelemetryEntityService.deriveDisplayName(
|
|
146
|
+
entity,
|
|
147
|
+
).substring(0, ColumnLength.ShortText);
|
|
148
|
+
model.firstSeenAt = now;
|
|
149
|
+
model.lastSeenAt = now;
|
|
150
|
+
return model;
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Extra fields for the `lastSeenAt` bump on an existing row:
|
|
157
|
+
* descriptive attributes merge last-writer-wins per key, labels merge
|
|
158
|
+
* as a set union. Both are written ONLY when the merge actually changes
|
|
159
|
+
* the stored value, so a stable resource keeps its bump a one-column
|
|
160
|
+
* update (no jsonb churn).
|
|
161
|
+
*/
|
|
162
|
+
private static buildDescriptiveUpdate(
|
|
163
|
+
entity: ExtractedEntity,
|
|
164
|
+
existing: Model,
|
|
165
|
+
): QueryDeepPartialEntity<Model> {
|
|
166
|
+
/*
|
|
167
|
+
* Built as a plain shape and cast once on return: assigning into
|
|
168
|
+
* QueryDeepPartialEntity<Model> directly forces TS to instantiate the
|
|
169
|
+
* recursive JSONObject mapping (TS2589).
|
|
170
|
+
*/
|
|
171
|
+
const update: {
|
|
172
|
+
descriptiveAttributes?: JSONObject;
|
|
173
|
+
labels?: Array<string>;
|
|
174
|
+
} = {};
|
|
175
|
+
|
|
176
|
+
const incoming: Record<string, string> = entity.descriptiveAttributes || {};
|
|
177
|
+
if (Object.keys(incoming).length > 0) {
|
|
178
|
+
const current: Record<string, unknown> =
|
|
179
|
+
(existing.descriptiveAttributes as Record<string, unknown>) || {};
|
|
180
|
+
|
|
181
|
+
const differs: boolean = Object.keys(incoming).some((key: string) => {
|
|
182
|
+
return current[key] !== incoming[key];
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
if (differs) {
|
|
186
|
+
update.descriptiveAttributes = {
|
|
187
|
+
...current,
|
|
188
|
+
...incoming,
|
|
189
|
+
} as JSONObject;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const incomingLabels: Array<string> = entity.labels || [];
|
|
194
|
+
if (incomingLabels.length > 0) {
|
|
195
|
+
const currentLabels: Array<string> = existing.labels || [];
|
|
196
|
+
const currentSet: Set<string> = new Set<string>(currentLabels);
|
|
197
|
+
|
|
198
|
+
const hasNew: boolean = incomingLabels.some((label: string) => {
|
|
199
|
+
return !currentSet.has(label);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
if (hasNew) {
|
|
203
|
+
update.labels = TelemetryEntityService.normalizeLabels([
|
|
204
|
+
...currentLabels,
|
|
205
|
+
...incomingLabels,
|
|
206
|
+
]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return update as unknown as QueryDeepPartialEntity<Model>;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** Sorted + deduped for a stable stored value. */
|
|
214
|
+
private static normalizeLabels(labels: Array<string>): Array<string> {
|
|
215
|
+
return Array.from(new Set<string>(labels)).sort();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Best-effort human-readable name for the entity explorer: prefer the
|
|
220
|
+
* most specific `*.name` identifying attribute (e.g. k8s.pod.name over
|
|
221
|
+
* k8s.cluster.name), else the last identifying value, else the key.
|
|
222
|
+
*/
|
|
223
|
+
public static deriveDisplayName(entity: ExtractedEntity): string {
|
|
224
|
+
const id: Record<string, string> = entity.identifyingAttributes || {};
|
|
225
|
+
const nameKeys: Array<string> = Object.keys(id)
|
|
226
|
+
.filter((k: string) => {
|
|
227
|
+
return k.endsWith(".name");
|
|
228
|
+
})
|
|
229
|
+
.sort((a: string, b: string) => {
|
|
230
|
+
return b.length - a.length;
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
if (nameKeys.length > 0 && id[nameKeys[0]!]) {
|
|
234
|
+
return id[nameKeys[0]!]!;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const keys: Array<string> = Object.keys(id);
|
|
238
|
+
if (keys.length > 0 && id[keys[keys.length - 1]!]) {
|
|
239
|
+
return id[keys[keys.length - 1]!]!;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return entity.entityKey;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export default new TelemetryEntityService();
|