1
1
import { createHook } from "node:async_hooks" ;
2
2
import { singleton } from "./utils/singleton" ;
3
3
import { tracer } from "./v3/tracer.server" ;
4
+ import { env } from "./env.server" ;
5
+ import { context , Context } from "@opentelemetry/api" ;
4
6
5
- const THRESHOLD_NS = 1e8 ; // 100ms
7
+ const THRESHOLD_NS = env . EVENT_LOOP_MONITOR_THRESHOLD_MS * 1e6 ;
6
8
7
- const cache = new Map < number , { type : string ; start ?: [ number , number ] } > ( ) ;
9
+ const cache = new Map < number , { type : string ; start ?: [ number , number ] ; parentCtx ?: Context } > ( ) ;
8
10
9
11
function init ( asyncId : number , type : string , triggerAsyncId : number , resource : any ) {
10
12
cache . set ( asyncId , {
@@ -26,6 +28,7 @@ function before(asyncId: number) {
26
28
cache . set ( asyncId , {
27
29
...cached ,
28
30
start : process . hrtime ( ) ,
31
+ parentCtx : context . active ( ) ,
29
32
} ) ;
30
33
}
31
34
@@ -47,13 +50,17 @@ function after(asyncId: number) {
47
50
if ( diffNs > THRESHOLD_NS ) {
48
51
const time = diffNs / 1e6 ; // in ms
49
52
50
- const newSpan = tracer . startSpan ( "event-loop-blocked" , {
51
- startTime : new Date ( new Date ( ) . getTime ( ) - time ) ,
52
- attributes : {
53
- asyncType : cached . type ,
54
- label : "EventLoopMonitor" ,
53
+ const newSpan = tracer . startSpan (
54
+ "event-loop-blocked" ,
55
+ {
56
+ startTime : new Date ( new Date ( ) . getTime ( ) - time ) ,
57
+ attributes : {
58
+ asyncType : cached . type ,
59
+ label : "EventLoopMonitor" ,
60
+ } ,
55
61
} ,
56
- } ) ;
62
+ cached . parentCtx
63
+ ) ;
57
64
58
65
newSpan . end ( ) ;
59
66
}
0 commit comments