This is an automated email from the ASF dual-hosted git repository.

tkalkirill pushed a commit to branch ignite-26036
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/ignite-26036 by this push:
     new 3c2da078310 IGNITE-26036 wip
3c2da078310 is described below

commit 3c2da0783103008bd768b983c0fd24cd597107a0
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Tue Jul 29 11:55:18 2025 +0300

    IGNITE-26036 wip
---
 .../ignite/internal/cli/CliIntegrationTest.java    |  8 +++++++-
 .../metric/ItClusterMetricCommandTest.java         | 23 +++++++++++++++++++---
 .../rest/metrics/ClusterMetricController.java      | 12 +++++++++--
 .../rest/metrics/NodeMetricController.java         | 14 +++++++++----
 4 files changed, 47 insertions(+), 10 deletions(-)

diff --git 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/CliIntegrationTest.java
 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/CliIntegrationTest.java
index 69a19ee0989..974d2fe5504 100644
--- 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/CliIntegrationTest.java
+++ 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/CliIntegrationTest.java
@@ -104,7 +104,7 @@ public abstract class CliIntegrationTest extends 
ClusterPerClassIntegrationTest
 
     private CommandLine cmd;
 
-    private StringWriter sout;
+    public StringWriter sout;
 
     private StringWriter serr;
 
@@ -292,6 +292,12 @@ public abstract class CliIntegrationTest extends 
ClusterPerClassIntegrationTest
                 .isEmpty();
     }
 
+    protected void assertOutputContainsSubsequence(Iterable<String> 
substrings) {
+        assertThat(sout.toString())
+                .as("Expected command output will contain the substrings in 
the given order")
+                .containsSubsequence(substrings);
+    }
+
     protected void assertErrOutputIsNotEmpty() {
         assertThat(serr.toString())
                 .as("Expected command error output not to be empty")
diff --git 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/metric/ItClusterMetricCommandTest.java
 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/metric/ItClusterMetricCommandTest.java
index 78ee7e7c35e..d9e76e4edf8 100644
--- 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/metric/ItClusterMetricCommandTest.java
+++ 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/commands/metric/ItClusterMetricCommandTest.java
@@ -17,13 +17,16 @@
 
 package org.apache.ignite.internal.cli.commands.metric;
 
+import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertAll;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Stream;
+import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.cli.CliIntegrationTest;
 import org.apache.ignite.internal.metrics.MetricSource;
 import org.junit.jupiter.api.Test;
@@ -79,15 +82,29 @@ class ItClusterMetricCommandTest extends CliIntegrationTest 
{
         execute("cluster", "metric", "source", "list", "--plain", "--url", 
NODE_URL);
 
         // Then
-        List<Executable> assertions = new ArrayList<>();
+        List<String> sourceNames = Arrays.stream(ALL_METRIC_SOURCES)
+                
.map(org.apache.ignite.rest.client.model.MetricSource::getName).sorted()
+                .collect(toList());
+
+        List<String> nodeNames = CLUSTER.nodes().stream()
+                .map(Ignite::name)
+                .sorted()
+                .collect(toList());
+
+        var assertions = new ArrayList<Executable>();
+
         assertions.add(this::assertExitCodeIsZero);
         assertions.add(this::assertErrOutputIsEmpty);
         assertions.add(() -> assertOutputContains("Node\tSource 
name\tAvailability"));
-        for (org.apache.ignite.rest.client.model.MetricSource source : 
ALL_METRIC_SOURCES) {
-            assertions.add(() -> assertOutputContains(source.getName() + 
"\tenabled" + NL));
+        for (String sourceName : sourceNames) {
+            assertions.add(() -> assertOutputContains(sourceName + "\tenabled" 
+ NL));
         }
         // Header + number of nodes * (node name header + metric sources)
         assertions.add(() -> assertOutputHasLineCount(1 + initialNodes() * 
(ALL_METRIC_SOURCES.length + 1)));
+        // Let's check that the substrings are in the correct order.
+        assertions.add(() -> assertOutputContainsSubsequence(nodeNames));
+        assertions.add(() -> assertOutputContainsSubsequence(sourceNames));
+
         assertAll(assertions);
     }
 
diff --git 
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/ClusterMetricController.java
 
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/ClusterMetricController.java
index 867930f1173..d0a8d2f0cd0 100644
--- 
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/ClusterMetricController.java
+++ 
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/ClusterMetricController.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.internal.util.ExceptionUtils.sneakyThrow;
 
 import io.micronaut.http.annotation.Controller;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -62,11 +63,18 @@ public class ClusterMetricController implements 
ClusterMetricApi, ResourceHolder
     }
 
     private static List<NodeMetricSources> fromDto(Map<String, 
Collection<MetricSourceDto>> sources) {
-        return 
sources.entrySet().stream().map(ClusterMetricController::fromDto).collect(toList());
+        return sources.entrySet().stream()
+                .map(ClusterMetricController::fromDto)
+                .sorted(Comparator.comparing(NodeMetricSources::node))
+                .collect(toList());
     }
 
     private static NodeMetricSources fromDto(Entry<String, 
Collection<MetricSourceDto>> entry) {
-        List<MetricSource> sources = 
entry.getValue().stream().map(ClusterMetricController::fromDto).collect(toList());
+        List<MetricSource> sources = entry.getValue().stream()
+                .map(ClusterMetricController::fromDto)
+                .sorted(Comparator.comparing(MetricSource::name))
+                .collect(toList());
+
         return new NodeMetricSources(entry.getKey(), sources);
     }
 
diff --git 
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
 
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
index 600fa5d38db..ee70038b052 100644
--- 
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
+++ 
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
@@ -17,10 +17,12 @@
 
 package org.apache.ignite.internal.rest.metrics;
 
+import static java.util.stream.Collectors.toList;
+
 import io.micronaut.http.annotation.Controller;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.List;
-import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 import org.apache.ignite.internal.metrics.MetricManager;
 import org.apache.ignite.internal.rest.ResourceHolder;
@@ -61,7 +63,8 @@ public class NodeMetricController implements NodeMetricApi, 
ResourceHolder {
     public Collection<MetricSource> listMetricSources() {
         return metricManager.metricSources().stream()
                 .map(source -> new MetricSource(source.name(), 
source.enabled()))
-                .collect(Collectors.toList());
+                .sorted(Comparator.comparing(MetricSource::name))
+                .collect(toList());
     }
 
     @Override
@@ -70,10 +73,13 @@ public class NodeMetricController implements NodeMetricApi, 
ResourceHolder {
                 .map(metricSet -> {
                     List<Metric> metricDtos = 
StreamSupport.stream(metricSet.spliterator(), false)
                             .map(metric -> new Metric(metric.name(), 
metric.description()))
-                            .collect(Collectors.toList());
+                            .sorted(Comparator.comparing(Metric::name))
+                            .collect(toList());
+
                     return new MetricSet(metricSet.name(), metricDtos);
                 })
-                .collect(Collectors.toList());
+                .sorted(Comparator.comparing(MetricSet::name))
+                .collect(toList());
     }
 
     @Override

Reply via email to