如何正确将Datadog RUM与Traces关联?React对接ROR GraphQL场景
Datadog RUM与ROR GraphQL API追踪关联问题排查
问题背景
React单页应用已接入Datadog RUM,无自有后端,调用部署了Datadog追踪代理的Ruby on Rails单体应用提供的GraphQL API。当前RUM初始化配置如下:
datadogRum.init({ applicationId: 'xxxxxxxxx', clientToken: 'xxxxxxxxxxxxxx', site: 'datadoghq.com', service: 'order', env: 'staging', // Specify a version number to identify the deployed version of your application in Datadog // version: '1.0.0', sampleRate: 100, premiumSampleRate: 100, trackInteractions: true, defaultPrivacyLevel: 'mask-user-input', allowedTracingOrigins: [/https:\/\/(?:api|app)\.example\.(?:cc|com)\/graphql/], })
目前无法在Datadog RUM的Traces标签页看到前端发起的GraphQL请求追踪,且已确认满足官方文档中的关联前提:
- 已为RUM应用指向的服务配置APM追踪
- 服务使用HTTP服务器
- HTTP服务器使用支持分布式追踪的库
- RUM Explorer中存在指向
allowedTracingOrigins的XHR或Fetch资源 - 针对
allowedTracingOrigins的请求有对应的追踪数据
排查与修复步骤
- 检查请求头自动注入情况
打开浏览器开发者工具的Network面板,查看前端发起的GraphQL请求,确认是否携带x-datadog-trace-id、x-datadog-parent-id和x-datadog-sampling-priority请求头。若未携带,需验证allowedTracingOrigins的正则表达式是否准确匹配请求URL——比如是否遗漏了端口号、路径是否完全匹配,或正则转义是否有误。 - 验证ROR后端分布式追踪配置
确认ROR应用的ddtracegem已正确开启分布式追踪,且GraphQL instrumentation配置到位。检查config/initializers/datadog.rb:
确保后端能识别并处理前端传来的Datadog.configure do |c| c.tracing.enabled = true c.tracing.distributed_tracing.enabled = true c.tracing.instrument :rails c.tracing.instrument :graphql endx-datadog-*请求头,完成追踪链路的关联。 - 统一环境与版本标识
取消初始化配置中version字段的注释,设置当前应用的版本号,确保RUM的env(此处为staging)与后端APM服务的环境标识完全一致。Datadog依赖相同的环境和版本信息关联RUM与Traces数据。 - 排查采样与数据过滤规则
尽管已设置sampleRate: 100和premiumSampleRate: 100,仍需在Datadog控制台检查:- RUM全局采样规则是否覆盖了局部配置
- APM的Ingestion Pipeline是否存在过滤相关追踪数据的规则
- 确认跨域配置兼容性
若前后端存在跨域,需确保ROR后端的CORS配置允许前端发送x-datadog-*请求头,并允许暴露这些头信息。示例配置:Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'your-frontend-domain.com' resource '*', headers: :any, expose: ['x-datadog-trace-id', 'x-datadog-parent-id'], methods: [:get, :post, :options] end end - 手动注入追踪头测试
若自动注入失效,可手动在请求中添加追踪头验证后端关联能力:
若手动注入后能在RUM中看到Traces关联,说明自动注入的const traceId = datadogRum.getTraceId(); fetch('https://api.example.com/graphql', { method: 'POST', headers: { 'x-datadog-trace-id': traceId, 'x-datadog-parent-id': datadogRum.getParentId(), 'x-datadog-sampling-priority': '1' }, body: JSON.stringify(yourGraphQLQuery) });allowedTracingOrigins匹配逻辑存在问题,需进一步调整正则表达式。
内容的提问来源于stack exchange,提问作者Noriode Raphael
相关产品推荐
相关产品推荐

