dd-trace
Version:
Datadog APM tracing client for JavaScript
61 lines (47 loc) • 1.41 kB
JavaScript
'use strict'
const ServerPlugin = require('../../dd-trace/src/plugins/server')
class SharedbPlugin extends ServerPlugin {
static get id () { return 'sharedb' }
start ({ actionName, request }) {
const span = this.startSpan('sharedb.request', {
service: this.config.service,
resource: getReadableResourceName(actionName, request.c, request.q),
kind: 'server',
meta: {
'sharedb.action': actionName
}
})
if (this.config.hooks && this.config.hooks.receive) {
this.config.hooks.receive(span, request)
}
}
finish ({ request, res }) {
const span = this.activeSpan
if (this.config.hooks && this.config.hooks.reply) {
this.config.hooks.reply(span, request, res)
}
super.finish()
}
}
function getReadableResourceName (readableActionName, collection, query) {
if (collection) {
readableActionName += ' ' + collection
}
if (query) {
readableActionName += ' ' + JSON.stringify(sanitize(query))
}
return readableActionName
}
function sanitize (input) {
const output = {}
if (!isObject(input) || Buffer.isBuffer(input)) return '?'
for (const key in input) {
if (typeof input[key] === 'function') continue
output[key] = sanitize(input[key])
}
return output
}
function isObject (val) {
return val !== null && typeof val === 'object' && !Array.isArray(val)
}
module.exports = SharedbPlugin