From 4674900c8f7b54ea0cee1729a9dde39e9f31f7d5 Mon Sep 17 00:00:00 2001 From: Russell Gold Date: Tue, 17 Jan 2023 16:08:32 -0500 Subject: [PATCH 1/2] Enhance string metrics to include the actual value --- .../wls/exporter/domain/MetricsScraper.java | 91 ++++++++++++------- .../wls/exporter/ExporterServletTest.java | 12 +-- .../exporter/domain/MetricsScraperTest.java | 10 +- 3 files changed, 67 insertions(+), 46 deletions(-) diff --git a/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java b/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java index db3fe2db..4a323793 100644 --- a/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java +++ b/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java @@ -1,17 +1,17 @@ -// Copyright (c) 2017, 2022, Oracle and/or its affiliates. +// Copyright (c) 2017, 2023, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package com.oracle.wls.exporter.domain; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - import static com.oracle.wls.exporter.domain.MapUtils.isNullOrEmptyString; /** @@ -134,42 +134,63 @@ private String asQuotedString(JsonElement jsonElement) { } private void addMetric(String itemQualifiers, String valueName, JsonElement value) { - if (value != null && value.isJsonPrimitive()) { - addMetric(itemQualifiers, valueName, value.getAsJsonPrimitive()); - } + new ScrapedMetric(itemQualifiers, valueName, value).add(); } - private void addMetric(String itemQualifiers, String valueName, JsonPrimitive jsonPrimitive) { - Optional.ofNullable(getMetricValue(valueName, jsonPrimitive)) - .ifPresent(value -> addMetric(getMetricName(itemQualifiers, valueName), value)); - } - private void addMetric(String metricName, Object value) { - metrics.put(metricName, value); - } + class ScrapedMetric { + private final JsonPrimitive jsonPrimitive; + String itemQualifiers; + String valueName; - private Object getMetricValue(String valueName, JsonPrimitive jsonPrimitive) { - if (jsonPrimitive.isNumber()) - return jsonPrimitive.getAsNumber(); - else if (selector.isStringMetric(valueName) && jsonPrimitive.isString()) - return selector.getStringMetricValue(valueName, jsonPrimitive.getAsString()); - else if (selector.acceptsStrings() && jsonPrimitive.isString()) - return jsonPrimitive.getAsString(); - else - return null; - } + ScrapedMetric(String itemQualifiers, String valueName, JsonElement value) { + this.itemQualifiers = itemQualifiers; + this.valueName = valueName; - private String getMetricName(String itemQualifiers, String valueName) { - StringBuilder sb = new StringBuilder(); - if (selector.getPrefix() != null) sb.append(getCorrectCase(selector.getPrefix())); - sb.append(getCorrectCase(valueName)); - if (!isNullOrEmptyString(itemQualifiers)) - sb.append('{').append(itemQualifiers).append('}'); - return sb.toString(); - } + this.jsonPrimitive = Optional.ofNullable(value) + .filter(JsonElement::isJsonPrimitive) + .map(JsonElement::getAsJsonPrimitive) + .orElse(null); + } + + void add() { + Optional.ofNullable(jsonPrimitive).map(this::toMetricValue).ifPresent(v -> metrics.put(getMetricName(), v)); + } - private String getCorrectCase(String valueName) { - return metricNameSnakeCase ? SnakeCaseUtil.convert(valueName) : valueName; + private Object toMetricValue(JsonPrimitive jsonPrimitive) { + if (jsonPrimitive.isNumber()) + return jsonPrimitive.getAsNumber(); + else if (isStringMetric()) + return selector.getStringMetricValue(valueName, jsonPrimitive.getAsString()); + else if (selector.acceptsStrings() && jsonPrimitive.isString()) + return jsonPrimitive.getAsString(); + else + return null; + } + + private boolean isStringMetric() { + return selector.isStringMetric(valueName) && jsonPrimitive.isString(); + } + + private String getMetricName() { + StringBuilder sb = new StringBuilder(); + if (selector.getPrefix() != null) sb.append(getCorrectCase(selector.getPrefix())); + sb.append(getCorrectCase(valueName)); + if (!isNullOrEmptyString(itemQualifiers)) + sb.append('{').append(augmented(itemQualifiers)).append('}'); + return sb.toString(); + } + + private String getCorrectCase(String valueName) { + return metricNameSnakeCase ? SnakeCaseUtil.convert(valueName) : valueName; + } + + private String augmented(String itemQualifiers) { + if (isStringMetric()) + return itemQualifiers + ",value=\"" + jsonPrimitive.getAsString() + '"'; + else + return itemQualifiers; + } } } diff --git a/wls-exporter-core/src/test/java/com/oracle/wls/exporter/ExporterServletTest.java b/wls-exporter-core/src/test/java/com/oracle/wls/exporter/ExporterServletTest.java index adff930c..dc568c1b 100644 --- a/wls-exporter-core/src/test/java/com/oracle/wls/exporter/ExporterServletTest.java +++ b/wls-exporter-core/src/test/java/com/oracle/wls/exporter/ExporterServletTest.java @@ -353,12 +353,12 @@ void onGetWithStringValues_displayMetrics() throws Exception { servlet.doGet(request, this.response); - assertThat(toHtml(this.response), containsString("color{name=\"fred\"} 0")); - assertThat(toHtml(this.response), containsString("color{name=\"george\"} 1")); - assertThat(toHtml(this.response), containsString("color{name=\"ron\"} -1")); - assertThat(toHtml(this.response), containsString("size{name=\"fred\"} 0")); - assertThat(toHtml(this.response), containsString("size{name=\"george\"} 1")); - assertThat(toHtml(this.response), containsString("size{name=\"ron\"} 2")); + assertThat(toHtml(this.response), containsString("color{name=\"fred\",value=\"red\"} 0")); + assertThat(toHtml(this.response), containsString("color{name=\"george\",value=\"green\"} 1")); + assertThat(toHtml(this.response), containsString("color{name=\"ron\",value=\"blue\"} -1")); + assertThat(toHtml(this.response), containsString("size{name=\"fred\",value=\"tall\"} 0")); + assertThat(toHtml(this.response), containsString("size{name=\"george\",value=\"grande\"} 1")); + assertThat(toHtml(this.response), containsString("size{name=\"ron\",value=\"venti\"} 2")); } private Map getStringResponseMap() { diff --git a/wls-exporter-core/src/test/java/com/oracle/wls/exporter/domain/MetricsScraperTest.java b/wls-exporter-core/src/test/java/com/oracle/wls/exporter/domain/MetricsScraperTest.java index e5f524bf..e00bb6fd 100644 --- a/wls-exporter-core/src/test/java/com/oracle/wls/exporter/domain/MetricsScraperTest.java +++ b/wls-exporter-core/src/test/java/com/oracle/wls/exporter/domain/MetricsScraperTest.java @@ -1,4 +1,4 @@ -// Copyright (c) 2017, 2022, Oracle and/or its affiliates. +// Copyright (c) 2017, 2023, Oracle and/or its affiliates. // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. package com.oracle.wls.exporter.domain; @@ -202,13 +202,13 @@ private ImmutableMap getAllValuesServletsMap() { } @Test - void whenStringValuesSpecified_generateEnumeration() { + void whenStringValuesSpecified_generateEnumerationAndQualifier() { generateNestedMetrics(getStringValuedServletsMap(), SERVLET_RESPONSE); assertThat(scraper.getMetrics(), - allOf(hasMetric("servlet_state{servletName=\"JspServlet\"}", 1), - hasMetric("servlet_state{servletName=\"FileServlet\"}", 0), - hasMetric("servlet_state{servletName=\"ready\"}", 2))); + allOf(hasMetric("servlet_state{servletName=\"JspServlet\",value=\"running\"}", 1), + hasMetric("servlet_state{servletName=\"FileServlet\",value=\"stopped\"}", 0), + hasMetric("servlet_state{servletName=\"ready\",value=\"confused\"}", 2))); } private ImmutableMap getStringValuedServletsMap() { From 04925257a0cd81ddc3a592c361093938c8bcdd0d Mon Sep 17 00:00:00 2001 From: Russell Gold Date: Tue, 17 Jan 2023 18:56:12 -0500 Subject: [PATCH 2/2] minor code cleanup --- .../wls/exporter/domain/MetricsScraper.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java b/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java index 4a323793..8162219b 100644 --- a/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java +++ b/wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java @@ -100,16 +100,21 @@ private String[] getKeysAsArray() { private void scrapeItem() { if (excludeByType()) return; - String itemQualifiers = getItemQualifiers(); + final String itemQualifiers = getItemQualifiers(); for (String valueName : getValueNames()) { - if (valueName.equals(selector.getKey())) continue; - JsonElement value = object.get(valueName); - addMetric(itemQualifiers, valueName, value); + scrapeValue(itemQualifiers, valueName); } + scrapeSubObjects(itemQualifiers); } + private void scrapeValue(String itemQualifiers, String valueName) { + if (valueName.equals(selector.getKey())) return; + + new ScrapedMetric(itemQualifiers, valueName).add(); + } + private boolean excludeByType() { final JsonElement typeField = object.get("type"); final String typeFilter = selector.getType(); @@ -133,21 +138,17 @@ private String asQuotedString(JsonElement jsonElement) { return QUOTE + jsonElement.getAsString() + QUOTE; } - private void addMetric(String itemQualifiers, String valueName, JsonElement value) { - new ScrapedMetric(itemQualifiers, valueName, value).add(); - } - class ScrapedMetric { + private final String itemQualifiers; + private final String valueName; private final JsonPrimitive jsonPrimitive; - String itemQualifiers; - String valueName; - ScrapedMetric(String itemQualifiers, String valueName, JsonElement value) { + ScrapedMetric(String itemQualifiers, String valueName) { this.itemQualifiers = itemQualifiers; this.valueName = valueName; - this.jsonPrimitive = Optional.ofNullable(value) + this.jsonPrimitive = Optional.ofNullable(object.get(valueName)) .filter(JsonElement::isJsonPrimitive) .map(JsonElement::getAsJsonPrimitive) .orElse(null);