@prairielearn/opentelemetry 1.10.6 → 1.10.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/init.d.ts +2 -2
- package/dist/init.js +30 -30
- package/dist/init.js.map +1 -1
- package/dist/tracing.test.js +5 -1
- package/dist/tracing.test.js.map +1 -1
- package/package.json +20 -21
- package/src/init.ts +40 -33
- package/src/tracing.test.ts +5 -1
- package/tsconfig.json +2 -2
package/CHANGELOG.md
CHANGED
package/dist/init.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PushMetricExporter } from '@opentelemetry/sdk-metrics';
|
|
2
|
-
import { SpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
import { SpanExporter, SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
3
3
|
export interface OpenTelemetryConfigEnabled {
|
|
4
4
|
openTelemetryEnabled: true;
|
|
5
5
|
openTelemetryExporter: 'console' | 'honeycomb' | 'jaeger' | SpanExporter;
|
|
@@ -7,7 +7,7 @@ export interface OpenTelemetryConfigEnabled {
|
|
|
7
7
|
openTelemetryMetricExportIntervalMillis?: number;
|
|
8
8
|
openTelemetrySamplerType: 'always-on' | 'always-off' | 'trace-id-ratio';
|
|
9
9
|
openTelemetrySampleRate?: number;
|
|
10
|
-
openTelemetrySpanProcessor?: 'batch' | 'simple';
|
|
10
|
+
openTelemetrySpanProcessor?: 'batch' | 'simple' | SpanProcessor;
|
|
11
11
|
honeycombApiKey?: string;
|
|
12
12
|
honeycombDataset?: string;
|
|
13
13
|
serviceName?: string;
|
package/dist/init.js
CHANGED
|
@@ -11,7 +11,6 @@ const api_1 = require("@opentelemetry/api");
|
|
|
11
11
|
const core_1 = require("@opentelemetry/core");
|
|
12
12
|
// Exporters go here.
|
|
13
13
|
const exporter_trace_otlp_grpc_1 = require("@opentelemetry/exporter-trace-otlp-grpc");
|
|
14
|
-
const exporter_jaeger_1 = require("@opentelemetry/exporter-jaeger");
|
|
15
14
|
const exporter_metrics_otlp_grpc_1 = require("@opentelemetry/exporter-metrics-otlp-grpc");
|
|
16
15
|
// Instrumentations go here.
|
|
17
16
|
const instrumentation_aws_sdk_1 = require("@opentelemetry/instrumentation-aws-sdk");
|
|
@@ -122,13 +121,8 @@ function getTraceExporter(config) {
|
|
|
122
121
|
});
|
|
123
122
|
break;
|
|
124
123
|
case 'jaeger':
|
|
125
|
-
return new
|
|
126
|
-
|
|
127
|
-
// with packet sizes when Jaeger is running in Docker. We'll instead
|
|
128
|
-
// configure it to use the HTTP sender, which shouldn't face those
|
|
129
|
-
// same issues. We'll still allow the endpoint to be overridden via
|
|
130
|
-
// environment variable if needed.
|
|
131
|
-
endpoint: process.env.OTEL_EXPORTER_JAEGER_ENDPOINT ?? 'http://localhost:14268/api/traces',
|
|
124
|
+
return new exporter_trace_otlp_grpc_1.OTLPTraceExporter({
|
|
125
|
+
url: process.env.OTEL_EXPORTER_JAEGER_ENDPOINT ?? 'grpc://localhost:4317/',
|
|
132
126
|
});
|
|
133
127
|
default:
|
|
134
128
|
throw new Error(`Unknown OpenTelemetry exporter: ${config.openTelemetryExporter}`);
|
|
@@ -159,6 +153,23 @@ function getMetricExporter(config) {
|
|
|
159
153
|
throw new Error(`Unknown OpenTelemetry metric exporter: ${config.openTelemetryMetricExporter}`);
|
|
160
154
|
}
|
|
161
155
|
}
|
|
156
|
+
function getSpanProcessor(config) {
|
|
157
|
+
if (typeof config.openTelemetrySpanProcessor === 'object') {
|
|
158
|
+
return config.openTelemetrySpanProcessor;
|
|
159
|
+
}
|
|
160
|
+
const traceExporter = getTraceExporter(config);
|
|
161
|
+
switch (config.openTelemetrySpanProcessor ?? 'batch') {
|
|
162
|
+
case 'batch': {
|
|
163
|
+
return new FilterBatchSpanProcessor(traceExporter, filter);
|
|
164
|
+
}
|
|
165
|
+
case 'simple': {
|
|
166
|
+
return new sdk_trace_base_1.SimpleSpanProcessor(traceExporter);
|
|
167
|
+
}
|
|
168
|
+
default: {
|
|
169
|
+
throw new Error(`Unknown OpenTelemetry span processor: ${config.openTelemetrySpanProcessor}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
162
173
|
/**
|
|
163
174
|
* Should be called once we've loaded our config; this will allow us to set up
|
|
164
175
|
* the correct metadata for the Honeycomb exporter. We don't actually have that
|
|
@@ -175,8 +186,8 @@ async function init(config) {
|
|
|
175
186
|
// https://github.com/open-telemetry/opentelemetry-js-contrib/pull/972
|
|
176
187
|
return;
|
|
177
188
|
}
|
|
178
|
-
const traceExporter = getTraceExporter(config);
|
|
179
189
|
const metricExporter = getMetricExporter(config);
|
|
190
|
+
const spanProcessor = getSpanProcessor(config);
|
|
180
191
|
let sampler;
|
|
181
192
|
switch (config.openTelemetrySamplerType ?? 'always-on') {
|
|
182
193
|
case 'always-on': {
|
|
@@ -196,26 +207,12 @@ async function init(config) {
|
|
|
196
207
|
default:
|
|
197
208
|
throw new Error(`Unknown OpenTelemetry sampler type: ${config.openTelemetrySamplerType}`);
|
|
198
209
|
}
|
|
199
|
-
let spanProcessor;
|
|
200
|
-
switch (config.openTelemetrySpanProcessor ?? 'batch') {
|
|
201
|
-
case 'batch': {
|
|
202
|
-
spanProcessor = new FilterBatchSpanProcessor(traceExporter, filter);
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
case 'simple': {
|
|
206
|
-
spanProcessor = new sdk_trace_base_1.SimpleSpanProcessor(traceExporter);
|
|
207
|
-
break;
|
|
208
|
-
}
|
|
209
|
-
default: {
|
|
210
|
-
throw new Error(`Unknown OpenTelemetry span processor: ${config.openTelemetrySpanProcessor}`);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
210
|
// Much of this functionality is copied from `@opentelemetry/sdk-node`, but
|
|
214
211
|
// we can't use the SDK directly because of the fact that we load our config
|
|
215
212
|
// asynchronously. We need to initialize our instrumentations first; only
|
|
216
213
|
// then can we actually start requiring all of our code that loads our config
|
|
217
214
|
// and ultimately tells us how to configure OpenTelemetry.
|
|
218
|
-
let resource =
|
|
215
|
+
let resource = (0, resources_1.detectResourcesSync)({
|
|
219
216
|
detectors: [resource_detector_aws_1.awsEc2Detector, resources_1.processDetector, resources_1.envDetector],
|
|
220
217
|
});
|
|
221
218
|
if (config.serviceName) {
|
|
@@ -233,13 +230,16 @@ async function init(config) {
|
|
|
233
230
|
tracerProvider = nodeTracerProvider;
|
|
234
231
|
// Set up metrics instrumentation if it's enabled.
|
|
235
232
|
if (metricExporter) {
|
|
236
|
-
const meterProvider = new sdk_metrics_1.MeterProvider({
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
233
|
+
const meterProvider = new sdk_metrics_1.MeterProvider({
|
|
234
|
+
resource,
|
|
235
|
+
readers: [
|
|
236
|
+
new sdk_metrics_1.PeriodicExportingMetricReader({
|
|
237
|
+
exporter: metricExporter,
|
|
238
|
+
exportIntervalMillis: config.openTelemetryMetricExportIntervalMillis ?? 30000,
|
|
239
|
+
}),
|
|
240
|
+
],
|
|
241
241
|
});
|
|
242
|
-
|
|
242
|
+
api_1.metrics.setGlobalMeterProvider(meterProvider);
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
245
|
exports.init = init;
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";;;AAAA,2CAAsD;AAEtD,kEAAmE;AACnE,4DAMoC;AACpC,kEAYuC;AACvC,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/tracing.test.js
CHANGED
|
@@ -7,12 +7,13 @@ const context_async_hooks_1 = require("@opentelemetry/context-async-hooks");
|
|
|
7
7
|
describe('instrumented', () => {
|
|
8
8
|
let contextManager;
|
|
9
9
|
const exporter = new sdk_node_1.tracing.InMemorySpanExporter();
|
|
10
|
+
const spanProcessor = new sdk_node_1.tracing.SimpleSpanProcessor(exporter);
|
|
10
11
|
before(async () => {
|
|
11
12
|
await (0, index_1.init)({
|
|
12
13
|
openTelemetryEnabled: true,
|
|
13
14
|
openTelemetryExporter: exporter,
|
|
14
15
|
openTelemetrySamplerType: 'always-on',
|
|
15
|
-
openTelemetrySpanProcessor:
|
|
16
|
+
openTelemetrySpanProcessor: spanProcessor,
|
|
16
17
|
});
|
|
17
18
|
});
|
|
18
19
|
beforeEach(async () => {
|
|
@@ -20,6 +21,7 @@ describe('instrumented', () => {
|
|
|
20
21
|
index_1.context.setGlobalContextManager(contextManager.enable());
|
|
21
22
|
});
|
|
22
23
|
afterEach(async () => {
|
|
24
|
+
await spanProcessor.forceFlush();
|
|
23
25
|
exporter.reset();
|
|
24
26
|
index_1.context.disable();
|
|
25
27
|
});
|
|
@@ -29,6 +31,7 @@ describe('instrumented', () => {
|
|
|
29
31
|
});
|
|
30
32
|
it('records a span on success', async () => {
|
|
31
33
|
await (0, index_1.instrumented)('test-success', () => 'foo');
|
|
34
|
+
await spanProcessor.forceFlush();
|
|
32
35
|
const spans = exporter.getFinishedSpans();
|
|
33
36
|
chai_1.assert.lengthOf(spans, 1);
|
|
34
37
|
chai_1.assert.equal(spans[0].name, 'test-success');
|
|
@@ -47,6 +50,7 @@ describe('instrumented', () => {
|
|
|
47
50
|
// Ensure the error was propagated back to the caller.
|
|
48
51
|
chai_1.assert.equal(maybeError?.message, 'foo');
|
|
49
52
|
// Ensure the correct span was recorded.
|
|
53
|
+
await spanProcessor.forceFlush();
|
|
50
54
|
const spans = exporter.getFinishedSpans();
|
|
51
55
|
chai_1.assert.lengthOf(spans, 1);
|
|
52
56
|
chai_1.assert.equal(spans[0].name, 'test-failure');
|
package/dist/tracing.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.test.js","sourceRoot":"","sources":["../src/tracing.test.ts"],"names":[],"mappings":";;AAAA,sDAAkD;AAClD,+BAA8B;AAE9B,mCAA6E;AAC7E,4EAA8E;AAE9E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,cAAwC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,kBAAO,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"tracing.test.js","sourceRoot":"","sources":["../src/tracing.test.ts"],"names":[],"mappings":";;AAAA,sDAAkD;AAClD,+BAA8B;AAE9B,mCAA6E;AAC7E,4EAA8E;AAE9E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,cAAwC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,kBAAO,CAAC,oBAAoB,EAAE,CAAC;IACpD,MAAM,aAAa,GAAG,IAAI,kBAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAEhE,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,IAAA,YAAI,EAAC;YACT,oBAAoB,EAAE,IAAI;YAC1B,qBAAqB,EAAE,QAAQ;YAC/B,wBAAwB,EAAE,WAAW;YACrC,0BAA0B,EAAE,aAAa;SAC1C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,cAAc,GAAG,IAAI,8CAAwB,EAAE,CAAC;QAChD,eAAO,CAAC,uBAAuB,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,eAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAY,EAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACpD,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,IAAA,oBAAY,EAAC,cAAc,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC1C,aAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1B,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5C,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,sBAAc,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,IAAI,UAAU,GAAiB,IAAI,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,IAAA,oBAAY,EAAC,cAAc,EAAE,GAAG,EAAE;gBACtC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,UAAU,GAAG,GAAG,CAAC;QACnB,CAAC;QAED,sDAAsD;QACtD,aAAM,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAEzC,wCAAwC;QACxC,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC1C,aAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1B,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5C,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,sBAAc,CAAC,KAAK,CAAC,CAAC;QACzD,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7C,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,aAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,aAAK,CAAC,OAAO,CAAC,eAAO,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;QAElE,MAAM,IAAA,oBAAY,EAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,YAAY,GAAG,eAAO,CAAC,MAAM,EAAE,CAAC;YACtC,aAAM,CAAC,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/opentelemetry",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.7",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,38 +13,37 @@
|
|
|
13
13
|
"test": "mocha --no-config --require tsx src/**/*.test.ts"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@grpc/grpc-js": "^1.
|
|
17
|
-
"@opentelemetry/api": "^1.
|
|
18
|
-
"@opentelemetry/core": "^1.
|
|
19
|
-
"@opentelemetry/exporter-
|
|
20
|
-
"@opentelemetry/exporter-
|
|
21
|
-
"@opentelemetry/
|
|
22
|
-
"@opentelemetry/instrumentation": "^0.
|
|
23
|
-
"@opentelemetry/instrumentation-aws-sdk": "^0.38.0",
|
|
16
|
+
"@grpc/grpc-js": "^1.10.1",
|
|
17
|
+
"@opentelemetry/api": "^1.8.0",
|
|
18
|
+
"@opentelemetry/core": "^1.22.0",
|
|
19
|
+
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.49.1",
|
|
20
|
+
"@opentelemetry/exporter-trace-otlp-grpc": "^0.49.1",
|
|
21
|
+
"@opentelemetry/instrumentation": "^0.49.1",
|
|
22
|
+
"@opentelemetry/instrumentation-aws-sdk": "^0.38.1",
|
|
24
23
|
"@opentelemetry/instrumentation-connect": "^0.33.0",
|
|
25
24
|
"@opentelemetry/instrumentation-dns": "^0.33.0",
|
|
26
25
|
"@opentelemetry/instrumentation-express": "^0.35.0",
|
|
27
|
-
"@opentelemetry/instrumentation-http": "^0.
|
|
26
|
+
"@opentelemetry/instrumentation-http": "^0.49.1",
|
|
28
27
|
"@opentelemetry/instrumentation-pg": "^0.38.0",
|
|
29
28
|
"@opentelemetry/instrumentation-redis": "^0.36.0",
|
|
30
29
|
"@opentelemetry/resource-detector-aws": "^1.3.6",
|
|
31
|
-
"@opentelemetry/resources": "^1.
|
|
32
|
-
"@opentelemetry/sdk-metrics": "^1.
|
|
33
|
-
"@opentelemetry/sdk-node": "^0.
|
|
34
|
-
"@opentelemetry/sdk-trace-base": "^1.
|
|
35
|
-
"@opentelemetry/sdk-trace-node": "^1.
|
|
36
|
-
"@opentelemetry/semantic-conventions": "^1.
|
|
30
|
+
"@opentelemetry/resources": "^1.22.0",
|
|
31
|
+
"@opentelemetry/sdk-metrics": "^1.22.0",
|
|
32
|
+
"@opentelemetry/sdk-node": "^0.49.1",
|
|
33
|
+
"@opentelemetry/sdk-trace-base": "^1.22.0",
|
|
34
|
+
"@opentelemetry/sdk-trace-node": "^1.22.0",
|
|
35
|
+
"@opentelemetry/semantic-conventions": "^1.22.0"
|
|
37
36
|
},
|
|
38
37
|
"devDependencies": {
|
|
39
|
-
"@opentelemetry/context-async-hooks": "^1.
|
|
38
|
+
"@opentelemetry/context-async-hooks": "^1.22.0",
|
|
40
39
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
41
|
-
"@types/chai": "^4.3.
|
|
40
|
+
"@types/chai": "^4.3.12",
|
|
42
41
|
"@types/mocha": "^10.0.6",
|
|
43
|
-
"@types/node": "^20.11.
|
|
42
|
+
"@types/node": "^20.11.24",
|
|
44
43
|
"chai": "^4.4.1",
|
|
45
44
|
"chai-as-promised": "^7.1.1",
|
|
46
|
-
"mocha": "^10.
|
|
47
|
-
"tsx": "^4.7.
|
|
45
|
+
"mocha": "^10.3.0",
|
|
46
|
+
"tsx": "^4.7.1",
|
|
48
47
|
"typescript": "^5.3.3"
|
|
49
48
|
}
|
|
50
49
|
}
|
package/src/init.ts
CHANGED
|
@@ -21,14 +21,18 @@ import {
|
|
|
21
21
|
Sampler,
|
|
22
22
|
ConsoleSpanExporter,
|
|
23
23
|
} from '@opentelemetry/sdk-trace-base';
|
|
24
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
detectResourcesSync,
|
|
26
|
+
processDetector,
|
|
27
|
+
envDetector,
|
|
28
|
+
Resource,
|
|
29
|
+
} from '@opentelemetry/resources';
|
|
25
30
|
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
|
|
26
31
|
import { metrics } from '@opentelemetry/api';
|
|
27
32
|
import { hrTimeToMilliseconds } from '@opentelemetry/core';
|
|
28
33
|
|
|
29
34
|
// Exporters go here.
|
|
30
35
|
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
|
|
31
|
-
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
|
|
32
36
|
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';
|
|
33
37
|
|
|
34
38
|
// Instrumentations go here.
|
|
@@ -132,7 +136,7 @@ export interface OpenTelemetryConfigEnabled {
|
|
|
132
136
|
openTelemetryMetricExportIntervalMillis?: number;
|
|
133
137
|
openTelemetrySamplerType: 'always-on' | 'always-off' | 'trace-id-ratio';
|
|
134
138
|
openTelemetrySampleRate?: number;
|
|
135
|
-
openTelemetrySpanProcessor?: 'batch' | 'simple';
|
|
139
|
+
openTelemetrySpanProcessor?: 'batch' | 'simple' | SpanProcessor;
|
|
136
140
|
honeycombApiKey?: string;
|
|
137
141
|
honeycombDataset?: string;
|
|
138
142
|
serviceName?: string;
|
|
@@ -172,13 +176,8 @@ function getTraceExporter(config: OpenTelemetryConfigEnabled): SpanExporter {
|
|
|
172
176
|
});
|
|
173
177
|
break;
|
|
174
178
|
case 'jaeger':
|
|
175
|
-
return new
|
|
176
|
-
|
|
177
|
-
// with packet sizes when Jaeger is running in Docker. We'll instead
|
|
178
|
-
// configure it to use the HTTP sender, which shouldn't face those
|
|
179
|
-
// same issues. We'll still allow the endpoint to be overridden via
|
|
180
|
-
// environment variable if needed.
|
|
181
|
-
endpoint: process.env.OTEL_EXPORTER_JAEGER_ENDPOINT ?? 'http://localhost:14268/api/traces',
|
|
179
|
+
return new OTLPTraceExporter({
|
|
180
|
+
url: process.env.OTEL_EXPORTER_JAEGER_ENDPOINT ?? 'grpc://localhost:4317/',
|
|
182
181
|
});
|
|
183
182
|
default:
|
|
184
183
|
throw new Error(`Unknown OpenTelemetry exporter: ${config.openTelemetryExporter}`);
|
|
@@ -214,6 +213,26 @@ function getMetricExporter(config: OpenTelemetryConfigEnabled): PushMetricExport
|
|
|
214
213
|
}
|
|
215
214
|
}
|
|
216
215
|
|
|
216
|
+
function getSpanProcessor(config: OpenTelemetryConfigEnabled): SpanProcessor {
|
|
217
|
+
if (typeof config.openTelemetrySpanProcessor === 'object') {
|
|
218
|
+
return config.openTelemetrySpanProcessor;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const traceExporter = getTraceExporter(config);
|
|
222
|
+
|
|
223
|
+
switch (config.openTelemetrySpanProcessor ?? 'batch') {
|
|
224
|
+
case 'batch': {
|
|
225
|
+
return new FilterBatchSpanProcessor(traceExporter, filter);
|
|
226
|
+
}
|
|
227
|
+
case 'simple': {
|
|
228
|
+
return new SimpleSpanProcessor(traceExporter);
|
|
229
|
+
}
|
|
230
|
+
default: {
|
|
231
|
+
throw new Error(`Unknown OpenTelemetry span processor: ${config.openTelemetrySpanProcessor}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
217
236
|
/**
|
|
218
237
|
* Should be called once we've loaded our config; this will allow us to set up
|
|
219
238
|
* the correct metadata for the Honeycomb exporter. We don't actually have that
|
|
@@ -231,8 +250,8 @@ export async function init(config: OpenTelemetryConfig) {
|
|
|
231
250
|
return;
|
|
232
251
|
}
|
|
233
252
|
|
|
234
|
-
const traceExporter = getTraceExporter(config);
|
|
235
253
|
const metricExporter = getMetricExporter(config);
|
|
254
|
+
const spanProcessor = getSpanProcessor(config);
|
|
236
255
|
|
|
237
256
|
let sampler: Sampler;
|
|
238
257
|
switch (config.openTelemetrySamplerType ?? 'always-on') {
|
|
@@ -254,28 +273,13 @@ export async function init(config: OpenTelemetryConfig) {
|
|
|
254
273
|
throw new Error(`Unknown OpenTelemetry sampler type: ${config.openTelemetrySamplerType}`);
|
|
255
274
|
}
|
|
256
275
|
|
|
257
|
-
let spanProcessor: SpanProcessor;
|
|
258
|
-
switch (config.openTelemetrySpanProcessor ?? 'batch') {
|
|
259
|
-
case 'batch': {
|
|
260
|
-
spanProcessor = new FilterBatchSpanProcessor(traceExporter, filter);
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
case 'simple': {
|
|
264
|
-
spanProcessor = new SimpleSpanProcessor(traceExporter);
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
267
|
-
default: {
|
|
268
|
-
throw new Error(`Unknown OpenTelemetry span processor: ${config.openTelemetrySpanProcessor}`);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
276
|
// Much of this functionality is copied from `@opentelemetry/sdk-node`, but
|
|
273
277
|
// we can't use the SDK directly because of the fact that we load our config
|
|
274
278
|
// asynchronously. We need to initialize our instrumentations first; only
|
|
275
279
|
// then can we actually start requiring all of our code that loads our config
|
|
276
280
|
// and ultimately tells us how to configure OpenTelemetry.
|
|
277
281
|
|
|
278
|
-
let resource =
|
|
282
|
+
let resource = detectResourcesSync({
|
|
279
283
|
detectors: [awsEc2Detector, processDetector, envDetector],
|
|
280
284
|
});
|
|
281
285
|
|
|
@@ -299,13 +303,16 @@ export async function init(config: OpenTelemetryConfig) {
|
|
|
299
303
|
|
|
300
304
|
// Set up metrics instrumentation if it's enabled.
|
|
301
305
|
if (metricExporter) {
|
|
302
|
-
const meterProvider = new MeterProvider({
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
306
|
+
const meterProvider = new MeterProvider({
|
|
307
|
+
resource,
|
|
308
|
+
readers: [
|
|
309
|
+
new PeriodicExportingMetricReader({
|
|
310
|
+
exporter: metricExporter,
|
|
311
|
+
exportIntervalMillis: config.openTelemetryMetricExportIntervalMillis ?? 30_000,
|
|
312
|
+
}),
|
|
313
|
+
],
|
|
307
314
|
});
|
|
308
|
-
|
|
315
|
+
metrics.setGlobalMeterProvider(meterProvider);
|
|
309
316
|
}
|
|
310
317
|
}
|
|
311
318
|
|
package/src/tracing.test.ts
CHANGED
|
@@ -7,13 +7,14 @@ import { AsyncHooksContextManager } from '@opentelemetry/context-async-hooks';
|
|
|
7
7
|
describe('instrumented', () => {
|
|
8
8
|
let contextManager: AsyncHooksContextManager;
|
|
9
9
|
const exporter = new tracing.InMemorySpanExporter();
|
|
10
|
+
const spanProcessor = new tracing.SimpleSpanProcessor(exporter);
|
|
10
11
|
|
|
11
12
|
before(async () => {
|
|
12
13
|
await init({
|
|
13
14
|
openTelemetryEnabled: true,
|
|
14
15
|
openTelemetryExporter: exporter,
|
|
15
16
|
openTelemetrySamplerType: 'always-on',
|
|
16
|
-
openTelemetrySpanProcessor:
|
|
17
|
+
openTelemetrySpanProcessor: spanProcessor,
|
|
17
18
|
});
|
|
18
19
|
});
|
|
19
20
|
|
|
@@ -23,6 +24,7 @@ describe('instrumented', () => {
|
|
|
23
24
|
});
|
|
24
25
|
|
|
25
26
|
afterEach(async () => {
|
|
27
|
+
await spanProcessor.forceFlush();
|
|
26
28
|
exporter.reset();
|
|
27
29
|
context.disable();
|
|
28
30
|
});
|
|
@@ -35,6 +37,7 @@ describe('instrumented', () => {
|
|
|
35
37
|
it('records a span on success', async () => {
|
|
36
38
|
await instrumented('test-success', () => 'foo');
|
|
37
39
|
|
|
40
|
+
await spanProcessor.forceFlush();
|
|
38
41
|
const spans = exporter.getFinishedSpans();
|
|
39
42
|
assert.lengthOf(spans, 1);
|
|
40
43
|
assert.equal(spans[0].name, 'test-success');
|
|
@@ -56,6 +59,7 @@ describe('instrumented', () => {
|
|
|
56
59
|
assert.equal(maybeError?.message, 'foo');
|
|
57
60
|
|
|
58
61
|
// Ensure the correct span was recorded.
|
|
62
|
+
await spanProcessor.forceFlush();
|
|
59
63
|
const spans = exporter.getFinishedSpans();
|
|
60
64
|
assert.lengthOf(spans, 1);
|
|
61
65
|
assert.equal(spans[0].name, 'test-failure');
|
package/tsconfig.json
CHANGED