@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
|
@@ -8,6 +8,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
10
|
import { SQL, Statement } from "../Utils/AnalyticsDatabase/Statement";
|
|
11
|
+
import { getQuerySettings } from "../Utils/AnalyticsDatabase/QuerySettingsHelper";
|
|
11
12
|
import SpanService from "./SpanService";
|
|
12
13
|
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
|
|
13
14
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
@@ -89,11 +90,14 @@ export class TraceAggregationService {
|
|
|
89
90
|
selectColumns.push(...topLevelKeys);
|
|
90
91
|
}
|
|
91
92
|
if (resourceKeys.length > 0) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
/*
|
|
94
|
+
* Virtual facets read out of primaryEntityId disambiguated by
|
|
95
|
+
* primaryEntityType.
|
|
96
|
+
*/
|
|
97
|
+
if (!selectColumns.includes("primaryEntityId")) {
|
|
98
|
+
selectColumns.push("primaryEntityId");
|
|
95
99
|
}
|
|
96
|
-
selectColumns.push("
|
|
100
|
+
selectColumns.push("primaryEntityType");
|
|
97
101
|
}
|
|
98
102
|
if (attributeKeys.length > 0) {
|
|
99
103
|
selectColumns.push("attributes");
|
|
@@ -118,6 +122,7 @@ export class TraceAggregationService {
|
|
|
118
122
|
type: TableColumnType.Date,
|
|
119
123
|
value: request.endTime,
|
|
120
124
|
}}`);
|
|
125
|
+
statement.append(TraceAggregationService.RETENTION_FILTER);
|
|
121
126
|
TraceAggregationService.appendCommonFilters(statement, request);
|
|
122
127
|
statement.append(SQL ` ORDER BY startTime DESC LIMIT ${{
|
|
123
128
|
type: TableColumnType.Number,
|
|
@@ -128,7 +133,10 @@ export class TraceAggregationService {
|
|
|
128
133
|
* return in well under a second, but cap runtime below nginx's 60s
|
|
129
134
|
* proxy_read_timeout regardless.
|
|
130
135
|
*/
|
|
131
|
-
statement.append(
|
|
136
|
+
statement.append(getQuerySettings({
|
|
137
|
+
maxExecutionTimeInSeconds: 45,
|
|
138
|
+
timeoutOverflowMode: "break",
|
|
139
|
+
}));
|
|
132
140
|
const dbResult = await SpanService.executeQuery(statement);
|
|
133
141
|
const response = await dbResult.json();
|
|
134
142
|
const rows = response.data || [];
|
|
@@ -150,10 +158,11 @@ export class TraceAggregationService {
|
|
|
150
158
|
map.set(value, (map.get(value) || 0) + 1);
|
|
151
159
|
}
|
|
152
160
|
if (resourceKeys.length > 0) {
|
|
153
|
-
const rowServiceType = row["
|
|
161
|
+
const rowServiceType = row["primaryEntityType"] === undefined ||
|
|
162
|
+
row["primaryEntityType"] === null
|
|
154
163
|
? ""
|
|
155
|
-
: String(row["
|
|
156
|
-
const rowServiceId = row["
|
|
164
|
+
: String(row["primaryEntityType"]);
|
|
165
|
+
const rowServiceId = row["primaryEntityId"];
|
|
157
166
|
if (rowServiceId !== undefined && rowServiceId !== null) {
|
|
158
167
|
const value = String(rowServiceId);
|
|
159
168
|
if (value.length > 0) {
|
|
@@ -218,31 +227,34 @@ export class TraceAggregationService {
|
|
|
218
227
|
* exact regardless of skew.
|
|
219
228
|
*
|
|
220
229
|
* It is cheap because it rides the proj_hist_by_minute aggregate projection
|
|
221
|
-
* (projectId, minute,
|
|
222
|
-
* window reads a few thousand pre-aggregated minute rows in
|
|
223
|
-
* instead of scanning tens of millions of raw spans. Two
|
|
224
|
-
* for ClickHouse to actually pick that projection, both
|
|
230
|
+
* (projectId, minute, primaryEntityId, statusCode, isRootSpan -> count): a
|
|
231
|
+
* 1-month window reads a few thousand pre-aggregated minute rows in
|
|
232
|
+
* single-digit ms instead of scanning tens of millions of raw spans. Two
|
|
233
|
+
* things are required for ClickHouse to actually pick that projection, both
|
|
234
|
+
* load-bearing:
|
|
225
235
|
* 1. The time predicate must be on toStartOfMinute(startTime) — the
|
|
226
236
|
* projection's key expression — NOT raw startTime. A raw startTime
|
|
227
237
|
* filter references a column the aggregate projection does not store, so
|
|
228
238
|
* ClickHouse rejects the projection and full-scans. (Window edges land
|
|
229
239
|
* on minute boundaries, consistent with the minute-bucketed histogram.)
|
|
230
240
|
* 2. Every other predicate must be on a projection column. isRootSpan,
|
|
231
|
-
*
|
|
232
|
-
* drill-down-by-service stay on the projection. A non-projection
|
|
233
|
-
* (kind / name / traceId / attributes)
|
|
234
|
-
* base-table scan — still correct, still
|
|
241
|
+
* primaryEntityId and statusCode all are, so the default sidebar load
|
|
242
|
+
* and drill-down-by-service stay on the projection. A non-projection
|
|
243
|
+
* filter (kind / name / traceId / entityKeys / attributes)
|
|
244
|
+
* transparently falls back to a base-table scan — still correct, still
|
|
245
|
+
* bounded by max_execution_time.
|
|
235
246
|
*
|
|
236
|
-
*
|
|
237
|
-
* IDs are globally unique, so a single
|
|
238
|
-
* serves the service / host / docker host / k8s cluster
|
|
239
|
-
* against each Postgres source-of-truth list (a host id
|
|
240
|
-
* a service id, so an unrelated entry is simply never
|
|
241
|
-
* the
|
|
247
|
+
* primaryEntityId is intentionally NOT disambiguated by primaryEntityType
|
|
248
|
+
* here. Resource IDs are globally unique, so a single primaryEntityId ->
|
|
249
|
+
* count map correctly serves the service / host / docker host / k8s cluster
|
|
250
|
+
* facets once merged against each Postgres source-of-truth list (a host id
|
|
251
|
+
* never collides with a service id, so an unrelated entry is simply never
|
|
252
|
+
* looked up). Omitting the primaryEntityType predicate keeps the query
|
|
253
|
+
* projection-eligible.
|
|
242
254
|
*/
|
|
243
255
|
static async getResourceFacetCounts(request) {
|
|
244
256
|
const statement = new Statement();
|
|
245
|
-
statement.append(`SELECT
|
|
257
|
+
statement.append(`SELECT primaryEntityId, statusCode, count() AS cnt FROM ${TraceAggregationService.TABLE_NAME}`);
|
|
246
258
|
statement.append(SQL ` WHERE projectId = ${{
|
|
247
259
|
type: TableColumnType.ObjectID,
|
|
248
260
|
value: request.projectId,
|
|
@@ -254,13 +266,17 @@ export class TraceAggregationService {
|
|
|
254
266
|
value: request.endTime,
|
|
255
267
|
}})`);
|
|
256
268
|
TraceAggregationService.appendCommonFilters(statement, request);
|
|
257
|
-
statement.append(" GROUP BY
|
|
269
|
+
statement.append(" GROUP BY primaryEntityId, statusCode");
|
|
258
270
|
/*
|
|
259
271
|
* Cap runtime below nginx's 60s proxy_read_timeout and explicitly allow
|
|
260
272
|
* projection use so proj_hist_by_minute is read when eligible (see the
|
|
261
273
|
* toStartOfMinute note above).
|
|
262
274
|
*/
|
|
263
|
-
statement.append(
|
|
275
|
+
statement.append(getQuerySettings({
|
|
276
|
+
maxExecutionTimeInSeconds: 45,
|
|
277
|
+
timeoutOverflowMode: "break",
|
|
278
|
+
additionalSettings: { optimize_use_projections: 1 },
|
|
279
|
+
}));
|
|
264
280
|
const serviceCounts = new Map();
|
|
265
281
|
const statusCounts = new Map();
|
|
266
282
|
const dbResult = await SpanService.executeQuery(statement);
|
|
@@ -280,7 +296,7 @@ export class TraceAggregationService {
|
|
|
280
296
|
}
|
|
281
297
|
for (const row of rows) {
|
|
282
298
|
const cnt = Number(row["cnt"] || 0);
|
|
283
|
-
const rawServiceId = row["
|
|
299
|
+
const rawServiceId = row["primaryEntityId"];
|
|
284
300
|
if (rawServiceId !== undefined && rawServiceId !== null) {
|
|
285
301
|
const serviceId = String(rawServiceId);
|
|
286
302
|
if (serviceId.length > 0) {
|
|
@@ -323,9 +339,13 @@ export class TraceAggregationService {
|
|
|
323
339
|
* minute-bucketed output and only shifts the first/last bucket by the
|
|
324
340
|
* partial boundary minute when the range is not minute-aligned.
|
|
325
341
|
*
|
|
326
|
-
* If any non-projection filter (kind, name, traceId,
|
|
327
|
-
*
|
|
328
|
-
*
|
|
342
|
+
* If any non-projection filter (kind, name, traceId, spanId,
|
|
343
|
+
* nameSearchText, spanNameSearches, statusMessageSearchText,
|
|
344
|
+
* hasException, duration bounds, entityKeys, attributes) is active,
|
|
345
|
+
* ClickHouse transparently falls back to scanning the main table for the
|
|
346
|
+
* inner query — same cost as before.
|
|
347
|
+
* The retention read-filter is omitted for the same reason (see
|
|
348
|
+
* RETENTION_FILTER).
|
|
329
349
|
*/
|
|
330
350
|
const statement = SQL `
|
|
331
351
|
SELECT
|
|
@@ -362,11 +382,19 @@ export class TraceAggregationService {
|
|
|
362
382
|
* with 'break' mode rather than throwing, which is acceptable for
|
|
363
383
|
* a density visualization. Explicitly enable projection use.
|
|
364
384
|
*/
|
|
365
|
-
statement.append(
|
|
385
|
+
statement.append(getQuerySettings({
|
|
386
|
+
maxExecutionTimeInSeconds: 45,
|
|
387
|
+
timeoutOverflowMode: "break",
|
|
388
|
+
additionalSettings: { optimize_use_projections: 1 },
|
|
389
|
+
}));
|
|
366
390
|
return statement;
|
|
367
391
|
}
|
|
368
392
|
static buildFacetStatement(request) {
|
|
369
393
|
var _a;
|
|
394
|
+
// Pre-rename alias from stale clients; the V3 column is primaryEntityId.
|
|
395
|
+
if (request.facetKey === "serviceId") {
|
|
396
|
+
request.facetKey = "primaryEntityId";
|
|
397
|
+
}
|
|
370
398
|
const limit = (_a = request.limit) !== null && _a !== void 0 ? _a : TraceAggregationService.DEFAULT_FACET_LIMIT;
|
|
371
399
|
TraceAggregationService.validateFacetKey(request.facetKey);
|
|
372
400
|
const resourceServiceType = TraceAggregationService.RESOURCE_FACET_KEYS.get(request.facetKey);
|
|
@@ -375,16 +403,16 @@ export class TraceAggregationService {
|
|
|
375
403
|
TraceAggregationService.isTopLevelColumn(request.facetKey);
|
|
376
404
|
const statement = new Statement();
|
|
377
405
|
if (isResourceFacet) {
|
|
378
|
-
statement.append(SQL `SELECT toString(
|
|
406
|
+
statement.append(SQL `SELECT toString(primaryEntityId) AS val, count() AS cnt FROM ${TraceAggregationService.TABLE_NAME}`);
|
|
379
407
|
}
|
|
380
408
|
else if (isTopLevelColumn) {
|
|
381
409
|
statement.append(SQL `SELECT toString(${request.facetKey}) AS val, count() AS cnt FROM ${TraceAggregationService.TABLE_NAME}`);
|
|
382
410
|
}
|
|
383
411
|
else {
|
|
384
|
-
statement.append(SQL `SELECT
|
|
412
|
+
statement.append(SQL `SELECT attributes[${{
|
|
385
413
|
type: TableColumnType.Text,
|
|
386
414
|
value: request.facetKey,
|
|
387
|
-
}}
|
|
415
|
+
}}] AS val, count() AS cnt FROM ${TraceAggregationService.TABLE_NAME}`);
|
|
388
416
|
}
|
|
389
417
|
statement.append(SQL ` WHERE projectId = ${{
|
|
390
418
|
type: TableColumnType.ObjectID,
|
|
@@ -397,23 +425,24 @@ export class TraceAggregationService {
|
|
|
397
425
|
value: request.endTime,
|
|
398
426
|
}}`);
|
|
399
427
|
if (isResourceFacet) {
|
|
400
|
-
statement.append(SQL ` AND
|
|
428
|
+
statement.append(SQL ` AND primaryEntityType = ${{
|
|
401
429
|
type: TableColumnType.Text,
|
|
402
430
|
value: resourceServiceType,
|
|
403
431
|
}}`);
|
|
404
432
|
}
|
|
405
|
-
else if (request.facetKey === "
|
|
406
|
-
statement.append(SQL ` AND (
|
|
433
|
+
else if (request.facetKey === "primaryEntityId") {
|
|
434
|
+
statement.append(SQL ` AND (primaryEntityType = '' OR primaryEntityType = ${{
|
|
407
435
|
type: TableColumnType.Text,
|
|
408
436
|
value: ServiceType.OpenTelemetry,
|
|
409
437
|
}})`);
|
|
410
438
|
}
|
|
411
439
|
else if (!isTopLevelColumn) {
|
|
412
|
-
statement.append(SQL ` AND
|
|
440
|
+
statement.append(SQL ` AND mapContains(attributes, ${{
|
|
413
441
|
type: TableColumnType.Text,
|
|
414
442
|
value: request.facetKey,
|
|
415
|
-
}})
|
|
443
|
+
}})`);
|
|
416
444
|
}
|
|
445
|
+
statement.append(TraceAggregationService.RETENTION_FILTER);
|
|
417
446
|
TraceAggregationService.appendCommonFilters(statement, request);
|
|
418
447
|
statement.append(SQL ` GROUP BY val ORDER BY cnt DESC LIMIT ${{
|
|
419
448
|
type: TableColumnType.Number,
|
|
@@ -423,7 +452,10 @@ export class TraceAggregationService {
|
|
|
423
452
|
* Defense in depth: cap individual facet query runtime below nginx's
|
|
424
453
|
* 60s proxy_read_timeout so a slow facet never starves the endpoint.
|
|
425
454
|
*/
|
|
426
|
-
statement.append(
|
|
455
|
+
statement.append(getQuerySettings({
|
|
456
|
+
maxExecutionTimeInSeconds: 45,
|
|
457
|
+
timeoutOverflowMode: "break",
|
|
458
|
+
}));
|
|
427
459
|
return statement;
|
|
428
460
|
}
|
|
429
461
|
static appendCommonFilters(statement, request) {
|
|
@@ -431,13 +463,19 @@ export class TraceAggregationService {
|
|
|
431
463
|
statement.append(" AND isRootSpan = 1");
|
|
432
464
|
}
|
|
433
465
|
if (request.serviceIds && request.serviceIds.length > 0) {
|
|
434
|
-
statement.append(SQL ` AND
|
|
466
|
+
statement.append(SQL ` AND primaryEntityId IN (${{
|
|
435
467
|
type: TableColumnType.ObjectID,
|
|
436
468
|
value: new Includes(request.serviceIds.map((id) => {
|
|
437
469
|
return id.toString();
|
|
438
470
|
})),
|
|
439
471
|
}})`);
|
|
440
472
|
}
|
|
473
|
+
if (request.entityKeys && request.entityKeys.length > 0) {
|
|
474
|
+
statement.append(SQL ` AND hasAny(entityKeys, ${{
|
|
475
|
+
type: TableColumnType.ArrayText,
|
|
476
|
+
value: request.entityKeys,
|
|
477
|
+
}})`);
|
|
478
|
+
}
|
|
441
479
|
if (request.statusCodes && request.statusCodes.length > 0) {
|
|
442
480
|
statement.append(SQL ` AND statusCode IN (${{
|
|
443
481
|
type: TableColumnType.Number,
|
|
@@ -458,6 +496,28 @@ export class TraceAggregationService {
|
|
|
458
496
|
value: new Includes(request.spanNames),
|
|
459
497
|
}})`);
|
|
460
498
|
}
|
|
499
|
+
/*
|
|
500
|
+
* Values are kept verbatim (no trim) — the list-side Search serialization
|
|
501
|
+
* wraps the raw value in %...%, and quoted search values deliberately
|
|
502
|
+
* preserve whitespace. Only blank entries are skipped.
|
|
503
|
+
*/
|
|
504
|
+
if (request.spanNameSearches && request.spanNameSearches.length > 0) {
|
|
505
|
+
for (const search of request.spanNameSearches) {
|
|
506
|
+
if (search.trim().length === 0) {
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
statement.append(SQL ` AND name ILIKE ${{
|
|
510
|
+
type: TableColumnType.Text,
|
|
511
|
+
value: `%${search}%`,
|
|
512
|
+
}}`);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
if (request.spanIds && request.spanIds.length > 0) {
|
|
516
|
+
statement.append(SQL ` AND spanId IN (${{
|
|
517
|
+
type: TableColumnType.Text,
|
|
518
|
+
value: new Includes(request.spanIds),
|
|
519
|
+
}})`);
|
|
520
|
+
}
|
|
461
521
|
if (request.traceIds && request.traceIds.length > 0) {
|
|
462
522
|
statement.append(SQL ` AND traceId IN (${{
|
|
463
523
|
type: TableColumnType.Text,
|
|
@@ -470,6 +530,49 @@ export class TraceAggregationService {
|
|
|
470
530
|
value: `%${request.nameSearchText.trim()}%`,
|
|
471
531
|
}}`);
|
|
472
532
|
}
|
|
533
|
+
if (request.statusMessageSearchText &&
|
|
534
|
+
request.statusMessageSearchText.trim().length > 0) {
|
|
535
|
+
statement.append(SQL ` AND statusMessage ILIKE ${{
|
|
536
|
+
type: TableColumnType.Text,
|
|
537
|
+
value: `%${request.statusMessageSearchText}%`,
|
|
538
|
+
}}`);
|
|
539
|
+
}
|
|
540
|
+
if (request.statusMessages && request.statusMessages.length > 0) {
|
|
541
|
+
statement.append(SQL ` AND statusMessage IN (${{
|
|
542
|
+
type: TableColumnType.Text,
|
|
543
|
+
value: new Includes(request.statusMessages),
|
|
544
|
+
}})`);
|
|
545
|
+
}
|
|
546
|
+
if (request.hasException !== undefined) {
|
|
547
|
+
statement.append(request.hasException
|
|
548
|
+
? " AND hasException = 1"
|
|
549
|
+
: " AND hasException = 0");
|
|
550
|
+
}
|
|
551
|
+
/*
|
|
552
|
+
* durationUnixNano is LongNumber (Int128) — a Number (Int32) param would
|
|
553
|
+
* overflow for spans longer than ~2.1 seconds.
|
|
554
|
+
*/
|
|
555
|
+
if (request.minDurationNano !== undefined &&
|
|
556
|
+
!isNaN(request.minDurationNano)) {
|
|
557
|
+
statement.append(SQL ` AND durationUnixNano > ${{
|
|
558
|
+
type: TableColumnType.LongNumber,
|
|
559
|
+
value: request.minDurationNano,
|
|
560
|
+
}}`);
|
|
561
|
+
}
|
|
562
|
+
if (request.maxDurationNano !== undefined &&
|
|
563
|
+
!isNaN(request.maxDurationNano)) {
|
|
564
|
+
statement.append(SQL ` AND durationUnixNano < ${{
|
|
565
|
+
type: TableColumnType.LongNumber,
|
|
566
|
+
value: request.maxDurationNano,
|
|
567
|
+
}}`);
|
|
568
|
+
}
|
|
569
|
+
if (request.exactDurationNano !== undefined &&
|
|
570
|
+
!isNaN(request.exactDurationNano)) {
|
|
571
|
+
statement.append(SQL ` AND durationUnixNano = ${{
|
|
572
|
+
type: TableColumnType.LongNumber,
|
|
573
|
+
value: request.exactDurationNano,
|
|
574
|
+
}}`);
|
|
575
|
+
}
|
|
473
576
|
if (request.attributes && Object.keys(request.attributes).length > 0) {
|
|
474
577
|
for (const [attrKey, attrValue] of Object.entries(request.attributes)) {
|
|
475
578
|
TraceAggregationService.validateFacetKey(attrKey);
|
|
@@ -487,6 +590,382 @@ export class TraceAggregationService {
|
|
|
487
590
|
}}, mapKeys(attributes), mapValues(attributes))`);
|
|
488
591
|
}
|
|
489
592
|
}
|
|
593
|
+
if (request.attributeSearches &&
|
|
594
|
+
Object.keys(request.attributeSearches).length > 0) {
|
|
595
|
+
for (const [attrKey, attrValue] of Object.entries(request.attributeSearches)) {
|
|
596
|
+
TraceAggregationService.validateFacetKey(attrKey);
|
|
597
|
+
if (attrValue.trim().length === 0) {
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
// Same key matching as `attributes`, contains-match on the value.
|
|
601
|
+
statement.append(SQL ` AND arrayExists((k, v) -> lowerUTF8(k) = lowerUTF8(${{
|
|
602
|
+
type: TableColumnType.Text,
|
|
603
|
+
value: attrKey,
|
|
604
|
+
}}) AND v ILIKE ${{
|
|
605
|
+
type: TableColumnType.Text,
|
|
606
|
+
value: `%${attrValue}%`,
|
|
607
|
+
}}, mapKeys(attributes), mapValues(attributes))`);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
static isValidAnalyticsMetric(metric) {
|
|
612
|
+
return Object.prototype.hasOwnProperty.call(TraceAggregationService.METRIC_EXPRESSIONS, metric);
|
|
613
|
+
}
|
|
614
|
+
/*
|
|
615
|
+
* Multidimensional span analytics — the interactive "split by dimension"
|
|
616
|
+
* path (count / duration percentiles grouped by a span column or
|
|
617
|
+
* attribute). Mirrors the logs analytics architecture
|
|
618
|
+
* (LogAggregationService.getAnalyticsTimeseries and friends) and shares
|
|
619
|
+
* appendCommonFilters with the histogram/facets, so every explorer filter
|
|
620
|
+
* applies identically.
|
|
621
|
+
*/
|
|
622
|
+
static async getAnalyticsTimeseries(request) {
|
|
623
|
+
const groupByKeys = request.groupBy || [];
|
|
624
|
+
/*
|
|
625
|
+
* Cap the series count: a high-cardinality dimension (e.g. url.host
|
|
626
|
+
* across hundreds of tenants) would otherwise return one series per
|
|
627
|
+
* value. Pre-resolve the top values of the first dimension — ranked by
|
|
628
|
+
* the SELECTED metric (so duration metrics chart the slowest dimension
|
|
629
|
+
* values, counts chart the busiest) — and constrain the timeseries to
|
|
630
|
+
* them. The full groupBy is passed so the ranking applies the same
|
|
631
|
+
* dimension-implied predicates (e.g. mapContains on the second
|
|
632
|
+
* dimension) as the final query.
|
|
633
|
+
*/
|
|
634
|
+
let topValues = undefined;
|
|
635
|
+
if (groupByKeys.length > 0) {
|
|
636
|
+
const topItems = await TraceAggregationService.getAnalyticsTopList(request);
|
|
637
|
+
topValues = topItems.map((item) => {
|
|
638
|
+
return item.value;
|
|
639
|
+
});
|
|
640
|
+
/*
|
|
641
|
+
* No non-empty values → skip the cap rather than returning nothing:
|
|
642
|
+
* spans whose dimension value is an empty string still chart (as one
|
|
643
|
+
* "(empty)" series), consistent with the table view.
|
|
644
|
+
*/
|
|
645
|
+
if (topValues.length === 0) {
|
|
646
|
+
topValues = undefined;
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
const statement = TraceAggregationService.buildAnalyticsTimeseriesStatement(request, topValues);
|
|
650
|
+
const dbResult = await SpanService.executeQuery(statement);
|
|
651
|
+
let rows = [];
|
|
652
|
+
try {
|
|
653
|
+
const response = await dbResult.json();
|
|
654
|
+
rows = response.data || [];
|
|
655
|
+
}
|
|
656
|
+
catch (_a) {
|
|
657
|
+
logger.warn("Trace analytics timeseries query returned unparseable response, returning empty result");
|
|
658
|
+
}
|
|
659
|
+
return rows.map((row) => {
|
|
660
|
+
var _a;
|
|
661
|
+
const groupValues = {};
|
|
662
|
+
for (const [index, key] of groupByKeys.entries()) {
|
|
663
|
+
const alias = TraceAggregationService.groupByAlias(key, index);
|
|
664
|
+
groupValues[key] = String((_a = row[alias]) !== null && _a !== void 0 ? _a : "");
|
|
665
|
+
}
|
|
666
|
+
return {
|
|
667
|
+
time: String(row["bucket"] || ""),
|
|
668
|
+
value: Number(row["val"] || 0),
|
|
669
|
+
groupValues,
|
|
670
|
+
};
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
static async getAnalyticsTopList(request) {
|
|
674
|
+
if (!request.groupBy || request.groupBy.length === 0) {
|
|
675
|
+
throw new BadDataException("groupBy with at least one dimension is required for top list");
|
|
676
|
+
}
|
|
677
|
+
const statement = TraceAggregationService.buildAnalyticsTopListStatement(request);
|
|
678
|
+
const dbResult = await SpanService.executeQuery(statement);
|
|
679
|
+
let rows = [];
|
|
680
|
+
try {
|
|
681
|
+
const response = await dbResult.json();
|
|
682
|
+
rows = response.data || [];
|
|
683
|
+
}
|
|
684
|
+
catch (_a) {
|
|
685
|
+
logger.warn("Trace analytics top list query returned unparseable response, returning empty result");
|
|
686
|
+
}
|
|
687
|
+
return rows
|
|
688
|
+
.map((row) => {
|
|
689
|
+
var _a;
|
|
690
|
+
return {
|
|
691
|
+
value: String((_a = row["dim"]) !== null && _a !== void 0 ? _a : ""),
|
|
692
|
+
metricValue: Number(row["val"] || 0),
|
|
693
|
+
count: Number(row["cnt"] || 0),
|
|
694
|
+
};
|
|
695
|
+
})
|
|
696
|
+
.filter((item) => {
|
|
697
|
+
return item.value.length > 0;
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
static async getAnalyticsTable(request) {
|
|
701
|
+
if (!request.groupBy || request.groupBy.length === 0) {
|
|
702
|
+
throw new BadDataException("groupBy with at least one dimension is required for table");
|
|
703
|
+
}
|
|
704
|
+
const statement = TraceAggregationService.buildAnalyticsTableStatement(request);
|
|
705
|
+
const dbResult = await SpanService.executeQuery(statement);
|
|
706
|
+
let rows = [];
|
|
707
|
+
try {
|
|
708
|
+
const response = await dbResult.json();
|
|
709
|
+
rows = response.data || [];
|
|
710
|
+
}
|
|
711
|
+
catch (_a) {
|
|
712
|
+
logger.warn("Trace analytics table query returned unparseable response, returning empty result");
|
|
713
|
+
}
|
|
714
|
+
const groupByKeys = request.groupBy;
|
|
715
|
+
return rows.map((row) => {
|
|
716
|
+
var _a;
|
|
717
|
+
const groupValues = {};
|
|
718
|
+
for (const [index, key] of groupByKeys.entries()) {
|
|
719
|
+
const alias = TraceAggregationService.groupByAlias(key, index);
|
|
720
|
+
groupValues[key] = String((_a = row[alias]) !== null && _a !== void 0 ? _a : "");
|
|
721
|
+
}
|
|
722
|
+
return {
|
|
723
|
+
groupValues,
|
|
724
|
+
count: Number(row["cnt"] || 0),
|
|
725
|
+
avgDurationMs: Number(row["avg_ms"] || 0),
|
|
726
|
+
p50DurationMs: Number(row["p50_ms"] || 0),
|
|
727
|
+
minDurationMs: Number(row["min_ms"] || 0),
|
|
728
|
+
maxDurationMs: Number(row["max_ms"] || 0),
|
|
729
|
+
};
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
static groupByAlias(key, index) {
|
|
733
|
+
if (TraceAggregationService.isTopLevelColumn(key) ||
|
|
734
|
+
TraceAggregationService.RESOURCE_FACET_KEYS.has(key)) {
|
|
735
|
+
return key;
|
|
736
|
+
}
|
|
737
|
+
/*
|
|
738
|
+
* Attribute keys get a sanitized alias. The dimension index is included
|
|
739
|
+
* so two distinct keys that sanitize identically (url.host vs url:host)
|
|
740
|
+
* never collide into one alias (ClickHouse rejects duplicate aliases).
|
|
741
|
+
*/
|
|
742
|
+
return `attr_${index}_${key.replace(/[^a-zA-Z0-9_]/g, "_")}`;
|
|
743
|
+
}
|
|
744
|
+
/*
|
|
745
|
+
* Append the SELECT expression for one group-by dimension. Resource facet
|
|
746
|
+
* keys (hostId / dockerHostId / ...) read out of primaryEntityId — the
|
|
747
|
+
* matching primaryEntityType predicate is added by
|
|
748
|
+
* appendGroupByDimensionFilters.
|
|
749
|
+
*/
|
|
750
|
+
static appendGroupBySelect(statement, groupByKeys) {
|
|
751
|
+
for (const [index, key] of groupByKeys.entries()) {
|
|
752
|
+
TraceAggregationService.validateFacetKey(key);
|
|
753
|
+
if (TraceAggregationService.RESOURCE_FACET_KEYS.has(key)) {
|
|
754
|
+
statement.append(`, toString(primaryEntityId) AS ${key}`);
|
|
755
|
+
}
|
|
756
|
+
else if (TraceAggregationService.isTopLevelColumn(key)) {
|
|
757
|
+
statement.append(`, toString(${key}) AS ${key}`);
|
|
758
|
+
}
|
|
759
|
+
else {
|
|
760
|
+
const alias = TraceAggregationService.groupByAlias(key, index);
|
|
761
|
+
statement.append(SQL `, attributes[${{
|
|
762
|
+
type: TableColumnType.Text,
|
|
763
|
+
value: key,
|
|
764
|
+
}}] AS ${alias}`);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
static appendGroupByClause(statement, groupByKeys) {
|
|
769
|
+
for (const [index, key] of groupByKeys.entries()) {
|
|
770
|
+
statement.append(`, ${TraceAggregationService.groupByAlias(key, index)}`);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
/*
|
|
774
|
+
* Dimension-implied WHERE predicates: attribute dimensions only count
|
|
775
|
+
* spans that carry the attribute (matching buildFacetStatement); resource
|
|
776
|
+
* dimensions constrain primaryEntityType to the matching resource type.
|
|
777
|
+
*/
|
|
778
|
+
static appendGroupByDimensionFilters(statement, groupByKeys) {
|
|
779
|
+
for (const key of groupByKeys) {
|
|
780
|
+
const resourceType = TraceAggregationService.RESOURCE_FACET_KEYS.get(key);
|
|
781
|
+
if (resourceType !== undefined) {
|
|
782
|
+
statement.append(SQL ` AND primaryEntityType = ${{
|
|
783
|
+
type: TableColumnType.Text,
|
|
784
|
+
value: resourceType,
|
|
785
|
+
}}`);
|
|
786
|
+
continue;
|
|
787
|
+
}
|
|
788
|
+
if (key === "primaryEntityId") {
|
|
789
|
+
/*
|
|
790
|
+
* Same restriction as the Service facet: keep host/docker/k8s
|
|
791
|
+
* entity ids out of the "Service" dimension (they reuse the
|
|
792
|
+
* primaryEntityId slot, disambiguated by primaryEntityType).
|
|
793
|
+
*/
|
|
794
|
+
statement.append(SQL ` AND (primaryEntityType = '' OR primaryEntityType = ${{
|
|
795
|
+
type: TableColumnType.Text,
|
|
796
|
+
value: ServiceType.OpenTelemetry,
|
|
797
|
+
}})`);
|
|
798
|
+
continue;
|
|
799
|
+
}
|
|
800
|
+
if (TraceAggregationService.isTopLevelColumn(key)) {
|
|
801
|
+
continue;
|
|
802
|
+
}
|
|
803
|
+
statement.append(SQL ` AND mapContains(attributes, ${{
|
|
804
|
+
type: TableColumnType.Text,
|
|
805
|
+
value: key,
|
|
806
|
+
}})`);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
static validateGroupBy(groupBy) {
|
|
810
|
+
if (!groupBy) {
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
if (groupBy.length > TraceAggregationService.MAX_GROUP_BY_DIMENSIONS) {
|
|
814
|
+
throw new BadDataException(`groupBy supports at most ${TraceAggregationService.MAX_GROUP_BY_DIMENSIONS} dimensions`);
|
|
815
|
+
}
|
|
816
|
+
for (const key of groupBy) {
|
|
817
|
+
TraceAggregationService.validateFacetKey(key);
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
static getMetricExpression(metric) {
|
|
821
|
+
const expression = TraceAggregationService.METRIC_EXPRESSIONS[metric];
|
|
822
|
+
if (!expression) {
|
|
823
|
+
throw new BadDataException("Invalid analytics metric");
|
|
824
|
+
}
|
|
825
|
+
return expression;
|
|
826
|
+
}
|
|
827
|
+
static appendAnalyticsTimeWindow(statement, request) {
|
|
828
|
+
statement.append(SQL ` WHERE projectId = ${{
|
|
829
|
+
type: TableColumnType.ObjectID,
|
|
830
|
+
value: request.projectId,
|
|
831
|
+
}} AND startTime >= ${{
|
|
832
|
+
type: TableColumnType.Date,
|
|
833
|
+
value: request.startTime,
|
|
834
|
+
}} AND startTime <= ${{
|
|
835
|
+
type: TableColumnType.Date,
|
|
836
|
+
value: request.endTime,
|
|
837
|
+
}}`);
|
|
838
|
+
}
|
|
839
|
+
static buildAnalyticsTimeseriesStatement(request, topDimensionValues) {
|
|
840
|
+
TraceAggregationService.validateGroupBy(request.groupBy);
|
|
841
|
+
const groupByKeys = request.groupBy || [];
|
|
842
|
+
const intervalSeconds = request.bucketSizeInMinutes * 60;
|
|
843
|
+
const metricExpr = TraceAggregationService.getMetricExpression(request.metric);
|
|
844
|
+
const statement = SQL `SELECT toStartOfInterval(startTime, INTERVAL ${{
|
|
845
|
+
type: TableColumnType.Number,
|
|
846
|
+
value: intervalSeconds,
|
|
847
|
+
}} SECOND) AS bucket`;
|
|
848
|
+
statement.append(`, ${metricExpr} AS val`);
|
|
849
|
+
TraceAggregationService.appendGroupBySelect(statement, groupByKeys);
|
|
850
|
+
statement.append(` FROM ${TraceAggregationService.TABLE_NAME}`);
|
|
851
|
+
TraceAggregationService.appendAnalyticsTimeWindow(statement, request);
|
|
852
|
+
statement.append(TraceAggregationService.RETENTION_FILTER);
|
|
853
|
+
TraceAggregationService.appendGroupByDimensionFilters(statement, groupByKeys);
|
|
854
|
+
/*
|
|
855
|
+
* Series cap: constrain the first dimension to the pre-resolved top
|
|
856
|
+
* values (see getAnalyticsTimeseries).
|
|
857
|
+
*/
|
|
858
|
+
if (topDimensionValues &&
|
|
859
|
+
topDimensionValues.length > 0 &&
|
|
860
|
+
groupByKeys.length > 0) {
|
|
861
|
+
TraceAggregationService.appendDimensionExpression(statement, groupByKeys[0], " AND ");
|
|
862
|
+
statement.append(SQL ` IN (${{
|
|
863
|
+
type: TableColumnType.Text,
|
|
864
|
+
value: new Includes(topDimensionValues),
|
|
865
|
+
}})`);
|
|
866
|
+
}
|
|
867
|
+
TraceAggregationService.appendCommonFilters(statement, request);
|
|
868
|
+
statement.append(" GROUP BY bucket");
|
|
869
|
+
TraceAggregationService.appendGroupByClause(statement, groupByKeys);
|
|
870
|
+
statement.append(" ORDER BY bucket ASC");
|
|
871
|
+
statement.append(getQuerySettings({
|
|
872
|
+
maxExecutionTimeInSeconds: 45,
|
|
873
|
+
timeoutOverflowMode: "break",
|
|
874
|
+
}));
|
|
875
|
+
return statement;
|
|
876
|
+
}
|
|
877
|
+
/*
|
|
878
|
+
* Append the bare dimension expression (no alias) prefixed by `prefix` —
|
|
879
|
+
* used in WHERE clauses where SELECT aliases are not yet visible.
|
|
880
|
+
*/
|
|
881
|
+
static appendDimensionExpression(statement, key, prefix) {
|
|
882
|
+
TraceAggregationService.validateFacetKey(key);
|
|
883
|
+
if (TraceAggregationService.RESOURCE_FACET_KEYS.has(key) ||
|
|
884
|
+
key === "primaryEntityId") {
|
|
885
|
+
statement.append(`${prefix}toString(primaryEntityId)`);
|
|
886
|
+
return;
|
|
887
|
+
}
|
|
888
|
+
if (TraceAggregationService.isTopLevelColumn(key)) {
|
|
889
|
+
statement.append(`${prefix}toString(${key})`);
|
|
890
|
+
return;
|
|
891
|
+
}
|
|
892
|
+
statement.append(`${prefix}attributes[`);
|
|
893
|
+
statement.append(SQL `${{
|
|
894
|
+
type: TableColumnType.Text,
|
|
895
|
+
value: key,
|
|
896
|
+
}}`);
|
|
897
|
+
statement.append("]");
|
|
898
|
+
}
|
|
899
|
+
static buildAnalyticsTopListStatement(request) {
|
|
900
|
+
var _a;
|
|
901
|
+
const groupByKey = request.groupBy[0];
|
|
902
|
+
TraceAggregationService.validateFacetKey(groupByKey);
|
|
903
|
+
const limit = (_a = request.limit) !== null && _a !== void 0 ? _a : TraceAggregationService.DEFAULT_ANALYTICS_LIMIT;
|
|
904
|
+
const metricExpr = TraceAggregationService.getMetricExpression(request.metric);
|
|
905
|
+
const statement = new Statement();
|
|
906
|
+
statement.append("SELECT");
|
|
907
|
+
TraceAggregationService.appendDimensionExpression(statement, groupByKey, " ");
|
|
908
|
+
statement.append(` AS dim, ${metricExpr} AS val, count() AS cnt FROM ${TraceAggregationService.TABLE_NAME}`);
|
|
909
|
+
TraceAggregationService.appendAnalyticsTimeWindow(statement, request);
|
|
910
|
+
statement.append(TraceAggregationService.RETENTION_FILTER);
|
|
911
|
+
/*
|
|
912
|
+
* Dimension-implied predicates for EVERY groupBy key — when this query
|
|
913
|
+
* pre-resolves the series cap for a two-dimension timeseries, the
|
|
914
|
+
* ranking must count the same span set the final chart counts.
|
|
915
|
+
*/
|
|
916
|
+
TraceAggregationService.appendGroupByDimensionFilters(statement, request.groupBy);
|
|
917
|
+
TraceAggregationService.appendCommonFilters(statement, request);
|
|
918
|
+
/*
|
|
919
|
+
* Duration metrics rank by the metric itself (slowest first); count-like
|
|
920
|
+
* metrics rank by volume. Either way `cnt` is returned for context.
|
|
921
|
+
*/
|
|
922
|
+
statement.append(SQL ` GROUP BY dim ORDER BY val DESC LIMIT ${{
|
|
923
|
+
type: TableColumnType.Number,
|
|
924
|
+
value: limit,
|
|
925
|
+
}}`);
|
|
926
|
+
statement.append(getQuerySettings({
|
|
927
|
+
maxExecutionTimeInSeconds: 45,
|
|
928
|
+
timeoutOverflowMode: "break",
|
|
929
|
+
}));
|
|
930
|
+
return statement;
|
|
931
|
+
}
|
|
932
|
+
static buildAnalyticsTableStatement(request) {
|
|
933
|
+
var _a;
|
|
934
|
+
TraceAggregationService.validateGroupBy(request.groupBy);
|
|
935
|
+
const groupByKeys = request.groupBy;
|
|
936
|
+
const limit = (_a = request.limit) !== null && _a !== void 0 ? _a : TraceAggregationService.DEFAULT_ANALYTICS_LIMIT;
|
|
937
|
+
/*
|
|
938
|
+
* The "top dimensions" table always carries the full duration stat set
|
|
939
|
+
* (count, avg, median, min, max) — one query answers "requests and
|
|
940
|
+
* median response time per tenant" without a follow-up.
|
|
941
|
+
*/
|
|
942
|
+
const statement = new Statement();
|
|
943
|
+
statement.append("SELECT count() AS cnt" +
|
|
944
|
+
", avg(durationUnixNano) / 1000000 AS avg_ms" +
|
|
945
|
+
", quantile(0.5)(durationUnixNano) / 1000000 AS p50_ms" +
|
|
946
|
+
", min(durationUnixNano) / 1000000 AS min_ms" +
|
|
947
|
+
", max(durationUnixNano) / 1000000 AS max_ms");
|
|
948
|
+
TraceAggregationService.appendGroupBySelect(statement, groupByKeys);
|
|
949
|
+
statement.append(` FROM ${TraceAggregationService.TABLE_NAME}`);
|
|
950
|
+
TraceAggregationService.appendAnalyticsTimeWindow(statement, request);
|
|
951
|
+
statement.append(TraceAggregationService.RETENTION_FILTER);
|
|
952
|
+
TraceAggregationService.appendGroupByDimensionFilters(statement, groupByKeys);
|
|
953
|
+
TraceAggregationService.appendCommonFilters(statement, request);
|
|
954
|
+
statement.append(" GROUP BY");
|
|
955
|
+
let first = true;
|
|
956
|
+
for (const [index, key] of groupByKeys.entries()) {
|
|
957
|
+
statement.append(`${first ? " " : ", "}${TraceAggregationService.groupByAlias(key, index)}`);
|
|
958
|
+
first = false;
|
|
959
|
+
}
|
|
960
|
+
statement.append(SQL ` ORDER BY cnt DESC LIMIT ${{
|
|
961
|
+
type: TableColumnType.Number,
|
|
962
|
+
value: limit,
|
|
963
|
+
}}`);
|
|
964
|
+
statement.append(getQuerySettings({
|
|
965
|
+
maxExecutionTimeInSeconds: 45,
|
|
966
|
+
timeoutOverflowMode: "break",
|
|
967
|
+
}));
|
|
968
|
+
return statement;
|
|
490
969
|
}
|
|
491
970
|
static isTopLevelColumn(key) {
|
|
492
971
|
return TraceAggregationService.TOP_LEVEL_COLUMNS.has(key);
|
|
@@ -511,7 +990,7 @@ export class TraceAggregationService {
|
|
|
511
990
|
TraceAggregationService.DEFAULT_FACET_LIMIT = 500;
|
|
512
991
|
TraceAggregationService.TABLE_NAME = AnalyticsTableName.Span;
|
|
513
992
|
TraceAggregationService.TOP_LEVEL_COLUMNS = new Set([
|
|
514
|
-
"
|
|
993
|
+
"primaryEntityId",
|
|
515
994
|
"traceId",
|
|
516
995
|
"spanId",
|
|
517
996
|
"parentSpanId",
|
|
@@ -522,8 +1001,8 @@ TraceAggregationService.TOP_LEVEL_COLUMNS = new Set([
|
|
|
522
1001
|
]);
|
|
523
1002
|
/*
|
|
524
1003
|
* Virtual facet keys — same scheme as LogAggregationService. The
|
|
525
|
-
* `
|
|
526
|
-
* disambiguated by the `
|
|
1004
|
+
* `primaryEntityId` slot is reused for host / docker host / k8s cluster
|
|
1005
|
+
* ids, disambiguated by the `primaryEntityType` discriminator.
|
|
527
1006
|
*/
|
|
528
1007
|
TraceAggregationService.RESOURCE_FACET_KEYS = new Map([
|
|
529
1008
|
["hostId", ServiceType.Host],
|
|
@@ -535,6 +1014,34 @@ TraceAggregationService.RESOURCE_FACET_KEYS = new Map([
|
|
|
535
1014
|
]);
|
|
536
1015
|
TraceAggregationService.ATTRIBUTE_KEY_PATTERN = /^[a-zA-Z0-9._:/-]+$/;
|
|
537
1016
|
TraceAggregationService.MAX_FACET_KEY_LENGTH = 256;
|
|
1017
|
+
/*
|
|
1018
|
+
* Read-side retention filter for raw-table queries (rows past their
|
|
1019
|
+
* per-service retention stay in their part until the whole part drops
|
|
1020
|
+
* — ttl_only_drop_parts). Deliberately NOT applied to the
|
|
1021
|
+
* projection-shaped queries (histogram / resource facet counts): the
|
|
1022
|
+
* proj_hist_by_minute aggregate projection does not store
|
|
1023
|
+
* retentionDate, so the predicate would silently force a full
|
|
1024
|
+
* base-table scan.
|
|
1025
|
+
*/
|
|
1026
|
+
TraceAggregationService.RETENTION_FILTER = " AND retentionDate >= now()";
|
|
1027
|
+
TraceAggregationService.DEFAULT_ANALYTICS_LIMIT = 10;
|
|
1028
|
+
TraceAggregationService.MAX_GROUP_BY_DIMENSIONS = 2;
|
|
1029
|
+
/*
|
|
1030
|
+
* Metric → ClickHouse aggregate expression. Values are an allowlist — the
|
|
1031
|
+
* expression is interpolated into SQL, so it must never come from user
|
|
1032
|
+
* input directly. Durations are converted to milliseconds.
|
|
1033
|
+
*/
|
|
1034
|
+
TraceAggregationService.METRIC_EXPRESSIONS = {
|
|
1035
|
+
count: "count()",
|
|
1036
|
+
errorCount: "countIf(statusCode = 2)",
|
|
1037
|
+
avgDuration: "avg(durationUnixNano) / 1000000",
|
|
1038
|
+
minDuration: "min(durationUnixNano) / 1000000",
|
|
1039
|
+
maxDuration: "max(durationUnixNano) / 1000000",
|
|
1040
|
+
p50Duration: "quantile(0.5)(durationUnixNano) / 1000000",
|
|
1041
|
+
p90Duration: "quantile(0.9)(durationUnixNano) / 1000000",
|
|
1042
|
+
p95Duration: "quantile(0.95)(durationUnixNano) / 1000000",
|
|
1043
|
+
p99Duration: "quantile(0.99)(durationUnixNano) / 1000000",
|
|
1044
|
+
};
|
|
538
1045
|
__decorate([
|
|
539
1046
|
CaptureSpan(),
|
|
540
1047
|
__metadata("design:type", Function),
|
|
@@ -559,5 +1066,23 @@ __decorate([
|
|
|
559
1066
|
__metadata("design:paramtypes", [Object]),
|
|
560
1067
|
__metadata("design:returntype", Promise)
|
|
561
1068
|
], TraceAggregationService, "getResourceFacetCounts", null);
|
|
1069
|
+
__decorate([
|
|
1070
|
+
CaptureSpan(),
|
|
1071
|
+
__metadata("design:type", Function),
|
|
1072
|
+
__metadata("design:paramtypes", [Object]),
|
|
1073
|
+
__metadata("design:returntype", Promise)
|
|
1074
|
+
], TraceAggregationService, "getAnalyticsTimeseries", null);
|
|
1075
|
+
__decorate([
|
|
1076
|
+
CaptureSpan(),
|
|
1077
|
+
__metadata("design:type", Function),
|
|
1078
|
+
__metadata("design:paramtypes", [Object]),
|
|
1079
|
+
__metadata("design:returntype", Promise)
|
|
1080
|
+
], TraceAggregationService, "getAnalyticsTopList", null);
|
|
1081
|
+
__decorate([
|
|
1082
|
+
CaptureSpan(),
|
|
1083
|
+
__metadata("design:type", Function),
|
|
1084
|
+
__metadata("design:paramtypes", [Object]),
|
|
1085
|
+
__metadata("design:returntype", Promise)
|
|
1086
|
+
], TraceAggregationService, "getAnalyticsTable", null);
|
|
562
1087
|
export default TraceAggregationService;
|
|
563
1088
|
//# sourceMappingURL=TraceAggregationService.js.map
|