= Métricas con MicroProfile `@Metered`
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published

Este es un ejemplo sobre cómo utilizar las métricas de MicroProfile en TomEE.

== Ejecute la aplicación:

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

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-metered/weather/day/status
----

== Response:

[source,text]
----
Hi, today is a sunny day!
----

== Usando `@Metered`

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

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

[source,java]
----
@Path("/weather")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApplicationScoped
public class WeatherService {

    @Path("/day/status")
    @Metered(name = "dailyStatus",
             unit = MetricUnits.MINUTES,
             description = "Metrics to daily weather status method",
             absolute = true)
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String dayStatus() {
        return "Hi, today is a sunny day!";
    }
...
}
----

Hay algunas configuraciones, como parte de `@Metered`, 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 <key>=<value> 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).

**String unit**
Unidad de la métrica. El valor predeterminado para `@Metered` es nanosegundos.

== Datos de la Métrica

Verifique la métrica `@Metered` haciendo una solicitud _GET_:

== Formato Prometheus:

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

== Respuesta Prometheus:

[source,text]
----
# TYPE application:daily_status_seconds_count meter
application:daily_status_seconds_count 1.2E-7
# TYPE application:daily_status_rate_per_second meter
application:daily_status_rate_per_second 0.0
# TYPE application:daily_status_one_min_rate_per_second meter
application:daily_status_one_min_rate_per_second 1.3376002644204984E-19
# TYPE application:daily_status_five_min_rate_per_second meter
application:daily_status_five_min_rate_per_second 3.5942838529305413E-20
# TYPE application:daily_status_fifteen_min_rate_per_second meter
application:daily_status_fifteen_min_rate_per_second 3.4665766454142955E-21
----

== Formato JSON:

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

== Respuesta JSON

[source,javascript]
----
{
	"dailyStatus": {
		"count": 2,
		"fifteenMinRate": 5.77762774235716e-14,
		"fiveMinRate": 5.990473088217569e-13,
		"meanRate": 0,
		"oneMinRate": 2.229333774034164e-12,
		"unit": "minutes"
	}
}
----

== 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-metered/metrics/application/dailyStatus
----

== Respuesta:

[source,javascript]
----
{
	"dailyStatus": {
		"description": "Metrics to daily weather status method",
		"displayName": "",
		"name": "dailyStatus",
		"reusable": false,
		"tags": "",
		"type": "meter",
		"typeRaw": "METERED",
		"unit": "minutes"
	}
}
----

== Pruebe la aplicación:

[source,bash]
----
$ mvn test
----
