blob: 983b2bb7e98d1f9a5ef5739cff018ba5f3e049c1 [file] [log] [blame]
= Métricas com MicroProfile `@Counted` (Contado)
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published
Este é um exemplo sobre como utilizar as métricas de MicroProfile no Tomee. O projeto inclui um perfil de Docker que se pode usar para criar uma imagem de Docker.
== Executando a aplicação:
[source,bash]
----
$ mvn clean install tomee:run
----
NOTE: Como alternativa, compile e execute o aplicativo através do Docker
(observe o uso do perfil 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 do aplicativo, há um endpoint que fornecerá o estado do tempo para o dia e a semana.
== Veja o clima da semana:
[source,bash]
----
$ curl -X GET http://localhost:8080/mp-metrics-counted/weather/week/status
----
IMPORTANTE: Se você executar usando o Docker, porque o aplicativo está instalado
como o aplicativo ROOT, remova o nome do aplicativo do URL:
[source,bash]
----
$ curl -X GET http://localhost:8080/weather/week/status
----
== Resposta:
[source,text]
----
Hi, today is a sunny day!
----
== Usando `@Counted`
As métricas do MicroProfile têm uma função que pode ser usada para contar requisições para um serviço.
Para usar esta função, você deve anotar os métodos dos recursos JAX-RS com `@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!";
}
...
}
----
Existem algumas configurações, como parte do `@Counted`, que você precisa saber:
*String name* Opcional. Define o nome da métrica. Se não for fornecido
explicitamente, o nome do objeto anotado é usado.
*boolean absolute* Se verdadeiro, use o nome fornecido como o nome absoluto da métrica.
Se falso, coloque o nome do pacote e o nome da classe antes do nome fornecido. O valor padrão é falso.
*String displayName* Opcional. Um nome de exibição legível para
metadados.
*String description* Opcional. Uma descrição da métrica.
*String[] tags* Opcional. Matriz de cadeia no formato = para fornecer
etiquetas especiais para uma métrica.
*boolean reusable* Indica se uma métrica com um determinado nome pode ser
registrado em mais de um local. Não se aplica a `@Gauges` (metros).
== Dados Métricos
Verifique a métrica do contador, fazendo uma solicitação _GET_:
=== Formato Prometheus:
[source,bash]
----
$ curl -X GET http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status
----
=== Resposta Prometheus:
[source,text]
----
# TYPE application:weather_day_status counter
application:weather_day_status 1.0
----
=== Formato JSON:
Para o formato json, adicione o cabeçalho `Accept:application/json` à requisição HTTP.
[source,bash]
----
$ curl -X GET -H "Accept: application/json" http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status
----
=== Resposta JSON:
[source,javascript]
----
{
"weather_day_status": {
"delegate": {},
"unit": "none",
"count": 1
}
}
----
== Metadatos Métrica
Uma métrica terá metadados para que você possa saber mais sobre ela, como `displayName`,`descrição`, `tags` etc.
Verifique os metadados da métrica fazendo uma requisição HTTP _OPTIONS_:
=== Requisição HTTP _OPTIONS_
[source,bash]
----
$ curl -X OPTIONS http://localhost:8080/mp-metrics-counted/metrics/application/weather_day_status
----
=== Resposta:
[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": ""
}
}
----
Você também pode testá-lo usando WeatherServiceTest.java disponível no projeto.