/
main.ts
109 lines (102 loc) · 4.68 KB
/
main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { shutdownAzureMonitor as distroShutdownAzureMonitor, useAzureMonitor as distroUseAzureMonitor } from "@azure/monitor-opentelemetry";
import { ProxyTracerProvider, diag, metrics, trace } from "@opentelemetry/api";
import { logs } from "@opentelemetry/api-logs";
import { MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs";
import { BasicTracerProvider, BatchSpanProcessor, NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { AutoCollectLogs } from "./logs/autoCollectLogs";
import { AutoCollectExceptions } from "./logs/exceptions";
import { AzureMonitorOpenTelemetryOptions } from "./types";
import { ApplicationInsightsConfig } from "./shared/configuration/config";
import { LogApi } from "./shim/logsApi";
import { PerformanceCounterMetrics } from "./metrics/performanceCounters";
import { AzureMonitorSpanProcessor } from "./traces/spanProcessor";
let autoCollectLogs: AutoCollectLogs;
let exceptions: AutoCollectExceptions;
let perfCounters: PerformanceCounterMetrics;
/**
* Initialize Azure Monitor
* @param options Configuration
*/
export function useAzureMonitor(options?: AzureMonitorOpenTelemetryOptions) {
distroUseAzureMonitor(options);
const internalConfig = new ApplicationInsightsConfig(options);
const logApi = new LogApi(logs.getLogger("ApplicationInsightsLogger"));
autoCollectLogs = new AutoCollectLogs();
if (internalConfig.enableAutoCollectExceptions) {
exceptions = new AutoCollectExceptions(logApi);
}
if (internalConfig.enableAutoCollectPerformance) {
try {
perfCounters = new PerformanceCounterMetrics(internalConfig);
// Add SpanProcessor to calculate Request Metrics
if (typeof (trace.getTracerProvider() as BasicTracerProvider).addSpanProcessor === "function") {
(trace.getTracerProvider() as BasicTracerProvider).addSpanProcessor(new AzureMonitorSpanProcessor(perfCounters));
}
} catch (err) {
diag.error("Failed to initialize PerformanceCounterMetrics: ", err);
}
}
autoCollectLogs.enable(internalConfig.instrumentationOptions);
_addOtlpExporters(internalConfig);
}
/**
* Shutdown Azure Monitor
*/
export async function shutdownAzureMonitor() {
await distroShutdownAzureMonitor();
autoCollectLogs.shutdown();
exceptions?.shutdown();
perfCounters?.shutdown();
}
/**
*Try to send all queued telemetry if present.
*/
export async function flushAzureMonitor() {
try {
await (metrics.getMeterProvider() as MeterProvider).forceFlush();
await (((trace.getTracerProvider() as ProxyTracerProvider).getDelegate()) as BasicTracerProvider).forceFlush();
await (logs.getLoggerProvider() as LoggerProvider).forceFlush();
} catch (err) {
diag.error("Failed to flush telemetry", err);
}
}
function _addOtlpExporters(internalConfig: ApplicationInsightsConfig) {
if (internalConfig.otlpMetricExporterConfig?.enabled) {
const otlpMetricsExporter = new OTLPMetricExporter(internalConfig.otlpMetricExporterConfig);
const otlpMetricReader = new PeriodicExportingMetricReader({
exporter: otlpMetricsExporter,
});
try {
(metrics.getMeterProvider() as MeterProvider).addMetricReader(otlpMetricReader);
}
catch (err) {
diag.error("Failed to set OTLP Metric Exporter", err);
}
}
if (internalConfig.otlpLogExporterConfig?.enabled) {
const otlpLogExporter = new OTLPLogExporter(internalConfig.otlpLogExporterConfig);
const otlpLogProcessor = new BatchLogRecordProcessor(otlpLogExporter);
try {
(logs.getLoggerProvider() as LoggerProvider).addLogRecordProcessor(otlpLogProcessor);
}
catch (err) {
diag.error("Failed to set OTLP Log Exporter", err);
}
}
if (internalConfig.otlpTraceExporterConfig?.enabled) {
const otlpTraceExporter = new OTLPTraceExporter(internalConfig.otlpTraceExporterConfig);
const otlpSpanProcessor = new BatchSpanProcessor(otlpTraceExporter);
try {
((trace.getTracerProvider() as ProxyTracerProvider).getDelegate() as NodeTracerProvider).addSpanProcessor(otlpSpanProcessor);
}
catch (err) {
diag.error("Failed to set OTLP Trace Exporter", err);
}
}
}