Использование 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:
Выполните следующие команды, чтобы установить необходимые сборки в приложении:
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
Добавьте в файл проекта Program.cs следующее
using
:using Azure.Monitor.OpenTelemetry.AspNetCore;
ConfigureServices
Добавьте эту конфигурацию службы в делегате:services.AddOpenTelemetry() .UseFunctionsWorkerDefaults() .UseAzureMonitor();
Чтобы экспортировать обе конечные точки OpenTelemetry, вызовите оба
UseAzureMonitor
иUseOtlpExporter
.
Оптимизация рабочих ролей Java пока недоступна для OpenTelemetry, поэтому в коде Java ничего не нужно настраивать.
Установите эти пакеты npm в проекте:
npm install @opentelemetry/api npm install @opentelemetry/auto-instrumentations-node npm install @azure/monitor-opentelemetry-exporter
Создайте файл кода в проекте, скопируйте и вставьте следующий код в этот новый файл и сохраните его следующим образом
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; } }
main
Обновите поле в файле package.json, чтобы включить этот новыйsrc/index.js
файл, который может выглядеть следующим образом:"main": "src/{index.js,functions/*.js}"
Создайте файл кода в проекте, скопируйте и вставьте следующий код в этот новый файл и сохраните его следующим образом
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; } }
main
Обновите поле в файле package.json, чтобы включить выходные данные этого новогоsrc/index.ts
файла, которые могут выглядеть следующим образом:"main": "dist/src/{index.js,functions/*.js}"
Внимание
Выходные данные OpenTelemetry в Application Аналитика из рабочей роли языка в настоящее время не поддерживаются для приложений PowerShell. Вместо этого можно использовать конечную точку экспортера OTLP. Когда узел настроен для выходных данных OpenTelemetry в Приложение Аналитика, журналы, созданные рабочим процессом PowerShell, по-прежнему перенаправляются, но распределенная трассировка в настоящее время не поддерживается.
Эти инструкции применяются только для экспортера OTLP:
Добавьте параметр приложения с именем
OTEL_FUNCTIONS_WORKER_ENABLED
со значениемTrue
.Создайте папку уровня
Modules
приложения в корне приложения и выполните следующую команду:Save-Module -Name AzureFunctions.PowerShell.OpenTelemetry.SDK
Это устанавливает необходимый
AzureFunctions.PowerShell.OpenTelemetry.SDK
модуль непосредственно в приложении.requirements.psd1
Невозможно использовать файл для автоматической установки этой зависимости, так как управляемые зависимости в настоящее время не поддерживаются в предварительной версии плана потребления Flex.Добавьте этот код в файл profile.ps1:
Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop Initialize-FunctionsOpenTelemetry
Добавьте эту запись в
requirements.txt
файл:azure.monitor.opentelemetry
Добавьте этот код в
function_app.py
файл основной точки входа:from azure.monitor.opentelemetry import configure_azure_monitor configure_azure_monitor()
Рекомендации по OpenTelemetry
При экспорте данных с помощью OpenTelemetry следует учитывать эти текущие рекомендации.
Если узел настроен на использование OpenTelemetry, экспортируются только журналы и трассировки. Метрики узлов в настоящее время не экспортируются.
В настоящее время вы не можете локально запустить проект приложения с помощью основных инструментов, если в узле включена функция OpenTelemetry. В настоящее время необходимо развернуть код в Azure для проверки обновлений, связанных с OpenTelemetry.
В настоящее время поддерживаются только триггеры HTTP и триггеры на основе пакета SDK Для Azure с выходными данными OpenTelemetry.
Связанный контент
Кері байланыс
https://aka.ms/ContentUserFeedback.
Жақында қолжетімді болады: 2024 жыл бойы біз GitHub Issues жүйесін мазмұнға арналған кері байланыс механизмі ретінде біртіндеп қолданыстан шығарамыз және оны жаңа кері байланыс жүйесімен ауыстырамыз. Қосымша ақпаратты мұнда қараңыз:Жіберу және пікірді көру