2
votes

Comment changer le chemin d'un endpoint dans Micronaut?

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.


0 commentaires

3 Réponses :


1
votes

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.


1 commentaires

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 ?



1
votes

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()
}


0 commentaires

2
votes

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


0 commentaires