UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

76 lines (60 loc) 2.01 kB
'use strict' const TracingPlugin = require('../../dd-trace/src/plugins/tracing.js') class WSReceiverPlugin extends TracingPlugin { static get id () { return 'ws' } static get prefix () { return 'tracing:ws:receive' } static get type () { return 'websocket' } static get kind () { return 'consumer' } bindStart (ctx) { const { traceWebsocketMessagesEnabled, traceWebsocketMessagesInheritSampling, traceWebsocketMessagesSeparateTraces } = this.config if (!traceWebsocketMessagesEnabled) return const { byteLength, socket, binary } = ctx if (!socket.spanContext) return const spanTags = socket.spanContext.spanTags const path = spanTags['resource.name'].split(' ')[1] const opCode = binary ? 'binary' : 'text' const service = this.serviceName({ pluginConfig: this.config }) const span = this.startSpan(this.operationName(), { service, meta: { 'span.type': 'websocket', 'span.kind': 'consumer', 'resource.name': `websocket ${path}`, 'websocket.duration.style': 'handler', 'websocket.message.type': opCode, }, metrics: { 'websocket.message.length': byteLength, } }, ctx) if (traceWebsocketMessagesInheritSampling && traceWebsocketMessagesSeparateTraces) { span.setTag('_dd.dm.service', spanTags['service.name'] || service) span.setTag('_dd.dm.resource', spanTags['resource.name'] || `websocket ${path}`) span.setTag('_dd.dm.inherited', 1) } ctx.span = span return ctx.currentStore } bindAsyncStart (ctx) { return ctx.parentStore } asyncStart (ctx) { ctx.span.finish() } end (ctx) { if (!Object.hasOwn(ctx, 'result') || !ctx.span) return if (ctx.socket.spanContext) { ctx.span.addLink({ context: ctx.socket.spanContext, attributes: { 'dd.kind': 'executed_by' }, }) } ctx.span.finish() return ctx.parentStore } } module.exports = WSReceiverPlugin