Skip to content

Commit a6239ea

Browse files
committed
patch: Improve listing GitLab API resources
1 parent 9480e4d commit a6239ea

19 files changed

+567
-583
lines changed

cmd/catchup.go

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import (
1111
"sync"
1212
"syscall"
1313

14-
"github.com/cluttrdev/cli"
14+
"github.com/alitto/pond"
1515
"github.com/oklog/run"
1616
"github.com/prometheus/client_golang/prometheus"
1717
"github.com/prometheus/client_golang/prometheus/collectors"
1818

19-
"github.com/cluttrdev/gitlab-exporter/pkg/worker"
19+
"github.com/cluttrdev/cli"
2020

2121
"github.com/cluttrdev/gitlab-exporter/internal/config"
2222
"github.com/cluttrdev/gitlab-exporter/internal/exporter"
@@ -104,25 +104,11 @@ func (c *CatchUpConfig) Exec(ctx context.Context, args []string) error {
104104

105105
g := &run.Group{}
106106

107-
pool := worker.NewWorkerPool(42)
108-
{ // worker pool
109-
ctx, cancel := context.WithCancel(context.Background())
110-
111-
g.Add(func() error { // execute
112-
slog.Info("Starting worker pool")
113-
pool.Start(ctx)
114-
<-ctx.Done()
115-
return ctx.Err()
116-
}, func(err error) { // interrupt
117-
defer cancel()
118-
slog.Info("Stopping worker pool...")
119-
pool.Stop()
120-
slog.Info("Stopping worker pool... done")
121-
})
122-
}
123-
124107
if len(cfg.Projects) > 0 { // jobs
125-
ctx, cancel := context.WithCancel(context.Background())
108+
ctxJobs, cancelJobs := context.WithCancel(context.Background())
109+
110+
slog.Info("Starting worker pool")
111+
pool := pond.New(42, 1024, pond.Context(ctxJobs))
126112

127113
g.Add(func() error { // execute
128114
var wg sync.WaitGroup
@@ -149,8 +135,12 @@ func (c *CatchUpConfig) Exec(ctx context.Context, args []string) error {
149135
return nil
150136
}, func(err error) { // interrupt
151137
slog.Info("Cancelling jobs...")
152-
cancel()
153-
<-ctx.Done()
138+
cancelJobs()
139+
140+
slog.Info("Stopping worker pool...")
141+
pool.StopAndWait()
142+
slog.Info("Stopping worker pool... done")
143+
154144
slog.Info("Cancelling jobs... done")
155145
})
156146
} else {

cmd/fetch_pipeline.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ func (c *FetchPipelineConfig) Exec(ctx context.Context, args []string) error {
8989
FetchSections: c.fetchSections,
9090
}
9191

92-
phr := <-glc.GetPipelineHierarchy(ctx, projectID, pipelineID, opt)
93-
if err := phr.Error; err != nil {
92+
phr, err := glc.GetPipelineHierarchy(ctx, projectID, pipelineID, opt)
93+
if err != nil {
9494
return fmt.Errorf("error fetching pipeline hierarchy: %w", err)
9595
}
9696
ph := phr.PipelineHierarchy

cmd/run.go

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"sync"
1717
"syscall"
1818

19+
"github.com/alitto/pond"
1920
"github.com/oklog/run"
2021
"github.com/prometheus/client_golang/prometheus"
2122
"github.com/prometheus/client_golang/prometheus/collectors"
@@ -24,8 +25,6 @@ import (
2425

2526
"github.com/cluttrdev/cli"
2627

27-
"github.com/cluttrdev/gitlab-exporter/pkg/worker"
28-
2928
"github.com/cluttrdev/gitlab-exporter/internal/config"
3029
"github.com/cluttrdev/gitlab-exporter/internal/exporter"
3130
"github.com/cluttrdev/gitlab-exporter/internal/gitlab"
@@ -134,6 +133,7 @@ func (c *RunConfig) Exec(ctx context.Context, _ []string) error {
134133
}
135134

136135
// gather projects from config
136+
slog.Info("Resolving projects to export...")
137137
projects, err := resolveProjects(ctx, cfg, gitlabclient)
138138
if err != nil {
139139
return fmt.Errorf("error resolving projects: %w", err)
@@ -155,25 +155,12 @@ func (c *RunConfig) Exec(ctx context.Context, _ []string) error {
155155

156156
g := &run.Group{}
157157

158-
pool := worker.NewWorkerPool(42)
159-
{ // worker pool
160-
ctx, cancel := context.WithCancel(context.Background())
161-
162-
g.Add(func() error { // execute
163-
slog.Info("Starting worker pool")
164-
pool.Start(ctx)
165-
<-ctx.Done()
166-
return ctx.Err()
167-
}, func(err error) { // interrupt
168-
defer cancel()
169-
slog.Info("Stopping worker pool...")
170-
pool.Stop()
171-
slog.Info("Stopping worker pool... done")
172-
})
173-
}
174-
175158
if len(projects) > 0 { // jobs
176-
ctx, cancel := context.WithCancel(context.Background())
159+
slog.Info(fmt.Sprintf("Found %d projects to export", len(projects)))
160+
ctxJobs, cancelJobs := context.WithCancel(context.Background())
161+
162+
slog.Info("Starting worker pool")
163+
pool := pond.New(42, 1024, pond.Context(ctxJobs))
177164

178165
g.Add(func() error { // execute
179166
var wg sync.WaitGroup
@@ -189,7 +176,7 @@ func (c *RunConfig) Exec(ctx context.Context, _ []string) error {
189176
wg.Add(1)
190177
go func() {
191178
defer wg.Done()
192-
job.Run(ctx)
179+
job.Run(ctxJobs)
193180
}()
194181
}
195182

@@ -203,16 +190,15 @@ func (c *RunConfig) Exec(ctx context.Context, _ []string) error {
203190
wg.Add(1)
204191
go func() {
205192
defer wg.Done()
206-
job.Run(ctx)
193+
job.Run(ctxJobs)
207194
}()
208195
}
209196

210197
wg.Wait()
211198
return nil
212199
}, func(err error) { // interrupt
213200
slog.Info("Cancelling jobs...")
214-
cancel()
215-
<-ctx.Done()
201+
cancelJobs()
216202
slog.Info("Cancelling jobs... done")
217203
})
218204
} else {
@@ -296,43 +282,47 @@ func serveHTTP(cfg config.HTTP, reg *prometheus.Registry) (func() error, func(er
296282
}
297283

298284
func resolveProjects(ctx context.Context, cfg config.Config, glab *gitlab.Client) ([]config.Project, error) {
299-
pm := make(map[int64]config.Project)
285+
projectConfigs := make(map[int64]config.Project)
300286

301287
opt := gitlab.ListNamespaceProjectsOptions{}
302288
for _, namespace := range cfg.Namespaces {
303289
opt.Kind = namespace.Kind
304-
opt.Visibility = (*gitlab.VisibilityValue)(&namespace.Visibility)
290+
opt.Visibility = (*_gitlab.VisibilityValue)(&namespace.Visibility)
305291
opt.WithShared = namespace.WithShared
306292
opt.IncludeSubgroups = namespace.IncludeSubgroups
307293

308-
ps, err := glab.ListNamespaceProjects(ctx, namespace.Id, opt)
309-
if err != nil {
310-
return nil, err
311-
}
312-
313-
for _, p := range ps {
314-
pm[p.Id] = config.Project{
315-
ProjectSettings: namespace.ProjectSettings,
316-
Id: p.Id,
294+
err := glab.ListNamespaceProjects(ctx, namespace.Id, opt, func(projects []*_gitlab.Project) bool {
295+
for _, project := range projects {
296+
projectID := int64(project.ID)
297+
projectConfigs[projectID] = config.Project{
298+
ProjectSettings: namespace.ProjectSettings,
299+
Id: projectID,
300+
}
317301
}
318-
}
319302

320-
for _, pid := range namespace.ExcludeProjects {
321-
p, _, err := glab.Client().Projects.GetProject(pid, nil, _gitlab.WithContext(ctx))
322-
if err != nil {
323-
return nil, fmt.Errorf("error getting project %q: %w", pid, err)
303+
for _, pid := range namespace.ExcludeProjects {
304+
p, _, err := glab.Client().Projects.GetProject(pid, nil, _gitlab.WithContext(ctx))
305+
if err != nil {
306+
slog.Error("error getting namespace project", "namespace_id", namespace.Id, "project", pid, "error", err)
307+
return false
308+
}
309+
delete(projectConfigs, int64(p.ID))
324310
}
325-
delete(pm, int64(p.ID))
311+
312+
return true
313+
})
314+
if err != nil {
315+
return nil, err
326316
}
327317
}
328318

329319
// overwrite with explicitly configured projects
330320
for _, p := range cfg.Projects {
331-
pm[p.Id] = p
321+
projectConfigs[p.Id] = p
332322
}
333323

334-
projects := make([]config.Project, 0, len(pm))
335-
for _, p := range pm {
324+
projects := make([]config.Project, 0, len(projectConfigs))
325+
for _, p := range projectConfigs {
336326
projects = append(projects, p)
337327
}
338328

configs/gitlab-exporter.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ project_defaults:
3838
# requires fetching entire job logs to parse for embedded metrics.
3939
enabled: true
4040

41-
note_events: true
42-
4341
mergerequests:
4442
# Whether or not to export merge request data
4543
enabled: true
44+
45+
note_events: true
4646

4747
catch_up:
4848
# Whether to export data from past pipelines at startup.

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/cluttrdev/gitlab-exporter
33
go 1.22
44

55
require (
6+
github.com/alitto/pond v1.9.2
67
github.com/cluttrdev/cli v0.0.0-20240318153739-b60d492ac8ff
78
github.com/creasty/defaults v1.7.0
89
github.com/google/go-cmp v0.6.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
3333
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
3434
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3535
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
36+
github.com/alitto/pond v1.9.2 h1:9Qb75z/scEZVCoSU+osVmQ0I0JOeLfdTDafrbcJ8CLs=
37+
github.com/alitto/pond v1.9.2/go.mod h1:xQn3P/sHTYcU/1BR3i86IGIrilcrGC2LiS+E2+CJWsI=
3638
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
3739
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
3840
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=

0 commit comments

Comments
 (0)