@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,7 +8,9 @@ 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 } from "../Utils/AnalyticsDatabase/Statement";
|
|
11
|
+
import { getQuerySettings } from "../Utils/AnalyticsDatabase/QuerySettingsHelper";
|
|
11
12
|
import ProfileSampleDatabaseService from "./ProfileSampleService";
|
|
13
|
+
import ProfileDatabaseService from "./ProfileService";
|
|
12
14
|
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
|
|
13
15
|
import Includes from "../../Types/BaseDatabase/Includes";
|
|
14
16
|
import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
|
|
@@ -20,17 +22,21 @@ export class ProfileAggregationService {
|
|
|
20
22
|
*
|
|
21
23
|
* Each sample has a `stacktrace` array where each element follows the
|
|
22
24
|
* format "functionName@fileName:lineNumber". The array is ordered
|
|
23
|
-
*
|
|
25
|
+
* LEAF-FIRST (index 0 = leaf, last index = root) — the pprof
|
|
26
|
+
* Sample.location_id and OTLP Stack.location_indices conventions both
|
|
27
|
+
* store the innermost frame first, and ingestion preserves wire order.
|
|
24
28
|
*
|
|
25
|
-
*
|
|
29
|
+
* Samples are pre-aggregated in ClickHouse by stack identity, then
|
|
30
|
+
* stacks sharing common prefixes are merged into a tree of
|
|
26
31
|
* ProfileFlamegraphNode objects.
|
|
27
32
|
*/
|
|
28
33
|
static async getFlamegraph(request) {
|
|
29
|
-
const statement = ProfileAggregationService.
|
|
34
|
+
const statement = ProfileAggregationService.buildGroupedStackQuery(request);
|
|
30
35
|
const dbResult = await ProfileSampleDatabaseService.executeQuery(statement);
|
|
31
36
|
const response = await dbResult.json();
|
|
32
37
|
const rows = response.data || [];
|
|
33
|
-
|
|
38
|
+
const truncated = rows.length >= ProfileAggregationService.MAX_STACK_FETCH;
|
|
39
|
+
// Build the tree from the pre-aggregated stacks
|
|
34
40
|
const root = {
|
|
35
41
|
functionName: "(root)",
|
|
36
42
|
fileName: "",
|
|
@@ -40,25 +46,37 @@ export class ProfileAggregationService {
|
|
|
40
46
|
children: [],
|
|
41
47
|
frameType: "",
|
|
42
48
|
};
|
|
49
|
+
/*
|
|
50
|
+
* Per-node child index so frame lookup is O(1) instead of a linear
|
|
51
|
+
* children.find() — wide fan-out (thousands of siblings under root)
|
|
52
|
+
* made the scan quadratic. Kept outside the nodes so the serialized
|
|
53
|
+
* tree shape is unchanged.
|
|
54
|
+
*/
|
|
55
|
+
const childIndex = new WeakMap();
|
|
43
56
|
for (const row of rows) {
|
|
44
57
|
const stacktrace = row["stacktrace"] || [];
|
|
45
58
|
const frameTypes = row["frameTypes"] || [];
|
|
46
|
-
const value = Number(row["
|
|
59
|
+
const value = Number(row["totalValue"] || 0);
|
|
47
60
|
if (stacktrace.length === 0) {
|
|
48
61
|
continue;
|
|
49
62
|
}
|
|
50
|
-
|
|
63
|
+
/*
|
|
64
|
+
* Walk down the tree, creating nodes as needed. Stored stacks are
|
|
65
|
+
* leaf-first, so iterate from the END of the array (root) toward
|
|
66
|
+
* index 0 (leaf) to build the tree root-to-leaf.
|
|
67
|
+
*/
|
|
51
68
|
let currentNode = root;
|
|
52
69
|
currentNode.totalValue += value;
|
|
53
|
-
for (let i =
|
|
70
|
+
for (let i = stacktrace.length - 1; i >= 0; i--) {
|
|
54
71
|
const frame = ProfileAggregationService.parseFrame(stacktrace[i]);
|
|
55
72
|
const frameType = frameTypes[i] || "";
|
|
56
|
-
|
|
57
|
-
let
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
73
|
+
const frameKey = `${frame.functionName}@${frame.fileName}:${frame.lineNumber}`;
|
|
74
|
+
let index = childIndex.get(currentNode);
|
|
75
|
+
if (!index) {
|
|
76
|
+
index = new Map();
|
|
77
|
+
childIndex.set(currentNode, index);
|
|
78
|
+
}
|
|
79
|
+
let childNode = index.get(frameKey);
|
|
62
80
|
if (!childNode) {
|
|
63
81
|
childNode = {
|
|
64
82
|
functionName: frame.functionName,
|
|
@@ -70,33 +88,60 @@ export class ProfileAggregationService {
|
|
|
70
88
|
frameType: frameType,
|
|
71
89
|
};
|
|
72
90
|
currentNode.children.push(childNode);
|
|
91
|
+
index.set(frameKey, childNode);
|
|
73
92
|
}
|
|
74
93
|
childNode.totalValue += value;
|
|
75
|
-
//
|
|
76
|
-
if (i ===
|
|
94
|
+
// Index 0 is the leaf frame in leaf-first storage — it gets selfValue
|
|
95
|
+
if (i === 0) {
|
|
77
96
|
childNode.selfValue += value;
|
|
78
97
|
}
|
|
79
98
|
currentNode = childNode;
|
|
80
99
|
}
|
|
81
100
|
}
|
|
82
|
-
return root;
|
|
101
|
+
return { flamegraph: root, truncated };
|
|
83
102
|
}
|
|
84
103
|
/**
|
|
85
104
|
* Return the top functions aggregated across samples, sorted by the
|
|
86
|
-
* requested metric (selfValue, totalValue, or sampleCount)
|
|
105
|
+
* requested metric (selfValue, totalValue, or sampleCount), along with
|
|
106
|
+
* the pre-limit window total so callers can show "% of total" figures.
|
|
87
107
|
*/
|
|
88
108
|
static async getFunctionList(request) {
|
|
89
|
-
var _a;
|
|
90
|
-
const
|
|
91
|
-
|
|
109
|
+
var _a, _b;
|
|
110
|
+
const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ projectId: request.projectId }, (request.startTime !== undefined && { startTime: request.startTime })), (request.endTime !== undefined && { endTime: request.endTime })), (request.profileId !== undefined && { profileId: request.profileId })), (request.serviceIds !== undefined && {
|
|
111
|
+
serviceIds: request.serviceIds,
|
|
112
|
+
})), (request.profileType !== undefined && {
|
|
113
|
+
profileType: request.profileType,
|
|
114
|
+
})), (request.profileTypes !== undefined && {
|
|
115
|
+
profileTypes: request.profileTypes,
|
|
116
|
+
}));
|
|
117
|
+
const statement = ProfileAggregationService.buildGroupedStackQuery(filters);
|
|
118
|
+
const windowTotalStatement = ProfileAggregationService.buildWindowTotalQuery(filters);
|
|
119
|
+
/*
|
|
120
|
+
* The window total must be computed over ALL matching rows (pre-limit),
|
|
121
|
+
* so it cannot be derived from the capped grouped result. It is a
|
|
122
|
+
* single cheap aggregate, so run both queries concurrently.
|
|
123
|
+
*/
|
|
124
|
+
const [dbResult, windowTotalDbResult] = await Promise.all([
|
|
125
|
+
ProfileSampleDatabaseService.executeQuery(statement),
|
|
126
|
+
ProfileSampleDatabaseService.executeQuery(windowTotalStatement),
|
|
127
|
+
]);
|
|
92
128
|
const response = await dbResult.json();
|
|
129
|
+
const windowTotalResponse = await windowTotalDbResult.json();
|
|
93
130
|
const rows = response.data || [];
|
|
94
|
-
|
|
131
|
+
const truncated = rows.length >= ProfileAggregationService.MAX_STACK_FETCH;
|
|
132
|
+
const windowTotalRows = windowTotalResponse.data || [];
|
|
133
|
+
const windowTotal = Number(((_a = windowTotalRows[0]) === null || _a === void 0 ? void 0 : _a["windowTotal"]) || 0);
|
|
134
|
+
// Aggregate per-function stats from the pre-aggregated stacks
|
|
95
135
|
const functionMap = new Map();
|
|
96
136
|
for (const row of rows) {
|
|
97
137
|
const stacktrace = row["stacktrace"] || [];
|
|
98
138
|
const frameTypes = row["frameTypes"] || [];
|
|
99
|
-
const value = Number(row["
|
|
139
|
+
const value = Number(row["totalValue"] || 0);
|
|
140
|
+
/*
|
|
141
|
+
* Each grouped row stands in for `sampleCount` raw samples sharing
|
|
142
|
+
* one stack, so per-function sample counts add the group size, not 1.
|
|
143
|
+
*/
|
|
144
|
+
const groupSampleCount = Number(row["sampleCount"] || 0);
|
|
100
145
|
if (stacktrace.length === 0) {
|
|
101
146
|
continue;
|
|
102
147
|
}
|
|
@@ -105,7 +150,8 @@ export class ProfileAggregationService {
|
|
|
105
150
|
const frame = ProfileAggregationService.parseFrame(stacktrace[i]);
|
|
106
151
|
const frameType = frameTypes[i] || "";
|
|
107
152
|
const key = `${frame.functionName}@${frame.fileName}:${frame.lineNumber}`;
|
|
108
|
-
|
|
153
|
+
// Stacks are stored leaf-first, so index 0 is the leaf frame.
|
|
154
|
+
const isLeaf = i === 0;
|
|
109
155
|
let entry = functionMap.get(key);
|
|
110
156
|
if (!entry) {
|
|
111
157
|
entry = {
|
|
@@ -118,10 +164,10 @@ export class ProfileAggregationService {
|
|
|
118
164
|
};
|
|
119
165
|
functionMap.set(key, entry);
|
|
120
166
|
}
|
|
121
|
-
// totalValue: count the value once per unique function per
|
|
167
|
+
// totalValue: count the value once per unique function per stack
|
|
122
168
|
if (!seenInThisSample.has(key)) {
|
|
123
169
|
entry.totalValue += value;
|
|
124
|
-
entry.sampleCount +=
|
|
170
|
+
entry.sampleCount += groupSampleCount;
|
|
125
171
|
seenInThisSample.add(key);
|
|
126
172
|
}
|
|
127
173
|
// selfValue: only the leaf frame
|
|
@@ -142,29 +188,250 @@ export class ProfileAggregationService {
|
|
|
142
188
|
}
|
|
143
189
|
return b.selfValue - a.selfValue;
|
|
144
190
|
});
|
|
145
|
-
const limit = (
|
|
146
|
-
return
|
|
191
|
+
const limit = (_b = request.limit) !== null && _b !== void 0 ? _b : ProfileAggregationService.DEFAULT_FUNCTION_LIST_LIMIT;
|
|
192
|
+
return {
|
|
193
|
+
functions: items.slice(0, limit),
|
|
194
|
+
windowTotal,
|
|
195
|
+
truncated,
|
|
196
|
+
};
|
|
147
197
|
}
|
|
148
198
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
199
|
+
* "Sandwich" aggregation for one function: every matching stack is
|
|
200
|
+
* split at the focused function, the frames toward the root become the
|
|
201
|
+
* callers tree and the frames toward the leaf become the callees tree.
|
|
202
|
+
* Both trees are rooted at the focused function itself so the UI can
|
|
203
|
+
* render them stacked around a single center row.
|
|
204
|
+
*
|
|
205
|
+
* Frames match on functionName + fileName only — line numbers shift on
|
|
206
|
+
* every deploy (and with inlining), so including them would split one
|
|
207
|
+
* logical function into many.
|
|
151
208
|
*/
|
|
152
|
-
static async
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
})), (request.profileType !== undefined && {
|
|
156
|
-
profileType: request.profileType,
|
|
157
|
-
})), (request.profileTypes !== undefined && {
|
|
158
|
-
profileTypes: request.profileTypes,
|
|
159
|
-
})));
|
|
160
|
-
const comparisonTree = await ProfileAggregationService.getFlamegraph(Object.assign(Object.assign(Object.assign({ projectId: request.projectId, startTime: request.comparisonStartTime, endTime: request.comparisonEndTime }, (request.serviceIds !== undefined && {
|
|
209
|
+
static async getFunctionFocus(request) {
|
|
210
|
+
var _a;
|
|
211
|
+
const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ projectId: request.projectId }, (request.profileId !== undefined && { profileId: request.profileId })), (request.startTime !== undefined && { startTime: request.startTime })), (request.endTime !== undefined && { endTime: request.endTime })), (request.serviceIds !== undefined && {
|
|
161
212
|
serviceIds: request.serviceIds,
|
|
162
213
|
})), (request.profileType !== undefined && {
|
|
163
214
|
profileType: request.profileType,
|
|
164
215
|
})), (request.profileTypes !== undefined && {
|
|
165
216
|
profileTypes: request.profileTypes,
|
|
166
|
-
}))
|
|
167
|
-
|
|
217
|
+
}));
|
|
218
|
+
const statement = ProfileAggregationService.buildFunctionStackQuery(filters, request.functionName, request.fileName);
|
|
219
|
+
const windowTotalStatement = ProfileAggregationService.buildWindowTotalQuery(filters);
|
|
220
|
+
/*
|
|
221
|
+
* windowTotal deliberately ignores the function prefilter — it is the
|
|
222
|
+
* denominator for "% of window" figures, so it must cover every row
|
|
223
|
+
* matching the non-function filters. Both reads are independent, so
|
|
224
|
+
* run them concurrently.
|
|
225
|
+
*/
|
|
226
|
+
const [dbResult, windowTotalDbResult] = await Promise.all([
|
|
227
|
+
ProfileSampleDatabaseService.executeQuery(statement),
|
|
228
|
+
ProfileSampleDatabaseService.executeQuery(windowTotalStatement),
|
|
229
|
+
]);
|
|
230
|
+
const response = await dbResult.json();
|
|
231
|
+
const windowTotalResponse = await windowTotalDbResult.json();
|
|
232
|
+
const rows = response.data || [];
|
|
233
|
+
const truncated = rows.length >= ProfileAggregationService.MAX_STACK_FETCH;
|
|
234
|
+
const windowTotalRows = windowTotalResponse.data || [];
|
|
235
|
+
const windowTotal = Number(((_a = windowTotalRows[0]) === null || _a === void 0 ? void 0 : _a["windowTotal"]) || 0);
|
|
236
|
+
/*
|
|
237
|
+
* Both trees are rooted at the focused function. lineNumber is 0
|
|
238
|
+
* because the view aggregates across line numbers by design.
|
|
239
|
+
*/
|
|
240
|
+
const callers = {
|
|
241
|
+
functionName: request.functionName,
|
|
242
|
+
fileName: request.fileName,
|
|
243
|
+
lineNumber: 0,
|
|
244
|
+
selfValue: 0,
|
|
245
|
+
totalValue: 0,
|
|
246
|
+
children: [],
|
|
247
|
+
frameType: "",
|
|
248
|
+
};
|
|
249
|
+
const callees = {
|
|
250
|
+
functionName: request.functionName,
|
|
251
|
+
fileName: request.fileName,
|
|
252
|
+
lineNumber: 0,
|
|
253
|
+
selfValue: 0,
|
|
254
|
+
totalValue: 0,
|
|
255
|
+
children: [],
|
|
256
|
+
frameType: "",
|
|
257
|
+
};
|
|
258
|
+
/*
|
|
259
|
+
* Per-node child index for O(1) frame lookup, mirroring getFlamegraph.
|
|
260
|
+
* One map serves both trees since it is keyed by parent node identity.
|
|
261
|
+
*/
|
|
262
|
+
const childIndex = new WeakMap();
|
|
263
|
+
let totalValue = 0;
|
|
264
|
+
let selfValue = 0;
|
|
265
|
+
let sampleCount = 0;
|
|
266
|
+
for (const row of rows) {
|
|
267
|
+
const stacktrace = row["stacktrace"] || [];
|
|
268
|
+
const frameTypes = row["frameTypes"] || [];
|
|
269
|
+
const value = Number(row["totalValue"] || 0);
|
|
270
|
+
const groupSampleCount = Number(row["sampleCount"] || 0);
|
|
271
|
+
if (stacktrace.length === 0) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
/*
|
|
275
|
+
* Stacks are leaf-first, so scanning from the END finds the
|
|
276
|
+
* occurrence CLOSEST TO THE ROOT first. For recursive functions
|
|
277
|
+
* this attributes the whole recursive subtree (including nested
|
|
278
|
+
* occurrences) to one split point, so each stack's value is
|
|
279
|
+
* counted exactly once.
|
|
280
|
+
*/
|
|
281
|
+
let occurrenceIndex = -1;
|
|
282
|
+
for (let i = stacktrace.length - 1; i >= 0; i--) {
|
|
283
|
+
const frame = ProfileAggregationService.parseFrame(stacktrace[i]);
|
|
284
|
+
if (frame.functionName === request.functionName &&
|
|
285
|
+
frame.fileName === request.fileName) {
|
|
286
|
+
occurrenceIndex = i;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/*
|
|
291
|
+
* The ClickHouse prefilter is a prefix match and can overmatch
|
|
292
|
+
* when a fileName containing colons shares a prefix with another
|
|
293
|
+
* (parseFrame splits on the LAST colon) — drop those rows here.
|
|
294
|
+
*/
|
|
295
|
+
if (occurrenceIndex === -1) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
totalValue += value;
|
|
299
|
+
sampleCount += groupSampleCount;
|
|
300
|
+
/*
|
|
301
|
+
* Self time counts whenever the function is the EXECUTING (leaf)
|
|
302
|
+
* frame — checked against index 0 directly rather than the split
|
|
303
|
+
* point, because a recursive stack splits at the root-most
|
|
304
|
+
* occurrence while the leaf may still be the same function
|
|
305
|
+
* (standard sandwich-view semantics: self = "was on CPU").
|
|
306
|
+
*/
|
|
307
|
+
const leafFrame = ProfileAggregationService.parseFrame(stacktrace[0]);
|
|
308
|
+
if (leafFrame.functionName === request.functionName &&
|
|
309
|
+
leafFrame.fileName === request.fileName) {
|
|
310
|
+
selfValue += value;
|
|
311
|
+
}
|
|
312
|
+
const occurrenceFrameType = frameTypes[occurrenceIndex] || "";
|
|
313
|
+
if (!callers.frameType) {
|
|
314
|
+
callers.frameType = occurrenceFrameType;
|
|
315
|
+
}
|
|
316
|
+
if (!callees.frameType) {
|
|
317
|
+
callees.frameType = occurrenceFrameType;
|
|
318
|
+
}
|
|
319
|
+
callers.totalValue += value;
|
|
320
|
+
callees.totalValue += value;
|
|
321
|
+
/*
|
|
322
|
+
* Caller chain: frames ABOVE the occurrence (toward the root),
|
|
323
|
+
* direct caller first so depth in the tree equals caller distance.
|
|
324
|
+
*/
|
|
325
|
+
const callerIndices = [];
|
|
326
|
+
for (let i = occurrenceIndex + 1; i < stacktrace.length; i++) {
|
|
327
|
+
callerIndices.push(i);
|
|
328
|
+
}
|
|
329
|
+
/*
|
|
330
|
+
* Callee chain: frames BELOW the occurrence (toward the leaf),
|
|
331
|
+
* direct callee first.
|
|
332
|
+
*/
|
|
333
|
+
const calleeIndices = [];
|
|
334
|
+
for (let i = occurrenceIndex - 1; i >= 0; i--) {
|
|
335
|
+
calleeIndices.push(i);
|
|
336
|
+
}
|
|
337
|
+
ProfileAggregationService.appendFocusChain({
|
|
338
|
+
root: callers,
|
|
339
|
+
stacktrace,
|
|
340
|
+
frameTypes,
|
|
341
|
+
frameIndices: callerIndices,
|
|
342
|
+
value,
|
|
343
|
+
childIndex,
|
|
344
|
+
});
|
|
345
|
+
ProfileAggregationService.appendFocusChain({
|
|
346
|
+
root: callees,
|
|
347
|
+
stacktrace,
|
|
348
|
+
frameTypes,
|
|
349
|
+
frameIndices: calleeIndices,
|
|
350
|
+
value,
|
|
351
|
+
childIndex,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
functionName: request.functionName,
|
|
356
|
+
fileName: request.fileName,
|
|
357
|
+
totalValue,
|
|
358
|
+
selfValue,
|
|
359
|
+
sampleCount,
|
|
360
|
+
windowTotal,
|
|
361
|
+
callers,
|
|
362
|
+
callees,
|
|
363
|
+
truncated,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Walk one split half of a stack into a focus tree, merging frames on
|
|
368
|
+
* functionName + fileName (line numbers aggregated away — same
|
|
369
|
+
* deploy-stability rationale as the focused-function match itself).
|
|
370
|
+
* The terminal node of the chain absorbs selfValue: in the callers
|
|
371
|
+
* tree that is the stack root ("the chain starts here"), in the
|
|
372
|
+
* callees tree the leaf ("the time bottoms out here"). An empty chain
|
|
373
|
+
* terminates at the focused root itself.
|
|
374
|
+
*/
|
|
375
|
+
static appendFocusChain(data) {
|
|
376
|
+
let currentNode = data.root;
|
|
377
|
+
for (const frameIndex of data.frameIndices) {
|
|
378
|
+
const frame = ProfileAggregationService.parseFrame(data.stacktrace[frameIndex]);
|
|
379
|
+
const frameType = data.frameTypes[frameIndex] || "";
|
|
380
|
+
const frameKey = `${frame.functionName}@${frame.fileName}`;
|
|
381
|
+
let index = data.childIndex.get(currentNode);
|
|
382
|
+
if (!index) {
|
|
383
|
+
index = new Map();
|
|
384
|
+
data.childIndex.set(currentNode, index);
|
|
385
|
+
}
|
|
386
|
+
let childNode = index.get(frameKey);
|
|
387
|
+
if (!childNode) {
|
|
388
|
+
childNode = {
|
|
389
|
+
functionName: frame.functionName,
|
|
390
|
+
fileName: frame.fileName,
|
|
391
|
+
lineNumber: 0,
|
|
392
|
+
selfValue: 0,
|
|
393
|
+
totalValue: 0,
|
|
394
|
+
children: [],
|
|
395
|
+
frameType: frameType,
|
|
396
|
+
};
|
|
397
|
+
currentNode.children.push(childNode);
|
|
398
|
+
index.set(frameKey, childNode);
|
|
399
|
+
}
|
|
400
|
+
childNode.totalValue += data.value;
|
|
401
|
+
currentNode = childNode;
|
|
402
|
+
}
|
|
403
|
+
currentNode.selfValue += data.value;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Build a diff flamegraph comparing two time ranges.
|
|
407
|
+
* Returns a tree where each node has baseline/comparison values and
|
|
408
|
+
* deltas, plus a truncation flag covering both source windows.
|
|
409
|
+
*/
|
|
410
|
+
static async getDiffFlamegraph(request) {
|
|
411
|
+
/*
|
|
412
|
+
* The two windows are independent reads, so fetch them concurrently —
|
|
413
|
+
* sequential awaits doubled the latency of every diff request.
|
|
414
|
+
*/
|
|
415
|
+
const [baselineResult, comparisonResult] = await Promise.all([
|
|
416
|
+
ProfileAggregationService.getFlamegraph(Object.assign(Object.assign(Object.assign({ projectId: request.projectId, startTime: request.baselineStartTime, endTime: request.baselineEndTime }, (request.serviceIds !== undefined && {
|
|
417
|
+
serviceIds: request.serviceIds,
|
|
418
|
+
})), (request.profileType !== undefined && {
|
|
419
|
+
profileType: request.profileType,
|
|
420
|
+
})), (request.profileTypes !== undefined && {
|
|
421
|
+
profileTypes: request.profileTypes,
|
|
422
|
+
}))),
|
|
423
|
+
ProfileAggregationService.getFlamegraph(Object.assign(Object.assign(Object.assign({ projectId: request.projectId, startTime: request.comparisonStartTime, endTime: request.comparisonEndTime }, (request.serviceIds !== undefined && {
|
|
424
|
+
serviceIds: request.serviceIds,
|
|
425
|
+
})), (request.profileType !== undefined && {
|
|
426
|
+
profileType: request.profileType,
|
|
427
|
+
})), (request.profileTypes !== undefined && {
|
|
428
|
+
profileTypes: request.profileTypes,
|
|
429
|
+
}))),
|
|
430
|
+
]);
|
|
431
|
+
return {
|
|
432
|
+
diffFlamegraph: ProfileAggregationService.mergeDiffTrees(baselineResult.flamegraph, comparisonResult.flamegraph),
|
|
433
|
+
truncated: baselineResult.truncated || comparisonResult.truncated,
|
|
434
|
+
};
|
|
168
435
|
}
|
|
169
436
|
static mergeDiffTrees(baseline, comparison) {
|
|
170
437
|
const baselineValue = (baseline === null || baseline === void 0 ? void 0 : baseline.totalValue) || 0;
|
|
@@ -221,134 +488,239 @@ export class ProfileAggregationService {
|
|
|
221
488
|
return node;
|
|
222
489
|
}
|
|
223
490
|
/**
|
|
224
|
-
* Aggregate sample / profile counts per
|
|
491
|
+
* Aggregate sample / profile counts per primaryEntityId for a time window.
|
|
225
492
|
* Drives the "loudest services first" sort on the Profiles dashboard
|
|
226
493
|
* so a developer opening the page lands on the workloads that are
|
|
227
494
|
* actually doing work rather than scrolling past kernel-thread noise.
|
|
495
|
+
*
|
|
496
|
+
* Reads the small Profile table (one row per ingested profile, with a
|
|
497
|
+
* denormalized sampleCount) instead of scanning every row of the huge
|
|
498
|
+
* ProfileSample table for what is just a per-service ranking.
|
|
228
499
|
*/
|
|
229
500
|
static async getServiceActivity(request) {
|
|
230
501
|
const statement = ProfileAggregationService.buildServiceActivityQuery(request);
|
|
231
|
-
const dbResult = await
|
|
502
|
+
const dbResult = await ProfileDatabaseService.executeQuery(statement);
|
|
232
503
|
const response = await dbResult.json();
|
|
233
504
|
const rows = response.data || [];
|
|
234
505
|
const out = [];
|
|
235
506
|
for (const row of rows) {
|
|
236
|
-
const
|
|
237
|
-
if (!
|
|
507
|
+
const primaryEntityId = String(row["primaryEntityId"] || "");
|
|
508
|
+
if (!primaryEntityId) {
|
|
238
509
|
continue;
|
|
239
510
|
}
|
|
240
511
|
out.push({
|
|
241
|
-
|
|
242
|
-
sampleCount: Number(row["
|
|
512
|
+
primaryEntityId,
|
|
513
|
+
sampleCount: Number(row["totalSampleCount"] || 0),
|
|
243
514
|
profileCount: Number(row["profileCount"] || 0),
|
|
244
|
-
|
|
515
|
+
/*
|
|
516
|
+
* Profile rows do not carry a summed sample value, and no client
|
|
517
|
+
* reads this field — it is kept at 0 purely so the response shape
|
|
518
|
+
* stays stable for existing consumers.
|
|
519
|
+
*/
|
|
520
|
+
totalValue: 0,
|
|
245
521
|
});
|
|
246
522
|
}
|
|
247
523
|
return out;
|
|
248
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Group profiling volume by a dimension ("service" = primaryEntityId,
|
|
527
|
+
* anything else = a Profile attribute key) over a time window.
|
|
528
|
+
*
|
|
529
|
+
* Reads the small Profile table (one row per ingested profile with a
|
|
530
|
+
* denormalized sampleCount) — same reasoning as getServiceActivity: a
|
|
531
|
+
* share-of-volume ranking never needs the huge ProfileSample table.
|
|
532
|
+
*
|
|
533
|
+
* totalSampleCount sums over ALL fetched groups before the limit is
|
|
534
|
+
* applied, so item shares stay percentages of the real total rather
|
|
535
|
+
* than of the visible top-N.
|
|
536
|
+
*/
|
|
537
|
+
static async getBreakdown(request) {
|
|
538
|
+
var _a;
|
|
539
|
+
const statement = ProfileAggregationService.buildBreakdownQuery(request);
|
|
540
|
+
const dbResult = await ProfileDatabaseService.executeQuery(statement);
|
|
541
|
+
const response = await dbResult.json();
|
|
542
|
+
const rows = response.data || [];
|
|
543
|
+
// Rows arrive sorted by summed sampleCount descending (query ORDER BY).
|
|
544
|
+
const allItems = [];
|
|
545
|
+
let totalSampleCount = 0;
|
|
546
|
+
for (const row of rows) {
|
|
547
|
+
const value = String(row["breakdownValue"] || "");
|
|
548
|
+
if (!value) {
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
const groupSampleCount = Number(row["totalSampleCount"] || 0);
|
|
552
|
+
totalSampleCount += groupSampleCount;
|
|
553
|
+
allItems.push({
|
|
554
|
+
value,
|
|
555
|
+
sampleCount: groupSampleCount,
|
|
556
|
+
profileCount: Number(row["profileCount"] || 0),
|
|
557
|
+
share: 0,
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
const limit = (_a = request.limit) !== null && _a !== void 0 ? _a : ProfileAggregationService.DEFAULT_BREAKDOWN_LIMIT;
|
|
561
|
+
const items = allItems.slice(0, limit);
|
|
562
|
+
for (const item of items) {
|
|
563
|
+
item.share =
|
|
564
|
+
totalSampleCount > 0 ? (item.sampleCount / totalSampleCount) * 100 : 0;
|
|
565
|
+
}
|
|
566
|
+
return { items, totalSampleCount };
|
|
567
|
+
}
|
|
249
568
|
// --- Query builders ---
|
|
250
|
-
|
|
569
|
+
/**
|
|
570
|
+
* Fetch samples pre-aggregated by stack identity. Collapsing identical
|
|
571
|
+
* (stacktrace, frameTypes) pairs in ClickHouse shrinks tens of thousands
|
|
572
|
+
* of raw sample rows to a few hundred unique stacks before they cross
|
|
573
|
+
* the wire, and the ORDER BY makes the LIMIT drop the smallest stacks
|
|
574
|
+
* first instead of an arbitrary subset.
|
|
575
|
+
*
|
|
576
|
+
* `value` is stored as Int128 in ClickHouse, so the sum is wrapped in
|
|
577
|
+
* toFloat64 to keep the JSON output numeric (toFloat64OrZero would fail
|
|
578
|
+
* with "Illegal type Int128").
|
|
579
|
+
*/
|
|
580
|
+
static buildGroupedStackQuery(request) {
|
|
251
581
|
const statement = SQL `
|
|
252
582
|
SELECT
|
|
253
583
|
stacktrace,
|
|
254
584
|
frameTypes,
|
|
255
|
-
value
|
|
585
|
+
toFloat64(sum(value)) AS totalValue,
|
|
586
|
+
count() AS sampleCount
|
|
256
587
|
FROM ${ProfileAggregationService.TABLE_NAME}
|
|
257
588
|
WHERE projectId = ${{
|
|
258
589
|
type: TableColumnType.ObjectID,
|
|
259
590
|
value: request.projectId,
|
|
260
591
|
}}
|
|
261
592
|
`;
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}}`);
|
|
267
|
-
}
|
|
268
|
-
if (request.startTime) {
|
|
269
|
-
statement.append(SQL ` AND time >= ${{
|
|
270
|
-
type: TableColumnType.Date,
|
|
271
|
-
value: request.startTime,
|
|
272
|
-
}}`);
|
|
273
|
-
}
|
|
274
|
-
if (request.endTime) {
|
|
275
|
-
statement.append(SQL ` AND time <= ${{
|
|
276
|
-
type: TableColumnType.Date,
|
|
277
|
-
value: request.endTime,
|
|
278
|
-
}}`);
|
|
279
|
-
}
|
|
280
|
-
ProfileAggregationService.appendCommonFilters(statement, request);
|
|
281
|
-
statement.append(SQL ` LIMIT ${{
|
|
593
|
+
ProfileAggregationService.appendSampleFilters(statement, request);
|
|
594
|
+
statement.append(SQL ` GROUP BY stacktrace, frameTypes
|
|
595
|
+
ORDER BY totalValue DESC
|
|
596
|
+
LIMIT ${{
|
|
282
597
|
type: TableColumnType.Number,
|
|
283
|
-
value: ProfileAggregationService.
|
|
598
|
+
value: ProfileAggregationService.MAX_STACK_FETCH,
|
|
284
599
|
}}`);
|
|
285
600
|
/*
|
|
286
|
-
* Cap runtime below the client's 58s request_timeout;
|
|
287
|
-
*
|
|
288
|
-
* yields a partial flamegraph rather than holding a pool connection.
|
|
601
|
+
* Cap runtime below the client's 58s request_timeout; 'break' yields
|
|
602
|
+
* a partial (top stacks) result rather than holding a pool connection.
|
|
289
603
|
*/
|
|
290
|
-
statement.append(
|
|
604
|
+
statement.append(getQuerySettings({
|
|
605
|
+
maxExecutionTimeInSeconds: 45,
|
|
606
|
+
timeoutOverflowMode: "break",
|
|
607
|
+
}));
|
|
291
608
|
return statement;
|
|
292
609
|
}
|
|
293
|
-
|
|
610
|
+
/**
|
|
611
|
+
* Grouped-stack query restricted to stacks containing one function, so
|
|
612
|
+
* a sandwich aggregation never pulls the full window's stacks over the
|
|
613
|
+
* wire just to discard most of them.
|
|
614
|
+
*
|
|
615
|
+
* Stored frame strings are "functionName" + ("@fileName" when fileName
|
|
616
|
+
* is non-empty) + (":lineNumber" when lineNumber > 0) — see
|
|
617
|
+
* OtelProfilesIngestService.resolveStackFrames. Line numbers shift
|
|
618
|
+
* across deploys, so the predicate matches the functionName+fileName
|
|
619
|
+
* identity only:
|
|
620
|
+
* - non-empty fileName: exact "fn@file" (no line recorded) OR prefix
|
|
621
|
+
* "fn@file:" (line recorded);
|
|
622
|
+
* - empty fileName: the exact bare frame (folded uploads and
|
|
623
|
+
* address-only frames store just the name — parseFrame treats any
|
|
624
|
+
* '@'-less frame as all functionName, so equality is the full
|
|
625
|
+
* match).
|
|
626
|
+
* The prefix form can overmatch when one colon-bearing fileName is a
|
|
627
|
+
* prefix of another (parseFrame splits on the LAST colon), so callers
|
|
628
|
+
* must re-check each frame in memory via parseFrame.
|
|
629
|
+
*/
|
|
630
|
+
static buildFunctionStackQuery(request, functionName, fileName) {
|
|
294
631
|
const statement = SQL `
|
|
295
632
|
SELECT
|
|
296
633
|
stacktrace,
|
|
297
634
|
frameTypes,
|
|
298
|
-
value
|
|
635
|
+
toFloat64(sum(value)) AS totalValue,
|
|
636
|
+
count() AS sampleCount
|
|
299
637
|
FROM ${ProfileAggregationService.TABLE_NAME}
|
|
300
638
|
WHERE projectId = ${{
|
|
301
639
|
type: TableColumnType.ObjectID,
|
|
302
640
|
value: request.projectId,
|
|
303
641
|
}}
|
|
304
|
-
AND time >= ${{
|
|
305
|
-
type: TableColumnType.Date,
|
|
306
|
-
value: request.startTime,
|
|
307
|
-
}}
|
|
308
|
-
AND time <= ${{
|
|
309
|
-
type: TableColumnType.Date,
|
|
310
|
-
value: request.endTime,
|
|
311
|
-
}}
|
|
312
642
|
`;
|
|
313
|
-
ProfileAggregationService.
|
|
314
|
-
|
|
643
|
+
ProfileAggregationService.appendSampleFilters(statement, request);
|
|
644
|
+
if (fileName) {
|
|
645
|
+
statement.append(SQL ` AND arrayExists(x -> (x = ${{
|
|
646
|
+
type: TableColumnType.Text,
|
|
647
|
+
value: `${functionName}@${fileName}`,
|
|
648
|
+
}} OR startsWith(x, ${{
|
|
649
|
+
type: TableColumnType.Text,
|
|
650
|
+
value: `${functionName}@${fileName}:`,
|
|
651
|
+
}})), stacktrace)`);
|
|
652
|
+
}
|
|
653
|
+
else {
|
|
654
|
+
statement.append(SQL ` AND has(stacktrace, ${{
|
|
655
|
+
type: TableColumnType.Text,
|
|
656
|
+
value: functionName,
|
|
657
|
+
}})`);
|
|
658
|
+
}
|
|
659
|
+
statement.append(SQL ` GROUP BY stacktrace, frameTypes
|
|
660
|
+
ORDER BY totalValue DESC
|
|
661
|
+
LIMIT ${{
|
|
315
662
|
type: TableColumnType.Number,
|
|
316
|
-
value: ProfileAggregationService.
|
|
663
|
+
value: ProfileAggregationService.MAX_STACK_FETCH,
|
|
317
664
|
}}`);
|
|
318
665
|
/*
|
|
319
666
|
* Cap runtime below the client's 58s request_timeout; 'break' yields
|
|
320
|
-
* a partial
|
|
667
|
+
* a partial (top stacks) result rather than holding a pool connection.
|
|
321
668
|
*/
|
|
322
|
-
statement.append(
|
|
669
|
+
statement.append(getQuerySettings({
|
|
670
|
+
maxExecutionTimeInSeconds: 45,
|
|
671
|
+
timeoutOverflowMode: "break",
|
|
672
|
+
}));
|
|
673
|
+
return statement;
|
|
674
|
+
}
|
|
675
|
+
/**
|
|
676
|
+
* Total of `value` across every sample row matching the filters — no
|
|
677
|
+
* GROUP BY and no LIMIT, so it stays correct even when the grouped
|
|
678
|
+
* stack query truncates.
|
|
679
|
+
*/
|
|
680
|
+
static buildWindowTotalQuery(request) {
|
|
681
|
+
const statement = SQL `
|
|
682
|
+
SELECT
|
|
683
|
+
toFloat64(sum(value)) AS windowTotal
|
|
684
|
+
FROM ${ProfileAggregationService.TABLE_NAME}
|
|
685
|
+
WHERE projectId = ${{
|
|
686
|
+
type: TableColumnType.ObjectID,
|
|
687
|
+
value: request.projectId,
|
|
688
|
+
}}
|
|
689
|
+
`;
|
|
690
|
+
ProfileAggregationService.appendSampleFilters(statement, request);
|
|
691
|
+
statement.append(getQuerySettings({
|
|
692
|
+
maxExecutionTimeInSeconds: 45,
|
|
693
|
+
timeoutOverflowMode: "break",
|
|
694
|
+
}));
|
|
323
695
|
return statement;
|
|
324
696
|
}
|
|
325
697
|
static buildServiceActivityQuery(request) {
|
|
326
698
|
/*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
*
|
|
330
|
-
*
|
|
699
|
+
* One Profile row per ingested profile with a denormalized sampleCount,
|
|
700
|
+
* so the per-service ranking never has to touch the (orders of
|
|
701
|
+
* magnitude larger) ProfileSample table. uniqExact tolerates duplicate
|
|
702
|
+
* rows for the same profileId from re-ingestion.
|
|
331
703
|
*/
|
|
332
704
|
const statement = SQL `
|
|
333
705
|
SELECT
|
|
334
|
-
toString(
|
|
335
|
-
|
|
336
|
-
uniqExact(profileId) AS profileCount
|
|
337
|
-
|
|
338
|
-
FROM ${ProfileAggregationService.TABLE_NAME}
|
|
706
|
+
toString(primaryEntityId) AS primaryEntityId,
|
|
707
|
+
toFloat64(sum(sampleCount)) AS totalSampleCount,
|
|
708
|
+
uniqExact(profileId) AS profileCount
|
|
709
|
+
FROM ${ProfileAggregationService.PROFILE_TABLE_NAME}
|
|
339
710
|
WHERE projectId = ${{
|
|
340
711
|
type: TableColumnType.ObjectID,
|
|
341
712
|
value: request.projectId,
|
|
342
713
|
}}
|
|
343
|
-
AND
|
|
714
|
+
AND startTime >= ${{
|
|
344
715
|
type: TableColumnType.Date,
|
|
345
716
|
value: request.startTime,
|
|
346
717
|
}}
|
|
347
|
-
AND
|
|
718
|
+
AND startTime <= ${{
|
|
348
719
|
type: TableColumnType.Date,
|
|
349
720
|
value: request.endTime,
|
|
350
721
|
}}
|
|
351
722
|
`;
|
|
723
|
+
statement.append(" AND retentionDate >= now()");
|
|
352
724
|
/*
|
|
353
725
|
* profileTypes (array) wins over profileType (single) so the UI
|
|
354
726
|
* can OR together every raw type string in a category.
|
|
@@ -365,19 +737,127 @@ export class ProfileAggregationService {
|
|
|
365
737
|
value: request.profileType,
|
|
366
738
|
}}`);
|
|
367
739
|
}
|
|
368
|
-
statement.append(SQL ` GROUP BY
|
|
369
|
-
ORDER BY
|
|
740
|
+
statement.append(SQL ` GROUP BY primaryEntityId
|
|
741
|
+
ORDER BY totalSampleCount DESC
|
|
370
742
|
LIMIT 10000`);
|
|
371
743
|
/*
|
|
372
744
|
* Cap runtime below the client's 58s request_timeout; 'break' yields
|
|
373
745
|
* partial service activity rather than holding a pool connection.
|
|
374
746
|
*/
|
|
375
|
-
statement.append(
|
|
747
|
+
statement.append(getQuerySettings({
|
|
748
|
+
maxExecutionTimeInSeconds: 45,
|
|
749
|
+
timeoutOverflowMode: "break",
|
|
750
|
+
}));
|
|
376
751
|
return statement;
|
|
377
752
|
}
|
|
753
|
+
/**
|
|
754
|
+
* Per-group volume aggregate over the Profile table for getBreakdown.
|
|
755
|
+
*
|
|
756
|
+
* The "service" dimension groups by primaryEntityId (mirroring
|
|
757
|
+
* buildServiceActivityQuery); any other dimension is a Profile
|
|
758
|
+
* attribute key, read via the parameter-bound Map subscript
|
|
759
|
+
* `attributes[key]` — the same O(1) fast path the analytics query
|
|
760
|
+
* generator uses for map equality. The subscript yields '' for missing
|
|
761
|
+
* keys, so the != '' guard drops profiles without the attribute.
|
|
762
|
+
*/
|
|
763
|
+
static buildBreakdownQuery(request) {
|
|
764
|
+
let statement;
|
|
765
|
+
if (request.breakdownBy === "service") {
|
|
766
|
+
statement = SQL `
|
|
767
|
+
SELECT
|
|
768
|
+
toString(primaryEntityId) AS breakdownValue,
|
|
769
|
+
toFloat64(sum(sampleCount)) AS totalSampleCount,
|
|
770
|
+
uniqExact(profileId) AS profileCount
|
|
771
|
+
FROM ${ProfileAggregationService.PROFILE_TABLE_NAME}
|
|
772
|
+
WHERE projectId = ${{
|
|
773
|
+
type: TableColumnType.ObjectID,
|
|
774
|
+
value: request.projectId,
|
|
775
|
+
}}
|
|
776
|
+
`;
|
|
777
|
+
}
|
|
778
|
+
else {
|
|
779
|
+
statement = SQL `
|
|
780
|
+
SELECT
|
|
781
|
+
attributes[${{
|
|
782
|
+
type: TableColumnType.Text,
|
|
783
|
+
value: request.breakdownBy,
|
|
784
|
+
}}] AS breakdownValue,
|
|
785
|
+
toFloat64(sum(sampleCount)) AS totalSampleCount,
|
|
786
|
+
uniqExact(profileId) AS profileCount
|
|
787
|
+
FROM ${ProfileAggregationService.PROFILE_TABLE_NAME}
|
|
788
|
+
WHERE projectId = ${{
|
|
789
|
+
type: TableColumnType.ObjectID,
|
|
790
|
+
value: request.projectId,
|
|
791
|
+
}}
|
|
792
|
+
AND attributes[${{
|
|
793
|
+
type: TableColumnType.Text,
|
|
794
|
+
value: request.breakdownBy,
|
|
795
|
+
}}] != ''
|
|
796
|
+
`;
|
|
797
|
+
}
|
|
798
|
+
statement.append(SQL ` AND startTime >= ${{
|
|
799
|
+
type: TableColumnType.Date,
|
|
800
|
+
value: request.startTime,
|
|
801
|
+
}} AND startTime <= ${{
|
|
802
|
+
type: TableColumnType.Date,
|
|
803
|
+
value: request.endTime,
|
|
804
|
+
}}`);
|
|
805
|
+
/*
|
|
806
|
+
* Read-side retention filter: rows past their per-service retention
|
|
807
|
+
* stay in their part until the whole part drops (ttl_only_drop_parts).
|
|
808
|
+
*/
|
|
809
|
+
statement.append(" AND retentionDate >= now()");
|
|
810
|
+
ProfileAggregationService.appendCommonFilters(statement, request);
|
|
811
|
+
statement.append(SQL ` GROUP BY breakdownValue
|
|
812
|
+
ORDER BY totalSampleCount DESC
|
|
813
|
+
LIMIT ${{
|
|
814
|
+
type: TableColumnType.Number,
|
|
815
|
+
value: ProfileAggregationService.MAX_BREAKDOWN_GROUP_FETCH,
|
|
816
|
+
}}`);
|
|
817
|
+
/*
|
|
818
|
+
* Cap runtime below the client's 58s request_timeout; 'break' yields
|
|
819
|
+
* a partial (top groups) result rather than holding a pool connection.
|
|
820
|
+
*/
|
|
821
|
+
statement.append(getQuerySettings({
|
|
822
|
+
maxExecutionTimeInSeconds: 45,
|
|
823
|
+
timeoutOverflowMode: "break",
|
|
824
|
+
}));
|
|
825
|
+
return statement;
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Shared WHERE-clause tail for ProfileSample reads: optional profileId /
|
|
829
|
+
* time-window filters, the read-side retention filter, and the common
|
|
830
|
+
* service / profile-type filters.
|
|
831
|
+
*/
|
|
832
|
+
static appendSampleFilters(statement, request) {
|
|
833
|
+
if (request.profileId) {
|
|
834
|
+
statement.append(SQL ` AND profileId = ${{
|
|
835
|
+
type: TableColumnType.Text,
|
|
836
|
+
value: request.profileId,
|
|
837
|
+
}}`);
|
|
838
|
+
}
|
|
839
|
+
if (request.startTime) {
|
|
840
|
+
statement.append(SQL ` AND time >= ${{
|
|
841
|
+
type: TableColumnType.Date,
|
|
842
|
+
value: request.startTime,
|
|
843
|
+
}}`);
|
|
844
|
+
}
|
|
845
|
+
if (request.endTime) {
|
|
846
|
+
statement.append(SQL ` AND time <= ${{
|
|
847
|
+
type: TableColumnType.Date,
|
|
848
|
+
value: request.endTime,
|
|
849
|
+
}}`);
|
|
850
|
+
}
|
|
851
|
+
/*
|
|
852
|
+
* Read-side retention filter: rows past their per-service retention
|
|
853
|
+
* stay in their part until the whole part drops (ttl_only_drop_parts).
|
|
854
|
+
*/
|
|
855
|
+
statement.append(" AND retentionDate >= now()");
|
|
856
|
+
ProfileAggregationService.appendCommonFilters(statement, request);
|
|
857
|
+
}
|
|
378
858
|
static appendCommonFilters(statement, request) {
|
|
379
859
|
if (request.serviceIds && request.serviceIds.length > 0) {
|
|
380
|
-
statement.append(SQL ` AND
|
|
860
|
+
statement.append(SQL ` AND primaryEntityId IN (${{
|
|
381
861
|
type: TableColumnType.ObjectID,
|
|
382
862
|
value: new Includes(request.serviceIds.map((id) => {
|
|
383
863
|
return id.toString();
|
|
@@ -436,8 +916,24 @@ export class ProfileAggregationService {
|
|
|
436
916
|
}
|
|
437
917
|
}
|
|
438
918
|
ProfileAggregationService.TABLE_NAME = AnalyticsTableName.ProfileSample;
|
|
919
|
+
ProfileAggregationService.PROFILE_TABLE_NAME = AnalyticsTableName.Profile;
|
|
439
920
|
ProfileAggregationService.DEFAULT_FUNCTION_LIST_LIMIT = 50;
|
|
440
|
-
ProfileAggregationService.
|
|
921
|
+
ProfileAggregationService.DEFAULT_BREAKDOWN_LIMIT = 10;
|
|
922
|
+
/**
|
|
923
|
+
* Cap on unique groups fetched by a breakdown query. Groups are ordered
|
|
924
|
+
* by summed sampleCount, so hitting the cap drops the quietest groups
|
|
925
|
+
* first — totals over the fetched groups stay representative even for
|
|
926
|
+
* pathological high-cardinality attribute keys.
|
|
927
|
+
*/
|
|
928
|
+
ProfileAggregationService.MAX_BREAKDOWN_GROUP_FETCH = 10000;
|
|
929
|
+
/**
|
|
930
|
+
* Cap on unique (stacktrace, frameTypes) groups fetched per query.
|
|
931
|
+
* Sample reads GROUP BY stack identity and ORDER BY summed value, so
|
|
932
|
+
* hitting this cap drops the *smallest* stacks first — truncation is
|
|
933
|
+
* deterministic and barely visible in a flamegraph, unlike a LIMIT over
|
|
934
|
+
* raw unordered sample rows.
|
|
935
|
+
*/
|
|
936
|
+
ProfileAggregationService.MAX_STACK_FETCH = 10000;
|
|
441
937
|
__decorate([
|
|
442
938
|
CaptureSpan(),
|
|
443
939
|
__metadata("design:type", Function),
|
|
@@ -450,6 +946,12 @@ __decorate([
|
|
|
450
946
|
__metadata("design:paramtypes", [Object]),
|
|
451
947
|
__metadata("design:returntype", Promise)
|
|
452
948
|
], ProfileAggregationService, "getFunctionList", null);
|
|
949
|
+
__decorate([
|
|
950
|
+
CaptureSpan(),
|
|
951
|
+
__metadata("design:type", Function),
|
|
952
|
+
__metadata("design:paramtypes", [Object]),
|
|
953
|
+
__metadata("design:returntype", Promise)
|
|
954
|
+
], ProfileAggregationService, "getFunctionFocus", null);
|
|
453
955
|
__decorate([
|
|
454
956
|
CaptureSpan(),
|
|
455
957
|
__metadata("design:type", Function),
|
|
@@ -462,5 +964,11 @@ __decorate([
|
|
|
462
964
|
__metadata("design:paramtypes", [Object]),
|
|
463
965
|
__metadata("design:returntype", Promise)
|
|
464
966
|
], ProfileAggregationService, "getServiceActivity", null);
|
|
967
|
+
__decorate([
|
|
968
|
+
CaptureSpan(),
|
|
969
|
+
__metadata("design:type", Function),
|
|
970
|
+
__metadata("design:paramtypes", [Object]),
|
|
971
|
+
__metadata("design:returntype", Promise)
|
|
972
|
+
], ProfileAggregationService, "getBreakdown", null);
|
|
465
973
|
export default ProfileAggregationService;
|
|
466
974
|
//# sourceMappingURL=ProfileAggregationService.js.map
|