Scala、Tapir、ZIO-添加带有默认错误处理程序的指标拦截器

gajydyqb  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(144)

有关于Tapir和ZIO中的普罗米修斯指标的问题。我有一个简单的代码:

val metrics = PrometheusMetrics.default[Task]()
val options: ZioHttpServerOptions[Any] = ZioHttpServerOptions
    .customiseInterceptors
    .metricsInterceptor(metrics.metricsInterceptor())
    .options

当我调用localhost:8080/metrics时,它工作正常,我看到了指标。
但当我添加默认错误处理程序时:

val metrics = PrometheusMetrics.default[Task]()
def failureResponse(msg: String): ValuedEndpointOutput[_]=
   ValuedEndpointOutput(jsonBody[MyFailure], MyFailure(msg))
val options: ZioHttpServerOptions[Any] = ZioHttpServerOptions
    .customiseInterceptors
    .metricsInterceptor(metrics.metricsInterceptor())
    .defaultHandlers(failureResponse, notFoundWhenRejected = true)
    .options

它不起作用。我现在看到的不是指标,而是错误(404),它是在请求localhost:8080/metrics期间捕获的。老实说,我不知道为什么。有没有可能以某种方式修复它,并保留错误处理程序和指标拦截器?

**编辑:**指标端点:

def metricsEndpoint = ZioHttpInterpreter(options).toHttp(metrics.metricsEndpoint)
ni65a41a

ni65a41a1#

这个问题很可能是由于将“主”端点和公制端点分别解释为ZIO http的Http值造成的。
请考虑以下事项:

val mainHttp = ZioHttpInterpreter(options).toHttp(mainEndpoints)
val metricsHttp = ZioHttpInterpreter(options).toHttp(metricsEndpoints)

Server.start(8080, mainHttp <> metricsHttp)

如果使用notFoundWhenRejected = true选项,则当请求/metrics传入时,它首先由mainHttp处理。但是,该值不知道如何处理该请求-因此它被拒绝。但正如我们指定的上述选项一样,拒绝被转化为404,因此得到了答案。
该选项的默认值为false。在这种情况下,/metrics请求被mainHttp值拒绝,但这不会转换为404响应,而是继续处理metricsHttp
正确的解决方案是同时使用/metricsnotFoundWhenRejected = true选项,即一次解释所有端点。然后,只有当没有端点(既不是主端点,也不是度量端点)与请求匹配时,才会返回404:

val http = ZioHttpInterpreter(options)
  .toHttp(mainEndpoints ++ metricsEndpoints)

Server.start(8080, http)

相关问题