Introduction
In my previous blog Eclipse Microprofile Metrics with Wildfly 18 and Prometheus, we were getting started with Eclipse Microprofile Metrics and Wildfly 18.
All Metrics: http://127.0.0.1:9990/metrics
Basic Metrics: http://127.0.0.1:9990/metrics/base
Vendor Specific Metrics: http://127.0.0.1:9990/metrics/vendor
Application Specific Metrics: http://127.0.0.1:9990/metrics/application
And in this blog we will focus how to write application specific metrics. Eclipse Microprofile Metrics is by default active in Wildfly 18, so no activation or configurations are needed. The application is a standard Java EE 8 web application with JAX-RS.
For documentation see Metrics Specification https://github.com/eclipse/microprofile-metrics/releases
@Counted
The @Counted annotation which counts how many time a request has been made.
@GET
@Path("/firstName")
@Counted
public Response getFirstName() {
JsonObject json = Json.createObjectBuilder().add("@Counted", "HELLO " + System.currentTimeMillis()).build();
return Response.ok(json.toString()).build();
}
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getFirstName_total counter
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getFirstName_total 1.0
@Gauge
The @Gauge is the most basic metric type that you can use as it just returns a value.
@GET
@Path("/time")
@Produces(MediaType.TEXT_PLAIN)
@Gauge(unit = "time")
public Long getTime() {
return System.currentTimeMillis();
}
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTime_time gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTime_time 1.571012533582E12
@Metered
The @Metered annotation measures the rate at which a set of events occur.
@GET
@Path("/title")
@Metered(unit = MetricUnits.MILLISECONDS)
public Response getTitle() {
JsonObject json = Json.createObjectBuilder().add("@Metered", "HELLO " + System.currentTimeMillis()).build();
return Response.ok(json.toString()).build();
}
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_total counter
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_total 2.0
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_rate_per_second 0.10850140606928724
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_one_min_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_one_min_rate_per_second 0.030703655021877174
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_five_min_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_five_min_rate_per_second 0.0065567799035988195
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_fifteen_min_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getTitle_fifteen_min_rate_per_second 0.002209922141215539
@Timed
The @Timed annotatoin measures the duration of an event.
@GET
@Path("/occupation")
@Timed(unit = MetricUnits.MILLISECONDS)
public Response getOccupation() {
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
JsonObject json = Json.createObjectBuilder().add("@Timed", "HELLO " + System.currentTimeMillis()).build();
return Response.ok(json.toString()).build();
}
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_rate_per_second 0.10850160127626114
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_one_min_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_one_min_rate_per_second 0.031982234148270686
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_five_min_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_five_min_rate_per_second 0.0066114184713530035
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_fifteen_min_rate_per_second gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_fifteen_min_rate_per_second 0.0022160607980413085
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_min_seconds gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_min_seconds 0.326822982
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_max_seconds gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_max_seconds 0.492277962
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_mean_seconds gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_mean_seconds 0.4076894175173451
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_stddev_seconds gauge
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_stddev_seconds 0.08270655402029932
# TYPE application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds summary
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds_count 2.0
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds{quantile="0.5"} 0.326822982
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds{quantile="0.75"} 0.492277962
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds{quantile="0.95"} 0.492277962
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds{quantile="0.98"} 0.492277962
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds{quantile="0.99"} 0.492277962
application_se_magnuskkarlsson_example_microprofile_boundary_PersonResource_getOccupation_seconds{quantile="0.999"} 0.492277962
JSON Output
You can also query the application metrics with accept type json.
$ curl -H "Accept: application/json" http://127.0.0.1:9990/metrics/application
{
"se.magnuskkarlsson.example.microprofile.boundary.PersonResource.getTitle": {
"fiveMinRate": 0.004020212971829918,
"fifteenMinRate": 0.0021635871943593244,
"meanRate": 0.00440791116923509,
"count": 3,
"oneMinRate": 0.015991588875909905
},
"se.magnuskkarlsson.example.microprofile.boundary.PersonResource.getMiddleName": {
"current": 0,
"min": 0,
"max": 0
},
"se.magnuskkarlsson.example.microprofile.boundary.PersonResource.getOccupation": {
"p99": 928.815422,
"min": 326.822982,
"max": 928.815422,
"mean": 928.7665329420207,
"p50": 928.815422,
"p999": 928.815422,
"stddev": 5.110449494753552,
"p95": 928.815422,
"p98": 928.815422,
"p75": 928.815422,
"fiveMinRate": 0.0040261670318063715,
"fifteenMinRate": 0.0021665192890272054,
"meanRate": 0.004407906126221853,
"count": 3,
"oneMinRate": 0.01599160852294868
},
"se.magnuskkarlsson.example.microprofile.boundary.PersonResource.getFirstName": 3
}
No comments:
Post a Comment