@@ -20,6 +20,8 @@ import * as shimmer from 'shimmer';
2020import { Parameters , KoaMiddleware , KoaContext , KoaComponentName } from './types' ;
2121import { VERSION } from './version' ;
2222import { getMiddlewareMetadata } from './utils' ;
23+ // import { Layer } from '@koa/router';
24+ import Router = require( '@koa/router' ) ;
2325
2426
2527/** Koa instrumentation plugin for OpenTelemetry */
@@ -63,38 +65,77 @@ export class KoaPlugin extends BasePlugin<typeof koa> {
6365 middlewareFunction : KoaMiddleware ,
6466 ...args : Parameters < typeof original >
6567 ) {
66-
67- var oldMiddleware = middlewareFunction ;
68- var patchedFunction = plugin . _patchLayer ( oldMiddleware ) ;
68+ console . log ( "mw name: " + middlewareFunction . name ) ;
69+ var isRouterDispatch = middlewareFunction . name == "dispatch" ;
70+ isRouterDispatch = ( middlewareFunction as any ) . router ;
71+ var patchedFunction ;
72+ if ( isRouterDispatch ) {
73+ patchedFunction = plugin . _patchRoutes ( middlewareFunction ) ;
74+ } else {
75+ patchedFunction = plugin . _patchLayer ( middlewareFunction , false ) ;
76+ }
6977 const route = original . apply ( this , [ patchedFunction ] ) ;
70- // var lastLayer = route.middleware[route.middleware.length - 1];
7178
7279 return route ;
80+
7381 // tslint:disable-next-line:no-any
7482 } as any ;
7583
7684 }
7785
78- private _patchLayer ( middlewareLayer : KoaMiddleware ) {
86+ private _patchLayer ( middlewareLayer : KoaMiddleware , isRouter : boolean , layerName ?: string ) {
7987 const plugin = this ;
88+ console . log ( ".....setting up span patch for: " + layerName ?? middlewareLayer . name ) ;
8089 const patchedLayer = ( context : KoaContext , next : koa . Next ) => {
8190 const currentSpan = this . _tracer . getCurrentSpan ( ) ;
8291 if ( ! currentSpan ) {
8392 console . log ( '--- No current span' ) ;
8493 }
8594
8695 const metadata = getMiddlewareMetadata ( context ) ;
87- const span = plugin . _tracer . startSpan ( metadata . name , {
96+ var spanName = layerName ?? middlewareLayer . name ;
97+ if ( ! spanName ) {
98+ spanName = metadata . name ;
99+ }
100+ const span = plugin . _tracer . startSpan ( spanName , {
88101 attributes : metadata . attributes ,
89102 } ) ;
90-
91103 var result = middlewareLayer ( context , next ) ;
92104 span . end ( ) ;
93105 return result ;
94-
95106 }
96107 return patchedLayer ;
97108 }
109+
110+
111+ private _patchRoutes ( dispatchLayer : KoaMiddleware ) {
112+ const plugin = this ;
113+ console . log ( ".....set up" ) ;
114+
115+ var smth = ( dispatchLayer as any ) ;
116+ var router = smth . router as Router ;
117+
118+ var routesStack = router . stack ;
119+ for ( var i = 0 ; i < routesStack . length ; i ++ ) {
120+ var pathLayer : Router . Layer = routesStack [ i ] ;
121+ var path = pathLayer . path ;
122+ var pathStack = pathLayer . stack ;
123+ for ( var j = 0 ; j < pathStack . length ; j ++ ) {
124+ var pop = pathStack [ j ] ;
125+ var newpop = plugin . _patchLayer ( pop , true , path ) ;
126+ pathStack [ j ] = newpop ;
127+ }
128+ }
129+
130+ const dispatcher = ( context : KoaContext , next : koa . Next ) => {
131+ console . log ( ".....dispatching" ) ;
132+ var result = smth ( context , next ) ;
133+ return result ;
134+ }
135+ return dispatcher ;
136+
137+ }
138+
98139}
99140
100141export const plugin = new KoaPlugin ( KoaPlugin . component ) ;
0 commit comments