Skip to content

Commit 7934036

Browse files
committed
test: added more tests
1 parent eeeb5d2 commit 7934036

File tree

5 files changed

+331
-0
lines changed

5 files changed

+331
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* (c) Copyright IBM Corp. 2025
3+
*/
4+
5+
'use strict';
6+
7+
// NOTE: c8 bug https://github.com/bcoe/c8/issues/166
8+
process.on('SIGTERM', () => {
9+
process.disconnect();
10+
process.exit(0);
11+
});
12+
13+
require('../../../../src')();
14+
15+
const express = require('express');
16+
const fs = require('fs');
17+
const path = require('path');
18+
const port = require('../../../test_util/app-port')();
19+
const app = express();
20+
const logPrefix = `FS Express App (${process.pid}):\t`;
21+
22+
app.get('/', (req, res) => {
23+
res.sendStatus(200);
24+
});
25+
26+
app.get('/fs-read', (req, res) => {
27+
try {
28+
const content = fs.readFileSync(path.join(__dirname, '../test.js'), 'utf8');
29+
log(`Read file with size: ${content.length}`);
30+
31+
const stats = fs.statSync(path.join(__dirname, '../test.js'));
32+
log(`File stats: ${JSON.stringify(stats.size)}`);
33+
34+
res.send({ success: true, size: content.length });
35+
} catch (err) {
36+
res.status(500).send({ error: err.message });
37+
}
38+
});
39+
40+
app.listen(port, () => {
41+
log(`Listening on port: ${port}`);
42+
});
43+
44+
function log() {
45+
const args = Array.prototype.slice.call(arguments);
46+
args[0] = logPrefix + args[0];
47+
// eslint-disable-next-line no-console
48+
console.log.apply(console, args);
49+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"name": "opentelemetry-api-version-conflict-test",
3+
"version": "1.0.0",
4+
"description": "Test with different OpenTelemetry API version than our collector package",
5+
"main": "app.js",
6+
"private": true,
7+
"dependencies": {
8+
"@opentelemetry/api": "1.0.0"
9+
}
10+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* (c) Copyright IBM Corp. 2025
3+
*/
4+
5+
'use strict';
6+
7+
// NOTE: c8 bug https://github.com/bcoe/c8/issues/166
8+
process.on('SIGTERM', () => {
9+
process.disconnect();
10+
process.exit(0);
11+
});
12+
13+
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
14+
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
15+
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
16+
const { FsInstrumentation } = require('@opentelemetry/instrumentation-fs');
17+
const { Resource } = require('@opentelemetry/resources');
18+
const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions');
19+
const api = require('@opentelemetry/api');
20+
21+
const provider = new NodeTracerProvider({
22+
resource: new Resource({
23+
[ATTR_SERVICE_NAME]: 'otel-sdk-test-service'
24+
})
25+
});
26+
27+
provider.register();
28+
29+
registerInstrumentations({
30+
instrumentations: [new HttpInstrumentation(), new FsInstrumentation()]
31+
});
32+
33+
const tracer = api.trace.getTracer('otel-sdk-app-tracer');
34+
35+
require('../../../../src')();
36+
37+
const express = require('express');
38+
const fs = require('fs');
39+
const path = require('path');
40+
const port = require('../../../test_util/app-port')();
41+
const app = express();
42+
const logPrefix = `OTel SDK App (${process.pid}):\t`;
43+
44+
app.get('/', (req, res) => {
45+
res.sendStatus(200);
46+
});
47+
48+
app.get('/otel-sdk-fs', (req, res) => {
49+
const span = tracer.startSpan('explicit-otel-operation');
50+
51+
try {
52+
// Use fs operation which should be traced by both OpenTelemetry SDK and Instana
53+
const content = fs.readFileSync(path.join(__dirname, '../test.js'), 'utf8');
54+
log(`Read file with size: ${content.length}`);
55+
56+
const stats = fs.statSync(path.join(__dirname, '../test.js'));
57+
log(`File stats: ${JSON.stringify(stats.size)}`);
58+
span.end();
59+
res.send({ success: true, size: content.length });
60+
} catch (err) {
61+
span.recordException(err);
62+
span.end();
63+
res.status(500).send({ error: err.message });
64+
}
65+
});
66+
67+
app.listen(port, () => {
68+
log(`Listening on port: ${port}`);
69+
});
70+
71+
function log() {
72+
const args = Array.prototype.slice.call(arguments);
73+
args[0] = logPrefix + args[0];
74+
// eslint-disable-next-line no-console
75+
console.log.apply(console, args);
76+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"name": "instana-opentelemetry-sdk-active-test",
3+
"version": "1.0.0",
4+
"description": "Test for Instana collector with active OpenTelemetry SDK",
5+
"main": "otel-sdk-app.js",
6+
"private": true,
7+
"dependencies": {
8+
"@opentelemetry/api": "1.4.1",
9+
"@opentelemetry/instrumentation": "^0.41.2",
10+
"@opentelemetry/instrumentation-fs": "^0.7.2",
11+
"@opentelemetry/instrumentation-http": "^0.41.2",
12+
"@opentelemetry/resources": "^1.15.2",
13+
"@opentelemetry/sdk-trace-node": "^1.15.2",
14+
"@opentelemetry/semantic-conventions": "^1.15.2",
15+
"express": "^4.17.1"
16+
}
17+
}

packages/collector/test/tracing/opentelemetry/test.js

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
const expect = require('chai').expect;
88
const path = require('path');
99
const semver = require('semver');
10+
const { execSync } = require('child_process');
1011
const supportedVersion = require('@instana/core').tracing.supportedVersion;
1112
const constants = require('@instana/core').tracing.constants;
1213
const config = require('../../../../core/test/config');
@@ -774,6 +775,184 @@ mochaSuiteFn('opentelemetry/instrumentations', function () {
774775
));
775776
});
776777
});
778+
779+
describe('with different otel-api version installed on app', function () {
780+
globalAgent.setUpCleanUpHooks();
781+
const agentControls = globalAgent.instance;
782+
783+
let controls;
784+
785+
before(async () => {
786+
// Install dependencies directly in the test directory
787+
execSync('npm install --no-save --no-package-lock', {
788+
cwd: path.join(__dirname, './diff-otel-api-version'),
789+
stdio: 'inherit'
790+
});
791+
controls = new ProcessControls({
792+
appPath: path.join(__dirname, './diff-otel-api-version/app.js'),
793+
useGlobalAgent: true
794+
});
795+
796+
await controls.startAndWaitForAgentConnection();
797+
});
798+
799+
beforeEach(async () => {
800+
await agentControls.clearReceivedTraceData();
801+
});
802+
803+
after(async () => {
804+
await controls.stop();
805+
});
806+
807+
afterEach(async () => {
808+
await controls.clearIpcMessages();
809+
});
810+
811+
it('should trace', () =>
812+
controls
813+
.sendRequest({
814+
method: 'GET',
815+
path: '/fs-read'
816+
})
817+
.then(() =>
818+
retry(() =>
819+
agentControls.getSpans().then(spans => {
820+
expect(spans.length).to.equal(3);
821+
822+
const httpEntry = verifyHttpRootEntry({
823+
spans,
824+
apiPath: '/fs-read',
825+
pid: String(controls.getPid())
826+
});
827+
828+
verifyExitSpan({
829+
spanName: 'otel',
830+
spans,
831+
parent: httpEntry,
832+
withError: false,
833+
pid: String(controls.getPid()),
834+
dataProperty: 'tags',
835+
extraTests: span => {
836+
expect(span.data.tags.name).to.eql('fs readFileSync');
837+
checkTelemetryResourceAttrs(span);
838+
}
839+
});
840+
841+
verifyExitSpan({
842+
spanName: 'otel',
843+
spans,
844+
parent: httpEntry,
845+
withError: false,
846+
pid: String(controls.getPid()),
847+
dataProperty: 'tags',
848+
extraTests: span => {
849+
expect(span.data.tags.name).to.eql('fs statSync');
850+
checkTelemetryResourceAttrs(span);
851+
}
852+
});
853+
})
854+
)
855+
));
856+
857+
it('[suppressed] should not trace', () =>
858+
controls
859+
.sendRequest({
860+
method: 'GET',
861+
path: '/fs-read',
862+
suppressTracing: true
863+
})
864+
.then(() => delay(DELAY_TIMEOUT_IN_MS))
865+
.then(() => retry(() => agentControls.getSpans().then(spans => expect(spans).to.be.empty))));
866+
});
867+
868+
describe('when otel sdk is active', function () {
869+
globalAgent.setUpCleanUpHooks();
870+
const agentControls = globalAgent.instance;
871+
872+
let controls;
873+
874+
before(async () => {
875+
// Install dependencies directly in the test directory
876+
execSync('npm install --no-save --no-package-lock', {
877+
cwd: path.join(__dirname, './otel-sdk-active'),
878+
stdio: 'inherit'
879+
});
880+
controls = new ProcessControls({
881+
appPath: path.join(__dirname, './otel-sdk-active/app'),
882+
useGlobalAgent: true
883+
});
884+
885+
await controls.startAndWaitForAgentConnection();
886+
});
887+
888+
beforeEach(async () => {
889+
await agentControls.clearReceivedTraceData();
890+
});
891+
892+
after(async () => {
893+
await controls.stop();
894+
});
895+
896+
afterEach(async () => {
897+
await controls.clearIpcMessages();
898+
});
899+
900+
it('should trace', () =>
901+
controls
902+
.sendRequest({
903+
method: 'GET',
904+
path: '/otel-sdk-fs'
905+
})
906+
.then(() =>
907+
retry(() =>
908+
agentControls.getSpans().then(spans => {
909+
expect(spans.length).to.equal(3);
910+
911+
const httpEntry = verifyHttpRootEntry({
912+
spans,
913+
apiPath: '/otel-sdk-fs',
914+
pid: String(controls.getPid())
915+
});
916+
917+
verifyExitSpan({
918+
spanName: 'otel',
919+
spans,
920+
parent: httpEntry,
921+
withError: false,
922+
pid: String(controls.getPid()),
923+
dataProperty: 'tags',
924+
extraTests: span => {
925+
expect(span.data.tags.name).to.eql('fs readFileSync');
926+
checkTelemetryResourceAttrs(span);
927+
}
928+
});
929+
930+
verifyExitSpan({
931+
spanName: 'otel',
932+
spans,
933+
parent: httpEntry,
934+
withError: false,
935+
pid: String(controls.getPid()),
936+
dataProperty: 'tags',
937+
extraTests: span => {
938+
expect(span.data.tags.name).to.eql('fs statSync');
939+
checkTelemetryResourceAttrs(span);
940+
}
941+
});
942+
})
943+
)
944+
));
945+
946+
it('[suppressed] should not trace', () =>
947+
controls
948+
.sendRequest({
949+
method: 'GET',
950+
path: '/otel-sdk-fs',
951+
suppressTracing: true
952+
})
953+
.then(() => delay(DELAY_TIMEOUT_IN_MS))
954+
.then(() => retry(() => agentControls.getSpans().then(spans => expect(spans).to.be.empty))));
955+
});
777956
});
778957

779958
function checkTelemetryResourceAttrs(span) {

0 commit comments

Comments
 (0)