Skip to content

Commit d4f2563

Browse files
authored
Fix the linting action to work appropriately in github actions. (#2976)
* Work on the linting action * Update golangci config file for renamed skip-dirs * move timeout change into golangci config file * Start linting * Disable linting of const in tests * Remove errgroup as recommended by depguard * Fix missed refactor of deprecated type * Fix test of refactored code * More linting * additional linting * Appease linter * linting linting * Fix tests and more linting * ensure that remotecfg ticket stops even if registerCollector fails * remove errGroup/run and just use wg. Add nolints, one last refactor * Fix nolint * Syntax linting * syntax linting * ensure the remotecfg ticker stops and doesn't get stopped twice on a re-evaluation * Use concurrent safe multierr append * Re-add alloylint make target * Fix accidental propagation of context canceled error * Revert "Use concurrent safe multierr append" This reverts commit 7ce27b5. * Add errors together concurrent-safe * move experimental lint -> lint * Refactor ticker handling in remotecfg * Remove unnecessary mutex locks
1 parent 1a0c9a7 commit d4f2563

File tree

137 files changed

+610
-597
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+610
-597
lines changed

.github/workflows/test_pr.yml

+10-13
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,24 @@ jobs:
55
lint:
66
name: Lint
77
runs-on: ubuntu-latest
8-
container:
9-
# The build image contains golangci-lint.
10-
image: grafana/alloy-build-image:v0.1.8
118
steps:
129
- name: Checkout code
1310
uses: actions/checkout@v4
14-
15-
- name: Set ownership
16-
# https://github.com/actions/runner/issues/2033#issuecomment-1204205989
17-
run: |
18-
# this is to fix GIT not liking owner of the checkout dir
19-
chown -R $(id -u):$(id -g) $PWD
20-
2111
- name: Set up Go 1.23
2212
uses: actions/setup-go@v5
2313
with:
2414
go-version-file: go.mod
2515
cache: false
26-
27-
- run: apt-get update -y && apt-get install -y libsystemd-dev
28-
- run: make lint
16+
- name: golangci-lint
17+
uses: golangci/golangci-lint-action@v6
18+
with:
19+
version: v1.64.7
20+
- name: golangci-lint-syntax
21+
uses: golangci/golangci-lint-action@v6
22+
with:
23+
version: v1.64.7
24+
working-directory: ./syntax/
25+
- run: make run-alloylint
2926

3027
test_linux:
3128
name: Test Linux

.golangci.yml

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
# Full list of configuration options: https://golangci-lint.run/usage/configuration/
22

33
run:
4-
timeout: 5m
5-
skip-dirs:
6-
- component/pyroscope/scrape/internal/fastdelta
7-
- component/pyroscope/scrape/internal/pproflite
4+
timeout: 10m
85

96
output:
107
sort-results: true
@@ -26,13 +23,20 @@ linters:
2623
- typecheck # Ensure code typechecks
2724
- depguard # Allow/denylist specific imports
2825
- makezero # Detect misuse of make with non-zero length and append
29-
- tenv # Use testing.(*T).Setenv instead of os.Setenv
26+
- usetesting # Use testing.(*T).Setenv instead of os.Setenv
3027
- whitespace # Report unnecessary blank lines
3128

3229
issues:
30+
max-same-issues: 0
31+
max-issues-per-linter: 0
32+
3333
# We want to use our own exclusion rules and ignore all the defaults.
3434
exclude-use-default: false
3535

36+
exclude-dirs:
37+
- component/pyroscope/scrape/internal/fastdelta
38+
- component/pyroscope/scrape/internal/pproflite
39+
3640
exclude-rules:
3741
# It's fine if tests ignore errors.
3842
- path: _test.go
@@ -83,6 +87,8 @@ linters-settings:
8387
# at a glance.
8488
multi-if: true
8589
multi-func: true
90+
goconst:
91+
ignore-tests: true
8692

8793
revive:
8894
rules:

Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ lint: alloylint
136136
find . -name go.mod -execdir golangci-lint run -v --timeout=10m \;
137137
$(ALLOYLINT_BINARY) ./...
138138

139+
.PHONY: run-alloylint
140+
run-alloylint: alloylint
141+
$(ALLOYLINT_BINARY) ./...
142+
139143
.PHONY: test
140144
# We have to run test twice: once for all packages with -race and then once
141145
# more without -race for packages that have known race detection issues. The

internal/alloycli/automemlimit_cgroups_unsupported.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ import (
1313
"github.com/grafana/alloy/internal/runtime/logging"
1414
)
1515

16-
func applyAutoMemLimit(l *logging.Logger) {
16+
func applyAutoMemLimit(l *logging.Logger) error {
1717
// For non-linux builds without cgroups, memlimit will always report an error.
1818
// However, if the system experiment is requested, we can use the system memory limit provider.
1919
// This logic is similar to https://github.com/KimMachineGun/automemlimit/blob/main/memlimit/experiment.go
2020
if v, ok := os.LookupEnv("AUTOMEMLIMIT_EXPERIMENT"); ok {
2121
if slices.Contains(strings.Split(v, ","), "system") {
22-
memlimit.SetGoMemLimitWithOpts(memlimit.WithProvider(memlimit.FromSystem), memlimit.WithLogger(slog.New(l.Handler())))
22+
_, err := memlimit.SetGoMemLimitWithOpts(memlimit.WithProvider(memlimit.FromSystem), memlimit.WithLogger(slog.New(l.Handler())))
23+
return err
2324
}
2425
}
26+
27+
return nil
2528
}

internal/alloycli/automemlimit_linux.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/grafana/alloy/internal/runtime/logging"
1111
)
1212

13-
func applyAutoMemLimit(l *logging.Logger) {
14-
memlimit.SetGoMemLimitWithOpts(memlimit.WithLogger(slog.New(l.Handler())))
13+
func applyAutoMemLimit(l *logging.Logger) error {
14+
_, err := memlimit.SetGoMemLimitWithOpts(memlimit.WithLogger(slog.New(l.Handler())))
15+
return err
1516
}

internal/alloycli/cmd_run.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,10 @@ func (fr *alloyRun) Run(cmd *cobra.Command, configPath string) error {
235235

236236
// Set the memory limit, this will honor GOMEMLIMIT if set
237237
// If there is a cgroup on linux it will use that
238-
applyAutoMemLimit(l)
238+
err = applyAutoMemLimit(l)
239+
if err != nil {
240+
level.Error(l).Log("msg", "failed to apply memory limit", "err", err)
241+
}
239242

240243
// Enable the profiling.
241244
setMutexBlockProfiling(l)

internal/cmd/listcomponents/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ func main() {
2929
}
3030

3131
stability, _ := strconv.Unquote(reg.Stability.String())
32-
fmt.Fprintf(tw, "%s \t%s\n", reg.Name, stability)
32+
_, _ = fmt.Fprintf(tw, "%s \t%s\n", reg.Name, stability)
3333
}
3434
}

internal/component/beyla/ebpf/beyla_linux_test.go

-1
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,6 @@ func TestConvert_Filters(t *testing.T) {
438438
config := args.Convert()
439439

440440
require.Equal(t, expectedConfig, config)
441-
442441
}
443442

444443
func TestArguments_Validate(t *testing.T) {

internal/component/common/kubernetes/event.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ const (
2222

2323
type queuedEventHandler struct {
2424
log log.Logger
25-
queue workqueue.RateLimitingInterface
25+
queue workqueue.TypedRateLimitingInterface[Event]
2626
}
2727

28-
func NewQueuedEventHandler(log log.Logger, queue workqueue.RateLimitingInterface) *queuedEventHandler {
28+
func NewQueuedEventHandler(log log.Logger, queue workqueue.TypedRateLimitingInterface[Event]) *queuedEventHandler {
2929
return &queuedEventHandler{
3030
log: log,
3131
queue: queue,

internal/component/common/kubernetes/rules_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ import (
88

99
func TestEventTypeIsHashable(t *testing.T) {
1010
// This test is here to ensure that the EventType type is hashable according to the workqueue implementation
11-
queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter())
11+
queue := workqueue.NewTypedRateLimitingQueue(workqueue.DefaultTypedControllerRateLimiter[Event]())
1212
queue.AddRateLimited(Event{})
1313
}

internal/component/common/loki/client/logger.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ func (l *logger) Chan() chan<- loki.Entry {
7474

7575
func (l *logger) run() {
7676
for e := range l.entries {
77-
fmt.Fprint(l.Writer, blue.Sprint(e.Timestamp.Format("2006-01-02T15:04:05.999999999-0700")))
78-
fmt.Fprint(l.Writer, "\t")
79-
fmt.Fprint(l.Writer, yellow.Sprint(e.Labels.String()))
80-
fmt.Fprint(l.Writer, "\t")
81-
fmt.Fprint(l.Writer, e.Line)
82-
fmt.Fprint(l.Writer, "\n")
77+
_, _ = fmt.Fprint(l.Writer, blue.Sprint(e.Timestamp.Format("2006-01-02T15:04:05.999999999-0700")))
78+
_, _ = fmt.Fprint(l.Writer, "\t")
79+
_, _ = fmt.Fprint(l.Writer, yellow.Sprint(e.Labels.String()))
80+
_, _ = fmt.Fprint(l.Writer, "\t")
81+
_, _ = fmt.Fprint(l.Writer, e.Line)
82+
_, _ = fmt.Fprint(l.Writer, "\n")
8383
_ = l.Flush()
8484
}
8585
}

internal/component/common/loki/positions/positions_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
func tempFilename(t *testing.T) string {
2222
t.Helper()
2323

24-
temp, err := os.CreateTemp("", "positions")
24+
temp, err := os.CreateTemp(t.TempDir(), "positions")
2525
if err != nil {
2626
t.Fatal("tempFilename:", err)
2727
}

internal/component/common/loki/utils/fs_errors.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
// (e.g. due to antivirus scans) or if the file appears as closed when being removed or rotated.
1414
func IsEphemeralOrFileClosed(err error) bool {
1515
return robustio.IsEphemeralError(err) ||
16-
errors.Is(os.ErrClosed, err) ||
16+
errors.Is(err, os.ErrClosed) ||
1717
// The above errors.Is(os.ErrClosedm, err) condition doesn't always capture the 'file already closed' error on
1818
// Windows. Check the error message as well.
1919
// Inspired by https://github.com/grafana/loki/blob/987e551f9e21b9a612dd0b6a3e60503ce6fe13a8/clients/cmd/docker-driver/driver.go#L145

internal/component/common/relabel/relabel.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func doRelabel(cfg *Config, lb LabelBuilder) (keep bool) {
230230
values = make([]string, 0, len(cfg.SourceLabels))
231231
}
232232
for _, ln := range cfg.SourceLabels {
233-
values = append(values, lb.Get(string(ln)))
233+
values = append(values, lb.Get(ln))
234234
}
235235
val := strings.Join(values, cfg.Separator)
236236

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package parser
2+
3+
import "github.com/go-kit/log"
4+
5+
type Parser interface {
6+
Parse(sql string) (any, error)
7+
Redact(sql string) (string, error)
8+
StmtType(stmt any) StatementType
9+
ParseTableName(t any) string
10+
ExtractTableNames(logger log.Logger, digest string, stmt any) []string
11+
}
12+
13+
type StatementType string
14+
15+
var (
16+
StatementTypeSelect StatementType = "select"
17+
StatementTypeInsert StatementType = "insert"
18+
StatementTypeUpdate StatementType = "update"
19+
StatementTypeDelete StatementType = "delete"
20+
21+
_ Parser = (*XwbSqlParser)(nil)
22+
_ Parser = (*TiDBSqlParser)(nil)
23+
)

internal/component/database_observability/mysql/collector/parser/parser_tidb.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,17 @@ func (p *TiDBSqlParser) Redact(sql string) (string, error) {
3838
return res, nil
3939
}
4040

41-
func (p *TiDBSqlParser) StmtType(stmt any) string {
41+
func (p *TiDBSqlParser) StmtType(stmt any) StatementType {
4242
s := stmt.(*ast.StmtNode)
43-
switch ast.GetStmtLabel(*s) {
44-
case "Select":
45-
return "select"
46-
case "Insert":
47-
return "insert"
48-
case "Update":
49-
return "update"
50-
case "Delete":
51-
return "delete"
43+
switch (*s).(type) {
44+
case *ast.SelectStmt:
45+
return StatementTypeSelect
46+
case *ast.InsertStmt:
47+
return StatementTypeInsert
48+
case *ast.UpdateStmt:
49+
return StatementTypeUpdate
50+
case *ast.DeleteStmt:
51+
return StatementTypeDelete
5252
default:
5353
return ""
5454
}

internal/component/database_observability/mysql/collector/parser/parser_xwb.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@ func (p *XwbSqlParser) Redact(sql string) (string, error) {
2020
return sqlparser.RedactSQLQuery(sql)
2121
}
2222

23-
func (p *XwbSqlParser) StmtType(stmt any) string {
23+
func (p *XwbSqlParser) StmtType(stmt any) StatementType {
2424
switch stmt.(type) {
2525
case *sqlparser.Select:
26-
return "select"
26+
return StatementTypeSelect
2727
case *sqlparser.Insert:
28-
return "insert"
28+
return StatementTypeInsert
2929
case *sqlparser.Update:
30-
return "update"
30+
return StatementTypeUpdate
3131
case *sqlparser.Delete:
32-
return "delete"
32+
return StatementTypeDelete
3333
case *sqlparser.Union:
34-
return "select" // label union as a select
34+
return StatementTypeSelect // label union as a select
3535
default:
3636
return ""
3737
}

internal/component/database_observability/mysql/collector/query_sample.go

+1-14
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,14 @@ type QuerySample struct {
4747
instanceKey string
4848
collectInterval time.Duration
4949
entryHandler loki.EntryHandler
50-
sqlParser Parser
50+
sqlParser parser.Parser
5151

5252
logger log.Logger
5353
running *atomic.Bool
5454
ctx context.Context
5555
cancel context.CancelFunc
5656
}
5757

58-
type Parser interface {
59-
Parse(sql string) (any, error)
60-
Redact(sql string) (string, error)
61-
StmtType(stmt any) string
62-
ParseTableName(t any) string
63-
ExtractTableNames(logger log.Logger, digest string, stmt any) []string
64-
}
65-
66-
var (
67-
_ Parser = (*parser.XwbSqlParser)(nil)
68-
_ Parser = (*parser.TiDBSqlParser)(nil)
69-
)
70-
7158
func NewQuerySample(args QuerySampleArguments) (*QuerySample, error) {
7259
c := &QuerySample{
7360
dbConnection: args.DB,

internal/component/database_observability/mysql/component_test.go

-1
Original file line numberDiff line numberDiff line change
@@ -126,5 +126,4 @@ func Test_enableOrDisableCollectors(t *testing.T) {
126126
collector.SchemaTableName: true,
127127
}, actualCollectors)
128128
})
129-
130129
}

internal/component/discovery/kubelet/kubelet.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,10 @@ func (d *Discovery) Refresh(ctx context.Context) ([]*targetgroup.Group, error) {
161161
if err := json.Unmarshal(body, &podList); err != nil {
162162
return nil, fmt.Errorf("error unmarshaling response body: %v", err)
163163
}
164-
return d.refresh(podList)
164+
return d.refresh(podList), nil
165165
}
166166

167-
func (d *Discovery) refresh(podList v1.PodList) ([]*targetgroup.Group, error) {
167+
func (d *Discovery) refresh(podList v1.PodList) []*targetgroup.Group {
168168
discovered := make(map[string]bool)
169169
// Create a list of targets from the pods
170170
var targetGroups []*targetgroup.Group
@@ -191,7 +191,7 @@ func (d *Discovery) refresh(podList v1.PodList) ([]*targetgroup.Group, error) {
191191
// update the list of discovered pods
192192
d.discoveredPodSources = discovered
193193

194-
return targetGroups, nil
194+
return targetGroups
195195
}
196196

197197
func (d *Discovery) buildPodTargetGroup(pod v1.Pod) *targetgroup.Group {

internal/component/discovery/kubelet/kubelet_test.go

+3-6
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,10 @@ func TestPodDeletion(t *testing.T) {
5656
kubeletDiscovery, err := NewKubeletDiscovery(args)
5757
require.NoError(t, err)
5858

59-
_, err = kubeletDiscovery.refresh(podList1)
60-
require.NoError(t, err)
59+
kubeletDiscovery.refresh(podList1)
6160
require.Len(t, kubeletDiscovery.discoveredPodSources, 2)
6261

63-
tg2, err := kubeletDiscovery.refresh(podList2)
64-
require.NoError(t, err)
62+
tg2 := kubeletDiscovery.refresh(podList2)
6563
require.Len(t, kubeletDiscovery.discoveredPodSources, 1)
6664
// should contain a target group for pod 1 with an empty target list as it has
6765
// been deleted
@@ -107,8 +105,7 @@ func TestDiscoveryPodWithoutPod(t *testing.T) {
107105
kubeletDiscovery, err := NewKubeletDiscovery(args)
108106
require.NoError(t, err)
109107

110-
_, err = kubeletDiscovery.refresh(podList1)
111-
require.NoError(t, err)
108+
kubeletDiscovery.refresh(podList1)
112109
require.Len(t, kubeletDiscovery.discoveredPodSources, 2)
113110
}
114111

internal/component/discovery/relabel/relabel.go

+3
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ func (c *Component) Run(ctx context.Context) error {
7979

8080
// Update implements component.Component.
8181
func (c *Component) Update(args component.Arguments) error {
82+
c.mut.Lock()
83+
defer c.mut.Unlock()
84+
8285
newArgs := args.(Arguments)
8386

8487
targets := make([]discovery.Target, 0, len(newArgs.Targets))

0 commit comments

Comments
 (0)