UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

111 lines (89 loc) 3.58 kB
'use strict' const StoragePlugin = require('./storage') const { PEER_SERVICE_KEY, PEER_SERVICE_SOURCE_KEY } = require('../constants') class DatabasePlugin extends StoragePlugin { static operation = 'query' static peerServicePrecursors = ['db.name'] constructor (...args) { super(...args) this.serviceTags = { dddbs: '', encodedDddbs: '', dde: '', encodedDde: '', ddps: '', encodedDdps: '', ddpv: '', encodedDdpv: '' } } encodingServiceTags (serviceTag, encodeATag, spanConfig) { if (serviceTag !== spanConfig) { this.serviceTags[serviceTag] = spanConfig this.serviceTags[encodeATag] = encodeURIComponent(spanConfig) } } createDBMPropagationCommentService (serviceName, span) { this.encodingServiceTags('dddbs', 'encodedDddbs', serviceName) this.encodingServiceTags('dde', 'encodedDde', this.tracer._env) this.encodingServiceTags('ddps', 'encodedDdps', this.tracer._service) this.encodingServiceTags('ddpv', 'encodedDdpv', this.tracer._version) if (span.context()._tags['out.host']) { this.encodingServiceTags('ddh', 'encodedDdh', span._spanContext._tags['out.host']) } if (span.context()._tags['db.name']) { this.encodingServiceTags('dddb', 'encodedDddb', span._spanContext._tags['db.name']) } const { encodedDddb, encodedDddbs, encodedDde, encodedDdh, encodedDdps, encodedDdpv } = this.serviceTags let dbmComment = `dddb='${encodedDddb}',dddbs='${encodedDddbs}',dde='${encodedDde}',ddh='${encodedDdh}',` + `ddps='${encodedDdps}',ddpv='${encodedDdpv}'` const peerData = this.getPeerService(span.context()._tags) if (peerData !== undefined && peerData[PEER_SERVICE_SOURCE_KEY] === PEER_SERVICE_KEY) { this.encodingServiceTags('ddprs', 'encodedDdprs', peerData[PEER_SERVICE_KEY]) const { encodedDdprs } = this.serviceTags dbmComment += `,ddprs='${encodedDdprs}'` } return dbmComment } getDbmServiceName (span, tracerService) { if (this._tracerConfig.spanComputePeerService) { const peerData = this.getPeerService(span.context()._tags) return this.getPeerServiceRemap(peerData)[PEER_SERVICE_KEY] || tracerService } return tracerService } createDbmComment (span, serviceName, disableFullMode = false) { const mode = this.config.dbmPropagationMode const dbmService = this.getDbmServiceName(span, serviceName) if (mode === 'disabled') { return null } const servicePropagation = this.createDBMPropagationCommentService(dbmService, span) if (disableFullMode || mode === 'service') { return servicePropagation } else if (mode === 'full') { span.setTag('_dd.dbm_trace_injected', 'true') const traceparent = span._spanContext.toTraceparent() return `${servicePropagation},traceparent='${traceparent}'` } } injectDbmQuery (span, query, serviceName, disableFullMode = false) { const dbmTraceComment = this.createDbmComment(span, serviceName, disableFullMode) if (!dbmTraceComment) { return query } return this.config.appendComment ? `${query} /*${dbmTraceComment}*/` : `/*${dbmTraceComment}*/ ${query}` } maybeTruncate (query) { const maxLength = typeof this.config.truncate === 'number' ? this.config.truncate : 5000 // same as what the agent does if (this.config.truncate && query && query.length > maxLength) { query = `${query.slice(0, maxLength - 3)}...` } return query } } module.exports = DatabasePlugin