Preloader image

Este es un ejemplo sobre cómo utilizar las métricas de MicroProfile en TomEE. El proyecto incluye un perfil de Docker que se puede usar para crear una imagen de Docker.

Ejecute la aplicación:

$ mvn clean install tomee:run
Alternativamente, compile y ejecute la aplicación a través de Docker (tenga en cuenta el uso del perfil de docker):
$ mvn -Pdocker docker:build
$ docker run -it --rm -p 8080:8080 --name=tomee-mp-metrics-counted tomee/mp-metrics-counted

Dentro de la aplicación, hay un endpoint que te dará el estado del clima para el día y la semana.

Obtenga el clima para la semana:

$ curl -X GET http://localhost:8080/mp-metrics-counted/weather/week/status
Si ejecuta usando Docker, debido a que la aplicación está instalada como la aplicación ROOT, elimine el nombre de la aplicación de la URL:
$ curl -X GET http://localhost:8080/weather/week/status

Response:

Hi, today is a sunny day!

Usando @Counted

Las métricas de MicroProfile tienen una función que se puede usar para contar solicitudes a un servicio.

Para utilizar esta función, debe anotar los métodos de los recursos JAX-RS con @Counted.

@Path("/weather")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApplicationScoped
public class WeatherService {

    @Path("/day/status")
    @Counted(monotonic = true, name = "weather_day_status", absolute = true)
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String dayStatus() {
        return "Hi, today is a sunny day!";
    }
...
}

Hay algunas configuraciones, como parte de @Counted, que necesita saber:

String name Opcional. Establece el nombre de la métrica. Si no se proporciona explícitamente, se utiliza el nombre del objeto anotado.

boolean absolute Si es verdadero, usa el nombre dado como el nombre absoluto de la métrica. Si es falso, antepone el nombre del paquete y el nombre de la clase antes del nombre dado. El valor predeterminado es falso.

String displayName Opcional. Un nombre para mostrar legible para los metadatos.

String description Opcional. Una descripción de la métrica.

String[] tags Opcional. Matriz de cadenas en el formato = para suministrar etiquetas especiales a una métrica.

boolean reusable Indica si una métrica con un nombre determinado se puede registrar en más de un lugar. No se aplica a @Gauges (medidores).

Datos de la Métrica

Verifique la métrica del contador haciendo una solicitud GET:

Formato Prometheus:

$ curl -X GET http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status

Respuesta Prometheus:

# TYPE application:weather_day_status counter
application:weather_day_status 1.0

Formato JSON:

Para el formato json, agregue el encabezado Accept: application/json a la solicitud HTTP.

$ curl -X GET -H "Accept: application/json" http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status

Respuesta JSON:

{
    "weather_day_status": {
        "delegate": {},
        "unit": "none",
        "count": 1
    }
}

Metadatos Métrica

Una métrica tendrá metadatos para que pueda conocer más información al respecto, como displayName,description, tags, etc.

Verifique los metadatos de la métrica haciendo una solicitud HTTP OPTIONS:

Solicitud HTTP OPTIONS

$ curl -X OPTIONS http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status

Respuesta:

{
    "weather_day_status": {
        "unit": "none",
        "displayName": "Weather Day Status",
        "name": "weather_day_status",
        "typeRaw": "COUNTER",
        "description": "This metric shows the weather status of the day.",
        "type": "counter",
        "value": {
            "unit": "none",
            "displayName": "Weather Day Status",
            "name": "weather_day_status",
            "tagsAsString": "",
            "typeRaw": "COUNTER",
            "description": "This metric shows the weather status of the day.",
            "type": "counter",
            "reusable": false,
            "tags": {}
        },
        "reusable": false,
        "tags": ""
    }
}

También puede probarlo utilizando WeatherServiceTest.java disponible en el proyecto.