Skip to content

Commit 2bdff20

Browse files
adrianrioboclaude
andcommitted
feat(gitlab): runner configuration and OTel trace correlation
- fix: use project name as runner name instead of hostname - feat: correlate CI job logs with OTel traces via journald; when both GitLab runner and OTel are configured, Podman uses the journald log driver so CI job output is captured by systemd journal; otelcol gains a journald/gitlab-jobs receiver that parses job_id, project_id, and runner_token for cross-stream correlation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 97520f4 commit 2bdff20

7 files changed

Lines changed: 46 additions & 20 deletions

File tree

pkg/integrations/gitlab/glrunner.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ func (args *GitLabRunnerArgs) GetUserDataValues() *integrations.UserDataValues {
4444
return nil
4545
}
4646
return &integrations.UserDataValues{
47-
Name: args.Name,
48-
Token: args.AuthToken, // Use auth token (set by Pulumi during deployment)
49-
CliURL: downloadURL(),
50-
RepoURL: args.URL,
51-
Unsecure: args.Unsecure,
52-
Concurrent: args.Concurrent,
47+
Name: args.Name,
48+
Token: args.AuthToken, // Use auth token (set by Pulumi during deployment)
49+
CliURL: downloadURL(),
50+
RepoURL: args.URL,
51+
Unsecure: args.Unsecure,
52+
Concurrent: args.Concurrent,
53+
LogToJournald: args.LogToJournald,
5354
}
5455
}
5556

pkg/integrations/gitlab/snippet-darwin.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ sudo gitlab-runner register \
88
--non-interactive \
99
--url "{{ .RepoURL }}" \
1010
--token "{{ .Token }}" \
11+
--name "{{ .Name }}" \
1112
--executor "shell"
1213

1314
# Install and start as LaunchDaemon

pkg/integrations/gitlab/snippet-windows.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ C:\GitLab-Runner\gitlab-runner.exe register `
77
--non-interactive `
88
--url "{{ .RepoURL }}" `
99
--token "{{ .Token }}" `
10+
--name "{{ .Name }}" `
1011
--executor "shell"
1112

1213
# Install and start as Windows service

pkg/integrations/gitlab/types.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type GitLabRunnerArgs struct {
2626
Arch *Arch // Target architecture
2727
User string // OS user to run as (only used when Unsecure is true)
2828
AuthToken string // Runner authentication token (set by Pulumi during deployment)
29-
Unsecure bool // When false (default) a dedicated gitlab-runner system user is created; when true the runner service runs as User
30-
Concurrent int // Maximum number of concurrent jobs (written to config.toml; 0 means leave at default of 1)
29+
Unsecure bool // When false (default) a dedicated gitlab-runner system user is created; when true the runner service runs as User
30+
Concurrent int // Maximum number of concurrent jobs (written to config.toml; 0 means leave at default of 1)
31+
LogToJournald bool // When true, sets Podman log_driver=journald so CI job output is captured by systemd journal for OTel correlation
3132
}

pkg/integrations/integrations.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@ import (
66
)
77

88
type UserDataValues struct {
9-
CliURL string
10-
User string
11-
Name string
12-
Token string
13-
Labels string
14-
Port string
15-
RepoURL string
16-
Executor string
17-
Unsecure bool
18-
Concurrent int
9+
CliURL string
10+
User string
11+
Name string
12+
Token string
13+
Labels string
14+
Port string
15+
RepoURL string
16+
Executor string
17+
Unsecure bool
18+
Concurrent int
19+
LogToJournald bool
1920
}
2021

2122
type IntegrationConfig interface {

pkg/integrations/otelcol/snippet-linux.sh

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,31 @@ receivers:
143143
- type: remove
144144
id: remove_file_name
145145
field: attributes["log.file.name"]
146+
- type: regex_parser
147+
id: parse_job_id
148+
parse_from: body
149+
regex: '\bjob=(?P<job_id>\d+)'
150+
on_error: send
151+
- type: regex_parser
152+
id: parse_runner_token
153+
parse_from: body
154+
regex: '\brunner=(?P<runner_token>\w+)'
155+
on_error: send
146156
attributes:
147157
index: "{{.Index}}"
148158
_sourceCategory: gitlab-runner
149159
_sourceHost: ${env:HOSTNAME}
160+
journald/gitlab-jobs:
161+
operators:
162+
- type: regex_parser
163+
id: parse_container_name
164+
parse_from: attributes["CONTAINER_NAME"]
165+
regex: '^runner-(?P<runner_token>.+?)-project-(?P<project_id>\d+)-concurrent-(?P<concurrent_id>\d+)-(?P<job_id>\d+)$'
166+
on_error: send
167+
attributes:
168+
index: "{{.Index}}"
169+
_sourceCategory: gitlab-runner-jobs
170+
_sourceHost: ${env:HOSTNAME}
150171
{{- end}}
151172
processors:
152173
filter/drop_null_bytes:
@@ -185,7 +206,7 @@ service:
185206
level: "basic"
186207
pipelines:
187208
logs:
188-
receivers: [filelog/syslog, filelog/secure, filelog/audit{{if .MonitorGitLabRunner}}, filelog/gitlab-runner{{end}}]
209+
receivers: [filelog/syslog, filelog/secure, filelog/audit{{if .MonitorGitLabRunner}}, filelog/gitlab-runner, journald/gitlab-jobs{{end}}]
189210
processors: [filter/drop_null_bytes, resource, batch]
190211
exporters: [otlphttp]
191212
OTELEOF

pkg/manager/context/context.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ func manageIntegration(c *Context, ca *ContextArgs) error {
191191
cirrus.Init(ca.CirrusPWArgs)
192192
}
193193
if ca.GLRunnerArgs != nil {
194-
ca.GLRunnerArgs.Name = c.RunID()
194+
ca.GLRunnerArgs.Name = c.ProjectName()
195195
gitlab.Init(ca.GLRunnerArgs)
196196
}
197197
return nil

0 commit comments

Comments
 (0)