Бөлісу құралы:


Использование OpenTelemetry с Функции Azure

Внимание

Поддержка OpenTelemetry для Функции Azure в настоящее время находится в предварительной версии, и приложение должно размещаться в плане потребления Flex для использования OpenTelemetry.

В этой статье показано, как настроить приложение-функцию для экспорта данных журнала и трассировки в формате OpenTelemetry. Функции Azure генерирует данные телеметрии для выполнения функций как из процесса узла Функций, так и процесса конкретной рабочей роли, в которой выполняется код функции. По умолчанию эти данные телеметрии отправляются в приложение Аналитика с помощью пакета SDK для приложений Аналитика. Однако вы можете экспортировать эти данные с помощью семантики OpenTelemetry. Несмотря на то что вы по-прежнему можете использовать формат OpenTelemetry для отправки данных в приложение Аналитика, теперь можно экспортировать те же данные в любую другую конечную точку, совместимую с OpenTelemetry.

Совет

Так как эта статья ориентирована на выбранный язык разработки, не забудьте выбрать правильный язык в верхней части статьи.

В настоящее время для приложений Java не поддерживается оптимизированная клиентом поддержка OpenTelemetry.

В настоящее время OpenTelemetry не поддерживается для приложений внутрипроцессного процесса C#.

Эти преимущества можно получить, включив OpenTelemetry в приложении-функции:

  • Корреляция между трассировками и журналами, создаваемыми как на узле, так и в коде приложения.
  • Согласованное создание экспортируемых данных телеметрии на основе стандартов.
  • Интегрируется с другими поставщиками, которые могут использовать данные, совместимые с OpenTeleletry.

OpenTelemetry включен на уровне приложения-функции как в конфигурации узла (host.json), так и в проекте кода. Функции также предоставляют оптимизированный клиентом интерфейс для экспорта данных OpenTelemetry из кода функции, выполняющегося в рабочем процессе для конкретного языка.

1. Включение OpenTelemetry в узле "Функции"

Если включить выходные данные OpenTelemetry в host.json файле приложения-функции, узел экспортирует выходные данные OpenTelemetry независимо от языкового стека, используемого приложением.

Чтобы включить выходные данные 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. Если параметры подключения предоставляются как для приложения Аналитика, так и для экспортера протокола OpenTelemetry (OTLP), данные OpenTelemetry отправляются в обе конечные точки.

APPLICATIONINSIGHTS_CONNECTION_STRING: строка подключения для рабочей области приложения Аналитика. Если этот параметр существует, данные OpenTelemetry отправляются в эту рабочую область. Этот параметр используется для подключения к приложению Аналитика без включения OpenTelemetry. Если у приложения еще нет этого параметра, может потребоваться включить интеграцию с приложением Аналитика.

3. Включение OpenTelemetry в приложении

При настройке узла функций для использования OpenTelemetry также следует обновить код приложения для вывода данных OpenTelemetry. Включение OpenTelemetry как в узле, так и в коде приложения обеспечивает лучшую корреляцию между трассировками и журналами, создаваемыми процессом узла Функций, и с помощью рабочего процесса языка.

Способ инструментирования приложения для использования 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, вызовите оба UseAzureMonitor и UseOtlpExporter.

Оптимизация рабочих ролей Java пока недоступна для OpenTelemetry, поэтому в коде Java ничего не нужно настраивать.

  1. Установите эти пакеты npm в проекте:

    npm install @opentelemetry/api 
    npm install @opentelemetry/auto-instrumentations-node 
    npm install @azure/monitor-opentelemetry-exporter 
    
  1. Создайте файл кода в проекте, скопируйте и вставьте следующий код в этот новый файл и сохраните его следующим образом src/index.js:

    const { app } = require('@azure/functions');
    const { AzureMonitorLogExporter, AzureMonitorTraceExporter } = require('@azure/monitor-opentelemetry-exporter');
    const { context: otelContext, propagation } = require('@opentelemetry/api');
    const { SeverityNumber } = require('@opentelemetry/api-logs');
    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()] });
    
    // NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions`
    // See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245
    app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } });
    
    const logger = loggerProvider.getLogger('default');
    app.hook.log((context) => {
        logger.emit({
            body: context.message,
            severityNumber: toOtelSeverityNumber(context.level),
            severityText: context.level,
        });
    });
    
    app.hook.preInvocation((context) => {
        context.functionHandler = otelContext.bind(
            propagation.extract(otelContext.active(), {
                traceparent: context.invocationContext.traceContext.traceParent,
                tracestate: context.invocationContext.traceContext.traceState,
            }),
            context.functionHandler
        );
    });
    
    function toOtelSeverityNumber(level) {
        switch (level) {
            case 'information':
                return SeverityNumber.INFO;
            case 'debug':
                return SeverityNumber.DEBUG;
            case 'error':
                return SeverityNumber.ERROR;
            case 'trace':
                return SeverityNumber.TRACE;
            case 'warning':
                return SeverityNumber.WARN;
            case 'critical':
                return SeverityNumber.FATAL;
            default:
                return SeverityNumber.UNSPECIFIED;
        }
    }
    
  2. main Обновите поле в файле package.json, чтобы включить этот новый src/index.js файл, который может выглядеть следующим образом:

    "main": "src/{index.js,functions/*.js}"
    
  1. Создайте файл кода в проекте, скопируйте и вставьте следующий код в этот новый файл и сохраните его следующим образом src/index.ts:

    import { app, LogLevel } from '@azure/functions';
    import { AzureMonitorLogExporter, AzureMonitorTraceExporter } from '@azure/monitor-opentelemetry-exporter';
    import { context as otelContext, propagation } from '@opentelemetry/api';
    import { SeverityNumber } from '@opentelemetry/api-logs';
    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()] });
    
    // NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions`
    // See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245
    app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } });
    
    const logger = loggerProvider.getLogger('default');
    app.hook.log((context) => {
        logger.emit({
            body: context.message,
            severityNumber: toOtelSeverityNumber(context.level),
            severityText: context.level,
        });
    });
    
    app.hook.preInvocation((context) => {
        context.functionHandler = otelContext.bind(
            propagation.extract(otelContext.active(), {
                traceparent: context.invocationContext.traceContext.traceParent,
                tracestate: context.invocationContext.traceContext.traceState,
            }),
            context.functionHandler
        );
    });
    
    function toOtelSeverityNumber(level: LogLevel): SeverityNumber {
        switch (level) {
            case 'information':
                return SeverityNumber.INFO;
            case 'debug':
                return SeverityNumber.DEBUG;
            case 'error':
                return SeverityNumber.ERROR;
            case 'trace':
                return SeverityNumber.TRACE;
            case 'warning':
                return SeverityNumber.WARN;
            case 'critical':
                return SeverityNumber.FATAL;
            default:
                return SeverityNumber.UNSPECIFIED;
        }
    }
    
  2. main Обновите поле в файле package.json, чтобы включить выходные данные этого нового src/index.ts файла, которые могут выглядеть следующим образом:

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

Внимание

Выходные данные OpenTelemetry в Application Аналитика из рабочей роли языка в настоящее время не поддерживаются для приложений PowerShell. Вместо этого можно использовать конечную точку экспортера OTLP. Когда узел настроен для выходных данных OpenTelemetry в Приложение Аналитика, журналы, созданные рабочим процессом PowerShell, по-прежнему перенаправляются, но распределенная трассировка в настоящее время не поддерживается.

Эти инструкции применяются только для экспортера OTLP:

  1. Добавьте параметр приложения с именем OTEL_FUNCTIONS_WORKER_ENABLED со значением True.

  2. Создайте папку уровня Modules приложения в корне приложения и выполните следующую команду:

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

    Это устанавливает необходимый AzureFunctions.PowerShell.OpenTelemetry.SDK модуль непосредственно в приложении. requirements.psd1 Невозможно использовать файл для автоматической установки этой зависимости, так как управляемые зависимости в настоящее время не поддерживаются в предварительной версии плана потребления Flex.

  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. В настоящее время необходимо развернуть код в Azure для проверки обновлений, связанных с OpenTelemetry.

  • В настоящее время поддерживаются только триггеры HTTP и триггеры на основе пакета SDK Для Azure с выходными данными OpenTelemetry.

Мониторинг плана потребления Функции Azure Flex