Skip to content

Commit d6cf7a7

Browse files
authored
Merge pull request #18793 from mozilla/FXA-9549
chore(deps): bump @opentelemetry group versions to latest
2 parents be9fc34 + 8c4196e commit d6cf7a7

28 files changed

Lines changed: 1338 additions & 858 deletions

.github/dependabot.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ updates:
2020
one-package-per-pr: # prevent grouping of unrelated PRs
2121
patterns:
2222
- '*'
23+
opentelemetry-packages:
24+
patterns:
25+
- '@opentelemetry/*'
2326
- package-ecosystem: 'github-actions'
2427
directory: '/'
2528
schedule:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ storybooks-publish
4343
tsconfig.tsbuildinfo
4444
tailwind.out.*
4545
.idea
46+
**/*.tmp.*
4647

4748
# Dependencies
4849
**/node_modules

_scripts/configs/otel-collector-config.yaml

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,29 @@ receivers:
22
otlp:
33
protocols:
44
http:
5+
endpoint: 0.0.0.0:4318
6+
cors:
7+
allowed_origins: ["*"]
8+
allowed_headers: ["*"]
9+
grpc:
10+
endpoint: 0.0.0.0:4317
511

612
exporters:
7-
logging:
8-
loglevel: debug
9-
jaeger:
10-
endpoint: "jaeger.fxa:14250"
13+
# if you have the vscode plugin, this will yell about the version, but
14+
# as of v0.86.0, logging is deprecated in favor of debug
15+
# see: https://opentelemetry.io/docs/collector/configuration/#exporters
16+
debug:
17+
verbosity: normal
18+
otlp/jaeger:
19+
endpoint: "jaeger.fxa:4317"
1120
tls:
1221
insecure: true
1322
googlecloud:
1423
project: '${TRACING_GCP_PROJECT}'
15-
retry_on_failure:
16-
enabled: false
1724
log:
1825
default_log_name: opentelemetry.io/collector-exported-log
1926

27+
2028
processors:
2129
batch:
2230
memory_limiter:
@@ -31,6 +39,10 @@ service:
3139
traces:
3240
receivers: [otlp]
3341
processors: [memory_limiter, batch]
34-
# Set env EXPORTERS to toggle exporters. ie to turn all exporters set as:
35-
# EXPORTERS=logging,jaeger,googlecloud
36-
exporters: '${EXPORTERS}'
42+
# We can't put an array into env vars to dynamically set exports from
43+
# the shell command, and because this is expected to be an array
44+
# this template gets `sed`ed and we replace the placeholder with
45+
# the actual value, then pipe it into the collector container
46+
#
47+
# See `_scripts/otel-collector.sh` for more.
48+
exporters: [__EXPORTERS__]

_scripts/otel-collector.sh

100644100755
Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11
#!/bin/bash -ex
22

3-
4-
if [ "$TRACING_OTEL_COLLECTOR_ENABLED" == "true" ]
5-
then
3+
if [ "$TRACING_OTEL_COLLECTOR_ENABLED" == "true" ]; then
64

75
# Outputs traces to console/stdout
8-
EXPORTERS="logging"
6+
EXPORTERS=("debug")
97

10-
if [ "$TRACING_OTEL_COLLECTOR_GCP_ENABLED" == "true" ]
11-
then
12-
EXPORTERS="$EXPORTERS,googlecloud"
8+
if [ "$TRACING_OTEL_COLLECTOR_GCP_ENABLED" == "true" ]; then
9+
EXPORTERS+=("googlecloud")
1310
fi
1411

15-
if [ "$TRACING_OTEL_COLLECTOR_JAEGER_ENABLED" == "true" ]
16-
then
17-
EXPORTERS="$EXPORTERS,jaeger"
12+
if [ "$TRACING_OTEL_COLLECTOR_JAEGER_ENABLED" == "true" ]; then
13+
EXPORTERS+=("otlp/jaeger")
14+
echo "Jaeger exporter enabled"
1815
fi
1916

20-
echo -e "Starting otel collector to capture client traces.\n exporters=$EXPORTERS\n gcp-proj-id=$TRACING_GCP_PROJECT"
17+
# convert the array to a comma-separated string
18+
EXPORTERS_STRING=$(IFS=,; echo "${EXPORTERS[*]}")
19+
20+
echo "Replace __EXPORTERS__ in the template config file with $EXPORTERS_STRING"
21+
sed "s|__EXPORTERS__|$EXPORTERS_STRING|" $(pwd)/_scripts/configs/otel-collector-config.yaml > $(pwd)/_scripts/configs/otel-collector-config.tmp.yaml
2122

23+
# Pass the EXPORTERS environment variable to the docker container
2224
docker run --rm --name otel-collector \
2325
--net fxa \
24-
-v $(pwd)/_scripts/configs/otel-collector-config.yaml:/etc/otel/config.yaml \
26+
-v $(pwd)/_scripts/configs/otel-collector-config.tmp.yaml:/etc/otel/config.yaml \
2527
-v $HOME/.config/gcloud/application_default_credentials.json:/etc/otel/key.json \
2628
-e GOOGLE_APPLICATION_CREDENTIALS=/etc/otel/key.json \
27-
-e EXPORTERS=$EXPORTERS \
2829
-e TRACING_GCP_PROJECT=$TRACING_GCP_PROJECT \
2930
-p 4317:4317 \
3031
-p 4318:4318 \
3132
-p 55681:55681 \
32-
otel/opentelemetry-collector-contrib:0.61.0 --config=/etc/otel/config.yaml
33+
otel/opentelemetry-collector-contrib:0.123.0 --config=/etc/otel/config.yaml
3334
else
34-
echo -e "The open telemtry collector did not start, because it is not enabled. Set env TRACING_OTEL_COLLECTOR_ENABLED=true to enable. Running an open telemetry collector is optional! \n"
35+
echo -e "The open telemetry collector did not start, because it is not enabled. Set env TRACING_OTEL_COLLECTOR_ENABLED=true to enable. Running an open telemetry collector is optional! \n"
3536
fi

libs/shared/otel/project.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,20 @@
1818
"platform": "node"
1919
}
2020
},
21-
"test": {
21+
"test-unit": {
2222
"executor": "@nx/jest:jest",
2323
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
2424
"options": {
25-
"jestConfig": "libs/shared/otel/jest.config.ts"
25+
"jestConfig": "libs/shared/otel/jest.config.ts",
26+
"testPathPattern": ["^(?!.*\\.in\\.spec\\.ts$).*$"]
27+
}
28+
},
29+
"test-integration": {
30+
"executor": "@nx/jest:jest",
31+
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
32+
"options": {
33+
"jestConfig": "libs/shared/otel/jest.config.ts",
34+
"testPathPattern": ["\\.in\\.spec\\.ts$"]
2635
}
2736
}
2837
}

libs/shared/otel/src/lib/exporters/exporters.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

libs/shared/otel/src/lib/exporters/fxa-console.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44

55
import { ExportResult } from '@opentelemetry/core';
66
import {
7-
BasicTracerProvider,
87
ConsoleSpanExporter,
98
ReadableSpan,
109
} from '@opentelemetry/sdk-trace-node';
1110
import { logType, TracingOpts } from '../config';
1211
import { TracingPiiFilter } from '../pii-filters';
13-
import { addExporter } from './exporters';
1412
import { checkDuration } from './util';
1513
import { ILogger } from '@fxa/shared/log';
1614

@@ -32,9 +30,8 @@ export class FxaConsoleSpanExporter extends ConsoleSpanExporter {
3230
}
3331
}
3432

35-
export function addConsoleExporter(
33+
export function getConsoleTraceExporter(
3634
opts: TracingOpts,
37-
provider: BasicTracerProvider,
3835
filter?: TracingPiiFilter,
3936
logger?: ILogger
4037
) {
@@ -43,6 +40,5 @@ export function addConsoleExporter(
4340
}
4441
logger?.debug(logType, 'Adding Console Exporter');
4542
const exporter = new FxaConsoleSpanExporter(filter);
46-
addExporter(opts, provider, exporter);
4743
return exporter;
4844
}

libs/shared/otel/src/lib/exporters/fxa-gcp.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,9 @@ import {
77
TraceExporterOptions as GcpTraceExporterOptions,
88
} from '@google-cloud/opentelemetry-cloud-trace-exporter';
99
import { ExportResult } from '@opentelemetry/core';
10-
import {
11-
BasicTracerProvider,
12-
ReadableSpan,
13-
} from '@opentelemetry/sdk-trace-node';
10+
import { ReadableSpan } from '@opentelemetry/sdk-trace-node';
1411
import { TracingOpts, logType } from '../config';
1512
import { TracingPiiFilter } from '../pii-filters';
16-
import { addExporter } from './exporters';
1713
import { checkDuration } from './util';
1814
import { ILogger } from '@fxa/shared/log';
1915

@@ -39,9 +35,8 @@ export class FxaGcpTraceExporter extends GcpTraceExporter {
3935
}
4036
}
4137

42-
export function addGcpTraceExporter(
38+
export function getGcpTraceExporter(
4339
opts: TracingOpts,
44-
provider: BasicTracerProvider,
4540
filter?: TracingPiiFilter,
4641
logger?: ILogger
4742
) {
@@ -51,6 +46,5 @@ export function addGcpTraceExporter(
5146

5247
logger?.debug(logType, { msg: 'Adding Gcp Trace Exporter' });
5348
const exporter = new FxaGcpTraceExporter(filter);
54-
addExporter(opts, provider, exporter);
5549
return exporter;
5650
}

libs/shared/otel/src/lib/exporters/fxa-otlp.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55
import { ExportResult } from '@opentelemetry/core';
66
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
77
import { OTLPExporterConfigBase } from '@opentelemetry/otlp-exporter-base';
8-
import {
9-
BasicTracerProvider,
10-
ReadableSpan,
11-
} from '@opentelemetry/sdk-trace-node';
8+
import { ReadableSpan } from '@opentelemetry/sdk-trace-node';
129
import { TracingOpts, logType } from '../config';
1310
import { TracingPiiFilter } from '../pii-filters';
14-
import { addExporter } from './exporters';
1511
import { checkDuration } from './util';
1612
import { ILogger } from '@fxa/shared/log';
1713

@@ -22,7 +18,7 @@ export type FxaOtlpTracingHeaders = {
2218
};
2319

2420
/** OTLP exporter customized for FxA */
25-
export class FxaOtlpWebExporter extends OTLPTraceExporter {
21+
export class FxaOtlpTraceExporter extends OTLPTraceExporter {
2622
constructor(
2723
protected readonly filter?: TracingPiiFilter,
2824
config?: OTLPExporterConfigBase,
@@ -48,9 +44,8 @@ export class FxaOtlpWebExporter extends OTLPTraceExporter {
4844
}
4945
}
5046

51-
export function addOtlpTraceExporter(
47+
export function getOtlpTraceExporter(
5248
opts: TracingOpts,
53-
provider: BasicTracerProvider,
5449
headers?: FxaOtlpTracingHeaders,
5550
filter?: TracingPiiFilter,
5651
logger?: ILogger
@@ -68,7 +63,6 @@ export function addOtlpTraceExporter(
6863
headers,
6964
concurrencyLimit: opts.otel?.concurrencyLimit,
7065
};
71-
const exporter = new FxaOtlpWebExporter(filter, config, logger);
72-
addExporter(opts, provider, exporter);
66+
const exporter = new FxaOtlpTraceExporter(filter, config, logger);
7367
return exporter;
7468
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
import { initTracing, reset, getCurrent } from './node-tracing';
6+
import { TRACER_NAME } from './node-tracing';
7+
import { TracingOpts } from './config';
8+
import http from 'http';
9+
10+
describe('#integration - OTLP exporter integration test', () => {
11+
let receivedSpans: any[] = [];
12+
13+
let server: http.Server;
14+
let port: number;
15+
16+
beforeAll((done) => {
17+
server = http.createServer((req, res) => {
18+
let body = '';
19+
req.on('data', (chunk) => (body += chunk));
20+
req.on('end', () => {
21+
try {
22+
// parse incoming payload and add it to receivedSpans
23+
// mock server just accepts any payload
24+
const parsed = JSON.parse(body);
25+
receivedSpans.push(parsed);
26+
res.writeHead(200);
27+
res.end();
28+
} catch (err) {
29+
res.writeHead(500);
30+
res.end();
31+
}
32+
});
33+
});
34+
35+
server.listen(0, () => {
36+
port = (server.address() as any).port;
37+
done();
38+
});
39+
});
40+
41+
afterAll(() => {
42+
server.close();
43+
});
44+
45+
beforeEach(() => {
46+
receivedSpans = [];
47+
reset(); // reset global state
48+
});
49+
50+
it('sends a span to the OTLP collector', async () => {
51+
const logger = console; // or mock logger
52+
const opts: TracingOpts = {
53+
otel: {
54+
enabled: true,
55+
url: `http://0.0.0.0:${port}/v1/traces`,
56+
concurrencyLimit: 1,
57+
},
58+
gcp: { enabled: false },
59+
console: { enabled: false },
60+
batchProcessor: false, // use SimpleSpanProcessor to flush immediately
61+
clientName: 'test',
62+
corsUrls: '',
63+
filterPii: false,
64+
sampleRate: 1,
65+
serviceName: 'test-service',
66+
};
67+
68+
initTracing(opts, logger);
69+
const tracer = getCurrent()?.getProvider().getTracer(TRACER_NAME);
70+
71+
tracer?.startActiveSpan('test-span', (span) => {
72+
span.setAttribute('test-attribute', 'test-value');
73+
span.addEvent('test-event', { key: 'value' });
74+
span.end();
75+
});
76+
77+
// Poll for receivedSpans to have a length > 0, up to 1 second
78+
const start = Date.now();
79+
while (receivedSpans.length === 0 && Date.now() - start < 1000) {
80+
await new Promise((r) => setTimeout(r, 50));
81+
}
82+
83+
expect(receivedSpans.length).toBeGreaterThan(0);
84+
const request = receivedSpans[0];
85+
86+
expect(JSON.stringify(request)).toContain('test-span');
87+
expect(JSON.stringify(request)).toContain('test-service');
88+
});
89+
});

0 commit comments

Comments
 (0)