@@ -8,7 +8,6 @@ const log = require('../../dd-trace/src/log')
88const tags = require ( '../../../ext/tags' )
99const kinds = require ( '../../../ext/kinds' )
1010const formats = require ( '../../../ext/formats' )
11- const analyticsSampler = require ( '../../dd-trace/src/analytics_sampler' )
1211const { COMPONENT , CLIENT_PORT_KEY } = require ( '../../dd-trace/src/constants' )
1312const urlFilter = require ( '../../dd-trace/src/plugins/util/urlfilter' )
1413
@@ -25,32 +24,11 @@ const HTTP2_HEADER_STATUS = ':status'
2524const HTTP2_METHOD_GET = 'GET'
2625
2726class Http2ClientPlugin extends ClientPlugin {
28- static get id ( ) {
29- return 'http2'
30- }
31-
32- constructor ( ...args ) {
33- super ( ...args )
34-
35- this . addSub ( 'apm:http2:client:response' , ( headers ) => {
36- const span = storage . getStore ( ) . span
37- const status = headers && headers [ HTTP2_HEADER_STATUS ]
38-
39- span . setTag ( HTTP_STATUS_CODE , status )
40-
41- if ( ! this . config . validateStatus ( status ) ) {
42- this . addError ( )
43- }
27+ static get id ( ) { return 'http2' }
28+ static get prefix ( ) { return `apm:http2:client:request` }
4429
45- addHeaderTags ( span , headers , HTTP_RESPONSE_HEADERS , this . config )
46- } )
47- }
48-
49- addTraceSub ( eventName , handler ) {
50- this . addSub ( `apm:${ this . constructor . id } :client:${ this . operation } :${ eventName } ` , handler )
51- }
52-
53- start ( { authority, options, headers = { } } ) {
30+ bindStart ( message ) {
31+ const { authority, options, headers = { } } = message
5432 const sessionDetails = extractSessionDetails ( authority , options )
5533 const path = headers [ HTTP2_HEADER_PATH ] || '/'
5634 const pathname = path . split ( / [ ? # ] / ) [ 0 ]
@@ -75,7 +53,7 @@ class Http2ClientPlugin extends ClientPlugin {
7553 metrics : {
7654 [ CLIENT_PORT_KEY ] : parseInt ( sessionDetails . port )
7755 }
78- } )
56+ } , false )
7957
8058 // TODO: Figure out a better way to do this for any span.
8159 if ( ! allowed ) {
@@ -88,14 +66,53 @@ class Http2ClientPlugin extends ClientPlugin {
8866 this . tracer . inject ( span , HTTP_HEADERS , headers )
8967 }
9068
91- analyticsSampler . sample ( span , this . config . measured )
69+ message . parentStore = store
70+ message . currentStore = { ...store , span }
71+
72+ return message . currentStore
73+ }
74+
75+ bindAsyncStart ( { eventName, eventData, currentStore, parentStore } ) {
76+ switch ( eventName ) {
77+ case 'response' :
78+ this . _onResponse ( currentStore , eventData )
79+ return parentStore
80+ case 'error' :
81+ this . _onError ( currentStore , eventData )
82+ return parentStore
83+ case 'close' :
84+ this . _onClose ( currentStore , eventData )
85+ return parentStore
86+ }
9287
93- this . enter ( span , store )
88+ return storage . getStore ( )
9489 }
9590
9691 configure ( config ) {
9792 return super . configure ( normalizeConfig ( config ) )
9893 }
94+
95+ _onResponse ( store , headers ) {
96+ const status = headers && headers [ HTTP2_HEADER_STATUS ]
97+
98+ store . span . setTag ( HTTP_STATUS_CODE , status )
99+
100+ if ( ! this . config . validateStatus ( status ) ) {
101+ storage . run ( store , ( ) => this . addError ( ) )
102+ }
103+
104+ addHeaderTags ( store . span , headers , HTTP_RESPONSE_HEADERS , this . config )
105+ }
106+
107+ _onError ( { span } , error ) {
108+ span . setTag ( 'error' , error )
109+ span . finish ( )
110+ }
111+
112+ _onClose ( { span } ) {
113+ this . tagPeerService ( span )
114+ span . finish ( )
115+ }
99116}
100117
101118function extractSessionDetails ( authority , options ) {
0 commit comments