UNPKG

pinpoint-node-agent

Version:

Pinpoint APM agent for Node.js — distributed tracing, error analysis, and URI statistics

121 lines (103 loc) 4.47 kB
/** * Pinpoint Node.js Agent * Copyright 2020-present NAVER Corp. * Apache License v2.0 */ 'use strict' const log = require('../utils/log/logger') const DisableTrace = require('./disable-trace') const localStorage = require('../instrumentation/context/local-storage') const TraceSampler = require('./trace/trace-sampler') const SpanBuilder = require('./span-builder') const SpanChunkBuilder = require('./span-chunk-builder') const SpanRepository = require('./trace/span-repository') const Trace = require('./trace/trace') const AsyncSpanChunkBuilder = require('./trace/async-span-chunk-builder') const ChildTraceBuilder = require('./trace/child-trace-builder') const DisableChildTrace = require('./trace/disable-child-trace') const disableAsyncId = require('./trace/disable-async-id') const activeRequestRepository = require('../metric/active-request-repository') class TraceContext { constructor(agentInfo, dataSender, config, traceCompletionEnricher, spanRecorderFactory, spanEventRecorderFactory) { this.agentInfo = agentInfo this.dataSender = dataSender this.config = config this.traceSampler = new TraceSampler(agentInfo, config) this.traceCompletionEnricher = traceCompletionEnricher this.spanEventRecorderFactory = spanEventRecorderFactory this.spanRecorderFactory = spanRecorderFactory } getAgentInfo() { return this.agentInfo } getConfig() { return this.config } completeTraceObject(trace) { if (!trace) { return } try { const traceCloseTime = trace.close() this.traceCompletionEnricher.onComplete(trace, traceCloseTime) activeRequestRepository.remove(trace.getTraceRoot()) } catch (e) { log.error('Fail to complete trace object', e) } } currentTraceObject() { return localStorage.getStore() } // disableSampling() method in DefaultBaseTraceFactory.java disableSampling() { const traceRoot = this.traceSampler.makeContinueDisableTraceRoot() return this.newLocalTrace(traceRoot) } newLocalTrace(traceRoot) { activeRequestRepository.register(traceRoot) const spanRecorder = this.spanRecorderFactory.createDisable(traceRoot) return new DisableTrace(traceRoot, spanRecorder) } // https://github.com/pinpoint-apm/pinpoint/blob/a113e527e73add4e848de9173923b01e06b3cca1/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/request/ServletRequestListener.java#L117 // newTraceObject method in DefaultBaseTraceFactory.java newTraceObject(urlPath) { const traceRoot = this.traceSampler.makeNewTraceRoot(urlPath) if (!traceRoot.isSampled()) { return this.newLocalTrace(traceRoot) } return this.newTrace(traceRoot) } // newTraceObject method in DefaultBaseTraceFactory.java newTrace(traceRoot) { const spanBuilder = new SpanBuilder(traceRoot) .setApplicationServiceType(this.agentInfo.getApplicationServiceType()) const spanChunkBuilder = new SpanChunkBuilder(traceRoot) .setApplicationServiceType(this.agentInfo.getApplicationServiceType()) const repository = new SpanRepository(spanChunkBuilder, this.dataSender) activeRequestRepository.register(traceRoot) const spanRecorder = this.spanRecorderFactory.create(spanBuilder) return new Trace(spanBuilder, repository, spanRecorder, this.spanEventRecorderFactory) } // DefaultAsyncContext.java: newAsyncContextTrace // DefaultBaseTraceFactory.java: continueAsyncContextTraceObject // AsyncContextSpanEventEndPointApiAwareInterceptor.java : before continueAsyncContextTraceObject(traceRoot, localAsyncId) { if (localAsyncId === disableAsyncId) { return this.continueDisableAsyncContextTraceObject(traceRoot) } const spanChunkBuilder = new AsyncSpanChunkBuilder(traceRoot, localAsyncId) .setApplicationServiceType(this.agentInfo.getApplicationServiceType()) const repository = new SpanRepository(spanChunkBuilder, this.dataSender) return new ChildTraceBuilder(traceRoot, repository, localAsyncId, this.spanEventRecorderFactory) } // DefaultBaseTraceFactory.java: continueDisableAsyncContextTraceObject continueDisableAsyncContextTraceObject(traceRoot) { return new DisableChildTrace(traceRoot) } // DefaultBaseTraceFactory.java: continueTraceObject continueTraceObject(traceId) { const traceRoot = this.traceSampler.makeContinueTraceRoot(traceId) return this.newTrace(traceRoot) } } module.exports = TraceContext