From f2360e5efe49dbf7577ad8ef43ff7f5c112a3b73 Mon Sep 17 00:00:00 2001 From: Vijayan Balasubramanian Date: Wed, 11 May 2022 14:58:54 -0700 Subject: [PATCH] Implement ToXContent for UploadStats UploadStats will contain request count and metrics as response. This will be part of StatsNodeResponse. Signed-off-by: Vijayan Balasubramanian --- .../geospatial/stats/upload/UploadStats.java | 28 ++++++++++++++++++- .../stats/upload/UploadStatsTests.java | 20 +++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/opensearch/geospatial/stats/upload/UploadStats.java b/src/main/java/org/opensearch/geospatial/stats/upload/UploadStats.java index 7dd27370..a41389d5 100644 --- a/src/main/java/org/opensearch/geospatial/stats/upload/UploadStats.java +++ b/src/main/java/org/opensearch/geospatial/stats/upload/UploadStats.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Set; @@ -15,14 +16,26 @@ import org.opensearch.common.io.stream.StreamOutput; import org.opensearch.common.io.stream.Writeable; import org.opensearch.common.metrics.CounterMetric; +import org.opensearch.common.xcontent.ToXContentObject; +import org.opensearch.common.xcontent.XContentBuilder; /** * Contains the total upload stats */ -public final class UploadStats implements Writeable { +public final class UploadStats implements Writeable, ToXContentObject { private static final UploadStats instance = new UploadStats(); + public enum FIELDS { + METRICS, + REQUEST_COUNT; + + @Override + public String toString() { + return name().toLowerCase(Locale.getDefault()); + } + } + private final Set metrics; private final CounterMetric totalAPICount; @@ -94,4 +107,17 @@ public void writeTo(StreamOutput output) throws IOException { output.writeVLong(getTotalAPICount()); output.writeCollection(metrics); } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.field(FIELDS.REQUEST_COUNT.toString(), getTotalAPICount()); + builder.startArray(FIELDS.METRICS.toString()); + for (UploadMetric metric : metrics) { + builder.startObject(); + metric.toXContent(builder, params); + builder.endObject(); + } + builder.endArray(); + return builder; + } } diff --git a/src/test/java/org/opensearch/geospatial/stats/upload/UploadStatsTests.java b/src/test/java/org/opensearch/geospatial/stats/upload/UploadStatsTests.java index a067ddaa..273e5f96 100644 --- a/src/test/java/org/opensearch/geospatial/stats/upload/UploadStatsTests.java +++ b/src/test/java/org/opensearch/geospatial/stats/upload/UploadStatsTests.java @@ -6,14 +6,19 @@ package org.opensearch.geospatial.stats.upload; import static org.opensearch.geospatial.GeospatialTestHelper.GEOJSON; +import static org.opensearch.geospatial.GeospatialTestHelper.buildFieldNameValuePair; import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.stream.IntStream; +import org.opensearch.common.Strings; import org.opensearch.common.io.stream.BytesStreamOutput; import org.opensearch.common.io.stream.StreamInput; +import org.opensearch.common.xcontent.ToXContent; +import org.opensearch.common.xcontent.XContentBuilder; +import org.opensearch.common.xcontent.XContentFactory; import org.opensearch.geospatial.GeospatialTestHelper; import org.opensearch.test.OpenSearchTestCase; @@ -82,4 +87,19 @@ public void testStreams() throws IOException { assertEquals("api count is ", stats.getTotalAPICount(), serializedStats.getTotalAPICount()); assertEquals("failed to serialize metrics", stats.getMetrics().size(), serializedStats.getMetrics().size()); } + + public void testToXContent() throws IOException { + UploadStats stats = UploadStatsBuilder.randomUploadStats(); + XContentBuilder statsContent = XContentFactory.jsonBuilder().startObject(); + String statsAsString = Strings.toString(stats.toXContent(statsContent, ToXContent.EMPTY_PARAMS).endObject()); + assertNotNull(statsAsString); + assertTrue(statsAsString.contains(buildFieldNameValuePair(UploadStats.FIELDS.REQUEST_COUNT.toString(), stats.getTotalAPICount()))); + stats.getMetrics().forEach(uploadMetric -> { + assertTrue(statsAsString.contains(buildFieldNameValuePair(UploadMetric.FIELDS.TYPE, GEOJSON))); + assertTrue(statsAsString.contains(buildFieldNameValuePair(UploadMetric.FIELDS.UPLOAD, uploadMetric.getUploadCount()))); + assertTrue(statsAsString.contains(buildFieldNameValuePair(UploadMetric.FIELDS.DURATION, uploadMetric.getDuration()))); + assertTrue(statsAsString.contains(buildFieldNameValuePair(UploadMetric.FIELDS.FAILED, uploadMetric.getFailedCount()))); + assertTrue(statsAsString.contains(buildFieldNameValuePair(UploadMetric.FIELDS.SUCCESS, uploadMetric.getSuccessCount()))); + }); + } }