I would like to create a custom metric in Spring Boot application using Micrometer API. So that it can be exposed to any supported monitoring tool like Prometheus/Wavefront etc.,
In this example, we are going to create a Counter type metric in Spring PetClinic application. I would like to Count the number of Pets created by Pet Type.
Initialize the Counter object
In the below example, we are creating a metric object using fluent builder API. Creating multiple counter objects, one per pet type.
import io.micrometer.core.instrument.MeterRegistry;
class PetResource {
...
private Map<Integer, Counter> metricCounters = null;
private MeterRegistry meterRegistry;
...
@Autowired
public PetResource(MeterRegistry meterRegistry, PetRepository petRepository, OwnerRepository ownerRepository) {
this.meterRegistry = meterRegistry;
this.petRepository = petRepository;
this.ownerRepository = ownerRepository;
initPetCounters();
}
...
private void initPetCounters() {
List<PetType> petTypes = this.getPetTypes();
metricCounters = new HashMap<Integer, Counter>();
for (PetType petType : petTypes) {
Counter petCounter = Counter.builder("pets.by.type")
.tag("type", petType.getName())
.description("Number of Pets created by type")
.register(meterRegistry); //Create counter by fluent API.
metricCounters.put(petType.getId(), petCounter);
//this.meterRegistry.counter("pets.by.type", "type", "cat"); // Sample create metric without fluent API
}
}
}Increment the Counter on new Pet Creation
Based on the type of the Pet created, will increment the counter (default by 1).
...
class PetResource {
...
public Pet processCreationForm( ... ) {
...
Counter counter = metricCounters.get(petRequest.getTypeId());
counter.increment();
...
}
...
}Once you deploy your application and enable Prometheus metrics, when you create a new Pet, you will see the below new metrics in Prometheus url (/actuator/prometheus).
# HELP pets_by_type_total Number of Pets created by type
# TYPE pets_by_type_total counter
pets_by_type_total{type="cat",} 1.0
pets_by_type_total{type="hamster",} 0.0
pets_by_type_total{type="bird",} 1.0
pets_by_type_total{type="snake",} 0.0
pets_by_type_total{type="dog",} 0.0
pets_by_type_total{type="lizard",} 0.0The completed code is available in the Github repo in k8s-no-wavefront branch. Here is the link for the class.
