|
8 | 8 |
|
9 | 9 | const samplingFlag = require('../../sampler/sampling-flag') |
10 | 10 | const Header = require('./pinpoint-header') |
| 11 | +const ServiceType = require('../../context/service-type') |
11 | 12 |
|
12 | 13 | class HttpOutgoingRequestTrace { |
13 | | - constructor(trace, spanEventRecorder, request) { |
14 | | - this.trace = trace |
15 | | - this.spanEventRecorder = spanEventRecorder |
| 14 | + static nullObject = new HttpOutgoingRequestTrace() |
| 15 | + |
| 16 | + constructor(childTraceBuilder) { |
| 17 | + this.childTraceBuilder = childTraceBuilder |
| 18 | + } |
| 19 | + |
| 20 | + close() { |
| 21 | + if (HttpOutgoingRequestTrace.nullObject === this) { |
| 22 | + return |
| 23 | + } |
| 24 | + } |
| 25 | +} |
| 26 | + |
| 27 | +class HttpClientRequestWriter { |
| 28 | + constructor(request) { |
16 | 29 | this.request = request |
17 | 30 | } |
18 | 31 |
|
19 | | - |
| 32 | + writeSampledHeaderFalse() { |
| 33 | + this.setHeader(Header.sampled, samplingFlag.samplingRateFalse()) |
| 34 | + } |
| 35 | + |
| 36 | + setHeader(name, value) { |
| 37 | + this.request.setHeader?.(name, value) |
| 38 | + } |
20 | 39 | } |
21 | 40 |
|
22 | 41 | class HttpOutgoingRequestTraceBuilder { |
23 | 42 | constructor(context, request) { |
24 | | - this.context = context |
25 | | - this.request = request |
| 43 | + this.traceContext = context |
| 44 | + this.request = new HttpClientRequestWriter(request) |
26 | 45 | } |
27 | 46 |
|
28 | 47 | build() { |
29 | | - const trace = this.context.currentTraceObject() |
| 48 | + const trace = this.traceContext.currentTraceObject() |
| 49 | + if (!trace) { |
| 50 | + return HttpOutgoingRequestTrace.nullObject |
| 51 | + } |
30 | 52 |
|
31 | | - } |
32 | | - writeSampledHeaderFalse() { |
33 | | - this.request.setHeader(Header.sampled, samplingFlag.samplingRateFalse()) |
| 53 | + if (!trace.canSampled()) { |
| 54 | + this.request.writeSampledHeaderFalse() |
| 55 | + return HttpOutgoingRequestTrace.nullObject |
| 56 | + } |
| 57 | + |
| 58 | + const spanEventRecorder = trace.traceBlockBegin() |
| 59 | + spanEventRecorder.recordServiceType(ServiceType.asyncHttpClientInternal) |
| 60 | + spanEventRecorder.recordApiDesc('http.request') |
| 61 | + const asyncId = spanEventRecorder.recordNextAsyncId() |
| 62 | + trace.traceBlockEnd(spanEventRecorder) |
| 63 | + |
| 64 | + // DefaultAsyncContext.java: newAsyncContextTrace |
| 65 | + const childTraceBuilder = this.traceContext.continueAsyncContextTraceObject(trace.getTraceRoot(), asyncId.nextLocalAsyncId2()) |
| 66 | + return new HttpOutgoingRequestTrace(childTraceBuilder) |
34 | 67 | } |
35 | 68 | } |
36 | 69 |
|
|
0 commit comments