将 OpenTelemetry 与 Azure Functions 配合使用

重要

对 Azure Functions 的 OpenTelemetry 支持目前为预览版,应用必须托管在弹性消耗计划中,才能使用 OpenTelemetry。

本文介绍如何将函数应用配置为以 OpenTelemetry 格式导出日志和跟踪数据。 Azure Functions 从 Functions 主机进程和运行函数代码的语言特定的工作进程生成函数执行的遥测数据。 默认情况下,此遥测数据使用 Application Insights SDK 发送到 Application Insights。 但是,可以选择使用 OpenTelemetry 语义导出此数据。 虽然仍可以使用 OpenTelemetry 格式将数据发送到 Application Insights,但现在可以将相同的数据导出到任何其他符合 OpenTelemetry 的终结点。

提示

由于本文针对的是你所选择的开发语言,因此请记住在文章顶部选择正确的语言。

目前尚无对 Java 应用的客户端优化 OpenTelemetry 支持。

C# 进程内应用目前不支持 OpenTelemetry。

通过在函数应用中启用 OpenTelemetry,可以获得这些优势:

  • 在主机和应用程序代码中生成跟踪和日志之间的关联。
  • 一致的、基于标准的可导出遥测数据生成。
  • 与其他可以使用 OpenTeleletry 兼容数据的提供程序集成。

在主机配置 (host.json) 和代码项目中的函数应用级别均启用了 OpenTelemetry。 Functions 还提供客户端优化体验,用于从在特定于语言的工作进程中运行的函数代码导出 OpenTelemetry 数据。

1.在 Functions 主机中启用 OpenTelemetry

当在函数应用的 host.json 文件中启用 OpenTelemetry 输出时,主机将导出 OpenTelemetry 输出,而不考虑应用使用的语言堆栈。

若要从 Functions 主机启用 OpenTelemetry 输出,请在代码项目中更新 host.json文件,以将 "telemetryMode": "openTelemetry" 元素添加到根集合。 启用 OpenTelemetry 后,host.json 文件可能如下所示:

{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            },
            "enableLiveMetricsFilters": true
        }
    },
    "telemetryMode": "openTelemetry"
}

2.配置应用程序设置

在 host.json 文件中启用 OpenTelemetry 时,根据应用环境变量中提供哪些 OpenTelemetry 支持的应用程序设置来确定发送数据的终结点。

基于 OpenTelemetry 输出目标在函数应用中创建特定的应用程序设置。 为 Application Insights 和 OpenTelemetry 协议 (OTLP) 导出程序提供连接设置时,OpenTelemetry 数据将发送到这两个终结点。

APPLICATIONINSIGHTS_CONNECTION_STRING:Application Insights 工作区的连接字符串。 如果存在此设置,OpenTelemetry 数据将发送到该工作区。 此设置与未启用 OpenTelemetry 的情况下连接到 Application Insights 的设置相同。 如果应用还没有此设置,则可能需要启用 Application Insights 集成

3.在应用中启用 OpenTelemetry

将 Functions 主机配置为使用 OpenTelemetry 时,还应更新应用程序代码以输出 OpenTelemetry 数据。 在主机和应用程序代码中启用 OpenTelemetry 可以更好地关联 Functions 主机进程和语言工作进程发出的跟踪和日志。

检测应用程序以使用 OpenTelemetry 的方式取决于目标 OpenTelemetry 终结点:

  1. 运行以下命令,以在应用中安装所需的程序集:

    dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry --version 1.0.0-preview1 
    dotnet add package OpenTelemetry.Extensions.Hosting 
    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore  
    
  2. 在 Program.cs 项目文件中,添加此 using 语句:

    using Azure.Monitor.OpenTelemetry.AspNetCore; 
    
  3. ConfigureServices 委托中,添加此服务配置:

    services.AddOpenTelemetry()
    .UseFunctionsWorkerDefaults()
    .UseAzureMonitor();
    

    若要导出到两个 OpenTelemetry 终结点,请同时调用 UseAzureMonitorUseOtlpExporter

Java 辅助角色优化尚不适用于 OpenTelemetry,因此在 Java 代码中没有配置任何内容。

  1. 在项目中安装以下 npm 包:

    npm install @opentelemetry/api 
    npm install @opentelemetry/auto-instrumentations-node 
    npm install @azure/monitor-opentelemetry-exporter 
    npm install @azure/functions-opentelemetry-instrumentation
    
  1. 在项目中创建代码文件,将此新文件中复制并粘贴以下代码,并将该文件另存为 src/index.js
const { AzureFunctionsInstrumentation } = require('@azure/functions-opentelemetry-instrumentation');
const { AzureMonitorLogExporter, AzureMonitorTraceExporter } = require('@azure/monitor-opentelemetry-exporter');
const { getNodeAutoInstrumentations, getResourceDetectors } = require('@opentelemetry/auto-instrumentations-node');
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
const { detectResourcesSync } = require('@opentelemetry/resources');
const { LoggerProvider, SimpleLogRecordProcessor } = require('@opentelemetry/sdk-logs');
const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node');

const resource = detectResourcesSync({ detectors: getResourceDetectors() });

const tracerProvider = new NodeTracerProvider({ resource });
tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new AzureMonitorTraceExporter()));
tracerProvider.register();

const loggerProvider = new LoggerProvider({ resource });
loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new AzureMonitorLogExporter()));

registerInstrumentations({
    tracerProvider,
    loggerProvider,
    instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()],
});
  1. 更新 package.json 文件中的 main 字段以包含此新 src/index.js 文件,如下所示:

    "main": "src/{index.js,functions/*.js}"
    
  1. 在项目中创建代码文件,将此新文件中复制并粘贴以下代码,并将该文件另存为 src/index.ts
import { AzureFunctionsInstrumentation } from '@azure/functions-opentelemetry-instrumentation';
import { AzureMonitorLogExporter, AzureMonitorTraceExporter } from '@azure/monitor-opentelemetry-exporter';
import { getNodeAutoInstrumentations, getResourceDetectors } from '@opentelemetry/auto-instrumentations-node';
import { registerInstrumentations } from '@opentelemetry/instrumentation';
import { detectResourcesSync } from '@opentelemetry/resources';
import { LoggerProvider, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';
import { NodeTracerProvider, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node';

const resource = detectResourcesSync({ detectors: getResourceDetectors() });

const tracerProvider = new NodeTracerProvider({ resource });
tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new AzureMonitorTraceExporter()));
tracerProvider.register();

const loggerProvider = new LoggerProvider({ resource });
loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new AzureMonitorLogExporter()));

registerInstrumentations({
    tracerProvider,
    loggerProvider,
    instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()],
});
  1. 更新 package.json 文件中的 main 字段以包含此新 src/index.ts 文件的输出,如下所示:

    "main": "dist/src/{index.js,functions/*.js}"
    

重要

PowerShell 应用目前不支持从语言辅助角色将 OpenTelemetry 输出输出到 Application Insights。 你可能想要使用 OTLP 导出器终结点。 为 OpenTelemetry 输出配置到 Application Insights 时,PowerShell 工作进程生成的日志仍会得到转发,但目前不支持分布式跟踪。

这些说明仅适用于 OTLP 导出程序:

  1. 添加名为 OTEL_FUNCTIONS_WORKER_ENABLED 的应用程序设置,其值为 True

  2. 在应用的根目录中创建应用级 Modules 文件夹并运行以下命令:

    Save-Module -Name AzureFunctions.PowerShell.OpenTelemetry.SDK
    

    这会直接在应用中安装所需的 AzureFunctions.PowerShell.OpenTelemetry.SDK 模块。 无法使用 requirements.psd1 文件自动安装此依赖项,因为 Flex Consumption 计划预览版目前不支持托管依赖项

  3. 将此代码添加到 profile.ps1 文件:

    Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop 
    Initialize-FunctionsOpenTelemetry 
    
  1. requirements.txt 文件中添加此项:

    azure.monitor.opentelemetry
    
  2. 将此代码添加到 function_app.py 主入口点文件:

    from azure.monitor.opentelemetry import configure_azure_monitor 
    configure_azure_monitor() 
    

OpenTelemetry 注意事项

使用 OpenTelemetry 导出数据时,请记住当前这些注意事项。

  • 当主机配置为使用 OpenTelemetry 时,将仅导出日志和跟踪。 主机指标当前未导出。

  • 当在主机中启用了 OpenTelemetry 时,当前无法使用 Core Tools 在本地运行应用项目。 当前需要将代码部署到 Azure,以验证与 OpenTelemetry 相关的更新。

  • 目前,OpenTelemetry 输出仅支持基于 HTTP 触发器和基于 Azure SDK 的触发器。

监视 Azure Functions弹性消耗计划