Azure Monitor OpenTelemetry для JavaScript
Начало работы
Установка пакета
npm install @azure/monitor-opentelemetry
Поддерживаемые в настоящее время среды
предупреждение: этот пакет SDK работает только для сред Node.js. Используйте пакет SDK javaScript для Application Insights для веб-сайтов и браузеров.
Дополнительные сведения см. в политике поддержки .
Необходимые условия
Включение клиента OpenTelemetry в Azure Monitor
Важно:
useAzureMonitor
необходимо вызвать , прежде чем импортировать что-либо другое. При импорте других библиотек может возникнуть потеря телеметрии.
import { useAzureMonitor, AzureMonitorOpenTelemetryOptions } from "@azure/monitor-opentelemetry";
const options: AzureMonitorOpenTelemetryOptions = {
azureMonitorExporterOptions: {
connectionString:
process.env["APPLICATIONINSIGHTS_CONNECTION_STRING"] || "<your connection string>",
},
};
useAzureMonitor(options);
- Строка подключения может быть задана с помощью переменной среды APPLICATIONINSIGHTS_CONNECTION_STRING
Конфигурация
import { AzureMonitorOpenTelemetryOptions, useAzureMonitor } from "@azure/monitor-opentelemetry";
import { Resource } from "@opentelemetry/resources";
const resource = new Resource({ testAttribute: "testValue" });
const options: AzureMonitorOpenTelemetryOptions = {
azureMonitorExporterOptions: {
// Offline storage
storageDirectory: "c://azureMonitor",
// Automatic retries
disableOfflineStorage: false,
// Application Insights Connection String
connectionString:
process.env["APPLICATIONINSIGHTS_CONNECTION_STRING"] || "<your connection string>",
},
samplingRatio: 1,
instrumentationOptions: {
// Instrumentations generating traces
azureSdk: { enabled: true },
http: { enabled: true },
mongoDb: { enabled: true },
mySql: { enabled: true },
postgreSql: { enabled: true },
redis: { enabled: true },
redis4: { enabled: true },
// Instrumentations generating logs
bunyan: { enabled: true },
winston: { enabled: true },
},
enableLiveMetrics: true,
enableStandardMetrics: true,
browserSdkLoaderOptions: {
enabled: false,
connectionString: "",
},
resource: resource,
logRecordProcessors: [],
spanProcessors: [],
};
useAzureMonitor(options);
Свойство | Описание | По умолчанию | ||
---|---|---|---|---|
azureMonitorExporterOptions | Конфигурация экспортера OpenTelemetry в Azure Monitor. Дополнительные сведения здесь | |||
выборкаRatio | Коэффициент выборки должен принимать значение в диапазоне [0,1], то есть все данные будут выборки, а 0 все данные трассировки будут извлечены. | 1 | ||
инструментированиеOptions | Разрешить настройку инструментирования OpenTelemetry. | {"http": { enabled: true },"azureSdk": { enabled: false },"mongoDb": { enabled: false },"mySql": { enabled: false },"postgreSql": { enabled: false },"redis": { enabled: false },"bunyan": { enabled: false }, "winston": { enabled: false } | ||
browserSdkLoaderOptions | Разрешить настройку веб-инструментирования. | { включено: false, connectionString: "" } | ||
ресурс | Ресурс Opentelemetry. Дополнительные сведения здесь | |||
выборкаRatio | Коэффициент выборки должен принимать значение в диапазоне [0,1], то есть все данные будут выборки, а 0 все данные трассировки будут извлечены. | 1 | ||
enableLiveMetrics | Включение и отключение динамических метрик. | истинный | ||
enableStandardMetrics | Включение и отключение стандартных метрик. | истинный | ||
logRecordProcessors | Массив обработчиков записей журналов для регистрации в поставщике глобального средства ведения журнала. | |||
spanProcessors | Массив процессоров диапазона для регистрации в глобальном поставщике трассировки. | |||
enableTraceBasedSamplingForLogs | Включите выборку журнала на основе трассировки. | ложный |
Параметры можно задать с помощью applicationinsights.json
файла конфигурации, расположенного в корневой папке папки установки пакета @azure/monitor-opentelemetry, ex: node_modules/@azure/monitor-opentelemetry
. Эти значения конфигурации будут применены ко всем экземплярам AzureMonitorOpenTelemetryClient.
{
"samplingRatio": 0.8,
"enableStandardMetrics": true,
"enableLiveMetrics": true,
"instrumentationOptions":{
"azureSdk": {
"enabled": false
}
},
...
}
Пользовательский JSON-файл можно предоставить с помощью переменной среды APPLICATIONINSIGHTS_CONFIGURATION_FILE
.
process.env.APPLICATIONINSIGHTS_CONFIGURATION_FILE =
"C:/applicationinsights/config/customConfig.json";
// Application Insights SDK setup....
Библиотеки инструментирования
Следующие библиотеки инструментирования OpenTelemetry включены в состав Azure Monitor OpenTelemetry.
предупреждение : библиотеки инструментирования основаны на экспериментальных спецификациях OpenTelemetry. В предварительной версии корпорации Майкрософт обязательство по поддержке заключается в том, чтобы следующие библиотеки выводят данные в Azure Monitor Application Insights, но возможно, что критические изменения или экспериментальное сопоставление блокируют некоторые элементы данных.
Распределенная трассировка
Метрика
Журналы
Другие инструментирования OpenTelemetry доступны здесь и могут быть добавлены с помощью TracerProvider в AzureMonitorOpenTelemetryClient.
import { useAzureMonitor } from "@azure/monitor-opentelemetry";
import { metrics, trace } from "@opentelemetry/api";
import { registerInstrumentations } from "@opentelemetry/instrumentation";
import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
useAzureMonitor();
const instrumentations = [new ExpressInstrumentation()];
registerInstrumentations({
tracerProvider: trace.getTracerProvider(),
meterProvider: metrics.getMeterProvider(),
instrumentations: instrumentations,
});
Загрузчик пакета SDK для браузера Application Insights
Загрузчик пакета SDK для браузера Application Insights позволяет внедрять веб-пакет SDK в ответы сервера узлов, если выполняются следующие условия:
- Ответ имеет код состояния
200
. - Метод ответа
GET
. - Ответ сервера содержит заголовок html
Conent-Type
. - Резонировать сервер содержит теги и .
- Ответ не содержит текущих конечных точек CDN веб-инструментирования /backup. (текущие и резервные конечные точки CDN веб-инструментирования, здесь)
Дополнительные сведения об использовании загрузчика пакета SDK для браузера можно найти здесь.
Задание имени облачной роли и экземпляра облачной роли
Можно задать имя облачной роли и экземпляр облачной роли с помощью атрибутов ресурсов OpenTelemetry.
import { useAzureMonitor, AzureMonitorOpenTelemetryOptions } from "@azure/monitor-opentelemetry";
import { Resource } from "@opentelemetry/resources";
import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions";
// ----------------------------------------
// Setting role name and role instance
// ----------------------------------------
const customResource = Resource.EMPTY;
customResource.attributes[SemanticResourceAttributes.SERVICE_NAME] = "my-helloworld-service";
customResource.attributes[SemanticResourceAttributes.SERVICE_NAMESPACE] = "my-namespace";
customResource.attributes[SemanticResourceAttributes.SERVICE_INSTANCE_ID] = "my-instance";
const options: AzureMonitorOpenTelemetryOptions = { resource: customResource };
useAzureMonitor(options);
Сведения о стандартных атрибутах ресурсов см. в семантических соглашений о ресурсах.
Изменение телеметрии
В этом разделе объясняется, как изменить данные телеметрии.
Добавление атрибутов диапазона
Чтобы добавить атрибуты диапазона, используйте один из следующих двух способов:
- Используйте параметры, предоставляемые библиотеками инструментирования .
- Добавьте настраиваемый процессор диапазона.
Эти атрибуты могут включать добавление настраиваемого свойства в данные телеметрии.
совет. Преимущество использования параметров, предоставляемых библиотеками инструментирования, когда они доступны, заключается в том, что весь контекст доступен. В результате пользователи могут выбрать добавление или фильтрацию дополнительных атрибутов. Например, параметр обогащения в библиотеке инструментирования HttpClient предоставляет пользователям доступ к самому httpRequestMessage. Они могут выбрать все из него и сохранить его в качестве атрибута.
Добавление настраиваемого свойства в трассировку
Все атрибуты , добавленные в диапазоны, экспортируются как настраиваемые свойства.
Используйте пользовательский процессор:
import { useAzureMonitor, AzureMonitorOpenTelemetryOptions } from "@azure/monitor-opentelemetry";
import { ReadableSpan, Span, SpanProcessor } from "@opentelemetry/sdk-trace-base";
import { SemanticAttributes } from "@opentelemetry/semantic-conventions";
class SpanEnrichingProcessor implements SpanProcessor {
forceFlush(): Promise<void> {
return Promise.resolve();
}
shutdown(): Promise<void> {
return Promise.resolve();
}
onStart(_span: Span): void {}
onEnd(span: ReadableSpan) {
span.attributes["CustomDimension1"] = "value1";
span.attributes["CustomDimension2"] = "value2";
span.attributes[SemanticAttributes.HTTP_CLIENT_IP] = "<IP Address>";
}
}
// Enable Azure Monitor integration.
const options: AzureMonitorOpenTelemetryOptions = {
// Add the SpanEnrichingProcessor
spanProcessors: [new SpanEnrichingProcessor()],
};
useAzureMonitor(options);
Добавление имени операции в трассировки и журналы
Используйте настраиваемый обработчик диапазонов и обработчик записей журналов, чтобы подключить и сопоставить имя операции из запросов к зависимостям и журналам.
import { useAzureMonitor, AzureMonitorOpenTelemetryOptions } from "@azure/monitor-opentelemetry";
import { ReadableSpan, Span, SpanProcessor } from "@opentelemetry/sdk-trace-base";
import { LogRecordProcessor } from "@opentelemetry/sdk-logs";
import { SemanticAttributes } from "@opentelemetry/semantic-conventions";
import { AI_OPERATION_NAME } from "@azure/monitor-opentelemetry-exporter";
import { Context, trace } from "@opentelemetry/api";
class SpanEnrichingProcessor implements SpanProcessor {
forceFlush(): Promise<void> {
return Promise.resolve();
}
shutdown(): Promise<void> {
return Promise.resolve();
}
onStart(_span: Span, _context: Context): void {
const parentSpan = trace.getSpan(_context);
if (parentSpan && "name" in parentSpan) {
// If the parent span has a name we can assume it is a ReadableSpan and cast it.
_span.attributes[AI_OPERATION_NAME] = (parentSpan as unknown as ReadableSpan).name;
}
}
onEnd(span: ReadableSpan) {}
}
class LogRecordEnrichingProcessor implements LogRecordProcessor {
forceFlush(): Promise<void> {
return Promise.resolve();
}
shutdown(): Promise<void> {
return Promise.resolve();
}
onEmit(_logRecord, _context): void {
const parentSpan = trace.getSpan(_context);
if (parentSpan && "name" in parentSpan) {
// If the parent span has a name we can assume it is a ReadableSpan and cast it.
_logRecord.attributes[AI_OPERATION_NAME] = (parentSpan as unknown as ReadableSpan).name;
}
}
}
// Enable Azure Monitor integration.
const options: AzureMonitorOpenTelemetryOptions = {
// Add the SpanEnrichingProcessor
spanProcessors: [new SpanEnrichingProcessor()],
logRecordProcessors: [new LogRecordEnrichingProcessor()],
};
useAzureMonitor(options);
Фильтрация телеметрии
Вы можете использовать следующие способы фильтрации телеметрии перед выходом из приложения.
Исключите параметр URL-адреса, предоставляемый многими библиотеками инструментирования HTTP.
В следующем примере показано, как исключить определенный URL-адрес из отслеживания с помощью библиотеки инструментирования HTTP/HTTPS:
import { useAzureMonitor, AzureMonitorOpenTelemetryOptions, } from "@azure/monitor-opentelemetry"; import { IncomingMessage } from "http"; import { RequestOptions } from "https"; import { HttpInstrumentationConfig } from "@opentelemetry/instrumentation-http"; const httpInstrumentationConfig: HttpInstrumentationConfig = { enabled: true, ignoreIncomingRequestHook: (request: IncomingMessage) => { // Ignore OPTIONS incoming requests if (request.method === "OPTIONS") { return true; } return false; }, ignoreOutgoingRequestHook: (options: RequestOptions) => { // Ignore outgoing requests with /test path if (options.path === "/test") { return true; } return false; }, }; const options: AzureMonitorOpenTelemetryOptions = { instrumentationOptions: { http: httpInstrumentationConfig, }, }; useAzureMonitor(options);
Используйте пользовательский процессор. Вы можете использовать настраиваемый обработчик диапазонов для исключения определенных диапазонов из экспорта. Чтобы пометить диапазоны, не экспортируемые, задайте для
TraceFlag
значениеDEFAULT
. Используйте пример пользовательского свойства , но замените следующие строки кода:```typescript ... import { SpanKind, TraceFlags } from "@opentelemetry/api"; import { ReadableSpan, SpanProcessor } from "@opentelemetry/sdk-trace-base"; class SpanEnrichingProcessor implements SpanProcessor { ... onEnd(span: ReadableSpan) { if(span.kind == SpanKind.INTERNAL){ span.spanContext().traceFlags = TraceFlags.NONE; } } } ```
Настраиваемая телеметрия
В этом разделе объясняется, как собирать пользовательские данные телеметрии из приложения.
Добавление пользовательских метрик
Вы можете собирать метрики за пределами собранных библиотек инструментирования .
API OpenTelemetry предлагает шесть инструментов метрик для покрытия различных сценариев метрик, и вам потребуется выбрать правильный тип агрегирования при визуализации метрик в обозревателе метрик. Это требование верно при использовании API метрик OpenTelemetry для отправки метрик и при использовании библиотеки инструментирования.
В следующей таблице показаны рекомендуемые типы агрегатов] для каждого из инструментов метрик OpenTelemetry.
Инструмент OpenTelemetry | Тип агрегирования Azure Monitor |
---|---|
Прилавок | Сумма |
Асинхронный счетчик | Сумма |
Гистограмма | Среднее, сумма, число (максимальное, минимальное значение для Python и только Node.js) |
Асинхронный датчик | Средний |
UpDownCounter (только Python и Node.js) | Сумма |
Асинхронный upDownCounter (только Python и Node.js) | Сумма |
осторожность: типы агрегирования за пределами того, что показано в таблице, обычно не являются значимыми.
В спецификации OpenTelemetry описываются инструменты и приведены примеры использования каждого из них.
import { useAzureMonitor } from "@azure/monitor-opentelemetry";
import { ObservableResult, metrics } from "@opentelemetry/api";
useAzureMonitor();
const meter = metrics.getMeter("testMeter");
let histogram = meter.createHistogram("histogram");
let counter = meter.createCounter("counter");
let gauge = meter.createObservableGauge("gauge");
gauge.addCallback((observableResult: ObservableResult) => {
let randomNumber = Math.floor(Math.random() * 100);
observableResult.observe(randomNumber, { testKey: "testValue" });
});
histogram.record(1, { testKey: "testValue" });
histogram.record(30, { testKey: "testValue2" });
histogram.record(100, { testKey2: "testValue" });
counter.add(1, { testKey: "testValue" });
counter.add(5, { testKey2: "testValue" });
counter.add(3, { testKey: "testValue2" });
Добавление настраиваемых исключений
Выберите библиотеки инструментирования автоматически поддерживают исключения в Application Insights. Однако может потребоваться вручную сообщать об исключениях за пределами отчетов библиотек инструментирования. Например, исключения, пойманные в коде, не обычно не сообщается, и вы можете сообщить о них и привлечь внимание к ним в соответствующих интерфейсах, включая колонку сбоев и сквозное представление транзакций.
import { useAzureMonitor } from "@azure/monitor-opentelemetry";
import { trace, Exception } from "@opentelemetry/api";
useAzureMonitor();
const tracer = trace.getTracer("testMeter");
let span = tracer.startSpan("hello");
try {
throw new Error("Test Error");
} catch (error) {
span.recordException(error as Exception);
}
Устранение неполадок
Самостоятельная диагностика
Azure Monitor OpenTelemetry использует средство ведения журнала API OpenTelemetry для внутренних журналов. Чтобы включить его, используйте следующий код:
import { useAzureMonitor } from "@azure/monitor-opentelemetry";
import { DiagLogLevel } from "@opentelemetry/api";
process.env.APPLICATIONINSIGHTS_INSTRUMENTATION_LOGGING_LEVEL = "VERBOSE";
process.env.APPLICATIONINSIGHTS_LOG_DESTINATION = "file";
process.env.APPLICATIONINSIGHTS_LOGDIR = "C:/applicationinsights/logs";
useAzureMonitor();
переменная среды APPLICATIONINSIGHTS_INSTRUMENTATION_LOGGING_LEVEL
может использоваться для задания требуемого уровня журнала, поддерживающего следующие значения: NONE
, ERROR
, WARN
, INFO
, DEBUG
, VERBOSE
и ALL
.
Журналы можно поместить в локальный файл с помощью переменной среды APPLICATIONINSIGHTS_LOG_DESTINATION
, поддерживаемые значения — file
и file+console
, файл с именем applicationinsights.log
будет создан в папке tmp по умолчанию, включая все журналы, /tmp
для *nix и USERDIR/AppData/Local/Temp
для Windows. Каталог журналов можно настроить с помощью переменной среды APPLICATIONINSIGHTS_LOGDIR
.
Примеры
Полные примеры нескольких сценариев чемпиона см. в папке samples/
.
Основные понятия
Дополнительные сведения о проекте OpenTelemetry см. в спецификациях OpenTelemetry.
Реестр подключаемых модулей
Чтобы узнать, был ли подключаемый модуль уже создан для используемой библиотеки, ознакомьтесь с реестром OpenTelemetry.
Если вы не можете использовать библиотеку в реестре, вы можете предложить новый запрос подключаемого модуля по opentelemetry-js-contrib
.
Способствует
Если вы хотите внести свой вклад в эту библиотеку, ознакомьтесь с руководством по вкладу, чтобы узнать больше о том, как создавать и тестировать код.
Azure SDK for JavaScript