Skip to content

Commit

Permalink
Only serialize metadata when set on the meter
Browse files Browse the repository at this point in the history
gh-4006 added support for metrics metadata (unit and description) in the
Dynatrace Exporter. The exporter always added the metadata even if unit
or description were not set. After these changes,
the exporter should not attempt to add metadata if no unit
or description was set on the metric.

See gh-4247
See gh-3979
See gh-4006

Co-authored-by: Jonatan Ivanov <jonatan.ivanov@gmail.com>
  • Loading branch information
pirgeo and jonatan-ivanov committed Oct 21, 2023
1 parent ee15ac9 commit 9df4469
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 9df4469

Please sign in to comment.