= Métricas con MicroProfile `@Counted` (Contado)
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published

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:

[source,bash]
----
$ mvn clean install tomee:run
----

NOTE: Alternativamente, compile y ejecute la aplicación a través de Docker
(tenga en cuenta el uso del perfil de docker):

[source,bash]
----
$ mvn -Pdocker docker:build
----

[source,bash]
----
$ 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:

[source,bash]
----
$ curl -X GET http://localhost:8080/mp-metrics-counted/weather/week/status
----

IMPORTANT: 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:

[source,bash]
----
$ curl -X GET http://localhost:8080/weather/week/status
----

== Response:

[source,text]
----
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`.

[source,java]
----
@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:

[source,bash]
----
$ curl -X GET http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status
----

=== Respuesta Prometheus:

[source,text]
----
# 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.

[source,bash]
----
$ curl -X GET -H "Accept: application/json" http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status
----

=== Respuesta JSON:

[source,javascript]
----
{
    "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_

[source,bash]
----
$ curl -X OPTIONS http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status
----

=== Respuesta:

[source,javascript]
----
{
    "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.
