@uyu423/pinpoint-node-agent
Version:
Pinpoint node agent provided by NAVER (Personalized version)
88 lines (75 loc) • 2.84 kB
JavaScript
/**
* Pinpoint Node.js Agent
* Copyright 2020-present NAVER Corp.
* Apache License v2.0
*/
const shimmer = require('shimmer')
const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode
const log = require('../../utils/logger')
const ValueType = require('../../constant/valued-type').ValuedType
const EventAnnotationKey = require('../../constant/annotation-key').EventAnnotationKey
const convertUtils = require('../../utils/convert-utils')
const searchRegexp = /_search$/
module.exports = function (agent, version, elasticsearch) {
shimmer.wrap(elasticsearch.Transport && elasticsearch.Transport.prototype, 'request', wrapRequest)
return elasticsearch
function wrapRequest(original) {
return function wrappedRequest (params, cb) {
const trace = agent.traceContext.currentTraceObject()
const method = params && params.method
const path = params && params.path
const query = params && params.query
let spanEventRecorder
log.debug('intercepted call to elasticsearch.Transport.prototype.request %o', { method: method, path: path })
if (trace && method && path) {
spanEventRecorder = trace.traceBlockBegin()
spanEventRecorder.recordServiceType(ServiceTypeCode.elasticsearch)
spanEventRecorder.recordApiDesc( `Elasticsearch: ${method} ${path}`)
if (query && searchRegexp.test(path)) {
// FIXME. Collection annotation key not defined
spanEventRecorder.recordApiArguments(
EventAnnotationKey.MONGO_JSON_DATA,
convertUtils.convertStringStringValue(query),
ValueType.stringStringValue)
}
if (typeof cb === 'function') {
const args = Array.prototype.slice.call(arguments)
args[1] = function () {
let result
try {
result = cb.apply(this, arguments)
} catch (e) {
spanEventRecorder.recordException(e, true)
e.record = true
throw e
} finally {
if (trace) {
trace.traceBlockEnd(spanEventRecorder)
}
}
return result
}
return original.apply(this, arguments)
} else {
const p = original.apply(this, arguments)
p.then().catch((e) => {
if (!e._pinpointCheck) {
e._pinpointCheck = true
spanEventRecorder.recordException(e, true)
}
throw e
}).finally(() =>{
if (trace) {
trace.traceBlockEnd(spanEventRecorder)
}
})
return p
}
} else {
log.debug('could not instrument elasticsearch request')
return original.apply(this, arguments)
}
}
}
}