Prometheus 导致 Jaeger API 请求超时 timeout 的故障
问题背景
使用 Jaeger 的 9411 端口(用于兼容 Zipkin 的端口)提交调用链的 span 信息,Jaeger 服务运行一段时候后,9411 端口上的请求就会全部超时,必须重启后才能恢复。
同样的问题后来我也尝试了其他端口,也有同样的问题。
版本
Jaeger 1.22
产生原因
查看日志发现有来源下面路径的请求:
/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/%C0%AE%C0%AE/etc/profile
这个请求来源我们这边的安全组扫描。这个请求导致了以下错误:
2021/04/18 04:10:51 http: panic serving xx.xx.xx.xx:xxxx: label value "/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/\xc0\xae\xc0\xae/etc/profile" is not valid UTF-8
goroutine 35495 [running]:
net/http.(*conn).serve.func1(0xc0004a2640)net/http/server.go:1801 +0x147
panic(0x1392360, 0xc00093cae0)runtime/panic.go:975 +0x47a
github.com/prometheus/client_golang/prometheus.(*HistogramVec).WithLabelValues(0xc000182e28, 0xc000947560, 0x3, 0x3, 0xc000947500, 0xc000947560)github.com/prometheus/client_golang@v1.5.1/prometheus/histogram.go:489 +0xda
github.com/uber/jaeger-lib/metrics/prometheus.(*Factory).Timer(0xc00044a140, 0x15b70ed, 0x15, 0xc0009474d0, 0x15bbfcd, 0x19, 0x0, 0x0, 0x0, 0x1512b80, ...)github.com/uber/jaeger-lib@v2.4.0+incompatible/metrics/prometheus/factory.go:181 +0x2ce
github.com/uber/jaeger-lib/metrics/fork.(*Factory).Timer(0xc0001934a0, 0x15b70ed, 0x15, 0xc0009474d0, 0x15bbfcd, 0x19, 0x0, 0x0, 0x0, 0xc0005299f5, ...)github.com/uber/jaeger-lib@v2.4.0+incompatible/metrics/fork/fork.go:48 +0x65
github.com/jaegertracing/jaeger/pkg/httpmetrics.buildTimer(...)github.com/jaegertracing/jaeger/pkg/httpmetrics/metrics.go:111
github.com/jaegertracing/jaeger/pkg/httpmetrics.(*requestDurations).record(0xc000535e60, 0xc000042240, 0x3, 0xc0004a1580, 0x3e, 0xc0002bde6d, 0x3, 0x40b0)github.com/jaegertracing/jaeger/pkg/httpmetrics/metrics.go:101 +0x465
github.com/jaegertracing/jaeger/pkg/httpmetrics.Wrap.func1(0x1e1c2c0, 0xc0009447e0, 0xc000937000)github.com/jaegertracing/jaeger/pkg/httpmetrics/metrics.go:63 +0x1fe
net/http.HandlerFunc.ServeHTTP(0xc00000cf60, 0x1e1c2c0, 0xc0009447e0, 0xc000937000)net/http/server.go:2042 +0x44
github.com/rs/cors.(*Cors).Handler.func1(0x1e1c2c0, 0xc0009447e0, 0xc000937000)github.com/rs/cors@v1.7.0/cors.go:219 +0x1b9
net/http.HandlerFunc.ServeHTTP(0xc00000cf80, 0x1e1c2c0, 0xc0009447e0, 0xc000937000)net/http/server.go:2042 +0x44
net/http.serverHandler.ServeHTTP(0xc0002a0460, 0x1e1c2c0, 0xc0009447e0, 0xc000937000)net/http/server.go:2843 +0xa3
net/http.(*conn).serve(0xc0004a2640, 0x1e225c0, 0xc000125140)net/http/server.go:1925 +0x8ad
created by net/http.(*Server).Servenet/http/server.go:2969 +0x36c
这个错误一旦出现,就会导致所有的其他请求全部超时,只有重启才能恢复。
从日志上看,这个问题貌似和 Prometheus 监控有关。由于 URL 路径比较特殊,导致没办法转换成 Prometheus 的 Label。
当然是 Jaeger 本身的 BUG,即时这个请求出错也不应该影响到其他请求。
重现步骤
下面是一个简单的重现流程:
docker run -d -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.22
curl http://localhost:9411/%C0%AE%C0%AE
再次对 9411 端口进行其他请求,都会 timeout。
临时解决方案
在官方修复这个 BUG 前,临时解决方案是将监控设置为 expvar 来禁用 Prometheus:
docker run -d -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -e METRICS_BACKEND=expvar -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 14268:14268 -p 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.22
或者
--metrics-backend=expvar
由于我对 Go 语言不熟悉自己没办法修复,已向官方提了 issue:
https://github.com/jaegertracing/jaeger/issues/2944
Prometheus 导致 Jaeger API 请求超时 timeout 的故障相关推荐
- Java进程CPU占用高导致的网页请求超时的故障排查
作者:荣书 来源:https://blog.51cto.com/rongshu/2426712 一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load a ...
- mc java 连接超时_Java进程CPU占用高导致的网页请求超时的故障排查
一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多.  二.定位故障 根据这 ...
- vue接口总是请求超时_vue-resource请求超时timeout设置
请求超时设置通过拦截器Vue.http.interceptors实现具体代码如下 main.js里在全局拦截器中添加请求超时的方法 方法1:超时之后会调用请求中的onTimeoutd方法,then方法 ...
- Ajax - timeout设置ajax请求超时 timeout
$.ajax实现 <!DOCTYPE html> <html lang="en"><head><meta charset="UT ...
- ping回显请求超时time out故障解决过程
一天,一个新同事找来,说要跨网段调测一个sip注册语音设备,测试网络互通性发现不行,现象是公司局域网的205网段192.168.205.0/24的pc去ping209网段192.168.209.0/2 ...
- PING请求超时原因及解决办法(新增PING间歇性显示请求超时)
电脑使用远程或者共享对方数据库的时候,会ping一下对方电脑.ping是系统自带的功能,一般用于检测网络连接是否正常,有时候会出现ping请求超时的情况,造成无法上网.在此我整理的一些有关ping请求 ...
- 拦截器读post参数导致接口post请求报错_vue中Axios的封装和API接口的管理
一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响 ...
- 【必看】 一篇 CPU 占用高,导致请求超时的故障排查
一.发现问题的系统检查 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多. 二.定位故障 根据这种故障 ...
- nginx post请求超时_Nginx 的超时 timeout 配置详解
本文介绍 Nginx 的 超时(timeout)配置.分享给大家,具体如下: Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提 ...
最新文章
- 小程序获取用户的操作轨迹日志
- Numpy的介绍和优势
- android java split_Java中的split函数的用法
- 数据库编程连接mysql_使用JDBC编程-连接MySQL数据库
- JavaScript函数调用规则
- ajax响应码,jQuery 使用$ .ajax()处理HTTP响应代码
- 20050909:女乘客钓男司机?
- 汉化风暴 python_手机端强大的汉化风暴工具 可汉化软件
- 激活工具带毒感染量近60万,而北京等四城市用户不被攻击
- 找回 Windows 11 丢失的扫雷游戏【新春快乐】
- delphi第三方组件总述
- 开源系统的选择-比较全面的各类开源应用系统列表
- Linux(Ubuntu 22.04)虚拟机共享主机上的文件夹
- 设计模式之禅学习笔记
- 信息通信网络机务员三级(高级)复习知识点
- 01-无线传感器网络(WSN)简介
- 1.网络通讯-9种常用网络命令
- 1089 质因数分解
- 飞鸽传书——短信接口
- 《Python从入门到实践》读书笔记——第五章 if语句