Github user zentol commented on the issue:
https://github.com/apache/flink/pull/5501
They are not registered twice. For gauges we create Wrapper that would, for
a `Gauge<Custom>`, implements both `Gauge<Custom>` and `StringGauge`.
Legacy reporters would go through the Gauge interface and behave as they
always did, reporter going through the `StringGauge` interface would stringify
whatever the gauge returns.
Similarly, the new gauge types are wrapped so that we register something
that implements both `Gauge<String/Number>` and `String-/NumberGauge`.
see `AbstractMetricGroup`:
```
public <T, G extends Gauge<T>> G gauge(int name, G gauge) {
return gauge(String.valueOf(name), gauge);
}
public <T, G extends Gauge<T>> G gauge(String name, G gauge) {
addMetric(name, new LegacyGaugeWrapper<>(gauge));
return gauge;
}
public void register(String name, StringGauge gauge) {
addMetric(name, new StringGaugeWrapper(gauge));
}
@Override
public void register(String name, NumberGauge gauge) {
addMetric(name, new NumberGaugeWrapper(gauge));
}
private static class LegacyGaugeWrapper<T> implements StringGauge,
Gauge<T> {
private final Gauge<T> legacyGauge;
private LegacyGaugeWrapper(Gauge<T> legacyGauge) {
this.legacyGauge = legacyGauge;
}
@Override
public String getStringValue() {
T value = legacyGauge.getValue();
if (value == null) {
return null;
} else {
return value.toString();
}
}
@Override
public T getValue() {
return legacyGauge.getValue();
}
}
```
---