如何更改 Micronaut 端点的路径?

How to change the path of an endpoint in Micronaut?

我已经使用 cli 设置了 micronaut,并希望添加一个提供 prometheus 指标的端点。按照指南(和 Micronaut: How to get metrics in the Prometheus format?),我通过以下方式将内容添加到我的 application.yml

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

现在我有两个端点,一个在 /metrics,一个在 /prometheus。但是,我想要 /metrics 到 return 普罗米修斯指标。知道如何实现吗?

我知道我可以将所有端点放在一个子路径下,例如 /endpoints 使用 endpoints.all.path 然后代理到那里,但这真的很丑而且不是我想要的方式解决它。

您可以禁用指标端点并创建一个响应 /metrics 的控制器。该控制器可以注入 PrometheusEndpoint 并将调用委托给端点 bean。

感谢james-kleeth,我走上了正轨,虽然它基本上是re-implementation。我禁用了普罗米修斯端点并添加了一个控制器。但是,当端点被禁用时,我无法再注入它。它的实现是 "trivial"(仅引用普罗米修斯注册表)。这是我的解决方案:

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

lena_punkt给出的例子对我有用。 我将在我的 application.yml.

中添加一个 Java 示例和一些对我来说必要的 confs
endpoints:
  metrics:
    enabled: false
    sensitive: false
  prometheus:
    enabled: false
    sensitive: false
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();
    }
}