Metrics
Overview
Helidon SE metrics is a neutral metrics API which provides
- a unified way for Helidon servers to export monitoring data—telemetry—to management agents, and
- a unified Java API which all application programmers can use to register and update meters to expose telemetry data from their services.
Metrics is one of the Helidon observability features.
metrics.gc-time-type = gauge
Terminology
Helidon SE uses the term "metrics" to refer to the subsystem in Helidon which manages the registration of, updates to, and reporting of aggregate statistical measurements about the service. The term "meter" refers to an entity which collects these measurements, such as a counter or a timer.
Maven Coordinates
To enable metrics, add the following dependency to your project’s pom.xml (see
Managing Dependencies).
<dependency>
<groupId>io.helidon.metrics</groupId>
<artifactId>helidon-metrics-api</artifactId>
</dependency>
This dependency adds the metrics API and a no-op implementation of that API to your project. The no-op implementation:
- does not register meters in a registry
- does not update meter values
- does not expose the metrics endpoint for reporting meter values.
To include the full-featured metrics implementation and support for the metrics endpoint, add the following dependency to your project:
Packaging the metrics endpoint support and a full-featured metrics implementation:
<dependency>
<groupId>io.helidon.webserver.observe</groupId>
<artifactId>helidon-webserver-observe-metrics</artifactId>
</dependency>
Adding this dependency packages the full-featured metrics implementation and support for the metrics endpoint with your service.
You might notice the transitive dependency
io.helidon.metrics.providers:helidon-metrics-providers-micrometer in your
project. This component contains an implementation of the Helidon metrics API
that uses Micrometer as the underlying metrics technology.
Helidon provides several built-in meters in a separate artifact. To include the build-in meters, add the following dependency to your project:
Packaging the built-in meters:
<dependency>
<groupId>io.helidon.metrics</groupId>
<artifactId>helidon-metrics-system-meters</artifactId>
<scope>runtime</scope>
</dependency>
Instrumenting Your Service
You add meters to your service by writing code which explicitly invokes the metrics API to register meters, retrieve previously-registered meters, and update meter values.
Later sections of this document describe how to do this.
Meter Types
Helidon supports meters inspired by Micrometer and summarized in the following table:
| Meter Type | Description | Micrometer reference |
|---|---|---|
Counter | Monotonically-increasing long value. | Counters |
DistributionSummary | Summary of samples each with a long value. Reports aggregate information over all samples (count, total, mean, max) as well as the distribution of sample values using percentiles and bucket counts. | Distribution summaries |
Timer | Accumulation of short-duration (typically under a minute) intervals. Typically updated using a Java Duration or by recording the time taken by a method invocation or lambda. Reports the count, total time, max, and mean; provides a distribution summary of the samples. | Timers |
Gauge<? extends Number> | View of a value that is assignment-compatible with a subtype of Java Number. The underlying value is updated by code elsewhere in the system, not by invoking methods on the gauge itself. | Gauges |
Types of Meters
Meters Category
Helidon distinguishes among scopes, or categories, of meters.
Helidon includes meters in the built-in scopes described below. Applications
often register their own meters in the application scope but can create their
own scopes and register meters within them.
| Built-in Scope | Typical Usage |
|---|---|
base | OS or Java runtime measurements (available heap, disk space, etc.). |
vendor | Implemented by vendors, including the REST.request metrics and other key performance indicator measurements (described in later sections). |
application | Declared via annotations or programmatically registered by your service code. |
When an application creates a new meter it can specify which scope the meter
belongs to. If the application does not specify a scope for a new meter, the
default scope is application.
Meter Registry
Helidon stores all meters in a meter registry. Typically, applications use the
global meter registry which is the registry where Helidon stores built-in
meters. Application code refers to the global registry using
Metrics.globalRegistry().
Publishing Metrics
Helidon’s Micrometer-based metrics implementation includes these ways of publishing metrics data to external systems:
- Prometheus/OpenMetrics
- OTLP (OpenTelemetry Protocol)
You can configure publishers in the publishers configuration section under the
top level metrics node or under server.features.observe.observers.metrics.
If you do not set up publishers explicitly, Helidon uses an inferred Prometheus
publisher for backward compatibility. See this later section
for details.
Publishers in Helidon’s Micrometer-based metrics implementation use Micrometer
MeterRegistry implementations. For each enabled publisher, Helidon adds the
corresponding meter registry to Micrometer’s global registry. This has these
important effects:
- Meters which Helidon or your code registers using the Helidon metrics API are registered in all active Micrometer meter registries.
- Each Helidon meter registered has an implementation in every active Micrometer meter registry.
- When Helidon or your code updates a Helidon meter, Micrometer applies the change to every corresponding meter from each active meter registry.
As a result, configuring more than one active meter registry can affect performance.
OpenTelemetry Protocol
If you configure an OTLP publisher, Helidon exports metrics data periodically to a backend system you configure.
Configuration options
| Key | Type | Default | Description |
|---|---|---|---|
headers | Map< | Headers to add to each transmission message | |
base- | Time | java. | Base time unit for timers |
prefix | String | otlp | The prefix for settings |
aggregation- | Aggregation | CUMULATIVE | Algorithm to use for adjusting values before transmission |
enabled | Boolean | true | Whether the configured publisher is enabled |
url | String | http: | URL to which to send metrics telemetry |
max- | Integer | 20 | Maximum scale value to apply to statistical histogram |
batch- | Integer | 10000 | Number of measurements to send in a single request to the backend |
max- | Integer | 160 | Maximum bucket count to apply to statistical histogram |
name | String | N/ | |
interval | Duration | PT60s | Interval between successive transmissions of metrics data |
max- | Map< | Maximum number of buckets to use for specific meters | |
properties | Map< | Property values to be returned by the OTLP meter registry configuration | |
resource- | Map< | Attribute name/value pairs to be associated with all metrics transmissions |
The configuration directly mirrors the Micrometer OtlpMeterRegistry settings
so you can control all behavior which Micrometer exposes for the meter registry.
The following example sets up an OTLP publisher to transmit metrics data every 30 seconds.
Example OTLP publisher settings:
Prometheus Publisher
If you configure a Prometheus publisher or rely on the inferred one, Helidon can make the metrics data available in the Prometheus/OpenMetrics format. (To serve the data at the metrics endpoint in your service, your project must also depend on the Helidon metrics observer component.)
Configuration options
| Key | Type | Default | Description |
|---|---|---|---|
prefix | String | Property name prefix | |
name | String | N/ | |
interval | Duration | Step size used in computing "windowed" statistics | |
descriptions | Boolean | Whether to include meter descriptions in Prometheus output | |
enabled | Boolean | true | Whether the configured publisher is enabled |
Inferred Publisher
As described earlier, Helidon prepares an inferred Prometheus publisher if you do not set up any publishers.
Note that Helidon uses the inferred publisher only if you add no publishers explicitly, either in the configuration or programmatically. If you specify any publishers explicitly, Helidon uses only the ones you set up.
In particular, Helidon does not use the inferred Prometheus publisher if you
create a metrics.publishers section containing only an OTLP publisher.
You can configure other publishers and still have Helidon use the default one by
simply adding the prometheus publisher entry. You do not need to specify
further settings for it.
Using an OLTP publisher and the default Prometheus publisher:
metrics:
publishers:
prometheus:
otlp:
interval: PT20S
Additional Publishers
You can write other publishers by following these steps:
- Choose one of the Micrometer
MeterRegistryimplementations for the type of publishing you want to support. (for exampleDatadogMeterRegistry) - Create a config blueprint which exposes the meter registry’s settable
properties from
DatadogConfig. - Write a
DatadogPublisherclass which implements Helidon’sMetricsPublisherfor Datadog. - Write a
DatadogPublisherProviderclass which implements Helidon’sMetricsPublisherProviderfor your publisher. - Advertise your provider so Java service loading can find it, creating a
META-INF/services/io.helidon.metrics.spi.PublisherProviderfile listing your implementation class.
Look at Helidon’s OTLP publisher blueprint and the related types as an example.
Refer to your publisher in configuration using the config key you set up in the publisher provider.
Example config using a hypothetical Datadog publisher:
metrics:
publishers:
micrometer-datadog:
interval: PT15S
Metrics Endpoint
When you add the helidon-webserver-observe-metrics dependency to your project,
Helidon provides a built-in REST endpoint /observe/metrics which responds with
a report of the registered meters and their values.
Clients can request a particular output format from the endpoint.
Formats for /observe/metrics output:
| Format | Requested by |
|---|---|
| OpenMetrics (Prometheus) | default (text/plain) |
| JSON | Header Accept: application/json |
Clients can also limit the report by specifying the scope as a query parameter in the request URL:
/observe/metrics?scope=base/observe/metrics?scope=vendor/observe/metrics?scope=application
Further, clients can narrow down to a specific metric name by adding the name as
another query parameter, such as
/observe/metrics?scope=application&name=myCount.
Example Reporting: Prometheus format:
curl -s -H 'Accept: text/plain' -X GET http://localhost:8080/observe/metrics
# HELP classloader_loadedClasses_count Displays the number of classes that are currently loaded in the Java virtual machine.
# TYPE classloader_loadedClasses_count gauge
classloader_loadedClasses_count{scope="base",} 5297.0
See the summary of the OpenMetrics and Prometheus Format for more information.
Example Reporting: JSON format:
curl -s -H 'Accept: application/json' -X GET http://localhost:8080/observe/metrics
{
"base" : {
"memory.maxHeap" : 3817865216,
"memory.committedHeap" : 335544320
}
}
In addition to your application meters, the reports contain other meters of interest such as system and VM information.
Format
The OpenMetrics format and the Prometheus exposition format are very similar in most important respects but are not identical. This brief summary treats them as the same.
The OpenMetrics/Prometheus format represents each meter using three lines of output as summarized in the following table.
| Line prefix | Purpose | Format |
|---|---|---|
# TYPE | Displays the scope, name, and type of the meter | TYPE <scope>:<output-name> <meter-type> |
# HELP | Displays the scope, name, and description of the meter | HELP <scope>:<output-name> <registered description> |
| (none) | Displays the scope, meter ID, and current value of the meter | <scope>:<output-name> <current value> |
The OpenMetrics/Prometheus output converts meter IDs in these ways:
- Names in camel case are converted to "snake case" and dots are converted to underscores.
- Names include any units specified for the meter.
- For percentiles, the ID includes a tag identifying which percentile the line of output describes.
As the earlier example output showed, for a meter with multiple values, the OpenMetrics/Prometheus output reports a "metric family" which includes a separate family member meter for each of the multiple values.
The name for each member in the family is derived from the registered name for the meter plus a suffix indicating which one of the meter’s multiple values the line refers to.
The following table summarizes the naming for each meter type:
| Meter Type | Example registered name | Meter family member | Name Suffix | Example displayed name |
|---|---|---|---|---|
Counter | requests. | count | _total | requests_ |
Distribution | nameLengths | count | _count | name |
| sum | _sum | nameLengths_ | ||
| max | _max | nameLengths_ | ||
| percentile | none | nameLengths{ | ||
Gauge | classloader. | value | none | classloader_ |
Timer 1 | vthreads. | count | _count | vthreads_ |
| sum | _sum | vthreads_ | ||
| max | _max | vthreads_ | ||
| percentile | none | vthreads_ |
1 The OpenMetrics/Prometheus output format reports a timer as a summary with units of seconds.
JSON Format
Unlike OpenMetrics/Prometheus output, which combines the data and the metadata
in a single response, you use an HTTP GET request to retrieve metrics JSON
data and an OPTIONS request to retrieve metadata in JSON format.
Helidon groups meters in the same scope together in JSON output as shown in the following example.
JSON metrics output structured by scope (partial):
If an HTTP request selects by scope, the output omits the extra level of structure that identifies the scope as shown in the following example.
JSON metrics output for the base scope (partial):
{
"cpu.systemLoadAverage": {
"type": "gauge",
"description": "Displays the system load average for the last minute."
},
"classloader.loadedClasses.count": {
"type": "gauge",
"description": "Displays the number of classes that are currently loaded in the Java virtual machine."
}
}
Understanding the JSON Metrics Data Format
The Helidon JSON format expresses each meter as either a single value (for example, a counter) or a structure with multiple values (for example, a timer).
JSON output for a single-valued meter (for example, Counter):
"requests.count": 5
JSON output for a multivalued meter (for example, Timer):
"getTimer": {
"count": 3,
"max": 0.0030455,
"mean": 0.0011060836666666666,
"elapsedTime": 0.003318251,
"p0.5": 0.000151552,
"p0.75": 0.003141632,
"p0.95": 0.003141632,
"p0.98": 0.003141632,
"p0.99": 0.003141632,
"p0.999": 0.003141632
}
By default, Helidon formats time values contained in JSON output as seconds. You can change this behavior as described below.
Understanding the JSON Metrics Metadata Format
Access the metrics endpoint with an HTTP OPTIONS request and the Accept: application/json header to retrieve metadata in JSON format.
Example Counter metadata:
"requests.count": {
"type": "counter",
"description": "Each request (regardless of HTTP method) will increase this counter"
}
Example Timer metadata:
"getTimer": {
"type": "timer",
"unit": "seconds",
"description": "Timer for getting the default greeting"
}
Generally, the output for a given meter reflects only the metadata that the application or Helidon code explicitly set on that meter.
One exception is that metadata for a timer always includes the unit field. By
default, Helidon formats timer data in JSON output as seconds, regardless of any
explicit baseUnit setting applied to the timers. But as described
below you can change this behavior which can
lead to different timers being formatted using different units. Checking the
metadata is the only way to know for sure what units Helidon used to express a
given timer, so Helidon always includes unit in timer metadata.
Controlling JSON Timer Output
By default, Helidon expresses timer data as seconds.
You can change this using configuration:
Setting default timer units for JSON in application.yaml:
metrics:
timers:
json-units-default: units
- For units specify any valid name for a
TimeUnitvalue (SECONDS,MILLISECONDS, etc.)
If you have configured json-units-default, Helidon formats each timer’s data
as follows:
- If code set
baseUniton the timer, Helidon uses those units for that timer. - Otherwise, Helidon uses the default units you configured.
To enable the JSON output behavior from Helidon 3, specify json-units-default
as NANOSECONDS.
Enabling the Metrics REST Service
If you add the dependencies described above, your service automatically supports
the metrics REST endpoint as long as the WebServer is configured to discover
features automatically.
If you disable auto-discovery, you can add the metrics observer explicitly.
- Create an instance of
MetricsObserver, either directly as shown below or using its builder. - Include the
MetricsObserverinstance in your application’sObserveFeature. - Register your
ObserveFeaturewith yourWebServer.
ObserveFeature observe = ObserveFeature.builder()
.config(config.get("server.features.observe"))
.addObserver(MetricsObserver.create())
.build();
WebServer server = WebServer.builder()
.config(Config.global().get("server"))
.featuresDiscoverServices(false)
.addFeature(observe)
.routing(Main::routing)
.build()
.start();
API
To work with Helidon Metrics in your code, follow these steps:
- Use the static
globalRegistrymethod on theMetricsinterface to get a reference to the globalMeterRegistryinstance. - Use the
MeterRegistryinstance to register new meters and look up previously-registered meters. - Use the meter reference returned from the
MeterRegistryto update the meter or get its value.
You can also use the MeterRegistry to remove an existing meter.
Helidon Metrics API
The Helidon Metrics API defines the classes and interfaces for meter types and other related items.
The following table summarizes the meter types.
| Meter Type | Usage |
|---|---|
Counter | Monotonically increasing count of events. |
Gauge | Access to a value managed by other code in the service. |
DistributionSummary | Calculates the distribution of a value. |
Timer | Frequency of invocations and the distribution of how long the invocations take. |
Meter Types
Each meter type has its own set of methods for updating and retrieving the value.
MeterRegistry
To register or look up meters programmatically, your service code uses the
global MeterRegistry. Simply invoke Metrics.globalRegistry() to get a
reference to the global meter registry.
To locate an existing meter or register a new one, your code:
- Creates a builder of the appropriate type of meter, setting the name and possibly other characteristics of the meter.
- Invokes the
MeterRegistry.getOrCreatemethod, passing the builder.
The meter registry returns a reference to a previously-registered meter with the specified name and tags or, if none exists, a newly-registered meter. Your code can then operate on the returned meter as needed to record new measurements or retrieve existing data.
The example code in the Examples section below illustrates how to register, retrieve, and update meters.
Understanding Timers, Units, and Output
Your application can assign the meter builder’s Meter.Builder baseUnit setting for any meter your application creates. In
particular, the Timer.Builder baseUnit method allows code
to assign a baseUnit for a timer, passing a Java TimeUnit value.
The timer builder also has the String variant of the baseUnit method and
enforces that the value corresponds (case-insensitively) to one of the
TimeUnit enum values.
Note that, regardless of the baseUnit setting for a Timer, by convention and
specification Prometheus output expresses time values in seconds.
By default, the same is true of Helidon’s JSON format: timer values are
displayed in seconds regardless of any timer’s baseUnit setting. You can
override this as described in the Controlling Timer
Output section, in which case the JSON output
for each timer reflects its baseUnit setting.
Accessing the Underlying Implementation: unwrap
The neutral Helidon metrics API is an abstraction of common metrics behavior independent of any given implementation. As such, we intentionally excluded some implementation-specific behavior from the API.
Sometimes you might want access to methods that are present in a particular
metrics implementation but not in the Helidon API. Helidon allows that via the
unwrap method on the meter types and on their builders. Each full
implementation of the Helidon meter types and their builders refers to a
delegate meter or delegate builder internally. The unwrap method lets you
obtain the delegate, cast to the type you want.
Of course, using this technique binds your code to a particular metrics implementation.
The Wrapper interface declares the unwrap method which accepts a
class parameter to which the delegate is cast. You can then invoke any method
declared on the implementation-specific type.
Configuration options
| Key | Type | Default | Description |
|---|---|---|---|
publishers- | Boolean | false | Whether to enable automatic service discovery for publishers |
rest- | Boolean | false | Whether automatic REST request metrics should be measured |
warn- | Boolean | true | Whether to log warnings when multiple registries are created |
roles | List< | observe | Hints for role names the user is expected to be in |
virtual- | Duration | PT0. | Threshold for sampling pinned virtual threads to include in the pinned threads meter |
built- | Built | CAMEL | Output format for built-in meter names |
enabled | Boolean | true | Whether metrics functionality is enabled |
app- | String | Value for the application tag to be added to each meter ID | |
tags | List< | Global tags | |
app- | String | Name for the application tag to be added to each meter ID | |
virtual- | Boolean | false | Whether Helidon should expose meters related to virtual threads |
publishers | List< | Metrics publishers which make the metrics data available to external systems | |
key- | Key | Key performance indicator metrics settings | |
permit- | Boolean | true | Whether to allow anybody to access the endpoint |
scoping | Scoping | Settings related to scoping management | |
timers. | Time | Default units for timer output in JSON if not specified on a given timer |
Deprecated Options
| Key | Type | Default | Description |
|---|---|---|---|
rest- | Boolean | Whether automatic REST request metrics should be measured (as indicated by the deprecated config key rest-, the config key using a hyphen instead of a dot separator) | |
gc- | Gc | COUNTER | Whether the gc. meter should be registered as a gauge (vs |
| Key | Default Value |
|---|---|
app-tag-name | app |
scoping.tag-name | scope |
scoping.default | application |
Meter Type for gc.time
To date Helidon 4 releases have implemented the system-provided meter gc.time
as a counter. In fact, a gauge is more suitable for the approximate time the JVM
has spent doing garbage collection.
Helidon uses a counter by default to preserve backward compatibility, but you
can choose to use a gauge by setting the configuration property
metrics.gc-time-type to gauge. You can also set the config property to
counter which is the default.
Why should you care? In fact, this distinction might not make a difference for
many users. But for others the differences between the programmatic APIs for
Counter and Gauge would affect application code that works directly with the
gc-time meter. Further, the difference in output particularly in the
OpenMetrics/Prometheus format might affect their application or downstream
monitoring tools.
The ability to choose the meter type for gc.time is deprecated and is planned
for removal in a future major release of Helidon at which time Helidon will
always use a gauge.
Metrics Observer
Helidon can make the registered meters and their current values available
externally at an endpoint (/observe/metrics by default). You can control
aspects of how Helidon furnishes this information under the
server.features.observe.observers.metrics configuration section.
| key | type | default value | description |
|---|---|---|---|
auto | AutoHttpMetricsConfig | Automatic metrics collection settings. | |
enabled | boolean | true | Whether this observer is enabled. |
endpoint | string | /observe/metrics | Path at which clients can retrieve metrics information. |
See the Helidon OpenTelemetry documentation for more information.
Selecting REST Endpoints for Automatic Measurement
You can choose which endpoints to include in Helidon’s automatic measurements
using the auto-http-metrics config section.
Configuration options
| Key | Type | Default | Description |
|---|---|---|---|
opt- | List< | Elective attribute for which to opt in | |
paths | List< | Automatic metrics collection settings | |
sockets | List< | Socket names for sockets to be instrumented with automatic metrics | |
enabled | Boolean | true | Whether automatic metrics collection as a whole is enabled |
The paths section contains zero or more entries, each entry having the
following settings:
| Key | Type | Default | Description |
|---|---|---|---|
path | String | Path matching expression for this path config entry | |
methods | List< | HTTP methods for which this path config applies; default is to match all HTTP methods | |
enabled | Boolean | true | Whether automatic metrics are to be enabled for requests which match the specified io. and HTTP methods |
Helidon decides whether to measure incoming requests as follows:
- If you omit the
auto-http-metricsconfiguration, Helidon measures all endpoints. - If you specify the
auto-http-metricsconfiguration, by default Helidon does not measure built-in endpoints such as metrics, health, and openapi. You can add items underauto-http-metrics.pathsto control more exactly which endpoints to measure. - If you include the
pathssection, Helidon checks a request against the path entries in order. A given request matches an entry if its path matches the path pattern and its HTTP method is in themethodslist. If there is nomethodslist for an entry, all HTTP methods match the entry. - If a request matches an entry, the entry’s
enabledsetting determines if the request should be measured. - If a request matches multiple entries, the first match wins.
- If a request matches no entry, it is measured.
The auto-http-metrics.sockets setting controls which sockets are included in
the measurements; if not set, Helidon measures requests on all sockets.
Including and Excluding Endpoints from Automatic Measurement:
The AutoHttpMetricsConfig documentation describes the configuration more fully.
Examples
Helidon SE includes several pre-written example applications illustrating aspects of metrics:
- Enabling/disabling meters using
MetricsObserverandMetricsConfig - Controlling key performance indicator metrics using
configuration and
KeyPerformanceIndicatorMetricsSettings.
Custom Meter
The following example, based on the Helidon SE QuickStart application, shows how
to register and update a new Counter in application code. The counter tracks
the number of times any of the service endpoints is accessed.
Define and use a Counter:
Perform the following steps to see the new counter in action.
Build and run the application:
mvn package
java -jar target/helidon-quickstart-se.jar
Retrieve application metrics:
Access a service endpoint to retrieve a greeting:
curl http://localhost:8080/greet
{"message":"Hello World"}
Retrieve application metrics again:
curl 'http://localhost:8080/observe/metrics?scope=application'
Configuration Examples
Disabling metrics entirely:
server:
features:
observe:
observers:
metrics:
enabled: false
Helidon does not update metrics, and the /observe/metrics endpoints respond
with 404.
Virtual Threads Meters
Gathering data to compute the meters for virtual threads is designed to be as efficient as possible, but doing so still imposes a load on the server and by default Helidon does not report meters related to virtual threads.
Enabling virtual thread meters:
metrics:
virtual-threads:
enabled: true
Pinned Virtual Threads
Helidon measures pinned virtual threads only when the thread is pinned for a length of time at or above a threshold. Control the threshold as shown in the example below.
Setting virtual thread pinning threshold to 100 ms:
metrics:
virtual-threads:
pinned:
threshold: PT0.100S
The threshold value is a Duration string, such as PT0.100S for 100
milliseconds.
Key Performance Indicator (KPI) Meters
Any time you include the Helidon metrics module in your application, Helidon
tracks a basic performance indicator meter: a Counter of all requests received
(requests.count)
Helidon SE also includes additional, extended KPI meters which are disabled by default:
- current number of requests in-flight - a
Gauge(requests.inFlight) of requests currently being processed - long-running requests - a
Counter(requests.longRunning) measuring the total number of requests which take at least a given amount of time to complete; configurable, defaults to 10000 milliseconds (10 seconds) - load - a
Counter(requests.load) measuring the number of requests worked on (as opposed to received) - deferred - a
Gauge(requests.deferred) measuring delayed request processing (work on a request was delayed after Helidon received the request)
You can enable and control these meters using configuration:
Controlling extended KPI meters:
server:
features:
observe:
observers:
metrics:
key-performance-indicators:
extended: true
long-running:
threshold-ms: 2000
Prometheus Support
Helidon provides optional, deprecated support for the Prometheus metrics API.
helidon-metrics-prometheus is deprecated as of Helidon 4.5.0 and will be
removed in a future major release. Prefer Helidon’s built-in metrics
implementation, which already exposes Prometheus (OpenMetrics) output without
requiring direct use of the Prometheus client API.If you are maintaining an existing application that already uses the Prometheus client API, your service can still register Prometheus support with your routing set-up. You can customize its configuration. For information about using Prometheus, see the Prometheus documentation: https://prometheus.io/docs/introduction/overview/.
Maven Coordinates
Dependency for Helidon Prometheus API support:
<dependency>
<groupId>io.helidon.metrics</groupId>
<artifactId>helidon-metrics-prometheus</artifactId>
</dependency>
Usage
If you are maintaining an existing application, your code uses the Prometheus API to manage metrics.
To expose those metrics to clients via a REST endpoint, your code uses the
PrometheusSupport interface which Helidon provides.
Your code creates a PrometheusSupport object either using
a static factory method (shown in the following example) or by using its
Builder.
routing
.addFeature(PrometheusSupport.create())
.register("/myapp", new MyService());
This example uses the default Prometheus CollectorRegistry. By default, the
PrometheusSupport and exposes its REST endpoint at the path /metrics.
Use the builder obtained by PrometheusSupport.builder() to configure a
different CollectorRegistry or a different path.