1414 * limitations under the License.
1515 */
1616
17- import { BasePlugin , CanonicalCode , Func , HeaderGetter , HeaderSetter , MessageEventType , RootSpan , Span , SpanKind , Tracer } from '@opencensus/core' ;
18- import { logger , Logger } from '@opencensus/core' ;
17+ import { BasePlugin , CanonicalCode , Func , HeaderGetter , HeaderSetter , MessageEventType , RootSpan , Span , SpanKind , TraceOptions } from '@opencensus/core' ;
1918import * as httpModule from 'http' ;
2019import * as semver from 'semver' ;
2120import * as shimmer from 'shimmer' ;
2221import * as url from 'url' ;
2322import * as uuid from 'uuid' ;
24-
2523import { HttpPluginConfig , IgnoreMatcher } from './types' ;
2624
27-
2825export type HttpGetCallback = ( res : httpModule . IncomingMessage ) => void ;
2926export type HttpModule = typeof httpModule ;
3027export type RequestFunction = typeof httpModule . request ;
@@ -45,8 +42,6 @@ export class HttpPlugin extends BasePlugin {
4542 static ATTRIBUTE_HTTP_ERROR_NAME = 'http.error_name' ;
4643 static ATTRIBUTE_HTTP_ERROR_MESSAGE = 'http.error_message' ;
4744
48- protected options : HttpPluginConfig ;
49-
5045 /** Constructs a new HttpPlugin instance. */
5146 constructor ( moduleName : string ) {
5247 super ( moduleName ) ;
@@ -172,8 +167,7 @@ export class HttpPlugin extends BasePlugin {
172167
173168 const request : httpModule . IncomingMessage = args [ 0 ] ;
174169 const response : httpModule . ServerResponse = args [ 1 ] ;
175- const path = url . parse ( request . url ) . pathname ;
176-
170+ const path = request . url ? url . parse ( request . url ) . pathname || '' : '' ;
177171 plugin . logger . debug ( '%s plugin incomingRequest' , plugin . moduleName ) ;
178172
179173 if ( plugin . isIgnored (
@@ -189,11 +183,13 @@ export class HttpPlugin extends BasePlugin {
189183 }
190184 } ;
191185
192- const traceOptions = {
193- name : path ,
194- kind : SpanKind . SERVER ,
195- spanContext : propagation ? propagation . extract ( getter ) : null
196- } ;
186+ const traceOptions : TraceOptions = { name : path , kind : SpanKind . SERVER } ;
187+ if ( propagation ) {
188+ const spanContext = propagation . extract ( getter ) ;
189+ if ( spanContext ) {
190+ traceOptions . spanContext = spanContext ;
191+ }
192+ }
197193
198194 return plugin . tracer . startRootSpan ( traceOptions , rootSpan => {
199195 if ( ! rootSpan ) return original . apply ( this , arguments ) ;
@@ -209,7 +205,7 @@ export class HttpPlugin extends BasePlugin {
209205 response . end = originalEnd ;
210206 const returned = response . end . apply ( this , arguments ) ;
211207
212- const requestUrl = url . parse ( request . url ) ;
208+ const requestUrl = request . url ? url . parse ( request . url ) : null ;
213209 const host = headers . host || 'localhost' ;
214210 const userAgent =
215211 ( headers [ 'user-agent' ] || headers [ 'User-Agent' ] ) as string ;
@@ -220,12 +216,17 @@ export class HttpPlugin extends BasePlugin {
220216 / ^ ( .* ) ( \: [ 0 - 9 ] { 1 , 5 } ) / ,
221217 '$1' ,
222218 ) ) ;
219+
223220 rootSpan . addAttribute (
224- HttpPlugin . ATTRIBUTE_HTTP_METHOD , request . method ) ;
225- rootSpan . addAttribute (
226- HttpPlugin . ATTRIBUTE_HTTP_PATH , requestUrl . pathname ) ;
227- rootSpan . addAttribute (
228- HttpPlugin . ATTRIBUTE_HTTP_ROUTE , requestUrl . path ) ;
221+ HttpPlugin . ATTRIBUTE_HTTP_METHOD , request . method || 'GET' ) ;
222+
223+ if ( requestUrl ) {
224+ rootSpan . addAttribute (
225+ HttpPlugin . ATTRIBUTE_HTTP_PATH , requestUrl . pathname || '' ) ;
226+ rootSpan . addAttribute (
227+ HttpPlugin . ATTRIBUTE_HTTP_ROUTE , requestUrl . path || '' ) ;
228+ }
229+
229230 rootSpan . addAttribute (
230231 HttpPlugin . ATTRIBUTE_HTTP_USER_AGENT , userAgent ) ;
231232
@@ -267,13 +268,13 @@ export class HttpPlugin extends BasePlugin {
267268 }
268269
269270 // Makes sure the url is an url object
270- let pathname = '' ;
271- let method = 'GET' ;
271+ let pathname ;
272+ let method ;
272273 let origin = '' ;
273274 if ( typeof ( options ) === 'string' ) {
274275 const parsedUrl = url . parse ( options ) ;
275276 options = parsedUrl ;
276- pathname = parsedUrl . pathname ;
277+ pathname = parsedUrl . pathname || '' ;
277278 origin = `${ parsedUrl . protocol || 'http:' } //${ parsedUrl . host } ` ;
278279 } else {
279280 // Do not trace ourselves
@@ -285,9 +286,11 @@ export class HttpPlugin extends BasePlugin {
285286 }
286287
287288 try {
288- pathname = ( options as url . URL ) . pathname ||
289- url . parse ( options . path ) . pathname ;
290- method = options . method ;
289+ pathname = ( options as url . URL ) . pathname ;
290+ if ( ! pathname ) {
291+ pathname = options . path ? url . parse ( options . path ) . pathname : '' ;
292+ }
293+ method = options . method || 'GET' ;
291294 origin = `${ options . protocol || 'http:' } //${ options . host } ` ;
292295 } catch ( e ) {
293296 }
@@ -371,19 +374,25 @@ export class HttpPlugin extends BasePlugin {
371374 const userAgent =
372375 headers ? ( headers [ 'user-agent' ] || headers [ 'User-Agent' ] ) : null ;
373376
374- span . addAttribute ( HttpPlugin . ATTRIBUTE_HTTP_HOST , options . hostname ) ;
377+ if ( options . hostname ) {
378+ span . addAttribute ( HttpPlugin . ATTRIBUTE_HTTP_HOST , options . hostname ) ;
379+ }
375380 span . addAttribute ( HttpPlugin . ATTRIBUTE_HTTP_METHOD , method ) ;
376- span . addAttribute ( HttpPlugin . ATTRIBUTE_HTTP_PATH , options . path ) ;
377- span . addAttribute ( HttpPlugin . ATTRIBUTE_HTTP_ROUTE , options . path ) ;
381+ if ( options . path ) {
382+ span . addAttribute ( HttpPlugin . ATTRIBUTE_HTTP_PATH , options . path ) ;
383+ span . addAttribute ( HttpPlugin . ATTRIBUTE_HTTP_ROUTE , options . path ) ;
384+ }
385+
378386 if ( userAgent ) {
379387 span . addAttribute (
380388 HttpPlugin . ATTRIBUTE_HTTP_USER_AGENT , userAgent . toString ( ) ) ;
381389 }
382- span . addAttribute (
383- HttpPlugin . ATTRIBUTE_HTTP_STATUS_CODE ,
384- response . statusCode . toString ( ) ) ;
385-
386- span . setStatus ( HttpPlugin . parseResponseStatus ( response . statusCode ) ) ;
390+ if ( response . statusCode ) {
391+ span . addAttribute (
392+ HttpPlugin . ATTRIBUTE_HTTP_STATUS_CODE ,
393+ response . statusCode . toString ( ) ) ;
394+ span . setStatus ( HttpPlugin . parseResponseStatus ( response . statusCode ) ) ;
395+ }
387396
388397 // Message Event ID is not defined
389398 span . addMessageEvent (
0 commit comments