forked from pinpoint-apm/pinpoint-node-agent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
trace-context.js
138 lines (118 loc) · 3.8 KB
/
trace-context.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
* Pinpoint Node.js Agent
* Copyright 2020-present NAVER Corp.
* Apache License v2.0
*/
'use strict'
const contextManager = require('./context-manager')
const Trace = require('./trace')
const TransactionId = require('./transaction-id')
const TraceId = require('./trace-id')
const IdGenerator = require('./id-generator')
const activeTrace = require('../metric/active-trace')
const log = require('../utils/logger')
const sampler = require('../sampler/sampler')
const DisableTrace = require('./disable-trace')
class TraceContext {
constructor () {
this.agentInfo = null
this.dataSender = null
}
static init (options, dataSender, config) {
if (!options.agentId || !options.applicationName) {
throw new Error('Fail to initialize pinpoint context')
}
contextManager.start()
const instance = new TraceContext()
instance.agentInfo = {
agentId : options.agentId,
applicationName : options.applicationName,
agentStartTime : options.agentStartTime,
serviceType : options.serviceType,
}
instance.dataSender = dataSender
if (config) {
instance.isSampling = sampler.getIsSampling(config.sampling, config.sampleRate)
instance.enableSampling = config.sampling
}
return instance
}
continueTraceObject (requestData) {
const traceId = new TraceId(
requestData.transactionId,
requestData.spanId,
requestData.parentSpanId,
requestData.flag)
return this.createTraceObject(traceId, requestData.sampled, requestData)
}
newTraceObject (sampling) {
const transactionId = new TransactionId(this.agentInfo.agentId,
this.agentInfo.agentStartTime.toString())
const spanId = IdGenerator.next
const traceId = new TraceId(transactionId, spanId.toString())
return this.createTraceObject(traceId, sampling)
}
// https://github.com/pinpoint-apm/pinpoint/blob/a113e527e73add4e848de9173923b01e06b3cca1/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/request/ServletRequestListener.java#L117
createTraceObject (traceId, sampling, requestData) {
if (traceId == null || this.agentInfo == null) {
return null
}
if (false == sampling) {
const disableTrace = new DisableTrace(traceId, this.agentInfo, requestData)
this.setCurrentTraceObject(disableTrace)
return disableTrace;
}
try {
const trace = new Trace(traceId, this.agentInfo, this.dataSender, sampling, requestData)
this.setCurrentTraceObject(trace)
activeTrace.register(trace)
return trace
} catch (e) {
log.error('Fail to create trace object', e)
}
}
completeTraceObject (trace) {
if (!trace || !trace.spanRecorder || !trace.span) {
return
}
try {
trace.spanRecorder.span.markElapsedTime()
trace.close()
activeTrace.remove(trace)
} catch (e) {
log.error('Fail to complete trace object', e)
}
}
currentTraceObject () {
return contextManager.getObject()
}
setCurrentTraceObject (traceObject) {
contextManager.setObject(traceObject)
}
makeTrace(requestData) {
const transactionId = requestData && requestData.transactionId
if (transactionId) {
if (this.enableSampling) {
return this.continueTraceObject(requestData)
} else {
const traceId = new TraceId(
requestData.transactionId,
requestData.spanId,
requestData.parentSpanId,
requestData.flag)
const disableTrace = new DisableTrace(traceId, this.agentInfo, requestData)
this.setCurrentTraceObject(disableTrace)
return disableTrace
}
} else {
return this.newTraceObject(this.isSampling())
}
}
// only test
getAllTraceObject () {
return contextManager.getAllObject()
}
}
module.exports = {
init: TraceContext.init
}