有关于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)
1条答案
按热度按时间ni65a41a1#
这个问题很可能是由于将“主”端点和公制端点分别解释为ZIO http的
Http
值造成的。请考虑以下事项:
如果使用
notFoundWhenRejected = true
选项,则当请求/metrics
传入时,它首先由mainHttp
处理。但是,该值不知道如何处理该请求-因此它被拒绝。但正如我们指定的上述选项一样,拒绝被转化为404,因此得到了答案。该选项的默认值为
false
。在这种情况下,/metrics
请求被mainHttp
值拒绝,但这不会转换为404响应,而是继续处理metricsHttp
。正确的解决方案是同时使用
/metrics
和notFoundWhenRejected = true
选项,即一次解释所有端点。然后,只有当没有端点(既不是主端点,也不是度量端点)与请求匹配时,才会返回404: