Skip to content

Commit

Permalink
Add mpTelemetry meter api
Browse files Browse the repository at this point in the history
  • Loading branch information
yasmin-aumeeruddy committed Jan 25, 2024
1 parent f096c29 commit d77bdd3
Show file tree
Hide file tree
Showing 7 changed files with 155 additions and 67 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@

<groupId>org.eclipse.microprofile.telemetry</groupId>
<artifactId>microprofile-telemetry-parent</artifactId>
<version>1.2-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>MicroProfile Telemetry</name>
<url>https://microprofile.io/project/eclipse/microprofile-telemetry</url>

<properties>
<inceptionYear>2022</inceptionYear>
<opentelemetry.java.version>1.29.0</opentelemetry.java.version>
<opentelemetry.java.version>1.32.0</opentelemetry.java.version>
<version.mp.rest.client>3.0.1</version.mp.rest.client>
<version.microprofile-config-api>3.1</version.microprofile-config-api>
<version.awaitility>4.2.0</version.awaitility>
Expand Down
2 changes: 1 addition & 1 deletion spec/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<parent>
<groupId>org.eclipse.microprofile.telemetry</groupId>
<artifactId>microprofile-telemetry-parent</artifactId>
<version>1.2-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
</parent>

<artifactId>microprofile-telemetry-spec</artifactId>
Expand Down
8 changes: 6 additions & 2 deletions tck/metrics/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<parent>
<groupId>org.eclipse.microprofile.telemetry</groupId>
<artifactId>microprofile-telemetry-tck-parent</artifactId>
<version>1.2-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
</parent>

<artifactId>microprofile-telemetry-metrics-tck</artifactId>
Expand All @@ -45,6 +45,10 @@
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-common</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
Expand Down Expand Up @@ -93,7 +97,7 @@
<dependency>
<groupId>org.eclipse.microprofile.telemetry</groupId>
<artifactId>microprofile-telemetry-tracing-tck</artifactId>
<version>1.2-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,51 +21,140 @@
**********************************************************************/
package org.eclipse.microprofile.telemetry.metrics.tck.cdi;

import org.eclipse.microprofile.telemetry.metrics.tck.ConfigAsset;
import org.eclipse.microprofile.telemetry.metrics.tck.exporter.InMemoryMetricExporter;
import org.eclipse.microprofile.telemetry.metrics.tck.exporter.InMemoryMetricExporterProvider;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.testng.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.DoubleCounter;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.DoubleUpDownCounter;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.LongHistogram;
import io.opentelemetry.api.metrics.LongUpDownCounter;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider;
import jakarta.inject.Inject;

public class MeterBeanTest extends Arquillian {

@Deployment
public static WebArchive createTestArchive() {
ConfigAsset config = new ConfigAsset().add(ConfigAsset.SDK_DISABLED, "false");

return ShrinkWrap.create(WebArchive.class)
.addAsResource(EmptyAsset.INSTANCE, "META-INF/beans.xml")
.addAsResource(config, "META-INF/microprofile-config.properties");
.addClasses(InMemoryMetricExporter.class, InMemoryMetricExporterProvider.class)
.addAsServiceProvider(ConfigurableMetricExporterProvider.class, InMemoryMetricExporterProvider.class)
.addAsResource(new StringAsset(
"otel.sdk.disabled=false\notel.metrics.exporter=in-memory"),
"META-INF/microprofile-config.properties")
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}

@Inject
private Meter sdkMeter;

@Inject
private InMemoryMetricExporter metricExporter;

@BeforeMethod
void setUp() {
if (metricExporter != null) {
metricExporter.reset();
}
}

@Test
void testLongCounter() {
void testLongCounter() throws InterruptedException {
LongCounter longCounter =
sdkMeter
.counterBuilder("testLongCounter")
.setDescription("My very own counter")
.setUnit("metric tonnes")
.build();
Assert.assertNotNull(longCounter);
longCounter.add(12, Attributes.empty());
longCounter.add(12);
Thread.sleep(10000);
System.out.println("Long counter item" + metricExporter.getFinishedMetricItems());
}

@Test
void testLongUpDownCounter() throws InterruptedException {
LongUpDownCounter longUpDownCounter =
sdkMeter
.upDownCounterBuilder("testLongUpDownCounter")
.setDescription("My very own counter")
.setUnit("metric tonnes")
.build();
Assert.assertNotNull(longUpDownCounter);
longUpDownCounter.add(-10, Attributes.empty());
Thread.sleep(10000);
System.out.println("Long up down counter" + metricExporter.getFinishedMetricItems());
}

// Note: We no longer get the same instrument instance as these instances are lightweight
/*
* objects backed by storage now. Here we just make sure it doesn't log a warning. sdkMeter
* .counterBuilder("testLongCounter") .setDescription("My very own counter") .setUnit("metric tonnes") .build();
* assertThat(metricStorageLogs.getEvents()).isEmpty();
*
* sdkMeter.counterBuilder("testLongCounter").build();
* metricStorageLogs.assertContains("Found duplicate metric definition");
*/
@Test
void testLongHistogram() throws InterruptedException {
LongHistogram longHistogram =
sdkMeter
.histogramBuilder("testLongValueRecorder")
.ofLongs()
.setDescription("My very own counter")
.setUnit("metric tonnes")
.build();
Assert.assertNotNull(longHistogram);
longHistogram.record(10, Attributes.empty());
Thread.sleep(10000);
System.out.println("Long histogram " + metricExporter.getFinishedMetricItems());
}

@Test
void testDoubleCounter() throws InterruptedException {
DoubleCounter doubleCounter =
sdkMeter
.counterBuilder("testDoubleCounter")
.ofDoubles()
.setDescription("My very own counter")
.setUnit("metric tonnes")
.build();
doubleCounter.add(10.1, Attributes.empty());
Thread.sleep(10000);
System.out.println("Double counter " + metricExporter.getFinishedMetricItems());
}

@Test
void testDoubleUpDownCounter() throws InterruptedException {
DoubleUpDownCounter doubleUpDownCounter =
sdkMeter
.upDownCounterBuilder("testDoubleUpDownCounter")
.ofDoubles()
.setDescription("My very own counter")
.setUnit("metric tonnes")
.build();
doubleUpDownCounter.add(-10.1, Attributes.empty());
Thread.sleep(10000);
System.out.println("Double up down counter " + metricExporter.getFinishedMetricItems());
}

@Test
void testDoubleHistogram() throws InterruptedException {
DoubleHistogram doubleHistogram =
sdkMeter
.histogramBuilder("testDoubleHistogram")
.setDescription("My very own counter")
.setUnit("metric tonnes")
.build();
Assert.assertNotNull(doubleHistogram);
doubleHistogram.record(10.1, Attributes.empty());
Thread.sleep(10000);
System.out.println("Double histogram " + metricExporter.getFinishedMetricItems());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,94 +20,90 @@

package org.eclipse.microprofile.telemetry.metrics.tck.exporter;

import static java.util.Comparator.comparingLong;
import static java.util.concurrent.TimeUnit.SECONDS;
import static java.util.function.Predicate.not;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;

import org.awaitility.Awaitility;
import org.testng.Assert;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.metrics.InstrumentType;
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.semconv.metrics.attributes.SemanticAttributes;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class InMemoryMetricExporter implements MetricExporter {

private final Queue<MetricData> finishedMetricItems = new ConcurrentLinkedQueue<>();
private final AggregationTemporality aggregationTemporality;
private boolean isStopped = false;
private final List<SpanData> finishedMetricItems = new CopyOnWriteArrayList<>();

public InMemoryMetricExporter() {
aggregationTemporality = AggregationTemporality.CUMULATIVE;
}
/**
* Return the default aggregation for the {@link InstrumentType}.
* Returns a {@code List} of the finished {@code Metric}s, represented by {@code MetricData}.
*
* @see DefaultAggregationSelector#getDefaultAggregation(InstrumentType)
* @since 1.16.0
* @return a {@code List} of the finished {@code Metric}s.
*/
@Override
default Aggregation getDefaultAggregation(InstrumentType instrumentType) {
return Aggregation.defaultAggregation();
public List<MetricData> getFinishedMetricItems() {
return Collections.unmodifiableList(new ArrayList<>(finishedMetricItems));
}

/**
* Returns the memory mode used by this exporter's associated reader.
* Clears the internal {@code List} of finished {@code Metric}s.
*
* @return The {@link MemoryMode} used by this exporter's associated reader
* @since 1.31.0
* <p>
* Does not reset the state of this exporter if already shutdown.
*/
default MemoryMode getMemoryMode() {
return IMMUTABLE_DATA;
public void reset() {
finishedMetricItems.clear();
}

@Override
public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) {
return aggregationTemporality;
}

/**
* Exports the {@code metrics}. The caller (i.e. {@link PeriodicMetricReader} will not call export until the
* previous call completes.
* Exports the collection of {@code Metric}s into the inmemory queue.
*
* @param metrics
* the metrics to export.
* @return the result of the export, which is often an asynchronous operation.
* <p>
* If this is called after {@code shutdown}, this will return {@code ResultCode.FAILURE}.
*/
@Override
public CompletableResultCode export(Collection<MetricData> metrics) {
if (isStopped) {
return CompletableResultCode.ofFailure();
}
metrics.stream()
.filter(not(InMemoryMetricExporter::isArquillianMetric))
.forEach(finishedMetricItems::add);
System.out.println("Exporting metrics" + metrics);
finishedMetricItems.addAll(metrics);
return CompletableResultCode.ofSuccess();
}

/**
* A hint that any metrics previously {@link #export(Collection)}ed should be completed.
* The InMemory exporter does not batch metrics, so this method will immediately return with success.
*
* @return the result of the flush, which is often an asynchronous operation.
* @return always Success
*/
@Override
public CompletableResultCode flush() {
return CompletableResultCode.ofSuccess();
}
/**
* Shuts down the exporter.
* Clears the internal {@code List} of finished {@code Metric}s.
*
* <p>
* Called when {@link PeriodicMetricReader#shutdown()} of the associated reader is called.
*
* @return a {@link CompletableResultCode} which is completed when shutdown completes.
* Any subsequent call to export() function on this MetricExporter, will return {@code
* CompletableResultCode.ofFailure()}
*/
@Override
public CompletableResultCode shutdown() {
finishedMetricItems.clear();
isStopped = true;
finishedMetricItems.clear();
return CompletableResultCode.ofSuccess();
}

/** Closes this {@link MetricExporter}, releasing any resources. */
@Override
default void close() {
shutdown().join(10, TimeUnit.SECONDS);
}
}
4 changes: 2 additions & 2 deletions tck/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
<parent>
<groupId>org.eclipse.microprofile.telemetry</groupId>
<artifactId>microprofile-telemetry-parent</artifactId>
<version>1.2-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
</parent>

<artifactId>microprofile-telemetry-tck-parent</artifactId>
<version>1.2-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>MicroProfile Telemetry TCK</name>

Expand Down
5 changes: 2 additions & 3 deletions tck/tracing/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,12 @@
<parent>
<groupId>org.eclipse.microprofile.telemetry</groupId>
<artifactId>microprofile-telemetry-tck-parent</artifactId>
<version>1.2-SNAPSHOT</version>
<version>2.0-SNAPSHOT</version>
</parent>

<artifactId>microprofile-telemetry-tracing-tck</artifactId>
<name>MicroProfile Telemetry Tracing TCK</name>



<dependencies>
<dependency>
<groupId>org.eclipse.microprofile.config</groupId>
Expand Down Expand Up @@ -64,6 +62,7 @@
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-semconv</artifactId>
<version>1.30.1-alpha</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
Expand Down

0 comments on commit d77bdd3

Please sign in to comment.