Skip to content

Commit

Permalink
Add conclusion field to workflow_execution_time_seconds (#162)
Browse files Browse the repository at this point in the history
Signed-off-by: Peter Halasz <peter.halasz@live.com>
  • Loading branch information
peterhalasz committed Feb 1, 2024
1 parent cdfb813 commit d2d9692
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 15 deletions.
8 changes: 4 additions & 4 deletions internal/server/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ var (
Help: "Time that a workflow took to run.",
Buckets: prometheus.ExponentialBuckets(1, 1.4, 30),
},
[]string{"org", "repo", "workflow_name"},
[]string{"org", "repo", "workflow_name", "conclusion"},
)

workflowRunStatusCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
Expand Down Expand Up @@ -110,7 +110,7 @@ type WorkflowObserver interface {
ObserveWorkflowJobDuration(org, repo, state, runnerGroup string, seconds float64)
CountWorkflowJobStatus(org, repo, status, conclusion, runnerGroup string)
CountWorkflowJobDuration(org, repo, status, conclusion, runnerGroup string, seconds float64)
ObserveWorkflowRunDuration(org, repo, workflow string, seconds float64)
ObserveWorkflowRunDuration(org, repo, workflow, conclusion string, seconds float64)
CountWorkflowRunStatus(org, repo, status, conclusion, workflow string)
}

Expand All @@ -131,8 +131,8 @@ func (o *PrometheusObserver) CountWorkflowJobDuration(org, repo, status, conclus
workflowJobDurationCounter.WithLabelValues(org, repo, status, conclusion, runnerGroup).Add(seconds)
}

func (o *PrometheusObserver) ObserveWorkflowRunDuration(org, repo, workflowName string, seconds float64) {
workflowRunHistogramVec.WithLabelValues(org, repo, workflowName).
func (o *PrometheusObserver) ObserveWorkflowRunDuration(org, repo, workflowName, conclusion string, seconds float64) {
workflowRunHistogramVec.WithLabelValues(org, repo, workflowName, conclusion).
Observe(seconds)
}

Expand Down
4 changes: 2 additions & 2 deletions internal/server/workflow_metrics_exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,14 @@ func (c *WorkflowMetricsExporter) CollectWorkflowRunEvent(event *github.Workflow
repo := event.GetRepo().GetName()
org := event.GetRepo().GetOwner().GetLogin()
workflowName := event.GetWorkflow().GetName()
conclusion := event.GetWorkflowRun().GetConclusion()

if event.GetAction() == "completed" {
seconds := event.GetWorkflowRun().UpdatedAt.Time.Sub(event.GetWorkflowRun().RunStartedAt.Time).Seconds()
c.PrometheusObserver.ObserveWorkflowRunDuration(org, repo, workflowName, seconds)
c.PrometheusObserver.ObserveWorkflowRunDuration(org, repo, workflowName, conclusion, seconds)
}

status := event.GetWorkflowRun().GetStatus()
conclusion := event.GetWorkflowRun().GetConclusion()
c.PrometheusObserver.CountWorkflowRunStatus(org, repo, status, conclusion, workflowName)
}

Expand Down
24 changes: 15 additions & 9 deletions internal/server/workflow_metrics_exporter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ func Test_GHActionExporter_HandleGHWebHook_WorkflowJobInProgressEvent(t *testing

// Then
assert.Equal(t, http.StatusAccepted, res.Result().StatusCode)
observer.assetWorkflowJobObservation(workflowJobObservation{
observer.assertWorkflowJobObservation(workflowJobObservation{
org: org,
repo: repo,
state: "queued",
Expand Down Expand Up @@ -274,7 +274,7 @@ func Test_WorkflowMetricsExporter_HandleGHWebHook_WorkflowJobInProgressEventWith

// Then
assert.Equal(t, http.StatusAccepted, res.Result().StatusCode)
observer.assetWorkflowJobObservation(workflowJobObservation{
observer.assertWorkflowJobObservation(workflowJobObservation{
org: org,
repo: repo,
state: "queued",
Expand Down Expand Up @@ -335,7 +335,7 @@ func Test_GHActionExporter_HandleGHWebHook_WorkflowJobCompletedEvent(t *testing.

// Then
assert.Equal(t, http.StatusAccepted, res.Result().StatusCode)
observer.assetWorkflowJobObservation(workflowJobObservation{
observer.assertWorkflowJobObservation(workflowJobObservation{
org: org,
repo: repo,
state: "in_progress",
Expand Down Expand Up @@ -478,6 +478,8 @@ func Test_WorkflowMetricsExporter_HandleGHWebHook_WorkflowRunCompleted(t *testin
runStartTime := time.Unix(1650308740, 0)
runUpdatedTime := runStartTime.Add(time.Duration(expectedRunDuration) * time.Second)
status := "completed"
conclusion := "success"

event := github.WorkflowRunEvent{
Action: github.String("completed"),
Repo: &github.Repository{
Expand All @@ -493,6 +495,7 @@ func Test_WorkflowMetricsExporter_HandleGHWebHook_WorkflowRunCompleted(t *testin
Status: &status,
RunStartedAt: &github.Timestamp{Time: runStartTime},
UpdatedAt: &github.Timestamp{Time: runUpdatedTime},
Conclusion: &conclusion,
},
}
req := testWebhookRequest(t, "/anything", "workflow_run", event)
Expand All @@ -503,17 +506,19 @@ func Test_WorkflowMetricsExporter_HandleGHWebHook_WorkflowRunCompleted(t *testin

// Then
assert.Equal(t, http.StatusAccepted, res.Result().StatusCode)
observer.assetWorkflowRunObservation(workflowRunObservation{
observer.assertWorkflowRunObservation(workflowRunObservation{
org: org,
repo: repo,
workflowName: workflowName,
conclusion: conclusion,
seconds: expectedRunDuration,
}, 50*time.Millisecond)
observer.assertWorkflowRunStatusCount(workflowRunStatusCount{
org: org,
repo: repo,
workflowName: workflowName,
status: status,
conclusion: conclusion,
}, 50*time.Millisecond)
}

Expand Down Expand Up @@ -597,8 +602,8 @@ type workflowJobDurationCount struct {
}

type workflowRunObservation struct {
org, repo, workflowName string
seconds float64
org, repo, workflowName, conclusion string
seconds float64
}

type workflowRunStatusCount struct {
Expand Down Expand Up @@ -658,12 +663,13 @@ func (o *TestPrometheusObserver) CountWorkflowJobDuration(org, repo, status, con
}
}

func (o *TestPrometheusObserver) ObserveWorkflowRunDuration(org, repo, workflowName string, seconds float64) {
func (o *TestPrometheusObserver) ObserveWorkflowRunDuration(org, repo, workflowName, conclusion string, seconds float64) {
o.workflowRunObserved <- workflowRunObservation{
org: org,
repo: repo,
workflowName: workflowName,
seconds: seconds,
conclusion: conclusion,
}
}

Expand All @@ -685,7 +691,7 @@ func (o *TestPrometheusObserver) assertNoWorkflowJobDurationObservation(timeout
}
}

func (o *TestPrometheusObserver) assetWorkflowJobObservation(expected workflowJobObservation, timeout time.Duration) {
func (o *TestPrometheusObserver) assertWorkflowJobObservation(expected workflowJobObservation, timeout time.Duration) {
select {
case <-time.After(timeout):
o.t.Fatal("expected observation but none occurred")
Expand All @@ -712,7 +718,7 @@ func (o *TestPrometheusObserver) assertWorkflowJobDurationCount(expected workflo
}
}

func (o *TestPrometheusObserver) assetWorkflowRunObservation(expected workflowRunObservation, timeout time.Duration) {
func (o *TestPrometheusObserver) assertWorkflowRunObservation(expected workflowRunObservation, timeout time.Duration) {
select {
case <-time.After(timeout):
o.t.Fatal("expected observation but none occurred")
Expand Down

0 comments on commit d2d9692

Please sign in to comment.