@prairielearn/opentelemetry 1.10.5 → 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 +12 -0
- package/dist/init.d.ts +2 -2
- package/dist/init.js +31 -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 +28 -29
- package/src/init.ts +40 -33
- package/src/tracing.test.ts +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @prairielearn/opentelemetry
|
|
2
2
|
|
|
3
|
+
## 1.10.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 3395c25: Upgrade all JavaScript dependencies
|
|
8
|
+
|
|
9
|
+
## 1.10.6
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- dce0fa3: Upgrade all JavaScript dependencies
|
|
14
|
+
|
|
3
15
|
## 1.10.5
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
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");
|
|
@@ -29,6 +28,7 @@ const resource_detector_aws_1 = require("@opentelemetry/resource-detector-aws");
|
|
|
29
28
|
* that we can filter spans _after_ they've been emitted.
|
|
30
29
|
*/
|
|
31
30
|
class FilterBatchSpanProcessor extends sdk_trace_base_1.BatchSpanProcessor {
|
|
31
|
+
filter;
|
|
32
32
|
constructor(exporter, filter) {
|
|
33
33
|
super(exporter);
|
|
34
34
|
this.filter = filter;
|
|
@@ -121,13 +121,8 @@ function getTraceExporter(config) {
|
|
|
121
121
|
});
|
|
122
122
|
break;
|
|
123
123
|
case 'jaeger':
|
|
124
|
-
return new
|
|
125
|
-
|
|
126
|
-
// with packet sizes when Jaeger is running in Docker. We'll instead
|
|
127
|
-
// configure it to use the HTTP sender, which shouldn't face those
|
|
128
|
-
// same issues. We'll still allow the endpoint to be overridden via
|
|
129
|
-
// environment variable if needed.
|
|
130
|
-
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/',
|
|
131
126
|
});
|
|
132
127
|
default:
|
|
133
128
|
throw new Error(`Unknown OpenTelemetry exporter: ${config.openTelemetryExporter}`);
|
|
@@ -158,6 +153,23 @@ function getMetricExporter(config) {
|
|
|
158
153
|
throw new Error(`Unknown OpenTelemetry metric exporter: ${config.openTelemetryMetricExporter}`);
|
|
159
154
|
}
|
|
160
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
|
+
}
|
|
161
173
|
/**
|
|
162
174
|
* Should be called once we've loaded our config; this will allow us to set up
|
|
163
175
|
* the correct metadata for the Honeycomb exporter. We don't actually have that
|
|
@@ -174,8 +186,8 @@ async function init(config) {
|
|
|
174
186
|
// https://github.com/open-telemetry/opentelemetry-js-contrib/pull/972
|
|
175
187
|
return;
|
|
176
188
|
}
|
|
177
|
-
const traceExporter = getTraceExporter(config);
|
|
178
189
|
const metricExporter = getMetricExporter(config);
|
|
190
|
+
const spanProcessor = getSpanProcessor(config);
|
|
179
191
|
let sampler;
|
|
180
192
|
switch (config.openTelemetrySamplerType ?? 'always-on') {
|
|
181
193
|
case 'always-on': {
|
|
@@ -195,26 +207,12 @@ async function init(config) {
|
|
|
195
207
|
default:
|
|
196
208
|
throw new Error(`Unknown OpenTelemetry sampler type: ${config.openTelemetrySamplerType}`);
|
|
197
209
|
}
|
|
198
|
-
let spanProcessor;
|
|
199
|
-
switch (config.openTelemetrySpanProcessor ?? 'batch') {
|
|
200
|
-
case 'batch': {
|
|
201
|
-
spanProcessor = new FilterBatchSpanProcessor(traceExporter, filter);
|
|
202
|
-
break;
|
|
203
|
-
}
|
|
204
|
-
case 'simple': {
|
|
205
|
-
spanProcessor = new sdk_trace_base_1.SimpleSpanProcessor(traceExporter);
|
|
206
|
-
break;
|
|
207
|
-
}
|
|
208
|
-
default: {
|
|
209
|
-
throw new Error(`Unknown OpenTelemetry span processor: ${config.openTelemetrySpanProcessor}`);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
210
|
// Much of this functionality is copied from `@opentelemetry/sdk-node`, but
|
|
213
211
|
// we can't use the SDK directly because of the fact that we load our config
|
|
214
212
|
// asynchronously. We need to initialize our instrumentations first; only
|
|
215
213
|
// then can we actually start requiring all of our code that loads our config
|
|
216
214
|
// and ultimately tells us how to configure OpenTelemetry.
|
|
217
|
-
let resource =
|
|
215
|
+
let resource = (0, resources_1.detectResourcesSync)({
|
|
218
216
|
detectors: [resource_detector_aws_1.awsEc2Detector, resources_1.processDetector, resources_1.envDetector],
|
|
219
217
|
});
|
|
220
218
|
if (config.serviceName) {
|
|
@@ -232,13 +230,16 @@ async function init(config) {
|
|
|
232
230
|
tracerProvider = nodeTracerProvider;
|
|
233
231
|
// Set up metrics instrumentation if it's enabled.
|
|
234
232
|
if (metricExporter) {
|
|
235
|
-
const meterProvider = new sdk_metrics_1.MeterProvider({
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
+
],
|
|
240
241
|
});
|
|
241
|
-
|
|
242
|
+
api_1.metrics.setGlobalMeterProvider(meterProvider);
|
|
242
243
|
}
|
|
243
244
|
}
|
|
244
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":"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"}
|
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",
|
|
@@ -10,41 +10,40 @@
|
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"dev": "tsc --watch --preserveWatchOutput",
|
|
13
|
-
"test": "mocha --no-config --require
|
|
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-
|
|
24
|
-
"@opentelemetry/instrumentation-
|
|
25
|
-
"@opentelemetry/instrumentation-
|
|
26
|
-
"@opentelemetry/instrumentation-
|
|
27
|
-
"@opentelemetry/instrumentation-
|
|
28
|
-
"@opentelemetry/instrumentation-
|
|
29
|
-
"@opentelemetry/
|
|
30
|
-
"@opentelemetry/
|
|
31
|
-
"@opentelemetry/
|
|
32
|
-
"@opentelemetry/sdk-
|
|
33
|
-
"@opentelemetry/sdk-
|
|
34
|
-
"@opentelemetry/sdk-trace-
|
|
35
|
-
"@opentelemetry/
|
|
36
|
-
"@opentelemetry/semantic-conventions": "^1.19.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",
|
|
23
|
+
"@opentelemetry/instrumentation-connect": "^0.33.0",
|
|
24
|
+
"@opentelemetry/instrumentation-dns": "^0.33.0",
|
|
25
|
+
"@opentelemetry/instrumentation-express": "^0.35.0",
|
|
26
|
+
"@opentelemetry/instrumentation-http": "^0.49.1",
|
|
27
|
+
"@opentelemetry/instrumentation-pg": "^0.38.0",
|
|
28
|
+
"@opentelemetry/instrumentation-redis": "^0.36.0",
|
|
29
|
+
"@opentelemetry/resource-detector-aws": "^1.3.6",
|
|
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": "^
|
|
44
|
-
"chai": "^4.
|
|
42
|
+
"@types/node": "^20.11.24",
|
|
43
|
+
"chai": "^4.4.1",
|
|
45
44
|
"chai-as-promised": "^7.1.1",
|
|
46
|
-
"mocha": "^10.
|
|
47
|
-
"
|
|
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');
|