Skip to content

Commit 37c185b

Browse files
committed
Introduce levellogging for retryablehttp so logging can be controller a lot better
1 parent ee9aaac commit 37c185b

File tree

4 files changed

+62
-4
lines changed

4 files changed

+62
-4
lines changed

pkg/client/docker/docker.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
retryablehttp "github.com/hashicorp/go-retryablehttp"
1818
"github.com/jetstack/version-checker/pkg/api"
1919
"github.com/jetstack/version-checker/pkg/client/util"
20+
leveledlogger "github.com/jetstack/version-checker/pkg/leveledlogrus"
2021
)
2122

2223
// Ensure that we are an ImageClient
@@ -69,7 +70,7 @@ func New(opts Options, log *logrus.Entry) (*Client, error) {
6970
retryclient.RetryWaitMin = 1 * time.Second
7071
// This custom backoff will fail requests that have a max wait of the RetryWaitMax
7172
retryclient.Backoff = util.HTTPBackOff
72-
retryclient.Logger = log.WithField("client", "docker")
73+
retryclient.Logger = leveledlogger.Logger{Entry: log.WithField("client", "docker")}
7374
client := retryclient.StandardClient()
7475

7576
// Setup Auth if username and password used.

pkg/client/quay/quay.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/jetstack/version-checker/pkg/api"
1414
"github.com/jetstack/version-checker/pkg/client/util"
15+
leveledlogger "github.com/jetstack/version-checker/pkg/leveledlogrus"
1516
)
1617

1718
const (
@@ -39,6 +40,7 @@ func New(opts Options, log *logrus.Entry) *Client {
3940
if opts.Transporter != nil {
4041
client.HTTPClient.Transport = opts.Transporter
4142
}
43+
client.Logger = leveledlogger.Logger{Entry: log.WithField("client", "quay")}
4244

4345
return &Client{
4446
Options: opts,

pkg/controller/kube_controller.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"k8s.io/client-go/rest"
1717

1818
"github.com/hashicorp/go-retryablehttp"
19+
leveledlogger "github.com/jetstack/version-checker/pkg/leveledlogrus"
1920
"github.com/jetstack/version-checker/pkg/metrics"
2021
"github.com/jetstack/version-checker/pkg/version/semver"
2122
)
@@ -24,7 +25,7 @@ const channelURLSuffix = "https://dl.k8s.io/release/"
2425

2526
type ClusterVersionScheduler struct {
2627
client kubernetes.Interface
27-
http http.Client
28+
http *http.Client
2829
log *logrus.Entry
2930
metrics *metrics.Metrics
3031
interval time.Duration
@@ -49,12 +50,12 @@ func NewKubeReconciler(
4950
httpClient.RetryMax = 3
5051
httpClient.RetryWaitMin = 1 * time.Second
5152
httpClient.RetryWaitMax = 30 * time.Second
52-
httpClient.Logger = log
53+
httpClient.Logger = retryablehttp.LeveledLogger(&leveledlogger.Logger{Entry: log})
5354

5455
return &ClusterVersionScheduler{
5556
log: log.WithField("channel", channel),
5657
client: kubernetes.NewForConfigOrDie(config),
57-
http: *httpClient.StandardClient(),
58+
http: httpClient.StandardClient(),
5859
interval: interval,
5960
metrics: metrics,
6061
channel: channel,

pkg/leveledlogrus/logger.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Creates a leveled logger compatible with hashicorp/go-retryablehttp
2+
package leveledlogger
3+
4+
import "github.com/sirupsen/logrus"
5+
6+
type Logger struct {
7+
*logrus.Entry
8+
}
9+
10+
func (l *Logger) Error(msg string, keysAndValues ...interface{}) {
11+
l.fields(keysAndValues).Error(msg)
12+
}
13+
14+
func (l *Logger) Info(msg string, keysAndValues ...interface{}) {
15+
l.fields(keysAndValues).Info(msg)
16+
}
17+
func (l *Logger) Debug(msg string, keysAndValues ...interface{}) {
18+
l.fields(keysAndValues).Debug(msg)
19+
}
20+
21+
func (l *Logger) Warn(msg string, keysAndValues ...interface{}) {
22+
l.fields(keysAndValues).Warn(msg)
23+
}
24+
25+
func (l *Logger) fields(keysAndValues []interface{}) *logrus.Entry {
26+
if len(keysAndValues) == 0 {
27+
return l.Entry
28+
}
29+
30+
fields := make(map[string]interface{}, len(keysAndValues)/2)
31+
32+
for i := 0; i < len(keysAndValues)-1; i += 2 {
33+
key, ok := keysAndValues[i].(string)
34+
if !ok {
35+
// Skip invalid key-value pairs
36+
continue
37+
}
38+
fields[key] = keysAndValues[i+1]
39+
}
40+
41+
// Handle odd number of elements - log the trailing key without a value
42+
if len(keysAndValues)%2 != 0 {
43+
key, ok := keysAndValues[len(keysAndValues)-1].(string)
44+
if ok {
45+
fields[key] = "(MISSING)"
46+
}
47+
}
48+
49+
if len(fields) == 0 {
50+
return l.Entry
51+
}
52+
53+
return l.WithFields(fields)
54+
}

0 commit comments

Comments
 (0)