diff --git a/opentelemetry-quickstart/README.md b/opentelemetry-quickstart/README.md
index 3fdfce7bf1..ec5783bff3 100644
--- a/opentelemetry-quickstart/README.md
+++ b/opentelemetry-quickstart/README.md
@@ -1 +1,9 @@
Quarkus guide: https://quarkus.io/guides/opentelemetry
+
+In this opentelemetry-quickstart is implemented OpenTelemetry Metrics detailed in the guide: https://quarkus.io/guides/opentelemetry-metrics .
+
+Additionally, it integrates the LGTM DevService for telemetry visualization by adding the `quarkus-observability-devservices-lgtm` dependency.
+
+Usage and configuration are explained in the guide: https://quarkus.io/guides/opentelemetry-tracing#grafana-otel-lgtm-option
+
+
diff --git a/opentelemetry-quickstart/pom.xml b/opentelemetry-quickstart/pom.xml
index 670080ebd3..f99a54563e 100644
--- a/opentelemetry-quickstart/pom.xml
+++ b/opentelemetry-quickstart/pom.xml
@@ -48,6 +48,10 @@
io.quarkus
quarkus-rest-client
+
+ io.quarkus
+ quarkus-observability-devservices-lgtm
+
diff --git a/opentelemetry-quickstart/src/main/java/org/acme/opentelemetry/TracedResource.java b/opentelemetry-quickstart/src/main/java/org/acme/opentelemetry/TracedResource.java
index a59eb3a65b..7304048a43 100644
--- a/opentelemetry-quickstart/src/main/java/org/acme/opentelemetry/TracedResource.java
+++ b/opentelemetry-quickstart/src/main/java/org/acme/opentelemetry/TracedResource.java
@@ -1,8 +1,14 @@
package org.acme.opentelemetry;
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.metrics.LongCounter;
+import io.opentelemetry.api.metrics.Meter;
+import jakarta.annotation.PostConstruct;
+import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.UriInfo;
@@ -18,6 +24,24 @@ public class TracedResource {
@Context
UriInfo uriInfo;
+ @Inject
+ OpenTelemetry openTelemetry;
+
+ @Inject
+ Meter meter;
+
+ private LongCounter longCounter;
+
+ @PostConstruct
+ public void init() {
+ meter = openTelemetry.getMeter("myservice");
+
+ longCounter = meter.counterBuilder("service.xvalue")
+ .setDescription("Current value of X in the service")
+ .setUnit("units")
+ .build();
+ }
+
@GET
@Path("/hello")
@Produces(MediaType.TEXT_PLAIN)
@@ -35,4 +59,16 @@ public String chain() {
.build(ResourceClient.class);
return "chain -> " + resourceClient.hello();
}
+
+ @GET
+ @Path("/metrics/set")
+ @Produces(MediaType.APPLICATION_JSON)
+ public String setMetric(@QueryParam("value") long value) {
+ if (value <= 0) {
+ return "{\"status\":\"failure\", \"message\":\"Value parameter must be positive\"}";
+ }
+ longCounter.add(value);
+
+ return "{\"status\":\"success\", \"xvalue\":" + value + "}";
+ }
}
diff --git a/opentelemetry-quickstart/src/main/resources/application.properties b/opentelemetry-quickstart/src/main/resources/application.properties
index 9e25685f64..b383c7add3 100644
--- a/opentelemetry-quickstart/src/main/resources/application.properties
+++ b/opentelemetry-quickstart/src/main/resources/application.properties
@@ -1,5 +1,6 @@
quarkus.application.name=myservice
-quarkus.otel.exporter.otlp.traces.endpoint=http://localhost:4317
+quarkus.otel.metrics.enabled=true
quarkus.otel.exporter.otlp.traces.headers=Authorization=Bearer my_secret
quarkus.log.console.format=%d{HH:mm:ss} %-5p traceId=%X{traceId}, parentId=%X{parentId}, spanId=%X{spanId}, sampled=%X{sampled} [%c{2.}] (%t) %s%e%n
-
+# jfr must be enabled if you need OpenTelemetry metrics on native mode.
+quarkus.native.monitoring=jfr
\ No newline at end of file
diff --git a/opentelemetry-quickstart/src/test/java/org/acme/opentelemetry/TracedResourceTest.java b/opentelemetry-quickstart/src/test/java/org/acme/opentelemetry/TracedResourceTest.java
index 9031c4ecb2..e54bf63781 100644
--- a/opentelemetry-quickstart/src/test/java/org/acme/opentelemetry/TracedResourceTest.java
+++ b/opentelemetry-quickstart/src/test/java/org/acme/opentelemetry/TracedResourceTest.java
@@ -28,4 +28,17 @@ public void testChainEndpoint() {
.body(is("chain -> hello"));
}
+ @Test
+ public void testSetMetricEndpoint() {
+ long testValue = 42L;
+
+ given()
+ .queryParam("value", testValue)
+ .when().get("/metrics/set")
+ .then()
+ .statusCode(200)
+ .body("status", is("success"))
+ .body("xvalue", is((int)testValue));
+ }
+
}