@@ -4,6 +4,7 @@ import { Redis } from "ioredis";
4
4
5
5
import { logger } from "@/logger" ;
6
6
import { RedisService } from "@/redis/redis.service" ;
7
+ import { MetricsService } from "@/metrics/metrics.service" ;
7
8
8
9
import { JudgeTaskService } from "./judge-task-service.interface" ;
9
10
import { JudgeTaskProgress } from "./judge-task-progress.interface" ;
@@ -28,6 +29,10 @@ export interface JudgeTaskMeta {
28
29
type : JudgeTaskType ;
29
30
}
30
31
32
+ export interface QueuedJudgeTaskMeta extends JudgeTaskMeta {
33
+ enqueueTime : number ;
34
+ }
35
+
31
36
// eslint-disable-next-line @typescript-eslint/no-empty-interface
32
37
export interface JudgeTaskExtraInfo { }
33
38
@@ -61,11 +66,17 @@ export class JudgeQueueService {
61
66
private readonly taskServices : Map < JudgeTaskType , JudgeTaskService < JudgeTaskProgress , JudgeTaskExtraInfo > > =
62
67
new Map ( ) ;
63
68
64
- constructor ( private readonly redisService : RedisService ) {
69
+ constructor ( private readonly redisService : RedisService , private readonly metricsService : MetricsService ) {
65
70
this . redisForPush = this . redisService . getClient ( ) ;
66
71
this . redisForConsume = this . redisService . getClient ( ) ;
67
72
}
68
73
74
+ private readonly metricJudgeTaskQueueTime = this . metricsService . histogram (
75
+ "syzoj_ng_judge_task_queue_time_seconds" ,
76
+ this . metricsService . histogram . BUCKETS_TIME_10M_30 ,
77
+ [ "type" , "priority_type" ]
78
+ ) ;
79
+
69
80
registerTaskType < TaskProgress > (
70
81
taskType : JudgeTaskType ,
71
82
service : JudgeTaskService < TaskProgress , JudgeTaskExtraInfo >
@@ -81,7 +92,8 @@ export class JudgeQueueService {
81
92
priority ,
82
93
JSON . stringify ( {
83
94
taskId,
84
- type
95
+ type,
96
+ enqueueTime : Date . now ( )
85
97
} )
86
98
) ;
87
99
}
@@ -102,7 +114,8 @@ export class JudgeQueueService {
102
114
103
115
const [ , taskJson , priorityString ] = redisResponse ;
104
116
const priority = Number ( priorityString ) ;
105
- const taskMeta : JudgeTaskMeta = JSON . parse ( taskJson ) ;
117
+ const taskMeta : QueuedJudgeTaskMeta = JSON . parse ( taskJson ) ;
118
+ const dequeuedTime = Date . now ( ) ;
106
119
const task = await this . taskServices . get ( taskMeta . type ) . getTaskToBeSentToJudgeByTaskId ( taskMeta . taskId , priority ) ;
107
120
if ( ! task ) {
108
121
logger . verbose (
@@ -111,6 +124,16 @@ export class JudgeQueueService {
111
124
return null ;
112
125
}
113
126
127
+ if ( taskMeta . enqueueTime ) {
128
+ this . metricJudgeTaskQueueTime . observe (
129
+ {
130
+ type : task . type ,
131
+ priority_type : task . priorityType
132
+ } ,
133
+ ( Date . now ( ) - dequeuedTime ) / 1000
134
+ ) ;
135
+ }
136
+
114
137
logger . verbose (
115
138
`Consumed judge task { taskId: ${ task . taskId } , type: ${ task . type } , priority: ${ priority } (${
116
139
JudgeTaskPriorityType [ task . priorityType ]
0 commit comments