AKS部署的React-Node.js应用配置OpenTelemetry后无数据流入App Insights排查求助
AKS上React-Node.js应用OpenTelemetry数据无法流入Azure Monitor排查请求
我有一个部署在AKS上的简单React-Node.js应用(访问地址:http://23.100.37.60:3080/),已按照微软官方文档配置OpenTelemetry,尝试将数据发送至Azure Monitor的App Insights,但始终未看到数据流入。以下是我的Node.js后端Server.js文件、Deployment Manifest YAML文件及Dockerfile,恳请帮忙排查是否存在配置错误!
Server.js代码
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); const { AzureMonitorTraceExporter } = require("@azure/monitor-opentelemetry-exporter"); const { BatchSpanProcessor, SimpleSpanProcessor, ConsoleSpanExporter } = require("@opentelemetry/sdk-trace-base"); const { NodeTracerProvider, NodeTracerConfig } = require("@opentelemetry/sdk-trace-node"); const { MeterProvider, MeterProviderOptions } = require("@opentelemetry/sdk-metrics"); const { trace, context, diag, DiagConsoleLogger, DiagLogLevel } = require('@opentelemetry/api'); const { Resource } = require("@opentelemetry/resources"); const { SemanticResourceAttributes } = require("@opentelemetry/semantic-conventions"); const { registerInstrumentations } = require('@opentelemetry/instrumentation'); const express = require('express'); const path = require('path'); const app = express(), bodyParser = require("body-parser"); port = 3080; // place holder for the data const users = []; const testResource = new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: "my-helloworld-service", [SemanticResourceAttributes.SERVICE_NAMESPACE]: "my-namespace", [SemanticResourceAttributes.SERVICE_INSTANCE_ID]: "my-instance", }); const tracerProviderConfig = { resource: testResource }; const meterProviderConfig = { resource: testResource }; const provider = new NodeTracerProvider(tracerProviderConfig); diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ALL); const meterProvider = new MeterProvider(meterProviderConfig); // Create an exporter instance. const exporter = new AzureMonitorTraceExporter({ connectionString: "my connection string copied from app insight" }); // Add the exporter to the provider. provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); provider.register(); registerInstrumentations({ instrumentations: [new HttpInstrumentation()], }); const tracer = trace.getTracer("example-basic-tracer-node-server"); app.use(bodyParser.json()); app.use(express.static(path.join(__dirname, '../my-app/build'))); app.get('/api/users', (req, res) => { console.log('api/users called!') res.json(users); }); app.post('/api/user', (req, res) => { const span = tracer.startSpan("add-user-span"); const user = req.body.user; console.log('Adding user:::::', user); users.push(user); span.addEvent('a user has been added', { 'user': JSON.stringify(user) }) span.end(); res.json("user addedd"); }); app.get('/', (req,res) => { res.sendFile(path.join(__dirname, '../my-app/build/index.html')); }); app.listen(port, () => { console.log(`Server listening on the port::${port}`); });
Deployment Manifest YAML代码
apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: react-webapp name: react-webapp spec: replicas: 5 selector: matchLabels: app: react-webapp strategy: {} template: metadata: creationTimestamp: null labels: app: react-webapp spec: containers: - image: danpoc0acr.azurecr.io/dan-poc0-app-sample:v2 name: webapp imagePullPolicy: Always resources: {} ports: - containerPort: 3080 status: {} --- apiVersion: v1 kind: Service metadata: name: react-webapp labels: run: react-webapp spec: ports: - port: 3080 protocol: TCP selector: app: react-webapp type: LoadBalancer
Dockerfile代码
FROM node:10 AS ui-build WORKDIR /usr/src/app COPY my-app/ ./my-app/ RUN cd my-app && npm install && npm run build FROM node:10 AS server-build WORKDIR /root/ COPY --from=ui-build /usr/src/app/my-app/build ./my-app/build COPY api/package*.json ./api/ RUN cd api && npm install COPY api/server.js ./api/ EXPOSE 3080 CMD ["node", "./api/server.js"]
可能的配置问题排查方向
- Connection String配置问题:代码中硬编码了
connectionString,首先确认该字符串是否完整正确(需包含InstrumentationKey和对应Endpoint),建议通过环境变量注入敏感信息,避免硬编码导致的错误或泄露。 - Node.js版本兼容性:使用的Node.js 10已停止维护,部分OpenTelemetry依赖包可能不再支持该版本,会导致初始化失败。建议升级到Node.js 16+ LTS版本,并同步更新OpenTelemetry相关依赖到兼容版本。
- Span处理器选择:当前使用
SimpleSpanProcessor同步发送数据,高并发场景下易出现发送失败或性能问题,建议替换为BatchSpanProcessor批量异步发送,调试时再配合控制台导出:provider.addSpanProcessor(new BatchSpanProcessor(exporter)); - 网络连通性:检查AKS容器是否能访问Azure Monitor的端点,可在容器内执行
curl https://dc.services.visualstudio.com/v2/track测试连通性,若无法访问需排查集群网络策略或代理配置。 - 组件注册顺序:确保
registerInstrumentations在provider.register()之后执行,否则Instrumentation无法正确挂载;另外创建了MeterProvider但未注册,若需要指标数据需添加meterProvider.register();。 - 日志验证:通过容器日志查看
ConsoleSpanExporter是否输出Span数据。若控制台有Span,说明Trace生成正常,问题出在Azure导出环节;若无Span,需检查Trace生成或Instrumentation配置。
内容的提问来源于stack exchange,提问作者bunny
相关产品推荐
相关产品推荐

