Skip to content

Commit a6fd2a1

Browse files
authored
Adding http metrics to calculate upstream response times (#342)
1 parent e44ed75 commit a6fd2a1

File tree

24 files changed

+805
-200
lines changed

24 files changed

+805
-200
lines changed

cmd/app/app.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@ package app
33
import (
44
"context"
55
"fmt"
6-
"os"
76

87
"github.com/sirupsen/logrus"
98
"github.com/spf13/cobra"
9+
10+
"github.com/go-chi/transport"
11+
"github.com/hashicorp/go-cleanhttp"
12+
1013
"k8s.io/client-go/kubernetes"
1114
_ "k8s.io/client-go/plugin/pkg/client/auth" // Load all auth plugins
1215

@@ -35,11 +38,7 @@ func NewCommand(ctx context.Context) *cobra.Command {
3538
return fmt.Errorf("failed to parse --log-level %q: %s",
3639
opts.LogLevel, err)
3740
}
38-
39-
nlog := logrus.New()
40-
nlog.SetOutput(os.Stdout)
41-
nlog.SetLevel(logLevel)
42-
log := logrus.NewEntry(nlog)
41+
log := newLogger(logLevel)
4342

4443
restConfig, err := opts.kubeConfigFlags.ToRESTConfig()
4544
if err != nil {
@@ -51,18 +50,23 @@ func NewCommand(ctx context.Context) *cobra.Command {
5150
return fmt.Errorf("failed to build kubernetes client: %s", err)
5251
}
5352

54-
metrics := metrics.New(log)
55-
if err := metrics.Run(opts.MetricsServingAddress); err != nil {
53+
metricsServer := metrics.NewServer(log)
54+
if err := metricsServer.Run(opts.MetricsServingAddress); err != nil {
5655
return fmt.Errorf("failed to start metrics server: %s", err)
5756
}
5857

58+
opts.Client.Transport = transport.Chain(
59+
cleanhttp.DefaultTransport(),
60+
metricsServer.RoundTripper,
61+
)
62+
5963
client, err := client.New(ctx, log, opts.Client)
6064
if err != nil {
6165
return fmt.Errorf("failed to setup image registry clients: %s", err)
6266
}
6367

6468
defer func() {
65-
if err := metrics.Shutdown(); err != nil {
69+
if err := metricsServer.Shutdown(); err != nil {
6670
log.Error(err)
6771
}
6872
}()
@@ -74,7 +78,7 @@ func NewCommand(ctx context.Context) *cobra.Command {
7478

7579
log.Infof("flag --test-all-containers=%t %s", opts.DefaultTestAll, defaultTestAllInfoMsg)
7680

77-
c := controller.New(opts.CacheTimeout, metrics,
81+
c := controller.New(opts.CacheTimeout, metricsServer,
7882
client, kubeClient, log, opts.DefaultTestAll)
7983

8084
return c.Run(ctx, opts.CacheTimeout/2)

cmd/app/helpers.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package app
2+
3+
import (
4+
"os"
5+
6+
"github.com/sirupsen/logrus"
7+
)
8+
9+
func newLogger(logLevel logrus.Level) *logrus.Entry {
10+
nlog := logrus.New()
11+
nlog.SetOutput(os.Stdout)
12+
nlog.SetLevel(logLevel)
13+
log := logrus.NewEntry(nlog)
14+
return log
15+
}

go.mod

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,36 @@ require (
1818
github.com/sirupsen/logrus v1.9.3
1919
github.com/spf13/cobra v1.9.1
2020
github.com/spf13/pflag v1.0.6
21-
golang.org/x/oauth2 v0.25.0 // indirect
21+
golang.org/x/oauth2 v0.28.0 // indirect
2222
k8s.io/api v0.32.3
2323
k8s.io/apimachinery v0.32.3
2424
k8s.io/cli-runtime v0.32.3
2525
k8s.io/client-go v0.32.3
2626
k8s.io/component-base v0.32.3
27-
k8s.io/utils v0.0.0-20241210054802-24370beab758
27+
k8s.io/utils v0.0.0-20250321185631-1f6e0b77f77e
2828
)
2929

3030
require (
3131
github.com/aws/aws-sdk-go-v2/config v1.29.9
3232
github.com/aws/aws-sdk-go-v2/credentials v1.17.62
3333
github.com/aws/aws-sdk-go-v2/service/ecr v1.43.0
34+
github.com/go-chi/transport v0.5.0
3435
github.com/gofri/go-github-ratelimit v1.1.1
3536
github.com/google/go-cmp v0.7.0
3637
github.com/google/go-containerregistry v0.20.3
3738
github.com/google/go-github/v70 v70.0.0
39+
github.com/hashicorp/go-cleanhttp v0.5.2
3840
github.com/jarcoal/httpmock v1.3.1
41+
github.com/patrickmn/go-cache v2.1.0+incompatible
3942
github.com/stretchr/testify v1.10.0
4043
)
4144

4245
require (
4346
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
4447
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
45-
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
46-
github.com/Azure/go-autorest/logger v0.2.1 // indirect
47-
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
48+
github.com/Azure/go-autorest/autorest/date v0.3.1 // indirect
49+
github.com/Azure/go-autorest/logger v0.2.2 // indirect
50+
github.com/Azure/go-autorest/tracing v0.6.1 // indirect
4851
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect
4952
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
5053
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
@@ -54,22 +57,22 @@ require (
5457
github.com/aws/aws-sdk-go-v2/service/sso v1.25.1 // indirect
5558
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.29.1 // indirect
5659
github.com/aws/aws-sdk-go-v2/service/sts v1.33.17 // indirect
57-
github.com/aws/smithy-go v1.22.2 // indirect
60+
github.com/aws/smithy-go v1.22.3 // indirect
5861
github.com/beorn7/perks v1.0.1 // indirect
5962
github.com/blang/semver/v4 v4.0.0 // indirect
6063
github.com/cespare/xxhash/v2 v2.3.0 // indirect
6164
github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect
6265
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
63-
github.com/docker/cli v27.5.0+incompatible // indirect
66+
github.com/docker/cli v28.0.2+incompatible // indirect
6467
github.com/docker/distribution v2.8.3+incompatible // indirect
65-
github.com/docker/docker-credential-helpers v0.8.2 // indirect
66-
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
68+
github.com/docker/docker-credential-helpers v0.9.3 // indirect
69+
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
6770
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
6871
github.com/go-errors/errors v1.5.1 // indirect
6972
github.com/go-logr/logr v1.4.2 // indirect
70-
github.com/go-openapi/jsonpointer v0.21.0 // indirect
73+
github.com/go-openapi/jsonpointer v0.21.1 // indirect
7174
github.com/go-openapi/jsonreference v0.21.0 // indirect
72-
github.com/go-openapi/swag v0.23.0 // indirect
75+
github.com/go-openapi/swag v0.23.1 // indirect
7376
github.com/gogo/protobuf v1.3.2 // indirect
7477
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
7578
github.com/golang/protobuf v1.5.4 // indirect
@@ -80,11 +83,10 @@ require (
8083
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
8184
github.com/google/uuid v1.6.0 // indirect
8285
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
83-
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
8486
github.com/inconshreveable/mousetrap v1.1.0 // indirect
8587
github.com/josharian/intern v1.0.0 // indirect
8688
github.com/json-iterator/go v1.1.12 // indirect
87-
github.com/klauspost/compress v1.17.11 // indirect
89+
github.com/klauspost/compress v1.18.0 // indirect
8890
github.com/kylelemons/godebug v1.1.0 // indirect
8991
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
9092
github.com/mailru/easyjson v0.9.0 // indirect
@@ -95,33 +97,35 @@ require (
9597
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
9698
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
9799
github.com/opencontainers/go-digest v1.0.0 // indirect
98-
github.com/opencontainers/image-spec v1.1.0 // indirect
100+
github.com/opencontainers/image-spec v1.1.1 // indirect
99101
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
100102
github.com/pkg/errors v0.9.1 // indirect
101103
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
102104
github.com/prometheus/client_model v0.6.1 // indirect
103-
github.com/prometheus/common v0.62.0 // indirect
104-
github.com/prometheus/procfs v0.15.1 // indirect
105-
github.com/vbatts/tar-split v0.11.6 // indirect
105+
github.com/prometheus/common v0.63.0 // indirect
106+
github.com/prometheus/procfs v0.16.0 // indirect
107+
github.com/vbatts/tar-split v0.12.1 // indirect
106108
github.com/x448/float16 v0.8.4 // indirect
107109
github.com/xlab/treeprint v1.2.0 // indirect
108-
golang.org/x/crypto v0.35.0 // indirect
109-
golang.org/x/net v0.36.0 // indirect
110-
golang.org/x/sync v0.11.0 // indirect
111-
golang.org/x/sys v0.30.0 // indirect
112-
golang.org/x/term v0.29.0 // indirect
113-
golang.org/x/text v0.22.0 // indirect
114-
golang.org/x/time v0.9.0 // indirect
115-
google.golang.org/protobuf v1.36.3 // indirect
110+
golang.org/x/crypto v0.36.0 // indirect
111+
golang.org/x/net v0.37.0 // indirect
112+
golang.org/x/sync v0.12.0 // indirect
113+
golang.org/x/sys v0.31.0 // indirect
114+
golang.org/x/term v0.30.0 // indirect
115+
golang.org/x/text v0.23.0 // indirect
116+
golang.org/x/time v0.11.0 // indirect
117+
google.golang.org/protobuf v1.36.6 // indirect
116118
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
117119
gopkg.in/inf.v0 v0.9.1 // indirect
118120
gopkg.in/yaml.v3 v3.0.1 // indirect
121+
gotest.tools/v3 v3.1.0 // indirect
119122
k8s.io/klog/v2 v2.130.1 // indirect
120-
k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect
123+
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
121124
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
122-
sigs.k8s.io/kustomize/api v0.18.0 // indirect
123-
sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
124-
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
125+
sigs.k8s.io/kustomize/api v0.19.0 // indirect
126+
sigs.k8s.io/kustomize/kyaml v0.19.0 // indirect
127+
sigs.k8s.io/randfill v1.0.0 // indirect
128+
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
125129
sigs.k8s.io/yaml v1.4.0 // indirect
126130
)
127131

0 commit comments

Comments
 (0)