@@ -28,6 +28,8 @@ import {
2828import { AttributeNames } from './enums/AttributeNames' ;
2929import {
3030 ATTR_ERROR_TYPE ,
31+ ATTR_DB_SYSTEM_NAME ,
32+ ATTR_DB_NAMESPACE ,
3133 SEMATTRS_DB_SYSTEM ,
3234 SEMATTRS_DB_NAME ,
3335 SEMATTRS_DB_CONNECTION_STRING ,
@@ -36,6 +38,9 @@ import {
3638 SEMATTRS_DB_USER ,
3739 SEMATTRS_DB_STATEMENT ,
3840 DBSYSTEMVALUES_POSTGRESQL ,
41+ ATTR_NETWORK_PEER_ADDRESS ,
42+ ATTR_NETWORK_PEER_PORT ,
43+ ATTR_DB_QUERY_TEXT ,
3944} from '@opentelemetry/semantic-conventions' ;
4045import {
4146 ATTR_DB_CLIENT_CONNECTION_POOL_NAME ,
@@ -53,7 +58,7 @@ import {
5358} from './internal-types' ;
5459import { PgInstrumentationConfig } from './types' ;
5560import type * as pgTypes from 'pg' ;
56- import { safeExecuteInTheMiddle } from '@opentelemetry/instrumentation' ;
61+ import { safeExecuteInTheMiddle , SemconvStability , semconvStabilityFromStr } from '@opentelemetry/instrumentation' ;
5762import { SpanNames } from './enums/SpanNames' ;
5863
5964/**
@@ -146,19 +151,39 @@ function getPort(port: number | undefined): number | undefined {
146151}
147152
148153export function getSemanticAttributesFromConnection (
149- params : PgParsedConnectionParams
154+ params : PgParsedConnectionParams ,
155+ semconvStability : SemconvStability ,
150156) {
151- return {
152- [ SEMATTRS_DB_SYSTEM ] : DBSYSTEMVALUES_POSTGRESQL ,
153- [ SEMATTRS_DB_NAME ] : params . database , // required
154- [ SEMATTRS_DB_CONNECTION_STRING ] : getConnectionString ( params ) , // required
155- [ SEMATTRS_NET_PEER_NAME ] : params . host , // required
156- [ SEMATTRS_NET_PEER_PORT ] : getPort ( params . port ) ,
157- [ SEMATTRS_DB_USER ] : params . user ,
158- } ;
157+ let attributes : Attributes = { } ;
158+
159+ if ( semconvStability & SemconvStability . OLD ) {
160+ attributes = {
161+ ...attributes ,
162+ [ SEMATTRS_DB_SYSTEM ] : DBSYSTEMVALUES_POSTGRESQL ,
163+ [ SEMATTRS_DB_NAME ] : params . database ,
164+ [ SEMATTRS_DB_CONNECTION_STRING ] : getConnectionString ( params ) ,
165+ [ SEMATTRS_DB_USER ] : params . user ,
166+ [ SEMATTRS_NET_PEER_NAME ] : params . host , // required
167+ [ SEMATTRS_NET_PEER_PORT ] : getPort ( params . port ) ,
168+ }
169+ }
170+ if ( semconvStability & SemconvStability . STABLE ) {
171+ attributes = {
172+ ...attributes ,
173+ [ ATTR_DB_SYSTEM_NAME ] : DBSYSTEMVALUES_POSTGRESQL ,
174+ [ ATTR_DB_NAMESPACE ] : params . namespace ,
175+ [ ATTR_NETWORK_PEER_ADDRESS ] : params . host ,
176+ [ ATTR_NETWORK_PEER_PORT ] : getPort ( params . port ) ,
177+ }
178+ }
179+
180+ return attributes ;
159181}
160182
161- export function getSemanticAttributesFromPool ( params : PgPoolOptionsParams ) {
183+ export function getSemanticAttributesFromPool (
184+ params : PgPoolOptionsParams ,
185+ semconvStability : SemconvStability ,
186+ ) {
162187 let url : URL | undefined ;
163188 try {
164189 url = params . connectionString
@@ -167,17 +192,33 @@ export function getSemanticAttributesFromPool(params: PgPoolOptionsParams) {
167192 } catch ( e ) {
168193 url = undefined ;
169194 }
170-
171- return {
172- [ SEMATTRS_DB_SYSTEM ] : DBSYSTEMVALUES_POSTGRESQL ,
173- [ SEMATTRS_DB_NAME ] : url ?. pathname . slice ( 1 ) ?? params . database , // required
174- [ SEMATTRS_DB_CONNECTION_STRING ] : getConnectionString ( params ) , // required
175- [ SEMATTRS_NET_PEER_NAME ] : url ?. hostname ?? params . host , // required
176- [ SEMATTRS_NET_PEER_PORT ] : Number ( url ?. port ) || getPort ( params . port ) ,
177- [ SEMATTRS_DB_USER ] : url ?. username ?? params . user ,
195+ let attributes : Attributes = {
178196 [ AttributeNames . IDLE_TIMEOUT_MILLIS ] : params . idleTimeoutMillis ,
179197 [ AttributeNames . MAX_CLIENT ] : params . maxClient ,
180198 } ;
199+
200+ if ( semconvStability & SemconvStability . OLD ) {
201+ attributes = {
202+ ...attributes ,
203+ [ SEMATTRS_DB_SYSTEM ] : DBSYSTEMVALUES_POSTGRESQL ,
204+ [ SEMATTRS_DB_NAME ] : url ?. pathname . slice ( 1 ) ?? params . database ,
205+ [ SEMATTRS_DB_CONNECTION_STRING ] : getConnectionString ( params ) ,
206+ [ SEMATTRS_NET_PEER_NAME ] : url ?. hostname ?? params . host ,
207+ [ SEMATTRS_NET_PEER_PORT ] : Number ( url ?. port ) || getPort ( params . port ) ,
208+ [ SEMATTRS_DB_USER ] : url ?. username ?? params . user ,
209+ }
210+ }
211+ if ( semconvStability & SemconvStability . STABLE ) {
212+ attributes = {
213+ ...attributes ,
214+ [ ATTR_DB_SYSTEM_NAME ] : DBSYSTEMVALUES_POSTGRESQL ,
215+ [ ATTR_DB_NAMESPACE ] : params . namespace ,
216+ [ ATTR_NETWORK_PEER_ADDRESS ] : url ?. hostname ?? params . host ,
217+ [ ATTR_NETWORK_PEER_PORT ] : Number ( url ?. port ) || getPort ( params . port ) ,
218+ }
219+ }
220+
221+ return attributes ;
181222}
182223
183224export function shouldSkipInstrumentation (
@@ -195,6 +236,7 @@ export function handleConfigQuery(
195236 this : PgClientExtended ,
196237 tracer : Tracer ,
197238 instrumentationConfig : PgInstrumentationConfig ,
239+ semconvStability : SemconvStability ,
198240 queryConfig ?: { text : string ; values ?: unknown ; name ?: unknown }
199241) {
200242 // Create child span.
@@ -204,7 +246,7 @@ export function handleConfigQuery(
204246 const spanName = getQuerySpanName ( dbName , queryConfig ) ;
205247 const span = tracer . startSpan ( spanName , {
206248 kind : SpanKind . CLIENT ,
207- attributes : getSemanticAttributesFromConnection ( connectionParameters ) ,
249+ attributes : getSemanticAttributesFromConnection ( connectionParameters , semconvStability ) ,
208250 } ) ;
209251
210252 if ( ! queryConfig ) {
@@ -213,7 +255,12 @@ export function handleConfigQuery(
213255
214256 // Set attributes
215257 if ( queryConfig . text ) {
216- span . setAttribute ( SEMATTRS_DB_STATEMENT , queryConfig . text ) ;
258+ if ( semconvStability & SemconvStability . OLD ) {
259+ span . setAttribute ( SEMATTRS_DB_STATEMENT , queryConfig . text ) ;
260+ }
261+ if ( semconvStability & SemconvStability . STABLE ) {
262+ span . setAttribute ( ATTR_DB_QUERY_TEXT , queryConfig . text ) ;
263+ }
217264 }
218265
219266 if (
0 commit comments