Skip to content

Commit 80a83de

Browse files
authored
Add open telemetry samples (#20)
1 parent 7e06946 commit 80a83de

8 files changed

+4452
-195
lines changed

js/package-lock.json

Lines changed: 2041 additions & 78 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
"test": "echo \"No tests yet...\""
1010
},
1111
"dependencies": {
12-
"@azure/functions": "^4.1.0"
12+
"@azure/functions": "^4.5.0",
13+
"@azure/monitor-opentelemetry-exporter": "^1.0.0-beta.23",
14+
"@opentelemetry/api": "^1.8.0",
15+
"@opentelemetry/auto-instrumentations-node": "^0.46.1",
16+
"@opentelemetry/exporter-logs-otlp-http": "^0.51.1"
1317
},
1418
"devDependencies": {
1519
"eslint": "^7.32.0",

js/src/otelAppInsights.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
const { app } = require('@azure/functions');
2+
const { AzureMonitorLogExporter, AzureMonitorTraceExporter } = require('@azure/monitor-opentelemetry-exporter');
3+
const { context: otelContext, propagation } = require('@opentelemetry/api');
4+
const { SeverityNumber } = require('@opentelemetry/api-logs');
5+
const { getNodeAutoInstrumentations, getResourceDetectors } = require('@opentelemetry/auto-instrumentations-node');
6+
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
7+
const { detectResourcesSync } = require('@opentelemetry/resources');
8+
const { LoggerProvider, SimpleLogRecordProcessor } = require('@opentelemetry/sdk-logs');
9+
const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node');
10+
11+
const resource = detectResourcesSync({ detectors: getResourceDetectors() });
12+
13+
const tracerProvider = new NodeTracerProvider({ resource });
14+
tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new AzureMonitorTraceExporter()));
15+
tracerProvider.register();
16+
17+
const loggerProvider = new LoggerProvider({ resource });
18+
loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new AzureMonitorLogExporter()));
19+
20+
registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations()] });
21+
22+
// NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions`
23+
// See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245
24+
app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } });
25+
26+
const logger = loggerProvider.getLogger('default');
27+
app.hook.log((context) => {
28+
logger.emit({
29+
body: context.message,
30+
severityNumber: toOtelSeverityNumber(context.level),
31+
severityText: context.level,
32+
});
33+
});
34+
35+
app.hook.preInvocation((context) => {
36+
context.functionHandler = otelContext.bind(
37+
propagation.extract(otelContext.active(), {
38+
traceparent: context.invocationContext.traceContext.traceParent,
39+
tracestate: context.invocationContext.traceContext.traceState,
40+
}),
41+
context.functionHandler
42+
);
43+
});
44+
45+
function toOtelSeverityNumber(level) {
46+
switch (level) {
47+
case 'information':
48+
return SeverityNumber.INFO;
49+
case 'debug':
50+
return SeverityNumber.DEBUG;
51+
case 'error':
52+
return SeverityNumber.ERROR;
53+
case 'trace':
54+
return SeverityNumber.TRACE;
55+
case 'warning':
56+
return SeverityNumber.WARN;
57+
case 'critical':
58+
return SeverityNumber.FATAL;
59+
default:
60+
return SeverityNumber.UNSPECIFIED;
61+
}
62+
}

js/src/otelOtlp.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
const { app } = require('@azure/functions');
2+
const { context: otelContext, propagation } = require('@opentelemetry/api');
3+
const { SeverityNumber } = require('@opentelemetry/api-logs');
4+
const { getNodeAutoInstrumentations, getResourceDetectors } = require('@opentelemetry/auto-instrumentations-node');
5+
const { OTLPLogExporter } = require('@opentelemetry/exporter-logs-otlp-http');
6+
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
7+
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
8+
const { detectResourcesSync } = require('@opentelemetry/resources');
9+
const { LoggerProvider, SimpleLogRecordProcessor } = require('@opentelemetry/sdk-logs');
10+
const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node');
11+
12+
const resource = detectResourcesSync({ detectors: getResourceDetectors() });
13+
14+
const tracerProvider = new NodeTracerProvider({ resource });
15+
tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new OTLPTraceExporter()));
16+
tracerProvider.register();
17+
18+
const loggerProvider = new LoggerProvider({ resource });
19+
loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new OTLPLogExporter()));
20+
21+
registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations()] });
22+
23+
// NOTE: The below code will soon be a part of a new package `@opentelemetry/instrumentation-azure-functions`
24+
// See here for more info: https://github.com/Azure/azure-functions-nodejs-library/issues/245
25+
app.setup({ capabilities: { WorkerOpenTelemetryEnabled: true } });
26+
27+
const logger = loggerProvider.getLogger('default');
28+
app.hook.log((context) => {
29+
logger.emit({
30+
body: context.message,
31+
severityNumber: toOtelSeverityNumber(context.level),
32+
severityText: context.level,
33+
});
34+
});
35+
36+
app.hook.preInvocation((context) => {
37+
context.functionHandler = otelContext.bind(
38+
propagation.extract(otelContext.active(), {
39+
traceparent: context.invocationContext.traceContext.traceParent,
40+
tracestate: context.invocationContext.traceContext.traceState,
41+
}),
42+
context.functionHandler
43+
);
44+
});
45+
46+
function toOtelSeverityNumber(level) {
47+
switch (level) {
48+
case 'information':
49+
return SeverityNumber.INFO;
50+
case 'debug':
51+
return SeverityNumber.DEBUG;
52+
case 'error':
53+
return SeverityNumber.ERROR;
54+
case 'trace':
55+
return SeverityNumber.TRACE;
56+
case 'warning':
57+
return SeverityNumber.WARN;
58+
case 'critical':
59+
return SeverityNumber.FATAL;
60+
default:
61+
return SeverityNumber.UNSPECIFIED;
62+
}
63+
}

0 commit comments

Comments
 (0)