This is an automated email from the ASF dual-hosted git repository. namelchev pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new 2428b23a8d1 IGNITE-21105 Added histogram bounds to the metric command output (#11106) 2428b23a8d1 is described below commit 2428b23a8d135c81d6c042c18742bc10dbbeec8d Author: Anastasia Iakimova <94782753+nastya...@users.noreply.github.com> AuthorDate: Wed Dec 20 19:25:51 2023 +0300 IGNITE-21105 Added histogram bounds to the metric command output (#11106) --- .../org/apache/ignite/util/MetricCommandTest.java | 16 +++++++++--- .../internal/management/metric/MetricTask.java | 30 +++++++++++++++++++--- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java index 83ad568fdbe..51c883fb03a 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java @@ -27,6 +27,7 @@ import org.apache.ignite.internal.management.metric.MetricCommand; import org.apache.ignite.internal.processors.metric.MetricRegistry; import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl; import org.apache.ignite.internal.processors.metric.impl.HitRateMetric; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; import org.junit.Test; @@ -37,6 +38,7 @@ import static org.apache.ignite.internal.management.SystemViewCommand.COLUMN_SEP import static org.apache.ignite.internal.processors.metric.GridMetricManager.IGNITE_METRICS; import static org.apache.ignite.internal.processors.metric.GridMetricManager.SYS_METRICS; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.SEPARATOR; +import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.histogramBucketNames; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; import static org.apache.ignite.testframework.GridTestUtils.assertContains; import static org.apache.ignite.util.SystemViewCommandTest.NODE_ID; @@ -256,12 +258,20 @@ public class MetricCommandTest extends GridCommandHandlerClusterByClassAbstractT assertEquals("1", metric(ignite0, metricName(mregName, "histogram_0_50"))); assertEquals("2", metric(ignite0, metricName(mregName, "histogram_50_500"))); assertEquals("3", metric(ignite0, metricName(mregName, "histogram_500_inf"))); - assertEquals("[1, 2, 3]", metric(ignite0, metricName(mregName, "histogram"))); assertEquals("1", metric(ignite0, metricName(mregName, "histogram_with_underscore_0_50"))); assertEquals("2", metric(ignite0, metricName(mregName, "histogram_with_underscore_50_500"))); assertEquals("3", metric(ignite0, metricName(mregName, "histogram_with_underscore_500_inf"))); - assertEquals("[1, 2, 3]", metric(ignite0, metricName(mregName, "histogram_with_underscore"))); + + Map<String, String> expHistOut = F.asMap(histogram.name(), "[1, 2, 3]"); + + String[] names = histogramBucketNames(histogram); + + for (int i = 0; i < names.length; i++) + expHistOut.put(names[i], String.valueOf(histogram.value()[i])); + + assertEqualsMaps(expHistOut, metrics(ignite0, histogram.name())); + assertTrue(metrics(ignite0, mregName).entrySet().containsAll(expHistOut.entrySet())); } /** */ @@ -448,7 +458,7 @@ public class MetricCommandTest extends GridCommandHandlerClusterByClassAbstractT */ private String metric(IgniteEx node, String name) { Map<String, String> metrics = metrics(node, name); - + assertEquals(1, metrics.size()); return metrics.get(name); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/metric/MetricTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/metric/MetricTask.java index 570a5c4dc63..c06b0f55709 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/metric/MetricTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/metric/MetricTask.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.management.metric; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; @@ -29,6 +29,7 @@ import org.apache.ignite.internal.visor.VisorJob; import org.apache.ignite.internal.visor.VisorOneNodeTask; import org.apache.ignite.spi.metric.BooleanMetric; import org.apache.ignite.spi.metric.DoubleMetric; +import org.apache.ignite.spi.metric.HistogramMetric; import org.apache.ignite.spi.metric.IntMetric; import org.apache.ignite.spi.metric.LongMetric; import org.apache.ignite.spi.metric.Metric; @@ -37,6 +38,7 @@ import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.SEPARATOR; +import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.histogramBucketNames; import static org.apache.ignite.spi.metric.jmx.MetricRegistryMBean.searchHistogram; /** Reperesents visor task for obtaining metric values. */ @@ -92,9 +94,9 @@ public class MetricTask extends VisorOneNodeTask<MetricCommandArg, Map<String, ? String mregName = mreg.name(); if (mregName.equals(name)) { - Map<String, Object> res = new HashMap<>(); + Map<String, Object> res = new LinkedHashMap<>(); - mreg.forEach(metric -> res.put(metric.name(), valueOf(metric))); + mreg.forEach(metric -> res.putAll(exportMetric(metric))); return res; } @@ -112,7 +114,7 @@ public class MetricTask extends VisorOneNodeTask<MetricCommandArg, Map<String, ? Metric metric = mreg.findMetric(metricName); if (metric != null) - return Collections.singletonMap(name, valueOf(metric)); + return exportMetric(metric); Object val = searchHistogram(metricName, mreg); @@ -143,5 +145,25 @@ public class MetricTask extends VisorOneNodeTask<MetricCommandArg, Map<String, ? throw new IllegalArgumentException("Unknown metric class [class=" + metric.getClass() + ']'); } + + /** @return The metric value prepared to output. */ + private Map<String, Object> exportMetric(Metric metric) { + if (metric instanceof HistogramMetric) { + HistogramMetric hist = (HistogramMetric)metric; + String[] names = histogramBucketNames(hist); + + Map<String, Object> res = new LinkedHashMap<>(); + + for (int i = 0; i < names.length; i++) + res.put(names[i], hist.value()[i]); + + // For compatibility with old output. + res.put(metric.name(), valueOf(metric)); + + return res; + } + + return Collections.singletonMap(metric.name(), valueOf(metric)); + } } }