Skip to content

Commit 29fb286

Browse files
committed
update to latest db semconv
1 parent bfe00e2 commit 29fb286

File tree

10 files changed

+151
-132
lines changed

10 files changed

+151
-132
lines changed

plugins/node/instrumentation-typeorm/NOTICE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ The library contains the following changes compared to the original:
77
* Removed usage of SemanticAttributes in favor of explicit values.
88
* Removed parsing of db operation from raw queries.
99
* Changed db.database.parameters to db.typeorm.parameters.
10+
* Updated to OpenTelemetry semantic conventions 1.32.0.

plugins/node/instrumentation-typeorm/README.md

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,15 @@ You can set the following:
5353

5454
Attributes collected:
5555

56-
| Attribute | Short Description |
57-
| ----------------| --------------------------------------------------------------------------- |
58-
| `db.name` | The name of the database being accessed. |
59-
| `db.operation` | The name of the operation being executed (e.g. the SQL keyword). |
60-
| `db.sql.table` | The name of the table being accessed. |
61-
| `db.statement` | The database statement being executed. |
62-
| `db.system` | An identifier for the database management system (DBMS) product being used. |
63-
| `db.user` | Username for accessing the database. |
64-
| `net.peer.name` | Remote address of the database. |
65-
| `net.peer.port` | Peer port number of the network connection. |
56+
| Attribute | Short Description |
57+
| ---------------------| --------------------------------------------------------------------------- |
58+
| `db.namespace` | The name of the database being accessed. |
59+
| `db.operation.name` | The name of the operation being executed (e.g. the SQL keyword). |
60+
| `db.collection.name` | The name of the table being accessed. |
61+
| `db.query.text` | The database statement being executed. |
62+
| `db.system.name` | An identifier for the database management system (DBMS) product being used. |
63+
| `server.address` | Remote address of the database. |
64+
| `server.port` | Peer port number of the network connection. |
6665

6766
## Useful links
6867

plugins/node/instrumentation-typeorm/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@
5757
},
5858
"dependencies": {
5959
"@opentelemetry/instrumentation": "^0.200.0",
60-
"@opentelemetry/core": "^2.0.0"
60+
"@opentelemetry/core": "^2.0.0",
61+
"@opentelemetry/semantic-conventions": "^1.30.0"
6162
},
6263
"homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node/instrumentation-typeorm#readme"
6364
}

plugins/node/instrumentation-typeorm/src/semconv.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@
1414
* limitations under the License.
1515
*/
1616

17-
export const ATTR_DB_NAME = 'db.name' as const;
18-
export const ATTR_DB_OPERATION = 'db.operation' as const;
19-
export const ATTR_DB_SQL_TABLE = 'db.sql.table' as const;
20-
export const ATTR_DB_STATEMENT = 'db.statement' as const;
21-
export const ATTR_DB_SYSTEM = 'db.system' as const;
22-
export const ATTR_DB_USER = 'db.user' as const;
23-
export const ATTR_NET_PEER_NAME = 'net.peer.name' as const;
24-
export const ATTR_NET_PEER_PORT = 'net.peer.port' as const;
17+
export const ATTR_DB_NAMESPACE = 'db.namespace' as const;
18+
export const ATTR_DB_COLLECTION_NAME = 'db.collection.name' as const;
19+
export const ATTR_DB_OPERATION_NAME = 'db.operation.name' as const;
20+
export const ATTR_DB_QUERY_TEXT = 'db.query.text' as const;
21+
export const ATTR_DB_SYSTEM_NAME = 'db.system.name' as const;
22+
export const ATTR_SERVER_ADDRESS = 'server.address' as const;
23+
export const ATTR_SERVER_PORT = 'server.port' as const;

plugins/node/instrumentation-typeorm/src/typeorm.ts

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,13 @@ import {
2222
} from '@opentelemetry/api';
2323
import { suppressTracing } from '@opentelemetry/core';
2424
import {
25-
ATTR_DB_NAME,
26-
ATTR_DB_OPERATION,
27-
ATTR_DB_SQL_TABLE,
28-
ATTR_DB_STATEMENT,
29-
ATTR_DB_SYSTEM,
30-
ATTR_DB_USER,
31-
ATTR_NET_PEER_NAME,
32-
ATTR_NET_PEER_PORT,
25+
ATTR_DB_COLLECTION_NAME,
26+
ATTR_DB_NAMESPACE,
27+
ATTR_DB_OPERATION_NAME,
28+
ATTR_DB_QUERY_TEXT,
29+
ATTR_DB_SYSTEM_NAME,
30+
ATTR_SERVER_ADDRESS,
31+
ATTR_SERVER_PORT,
3332
} from './semconv';
3433
import {
3534
ExtendedDatabaseAttribute,
@@ -195,26 +194,25 @@ export class TypeormInstrumentation extends InstrumentationBase<TypeormInstrumen
195194
}
196195
const connectionOptions = this?.connection?.options ?? {};
197196
const attributes: Record<string, any> = {
198-
[ATTR_DB_SYSTEM]: connectionOptions.type,
199-
[ATTR_DB_USER]: connectionOptions.username,
200-
[ATTR_NET_PEER_NAME]: connectionOptions.host,
201-
[ATTR_NET_PEER_PORT]: connectionOptions.port,
202-
[ATTR_DB_NAME]: connectionOptions.database,
203-
[ATTR_DB_OPERATION]: opName,
204-
[ATTR_DB_STATEMENT]: JSON.stringify(buildStatement(original, args)),
197+
[ATTR_DB_SYSTEM_NAME]: connectionOptions.type,
198+
[ATTR_SERVER_ADDRESS]: connectionOptions.host,
199+
[ATTR_SERVER_PORT]: connectionOptions.port,
200+
[ATTR_DB_NAMESPACE]: connectionOptions.database,
201+
[ATTR_DB_OPERATION_NAME]: opName,
202+
[ATTR_DB_QUERY_TEXT]: JSON.stringify(buildStatement(original, args)),
205203
};
206204

207205
//ignore EntityMetadataNotFoundError
208206
try {
209207
if (this.metadata) {
210-
attributes[ATTR_DB_SQL_TABLE] = this.metadata.tableName;
208+
attributes[ATTR_DB_COLLECTION_NAME] = this.metadata.tableName;
211209
} else {
212210
const entity = args[0];
213211
const name =
214212
typeof entity === 'object' ? entity?.constructor?.name : entity;
215213
const metadata = this.connection.getMetadata(name);
216214
if (metadata?.tableName) {
217-
attributes[ATTR_DB_SQL_TABLE] = metadata.tableName;
215+
attributes[ATTR_DB_COLLECTION_NAME] = metadata.tableName;
218216
}
219217
}
220218
} catch {
@@ -266,14 +264,13 @@ export class TypeormInstrumentation extends InstrumentationBase<TypeormInstrumen
266264
// eslint-disable-next-line @typescript-eslint/no-explicit-any
267265
const connectionOptions: any = this.connection?.options;
268266
const attributes: Record<string, any> = {
269-
[ATTR_DB_SYSTEM]: connectionOptions.type,
270-
[ATTR_DB_USER]: connectionOptions.username,
271-
[ATTR_NET_PEER_NAME]: connectionOptions.host,
272-
[ATTR_NET_PEER_PORT]: connectionOptions.port,
273-
[ATTR_DB_NAME]: connectionOptions.database,
274-
[ATTR_DB_OPERATION]: operation,
275-
[ATTR_DB_STATEMENT]: sql,
276-
[ATTR_DB_SQL_TABLE]: mainTableName,
267+
[ATTR_DB_SYSTEM_NAME]: connectionOptions.type,
268+
[ATTR_SERVER_ADDRESS]: connectionOptions.host,
269+
[ATTR_SERVER_PORT]: connectionOptions.port,
270+
[ATTR_DB_NAMESPACE]: connectionOptions.database,
271+
[ATTR_DB_OPERATION_NAME]: operation,
272+
[ATTR_DB_QUERY_TEXT]: sql,
273+
[ATTR_DB_COLLECTION_NAME]: mainTableName,
277274
};
278275
if (self.getConfig().enhancedDatabaseReporting) {
279276
try {
@@ -323,13 +320,12 @@ export class TypeormInstrumentation extends InstrumentationBase<TypeormInstrumen
323320
// eslint-disable-next-line @typescript-eslint/no-explicit-any
324321
const connectionOptions: any = this.options;
325322
const attributes = {
326-
[ATTR_DB_SYSTEM]: connectionOptions.type,
327-
[ATTR_DB_USER]: connectionOptions.username,
328-
[ATTR_NET_PEER_NAME]: connectionOptions.host,
329-
[ATTR_NET_PEER_PORT]: connectionOptions.port,
330-
[ATTR_DB_NAME]: connectionOptions.database,
331-
[ATTR_DB_OPERATION]: operation,
332-
[ATTR_DB_STATEMENT]: sql,
323+
[ATTR_DB_SYSTEM_NAME]: connectionOptions.type,
324+
[ATTR_SERVER_ADDRESS]: connectionOptions.host,
325+
[ATTR_SERVER_PORT]: connectionOptions.port,
326+
[ATTR_DB_NAMESPACE]: connectionOptions.database,
327+
[ATTR_DB_OPERATION_NAME]: operation,
328+
[ATTR_DB_QUERY_TEXT]: sql,
333329
};
334330

335331
const span: Span = self.tracer.startSpan(`TypeORM ${operation}`, {

plugins/node/instrumentation-typeorm/test/Connection.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
import * as assert from 'assert';
1717
import { SpanStatusCode } from '@opentelemetry/api';
1818
import {
19-
ATTR_DB_SYSTEM,
20-
ATTR_DB_NAME,
21-
ATTR_DB_OPERATION,
22-
ATTR_DB_STATEMENT,
19+
ATTR_DB_SYSTEM_NAME,
20+
ATTR_DB_NAMESPACE,
21+
ATTR_DB_OPERATION_NAME,
22+
ATTR_DB_QUERY_TEXT,
2323
} from '../src/semconv';
2424
import { TypeormInstrumentation } from '../src';
2525
import {
@@ -56,10 +56,10 @@ describe('Connection', () => {
5656
assert.strictEqual(typeOrmSpans.length, 1);
5757
assert.strictEqual(typeOrmSpans[0].status.code, SpanStatusCode.UNSET);
5858
const attributes = typeOrmSpans[0].attributes;
59-
assert.strictEqual(attributes[ATTR_DB_SYSTEM], options.type);
60-
assert.strictEqual(attributes[ATTR_DB_NAME], options.database);
61-
assert.strictEqual(attributes[ATTR_DB_OPERATION], 'raw query');
62-
assert.strictEqual(attributes[ATTR_DB_STATEMENT], query);
59+
assert.strictEqual(attributes[ATTR_DB_SYSTEM_NAME], options.type);
60+
assert.strictEqual(attributes[ATTR_DB_NAMESPACE], options.database);
61+
assert.strictEqual(attributes[ATTR_DB_OPERATION_NAME], 'raw query');
62+
assert.strictEqual(attributes[ATTR_DB_QUERY_TEXT], query);
6363
await connection.close();
6464
});
6565
});

plugins/node/instrumentation-typeorm/test/EntityManager.test.ts

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
import * as assert from 'assert';
1717
import { SpanStatusCode } from '@opentelemetry/api';
1818
import {
19-
ATTR_DB_SQL_TABLE,
20-
ATTR_DB_SYSTEM,
21-
ATTR_DB_NAME,
22-
ATTR_DB_OPERATION,
23-
ATTR_DB_STATEMENT,
19+
ATTR_DB_COLLECTION_NAME,
20+
ATTR_DB_SYSTEM_NAME,
21+
ATTR_DB_NAMESPACE,
22+
ATTR_DB_OPERATION_NAME,
23+
ATTR_DB_QUERY_TEXT,
2424
} from '../src/semconv';
2525
import { TypeormInstrumentation } from '../src';
2626
import {
@@ -56,12 +56,12 @@ describe('EntityManager', () => {
5656
assert.strictEqual(typeOrmSpans.length, 1);
5757
assert.strictEqual(typeOrmSpans[0].status.code, SpanStatusCode.UNSET);
5858
const attributes = typeOrmSpans[0].attributes;
59-
assert.strictEqual(attributes[ATTR_DB_SQL_TABLE], 'user');
60-
assert.strictEqual(attributes[ATTR_DB_SYSTEM], options.type);
61-
assert.strictEqual(attributes[ATTR_DB_NAME], options.database);
62-
assert.strictEqual(attributes[ATTR_DB_OPERATION], 'save');
59+
assert.strictEqual(attributes[ATTR_DB_COLLECTION_NAME], 'user');
60+
assert.strictEqual(attributes[ATTR_DB_SYSTEM_NAME], options.type);
61+
assert.strictEqual(attributes[ATTR_DB_NAMESPACE], options.database);
62+
assert.strictEqual(attributes[ATTR_DB_OPERATION_NAME], 'save');
6363
assert.strictEqual(
64-
attributes[ATTR_DB_STATEMENT],
64+
attributes[ATTR_DB_QUERY_TEXT],
6565
JSON.stringify({ targetOrEntity: user })
6666
);
6767
await connection.close();
@@ -78,12 +78,12 @@ describe('EntityManager', () => {
7878
assert.strictEqual(typeOrmSpans.length, 1);
7979
assert.strictEqual(typeOrmSpans[0].status.code, SpanStatusCode.UNSET);
8080
const attributes = typeOrmSpans[0].attributes;
81-
assert.strictEqual(attributes[ATTR_DB_SQL_TABLE], 'user');
82-
assert.strictEqual(attributes[ATTR_DB_SYSTEM], options.type);
83-
assert.strictEqual(attributes[ATTR_DB_NAME], options.database);
84-
assert.strictEqual(attributes[ATTR_DB_OPERATION], 'save');
81+
assert.strictEqual(attributes[ATTR_DB_COLLECTION_NAME], 'user');
82+
assert.strictEqual(attributes[ATTR_DB_SYSTEM_NAME], options.type);
83+
assert.strictEqual(attributes[ATTR_DB_NAMESPACE], options.database);
84+
assert.strictEqual(attributes[ATTR_DB_OPERATION_NAME], 'save');
8585
assert.strictEqual(
86-
attributes[ATTR_DB_STATEMENT],
86+
attributes[ATTR_DB_QUERY_TEXT],
8787
JSON.stringify({ targetOrEntity: user })
8888
);
8989
await connection.close();
@@ -102,12 +102,12 @@ describe('EntityManager', () => {
102102
assert.strictEqual(typeOrmSpans.length, 2);
103103
assert.strictEqual(typeOrmSpans[1].status.code, SpanStatusCode.UNSET);
104104
const attributes = typeOrmSpans[1].attributes;
105-
assert.strictEqual(attributes[ATTR_DB_SQL_TABLE], 'user');
106-
assert.strictEqual(attributes[ATTR_DB_SYSTEM], options.type);
107-
assert.strictEqual(attributes[ATTR_DB_NAME], options.database);
108-
assert.strictEqual(attributes[ATTR_DB_OPERATION], 'remove');
105+
assert.strictEqual(attributes[ATTR_DB_COLLECTION_NAME], 'user');
106+
assert.strictEqual(attributes[ATTR_DB_SYSTEM_NAME], options.type);
107+
assert.strictEqual(attributes[ATTR_DB_NAMESPACE], options.database);
108+
assert.strictEqual(attributes[ATTR_DB_OPERATION_NAME], 'remove');
109109
assert.strictEqual(
110-
attributes[ATTR_DB_STATEMENT],
110+
attributes[ATTR_DB_QUERY_TEXT],
111111
JSON.stringify({
112112
targetOrEntity: { id: 56, firstName: 'aspecto', lastName: 'io' },
113113
})
@@ -128,12 +128,12 @@ describe('EntityManager', () => {
128128
assert.strictEqual(typeOrmSpans.length, 2);
129129
assert.strictEqual(typeOrmSpans[1].status.code, SpanStatusCode.UNSET);
130130
const attributes = typeOrmSpans[1].attributes;
131-
assert.strictEqual(attributes[ATTR_DB_SQL_TABLE], 'user');
132-
assert.strictEqual(attributes[ATTR_DB_SYSTEM], options.type);
133-
assert.strictEqual(attributes[ATTR_DB_NAME], options.database);
134-
assert.strictEqual(attributes[ATTR_DB_OPERATION], 'update');
131+
assert.strictEqual(attributes[ATTR_DB_COLLECTION_NAME], 'user');
132+
assert.strictEqual(attributes[ATTR_DB_SYSTEM_NAME], options.type);
133+
assert.strictEqual(attributes[ATTR_DB_NAMESPACE], options.database);
134+
assert.strictEqual(attributes[ATTR_DB_OPERATION_NAME], 'update');
135135
assert.strictEqual(
136-
attributes[ATTR_DB_STATEMENT],
136+
attributes[ATTR_DB_QUERY_TEXT],
137137
JSON.stringify({ target: 'User', criteria: 56, partialEntity })
138138
);
139139
await connection.close();
@@ -184,23 +184,38 @@ describe('EntityManager', () => {
184184
const sqlite2Span = spans[1];
185185

186186
assert.strictEqual(
187-
sqlite1Span.attributes[ATTR_DB_SYSTEM],
187+
sqlite1Span.attributes[ATTR_DB_SYSTEM_NAME],
188188
defaultOptions.type
189189
);
190190
assert.strictEqual(
191-
sqlite1Span.attributes[ATTR_DB_NAME],
191+
sqlite1Span.attributes[ATTR_DB_NAMESPACE],
192192
defaultOptions.database
193193
);
194-
assert.strictEqual(sqlite1Span.attributes[ATTR_DB_OPERATION], 'save');
195-
assert.strictEqual(sqlite1Span.attributes[ATTR_DB_SQL_TABLE], 'user');
194+
assert.strictEqual(
195+
sqlite1Span.attributes[ATTR_DB_OPERATION_NAME],
196+
'save'
197+
);
198+
assert.strictEqual(
199+
sqlite1Span.attributes[ATTR_DB_COLLECTION_NAME],
200+
'user'
201+
);
196202

197-
assert.strictEqual(sqlite2Span.attributes[ATTR_DB_SYSTEM], options2.type);
198203
assert.strictEqual(
199-
sqlite2Span.attributes[ATTR_DB_NAME],
204+
sqlite2Span.attributes[ATTR_DB_SYSTEM_NAME],
205+
options2.type
206+
);
207+
assert.strictEqual(
208+
sqlite2Span.attributes[ATTR_DB_NAMESPACE],
200209
options2.database
201210
);
202-
assert.strictEqual(sqlite2Span.attributes[ATTR_DB_OPERATION], 'remove');
203-
assert.strictEqual(sqlite2Span.attributes[ATTR_DB_SQL_TABLE], 'user');
211+
assert.strictEqual(
212+
sqlite2Span.attributes[ATTR_DB_OPERATION_NAME],
213+
'remove'
214+
);
215+
assert.strictEqual(
216+
sqlite2Span.attributes[ATTR_DB_COLLECTION_NAME],
217+
'user'
218+
);
204219
await sqlite1.close();
205220
await sqlite2.close();
206221
});

plugins/node/instrumentation-typeorm/test/QueryBuilder.test.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616
import * as assert from 'assert';
1717
import { SpanStatusCode } from '@opentelemetry/api';
1818
import {
19-
ATTR_DB_NAME,
20-
ATTR_DB_SQL_TABLE,
21-
ATTR_DB_STATEMENT,
22-
ATTR_DB_SYSTEM,
23-
ATTR_DB_USER,
24-
ATTR_NET_PEER_NAME,
25-
ATTR_NET_PEER_PORT,
19+
ATTR_DB_NAMESPACE,
20+
ATTR_DB_COLLECTION_NAME,
21+
ATTR_DB_QUERY_TEXT,
22+
ATTR_DB_SYSTEM_NAME,
23+
ATTR_SERVER_ADDRESS,
24+
ATTR_SERVER_PORT,
2625
} from '../src/semconv';
2726
import { TypeormInstrumentation } from '../src';
2827
import {
@@ -60,14 +59,16 @@ describe('QueryBuilder', () => {
6059
assert.strictEqual(typeOrmSpans.length, 1);
6160
assert.strictEqual(typeOrmSpans[0].status.code, SpanStatusCode.UNSET);
6261
const attributes = typeOrmSpans[0].attributes;
63-
assert.strictEqual(attributes[ATTR_DB_SYSTEM], connectionOptions.type);
64-
assert.strictEqual(attributes[ATTR_DB_USER], connectionOptions.username);
65-
assert.strictEqual(attributes[ATTR_NET_PEER_NAME], connectionOptions.host);
66-
assert.strictEqual(attributes[ATTR_NET_PEER_PORT], connectionOptions.port);
67-
assert.strictEqual(attributes[ATTR_DB_NAME], connectionOptions.database);
68-
assert.strictEqual(attributes[ATTR_DB_SQL_TABLE], 'user');
62+
assert.strictEqual(attributes[ATTR_DB_SYSTEM_NAME], connectionOptions.type);
63+
assert.strictEqual(attributes[ATTR_SERVER_ADDRESS], connectionOptions.host);
64+
assert.strictEqual(attributes[ATTR_SERVER_PORT], connectionOptions.port);
6965
assert.strictEqual(
70-
attributes[ATTR_DB_STATEMENT],
66+
attributes[ATTR_DB_NAMESPACE],
67+
connectionOptions.database
68+
);
69+
assert.strictEqual(attributes[ATTR_DB_COLLECTION_NAME], 'user');
70+
assert.strictEqual(
71+
attributes[ATTR_DB_QUERY_TEXT],
7172
'SELECT "user"."id" AS "user_id", "user"."firstName" AS "user_firstName", "user"."lastName" AS "user_lastName" FROM "user" "user" WHERE "user"."id" = :userId'
7273
);
7374
await connection.close();

plugins/node/instrumentation-typeorm/test/Repository.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const instrumentation = registerInstrumentationTesting(
2626

2727
import { defaultOptions, User } from './utils';
2828
import * as typeorm from 'typeorm';
29-
import { ATTR_DB_SQL_TABLE } from '../src/semconv';
29+
import { ATTR_DB_COLLECTION_NAME } from '../src/semconv';
3030

3131
describe('Repository', () => {
3232
beforeEach(() => {
@@ -46,7 +46,7 @@ describe('Repository', () => {
4646
assert.strictEqual(spans.length, 1);
4747
const span = spans[0];
4848
const attributes = span.attributes;
49-
assert.strictEqual(attributes[ATTR_DB_SQL_TABLE], 'user');
49+
assert.strictEqual(attributes[ATTR_DB_COLLECTION_NAME], 'user');
5050
await connection.destroy();
5151
});
5252
});

0 commit comments

Comments
 (0)