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