1
1
import axios from 'axios' ;
2
2
3
3
import { Config } from './config' ;
4
- import { getRepo } from './utils' ;
4
+ import { getRepo , shuffleArrayInPlace } from './utils' ;
5
5
import { ScaleUpChronMetrics } from './metrics' ;
6
6
import { getRunnerTypes } from './gh-runners' ;
7
7
import { sqsSendMessages } from './sqs' ;
8
- import { ActionRequestMessage } from './scale-up' ;
8
+ import { ActionRequestMessage , scaleUp } from './scale-up' ;
9
9
import { randomUUID } from 'crypto' ;
10
10
11
11
export async function scaleUpChron ( ) : Promise < void > {
@@ -14,12 +14,13 @@ export async function scaleUpChron(): Promise<void> {
14
14
// 2. Polls scale-config to filter the list to ones that are self-hosted by this fleet and
15
15
// are ephemeral
16
16
// 3. Sends a SQS request to the scale-up lambda to provision more of those instances
17
- let queuedJobs = await getQueuedJobs ( ) ;
17
+ const metrics = new ScaleUpChronMetrics ( ) ;
18
+
19
+ let queuedJobs = await getQueuedJobs ( metrics ) ;
18
20
19
21
const scaleConfigRepo = getRepo ( Config . Instance . scaleConfigOrg , Config . Instance . scaleConfigRepo ) ;
20
22
21
23
22
- const metrics = new ScaleUpChronMetrics ( ) ;
23
24
const validRunnerTypes = await getRunnerTypes ( scaleConfigRepo , metrics ) ;
24
25
25
26
const minAutoScaleupDelayMinutes = 30 ;
@@ -51,7 +52,15 @@ export async function scaleUpChron(): Promise<void> {
51
52
throw new Error ( 'scaleUpRecordQueueUrl is not set. Cannot send scale up requests' ) ;
52
53
}
53
54
54
- await sqsSendMessages ( metrics , scaleUpRequests , Config . Instance . scaleUpRecordQueueUrl ) ;
55
+ for ( const request of shuffleArrayInPlace ( scaleUpRequests ) ) {
56
+ try {
57
+ await scaleUp ( "aws:sqs" , request , metrics ) ;
58
+ metrics . scaleUpChronSuccess ( ) ;
59
+
60
+ } catch ( error ) {
61
+ metrics . scaleUpChronFailure ( ( error as Error ) . message ) ;
62
+ }
63
+
55
64
}
56
65
57
66
class QueuedJobsForRunner {
@@ -72,7 +81,7 @@ class QueuedJobsForRunner {
72
81
}
73
82
}
74
83
75
- export async function getQueuedJobs ( ) : Promise < QueuedJobsForRunner [ ] > {
84
+ export async function getQueuedJobs ( metrics : ScaleUpChronMetrics ) : Promise < QueuedJobsForRunner [ ] > {
76
85
// This function queries the HUD for queued runners
77
86
// and returns a list of them
78
87
@@ -83,6 +92,7 @@ export async function getQueuedJobs(): Promise<QueuedJobsForRunner[]> {
83
92
84
93
// Map the response to the class
85
94
const queued_runners = response . data . map ( ( runner : any ) => {
95
+ metrics . queuedRunnerStats ( runner . org , runner . runner_label , runner . num_queued_jobs , ) ;
86
96
return new QueuedJobsForRunner (
87
97
runner . runner_label ,
88
98
runner . org ,
@@ -93,6 +103,7 @@ export async function getQueuedJobs(): Promise<QueuedJobsForRunner[]> {
93
103
} ) ;
94
104
return queued_runners ;
95
105
} catch ( error ) {
106
+ metrics . queuedRunnerFailure ( ( error as Error ) . message ) ;
96
107
console . error ( 'Error fetching queued runners:' , error ) ;
97
108
return [ ] ;
98
109
}
0 commit comments