@@ -43,40 +43,60 @@ def get_sampled_workflow_metrics(github_repo: github.Repository):
43
43
Returns a list of GaugeMetric objects, containing the relevant metrics about
44
44
the workflow
45
45
"""
46
+ queued_job_counts = {}
47
+ running_job_counts = {}
46
48
47
49
# Other states are available (pending, waiting, etc), but the meaning
48
50
# is not documented (See #70540).
49
51
# "queued" seems to be the info we want.
50
- queued_workflow_count = len (
51
- [
52
- x
53
- for x in github_repo .get_workflow_runs (status = "queued" )
54
- if x .name in WORKFLOWS_TO_TRACK
55
- ]
56
- )
57
- running_workflow_count = len (
58
- [
59
- x
60
- for x in github_repo .get_workflow_runs (status = "in_progress" )
61
- if x .name in WORKFLOWS_TO_TRACK
62
- ]
63
- )
52
+ for queued_workflow in github_repo .get_workflow_runs (status = "queued" ):
53
+ if queued_workflow .name not in WORKFLOWS_TO_TRACK :
54
+ continue
55
+ for queued_workflow_job in queued_workflow .jobs ():
56
+ job_name = queued_workflow_job .name
57
+ # Workflows marked as queued can potentially only have some jobs
58
+ # queued, so make sure to also count jobs currently in progress.
59
+ if queued_workflow_job .status == "queued" :
60
+ if job_name not in queued_job_counts :
61
+ queued_job_counts [job_name ] = 1
62
+ else :
63
+ queued_job_counts [job_name ] += 1
64
+ elif queued_workflow_job .status == "in_progress" :
65
+ if job_name not in running_job_counts :
66
+ running_job_counts [job_name ] = 1
67
+ else :
68
+ running_job_counts [job_name ] += 1
69
+
70
+ for running_workflow in github_repo .get_workflow_runs (status = "in_progress" ):
71
+ if running_workflow .name not in WORKFLOWS_TO_TRACK :
72
+ continue
73
+ for running_workflow_job in running_workflow .jobs ():
74
+ job_name = running_workflow_job .name
75
+ if running_workflow_job .status != "in_progress" :
76
+ continue
77
+
78
+ if job_name not in running_job_counts :
79
+ running_job_counts [job_name ] = 1
80
+ else :
81
+ running_job_counts [job_name ] += 1
64
82
65
83
workflow_metrics = []
66
- workflow_metrics .append (
67
- GaugeMetric (
68
- "workflow_queue_size" ,
69
- queued_workflow_count ,
70
- time .time_ns (),
84
+ for queued_job in queued_job_counts :
85
+ workflow_metrics .append (
86
+ GaugeMetric (
87
+ f"workflow_queue_size_{ queued_job } " ,
88
+ queued_job_counts [queued_job ],
89
+ time .time_ns (),
90
+ )
71
91
)
72
- )
73
- workflow_metrics .append (
74
- GaugeMetric (
75
- "running_workflow_count" ,
76
- running_workflow_count ,
77
- time .time_ns (),
92
+ for running_job in running_job_counts :
93
+ workflow_metrics .append (
94
+ GaugeMetric (
95
+ f"running_workflow_count_{ running_job } " ,
96
+ running_job_counts [running_job ],
97
+ time .time_ns (),
98
+ )
78
99
)
79
- )
80
100
# Always send a hearbeat metric so we can monitor is this container is still able to log to Grafana.
81
101
workflow_metrics .append (
82
102
GaugeMetric ("metrics_container_heartbeat" , 1 , time .time_ns ())
0 commit comments