使用OpenTelemetry Node.js SDK,无instrumentation.js权限如何获取资源属性?
问题背景与技术问询
生产环境中应用通过命令 node --require ./instrumentation.js app.js 启动,其中instrumentation.js的核心代码如下:
const { NodeSDK } = require('@opentelemetry/sdk-node'); const sdk = new NodeSDK({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: 'xyz', [SemanticResourceAttributes.SERVICE_VERSION]: '1.2.3', }), ... } sdk.start();
应用开发者无法访问instrumentation.js文件,现提出以下问询:
是否有办法在应用代码(
app.js)中获取上述resource的属性用于日志记录,且无需访问instrumentation.js?
衍生问题
- 已知持有resource引用时,可通过
resource.attributes获取属性,但如何在应用内获取该resource的引用? @opentelemetry/api提供getTracerProvider()方法获取全局注册的TracerProvider,是否存在等效的getResource()方法?
解决方案
核心结论:无需访问instrumentation.js即可在app.js中获取resource属性
具体实现方式如下:
1. 获取resource引用的具体方法
可以通过全局TracerProvider间接获取关联的resource,代码示例:
const { trace } = require('@opentelemetry/api'); // 获取全局注册的TracerProvider const tracerProvider = trace.getTracerProvider(); // 从TracerProvider中提取resource实例 const resource = tracerProvider.resource; // 读取资源属性 const serviceName = resource.attributes['service.name']; const serviceVersion = resource.attributes['service.version'];
原理:NodeSDK启动时会将配置的resource关联到其初始化的TracerProvider上,而trace.getTracerProvider()能获取到这个全局实例,进而访问到resource。
2. 关于等效的getResource()方法
目前@opentelemetry/api并未提供直接的全局getResource()方法,但通过上述从TracerProvider提取resource的方式,完全可以实现获取资源属性的需求,达到等效效果。
内容的提问来源于stack exchange,提问作者dayuloli
相关产品推荐
相关产品推荐

