-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathgh.go
66 lines (54 loc) · 1.65 KB
/
gh.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main
import (
"context"
"net/http"
"strconv"
"time"
"github.com/google/go-github/v47/github"
"go.opentelemetry.io/otel/trace"
"golang.org/x/oauth2"
)
func createTraces(ctx context.Context, conf configType) error {
var token *http.Client
if len(conf.githubToken) != 0 {
token = oauth2.NewClient(context.Background(), oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: conf.githubToken},
))
}
client := github.NewClient(token)
runID, err := strconv.ParseInt(conf.runID, 10, 64)
if err != nil {
return err
}
workflowData, _, err := client.Actions.GetWorkflowRunByID(ctx, conf.owner, conf.repo, runID)
if err != nil {
return err
}
jobs, _, err := client.Actions.ListWorkflowJobs(ctx, conf.owner, conf.repo, runID, &github.ListWorkflowJobsOptions{})
if err != nil {
return err
}
var lastJobFinishesAt time.Time
ctx, workflowSpan := tracer.Start(ctx, *workflowData.Name, trace.WithTimestamp(workflowData.GetCreatedAt().Time))
for _, job := range jobs.Jobs {
ctx, jobSpan := tracer.Start(ctx, *job.Name, trace.WithTimestamp(job.GetStartedAt().Time))
for _, step := range job.Steps {
_, stepSpan := tracer.Start(ctx, *step.Name, trace.WithTimestamp(step.GetStartedAt().Time))
if step.CompletedAt != nil {
stepSpan.End(trace.WithTimestamp(step.GetCompletedAt().Time))
if step.GetCompletedAt().Time.After(lastJobFinishesAt) {
lastJobFinishesAt = step.GetCompletedAt().Time
}
} else {
stepSpan.End()
}
}
if job.CompletedAt != nil {
jobSpan.End(trace.WithTimestamp(job.GetCompletedAt().Time))
} else {
jobSpan.End()
}
}
workflowSpan.End(trace.WithTimestamp(lastJobFinishesAt))
return nil
}