Dirac implémente MicroProfile Metrics 5.1.1, dont le vocabulaire fixe les quatre primitives Counter, Gauge, Histogram, Timer, leurs scopes (APPLICATION, BASE, VENDOR), et leur exposition en deux formats (OpenMetrics text et JSON). Cette page balaie ces choix et précise les invariants posés par l’implémentation Vidocq.
Les quatre types de métriques
MP Metrics 5.0 a simplifié la surface héritée des versions 1.x et 2.x : Meter, ConcurrentGauge et SimpleTimer ont été retirés. Restent quatre primitives :
| Type | Annotation | Description |
|---|---|---|
|
|
Compteur monotone incrémental. Implémentation : |
|
|
Valeur instantanée renvoyée par une méthode du bean. Résolu une fois au démarrage via |
|
(non annotable dans le JAR API 5.1.1 utilisé) |
Distribution de valeurs avec percentiles configurables (p50–p999 par défaut) et buckets optionnels. |
|
|
Durée d’invocation mesurée en |
|
Le JAR |
Trois scopes obligatoires
La spec §1.3 distingue trois registres, alimentés et lus séparément :
| Scope | Rôle |
|---|---|
|
Métriques applicatives. Injectable sans qualifier (registre par défaut). |
|
Métriques JVM standardisées : |
|
Métriques propres au runtime — initialement vide côté Dirac, extensible. |
Côté injection :
@Inject
MetricRegistry application; // APPLICATION par défaut
@Inject @RegistryScope(scope = MetricRegistry.BASE_SCOPE)
MetricRegistry base;
@Inject @RegistryScope(scope = MetricRegistry.VENDOR_SCOPE)
MetricRegistry vendor;
Identité d’une métrique : MetricID
Le couple (name, tags) est l’identité unique. Deux compteurs portant le même nom mais des tags différents sont des métriques distinctes ; deux compteurs portant le même nom et les mêmes tags sont la même métrique.
counter("http_requests_total", new Tag("method", "GET"));
counter("http_requests_total", new Tag("method", "POST"));
// → deux Counter distincts, agrégés dans la même famille OpenMetrics
MetricID est un record immuable. Le registre est un ConcurrentHashMap<MetricID, Metric> par scope.
Tags
Les tags sont des paires (clé, valeur) arbitraires. Trois sources se combinent :
-
Tags d’annotation — fixés au moment de la déclaration :
@Counted(tags = "endpoint=orders"). -
Tags globaux applicatifs — clé
mp.metrics.tags, p. ex.mp.metrics.tags=app=orders,env=prod. Ajoutés à toutes les métriques de l’application. -
Tag
mp_scope— injecté automatiquement par le formatter OpenMetrics avec la valeur du scope (application,base,vendor).
L’unicité d’une métrique se calcule sur l’union de ces tags après application des règles spec §3.
Formats d’exposition
Deux formats sont produits par dirac-core, tous deux écrits à la main avec StringBuilder :
| Format | Détail |
|---|---|
OpenMetrics / Prometheus text |
Content-Type |
JSON |
Content-Type |
La négociation de contenu est portée par MetricsEndpoint (Référence).
Configuration de la distribution
Les histogrammes et les minuteries lisent trois clés mp.metrics.distribution.* via MicroProfile Config :
| Clé | Effet |
|---|---|
|
Liste de percentiles ( |
|
Buckets fixes pour les |
|
Buckets fixes pour les |
Une valeur vide (mp.metrics.distribution.percentiles=) désactive complètement les percentiles. L’application est portée par DistributionConfig dans dirac-core.
Endpoint REST GET /metrics
Quand dirac-rest et Cassini sont sur le classpath, trois chemins sont exposés :
| Route | Effet |
|---|---|
|
Tous les scopes, format négocié sur |
|
Un seul scope ( |
|
Une seule famille de métriques. 404 si introuvable. |
L’endpoint est optionnel : si dirac-rest n’est pas déclaré, les métriques restent accessibles programmatiquement via MetricRegistry.
Pour aller plus loin
-
Cas d’usage — annotations, tags, percentiles.
-
Fonctionnement interne — registre lock-free, BCE Vauban.
-
Référence — clés
mp.metrics.*exhaustives.