问题背景

使用 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 的故障相关推荐

  1. Java进程CPU占用高导致的网页请求超时的故障排查

    作者:荣书 来源:https://blog.51cto.com/rongshu/2426712 一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load a ...

  2. mc java 连接超时_Java进程CPU占用高导致的网页请求超时的故障排查

    一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多.  二.定位故障 根据这 ...

  3. vue接口总是请求超时_vue-resource请求超时timeout设置

    请求超时设置通过拦截器Vue.http.interceptors实现具体代码如下 main.js里在全局拦截器中添加请求超时的方法 方法1:超时之后会调用请求中的onTimeoutd方法,then方法 ...

  4. Ajax - timeout设置ajax请求超时 timeout

    $.ajax实现 <!DOCTYPE html> <html lang="en"><head><meta charset="UT ...

  5. ping回显请求超时time out故障解决过程

    一天,一个新同事找来,说要跨网段调测一个sip注册语音设备,测试网络互通性发现不行,现象是公司局域网的205网段192.168.205.0/24的pc去ping209网段192.168.209.0/2 ...

  6. PING请求超时原因及解决办法(新增PING间歇性显示请求超时)

    电脑使用远程或者共享对方数据库的时候,会ping一下对方电脑.ping是系统自带的功能,一般用于检测网络连接是否正常,有时候会出现ping请求超时的情况,造成无法上网.在此我整理的一些有关ping请求 ...

  7. 拦截器读post参数导致接口post请求报错_vue中Axios的封装和API接口的管理

    一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响 ...

  8. 【必看】 一篇 CPU 占用高,导致请求超时的故障排查

    一.发现问题的系统检查 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多. 二.定位故障 根据这种故障 ...

  9. nginx post请求超时_Nginx 的超时 timeout 配置详解

    本文介绍 Nginx 的 超时(timeout)配置.分享给大家,具体如下: Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提 ...

最新文章

  1. 小程序获取用户的操作轨迹日志
  2. Numpy的介绍和优势
  3. android java split_Java中的split函数的用法
  4. 数据库编程连接mysql_使用JDBC编程-连接MySQL数据库
  5. JavaScript函数调用规则
  6. ajax响应码,jQuery 使用$ .ajax()处理HTTP响应代码
  7. 20050909:女乘客钓男司机?
  8. 汉化风暴 python_手机端强大的汉化风暴工具 可汉化软件
  9. 激活工具带毒感染量近60万,而北京等四城市用户不被攻击
  10. 找回 Windows 11 丢失的扫雷游戏【新春快乐】
  11. delphi第三方组件总述
  12. 开源系统的选择-比较全面的各类开源应用系统列表
  13. Linux(Ubuntu 22.04)虚拟机共享主机上的文件夹
  14. 设计模式之禅学习笔记
  15. 信息通信网络机务员三级(高级)复习知识点
  16. 01-无线传感器网络(WSN)简介
  17. 1.网络通讯-9种常用网络命令
  18. 1089 质因数分解
  19. 飞鸽传书——短信接口
  20. 《Python从入门到实践》读书笔记——第五章 if语句

热门文章

  1. 虚拟同步发电机_湖南大学涂春鸣等:具备同步电机特性的级联型光伏发电系统...
  2. 3个小技巧,让你的阅读效率翻倍
  3. 遥感影像常用合成波段
  4. 2021-10-12 集合
  5. 全志A40i核心板实现高清模拟摄像头720P方案
  6. MTK DTS 文件配置
  7. UiO-67(Zr), cas1072413-83-2
  8. Problem:机器翻译
  9. python运势预测程序_基于Python的星座运势接口调用代码实例
  10. 图解 先验概率,后验概率,似然函数,迹象/evidence(by 例子 老王开车)