Skip to content

Commit

Permalink
Merge pull request #4247 from pirgeo
Browse files Browse the repository at this point in the history
* dynatrace-reduce-verbosity:
  Only serialize metadata when set on the meter

Closes gh-4247
  • Loading branch information
jonatan-ivanov committed Oct 21, 2023
2 parents ee15ac9 + 9df4469 commit 5c8cc89
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,9 @@ private String createGaugeLine(Meter meter, Map<String, String> seenMetadata, Me
return null;
}
MetricLineBuilder.GaugeStep gaugeStep = createTypeStep(meter).gauge();
storeMetadata(enrichMetadata(gaugeStep.metadata(), meter), seenMetadata);
if (shouldExportMetadata(meter.getId())) {
storeMetadata(enrichMetadata(gaugeStep.metadata(), meter), seenMetadata);
}
return gaugeStep.value(value).timestamp(Instant.ofEpochMilli(clock.wallTime())).build();
}
catch (MetricException e) {
Expand All @@ -242,7 +244,9 @@ Stream<String> toCounterLine(Meter counter, Map<String, String> seenMetadata) {
private String createCounterLine(Meter meter, Map<String, String> seenMetadata, Measurement measurement) {
try {
MetricLineBuilder.CounterStep counterStep = createTypeStep(meter).count();
storeMetadata(enrichMetadata(counterStep.metadata(), meter), seenMetadata);
if (shouldExportMetadata(meter.getId())) {
storeMetadata(enrichMetadata(counterStep.metadata(), meter), seenMetadata);
}
return counterStep.delta(measurement.getValue()).timestamp(Instant.ofEpochMilli(clock.wallTime())).build();
}
catch (MetricException e) {
Expand Down Expand Up @@ -295,7 +299,9 @@ private Stream<String> createSummaryLine(Meter meter, Map<String, String> seenMe
double total, long count) {
try {
MetricLineBuilder.GaugeStep gaugeStep = createTypeStep(meter).gauge();
storeMetadata(enrichMetadata(gaugeStep.metadata(), meter), seenMetadata);
if (shouldExportMetadata(meter.getId())) {
storeMetadata(enrichMetadata(gaugeStep.metadata(), meter), seenMetadata);
}
return Stream.of(gaugeStep.summary(min, max, total, count)
.timestamp(Instant.ofEpochMilli(clock.wallTime()))
.build());
Expand Down Expand Up @@ -447,6 +453,17 @@ private void handleSuccess(int totalSent, HttpSender.Response response) {
}
}

/**
* The metadata should be exported if it is enabled from config and at least one of
* unit or description are set.
* @param id meter Id
* @return whether the metadata should be exported or not
*/
private boolean shouldExportMetadata(Meter.Id id) {
return config.exportMeterMetadata()
&& (!StringUtils.isEmpty(id.getBaseUnit()) || !StringUtils.isEmpty(id.getDescription()));
}

private MetricLineBuilder.MetadataStep enrichMetadata(MetricLineBuilder.MetadataStep metadataStep, Meter meter) {
return metadataStep.description(meter.getId().getDescription()).unit(meter.getId().getBaseUnit());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -775,6 +775,28 @@ void counterMetadataIsSerialized() {
}));
}

@Test
void shouldAddMetadataOnlyWhenUnitOrDescriptionIsPresent() {
HttpSender.Request.Builder builder = spy(HttpSender.Request.build(config.uri(), httpClient));
when(httpClient.post(anyString())).thenReturn(builder);

Gauge.builder("gauge", () -> 10.00).register(meterRegistry);
Gauge.builder("gauge.d", () -> 20.00).description("temperature").register(meterRegistry);
Gauge.builder("gauge.u", () -> 30.00).baseUnit("kelvin").register(meterRegistry);
Gauge.builder("gauge.du", () -> 40.00).description("temperature").baseUnit("kelvin").register(meterRegistry);
exporter.export(meterRegistry.getMeters());

verify(builder).withPlainText(assertArg(body -> assertThat(body.split("\n")).containsExactlyInAnyOrder(
"gauge,dt.metrics.source=micrometer gauge,10 " + clock.wallTime(),
// no metadata since no unit nor description
"gauge.d,dt.metrics.source=micrometer gauge,20 " + clock.wallTime(),
"#gauge.d gauge dt.meta.description=temperature",
"gauge.u,dt.metrics.source=micrometer gauge,30 " + clock.wallTime(),
"#gauge.u gauge dt.meta.unit=kelvin",
"gauge.du,dt.metrics.source=micrometer gauge,40 " + clock.wallTime(),
"#gauge.du gauge dt.meta.description=temperature,dt.meta.unit=kelvin")));
}

@Test
void sendsTwoRequestsWhenSizeLimitIsReachedWithMetadata() {
HttpSender.Request.Builder firstReq = spy(HttpSender.Request.build(config.uri(), httpClient));
Expand Down

0 comments on commit 5c8cc89

Please sign in to comment.