= MicroProfile Metrics Metered
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published

This is an example on how to use microprofile metrics in TomEE.

== Run the application:

    mvn clean install tomee:run 

Within the application, there is an enpoint that will give you a weather weather status for the day and week.

== For the day status call:

    GET http://localhost:8080/mp-metrics-metered/weather/day/status
    
== Response:

    Hi, today is a sunny day!

== Metered Feature
MicroProfile metrics has a feature that can be used to find the rate of requests to a service.

To use this feature you need to annotate the JAX-RS resource method with @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!";
        }
    ...
    }
----
There are some configurations, as part of @Metered, that you need to know:

**String name**
Optional. Sets the name of the metric. If not explicitly given the name of the annotated object is used.

**boolean absolute**
If true, uses the given name as the absolute name of the metric. If false, prepends the package name and class name before the given name. Default value is false.

**String displayName**
Optional. A human-readable display name for metadata.

**String description**
Optional. A description of the metric.

**String[] tags**
Optional. Array of Strings in the <key>=<value> format to supply special tags to a metric.

**boolean reusable**
Denotes if a metric with a certain name can be registered in more than one place. Does not apply to gauges.

**String unit**
Unit of the metric. Default for @Metered is nanoseconds.

== Metric data

Check the Metered metric doing a _GET_ request:

== Prometheus format:

    GET http://localhost:8080/mp-metrics-metered/metrics/application/dailyStatus
    
== Response:
     
	# 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
    
  
== JSON Format:

For json format add the header _Accept=application/json_ to the request. 
  
	{
		"dailyStatus": {
			"count": 2,
			"fifteenMinRate": 5.77762774235716e-14,
			"fiveMinRate": 5.990473088217569e-13,
			"meanRate": 0,
			"oneMinRate": 2.229333774034164e-12,
			"unit": "minutes"
		}
	}
   
== Metric metadata
A metric will have a metadata so you can know more information about it, like displayName, description, tags  etc.

Check the metric metadata doing a _OPTIONS_ request:

== Request

    OPTIONS http://localhost:8080/mp-metrics-metered/metrics/application/dailyStatus

== Response:

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


== Test the application:

    mvn test
