Skip to content

Commit cfde1ed

Browse files
authored
Enhance string metrics to include the actual value (#249)
1 parent 76b67b6 commit cfde1ed

File tree

3 files changed

+73
-51
lines changed

3 files changed

+73
-51
lines changed

wls-exporter-core/src/main/java/com/oracle/wls/exporter/domain/MetricsScraper.java

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
// Copyright (c) 2017, 2022, Oracle and/or its affiliates.
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates.
22
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
package com.oracle.wls.exporter.domain;
55

6+
import java.util.HashMap;
7+
import java.util.Map;
8+
import java.util.Optional;
9+
610
import com.google.gson.JsonArray;
711
import com.google.gson.JsonElement;
812
import com.google.gson.JsonObject;
913
import com.google.gson.JsonPrimitive;
1014

11-
import java.util.HashMap;
12-
import java.util.Map;
13-
import java.util.Optional;
14-
1515
import static com.oracle.wls.exporter.domain.MapUtils.isNullOrEmptyString;
1616

1717
/**
@@ -100,16 +100,21 @@ private String[] getKeysAsArray() {
100100

101101
private void scrapeItem() {
102102
if (excludeByType()) return;
103-
String itemQualifiers = getItemQualifiers();
103+
final String itemQualifiers = getItemQualifiers();
104104

105105
for (String valueName : getValueNames()) {
106-
if (valueName.equals(selector.getKey())) continue;
107-
JsonElement value = object.get(valueName);
108-
addMetric(itemQualifiers, valueName, value);
106+
scrapeValue(itemQualifiers, valueName);
109107
}
108+
110109
scrapeSubObjects(itemQualifiers);
111110
}
112111

112+
private void scrapeValue(String itemQualifiers, String valueName) {
113+
if (valueName.equals(selector.getKey())) return;
114+
115+
new ScrapedMetric(itemQualifiers, valueName).add();
116+
}
117+
113118
private boolean excludeByType() {
114119
final JsonElement typeField = object.get("type");
115120
final String typeFilter = selector.getType();
@@ -133,43 +138,60 @@ private String asQuotedString(JsonElement jsonElement) {
133138
return QUOTE + jsonElement.getAsString() + QUOTE;
134139
}
135140

136-
private void addMetric(String itemQualifiers, String valueName, JsonElement value) {
137-
if (value != null && value.isJsonPrimitive()) {
138-
addMetric(itemQualifiers, valueName, value.getAsJsonPrimitive());
141+
142+
class ScrapedMetric {
143+
private final String itemQualifiers;
144+
private final String valueName;
145+
private final JsonPrimitive jsonPrimitive;
146+
147+
ScrapedMetric(String itemQualifiers, String valueName) {
148+
this.itemQualifiers = itemQualifiers;
149+
this.valueName = valueName;
150+
151+
this.jsonPrimitive = Optional.ofNullable(object.get(valueName))
152+
.filter(JsonElement::isJsonPrimitive)
153+
.map(JsonElement::getAsJsonPrimitive)
154+
.orElse(null);
139155
}
140-
}
141156

142-
private void addMetric(String itemQualifiers, String valueName, JsonPrimitive jsonPrimitive) {
143-
Optional.ofNullable(getMetricValue(valueName, jsonPrimitive))
144-
.ifPresent(value -> addMetric(getMetricName(itemQualifiers, valueName), value));
145-
}
157+
void add() {
158+
Optional.ofNullable(jsonPrimitive).map(this::toMetricValue).ifPresent(v -> metrics.put(getMetricName(), v));
159+
}
146160

147-
private void addMetric(String metricName, Object value) {
148-
metrics.put(metricName, value);
149-
}
161+
private Object toMetricValue(JsonPrimitive jsonPrimitive) {
162+
if (jsonPrimitive.isNumber())
163+
return jsonPrimitive.getAsNumber();
164+
else if (isStringMetric())
165+
return selector.getStringMetricValue(valueName, jsonPrimitive.getAsString());
166+
else if (selector.acceptsStrings() && jsonPrimitive.isString())
167+
return jsonPrimitive.getAsString();
168+
else
169+
return null;
170+
}
150171

151-
private Object getMetricValue(String valueName, JsonPrimitive jsonPrimitive) {
152-
if (jsonPrimitive.isNumber())
153-
return jsonPrimitive.getAsNumber();
154-
else if (selector.isStringMetric(valueName) && jsonPrimitive.isString())
155-
return selector.getStringMetricValue(valueName, jsonPrimitive.getAsString());
156-
else if (selector.acceptsStrings() && jsonPrimitive.isString())
157-
return jsonPrimitive.getAsString();
158-
else
159-
return null;
160-
}
172+
private boolean isStringMetric() {
173+
return selector.isStringMetric(valueName) && jsonPrimitive.isString();
174+
}
161175

162-
private String getMetricName(String itemQualifiers, String valueName) {
163-
StringBuilder sb = new StringBuilder();
164-
if (selector.getPrefix() != null) sb.append(getCorrectCase(selector.getPrefix()));
165-
sb.append(getCorrectCase(valueName));
166-
if (!isNullOrEmptyString(itemQualifiers))
167-
sb.append('{').append(itemQualifiers).append('}');
168-
return sb.toString();
169-
}
176+
private String getMetricName() {
177+
StringBuilder sb = new StringBuilder();
178+
if (selector.getPrefix() != null) sb.append(getCorrectCase(selector.getPrefix()));
179+
sb.append(getCorrectCase(valueName));
180+
if (!isNullOrEmptyString(itemQualifiers))
181+
sb.append('{').append(augmented(itemQualifiers)).append('}');
182+
return sb.toString();
183+
}
170184

171-
private String getCorrectCase(String valueName) {
172-
return metricNameSnakeCase ? SnakeCaseUtil.convert(valueName) : valueName;
185+
private String getCorrectCase(String valueName) {
186+
return metricNameSnakeCase ? SnakeCaseUtil.convert(valueName) : valueName;
187+
}
188+
189+
private String augmented(String itemQualifiers) {
190+
if (isStringMetric())
191+
return itemQualifiers + ",value=\"" + jsonPrimitive.getAsString() + '"';
192+
else
193+
return itemQualifiers;
194+
}
173195
}
174196
}
175197

wls-exporter-core/src/test/java/com/oracle/wls/exporter/ExporterServletTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,12 @@ void onGetWithStringValues_displayMetrics() throws Exception {
353353

354354
servlet.doGet(request, this.response);
355355

356-
assertThat(toHtml(this.response), containsString("color{name=\"fred\"} 0"));
357-
assertThat(toHtml(this.response), containsString("color{name=\"george\"} 1"));
358-
assertThat(toHtml(this.response), containsString("color{name=\"ron\"} -1"));
359-
assertThat(toHtml(this.response), containsString("size{name=\"fred\"} 0"));
360-
assertThat(toHtml(this.response), containsString("size{name=\"george\"} 1"));
361-
assertThat(toHtml(this.response), containsString("size{name=\"ron\"} 2"));
356+
assertThat(toHtml(this.response), containsString("color{name=\"fred\",value=\"red\"} 0"));
357+
assertThat(toHtml(this.response), containsString("color{name=\"george\",value=\"green\"} 1"));
358+
assertThat(toHtml(this.response), containsString("color{name=\"ron\",value=\"blue\"} -1"));
359+
assertThat(toHtml(this.response), containsString("size{name=\"fred\",value=\"tall\"} 0"));
360+
assertThat(toHtml(this.response), containsString("size{name=\"george\",value=\"grande\"} 1"));
361+
assertThat(toHtml(this.response), containsString("size{name=\"ron\",value=\"venti\"} 2"));
362362
}
363363

364364
private Map<String,Object> getStringResponseMap() {

wls-exporter-core/src/test/java/com/oracle/wls/exporter/domain/MetricsScraperTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2017, 2022, Oracle and/or its affiliates.
1+
// Copyright (c) 2017, 2023, Oracle and/or its affiliates.
22
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
package com.oracle.wls.exporter.domain;
@@ -202,13 +202,13 @@ private ImmutableMap<String, Object> getAllValuesServletsMap() {
202202
}
203203

204204
@Test
205-
void whenStringValuesSpecified_generateEnumeration() {
205+
void whenStringValuesSpecified_generateEnumerationAndQualifier() {
206206
generateNestedMetrics(getStringValuedServletsMap(), SERVLET_RESPONSE);
207207

208208
assertThat(scraper.getMetrics(),
209-
allOf(hasMetric("servlet_state{servletName=\"JspServlet\"}", 1),
210-
hasMetric("servlet_state{servletName=\"FileServlet\"}", 0),
211-
hasMetric("servlet_state{servletName=\"ready\"}", 2)));
209+
allOf(hasMetric("servlet_state{servletName=\"JspServlet\",value=\"running\"}", 1),
210+
hasMetric("servlet_state{servletName=\"FileServlet\",value=\"stopped\"}", 0),
211+
hasMetric("servlet_state{servletName=\"ready\",value=\"confused\"}", 2)));
212212
}
213213

214214
private ImmutableMap<String, Object> getStringValuedServletsMap() {

0 commit comments

Comments
 (0)