OpenTelemetry 资源属性配置
介绍
在分布式系统中,资源属性(Resource Attributes) 是为遥测数据(如追踪、指标、日志)添加上下文信息的关键机制。它们描述了产生数据的实体特征,例如:
- 服务名称和版本
- 运行环境(开发/生产)
- 主机/容器信息
- 云提供商元数据
通过合理配置资源属性,你可以:
- 在 多个服务间关联数据
- 快速过滤和分组遥测数据
- 增强故障排查能力
基础资源配置
手动定义资源属性
最基本的配置方式是通过 Resource
类直接定义属性:
const { Resource } = require('@opentelemetry/resources');
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');
const resource = new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: 'payment-service',
[SemanticResourceAttributes.SERVICE_VERSION]: '1.0.0',
'environment': 'production'
});
使用环境变量
OpenTelemetry SDK 会自动检测以下环境变量:
export OTEL_SERVICE_NAME=payment-service
export OTEL_RESOURCE_ATTRIBUTES="environment=production,team=finance"
高级配置技巧
自动检测资源
SDK 可以自动检测运行环境信息:
const { detectResources } = require('@opentelemetry/resources');
const { awsEc2Detector } = require('@opentelemetry/resource-detector-aws');
const resource = await detectResources({
detectors: [awsEc2Detector],
});
资源合并策略
当多个来源提供资源属性时,合并策略决定优先级:
合并规则:
- 手动设置具有最高优先级
- 环境变量次之
- 自动检测值作为后备
实际案例
微服务场景配置
假设我们有用户服务和订单服务:
// 用户服务配置
const userServiceResource = new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: 'user-service',
[SemanticResourceAttributes.SERVICE_VERSION]: '2.1.3',
'domain': 'account'
});
// 订单服务配置
const orderServiceResource = new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: 'order-service',
[SemanticResourceAttributes.SERVICE_VERSION]: '1.4.0',
'domain': 'commerce'
});
Kubernetes环境
结合K8s下自动检测:
const { k8sDetector } = require('@opentelemetry/resource-detector-kubernetes');
const resource = await detectResources({
detectors: [k8sDetector],
});
这会自动添加:
- k8s.pod.name
- k8s.namespace.name
- k8s.node.name