From edb092b459dbdd7b7159fa97c05d99bffcd9d50b Mon Sep 17 00:00:00 2001 From: Marco Pracucci Date: Wed, 23 Mar 2022 14:40:20 +0100 Subject: [PATCH] Introduce continuous test tool (#1535) * Added skeleton for mimir-continuous-test tool Signed-off-by: Marco Pracucci * Added metrics server and init logger Signed-off-by: Marco Pracucci --- .gitignore | 2 + Makefile | 3 ++ cmd/mimir-continuous-test/Dockerfile | 11 +++++ cmd/mimir-continuous-test/main.go | 49 +++++++++++++++++++ cmd/query-tee/Dockerfile | 2 +- cmd/query-tee/main.go | 3 +- .../util/instrumentation/metrics.go | 14 +++--- 7 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 cmd/mimir-continuous-test/Dockerfile create mode 100644 cmd/mimir-continuous-test/main.go rename tools/querytee/instrumentation.go => pkg/util/instrumentation/metrics.go (78%) diff --git a/.gitignore b/.gitignore index 4e29235eee2..c5b551abebf 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ cmd/test-exporter/test-exporter cmd/mimir/mimir cmd/query-tee/query-tee cmd/metaconvert/metaconvert +cmd/mimir-continuous-test/mimir-continuous-test .uptodate .pkg .cache @@ -19,6 +20,7 @@ jsonnet-tests/ /mimirtool /query-tee /test-exporter +/mimir-continuous-test # This is custom Makefile modification, if it exists. Makefile.local diff --git a/Makefile b/Makefile index c37c085ef21..a9287d64d7a 100644 --- a/Makefile +++ b/Makefile @@ -362,6 +362,9 @@ dist: ## Generates binaries for a Mimir release. echo "Building metaconvert for $$os/$$arch"; \ GOOS=$$os GOARCH=$$arch CGO_ENABLED=0 go build $(GO_FLAGS) -o ./dist/metaconvert-$$os-$$arch$$suffix ./cmd/metaconvert; \ sha256sum ./dist/metaconvert-$$os-$$arch$$suffix | cut -d ' ' -f 1 > ./dist/metaconvert-$$os-$$arch$$suffix-sha-256; \ + echo "Building mimir-continuous-test for $$os/$$arch"; \ + GOOS=$$os GOARCH=$$arch CGO_ENABLED=0 go build $(GO_FLAGS) -o ./dist/mimir-continuous-test-$$os-$$arch$$suffix ./cmd/mimir-continuous-test; \ + sha256sum ./dist/mimir-continuous-test-$$os-$$arch$$suffix | cut -d ' ' -f 1 > ./dist/mimir-continuous-test-$$os-$$arch$$suffix-sha-256; \ done; \ done; \ touch $@ diff --git a/cmd/mimir-continuous-test/Dockerfile b/cmd/mimir-continuous-test/Dockerfile new file mode 100644 index 00000000000..f0b0b8b339a --- /dev/null +++ b/cmd/mimir-continuous-test/Dockerfile @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: AGPL-3.0-only + +FROM alpine:3.15.0 +RUN apk add --no-cache ca-certificates +COPY mimir-continuous-test / +ENTRYPOINT ["/mimir-continuous-test"] + +ARG revision +LABEL org.opencontainers.image.title="mimir-continuous-test" \ + org.opencontainers.image.source="https://github.com/grafana/mimir/tree/main/cmd/mimir-continuous-test" \ + org.opencontainers.image.revision="${revision}" diff --git a/cmd/mimir-continuous-test/main.go b/cmd/mimir-continuous-test/main.go new file mode 100644 index 00000000000..e0de4e8313f --- /dev/null +++ b/cmd/mimir-continuous-test/main.go @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +package main + +import ( + "flag" + "os" + + "github.com/go-kit/log/level" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/collectors" + "github.com/weaveworks/common/logging" + "github.com/weaveworks/common/server" + + "github.com/grafana/mimir/pkg/util/instrumentation" + util_log "github.com/grafana/mimir/pkg/util/log" +) + +type Config struct { + ServerMetricsPort int + LogLevel logging.Level +} + +func (cfg *Config) RegisterFlags(f *flag.FlagSet) { + f.IntVar(&cfg.ServerMetricsPort, "server.metrics-port", 9900, "The port where metrics are exposed.") + cfg.LogLevel.RegisterFlags(f) +} + +func main() { + // Parse CLI flags. + cfg := &Config{} + cfg.RegisterFlags(flag.CommandLine) + flag.Parse() + + util_log.InitLogger(&server.Config{ + LogLevel: cfg.LogLevel, + }) + logger := util_log.Logger + + // Run the instrumentation server. + registry := prometheus.NewRegistry() + registry.MustRegister(collectors.NewGoCollector()) + + i := instrumentation.NewMetricsServer(cfg.ServerMetricsPort, registry) + if err := i.Start(); err != nil { + level.Error(logger).Log("msg", "Unable to start instrumentation server", "err", err.Error()) + os.Exit(1) + } +} diff --git a/cmd/query-tee/Dockerfile b/cmd/query-tee/Dockerfile index 7ae3164917a..8571fb2bc95 100644 --- a/cmd/query-tee/Dockerfile +++ b/cmd/query-tee/Dockerfile @@ -10,5 +10,5 @@ ENTRYPOINT ["/query-tee"] ARG revision LABEL org.opencontainers.image.title="query-tee" \ - org.opencontainers.image.source="https://github.com/grafana/mimir/tree/main/tools/query-tee" \ + org.opencontainers.image.source="https://github.com/grafana/mimir/tree/main/cmd/query-tee" \ org.opencontainers.image.revision="${revision}" diff --git a/cmd/query-tee/main.go b/cmd/query-tee/main.go index 2a2239ae13a..632703c6529 100644 --- a/cmd/query-tee/main.go +++ b/cmd/query-tee/main.go @@ -15,6 +15,7 @@ import ( "github.com/weaveworks/common/logging" "github.com/weaveworks/common/server" + "github.com/grafana/mimir/pkg/util/instrumentation" util_log "github.com/grafana/mimir/pkg/util/log" "github.com/grafana/mimir/tools/querytee" ) @@ -43,7 +44,7 @@ func main() { registry := prometheus.NewRegistry() registry.MustRegister(collectors.NewGoCollector()) - i := querytee.NewInstrumentationServer(cfg.ServerMetricsPort, registry) + i := instrumentation.NewMetricsServer(cfg.ServerMetricsPort, registry) if err := i.Start(); err != nil { level.Error(util_log.Logger).Log("msg", "Unable to start instrumentation server", "err", err.Error()) os.Exit(1) diff --git a/tools/querytee/instrumentation.go b/pkg/util/instrumentation/metrics.go similarity index 78% rename from tools/querytee/instrumentation.go rename to pkg/util/instrumentation/metrics.go index bf51277ab1a..e06d5db4cef 100644 --- a/tools/querytee/instrumentation.go +++ b/pkg/util/instrumentation/metrics.go @@ -3,7 +3,7 @@ // Provenance-includes-license: Apache-2.0 // Provenance-includes-copyright: The Cortex Authors. -package querytee +package instrumentation import ( "fmt" @@ -18,22 +18,22 @@ import ( util_log "github.com/grafana/mimir/pkg/util/log" ) -type InstrumentationServer struct { +type MetricsServer struct { port int registry *prometheus.Registry srv *http.Server } -// NewInstrumentationServer returns a server exposing Prometheus metrics. -func NewInstrumentationServer(port int, registry *prometheus.Registry) *InstrumentationServer { - return &InstrumentationServer{ +// NewMetricsServer returns a server exposing Prometheus metrics. +func NewMetricsServer(port int, registry *prometheus.Registry) *MetricsServer { + return &MetricsServer{ port: port, registry: registry, } } // Start the instrumentation server. -func (s *InstrumentationServer) Start() error { +func (s *MetricsServer) Start() error { // Setup listener first, so we can fail early if the port is in use. listener, err := net.Listen("tcp", fmt.Sprintf(":%d", s.port)) if err != nil { @@ -57,7 +57,7 @@ func (s *InstrumentationServer) Start() error { } // Stop closes the instrumentation server. -func (s *InstrumentationServer) Stop() { +func (s *MetricsServer) Stop() { if s.srv != nil { s.srv.Close() s.srv = nil