diff --git a/docs/en/api/metrics-query-expression.md b/docs/en/api/metrics-query-expression.md index c1641e01e7e8..95a7d88060ef 100644 --- a/docs/en/api/metrics-query-expression.md +++ b/docs/en/api/metrics-query-expression.md @@ -217,7 +217,15 @@ round(service_cpm / 60 , 2) The different operators could impact the `ExpressionResultType`, please refer to the above table. ## TopN Operation -TopN Operation takes an expression and performs TopN calculation on its results. +TopN Operation takes an expression and performs calculation to get the TopN of Services/Instances/Endpoints. +The result depends on the `entity` condition in the query. +- Global TopN: + - The `entity` is empty. + - The result is the topN Services/Instances/Endpoints in the whole traffics. + - **Notice**: If query the Endpoints metric, the global candidate set could be huge, please use it carefully. +- Service's Instances/Endpoints TopN: + - The `serviceName` in the `entity` is not empty. + - The result is the topN Instances/Endpoints of the service. Expression: ```text @@ -229,7 +237,8 @@ top_n(, , ) `order` is the order of the top results. The value of `order` can be `asc` or `des`. For example: -If we want to query the top 10 services with the highest `service_cpm` metric value, we can use the following expression: +If we want to query the current service's top 10 instances with the highest `service_instance_cpm` metric value, we can use the following expression +under specific service: ```text top_n(service_instance_cpm, 10, des) diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index a82d5e0930b9..e114bca05b79 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -118,6 +118,7 @@ * Support DoubleValue,IntValue,BoolValue in OTEL metrics attributes. * [Break Change] gGRPC metrics exporter unified the metric value type and support labeled metrics. * Add component definition(ID=152) for `c3p0`(JDBC3 Connection and Statement Pooling). +* Fix MQE `top_n` global query. #### UI diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java index d4a26b00ca44..bac6dfbb999b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java @@ -60,8 +60,11 @@ public List sortMetrics(TopNCondition condition, Duration durati final String valueCName = ValueColumnMetadata.INSTANCE.getValueCName(condition.getName()); List additionalConditions = null; if (StringUtil.isNotEmpty(condition.getParentService())) { + if (condition.getNormal() == null) { + return Collections.emptyList(); + } additionalConditions = new ArrayList<>(1); - final String serviceId = IDManager.ServiceID.buildId(condition.getParentService(), condition.isNormal()); + final String serviceId = IDManager.ServiceID.buildId(condition.getParentService(), condition.getNormal()); additionalConditions.add(new KeyValue(InstanceTraffic.SERVICE_ID, serviceId)); } final List selectedRecords = getAggregationQueryDAO().sortMetrics( diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/RecordCondition.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/RecordCondition.java index 45a71b193963..eab7a1de3eba 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/RecordCondition.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/RecordCondition.java @@ -55,7 +55,7 @@ public RecordCondition(TopNCondition condition) { final Entity entity = new Entity(); entity.setScope(condition.getScope() == null ? Scope.Service : condition.getScope()); entity.setServiceName(condition.getParentService()); - entity.setNormal(condition.isNormal()); + entity.setNormal(condition.getNormal()); this.parentEntity = entity; } this.topN = condition.getTopN(); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/TopNCondition.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/TopNCondition.java index 38c250905b39..8ced87aeadb0 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/TopNCondition.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/TopNCondition.java @@ -46,7 +46,7 @@ public class TopNCondition { * Normal service is the service having installed agent or metrics reported directly. Unnormal service is * conjectural service, usually detected by the agent. */ - private boolean normal; + private Boolean normal; /** * Indicate the metrics entity scope. Because this is a top list, don't need to set the Entity like the * MetricsCondition. Only accept scope = {@link Scope#Service} {@link Scope#ServiceInstance} and {@link