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

Azure Function(TypeScript v4)应用地图依赖缺失与OpenTelemetry配置问题

Azure Functions v4 + OpenTelemetry 遥测问题解答

应用地图依赖未显示的核心原因及排查方向

  • OpenTelemetry自动检测未生效:Node.js环境下,PostgreSQL(pg库)、Azure Key Vault等服务的依赖追踪需要对应OTel插件支持,默认配置可能未自动加载这些插件,导致依赖调用未被捕获。
  • Trace上下文未传递:调用外部服务时,若未正确传递OTel的trace上下文,依赖调用无法关联到函数的根trace,应用地图无法串联依赖关系。
  • 配置冲突:host.json中若同时保留旧版Application Insights SDK配置和OpenTelemetry配置,会导致遥测采集异常,需确保telemetryMode设为OpenTelemetry后,移除旧版applicationInsights相关配置项。
  • metadata.google.internal调用说明:该调用是Azure Functions底层环境的内部元数据请求,属于平台自带行为,无需额外处理。

疑问解答

1. 是否必须传递InvocationContext才能发送日志到App Insights?

不需要全程传递InvocationContext。可选方式包括:

  • 使用OpenTelemetry LoggerProvider创建自定义日志器,直接将日志推送到Application Insights。
  • 配置APPLICATIONINSIGHTS_CONNECTION_STRING环境变量后,直接使用console.log/error/warn,OpenTelemetry会自动捕获并转发这些日志到App Insights(需确保OTel的console插件已启用)。

2. 如何创建自定义遥测并显示在Application Insights中?

自定义日志遥测

import { LoggerProvider } from '@opentelemetry/api-logs';
import { ApplicationInsightsLogExporter } from '@opentelemetry/exporter-logs-applicationinsights';
import { SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';

// 初始化日志器
const loggerProvider = new LoggerProvider();
const exporter = new ApplicationInsightsLogExporter({
  connectionString: process.env.APPLICATIONINSIGHTS_CONNECTION_STRING!
});
loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(exporter));

// 生成自定义日志
const customLogger = loggerProvider.getLogger('business-logger');
customLogger.info('用户提交订单成功', { orderId: 'ORD-12345', userId: 'U-67890' });

自定义依赖遥测(针对未自动捕获的服务)

import { trace } from '@opentelemetry/api';
import { SemanticAttributes } from '@opentelemetry/semantic-conventions';

const tracer = trace.getTracer('erp-dependency-tracer');

async function callERPSystem(orderData: any) {
  // 手动创建依赖span
  const span = tracer.startSpan('ERP订单同步', {
    attributes: {
      [SemanticAttributes.HTTP_METHOD]: 'POST',
      [SemanticAttributes.HTTP_URL]: 'https://erp.example.com/api/orders',
      [SemanticAttributes.NET_PEER_NAME]: 'erp.example.com',
      [SemanticAttributes.SERVICE_NAME]: 'ERP系统'
    }
  });

  try {
    const response = await fetch('https://erp.example.com/api/orders', {
      method: 'POST',
      body: JSON.stringify(orderData)
    });
    span.setStatus({ code: 0 }); // 标记调用成功
  } catch (error) {
    span.setStatus({ code: 2, message: (error as Error).message }); // 标记调用失败
  } finally {
    span.end(); // 结束span,完成遥测上报
  }
}

3. 依赖未显示在应用地图的原因是什么?

除核心排查点外,补充以下可能:

  • 客户端库版本不兼容:OTel插件对客户端库版本有要求(比如@opentelemetry/instrumentation-pg仅支持特定范围的pg版本),需确认使用的库版本与插件兼容。
  • 遥测数据延迟:App Insights的应用地图数据存在几分钟的延迟,配置完成后需等待一段时间再刷新页面查看。
  • 隔离模式限制:若使用函数隔离模式(isolated worker),OTel的自动检测逻辑与进程内模式不同,需按照隔离模式的专属配置文档调整。

4. 严格遵循文档仍存在错误?

存在这种可能,因为Azure Functions v4与OpenTelemetry的集成仍在迭代,部分场景存在文档未覆盖的细节:

  • 初始化顺序错误:OTel插件必须在客户端库(如pg、@azure/keyvault-secrets)加载前初始化,否则无法注入自动检测逻辑。需在函数入口文件的最顶部配置OTel,再导入业务依赖库。
  • 环境变量缺失:需设置OTEL_SERVICE_NAME为函数的服务名称,否则遥测的服务标识混乱,导致应用地图无法正确关联依赖。
  • 权限不足:若函数的系统分配身份没有向App Insights推送遥测的权限,部分数据会被丢弃,需检查身份的App Insights角色权限。

内容的提问来源于stack exchange,提问作者Rishabh Dwivedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:00:03