Skip to content

Commit c55b1f4

Browse files
authored
Fix incorrect handling of omitted display name (and description) revealed by gRPC (helidon-io#3178)
1 parent 4d9312d commit c55b1f4

4 files changed

Lines changed: 48 additions & 15 deletions

File tree

grpc/metrics/src/main/java/io/helidon/grpc/metrics/GrpcMetrics.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ static class MetricsRules {
563563
*
564564
* @see org.eclipse.microprofile.metrics.Metadata
565565
*/
566-
private String displayName;
566+
private Optional<String> displayName = Optional.empty();
567567

568568
/**
569569
* The unit of the metric.
@@ -623,9 +623,7 @@ org.eclipse.microprofile.metrics.Metadata metadata(ServiceDescriptor service, St
623623

624624
this.description.ifPresent(builder::withDescription);
625625
this.units.ifPresent(builder::withUnit);
626-
627-
String displayName = this.displayName;
628-
builder.withDisplayName(displayName == null ? name : displayName);
626+
this.displayName.ifPresent(builder::withDisplayName);
629627

630628
return builder.build();
631629
}
@@ -648,7 +646,7 @@ private MetricsRules description(String description) {
648646

649647
private MetricsRules displayName(String displayName) {
650648
MetricsRules rules = new MetricsRules(this);
651-
rules.displayName = displayName;
649+
rules.displayName = Optional.of(displayName);
652650
return rules;
653651
}
654652

microprofile/grpc/metrics/src/main/java/io/helidon/microprofile/grpc/metrics/MetricsConfigurer.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,15 @@ private void addMetric(ServiceDescriptor.Builder builder,
229229

230230
MetricAnnotationInfo<?> mInfo = METRIC_ANNOTATION_INFO.get(annotation.annotationType());
231231
if (mInfo != null && mInfo.annotationClass.isInstance(annotation)) {
232-
interceptor = interceptor.description(mInfo.description(annotatedMethod))
233-
.displayName(mInfo.displayName(annotatedMethod))
232+
String candidateDescription = mInfo.description(annotatedMethod);
233+
if (candidateDescription != null && !candidateDescription.trim().isEmpty()) {
234+
interceptor = interceptor.description(candidateDescription.trim());
235+
}
236+
String candidateDisplayName = mInfo.displayName(annotatedMethod);
237+
if (candidateDisplayName != null && !candidateDisplayName.trim().isEmpty()) {
238+
interceptor = interceptor.displayName(candidateDisplayName.trim());
239+
}
240+
interceptor = interceptor
234241
.reusable(mInfo.reusable(annotatedMethod))
235242
.units(mInfo.units(annotatedMethod));
236243
}

microprofile/metrics/src/main/java/io/helidon/microprofile/metrics/MetricAnnotationInfo.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.helidon.microprofile.metrics.MetricUtil.MatchingType;
2828

2929
import org.eclipse.microprofile.metrics.Metadata;
30+
import org.eclipse.microprofile.metrics.MetadataBuilder;
3031
import org.eclipse.microprofile.metrics.Metric;
3132
import org.eclipse.microprofile.metrics.MetricRegistry;
3233
import org.eclipse.microprofile.metrics.MetricType;
@@ -68,18 +69,22 @@ RegistrationPrep<?> create(A annotation,
6869

6970
String metricName = MetricUtil.getMetricName(annotatedElement, clazz, matchingType, info.name(annotation),
7071
info.absolute(annotation));
71-
String candidateDisplayName = info.displayName(annotation);
72-
Metadata metadata = Metadata.builder()
72+
MetadataBuilder metadataBuilder = Metadata.builder()
7373
.withName(metricName)
74-
.withDisplayName(candidateDisplayName.isEmpty() ? metricName : candidateDisplayName)
75-
.withDescription(info.description(annotation)
76-
.trim())
7774
.withType(ANNOTATION_TYPE_TO_METRIC_TYPE.get(annotation.annotationType()))
7875
.withUnit(info.unit(annotation)
7976
.trim())
80-
.reusable(info.reusable(annotation))
81-
.build();
82-
return new RegistrationPrep<>(metricName, metadata, info.tags(annotation), info.registerFunction);
77+
.reusable(info.reusable(annotation));
78+
79+
String candidateDescription = info.description(annotation);
80+
if (candidateDescription != null && !candidateDescription.trim().isEmpty()) {
81+
metadataBuilder.withDescription(candidateDescription.trim());
82+
}
83+
String candidateDisplayName = info.displayName(annotation);
84+
if (candidateDisplayName != null && !candidateDisplayName.trim().isEmpty()) {
85+
metadataBuilder.withDisplayName(candidateDisplayName.trim());
86+
}
87+
return new RegistrationPrep<>(metricName, metadataBuilder.build(), info.tags(annotation), info.registerFunction);
8388
}
8489

8590
private RegistrationPrep(String metricName, Metadata metadata, Tag[] tags, Registration<T> registration) {

microprofile/metrics/src/test/java/io/helidon/microprofile/metrics/MetricsTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@
3535

3636
import org.eclipse.microprofile.metrics.Counter;
3737
import org.eclipse.microprofile.metrics.Gauge;
38+
import org.eclipse.microprofile.metrics.Metadata;
3839
import org.eclipse.microprofile.metrics.Meter;
3940
import org.eclipse.microprofile.metrics.MetricID;
41+
import org.eclipse.microprofile.metrics.MetricType;
42+
import org.eclipse.microprofile.metrics.MetricUnits;
4043
import org.eclipse.microprofile.metrics.SimpleTimer;
4144
import org.eclipse.microprofile.metrics.Timer;
4245
import org.hamcrest.CoreMatchers;
@@ -203,4 +206,24 @@ public void testAbsoluteGaugeBeanName() {
203206
.keySet().stream().map(MetricID::getName).collect(Collectors.toSet());
204207
assertThat(gauges, CoreMatchers.hasItem("secondsSinceBeginningOfTime"));
205208
}
209+
210+
@Test
211+
void testOmittedDisplayName() {
212+
MeteredBean bean = newBean(MeteredBean.class);
213+
String metricName = MeteredBean.class.getName() + ".method1";
214+
Metadata metadata = getMetricRegistry().getMetadata().get(metricName);
215+
assertThat("Metadata for meter of annotated method", metadata, is(notNullValue()));
216+
217+
// The displayName value stored in the retrieved metadata should be null, but Metadata.getDisplayName() returns the name
218+
// in those cases. So an easy way to check is to attempt to re-register/look up the meter using a new Metadata instance
219+
// for which we know the displayName is null.
220+
Metadata newMetadata = Metadata.builder()
221+
.withName(metadata.getName())
222+
.withType(MetricType.METERED)
223+
.reusable(false)
224+
.withUnit(MetricUnits.PER_SECOND)
225+
.build();
226+
// Should return the existing meter. Throws exception if metadata is mismatched.
227+
Meter meter = getMetricRegistry().meter(newMetadata);
228+
}
206229
}

0 commit comments

Comments
 (0)