J'ai configuré micronaut en utilisant le cli et je souhaite ajouter un point de terminaison qui fournit des métriques prometheus. En suivant les guides (et Micronaut: Comment obtenir des métriques dans le Prometheus format? ), j'ai ajouté des éléments à mon application.yml de la manière suivante:
micronaut:
application:
name: foo-service
metrics:
enabled: true
export:
prometheus:
enabled: true
step: PT1M
descriptions: true
endpoints:
metrics:
enabled: true
prometheus:
enabled: true
sensitive: false
J'ai maintenant deux points de terminaison, un à / métriques et une à / prometheus . Cependant, je souhaite que / metrics renvoie des métriques prometheus. Une idée de la manière dont je peux y parvenir?
Je sais que je pourrais placer tous les points de terminaison sous un sous-chemin, tel que / endpoints en utilisant endpoints.all.path puis proxy vers là, mais c'est vraiment moche et ce n'est pas comme ça que je veux le résoudre.
3 Réponses :
Vous pouvez désactiver le point de terminaison des métriques et créer un contrôleur qui répond à / metrics . Ce contrôleur pourrait injecter le PrometheusEndpoint et déléguer l'appel au bean endpoint.
Cela ne fonctionne que partiellement. Je peux ajouter un contrôleur qui se lie à / metrics et injecter le PrometheusEndpoint . Mais celui-ci n'est disponible en tant que bean que lorsqu'il est activé dans application.yml , ce qui le rend disponible sur / prometheus . Alors maintenant, je l'ai disponible sur deux chemins. Une chance de ne pas le lier à / prometheus ?
Grâce à james-kleeth, je suis arrivé sur la bonne voie, bien qu'il s'agisse essentiellement d'une réimplémentation. J'ai désactivé le point de terminaison prometheus et ajouté un contrôleur. Cependant, lorsque le point final est désactivé, je ne peux plus l'injecter. Son implémentation était "triviale" (se référant simplement au registre prometheus). Voici ma solution:
package my.company.service
import io.micrometer.prometheus.PrometheusMeterRegistry
import io.micronaut.configuration.metrics.annotation.RequiresMetrics
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Produces
import io.swagger.v3.oas.annotations.Operation
import javax.inject.Inject
@RequiresMetrics
@Controller("/metrics")
class MetricsController @Inject constructor(val prometheusMeterRegistry: PrometheusMeterRegistry) {
@Operation(summary = "Provide metrics in Prometheus format")
@Get
@Produces("text/plain; version=0.0.4")
fun metrics(): String = prometheusMeterRegistry.scrape()
}
L'exemple donné par lena_punkt fonctionne pour moi. Je vais juste ajouter un exemple Java et quelques confs qui m'ont été nécessaires dans mon application.yml.
import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micronaut.configuration.metrics.annotation.RequiresMetrics;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
import javax.inject.Inject;
@RequiresMetrics
@Controller("/metrics")
public class PrometheusController {
private final PrometheusMeterRegistry prometheusMeterRegistry;
@Inject
public PrometheusController(PrometheusMeterRegistry prometheusMeterRegistry) {
this.prometheusMeterRegistry = prometheusMeterRegistry;
}
@Get
@Produces("text/plain")
public String metrics() {
return prometheusMeterRegistry.scrape();
}
}
endpoints:
metrics:
enabled: false
sensitive: false
prometheus:
enabled: false
sensitive: false