GKE上Rails应用集成Stackdriver Gem后Trace无数据问题排查
我来帮你梳理下几个常见的排查方向,结合GKE和Stackdriver Trace的集成特点,一个个来核对:
Gem初始化是否完整配置
仅仅在Gemfile里加gem "stackdriver"还不够,Rails需要明确初始化Trace的功能。你需要在config/initializers目录下创建一个stackdriver.rb文件,配置基本的追踪参数,比如:require "stackdriver/trace" Stackdriver::Trace.configure do |config| config.project_id = "你的项目ID" config.enabled = true # 如果用GKE默认服务账号,不需要手动指定credentials,集群会自动注入权限 config.use_rack_middleware = true # 开启Rails请求的自动追踪 end另外要确认Rails的中间件里是否加载了
Stackdriver::Trace::Middleware,可以运行rails middleware命令查看输出里有没有这个中间件。GKE服务账号的权限是否实际生效
虽然集群的oauthScopes包含trace.append,但Pod使用的服务账号(默认是default)需要被授予Cloud Trace Agent角色。你可以用gcloud命令检查:gcloud projects get-iam-policy 你的项目ID --filter="bindings.members:serviceAccount:你的默认SA@你的项目ID.iam.gserviceaccount.com"如果输出里没有
roles/cloudtrace.agent,就需要添加这个角色:gcloud projects add-iam-policy-binding 你的项目ID --member="serviceAccount:你的默认SA@你的项目ID.iam.gserviceaccount.com" --role="roles/cloudtrace.agent"还要检查你的Deployment YAML里有没有指定
serviceAccountName,如果用了自定义服务账号,也要确保这个账号有对应的权限。Trace采样率的影响
Stackdriver Trace默认的采样率很低(默认是0.001,也就是千分之一的请求会被追踪),如果你的应用请求量不大,可能还没触发采样。可以临时把采样率调到100%来测试:Stackdriver::Trace.configure do |config| config.sampling_rate = 1.0 # 所有请求都被追踪 end发几个请求后再去Trace控制台查看,确认是否有数据。
网络连通性验证
有时候Pod可能无法访问Stackdriver Trace的API,虽然应用运行正常,但Trace上报的请求被拦截了。可以在Pod里执行curl测试:curl https://cloudtrace.googleapis.com/v2/projects/你的项目ID/traces如果返回403,说明权限有问题;如果返回连接失败,就要检查集群的网络策略、防火墙规则是否允许访问Google的API服务。
查看应用日志找隐性错误
虽然你说send_trace执行无异常,但可能有一些警告信息没被捕获。用kubectl logs 你的Pod名称查看应用日志,搜索“trace”相关的内容,看看有没有权限不足、配置错误之类的提示。Trace数据的延迟问题
Stackdriver Trace的数据有时候不会实时显示,可能需要等待5-15分钟才会出现在控制台。如果前面的配置都没问题,可以先等一会儿再刷新页面查看。
内容的提问来源于stack exchange,提问作者haru

