Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

api metrics missing toString implementation #5013

Closed
amouhadi opened this issue Dec 2, 2022 · 7 comments · Fixed by #5072
Closed

api metrics missing toString implementation #5013

amouhadi opened this issue Dec 2, 2022 · 7 comments · Fixed by #5072
Labels
Feature Request Suggest an idea for this project

Comments

@amouhadi
Copy link

amouhadi commented Dec 2, 2022

reopening from this issue
unfortunately I couldn't find an easy way toString method for io.opentelemetry.api.metrics members
@mkorzeniewski can you think of a similar pattern like you did with io.opentelemetry.sdk.metrics packege? thanks!

@amouhadi amouhadi added the Feature Request Suggest an idea for this project label Dec 2, 2022
@jack-berg
Copy link
Member

Which classes are you referring to?

@amouhadi
Copy link
Author

amouhadi commented Dec 6, 2022

all classes under io.opentelemetry.api.metrics like DoubleCounter, DoubleGaugeBuilder, DoubleHistogram, DoubleUpDownCounter, DoubleUpDownCounterBuilder, LongCounter, LongGaugeBuilder, LongUpDownCounter, LongUpDownCounterBuilder, ...

@jkwatson
Copy link
Contributor

jkwatson commented Dec 6, 2022

all classes under io.opentelemetry.api.metrics like DoubleCounter, DoubleGaugeBuilder, DoubleHistogram, DoubleUpDownCounter, DoubleUpDownCounterBuilder, LongCounter, LongGaugeBuilder, LongUpDownCounter, LongUpDownCounterBuilder, ...

those are interfaces, not classes....

@jack-berg
Copy link
Member

Those are interfaces so the toString behavior will vary based on implementation. For the SDK I wrote some test code that exercises toString for a variety of different classes.

    SdkMeterProvider meterProvider = SdkMeterProvider.builder().registerMetricReader(
        InMemoryMetricReader.create()).build();

    List<Object> objects = new ArrayList<>();
    objects.add(meterProvider);
    objects.add(meterProvider.get("meter"));
    objects.add(meterProvider.get("meter").counterBuilder("counter"));
    objects.add(meterProvider.get("meter").counterBuilder("counter").build());
    objects.add(meterProvider.get("meter").counterBuilder("counter").buildWithCallback(unused -> {}));
    objects.add(meterProvider.get("meter").counterBuilder("counter").ofDoubles());
    objects.add(meterProvider.get("meter").counterBuilder("counter").ofDoubles().build());
    objects.add(meterProvider.get("meter").counterBuilder("counter").ofDoubles().buildWithCallback(unused -> {}));
    objects.add(meterProvider.get("meter").upDownCounterBuilder("updowncounter"));
    objects.add(meterProvider.get("meter").upDownCounterBuilder("updowncounter").build());
    objects.add(meterProvider.get("meter").upDownCounterBuilder("updowncounter").buildWithCallback(unused -> {}));
    objects.add(meterProvider.get("meter").upDownCounterBuilder("updowncounter").ofDoubles());
    objects.add(meterProvider.get("meter").upDownCounterBuilder("updowncounter").ofDoubles().build());
    objects.add(meterProvider.get("meter").upDownCounterBuilder("updowncounter").buildWithCallback(unused -> {}));
    objects.add(meterProvider.get("meter").histogramBuilder("histogram"));
    objects.add(meterProvider.get("meter").histogramBuilder("histogram").build());
    objects.add(meterProvider.get("meter").histogramBuilder("histogram").ofLongs());
    objects.add(meterProvider.get("meter").histogramBuilder("histogram").ofLongs().build());
    objects.add(meterProvider.get("meter").gaugeBuilder("gauge").buildWithCallback(unused -> {}));
    objects.add(meterProvider.get("meter").gaugeBuilder("gauge").ofLongs().buildWithCallback(unused -> {}));
    objects.add(meterProvider.get("meter").gaugeBuilder("gauge").ofLongs().buildWithCallback(unused -> {}));

    objects.forEach(object -> {
      System.out.println(object.getClass().getName() + ": " + object.toString());
    });

Results:

io.opentelemetry.sdk.metrics.SdkMeterProvider: SdkMeterProvider{clock=SystemClock{}, resource=Resource{schemaUrl=null, attributes={service.name="unknown_service:java", telemetry.sdk.language="java", telemetry.sdk.name="opentelemetry", telemetry.sdk.version="1.21.0-SNAPSHOT"}}, metricReaders=[InMemoryMetricReader{aggregationTemporality=CUMULATIVE}], views=[]}
io.opentelemetry.sdk.metrics.SdkMeter: io.opentelemetry.sdk.metrics.SdkMeter@7c1503a3
io.opentelemetry.sdk.metrics.SdkLongCounter$Builder: io.opentelemetry.sdk.metrics.SdkLongCounter$Builder@130cfc47
io.opentelemetry.sdk.metrics.SdkLongCounter: SdkLongCounter{descriptor=InstrumentDescriptor{name=counter, description=, unit=, type=COUNTER, valueType=LONG}}
io.opentelemetry.sdk.metrics.SdkObservableInstrument: io.opentelemetry.sdk.metrics.SdkObservableInstrument@4eeab3e
io.opentelemetry.sdk.metrics.SdkDoubleCounter$Builder: io.opentelemetry.sdk.metrics.SdkDoubleCounter$Builder@2b6fb197
io.opentelemetry.sdk.metrics.SdkDoubleCounter: SdkDoubleCounter{descriptor=InstrumentDescriptor{name=counter, description=, unit=, type=COUNTER, valueType=DOUBLE}}
io.opentelemetry.sdk.metrics.SdkObservableInstrument: io.opentelemetry.sdk.metrics.SdkObservableInstrument@2eb0cefe
io.opentelemetry.sdk.metrics.SdkLongUpDownCounter$Builder: io.opentelemetry.sdk.metrics.SdkLongUpDownCounter$Builder@5a2ae1ab
io.opentelemetry.sdk.metrics.SdkLongUpDownCounter: SdkLongUpDownCounter{descriptor=InstrumentDescriptor{name=updowncounter, description=, unit=, type=UP_DOWN_COUNTER, valueType=LONG}}
io.opentelemetry.sdk.metrics.SdkObservableInstrument: io.opentelemetry.sdk.metrics.SdkObservableInstrument@2bec068b
io.opentelemetry.sdk.metrics.SdkDoubleUpDownCounter$Builder: io.opentelemetry.sdk.metrics.SdkDoubleUpDownCounter$Builder@7d59e968
io.opentelemetry.sdk.metrics.SdkDoubleUpDownCounter: SdkDoubleUpDownCounter{descriptor=InstrumentDescriptor{name=updowncounter, description=, unit=, type=UP_DOWN_COUNTER, valueType=DOUBLE}}
io.opentelemetry.sdk.metrics.SdkObservableInstrument: io.opentelemetry.sdk.metrics.SdkObservableInstrument@55361f03
io.opentelemetry.sdk.metrics.SdkDoubleHistogram$Builder: io.opentelemetry.sdk.metrics.SdkDoubleHistogram$Builder@581c9bb7
io.opentelemetry.sdk.metrics.SdkDoubleHistogram: SdkDoubleHistogram{descriptor=InstrumentDescriptor{name=histogram, description=, unit=, type=HISTOGRAM, valueType=DOUBLE}}
io.opentelemetry.sdk.metrics.SdkLongHistogram$Builder: io.opentelemetry.sdk.metrics.SdkLongHistogram$Builder@138f0661
io.opentelemetry.sdk.metrics.SdkLongHistogram: SdkLongHistogram{descriptor=InstrumentDescriptor{name=histogram, description=, unit=, type=HISTOGRAM, valueType=LONG}}
io.opentelemetry.sdk.metrics.SdkObservableInstrument: io.opentelemetry.sdk.metrics.SdkObservableInstrument@212fafd1
io.opentelemetry.sdk.metrics.SdkObservableInstrument: io.opentelemetry.sdk.metrics.SdkObservableInstrument@448462f0
io.opentelemetry.sdk.metrics.SdkObservableInstrument: io.opentelemetry.sdk.metrics.SdkObservableInstrument@787988f4

So some SDK implementations of API interfaces still lack a useful toString().

If this is what you're referring to, we're open to contributions. 🙂

@amouhadi
Copy link
Author

amouhadi commented Dec 6, 2022

thanks for the explanation, where are the implementation of those interfaces?
does adding toString method in sdk package that are missing toString help us with this?
we're using io.opentelemetry.api.metrics and we're having a really hard time to troubleshoot and figure out the metric information. there is no way after using the Builder classes(set name, unit, description) to get the metric information

@jack-berg
Copy link
Member

The test output shows where the implementations live.

For example:

....
io.opentelemetry.sdk.metrics.SdkDoubleHistogram$Builder: io.opentelemetry.sdk.metrics.SdkDoubleHistogram$Builder@581c9bb7
...

refers to io.opentelemetry.sdk.metrics.SdkDoubleHistogram$Builder

@amouhadi
Copy link
Author

amouhadi commented Dec 6, 2022

Thanks @jack-berg , I was able to reproduce the same output. can we add toString for those SDK implementations that are missing this toString implementation? we use almost all of those sdk implementation. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature Request Suggest an idea for this project
Projects
None yet
3 participants