From 0ab2bcce049028d52a52807e6ff0a5e086e3e3b7 Mon Sep 17 00:00:00 2001 From: Apoorv Mittal Date: Tue, 5 May 2020 13:02:53 +0530 Subject: [PATCH] Added getters for configs, labels for distribution metric. (#15) * Added getters for configs, labels for distribution metric. * Addressed review comments * Removed extra brackets in JsonProperty. --- .../OpenCensusProtobufInputRowParser.java | 45 ++++- .../OpenCensusProtobufInputRowParserTest.java | 178 +++++++++++++----- 2 files changed, 173 insertions(+), 50 deletions(-) diff --git a/extensions-contrib/opencensus-extensions/src/main/java/org/apache/druid/data/input/opencensus/protobuf/OpenCensusProtobufInputRowParser.java b/extensions-contrib/opencensus-extensions/src/main/java/org/apache/druid/data/input/opencensus/protobuf/OpenCensusProtobufInputRowParser.java index 47d7f26c11bf..1676e82abb03 100644 --- a/extensions-contrib/opencensus-extensions/src/main/java/org/apache/druid/data/input/opencensus/protobuf/OpenCensusProtobufInputRowParser.java +++ b/extensions-contrib/opencensus-extensions/src/main/java/org/apache/druid/data/input/opencensus/protobuf/OpenCensusProtobufInputRowParser.java @@ -43,6 +43,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -85,6 +86,24 @@ public ParseSpec getParseSpec() return parseSpec; } + @JsonProperty + public String getMetricDimension() + { + return metricDimension; + } + + @JsonProperty + public String getMetricLabelPrefix() + { + return metricLabelPrefix; + } + + @JsonProperty + public String getResourceLabelPrefix() + { + return resourceLabelPrefix; + } + @Override public OpenCensusProtobufInputRowParser withParseSpec(ParseSpec parseSpec) { @@ -113,7 +132,7 @@ public List parseBatch(ByteBuffer input) .collect(Collectors.toList()); // Process resource labels map. - Map resourceLabelsMap = metric.getResource().getLabelsMap().entrySet().stream() + Map resourceLabelsMap = metric.getResource().getLabelsMap().entrySet().stream() .collect(Collectors.toMap(entry -> this.resourceLabelPrefix + entry.getKey(), Map.Entry::getValue)); @@ -190,12 +209,14 @@ public List parseBatch(ByteBuffer input) case DISTRIBUTION_VALUE: // count Map distCount = new HashMap<>(); + distCount.putAll(labels); distCount.put(metricDimension, metric.getMetricDescriptor().getName() + SEPARATOR + "count"); distCount.put(VALUE, point.getDistributionValue().getCount()); addDerivedMetricsRow(distCount, dimensions, rows); // sum Map distSum = new HashMap<>(); + distSum.putAll(labels); distSum.put(metricDimension, metric.getMetricDescriptor().getName() + SEPARATOR + "sum"); distSum.put(VALUE, point.getDistributionValue().getSum()); addDerivedMetricsRow(distSum, dimensions, rows); @@ -218,4 +239,26 @@ private void addDerivedMetricsRow(Map derivedMetrics, List rows = parser.parseBatch(ByteBuffer.wrap(out.toByteArray())); + + Assert.assertEquals(2, rows.size()); + + InputRow row = rows.get(0); + Assert.assertEquals(dateTime.getMillis(), row.getTimestampFromEpoch()); + assertDimensionEquals(row, "name", "metric_distribution-count"); + assertDimensionEquals(row, "foo_key", "foo_value"); + Assert.assertEquals(100, row.getMetric("value").intValue()); + + row = rows.get(1); + Assert.assertEquals(dateTime.getMillis(), row.getTimestampFromEpoch()); + assertDimensionEquals(row, "name", "metric_distribution-sum"); + assertDimensionEquals(row, "foo_key", "foo_value"); + Assert.assertEquals(500, row.getMetric("value").doubleValue(), 0.0); } @Test @@ -302,6 +358,20 @@ public void testCustomPrefix() throws Exception assertDimensionEquals(row, "custom.env_key", "env_val"); } + @Test + public void testSerde() throws Exception + { + OpenCensusProtobufInputRowParser parser = new OpenCensusProtobufInputRowParser(parseSpec, "metric.name", "descriptor.", "custom."); + + final ObjectMapper jsonMapper = new ObjectMapper(); + jsonMapper.registerModules(new OpenCensusProtobufExtensionsModule().getJacksonModules()); + + Assert.assertEquals(parser, jsonMapper.readValue( + jsonMapper.writeValueAsString(parser), + ByteBufferInputRowParser.class + )); + } + private void assertDimensionEquals(InputRow row, String dimension, Object expected) { List values = row.getDimension(dimension); @@ -312,43 +382,29 @@ private void assertDimensionEquals(InputRow row, String dimension, Object expect private Metric doubleGaugeMetric(Timestamp timestamp) { - Metric dist = Metric.newBuilder() - .setMetricDescriptor( - MetricDescriptor.newBuilder() - .setName("metric_gauge_double") - .setDescription("metric_gauge_double_description") - .setUnit("ms") - .setType( - MetricDescriptor.Type.GAUGE_DOUBLE) - .addLabelKeys( - LabelKey.newBuilder() - .setKey("foo_key") - .build()) - .build()) - .setResource( - Resource.newBuilder() - .setType("env") - .putAllLabels(Collections.singletonMap("env_key", "env_val")) - .build()) - .addTimeseries( - TimeSeries.newBuilder() - .setStartTimestamp(timestamp) - .addLabelValues( - LabelValue.newBuilder() - .setHasValue(true) - .setValue("foo_value") - .build()) - .addPoints( - Point.newBuilder() - .setTimestamp(timestamp) - .setDoubleValue(2000) - .build()) - .build()) - .build(); - - return dist; + return getMetric( + "metric_gauge_double", + "metric_gauge_double_description", + Type.GAUGE_DOUBLE, + Point.newBuilder() + .setTimestamp(timestamp) + .setDoubleValue(2000) + .build(), + timestamp); } + private Metric intGaugeMetric(Timestamp timestamp) + { + return getMetric( + "metric_gauge_int64", + "metric_gauge_int64_description", + MetricDescriptor.Type.GAUGE_INT64, + Point.newBuilder() + .setTimestamp(timestamp) + .setInt64Value(1000) + .build(), + timestamp); + } private Metric summaryMetric(Timestamp timestamp) { @@ -387,15 +443,44 @@ private Metric summaryMetric(Timestamp timestamp) .setSnapshot(snapshot) .build(); + return getMetric( + "metric_summary", + "metric_summary_description", + MetricDescriptor.Type.SUMMARY, + Point.newBuilder() + .setTimestamp(timestamp) + .setSummaryValue(summaryValue) + .build(), + timestamp); + } + + private Metric distributionMetric(Timestamp timestamp) + { + DistributionValue distributionValue = DistributionValue.newBuilder() + .setCount(100) + .setSum(500) + .build(); + return getMetric( + "metric_distribution", + "metric_distribution_description", + MetricDescriptor.Type.GAUGE_DISTRIBUTION, + Point.newBuilder() + .setTimestamp(timestamp) + .setDistributionValue(distributionValue) + .build(), + timestamp); + } + + private Metric getMetric(String name, String description, MetricDescriptor.Type type, Point point, Timestamp timestamp) + { Metric dist = Metric.newBuilder() .setMetricDescriptor( MetricDescriptor.newBuilder() - .setName("metric_summary") - .setDescription("metric_summary_description") + .setName(name) + .setDescription(description) .setUnit("ms") - .setType( - MetricDescriptor.Type.SUMMARY) + .setType(type) .addLabelKeys( LabelKey.newBuilder() .setKey("foo_key") @@ -414,16 +499,11 @@ private Metric summaryMetric(Timestamp timestamp) .setHasValue(true) .setValue("foo_value") .build()) - .addPoints( - Point.newBuilder() - .setTimestamp(timestamp) - .setSummaryValue(summaryValue) - .build()) + .addPoints(point) .build()) .build(); return dist; } - }