如何获取GitLab CI作业的correlation ID?
你之前在CI作业里配的CURL_TRACE=1、GIT_CURL_VERBOSE=1这类参数不生效,根本原因是这些环境变量只对作业容器里启动的git、curl进程有用,Runner守护进程自己的内置HTTP客户端(基于libcurl实现)是作业启动前就运行的,根本不会加载作业内设置的环境变量,自然打不出对应的trace日志,别在这上面耗时间。
实际可操作的方案按优先级从高到低如下:
方案1:开启Runner全局Debug日志(适用于追踪Runner内置请求)
这个方案可以拿到Runner所有内置操作(拉取代码、调用GitLab API、上传制品、缓存同步等)的请求头,包含你需要的x-request-id(即correlation ID):
- 修改Runner配置:要么在Runner部署机器的
config.toml里,找到对应Runner的配置块,加一行log_level = "debug";要么启动Runner的时候直接带上--debug启动参数。 - 别去CI作业的网页控制台找日志,debug日志是输出到Runner服务自己的运行日志里的:
- 要是Runner是用systemd托管的,直接跑
journalctl -u gitlab-runner -f实时追日志就行 - 要是是用容器部署的Runner,直接查看Runner容器的标准输出即可
- 要是Runner是用systemd托管的,直接跑
- 触发你要调试的作业,直接在Runner日志里搜
x-request-id关键词,就能找到对应请求绑定的correlation ID。
方案2:作业内手动透传Correlation ID(适用于追踪作业脚本内发起的请求)
如果你没权限修改Runner全局配置,只需要追踪作业脚本里自己发起的服务请求,可以直接在作业里手动抓取ID并透传:
GitLab链路支持识别客户端主动传入的X-Request-Id头作为correlation ID,你可以在作业脚本最开头先发个预检请求,从响应头里把ID抠出来存成变量,后面自己发的所有请求都带上这个头即可,示例代码:
# 从GitLab API响应头抓取当前链路的correlation ID CORRELATION_ID=$(curl -v -H "PRIVATE-TOKEN: ${CI_JOB_TOKEN}" "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}" 2>&1 | grep -i "< x-request-id:" | awk '{print $3}' | tr -d '\r') echo "当前作业Correlation ID: ${CORRELATION_ID}" # 后续所有业务请求主动携带该ID curl -H "X-Request-Id: ${CORRELATION_ID}" https://你的目标服务地址
注意:这个方法拿不到Runner自动执行的操作(比如自动拉代码、上传制品、同步缓存)的correlation ID,这类请求必须用方案1获取。
方案3:流量抓包兜底
如果前两个方法都因为权限限制无法实施,可以直接在Runner部署节点抓出口流量兜底:
- 执行tcpdump命令抓取Runner发往目标服务的流量:
tcpdump -i any host 你的目标服务域名 and port 443 -w runner_capture.pcap
- 触发对应作业后停止抓包,用wireshark打开生成的
runner_capture.pcap文件,过滤HTTP/HTTPS请求,直接查看请求/响应头中的x-request-id字段即可。
如果是HTTPS加密流量,可以提前在Runner启动配置中加
SSLKEYLOGFILE环境变量导出TLS密钥,配合wireshark解密流量后查看头信息;嫌操作麻烦也可以临时切换到HTTP测试环境抓包,省了解密步骤。
内容的提问来源于stack exchange,提问作者jhfrontz

