Skip to content

Commit b043ffb

Browse files
authored
feat(instrumentation-pg): add operation name attribute to db duration metric (#2475)
1 parent a558044 commit b043ffb

File tree

4 files changed

+24
-5
lines changed

4 files changed

+24
-5
lines changed

plugins/node/opentelemetry-instrumentation-pg/src/instrumentation.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import {
6262
METRIC_DB_CLIENT_CONNECTION_PENDING_REQUESTS,
6363
METRIC_DB_CLIENT_OPERATION_DURATION,
6464
ATTR_DB_NAMESPACE,
65+
ATTR_DB_OPERATION_NAME,
6566
} from '@opentelemetry/semantic-conventions/incubating';
6667

6768
export class PgInstrumentation extends InstrumentationBase<PgInstrumentationConfig> {
@@ -228,6 +229,7 @@ export class PgInstrumentation extends InstrumentationBase<PgInstrumentationConf
228229
ATTR_ERROR_TYPE,
229230
ATTR_SERVER_PORT,
230231
ATTR_SERVER_ADDRESS,
232+
ATTR_DB_OPERATION_NAME,
231233
];
232234

233235
keysToCopy.forEach(key => {
@@ -282,6 +284,11 @@ export class PgInstrumentation extends InstrumentationBase<PgInstrumentationConf
282284
[ATTR_SERVER_ADDRESS]: this.connectionParameters.host,
283285
};
284286

287+
if (queryConfig?.text) {
288+
attributes[ATTR_DB_OPERATION_NAME] =
289+
utils.parseNormalizedOperationName(queryConfig?.text);
290+
}
291+
285292
const recordDuration = () => {
286293
plugin.recordOperationDuration(attributes, startTime);
287294
};

plugins/node/opentelemetry-instrumentation-pg/src/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export function getQuerySpanName(
9292
return `${SpanNames.QUERY_PREFIX}:${command}${dbName ? ` ${dbName}` : ''}`;
9393
}
9494

95-
function parseNormalizedOperationName(queryText: string) {
95+
export function parseNormalizedOperationName(queryText: string) {
9696
const indexOfFirstSpace = queryText.indexOf(' ');
9797
let sqlCommand =
9898
indexOfFirstSpace === -1

plugins/node/opentelemetry-instrumentation-pg/test/pg-pool.test.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ import {
5050
SEMATTRS_DB_USER,
5151
SEMATTRS_DB_STATEMENT,
5252
} from '@opentelemetry/semantic-conventions';
53-
import { ATTR_DB_CLIENT_CONNECTION_STATE } from '@opentelemetry/semantic-conventions/incubating';
53+
import {
54+
METRIC_DB_CLIENT_CONNECTION_COUNT,
55+
METRIC_DB_CLIENT_CONNECTION_PENDING_REQUESTS,
56+
ATTR_DB_CLIENT_CONNECTION_STATE,
57+
} from '@opentelemetry/semantic-conventions/incubating';
5458

5559
const memoryExporter = new InMemorySpanExporter();
5660

@@ -522,7 +526,7 @@ describe('pg-pool', () => {
522526
const metrics = resourceMetrics.scopeMetrics[0].metrics;
523527
assert.strictEqual(
524528
metrics[1].descriptor.name,
525-
'db.client.connection.count'
529+
METRIC_DB_CLIENT_CONNECTION_COUNT
526530
);
527531
assert.strictEqual(
528532
metrics[1].descriptor.description,
@@ -553,7 +557,7 @@ describe('pg-pool', () => {
553557

554558
assert.strictEqual(
555559
metrics[2].descriptor.name,
556-
'db.client.connection.pending_requests'
560+
METRIC_DB_CLIENT_CONNECTION_PENDING_REQUESTS
557561
);
558562
assert.strictEqual(
559563
metrics[2].descriptor.description,

plugins/node/opentelemetry-instrumentation-pg/test/pg.test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ import {
5353
DBSYSTEMVALUES_POSTGRESQL,
5454
ATTR_ERROR_TYPE,
5555
} from '@opentelemetry/semantic-conventions';
56+
import {
57+
METRIC_DB_CLIENT_OPERATION_DURATION,
58+
ATTR_DB_OPERATION_NAME,
59+
} from '@opentelemetry/semantic-conventions/incubating';
5660
import { addSqlCommenterComment } from '@opentelemetry/sql-common';
5761

5862
const memoryExporter = new InMemorySpanExporter();
@@ -984,7 +988,7 @@ describe('pg', () => {
984988
const metrics = resourceMetrics.scopeMetrics[0].metrics;
985989
assert.strictEqual(
986990
metrics[0].descriptor.name,
987-
'db.client.operation.duration'
991+
METRIC_DB_CLIENT_OPERATION_DURATION
988992
);
989993
assert.strictEqual(
990994
metrics[0].descriptor.description,
@@ -995,6 +999,10 @@ describe('pg', () => {
995999
dataPoint.attributes[SEMATTRS_DB_SYSTEM],
9961000
DBSYSTEMVALUES_POSTGRESQL
9971001
);
1002+
assert.strictEqual(
1003+
dataPoint.attributes[ATTR_DB_OPERATION_NAME],
1004+
'SELECT'
1005+
);
9981006
assert.strictEqual(dataPoint.attributes[ATTR_ERROR_TYPE], undefined);
9991007

10001008
const v = (dataPoint as DataPoint<Histogram>).value;

0 commit comments

Comments
 (0)