Registry
Meters in Micrometer are created from and held in a MeterRegistry
. Each supported monitoring system has an implementation of MeterRegistry
. How a registry is created varies for each implementation.
Micrometer includes a SimpleMeterRegistry
that holds the latest value of each meter in memory and does not export the data anywhere. If you do not yet have a preferred monitoring system, you can get started playing with metrics by using the simple registry:
MeterRegistry registry = new SimpleMeterRegistry();
A SimpleMeterRegistry is autowired for you in Spring-based applications.
|
Composite Registries
Micrometer provides a CompositeMeterRegistry
to which you can add multiple registries, letting you publish metrics to more than one monitoring system simultaneously:
CompositeMeterRegistry composite = new CompositeMeterRegistry();
Counter compositeCounter = composite.counter("counter");
compositeCounter.increment(); (1)
SimpleMeterRegistry simple = new SimpleMeterRegistry();
composite.add(simple); (2)
compositeCounter.increment(); (3)
-
Increments are NOOP’d until there is a registry in the composite. The counter’s count still yields 0 at this point.
-
A counter named
counter
is registered to the simple registry. -
The simple registry counter is incremented, along with counters for any other registries in the composite.
Global Registry
Micrometer provides a static global registry called Metrics.globalRegistry
and a set of static builders for generating meters based on this registry (note that globalRegistry
is a composite registry):
class MyComponent {
Counter featureCounter = Metrics.counter("feature", "region", "test"); (1)
void feature() {
featureCounter.increment();
}
void feature2(String type) {
Metrics.counter("feature.2", "type", type).increment(); (2)
}
}
class MyApplication {
void start() {
// wire your monitoring system to global static state
Metrics.addRegistry(new SimpleMeterRegistry()); (3)
}
}
-
Wherever possible (and especially where instrumentation performance is critical), store
Meter
instances in fields to avoid a lookup on their name or tags on each use. -
When tags need to be determined from local context, you have no choice but to construct or lookup the Meter inside your method body. The lookup cost is just a single hash lookup, so it is acceptable for most use cases.
-
It is OK to add registries after meters have been created with code like
Metrics.counter(…)
. These meters are added to each registry, as it is bound to the global composite.