You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:10:22