forked from pinpoint-apm/pinpoint-node-agent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrequest-header-utils.js
111 lines (96 loc) · 3.84 KB
/
request-header-utils.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
/**
* Pinpoint Node.js Agent
* Copyright 2020-present NAVER Corp.
* Apache License v2.0
*/
'use strict'
const url = require('url')
const log = require('../utils/logger')
const RequestData = require('./request-data')
const PinpointHeader = require('../constant/http-header').PinpointHeader
const TransactionId = require('../context/transaction-id')
const samplingFlag = require('../sampler/sampling-flag')
class RequestHeaderUtils {
static read(request) {
if (!request) {
return null
}
let requestData = new RequestData()
// https://nodejs.org/api/url.html#url_url_parse_urlstring_parsequerystring_slashesdenotehost
// url.parse throw error
try {
const parsedUrl = url.parse(request.url)
requestData.rpcName = parsedUrl ? parsedUrl.pathname : ''
const query = parsedUrl.query
if (query && query.length > 0) {
requestData.searchParams = query
}
} catch (error) {
log.error(error)
}
requestData.endPoint = this.getHeader(request, 'host')
const remoteAddress = this.getHeader(request, 'x-forwarded-for') || request.connection.remoteAddress
if (remoteAddress) {
requestData.remoteAddress = remoteAddress.replace('::ffff:', '')
}
if (this.getHeader(request, PinpointHeader.HTTP_TRACE_ID)) {
requestData = this.readPinpointHeader(request, requestData)
}
log.debug('>> Read DATA from http header \n', requestData)
return requestData
}
static readPinpointHeader(request, requestData) {
requestData.transactionId = TransactionId.toTransactionId(this.getHeader(request, PinpointHeader.HTTP_TRACE_ID))
if (requestData.transactionId) {
const spanId = this.getHeader(request, PinpointHeader.HTTP_SPAN_ID)
if (spanId) {
requestData.spanId = spanId
}
const parentSpanId = this.getHeader(request, PinpointHeader.HTTP_PARENT_SPAN_ID)
if (parentSpanId) {
requestData.parentSpanId = parentSpanId
}
requestData.parentApplicationName = this.getHeader(request, PinpointHeader.HTTP_PARENT_APPLICATION_NAME)
requestData.parentApplicationType = Number(this.getHeader(request, PinpointHeader.HTTP_PARENT_APPLICATION_TYPE))
requestData.flags = Number(this.getHeader(request, PinpointHeader.HTTP_FLAGS))
requestData.host = this.getHeader(request, PinpointHeader.HTTP_HOST)
requestData.sampled = samplingFlag.isSamplingFlag(this.getHeader(request, PinpointHeader.HTTP_SAMPLED))
requestData.isRoot = false
}
return requestData
}
static getHeader(request, name) {
if (request.getHeader) {
return request.getHeader(name.toLowerCase())
}
return request.headers[name.toLowerCase()]
}
static writeHTTPSampled(request) {
this.setHeader(request, PinpointHeader.HTTP_SAMPLED, samplingFlag.samplingRateFalse())
}
static write(request, agent, nextSpanId, host) {
if (!agent) {
return
}
const trace = agent.currentTraceObject()
if (request && trace && trace.traceId) {
this.setHeader(request, PinpointHeader.HTTP_TRACE_ID, trace.traceId.transactionId.toString())
this.setHeader(request, PinpointHeader.HTTP_SPAN_ID, nextSpanId)
this.setHeader(request, PinpointHeader.HTTP_PARENT_SPAN_ID, trace.traceId.spanId)
this.setHeader(request, PinpointHeader.HTTP_PARENT_APPLICATION_NAME, agent.config.applicationName)
this.setHeader(request, PinpointHeader.HTTP_PARENT_APPLICATION_TYPE, agent.config.serviceType)
this.setHeader(request, PinpointHeader.HTTP_FLAGS, trace.traceId.flag)
this.setHeader(request, PinpointHeader.HTTP_HOST, host)
}
log.debug('>> Writer http header \n', request._headers)
return request
}
static setHeader(request, name, value) {
if (request.setHeader) {
request.setHeader(name, value)
} else {
request.headers[name] = value
}
}
}
module.exports = RequestHeaderUtils