Skip to content

Commit fd0da30

Browse files
authored
Merge pull request #334 from tjhop/chore/adopt-slog
chore!: adopt slog, drop go-kit/log
2 parents 03abaa7 + 9cdeb9f commit fd0da30

File tree

7 files changed

+104
-103
lines changed

7 files changed

+104
-103
lines changed

.golangci.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
linters:
22
enable:
33
- revive
4+
- sloglint
45

56
issues:
67
exclude-rules:
@@ -13,8 +14,6 @@ linters-settings:
1314
exclude-functions:
1415
# Used in HTTP handlers, any error is handled by the server itself.
1516
- (net/http.ResponseWriter).Write
16-
# Never check for logger errors.
17-
- (github.com/go-kit/log.Logger).Log
1817
revive:
1918
rules:
2019
- name: unused-parameter

cmd/main.go

+17-18
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,17 @@ import (
1717
"context"
1818
"encoding/json"
1919
"fmt"
20+
"log/slog"
2021
"net/http"
2122
"os"
2223

2324
"github.com/alecthomas/kingpin/v2"
24-
"github.com/go-kit/log"
25-
"github.com/go-kit/log/level"
2625
"github.com/prometheus-community/json_exporter/config"
2726
"github.com/prometheus-community/json_exporter/exporter"
2827
"github.com/prometheus/client_golang/prometheus"
2928
"github.com/prometheus/client_golang/prometheus/promhttp"
30-
"github.com/prometheus/common/promlog"
31-
"github.com/prometheus/common/promlog/flag"
29+
"github.com/prometheus/common/promslog"
30+
"github.com/prometheus/common/promslog/flag"
3231
"github.com/prometheus/common/version"
3332
"github.com/prometheus/exporter-toolkit/web"
3433
"github.com/prometheus/exporter-toolkit/web/kingpinflag"
@@ -46,28 +45,28 @@ var (
4645

4746
func Run() {
4847

49-
promlogConfig := &promlog.Config{}
48+
promslogConfig := &promslog.Config{}
5049

51-
flag.AddFlags(kingpin.CommandLine, promlogConfig)
50+
flag.AddFlags(kingpin.CommandLine, promslogConfig)
5251
kingpin.Version(version.Print("json_exporter"))
5352
kingpin.HelpFlag.Short('h')
5453
kingpin.Parse()
55-
logger := promlog.New(promlogConfig)
54+
logger := promslog.New(promslogConfig)
5655

57-
level.Info(logger).Log("msg", "Starting json_exporter", "version", version.Info())
58-
level.Info(logger).Log("msg", "Build context", "build", version.BuildContext())
56+
logger.Info("Starting json_exporter", "version", version.Info())
57+
logger.Info("Build context", "build", version.BuildContext())
5958

60-
level.Info(logger).Log("msg", "Loading config file", "file", *configFile)
59+
logger.Info("Loading config file", "file", *configFile)
6160
config, err := config.LoadConfig(*configFile)
6261
if err != nil {
63-
level.Error(logger).Log("msg", "Error loading config", "err", err)
62+
logger.Error("Error loading config", "err", err)
6463
os.Exit(1)
6564
}
6665
configJSON, err := json.Marshal(config)
6766
if err != nil {
68-
level.Error(logger).Log("msg", "Failed to marshal config to JSON", "err", err)
67+
logger.Error("Failed to marshal config to JSON", "err", err)
6968
}
70-
level.Info(logger).Log("msg", "Loaded config file", "config", string(configJSON))
69+
logger.Info("Loaded config file", "config", string(configJSON))
7170

7271
if *configCheck {
7372
os.Exit(0)
@@ -91,20 +90,20 @@ func Run() {
9190
}
9291
landingPage, err := web.NewLandingPage(landingConfig)
9392
if err != nil {
94-
level.Error(logger).Log("err", err)
93+
logger.Error("error creating landing page", "err", err)
9594
os.Exit(1)
9695
}
9796
http.Handle("/", landingPage)
9897
}
9998

10099
server := &http.Server{}
101100
if err := web.ListenAndServe(server, toolkitFlags, logger); err != nil {
102-
level.Error(logger).Log("msg", "Failed to start the server", "err", err)
101+
logger.Error("Failed to start the server", "err", err)
103102
os.Exit(1)
104103
}
105104
}
106105

107-
func probeHandler(w http.ResponseWriter, r *http.Request, logger log.Logger, config config.Config) {
106+
func probeHandler(w http.ResponseWriter, r *http.Request, logger *slog.Logger, config config.Config) {
108107

109108
ctx, cancel := context.WithCancel(r.Context())
110109
defer cancel()
@@ -116,15 +115,15 @@ func probeHandler(w http.ResponseWriter, r *http.Request, logger log.Logger, con
116115
}
117116
if _, ok := config.Modules[module]; !ok {
118117
http.Error(w, fmt.Sprintf("Unknown module %q", module), http.StatusBadRequest)
119-
level.Debug(logger).Log("msg", "Unknown module", "module", module)
118+
logger.Debug("Unknown module", "module", module)
120119
return
121120
}
122121

123122
registry := prometheus.NewPedanticRegistry()
124123

125124
metrics, err := exporter.CreateMetricsList(config.Modules[module])
126125
if err != nil {
127-
level.Error(logger).Log("msg", "Failed to create metrics list from config", "err", err)
126+
logger.Error("Failed to create metrics list from config", "err", err)
128127
}
129128

130129
jsonMetricCollector := exporter.JSONMetricCollector{JSONMetrics: metrics}

cmd/main_test.go

+13-13
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import (
2222
"strings"
2323
"testing"
2424

25-
"github.com/go-kit/log"
2625
"github.com/prometheus-community/json_exporter/config"
2726
pconfig "github.com/prometheus/common/config"
27+
"github.com/prometheus/common/promslog"
2828
)
2929

3030
func TestFailIfSelfSignedCA(t *testing.T) {
@@ -34,7 +34,7 @@ func TestFailIfSelfSignedCA(t *testing.T) {
3434

3535
req := httptest.NewRequest("GET", "http://example.com/foo"+"?module=default&target="+target.URL, nil)
3636
recorder := httptest.NewRecorder()
37-
probeHandler(recorder, req, log.NewNopLogger(), config.Config{Modules: map[string]config.Module{"default": {}}})
37+
probeHandler(recorder, req, promslog.NewNopLogger(), config.Config{Modules: map[string]config.Module{"default": {}}})
3838

3939
resp := recorder.Result()
4040
body, _ := io.ReadAll(resp.Body)
@@ -61,7 +61,7 @@ func TestSucceedIfSelfSignedCA(t *testing.T) {
6161

6262
req := httptest.NewRequest("GET", "http://example.com/foo"+"?module=default&target="+target.URL, nil)
6363
recorder := httptest.NewRecorder()
64-
probeHandler(recorder, req, log.NewNopLogger(), c)
64+
probeHandler(recorder, req, promslog.NewNopLogger(), c)
6565

6666
resp := recorder.Result()
6767
body, _ := io.ReadAll(resp.Body)
@@ -78,7 +78,7 @@ func TestDefaultModule(t *testing.T) {
7878

7979
req := httptest.NewRequest("GET", "http://example.com/foo"+"?target="+target.URL, nil)
8080
recorder := httptest.NewRecorder()
81-
probeHandler(recorder, req, log.NewNopLogger(), config.Config{Modules: map[string]config.Module{"default": {}}})
81+
probeHandler(recorder, req, promslog.NewNopLogger(), config.Config{Modules: map[string]config.Module{"default": {}}})
8282

8383
resp := recorder.Result()
8484
if resp.StatusCode != http.StatusOK {
@@ -87,7 +87,7 @@ func TestDefaultModule(t *testing.T) {
8787

8888
// Module doesn't exist.
8989
recorder = httptest.NewRecorder()
90-
probeHandler(recorder, req, log.NewNopLogger(), config.Config{Modules: map[string]config.Module{"foo": {}}})
90+
probeHandler(recorder, req, promslog.NewNopLogger(), config.Config{Modules: map[string]config.Module{"foo": {}}})
9191
resp = recorder.Result()
9292
if resp.StatusCode != http.StatusBadRequest {
9393
t.Fatalf("Default module test fails unexpectedly, expected 400, got %d", resp.StatusCode)
@@ -97,7 +97,7 @@ func TestDefaultModule(t *testing.T) {
9797
func TestFailIfTargetMissing(t *testing.T) {
9898
req := httptest.NewRequest("GET", "http://example.com/foo", nil)
9999
recorder := httptest.NewRecorder()
100-
probeHandler(recorder, req, log.NewNopLogger(), config.Config{})
100+
probeHandler(recorder, req, promslog.NewNopLogger(), config.Config{})
101101

102102
resp := recorder.Result()
103103
body, _ := io.ReadAll(resp.Body)
@@ -119,7 +119,7 @@ func TestDefaultAcceptHeader(t *testing.T) {
119119

120120
req := httptest.NewRequest("GET", "http://example.com/foo"+"?module=default&target="+target.URL, nil)
121121
recorder := httptest.NewRecorder()
122-
probeHandler(recorder, req, log.NewNopLogger(), config.Config{Modules: map[string]config.Module{"default": {}}})
122+
probeHandler(recorder, req, promslog.NewNopLogger(), config.Config{Modules: map[string]config.Module{"default": {}}})
123123

124124
resp := recorder.Result()
125125
body, _ := io.ReadAll(resp.Body)
@@ -151,7 +151,7 @@ func TestCorrectResponse(t *testing.T) {
151151

152152
req := httptest.NewRequest("GET", "http://example.com/foo"+"?module=default&target="+target.URL+test.ServeFile, nil)
153153
recorder := httptest.NewRecorder()
154-
probeHandler(recorder, req, log.NewNopLogger(), c)
154+
probeHandler(recorder, req, promslog.NewNopLogger(), c)
155155

156156
resp := recorder.Result()
157157
body, _ := io.ReadAll(resp.Body)
@@ -191,7 +191,7 @@ func TestBasicAuth(t *testing.T) {
191191
},
192192
}
193193

194-
probeHandler(recorder, req, log.NewNopLogger(), c)
194+
probeHandler(recorder, req, promslog.NewNopLogger(), c)
195195

196196
resp := recorder.Result()
197197
body, _ := io.ReadAll(resp.Body)
@@ -222,7 +222,7 @@ func TestBearerToken(t *testing.T) {
222222
}},
223223
}
224224

225-
probeHandler(recorder, req, log.NewNopLogger(), c)
225+
probeHandler(recorder, req, promslog.NewNopLogger(), c)
226226

227227
resp := recorder.Result()
228228
body, _ := io.ReadAll(resp.Body)
@@ -258,7 +258,7 @@ func TestHTTPHeaders(t *testing.T) {
258258
},
259259
}
260260

261-
probeHandler(recorder, req, log.NewNopLogger(), c)
261+
probeHandler(recorder, req, promslog.NewNopLogger(), c)
262262

263263
resp := recorder.Result()
264264
body, _ := io.ReadAll(resp.Body)
@@ -321,7 +321,7 @@ func TestBodyPostTemplate(t *testing.T) {
321321
},
322322
}
323323

324-
probeHandler(recorder, req, log.NewNopLogger(), c)
324+
probeHandler(recorder, req, promslog.NewNopLogger(), c)
325325

326326
resp := recorder.Result()
327327
respBody, _ := io.ReadAll(resp.Body)
@@ -420,7 +420,7 @@ func TestBodyPostQuery(t *testing.T) {
420420
},
421421
}
422422

423-
probeHandler(recorder, req, log.NewNopLogger(), c)
423+
probeHandler(recorder, req, promslog.NewNopLogger(), c)
424424

425425
resp := recorder.Result()
426426
respBody, _ := io.ReadAll(resp.Body)

exporter/collector.go

+19-20
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ package exporter
1616
import (
1717
"bytes"
1818
"encoding/json"
19+
"log/slog"
1920
"time"
2021

21-
"github.com/go-kit/log"
22-
"github.com/go-kit/log/level"
2322
"github.com/prometheus-community/json_exporter/config"
2423
"github.com/prometheus/client_golang/prometheus"
2524
"k8s.io/client-go/util/jsonpath"
@@ -28,7 +27,7 @@ import (
2827
type JSONMetricCollector struct {
2928
JSONMetrics []JSONMetric
3029
Data []byte
31-
Logger log.Logger
30+
Logger *slog.Logger
3231
}
3332

3433
type JSONMetric struct {
@@ -53,7 +52,7 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
5352
case config.ValueScrape:
5453
value, err := extractValue(mc.Logger, mc.Data, m.KeyJSONPath, false)
5554
if err != nil {
56-
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
55+
mc.Logger.Error("Failed to extract value for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
5756
continue
5857
}
5958

@@ -66,14 +65,14 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
6665
)
6766
ch <- timestampMetric(mc.Logger, m, mc.Data, metric)
6867
} else {
69-
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "path", m.KeyJSONPath, "value", value, "err", err, "metric", m.Desc)
68+
mc.Logger.Error("Failed to convert extracted value to float64", "path", m.KeyJSONPath, "value", value, "err", err, "metric", m.Desc)
7069
continue
7170
}
7271

7372
case config.ObjectScrape:
7473
values, err := extractValue(mc.Logger, mc.Data, m.KeyJSONPath, true)
7574
if err != nil {
76-
level.Error(mc.Logger).Log("msg", "Failed to extract json objects for metric", "err", err, "metric", m.Desc)
75+
mc.Logger.Error("Failed to extract json objects for metric", "err", err, "metric", m.Desc)
7776
continue
7877
}
7978

@@ -82,12 +81,12 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
8281
for _, data := range jsonData {
8382
jdata, err := json.Marshal(data)
8483
if err != nil {
85-
level.Error(mc.Logger).Log("msg", "Failed to marshal data to json", "path", m.ValueJSONPath, "err", err, "metric", m.Desc, "data", data)
84+
mc.Logger.Error("Failed to marshal data to json", "path", m.ValueJSONPath, "err", err, "metric", m.Desc, "data", data)
8685
continue
8786
}
8887
value, err := extractValue(mc.Logger, jdata, m.ValueJSONPath, false)
8988
if err != nil {
90-
level.Error(mc.Logger).Log("msg", "Failed to extract value for metric", "path", m.ValueJSONPath, "err", err, "metric", m.Desc)
89+
mc.Logger.Error("Failed to extract value for metric", "path", m.ValueJSONPath, "err", err, "metric", m.Desc)
9190
continue
9291
}
9392

@@ -100,23 +99,23 @@ func (mc JSONMetricCollector) Collect(ch chan<- prometheus.Metric) {
10099
)
101100
ch <- timestampMetric(mc.Logger, m, jdata, metric)
102101
} else {
103-
level.Error(mc.Logger).Log("msg", "Failed to convert extracted value to float64", "path", m.ValueJSONPath, "value", value, "err", err, "metric", m.Desc)
102+
mc.Logger.Error("Failed to convert extracted value to float64", "path", m.ValueJSONPath, "value", value, "err", err, "metric", m.Desc)
104103
continue
105104
}
106105
}
107106
} else {
108-
level.Error(mc.Logger).Log("msg", "Failed to convert extracted objects to json", "err", err, "metric", m.Desc)
107+
mc.Logger.Error("Failed to convert extracted objects to json", "err", err, "metric", m.Desc)
109108
continue
110109
}
111110
default:
112-
level.Error(mc.Logger).Log("msg", "Unknown scrape config type", "type", m.Type, "metric", m.Desc)
111+
mc.Logger.Error("Unknown scrape config type", "type", m.Type, "metric", m.Desc)
113112
continue
114113
}
115114
}
116115
}
117116

118117
// Returns the last matching value at the given json path
119-
func extractValue(logger log.Logger, data []byte, path string, enableJSONOutput bool) (string, error) {
118+
func extractValue(logger *slog.Logger, data []byte, path string, enableJSONOutput bool) (string, error) {
120119
var jsonData interface{}
121120
buf := new(bytes.Buffer)
122121

@@ -126,17 +125,17 @@ func extractValue(logger log.Logger, data []byte, path string, enableJSONOutput
126125
}
127126

128127
if err := json.Unmarshal(data, &jsonData); err != nil {
129-
level.Error(logger).Log("msg", "Failed to unmarshal data to json", "err", err, "data", data)
128+
logger.Error("Failed to unmarshal data to json", "err", err, "data", data)
130129
return "", err
131130
}
132131

133132
if err := j.Parse(path); err != nil {
134-
level.Error(logger).Log("msg", "Failed to parse jsonpath", "err", err, "path", path, "data", data)
133+
logger.Error("Failed to parse jsonpath", "err", err, "path", path, "data", data)
135134
return "", err
136135
}
137136

138137
if err := j.Execute(buf, jsonData); err != nil {
139-
level.Error(logger).Log("msg", "Failed to execute jsonpath", "err", err, "path", path, "data", data)
138+
logger.Error("Failed to execute jsonpath", "err", err, "path", path, "data", data)
140139
return "", err
141140
}
142141

@@ -149,30 +148,30 @@ func extractValue(logger log.Logger, data []byte, path string, enableJSONOutput
149148
}
150149

151150
// Returns the list of labels created from the list of provided json paths
152-
func extractLabels(logger log.Logger, data []byte, paths []string) []string {
151+
func extractLabels(logger *slog.Logger, data []byte, paths []string) []string {
153152
labels := make([]string, len(paths))
154153
for i, path := range paths {
155154
if result, err := extractValue(logger, data, path, false); err == nil {
156155
labels[i] = result
157156
} else {
158-
level.Error(logger).Log("msg", "Failed to extract label value", "err", err, "path", path, "data", data)
157+
logger.Error("Failed to extract label value", "err", err, "path", path, "data", data)
159158
}
160159
}
161160
return labels
162161
}
163162

164-
func timestampMetric(logger log.Logger, m JSONMetric, data []byte, pm prometheus.Metric) prometheus.Metric {
163+
func timestampMetric(logger *slog.Logger, m JSONMetric, data []byte, pm prometheus.Metric) prometheus.Metric {
165164
if m.EpochTimestampJSONPath == "" {
166165
return pm
167166
}
168167
ts, err := extractValue(logger, data, m.EpochTimestampJSONPath, false)
169168
if err != nil {
170-
level.Error(logger).Log("msg", "Failed to extract timestamp for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
169+
logger.Error("Failed to extract timestamp for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
171170
return pm
172171
}
173172
epochTime, err := SanitizeIntValue(ts)
174173
if err != nil {
175-
level.Error(logger).Log("msg", "Failed to parse timestamp for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
174+
logger.Error("Failed to parse timestamp for metric", "path", m.KeyJSONPath, "err", err, "metric", m.Desc)
176175
return pm
177176
}
178177
timestamp := time.UnixMilli(epochTime)

0 commit comments

Comments
 (0)