Skip to content

Commit f04728f

Browse files
authored
feat: go1.18 & improved error messages (#69)
* feat: improve logs of cmd outputs Signed-off-by: Utku Ozdemir <[email protected]> * refactor: workflows Signed-off-by: Utku Ozdemir <[email protected]> * refactor: enable linters Signed-off-by: Utku Ozdemir <[email protected]> * ci: remove gofumpt since it is checked via golangci-lint & remove deprecated config on golangci-lint action Signed-off-by: Utku Ozdemir <[email protected]>
1 parent 5b48550 commit f04728f

File tree

14 files changed

+333
-117
lines changed

14 files changed

+333
-117
lines changed

Diff for: .github/workflows/build.yml

+7-19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
---
22
name: build
3+
34
on:
45
push:
56
branches:
@@ -22,21 +23,13 @@ on:
2223
- "grafana/**"
2324
- "systemd/**"
2425
- "renovate.json"
26+
27+
concurrency:
28+
group: build-${{ github.event.pull_request.number || github.ref }}
29+
cancel-in-progress: true
30+
2531
jobs:
26-
pre_job:
27-
continue-on-error: true
28-
runs-on: ubuntu-20.04
29-
outputs:
30-
should_skip: ${{ steps.skip_check.outputs.should_skip }}
31-
steps:
32-
- id: skip_check
33-
uses: fkirc/[email protected]
34-
with:
35-
cancel_others: true
36-
concurrent_skipping: same_content
3732
build:
38-
needs: pre_job
39-
if: ${{ needs.pre_job.outputs.should_skip != 'true' }}
4033
runs-on: ubuntu-20.04
4134
steps:
4235
- name: Checkout
@@ -45,19 +38,14 @@ jobs:
4538
uses: actions/[email protected]
4639
with:
4740
# renovate: go
48-
go-version: 1.17.5
41+
go-version: 1.18
4942
- name: Ensure go.mod is already tidied
5043
run: go mod tidy && git diff --no-patch --exit-code
51-
- name: Install gofumpt
52-
run: go install mvdan.cc/[email protected]
53-
- name: Ensure code is properly formatted using gofumpt
54-
run: test -z "$(gofumpt -d .)"
5544
- name: Run linters
5645
uses: golangci/[email protected]
5746
with:
5847
# renovate: golangci-lint
5948
version: v1.45.2
60-
skip-go-installation: true
6149
args: --timeout=3m0s
6250
- name: Install go-acc
6351
# renovate: go-acc

Diff for: .github/workflows/release.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: release
33
on:
44
push:
55
tags:
6-
- 'v*.*.*'
6+
- "v*.*.*"
77
jobs:
88
release:
99
runs-on: ubuntu-20.04
@@ -18,7 +18,7 @@ jobs:
1818
uses: actions/[email protected]
1919
with:
2020
# renovate: go
21-
go-version: 1.17.5
21+
go-version: 1.18
2222
- name: Login to DockerHub
2323
uses: docker/[email protected]
2424
with:

Diff for: .golangci.yml

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# https://golangci-lint.run/usage/linters/
2+
linters:
3+
enable:
4+
- asciicheck
5+
- bidichk
6+
- containedctx
7+
- contextcheck
8+
- cyclop
9+
- decorder
10+
- dogsled
11+
- dupl
12+
- durationcheck
13+
- errname
14+
- errorlint
15+
- exhaustive
16+
- exportloopref
17+
- forbidigo
18+
- forcetypeassert
19+
- funlen
20+
- gci
21+
# - gochecknoglobals
22+
- gochecknoinits
23+
- gocognit
24+
- goconst
25+
- gocritic
26+
- gocyclo
27+
- godot
28+
- godox
29+
- goerr113
30+
- gofumpt
31+
- goheader
32+
# - goimports # inconsistent with gci
33+
- gomnd
34+
- gomoddirectives
35+
# - gomodguard # no need
36+
- goprintffuncname
37+
- gosec
38+
- grouper
39+
- ifshort
40+
- importas
41+
- ireturn
42+
- lll
43+
- maintidx
44+
- makezero
45+
- misspell
46+
- nakedret
47+
- nestif
48+
- nilerr
49+
- nilnil
50+
- nlreturn
51+
- noctx
52+
- nolintlint
53+
- paralleltest
54+
- prealloc
55+
- predeclared
56+
- revive
57+
- rowserrcheck
58+
# - sqlclosecheck
59+
- stylecheck
60+
- tagliatelle
61+
- tenv
62+
# - testpackage # TODO: visit
63+
- thelper
64+
- tparallel
65+
- unconvert
66+
- unparam
67+
- varnamelen
68+
- wastedassign
69+
- whitespace
70+
- wrapcheck
71+
- wsl
72+
73+
linters-settings:
74+
goconst:
75+
ignore-tests: true

Diff for: cmd/nvidia_gpu_exporter/main.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,15 @@ func main() {
5454
kingpin.Parse()
5555

5656
logger := promlog.New(promlogConfig)
57-
e, err := exporter.New(exporter.DefaultPrefix, *nvidiaSmiCommand, *qFields, logger)
57+
58+
exp, err := exporter.New(exporter.DefaultPrefix, *nvidiaSmiCommand, *qFields, logger)
5859
if err != nil {
5960
_ = level.Error(logger).Log("msg", "Error on creating exporter", "err", err)
61+
6062
os.Exit(1)
6163
}
6264

63-
prometheus.MustRegister(e)
65+
prometheus.MustRegister(exp)
6466
prometheus.MustRegister(version.NewCollector("nvidia_gpu_exporter"))
6567

6668
_ = level.Info(logger).Log("msg", "Listening on address", "address", listenAddress)
@@ -72,6 +74,7 @@ func main() {
7274
srv := &http.Server{Addr: *listenAddress}
7375
if err := web.ListenAndServe(srv, *webConfig, logger); err != nil {
7476
_ = level.Error(logger).Log("msg", "Error starting HTTP server", "err", err)
77+
7578
os.Exit(1)
7679
}
7780
}
@@ -89,8 +92,7 @@ func NewRootHandler(logger log.Logger, metricsPath string) *RootHandler {
8992
}
9093

9194
func (r *RootHandler) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
92-
_, err := w.Write(r.response)
93-
if err != nil {
95+
if _, err := w.Write(r.response); err != nil {
9496
_ = level.Error(r.logger).Log("msg", "Error writing redirect", "err", err)
9597
}
9698
}

Diff for: go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module github.com/utkuozdemir/nvidia_gpu_exporter
22

33
// renovate: go
4-
go 1.17
4+
go 1.18
55

66
require (
77
github.com/go-kit/log v0.2.0

Diff for: internal/exporter/csv.go

+17-12
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ type cell struct {
2222
rawValue string
2323
}
2424

25+
var ErrFieldCountMismatch = fmt.Errorf("field count mismatch")
26+
2527
func parseCSVIntoTable(queryResult string, qFields []qField) (table, error) {
2628
lines := strings.Split(strings.TrimSpace(queryResult), "\n")
2729
titlesLine := lines[0]
@@ -42,30 +44,31 @@ func parseCSVIntoTable(queryResult string, qFields []qField) (table, error) {
4244
qFieldToCell := make(map[qField]cell, numCols)
4345
cells := make([]cell, numCols)
4446
rawValues := parseCSVLine(valuesLine)
47+
4548
if len(qFields) != len(rFields) {
46-
return table{}, fmt.Errorf("query fields (%d) and returned fields (%d) have different sizes", len(qFields), len(rFields))
49+
return table{}, fmt.Errorf("%w: query fields: %d, returned fields: %d",
50+
ErrFieldCountMismatch, len(qFields), len(rFields))
4751
}
4852

4953
for colIndex, rawValue := range rawValues {
50-
q := qFields[colIndex]
51-
r := rFields[colIndex]
52-
gm := cell{
53-
qField: q,
54-
rField: r,
54+
currentQField := qFields[colIndex]
55+
currentRField := rFields[colIndex]
56+
tableCell := cell{
57+
qField: currentQField,
58+
rField: currentRField,
5559
rawValue: rawValue,
5660
}
57-
qFieldToCell[q] = gm
58-
cells[colIndex] = gm
59-
qFieldToCells[q][rowIndex] = gm
61+
qFieldToCell[currentQField] = tableCell
62+
cells[colIndex] = tableCell
63+
qFieldToCells[currentQField][rowIndex] = tableCell
6064
}
6165

62-
gmc := row{
66+
tableRow := row{
6367
qFieldToCells: qFieldToCell,
6468
cells: cells,
6569
}
6670

67-
rows[rowIndex] = gmc
68-
71+
rows[rowIndex] = tableRow
6972
}
7073

7174
return table{
@@ -78,8 +81,10 @@ func parseCSVIntoTable(queryResult string, qFields []qField) (table, error) {
7881
func parseCSVLine(line string) []string {
7982
values := strings.Split(line, ",")
8083
result := make([]string, len(values))
84+
8185
for i, field := range values {
8286
result[i] = strings.TrimSpace(field)
8387
}
88+
8489
return result
8590
}

Diff for: internal/exporter/csv_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ Some Dummy GPU, 12.34 W
1515
)
1616

1717
func TestParseCsvIntoTable(t *testing.T) {
18+
t.Parallel()
19+
1820
parsed, err := parseCSVIntoTable(testCsv, []qField{"name", "power.draw"})
21+
1922
assert.NoError(t, err)
2023
assert.Len(t, parsed.rows, 2)
2124
assert.Equal(t, []rField{"name", "power.draw [W]"}, parsed.rFields)

0 commit comments

Comments
 (0)