From b83af95d5eee921f8fe2e71732fbeb309ca7c38a Mon Sep 17 00:00:00 2001 From: Bartlomiej Plotka Date: Wed, 4 Aug 2021 16:19:20 +0200 Subject: [PATCH] Added integrated monitoring. (#5) Signed-off-by: Bartlomiej Plotka --- README.md | 51 +++- db/db.go | 45 +-- db/prometheus.go | 2 +- db/thanos.go | 6 +- env.go | 36 ++- env_docker.go | 130 ++++++--- examples/thanos/go.sum | 8 + examples/thanos/standalone.go | 52 ++-- go.mod | 1 + go.sum | 9 + http.go => instrumented.go | 31 ++- ..._composite.go => instrumented_composite.go | 23 +- http_test.go => instrumented_test.go | 0 monitoring.png | Bin 0 -> 192932 bytes monitoring/monitoring.go | 111 +++++++- .../promconfig/discovery/azure/azure.go | 36 +++ .../promconfig/discovery/config/config.go | 65 +++++ .../promconfig/discovery/consul/consul.go | 57 ++++ monitoring/promconfig/discovery/dns/dns.go | 32 +++ monitoring/promconfig/discovery/ec2/ec2.go | 45 +++ monitoring/promconfig/discovery/file/file.go | 30 ++ monitoring/promconfig/discovery/gce/gce.go | 43 +++ .../discovery/kubernetes/kubernetes.go | 60 ++++ .../promconfig/discovery/marathon/marathon.go | 34 +++ .../discovery/openstack/openstack.go | 56 ++++ .../discovery/targetgroup/targetgroup.go | 99 +++++++ .../promconfig/discovery/triton/triton.go | 38 +++ .../discovery/zookeeper/zookeeper.go | 38 +++ monitoring/promconfig/prometheus.go | 261 ++++++++++++++++++ 29 files changed, 1265 insertions(+), 134 deletions(-) rename http.go => instrumented.go (87%) rename http_composite.go => instrumented_composite.go (79%) rename http_test.go => instrumented_test.go (100%) create mode 100644 monitoring.png create mode 100644 monitoring/promconfig/discovery/azure/azure.go create mode 100644 monitoring/promconfig/discovery/config/config.go create mode 100644 monitoring/promconfig/discovery/consul/consul.go create mode 100644 monitoring/promconfig/discovery/dns/dns.go create mode 100644 monitoring/promconfig/discovery/ec2/ec2.go create mode 100644 monitoring/promconfig/discovery/file/file.go create mode 100644 monitoring/promconfig/discovery/gce/gce.go create mode 100644 monitoring/promconfig/discovery/kubernetes/kubernetes.go create mode 100644 monitoring/promconfig/discovery/marathon/marathon.go create mode 100644 monitoring/promconfig/discovery/openstack/openstack.go create mode 100644 monitoring/promconfig/discovery/targetgroup/targetgroup.go create mode 100644 monitoring/promconfig/discovery/triton/triton.go create mode 100644 monitoring/promconfig/discovery/zookeeper/zookeeper.go create mode 100644 monitoring/promconfig/prometheus.go diff --git a/README.md b/README.md index 879ee4f..bb17b96 100644 --- a/README.md +++ b/README.md @@ -25,24 +25,25 @@ Let's go through an example leveraging `go test` flow: 1. Implement the workload by embedding`e2e.Runnable` or `*e2e.InstrumentedRunnable`. Or you can use existing ones in [e2edb](db/) package. For example implementing Thanos Querier with our desired configuration could look like this: - ```go mdox-exec="sed -n '47,64p' examples/thanos/standalone.go" + ```go mdox-exec="sed -n '49,67p' examples/thanos/standalone.go" func newThanosSidecar(env e2e.Environment, name string, prom e2e.Linkable) *e2e.InstrumentedRunnable { ports := map[string]int{ "http": 9090, "grpc": 9091, } - return e2e.NewInstrumentedRunnable(env, name, ports, "http", e2e.StartOptions{ - Image: "quay.io/thanos/thanos:v0.21.1", - Command: e2e.NewCommand("sidecar", e2e.BuildArgs(map[string]string{ - "--debug.name": name, - "--grpc-address": fmt.Sprintf(":%d", ports["grpc"]), - "--http-address": fmt.Sprintf(":%d", ports["http"]), - "--prometheus.url": "http://" + prom.InternalEndpoint(e2edb.AccessPortName), - "--log.level": "info", - })...), - Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), - User: strconv.Itoa(os.Getuid()), - }) + return e2e.NewInstrumentedRunnable(env, name, ports, "http").Init( + e2e.StartOptions{ + Image: "quay.io/thanos/thanos:v0.21.1", + Command: e2e.NewCommand("sidecar", e2e.BuildArgs(map[string]string{ + "--debug.name": name, + "--grpc-address": fmt.Sprintf(":%d", ports["grpc"]), + "--http-address": fmt.Sprintf(":%d", ports["http"]), + "--prometheus.url": "http://" + prom.InternalEndpoint(e2edb.AccessPortName), + "--log.level": "info", + })...), + Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), + User: strconv.Itoa(os.Getuid()), + }) } ``` @@ -119,6 +120,30 @@ Let's go through an example leveraging `go test` flow: } ``` +### Monitoring + +Each instrumented workload have programmatic access to latest metrics with `WaitSumMetricsWithOptions` methods family. Yet, especially for standalone mode it's often useful to query yourself and visualisate metrics provided by your workloads and environment. In order to do so just start monitoring from `e2emontioring` package: + +```go +mon, err := e2emonitoring.Start(e) +if err != nil { + return err +} +``` + +This will start Prometheus with automatic discovery for every new and old instrumented runnables being scraped. It also runs cadvisor that monitors docker itself if `env.DockerEnvironment` is started. Run `OpenUserInterfaceInBrowser()` to open Prometheus UI in browser. + +```go + // Open monitoring page with all metrics. + if err := mon.OpenUserInterfaceInBrowser(); err != nil { + return err + } +``` + +To see how it works in practice run our example code in [standalone.go](examples/thanos/standalone.go) by running `make run-example`. At the end two UI should show in your browser. Thanos one and monitoring one. You can then e.g query docker container metrics using `sum(container_memory_working_set_bytes{name!=""}) by (name)` metric e.g: + +![mem metric](monitoring.png) + ## Credits * Initial Authors: [@pracucci](https://github.com/pracucci), [@bwplotka](https://github.com/bwplotka), [@pstibrany](https://github.com/pstibrany) diff --git a/db/db.go b/db/db.go index a4eee10..081e5cf 100644 --- a/db/db.go +++ b/db/db.go @@ -61,7 +61,7 @@ func NewMinio(env e2e.Environment, name, bktName string, opts ...Option) *e2e.In "MINIO_KMS_KES_CERT_FILE=" + "root.cert", "MINIO_KMS_KES_KEY_NAME=" + "my-minio-key", } - f := e2e.NewFutureInstrumentedRunnable(env, name, ports, AccessPortName) + f := e2e.NewInstrumentedRunnable(env, name, ports, AccessPortName) return f.Init( e2e.StartOptions{ Image: o.image, @@ -87,11 +87,7 @@ func NewConsul(env e2e.Environment, name string, opts ...Option) *e2e.Instrument } e2e.MergeFlags() - return e2e.NewInstrumentedRunnable( - env, - name, - map[string]int{AccessPortName: 8500}, - AccessPortName, + return e2e.NewInstrumentedRunnable(env, name, map[string]int{AccessPortName: 8500}, AccessPortName).Init( e2e.StartOptions{ Image: o.image, // Run consul in "dev" mode so that the initial leader election is immediate. @@ -107,11 +103,7 @@ func NewDynamoDB(env e2e.Environment, name string, opts ...Option) *e2e.Instrume opt(&o) } - return e2e.NewInstrumentedRunnable( - env, - name, - map[string]int{AccessPortName: 8000}, - AccessPortName, + return e2e.NewInstrumentedRunnable(env, name, map[string]int{AccessPortName: 8000}, AccessPortName).Init( e2e.StartOptions{ Image: o.image, Command: e2e.NewCommand("-jar", "DynamoDBLocal.jar", "-inMemory", "-sharedDb"), @@ -127,11 +119,7 @@ func NewBigtable(env e2e.Environment, name string, opts ...Option) *e2e.Instrume opt(&o) } - return e2e.NewInstrumentedRunnable( - env, - name, - nil, - AccessPortName, + return e2e.NewInstrumentedRunnable(env, name, nil, AccessPortName).Init( e2e.StartOptions{ Image: o.image, }, @@ -144,11 +132,7 @@ func NewCassandra(env e2e.Environment, name string, opts ...Option) *e2e.Instrum opt(&o) } - return e2e.NewInstrumentedRunnable( - env, - name, - map[string]int{AccessPortName: 9042}, - AccessPortName, + return e2e.NewInstrumentedRunnable(env, name, map[string]int{AccessPortName: 9042}, AccessPortName).Init( e2e.StartOptions{ Image: o.image, // Readiness probe inspired from https://github.com/kubernetes/examples/blob/b86c9d50be45eaf5ce74dee7159ce38b0e149d38/cassandra/image/files/ready-probe.sh @@ -163,11 +147,7 @@ func NewSwiftStorage(env e2e.Environment, name string, opts ...Option) *e2e.Inst opt(&o) } - return e2e.NewInstrumentedRunnable( - env, - name, - map[string]int{AccessPortName: 8080}, - AccessPortName, + return e2e.NewInstrumentedRunnable(env, name, map[string]int{AccessPortName: 8080}, AccessPortName).Init( e2e.StartOptions{ Image: o.image, Readiness: e2e.NewHTTPReadinessProbe(AccessPortName, "/", 404, 404), @@ -181,9 +161,7 @@ func NewMemcached(env e2e.Environment, name string, opts ...Option) e2e.Runnable opt(&o) } - return env.Runnable( - name, - map[string]int{AccessPortName: 11211}, + return env.Runnable(name).WithPorts(map[string]int{AccessPortName: 11211}).Init( e2e.StartOptions{ Image: o.image, Readiness: e2e.NewTCPReadinessProbe(AccessPortName), @@ -197,14 +175,7 @@ func NewETCD(env e2e.Environment, name string, opts ...Option) *e2e.Instrumented opt(&o) } - return e2e.NewInstrumentedRunnable( - env, - name, - map[string]int{ - AccessPortName: 2379, - "metrics": 9000, - }, - "metrics", + return e2e.NewInstrumentedRunnable(env, name, map[string]int{AccessPortName: 2379, "metrics": 9000}, "metrics").Init( e2e.StartOptions{ Image: o.image, Command: e2e.NewCommand("/usr/local/bin/etcd", "--listen-client-urls=http://0.0.0.0:2379", "--advertise-client-urls=http://0.0.0.0:2379", "--listen-metrics-urls=http://0.0.0.0:9000", "--log-level=error"), diff --git a/db/prometheus.go b/db/prometheus.go index e9b6455..9e17517 100644 --- a/db/prometheus.go +++ b/db/prometheus.go @@ -26,7 +26,7 @@ func NewPrometheus(env e2e.Environment, name string, opts ...Option) *Prometheus ports := map[string]int{"http": 9090} - f := e2e.NewFutureInstrumentedRunnable(env, name, ports, "http") + f := e2e.NewInstrumentedRunnable(env, name, ports, "http") config := fmt.Sprintf(` global: external_labels: diff --git a/db/thanos.go b/db/thanos.go index 443e433..72a6bf7 100644 --- a/db/thanos.go +++ b/db/thanos.go @@ -38,7 +38,7 @@ func NewThanosQuerier(env e2e.Environment, name string, endpointsAddresses []str args = e2e.MergeFlagsWithoutRemovingEmpty(args, o.flagOverride) } - return e2e.NewInstrumentedRunnable(env, name, ports, "http", e2e.StartOptions{ + return e2e.NewInstrumentedRunnable(env, name, ports, "http").Init(e2e.StartOptions{ Image: o.image, Command: e2e.NewCommand("query", e2e.BuildKingpinArgs(args)...), Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), @@ -68,7 +68,7 @@ func NewThanosSidecar(env e2e.Environment, name string, prom e2e.Linkable, opts args = e2e.MergeFlagsWithoutRemovingEmpty(args, o.flagOverride) } - return e2e.NewInstrumentedRunnable(env, name, ports, "http", e2e.StartOptions{ + return e2e.NewInstrumentedRunnable(env, name, ports, "http").Init(e2e.StartOptions{ Image: o.image, Command: e2e.NewCommand("sidecar", e2e.BuildKingpinArgs(args)...), Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), @@ -87,7 +87,7 @@ func NewThanosStore(env e2e.Environment, name string, bktConfigYaml []byte, opts "grpc": 9091, } - f := e2e.NewFutureInstrumentedRunnable(env, name, ports, "http") + f := e2e.NewInstrumentedRunnable(env, name, ports, "http") args := map[string]string{ "--debug.name": name, "--grpc-address": fmt.Sprintf(":%d", ports["grpc"]), diff --git a/env.go b/env.go index 5e8d8c2..9fff011 100644 --- a/env.go +++ b/env.go @@ -42,23 +42,31 @@ func WithVerbose() EnvironmentOption { // Environment defines how to run Runnable in isolated area e.g via docker in isolated docker network. type Environment interface { + // SharedDir returns host directory that will be shared with all runnables. SharedDir() string - // Runnable returns instance of runnable which can be started and stopped within this environment. - Runnable(name string, Ports map[string]int, opts StartOptions) Runnable - // FutureRunnable returns instance of runnable which can be started and stopped within this environment. - FutureRunnable(name string, Ports map[string]int) FutureRunnable - // Close shutdowns isolated environment and cleans it's resources. + // Runnable returns runnable builder which can build runnables that can be started and stopped within this environment. + Runnable(name string) RunnableBuilder + // AddListener registers given listener to be notified on environment runnable changes. + AddListener(listener EnvironmentListener) + // Close shutdowns isolated environment and cleans its resources. Close() } +type EnvironmentListener interface { + OnRunnableChange(started []Runnable) error +} + type StartOptions struct { Image string EnvVars map[string]string User string Command Command Readiness ReadinessProbe - // WaitReadyBackoff represents backoff used for WaitReady. + // WaitReadyBackofff represents backoff used for WaitReady. WaitReadyBackoff *backoff.Config + Volumes []string + UserNs string + Privileged bool } // Linkable is the entity that one can use to link runnable to other runnables before started. @@ -84,8 +92,24 @@ type FutureRunnable interface { Init(opts StartOptions) Runnable } +type RunnableBuilder interface { + WithPorts(map[string]int) RunnableBuilder + WithConcreteType(r Runnable) RunnableBuilder + + // Future returns future runnable + Future() FutureRunnable + // Init returns runnable. + Init(opts StartOptions) Runnable +} + +type identificable interface { + id() uintptr +} + // Runnable is the entity that environment returns to manage single instance. type Runnable interface { + identificable + Linkable // IsRunning returns if runnable was started. diff --git a/env_docker.go b/env_docker.go index 4458e0d..d7908bb 100644 --- a/env_docker.go +++ b/env_docker.go @@ -16,6 +16,7 @@ import ( "strconv" "strings" "time" + "unsafe" "github.com/efficientgo/tools/core/pkg/backoff" "github.com/pkg/errors" @@ -36,6 +37,7 @@ type DockerEnvironment struct { networkName string registered map[string]struct{} + listeners []EnvironmentListener started []Runnable verbose bool @@ -85,58 +87,63 @@ func NewDockerEnvironment(name string, opts ...EnvironmentOption) (*DockerEnviro return d, nil } -func (e *DockerEnvironment) Runnable(name string, ports map[string]int, opts StartOptions) Runnable { - return e.FutureRunnable(name, ports).Init(opts) -} - -func (e *DockerEnvironment) FutureRunnable(name string, ports map[string]int) FutureRunnable { +func (e *DockerEnvironment) Runnable(name string) RunnableBuilder { if e.closed { - return ErrRunnable{name: name, err: errors.New("environment close was invoked already.")} + return Errorer{name: name, err: errors.New("environment close was invoked already.")} } if e.isRegistered(name) { - return ErrRunnable{name: name, err: errors.Errorf("there is already one runnable created with the same name %v", name)} + return Errorer{name: name, err: errors.Errorf("there is already one runnable created with the same name %v", name)} } d := &dockerRunnable{ env: e, name: name, - ports: ports, logger: e.logger, + ports: map[string]int{}, hostPorts: map[string]int{}, } + d.concreteType = d if err := os.MkdirAll(d.Dir(), 0750); err != nil { - return ErrRunnable{name: name, err: err} + return Errorer{name: name, err: err} } - e.register(name) return d } -type ErrRunnable struct { +// AddListener registers given listener to be notified on environment runnable changes. +func (e *DockerEnvironment) AddListener(listener EnvironmentListener) { + e.listeners = append(e.listeners, listener) +} + +type Errorer struct { name string err error } -func NewErrRunnable(name string, err error) ErrRunnable { - return ErrRunnable{ +func NewErrorer(name string, err error) Errorer { + return Errorer{ name: name, err: err, } } -func (r ErrRunnable) Name() string { return r.name } -func (ErrRunnable) Dir() string { return "" } -func (ErrRunnable) InternalDir() string { return "" } -func (r ErrRunnable) Start() error { return r.err } -func (r ErrRunnable) WaitReady() error { return r.err } -func (r ErrRunnable) Kill() error { return r.err } -func (r ErrRunnable) Stop() error { return r.err } -func (r ErrRunnable) Exec(Command) (string, string, error) { return "", "", r.err } -func (ErrRunnable) Endpoint(string) string { return "" } -func (ErrRunnable) InternalEndpoint(string) string { return "" } -func (ErrRunnable) IsRunning() bool { return false } -func (r ErrRunnable) Init(StartOptions) Runnable { return r } +func (e Errorer) id() uintptr { return 0 } +func (e Errorer) Name() string { return e.name } +func (Errorer) Dir() string { return "" } +func (Errorer) InternalDir() string { return "" } +func (e Errorer) Start() error { return e.err } +func (e Errorer) WaitReady() error { return e.err } +func (e Errorer) Kill() error { return e.err } +func (e Errorer) Stop() error { return e.err } +func (e Errorer) Exec(Command) (string, string, error) { return "", "", e.err } +func (Errorer) Endpoint(string) string { return "" } +func (Errorer) InternalEndpoint(string) string { return "" } +func (Errorer) IsRunning() bool { return false } +func (e Errorer) Init(StartOptions) Runnable { return e } +func (e Errorer) WithPorts(map[string]int) RunnableBuilder { return e } +func (e Errorer) WithConcreteType(Runnable) RunnableBuilder { return e } +func (e Errorer) Future() FutureRunnable { return e } func (e *DockerEnvironment) isRegistered(name string) bool { _, ok := e.registered[name] @@ -147,16 +154,30 @@ func (e *DockerEnvironment) register(name string) { e.registered[name] = struct{}{} } -func (e *DockerEnvironment) registerStarted(r Runnable) { +func (e *DockerEnvironment) registerStarted(r Runnable) error { e.started = append(e.started, r) + + for _, l := range e.listeners { + if err := l.OnRunnableChange(e.started); err != nil { + return err + } + } + return nil } -func (e *DockerEnvironment) registerStopped(name string) { +func (e *DockerEnvironment) registerStopped(name string) error { for i, r := range e.started { if r.Name() == name { e.started = append(e.started[:i], e.started[i+1:]...) + for _, l := range e.listeners { + if err := l.OnRunnableChange(e.started); err != nil { + return err + } + } + return nil } } + return nil } func (e *DockerEnvironment) SharedDir() string { @@ -166,9 +187,13 @@ func (e *DockerEnvironment) SharedDir() string { func (e *DockerEnvironment) buildDockerRunArgs(name string, ports map[string]int, opts StartOptions) []string { args := []string{"run", "--rm", "--net=" + e.networkName, "--name=" + dockerNetworkContainerHost(e.networkName, name), "--hostname=" + name} - // Mount the shared/ directory into the container. We share all containers dir to each othe to allow easier scenarios. + // Mount the shared/ directory into the container. We share all containers dir to each other to allow easier scenarios. args = append(args, "-v", fmt.Sprintf("%s:%s:z", e.dir, dockerLocalSharedDir)) + for _, v := range opts.Volumes { + args = append(args, "-v", v) + } + // Environment variables for name, value := range opts.EnvVars { args = append(args, "-e", name+"="+value) @@ -178,6 +203,13 @@ func (e *DockerEnvironment) buildDockerRunArgs(name string, ports map[string]int args = append(args, "--user", opts.User) } + if opts.UserNs != "" { + args = append(args, "--userns", opts.UserNs) + } + + if opts.Privileged { + args = append(args, "--privileged") + } // Published ports. for _, port := range ports { args = append(args, "-p", strconv.Itoa(port)) @@ -213,6 +245,8 @@ type dockerRunnable struct { // hostPorts Maps port name to dynamically binded local ports. hostPorts map[string]int + + concreteType Runnable } func (d *dockerRunnable) Name() string { @@ -241,6 +275,24 @@ func (d *dockerRunnable) Init(opts StartOptions) Runnable { return d } +func (d *dockerRunnable) WithPorts(ports map[string]int) RunnableBuilder { + d.ports = ports + return d +} + +func (d *dockerRunnable) WithConcreteType(r Runnable) RunnableBuilder { + d.concreteType = r + return d +} + +func (d *dockerRunnable) id() uintptr { + return uintptr(unsafe.Pointer(d)) +} + +func (d *dockerRunnable) Future() FutureRunnable { + return d +} + func (d *dockerRunnable) IsRunning() bool { return d.usedNetworkName != "" } @@ -251,6 +303,14 @@ func (d *dockerRunnable) Start() (err error) { return errors.Errorf("%v is running. Stop or kill it first to restart.", d.Name()) } + i, ok := d.concreteType.(identificable) + if !ok { + return errors.Errorf("concrete type has at least embed runnable or future runnable instance provided by Runnable builder, got %T; not implementing identificable", d.concreteType) + } + if i.id() != d.id() { + return errors.Errorf("concrete type has at least embed runnable or future runnable instance provided by Runnable builder, got %T; id %v, expected %v", d.concreteType, i.id(), d.id()) + } + d.logger.Log("Starting", d.Name()) // In case of any error, if the container was already created, we @@ -276,7 +336,9 @@ func (d *dockerRunnable) Start() (err error) { return err } - d.env.registerStarted(d) + if err := d.env.registerStarted(d.concreteType); err != nil { + return err + } // Get the dynamic local ports mapped to the container. for portName, containerPort := range d.ports { @@ -319,8 +381,7 @@ func (d *dockerRunnable) Stop() error { return err } d.usedNetworkName = "" - d.env.registerStopped(d.Name()) - return nil + return d.env.registerStopped(d.Name()) } func (d *dockerRunnable) Kill() error { @@ -340,8 +401,7 @@ func (d *dockerRunnable) Kill() error { _, _ = d.env.exec("docker", "wait", d.containerName()).CombinedOutput() d.usedNetworkName = "" - d.env.registerStopped(d.Name()) - return nil + return d.env.registerStopped(d.Name()) } // Endpoint returns external (from host perspective) service endpoint (host:port) for given port name. @@ -463,7 +523,6 @@ func (d *dockerRunnable) WaitReady() (err error) { d.waitBackoff.Wait() } - return errors.Wrapf(err, "the service %s is not ready", d.Name()) } @@ -557,8 +616,9 @@ func (e *DockerEnvironment) close() { // Kill the services in the opposite order. for i := len(e.started) - 1; i >= 0; i-- { + n := e.started[i].Name() if err := e.started[i].Kill(); err != nil { - e.logger.Log("Unable to kill service", e.started[i].Name(), ":", err.Error()) + e.logger.Log("Unable to kill service", n, ":", err.Error()) } } diff --git a/examples/thanos/go.sum b/examples/thanos/go.sum index 0295ac7..cf7b76d 100644 --- a/examples/thanos/go.sum +++ b/examples/thanos/go.sum @@ -22,11 +22,13 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -127,6 +129,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -170,6 +173,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -232,6 +236,7 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -309,6 +314,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -336,8 +342,10 @@ golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/examples/thanos/standalone.go b/examples/thanos/standalone.go index 18777ab..a1c9f6e 100644 --- a/examples/thanos/standalone.go +++ b/examples/thanos/standalone.go @@ -14,6 +14,7 @@ import ( "github.com/efficientgo/e2e" e2edb "github.com/efficientgo/e2e/db" e2einteractive "github.com/efficientgo/e2e/interactive" + e2emonitoring "github.com/efficientgo/e2e/monitoring" "github.com/efficientgo/tools/core/pkg/merrors" "github.com/oklog/run" ) @@ -36,12 +37,13 @@ func newThanosQuerier(env e2e.Environment, name string, endpointsAddresses ...st for _, e := range endpointsAddresses { args = append(args, "--store="+e) } - return e2e.NewInstrumentedRunnable(env, name, ports, "http", e2e.StartOptions{ - Image: "quay.io/thanos/thanos:v0.21.1", - Command: e2e.NewCommand("query", args...), - Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), - User: strconv.Itoa(os.Getuid()), - }) + return e2e.NewInstrumentedRunnable(env, name, ports, "http").Init( + e2e.StartOptions{ + Image: "quay.io/thanos/thanos:v0.21.1", + Command: e2e.NewCommand("query", args...), + Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), + User: strconv.Itoa(os.Getuid()), + }) } func newThanosSidecar(env e2e.Environment, name string, prom e2e.Linkable) *e2e.InstrumentedRunnable { @@ -49,21 +51,22 @@ func newThanosSidecar(env e2e.Environment, name string, prom e2e.Linkable) *e2e. "http": 9090, "grpc": 9091, } - return e2e.NewInstrumentedRunnable(env, name, ports, "http", e2e.StartOptions{ - Image: "quay.io/thanos/thanos:v0.21.1", - Command: e2e.NewCommand("sidecar", e2e.BuildArgs(map[string]string{ - "--debug.name": name, - "--grpc-address": fmt.Sprintf(":%d", ports["grpc"]), - "--http-address": fmt.Sprintf(":%d", ports["http"]), - "--prometheus.url": "http://" + prom.InternalEndpoint(e2edb.AccessPortName), - "--log.level": "info", - })...), - Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), - User: strconv.Itoa(os.Getuid()), - }) + return e2e.NewInstrumentedRunnable(env, name, ports, "http").Init( + e2e.StartOptions{ + Image: "quay.io/thanos/thanos:v0.21.1", + Command: e2e.NewCommand("sidecar", e2e.BuildArgs(map[string]string{ + "--debug.name": name, + "--grpc-address": fmt.Sprintf(":%d", ports["grpc"]), + "--http-address": fmt.Sprintf(":%d", ports["http"]), + "--prometheus.url": "http://" + prom.InternalEndpoint(e2edb.AccessPortName), + "--log.level": "info", + })...), + Readiness: e2e.NewHTTPReadinessProbe("http", "/-/ready", 200, 200), + User: strconv.Itoa(os.Getuid()), + }) } -func deploy(ctx context.Context) error { +func deployWithMonitoring(ctx context.Context) error { // Start isolated environment with given ref. e, err := e2e.NewDockerEnvironment("e2e_example") if err != nil { @@ -72,6 +75,11 @@ func deploy(ctx context.Context) error { // Make sure resources (e.g docker containers, network, dir) are cleaned. defer e.Close() + mon, err := e2emonitoring.Start(e) + if err != nil { + return err + } + // Create structs for Prometheus containers scraping itself. p1 := e2edb.NewPrometheus(e, "prometheus-1") s1 := newThanosSidecar(e, "sidecar-1", p1) @@ -103,6 +111,10 @@ func deploy(ctx context.Context) error { if err := e2einteractive.OpenInBrowser("http://" + t1.Endpoint("http")); err != nil { return err } + // Open monitoring page with all metrics. + if err := mon.OpenUserInterfaceInBrowser(); err != nil { + return err + } // For interactive mode, wait until user interrupt. fmt.Println("Waiting on user interrupt (e.g Ctrl+C") <-ctx.Done() @@ -115,7 +127,7 @@ func main() { g.Add(run.SignalHandler(context.Background(), syscall.SIGINT, syscall.SIGTERM)) { ctx, cancel := context.WithCancel(context.Background()) - g.Add(func() error { return deploy(ctx) }, func(error) { cancel() }) + g.Add(func() error { return deployWithMonitoring(ctx) }, func(error) { cancel() }) } if err := g.Run(); err != nil { log.Fatal(err) diff --git a/go.mod b/go.mod index 1faa4ae..b6df87b 100644 --- a/go.mod +++ b/go.mod @@ -7,4 +7,5 @@ require ( github.com/pkg/errors v0.9.1 github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.15.0 + gopkg.in/yaml.v2 v2.3.0 ) diff --git a/go.sum b/go.sum index dc91c73..e7d6efb 100644 --- a/go.sum +++ b/go.sum @@ -22,11 +22,13 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -127,6 +129,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -167,6 +170,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -208,6 +212,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -226,6 +231,7 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -303,6 +309,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -330,8 +337,10 @@ golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/http.go b/instrumented.go similarity index 87% rename from http.go rename to instrumented.go index 6bbbc8f..2f73288 100644 --- a/http.go +++ b/instrumented.go @@ -19,12 +19,25 @@ import ( var errMissingMetric = errors.New("metric not found") +type MetricTarget struct { + InternalEndpoint string + MetricPath string +} + +// Instrumented is implemented by all instrumented runnables. +type Instrumented interface { + MetricTargets() []MetricTarget +} + +var _ Instrumented = &InstrumentedRunnable{} + // InstrumentedRunnable represents opinionated microservice with one port marked as HTTP port with metric endpoint. type InstrumentedRunnable struct { Runnable name string metricPortName string + metricPath string ports map[string]int waitBackoff *backoff.Backoff @@ -36,31 +49,27 @@ type FutureInstrumentedRunnable struct { r *InstrumentedRunnable } -func NewFutureInstrumentedRunnable( +func NewInstrumentedRunnable( env Environment, name string, ports map[string]int, metricPortName string, ) *FutureInstrumentedRunnable { f := &FutureInstrumentedRunnable{ - r: &InstrumentedRunnable{name: name, ports: ports, metricPortName: metricPortName}, + r: &InstrumentedRunnable{name: name, ports: ports, metricPortName: metricPortName, metricPath: "/metrics"}, } if _, ok := ports[metricPortName]; !ok { - f.FutureRunnable = NewErrRunnable(name, errors.Errorf("metric port name %v does not exists in given ports", metricPortName)) + f.FutureRunnable = NewErrorer(name, errors.Errorf("metric port name %v does not exists in given ports", metricPortName)) return f } - f.FutureRunnable = env.FutureRunnable(name, ports) + f.FutureRunnable = env.Runnable(name).WithPorts(ports).WithConcreteType(f.r).Future() return f } -func NewInstrumentedRunnable(env Environment, name string, ports map[string]int, metricPortName string, opts StartOptions) *InstrumentedRunnable { - return NewFutureInstrumentedRunnable(env, name, ports, metricPortName).Init(opts) -} - func NewErrInstrumentedRunnable(name string, err error) *InstrumentedRunnable { return &InstrumentedRunnable{ - Runnable: NewErrRunnable(name, err), + Runnable: NewErrorer(name, err), } } @@ -78,6 +87,10 @@ func (r *FutureInstrumentedRunnable) Init(opts StartOptions) *InstrumentedRunnab return r.r } +func (r *InstrumentedRunnable) MetricTargets() []MetricTarget { + return []MetricTarget{{MetricPath: r.metricPath, InternalEndpoint: r.InternalEndpoint(r.metricPortName)}} +} + func (r *InstrumentedRunnable) Metrics() (_ string, err error) { if !r.IsRunning() { return "", errors.Errorf("%s is not running", r.Name()) diff --git a/http_composite.go b/instrumented_composite.go similarity index 79% rename from http_composite.go rename to instrumented_composite.go index 22cb5cc..8049921 100644 --- a/http_composite.go +++ b/instrumented_composite.go @@ -30,25 +30,32 @@ func NewCompositeInstrumentedRunnable(runnables ...*InstrumentedRunnable) *Compo } } -func (s *CompositeInstrumentedRunnable) Instances() []*InstrumentedRunnable { - return s.runnables +func (r *CompositeInstrumentedRunnable) Instances() []*InstrumentedRunnable { + return r.runnables +} + +func (r *CompositeInstrumentedRunnable) MetricTargets() (ret []MetricTarget) { + for _, inst := range r.runnables { + ret = append(ret, inst.MetricTargets()...) + } + return ret } // WaitSumMetrics waits for at least one instance of each given metric names to be present and their sums, returning true // when passed to given expected(...). -func (s *CompositeInstrumentedRunnable) WaitSumMetrics(expected MetricValueExpectation, metricNames ...string) error { - return s.WaitSumMetricsWithOptions(expected, metricNames) +func (r *CompositeInstrumentedRunnable) WaitSumMetrics(expected MetricValueExpectation, metricNames ...string) error { + return r.WaitSumMetricsWithOptions(expected, metricNames) } -func (s *CompositeInstrumentedRunnable) WaitSumMetricsWithOptions(expected MetricValueExpectation, metricNames []string, opts ...MetricsOption) error { +func (r *CompositeInstrumentedRunnable) WaitSumMetricsWithOptions(expected MetricValueExpectation, metricNames []string, opts ...MetricsOption) error { var ( sums []float64 err error options = buildMetricsOptions(opts) ) - for s.backoff.Reset(); s.backoff.Ongoing(); { - sums, err = s.SumMetrics(metricNames, opts...) + for r.backoff.Reset(); r.backoff.Ongoing(); { + sums, err = r.SumMetrics(metricNames, opts...) if options.waitMissingMetrics && errors.Is(err, errMissingMetric) { continue } @@ -60,7 +67,7 @@ func (s *CompositeInstrumentedRunnable) WaitSumMetricsWithOptions(expected Metri return nil } - s.backoff.Wait() + r.backoff.Wait() } return errors.Errorf("unable to find metrics %s with expected values. Last error: %v. Last values: %v", metricNames, err, sums) diff --git a/http_test.go b/instrumented_test.go similarity index 100% rename from http_test.go rename to instrumented_test.go diff --git a/monitoring.png b/monitoring.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd818e4b50d2aa0fca24453d836bd49b641f789 GIT binary patch literal 192932 zcmeFZcRXC%`#=RO^cF_% z-ETRcd(QdX@BQn(Uibd@-7j9}nCv~XXRl{H&+{&8g(xdZ;og689}5c$S4R4cDi+pV zaqt_0eFMBgC?#+P{&UY!TE_(oi!%87_m9Y>9dj(Kr&uy?UaNbiu1|S*nvN#j*>(vF zrJt;zm)mTdTqqZ5)XE(e3ZUZaiKa(=yJwwpD;i(*-7D;r)}UJikhi3F5?lADyAJoA z%ADbgw5aIOY8ZM)B44L8+Hz*5t<6QMu1+*MqO{~FeUEZYZ|0Qv4{#g*Io{!S^6~NA zsmJ~M1uU#tJj(Su|Ni-%X`G`(blm>mSFm7Q3?%>j`Sce}&+UKy!giB({`cJ>l+pVC z{L?$-V7mXk?0-Cxt~>SrKCb5>@(gN)CiKIO1?o@MYi@nbL2!>NB!2l-_4zG7&C@#{ zTdYWj_gyirbp0o;|^eJ#*d&vr&S0>}&g7xJ6NDvbXO)LU1cB)jF#TCV>2 z#{_0Ps70#BG8})8>G$8Uh2wAe|FDRb+2Z=IftO^A3c6c=k1IyrJNR|Rw?iN`z~0o^2Pr>2@8Mi%i{HP`Ogs`NQdB$ZEZbQ>w4&T#jex9HQxWv6MNUw zqPRK7=b)Prow{y$H*dt6Cn-26NKjCyOhXfMaN1-4{mO+flQd|q#`+1j$lvez9oHl} z291k>>Q*`W&z>38dRq66MdDG43L^UdJ_ie{HtLqwxP`UM4yTdlW!y{y>7z$f==eTD zS@S+Az3B_9-ueg2gShT`|6K7lS$;QBUki4=XOya#HyKVSA(J!wwLJhOQE6gAhz{?K z=kPyRG7`DSnBh*6S3{5ic{S zJe{05l~j-YjIYXDv^^9|?YqYbOQ}0Vliq)@`*G^lKR1yGRZCnvwS)^DZitPe(Ywg2 zi;u6KJ`E7wpY?;mj*Lj-F*C&wI>g@>@F(|@3_gbRb1>t&i{GG+lV0v;PZEQx)5d+x z`6``50FibH^TyO{m=lqFm=c7o^QE*{ap91yyOYxd7;9VCsmJ5wvnx9TNQR+e`Bjx zzrw8(&z`K27#~j?_L&g-mSCD;_NZZXjeycS`BlN{i@xVX&E zD%xzCZnl$%irq|_kCUdAJkNKXUDR3PMpl2XZ8Dd=EE}@A>9wh%QZXED5+}hNk8Vz85}IIvkPlvUG$BE6dA{aHhrG#jkIm_4RpOCgpV^?bTHh?wS^g?(woY zU#;t!VSiTC)#c_6R2~Lu^~i)sNCXZI4XK8hIXX&DPWtT3n{RGx(~F8mn3F<2wOFlV z_D(8#&7z_nJqo}NZbMBE&Dp|h$H$9{KPQp~s?(OEHa>p*Xyc}5Z;-a4_IIL94B-`- zy7TeN{{waym3kapk}e0ij7?g`6DV z`49W9?UQlz&{D{F>O-oDVF@3Uvm zrrh{rdiIy~9Io~n@oHhqD@&J1czU`4Z?7A5{Zy0Rie*{DsZY_U<-p6LZ?gquA_5+Y z%n~Y44>vcr=8H%ebf&x)>QOs=nV|&pTL?~N6CfBzj-a3-rZ_u6cXy)E0geP;UPa(rZWDcN3XHDaZ_+4O~0kwPJ;Fk&6~UtkYC^O-@TqqrM4PHWe!z^;sP>s0caoOMhYLgJ^Z_y znvTZaZjnR4GF-P&QOn54_D~P!&oVe1{8VeC#l<~lj#1E?yg_nK2k$a>&07yEi$d8g z^Sz;sl4d#|4HH`;KHDwyJSkr^vh1mzzg0SMmrOo}`nF zZ(KVcPWJrIhQsvx?`oNpAE#XHY(1=BFrxN-nOAi@s^!m49D+VHCS4wwbcmCs6Z5~k zUB>RU8zR+w>Y#M&P3+`UJ_9>!9-FCJ7MeMGQZf z{qYTf``$8cktWC0Tx5orOO4$yIoIehf5)8T@r=ubf~^@((iHRxGkKMG>fUcRHwS7M z3qc5Ja*b}uootmdWW535J)Lrv(N0_pHcbMDk${%wqxI!uLSlw^i5~&9G;LfUS@H@O zkKpaD*kHeYpJCrwR|%7m39;2IqYH?Q)6#EnHUA)$;?Juf)nhi#RW40eF}cAIWBvB+ z_d)$HWc$7=vGI$`W{)AFC$4!{WPA(aDuf=H6RWOwc1b>z8S;-UT#s@ep+%((9YOt6 z{^}}UN*Uv4i9 z-|DOCYU_#1R{ar2rm{4)PBV0)S#(@iM`PpA%)k^qJ>7IPef6!lAq!rn#1gf*yo~l+ zv8V5-yhr0AD|a1rN+K6HS0xt6%|@*u9pXHGr_C_B`H6r|SO-H(n!LT-jkh*?F8-XlwIv zGChfdMOKryh>MwqSdwP0`StDmD zD&%hByfp>eGC)f$G#-gj9Nd^opoRtX4qP6U!1FTgGnoYh3Z8QEi;50xd?+1R{bl2W zA%9Y6yY_SRLRwaSwp6Y_Z}M1t4J9q8{YEHnH5z9e? z#x>C$Y!HTTgLqODR(gB2a!a0k{O4(%u7VQ0%!h>2018LBdK(xyIKYfJuaN#lbscs* z<`ygRTF-A1oYN(g#lONH@-L6LBbKPhL^$n^u}Cw#I#)6hc3Uo-rkAi;R^Y((v%Rfp9->I{BT~yC>XJ;FokM?G4j(2RilomJC)occ4Tqd5aDA;P% z(<5%5cqxhQFv0x}Y?hwSoHY46Zl6A8Y-C>>^E<;6J*Z}+hV2_eq-A#2>o*(hF;W@Z zcg3_c(=!r!84-Dk86w{60U0ERwnirv{T6439r~Ixt!==s@knl$b-9k z&IWLC#-8xcpY^NW8X8@_@(MhvBg+gjPRx-bUNW=vB4(NMkd~E|mz7=L+!SzK%(qOl z#eM^UoGaLBhUn)$)h^MjZ=-pu6J(4{)&9@qhde$Xa?|Vr@I9LKS;!zeEa zxI@KrKKBgv9y|eWLd=nvz+drj{CX0EJ9%B)ysqvN&=m6|pRJ}5`@8-P=@1SW#$hYg zhpqgm3{P|s9z*c>XhZDxlLhBP>X+@oL+D=;T33flUA4bV9UXuBTwOdC?Q}cHbJRt_Z1bsz1H` zZMAFgNhIPINVDeW@ZcI&yROBnO>CemQ z+ZF3mDPXT|V4elEw=)4C&;tGCc5lb2pn%!QX|DYPmD00(&gy1w^o7GSk6qs zu2!yp#ilQiGt*v2AK9tX1oS!;@;-%z>NZ15CUsbOczB*aZ?i>g>?G+l5?bH~Li|@Y z;EvoN9ogC0h&t~dcV%oIgPsD4s5-8QLGr$X_akLb#XOdrwmC z%zMy~e*?epe3$=An zTBOB#vM9(+Gks7xTBP|V{8l#X1S8ZWOTXrNN+~3|P@`3<&k-lvHKnLj>auvz_x9qf zev93xajvF*6Xs8so$;u4bcNz!*Umy-=}h#>Ug#LFT0v|J6!IrisBWVTLX}J$n>(f7 z=a6!|-1cbHRzpPO$;IrSig{b>Yo&#yDDdKdflsZI<=os{kyaVDdz)oCz%KFT_pZAg zl*g>HkI&ua)ND{Y@E(Ge-TrJ~u$DxJCSk?bDWrA0XH)%oenKk_Ex~*tr(c_T%mC5%dGsEPyAO(egGjNkQeZeIoH&rx+( zu%)C%3)Y(r%;)ri(jZ!IrsyooawO4rbu(`S*?ed&c0?uO?>wQ)!*JlXkaVX+y`wG& zad42ylaPF?yzYZ4+1~8Mk*MR$6j}@*6^z4q&){WnB*mT^iI!eGzN(JS6mn*3<*DUB zJW)RjT|hu^a9&PsEs^%DexvScQS_ghlfCp(cRrR^3^(54XvTxn#QDxW09ca1KYwCq z;j)l6Rx6c1sb9bR6T&5QFb;uNi2HMBfzglX&I>)Z)0WpdW^^>|_603oE~S=Tk_(PH zh~}Q&E~WHkS&>f?S*;(=o!}!em>X;!(@q!%L;rpZ^m(~_rZ$_Rk{o?NRkepzm2OE5 zKZ9gcT$0nW9a%<1_(y4`SZR7*g%o*<>><*(ueF0R5kK|Is28cSR3p-(xN#_ni90Kb zr=a{#!drBe*f{xx1eincO)61f`Yx<|oEe>Jv^|;@g4Rns#c%KGpl777sqsQg^kg#0 zvczHEhNKw|4&Iv`;-%z>yDtF=ZsQgf7S3H-4TQXZLrW7tiqrXh#x_ctE>8AS3=Ub) zIa@VvPBg(|Y?_C`3#}c!O^0NpKMg>4+cO`?m!gpQrGA>|?e>ofJI`A6@AvK8Q(E3` z@0s0P%~^PckKNjClAKvWT;$~W^826)z_=OJWPSxDMMp+djIrfxtWnYdkoO&S+@!dV z#qNFTFp<$t?6*jX%?=;T3fy}}ON&k8eK8x6mT_|GN{$mmS?@mM-pddOp&`7#(x0~A z_T&pEz%49MTsWrXxaR5XLotHY$n-&_vW3%0^m~NDmS7`8BRvMg2vZY#N>I$EdmPa%FjE17s9A zYYvNM-iVVqv2V$15<RkJg7FThXYel%2Q z7b__AqhI!~b4EbPA0rttOL?D*85r^J8#t^?qQ-wMCYd1$ONtiYE)|sw+&%VCs5Mjt z#56u+vuW=zF)^|EYN63KPJ{n@sD=Pa2mN-t?$mqpiktg>ym=+hNKs*zZ(y+TZ**#E zLj#4EEAN%{6DlewR0Z%-sJ##E8}KQLM^w{Dc|@72hD0#$9o z@n#NdJm*qjslyCHuk5O|zV8|q4Dr7Bb7TWu-F4s|rL3*4o){HHMfRu#-eOVd=IU-x zuZbF)p1V4jdm@m_+(%R~~SwTzFZd1+o0v?-?k+H0EH8(e0Tr3ayG_oq}yk2`1#>TcNJnNu_=*HK#T-pjo)m~nKCStch}yh$Wfz*qxN zO?Y1bMv-P{q@$yuqwzd##S2WGcjS6i`YjRx=y4^`R4HpsE~xfuaoNJt(KfFS{mNRjpCG~XA4 z?E$y0d`^u?pX|Dn#dtbcp{1t@iRjOc%0ySMq_o+HIdYv?hqzvYqKo9bI0Tf%{1~ng z!guw@l3ew~^z)S;KUg_HI!E3jCJT5HnpOL5+KvxiRYd?oE5lWTuHi;->n^xd|LP?FnDux+VHuZ*}-yyr8G2 zKLKoDlYbNpJxRzw%&AwGSjOJwCwS||YejcWRg>0;wED*Q=nPtvj*dRx)X)%WYU=sg zrHDu}?9x{59SKQWTMoa&M7JdXg;T4p6>Pm+^3JNNswVS2YI#!wSD+@CPF?NcJvay? z&;$IoP9qQdi_s0{ZrW#{TT4t%u5h@@43Ve)i|MD*5_oTp+TX{i?|0u=Bl+>1aldqiw1#fs}9HJ-D^Go&iKT-BI_r~Dn+VO+vvs3R4KJv#6 z9`8x2h+n1+Nw5TO4`+e#l72=#OSwr*|rhSPxS~sjU`XRM0%TIe$*x^)2>O zl#MrA@8{&jUEdcx_z~riZ*!Prc?f73=@}w2(_#!*x6cFRW_*`X86ro|{N+vLKhMYa zlOvM5al;kBm>k<38H$Z8iYuEygpbUdnlhupGWslBJu}EuW->LoK@F8r`Bhh4 zgdm0INchzhr;^*S5Z-roaR&4bD?avEnO?oyBx9)-1I0rjngDau@H`6S)WSN+q78GM zFJ9jk1GezRFP_NKymL z5Pf@BLOfxD)@K4wh4_Hum(c72g!u=T@)HU!F;0Gc7L6jk(Gq*bJhe$5zZ-H8h%m{* zgk8-7qhfWwUWq1a+fNX8J6X5EEaHeXta5C!m3f-Ca4Mz55GF6Du!_O3vWm@&WS47~ z0QMbB6S7rnUWGE<^7W5+a3|Y9glc#8$jC^t-meu-{q-&CKbd5~+f-N?+ZBhJqfT5_ z)~8^Ov`SvZfgV0e=D(6e8osZ5D%M4$3hlwG@(1Iz9AVo5fgvs~&dagH&v7cvcCro+ z6_JbH#Z%4|bvs#s4{Ax_l|@Aj=N}}C%t-|$Gqt&3>8fNg_|(m=Jz3luG1uJ`mQr&1 z=9p$R%8WJuD0w_=dPZ6p;ss}%pv>IdP5`)$1KKs+~#XwbVk+{@MIG8|sUDw4kZp z>~B`ofe{rh>a7((-c`Jr`Re7VA{9DxT=B*GcW!zfqOW4==gC&U4&lU#sMXnF0lCdv!YUA%0l$P{%ORsE>QsD9S^!E&ehJ}H4 zyec0sD1ES>;5GmZmuDC$jO)F9qvhPo#o&Rw5QQS-lQf;IjLdZ9);kQ`yRw7!Nz!eH z%1LyPA;|BKAa;C{(|&hPWN#3MRhKk^R^$xKl<4 zXRRG_OGKM54DU;=g{K1SjJIArNeNQgl+U4v%CF$gYbEf-XVmLx!Q?LvW|Yiv%4#YL>^73JhxY z27X#vM~z2lnGsh*#l!qZr1zfor6IUW<%xBK>p$W1@bXrfBB7T+N8Gf6svP0rpxwIc z*?Kt)8@@?Qt%=Q_`8a-xch{F~Z=GA{BVzKhcr`jw= z8$Z42-1UYdG9ohUSpW_$E~T(K z5*TupD5?v@H{nZK!`SHQjgF+Q?83Ot0020dp<&uTl{s$HAU^SOwdKN@nw8l^xh#!v zO?rDC?>W_G2UV5|$-5BYHLYbRmciDPCHct>X;@jwPY>=NzeBDXX&gl^igz zLnLa4k}?gbeUBbJN+Mge97uoQs8RIcT==gB(eE(T5~`{-qbyv{Bq+!t!hR5|+}-s_ zzm*9e`w4l<4VhehawTkTQk?XnKGen`;P1F`L~yTAjYin|{9(ofXmJP}@G?pGhc*3^W7d(4p>jSh>gYU_G{!W1xFFKz0fQkSB zIAY3*Cy7_r-dCTZjSKJ&&{6+9bt9vz_u^8TW%?Y1_jTg?d;5EO`{#C-N;kog9x=c% z7}b$&LYmuf?yH@cm}@;a=%D2R?=d3?>);msF)M$+bovHOI|frgO>u5^rdZS=NVpxS zFJ=s7YOe)K5cv$}(m7gxGmu3L*0R?)wz>}(Q^4lVsal&r&hz5}1wef(K5v*@?KR`k zK>l(rO3cm8l~;=H<-*bG=~{Jtcv>RM`%ts!U_YtS#3^xlk~XxTogMuJmLn%dZ3|B= zhNh;Z^i!_PFR?Iml56k6E9^SoorV>Bl>&9awS8El;z~S~ zvlrA-s%xD9Muf)@byYopO=Dfa3`E}Kg!)9P(j~&&lCNK3EoEC=uS?bZp0&1JY_03w zdb%yp8e?L$c$O(mw_7)?`-zl-A~Yg`HsB>iL;*B!GRx85)#J!+<^*+^mZ3rzmlo$W zGBN5gX#)URAzWm^5Byd#k<#k88y@)kd=BPuEi0IziJ{`O$W2%_ds z@g4Jiq@r5dW5~8fO(~Tky~c;G_Ph1YPhq%iNOQWfn0}%9Is{AneMBl}P%q~9I**T! zVcWA&(@y^HFj@d|N~rx*_4Q+8(mKoy2_=~0xMj`dhl(N47c~a-|s${wBx&K zoO;U}+F=r8tWV;WrZ4$1ighqKIr=*62954R!(QKRwM`_y&&`qa>h)fG`>pHXS3k@5 zA05tG=HR5imAZI%gy$*ZR^{R9EK>@hp*FJZlBGL6_vKl|*gSmr(4bLs31gVu(tFSB zuZrjdIX~DOn%>N@8ww0dU>z{RS$uh20J#hxwhG4|&e1%PGNoKZ7QWGwW792u!88He ztSiT@ew0ffb1B;QHsx2Bgiqp!y#W9mq-8;v_pI*ZL@gaZv(tH4$&OX0QAtpKIiBo_ z^B@=nFy}9J!jZK(YYw`VYfCeiP(dl?2qJ|Mgn&Q*eoFt?&)-e^nhN$8slx=JS-X2K zH)Whp-ihapoD>GNL?)>+EvCzCYVQ@SCD-N15fVz+qra6F6d=kGIoXYEwi7Q!j=zj) z>8HfUdygb*G*MkPJ2Y;1nLaHGQD*ugn?sxV$(SrTiz#`zjLOTtXLj~aWJ{rYy`NP# zJ{eg{MKK*)-$q?dnHgFz+Co)Sb3a-2PWH~P)k@33I7S8rItD;Cb?(Ydx)hZILZm-U z&-?fG&`!S+-h;<-bOf2NUOh(|>HWbvySe-Lhte06iM0*1M_MUHn(hegCZ%9+AQx6w zpJ(}@gB9J1#t(72N8{&rkxlG%L~*O1i}y&b#fqY4!p?9|;O4UhY{K1F3tAI|F{l9ZR3a=PI5@ab5tpoM z_j(MmW^LSiC=`@DigfMyV1@=XU+RjYc#p`Z~ z&Lxkp*P5~;Q`+*@%HDQ`pz%XgXnfN)2KpFMSST6U$Doqa8_CMnjTgmvn9fpU0~8(F z05I`>m_;pwNtHaCxp{#+>F?>G>S_@HBq=%Uc+bKA#07$_Frt%`M6@D)6dM(t+TKVQ zuF#)u6pedFT+heHSv4BMf%ld7tG2J-zNUqRq=iMNl~9<718{%( z&_3YL<^$$IpUOa8`%7vnAu(}kg)F0DYP2j}c{$7bS6oHk-f9}Z2P)3yrnSAT1Js(# zqaRyf80l&g>=DmvC<<(>YwF_nu0w_cYmN?;)_Uub)D&pm(fQ7goDT#-d^TEnb zvA2~Un~@b9v*BY~C8vjW^U%`^0N5bPp@}~p^8_SdPyXeZB`0;+YwY$8i&>*wR-@Q9 zeR2lL8Yhb&Zxp2yrHPshKU>+itWAB@bTF8~pZ8P@?(Ch-cSZY*F*CPhAZNT(T~L<( z-75D&j6S3rRcWptosu38k_tNOQ1l`ucXdfF!EutEeeD$ovwRk4qmuiHp~Ne|8gLGS z8&!In8~BOa+D^JwZ@T0Sruxk`)!(B57^K;HBbeH6-Bu||y2^WLw{qpj+1)$n&3VjD zN5`pfvzfWY*PL9>Mmdhift~@-B2L$BsEHxOvwN$K@DW_|58$71Xy`cj4r}!Id^W#J zO`munveRjGEO4mxn(*HjIpGKhd#%X>zm(={e^pglg%LuDj=v-yAd>r>oerc5Acs&d z#!Mqp{2f1qJtIlBk- zDm-Zts0Gp#8x0+JlGruFM&_!7D1iDj@{J=0Wr8|ErKheJqtSNe@;DMI=n7}hn?4}v zQ!CO_$`Iji5>7}F;abH__h%CddK~d|c9^=!=7Z9eRGUq;vqaK88t{P&Oa*gyB~(CV z?;ZHDcxhb;l;p+^6Hsp-*0;%|0*)j-@}HT>pD`iPi9kjXC|Imn5ArpbGBcdlW2IQ06eZ<%}yuOG}%ZmA3MOMNqJw zV15CcMoIW`8{i3Fc9sKRFM@5bDgibDI1-vK!!7lj5!vciH~>Jv8Pf-w zyWt=2=O@09ANZhTOs44l_YQYR=2KA)4rXR5b*T>GQYW{~pE9oO{U1bT+fGa2Vb0_-RRMLm6kT} zs*C`L2Dg^7Ge-{@=;;X{;E^)&_oQiPfA6SmYik3-l(h=H&X5<}airK9eGk3qR{Z1j zPG9CVnR`Dso(*z;u{l0pl1yR$^S0P^2tjes)NlDxN)QFy&xP_F$JTRmC6Q4GSq(dH z?>lW3FErxL2U=`OTCCWLYPn#WOb?24a&mwM&5 zPjxx8xJ=2GdE9bqSkU|VB}HPMzp>$s#uo~BBAyv5qCmYDIooh>nlvz&0z#?XL~@r8 z#sRis;iyJB4Rn!1yXQacFI7`j{plE8kp> zB+`0)`c1x6P*Gkk-CfZX9|{o7^aS^4zLu0+bPp}0%iX&taVhyUG(hyDbf#6T#H2;) zoUz)Zw1mY~0_)4$x4qCSSq<~&00E0gS$R_`ibC}d46e>dKX-y|s!b~5V$VoVbg~k- z-xBa?i9?9l^|?aWlbnv-zH7&m9Rxf+J~lVvZnUa8z{$H|gh$88|1(((fF}^(+3tm{ zQCUi74=HSHpibmx)Y6Qg;ioXVt~W9TF0CX*WNwtY^QzpiWMt;GnHHNvlzM%2wX~p= zF2Kxuh0U<80YpiwP9@Ma)8o>_u?q@H*U3>aFll8^MV|wk%LW0llP${}0$3bhUW|=N z98+@glM^h1Qb)Y55A<~Niy=O%aWnlaY@fn49zmK;_SJx&2vvFXuC97?mCmWWFh`E0 z%%Cy4_i>3PM#<=SDZlzg9z@TltGDd(QcBDdFvs~!D5J~$PT-MIN)ssh3$mGL6vnZ} z4=}UOx$~v44>oVh!F9GN)6#$&lzgDkx~=Zh_BMEQ+m6~b}UNPk{rHBn+Btmo5rNjjyz12->>GeJAfkIT%B_PKmf#w_?%|;xe&SEar<;q4k zjzj|gZrl&jAmioO_*4+4q5k+Vvg`qKs|F-xL+Izv+q&+c4R9=o#W$(e4eu-;WlOg} z2%xyRLx2Cy2WpyV)Lh4|BKW>ZQ32V))|oc790#NIz$f9H-17GK76w@TJ*N6CDi010ek`^0 zJdUIg@)|UNGn<-7PE~S=ZD}=oLNPT;kyK(YaB=sP3PRoV%sCu^mDoR)S8KpiHHFWg zUpjhHjB9%|ujyohwOLk4>DjgF0eE7c&D;^d)U{=#HqVM~cu%aOt0$qA7qdPyk3s@K zQ>D}B+`kr=UVm_ecm5lZVNkzJwSwA+0It9JyOcmU@I(!F1bo30J2i8jJP9*uGUFoM zY(9cQKB==bu9OOGA}|jJr)+F6O=lO>KJiAsF$cz6e+3<%(=z%WMR;&>)8KaG(X=AD|^GHmsv zuu6`Ih=`VwLh|!^v-?jBp*sACGHQrIv1!bSR`?zCm9Uw+2Qh1FP%FFLW|(%OHVc`H z1bK@z!|&>835aiMt3%>IgL2AU+ z7kyx4ck_=v!?`>IA3ysCQj+U;1_V{(#xZ}kE`FtRu*YXwbbhZqTg`;%Fd4P+QB$QO zlqkosh0i?A&g;s|u2kcQWC-}0m!qlSqto(=j!;rc3VhS|oFv2~B)t{IE4RvPqYQb| zG9o~dHrIG@6lMXcNu!^iZpmN<2M`!ab$Y^?H;1gw%?f-O;fakNRAp)|ofGVgMdTjt zZZ5Z7R8^x33vH)1`+vwA)wtfHS=@~)0`T%o5W8#6kr$qis2~9C?FAbSJ|$(x#_$WKqOp%Fxhh zPFEv*$ZAm&!rDD(Z*85n45-+)5dF^}JJfpgA^0^n)=y5f5B(^`)mEo;`0;O=~@~j?D_`J64JqG5# zS2B3G?t=RZD0(ei1GmTgfNId}w-L^Gxlv%+rQ}WdUPDjo3X@=Xv8&azS@dcnPsm*a z#HW`(_Xy@L+-~Y{JmzY8bgEzJI~~zh$TtPErolzWxU!>}%=%WHk^vgdFX8PuggAo#$dD^4}#_Ohoyt00yW{*9aJ{P9| zN{;kLCX)?_3G}vjNe%K~?Sm=ZigSv>U~`RgB$7{*qvoq;4H7w~#YrFV`vBQ>K_4EQ zvkc@#`VNWoe#3f;r4qQEF5JBuxzmh(fdc`SksTw@YHF#ebzKZIvojy+5*bf72*9T+ zR-=Ncwte~ijCI`Or6PK`uxr*}rqSMy)OfH&z8fVM5{Dg1!A_nJ~*2x~Ck>(q`5 z#m^d99f;F77Rc=}TQ=lRVjFhJ_mpu`DVFWnc#7{o-P83~uhI6&$EgNxsVAu+d$3$Wn=rH`Jj z-O}Q#)SCeE@U|!6HKk4IoS$^SY6~UX1MiCznAcfP<=gM0Ig!NWUYJ=HvUaw%=0XrX#>R1ge^(_e9e3m2+QAX=y=Ee?RDhnR{ex zk;Q^OrJuKMmX{X>K3H~IU?P8#a>M9Fw?$=AzeSWZAthy8Y~s%$6lg-(iEZr-u9>!Y zbFETsVupKQ!Np>mU#7D1myE&i{51?F10DB4((SZQpjg6U|y*JB@v&e-bzzT3(sTfgYobEsw!|t zDuix_`X|HmVc0YP9UGSE(J?R-Yu7B=>D)fb0+f7x{wF=WpJsf>2)+=Z-)rPgMut^~ zRn>Ijr@le$ZEf|$O=D`{NFdH`xW^kmqkRVYy#_P|M{6a@u1m?^_)d6>m2xyGMB4cE zG-#U1f^wNAfC&Qb;pj9z+!1z2E!-a0O&Hbz$OaeLFu>Tl2~v`H0e0`#*rugC1nJIX}Br8_D@%5L4eu!I8V{TJ zk56N%!)lyjUJAcQL_f5wuyD@M9oRE`Q6`(Aay~v?yctSBtV{R1>o8p%Mu@z8p@j zm?k=sJ)}xVL`hj~)#4ind3~*d@28s0j(&f)IS!mJ#o1t$QEpD|*sn3`>PCi2neX>$ zpFLAmi>|ETL6E3r4+ZU_pMdK1uE(4&#g31>w_?aSP(O3FYy9xwu#Wf-{E&9*RWjt( z8fF8tv9W~#O3L+$kmS};lk>B-jH|-WA=G#e}Abp(MDd9^l(9`E7$}=EuFA1aU z`O*xLGm{w2Ge|+Gf~;cFDPKejuBt(cf` z60AyTYPx(T6}g9pTm?o|T;Ln4sH_AGhI_pT56=g^h3-{XDk1k)m!vY~1y@0^NVCRl zrxi?~&@9lIoMgqP1DD}75yHpbSY0i`{vr;a$3t-yEszuN1*|^Q0#4yZ&A619XK}K? zdyR+oi1c^-l4)I_E~^r&m?z}BXr-@Dk+8^NR6{2w1}`r^`7vtS?!gIKt)@I?{Cpx6lR-@fs_!vt0CaQnhmvZsIt8XT-(Y;01l-IsQ&YGV4CR79jV zg(1+YOiWtmLDm^e15RIT2?;3)C&V=H8->K=<*g+h=OQs;Q{}cN6*>Aeo;f^{1^b4# zi-B|Ge6irwSPUDh7!1>&!W8s0Orgyi#G6}M{y5#=zkg30*wY^(Fa7gd21#XR<_=K4 z-y6AJuQW|ueM7sG>a`~_GQJoa%NcR=LRciWx9o0HOSqE&XY*+%Sbz7;`6MxT3^;{% z@nDx2bzWwC(9M~Yk853ojxaXD5@Zx*aH~lZ(D^bPuYQ)Z_2M?V3Z}iNKKMhlu&xfQ z4opo*!7u`*3FqNMzY4H6F-r%)JA#mQx7T@_>FI@QPs$$1oOo>Nd%bz{l3z9Y+TKC& zkdfwVLBYvLON#(~2Uz)q(+0Yc(qm4Vb~8SHK0bq5Pi7`o51_8~YL$+SB1slk03qZ( zuwJ9h2Jm)C$;JV0csh~5O{eXjLlO^GKzI)E_On;4IKE8Q(*;g7$J?qPzf@Yy-2m9v z8F3KS!zPg*x<`V0$5h7Y5r0e42r#TJ_aPz%N}Z}KPl0F)N~wkhl5lwim{GknGu>WN zfc%_UUQm}i_B;Z(ZX-3AT_kh+fI$FCU5RRNL2fSfCeXEasS#$AJ6Zhg1?VV&nU`w= zOB~C95pPO=e?R++YBw}%nJUZVWSJ5E?kHGXdl!!yWO75WilB{)tv9H$7?}EPZNK! z4@`N^&e5}B8ftcYDRtE)6%{Psod7inq+=1EBTk(PX=1XT3OjXmLK?7sc3ao{p!x?( z-iX)SJbj=(=xhk?2eRZuv%cU0p{X-9Zdbm3YUgmRIiA1BnA2qg8bDp>1Coo#*N4A; zj{ic9YJADah>BXS=}en~Zv9?w(A3$eZr}tl`aQhg_6eqrFF~5_u&zn-r>Xw+;@tD= z1UAk%z4JJFz5{WC)852;{~wt(*kQ z(DzSUeloiNXLObsPn7fx@{;1b7vp>WEG@;! zNYl`1XP5|r-NpsPh`)^Cq<;Yg-OmFKBYIhw?{OyZl5$LZc-Df+r~- zer%cbnjpLvSp14hSa{w299Ugt);qylfFwLpHDm=$V2Q_o`vLR`fm34Q%QQo=bufZh z&pUwoBkyOrdgz|mOVC-xYv_BfP;V)1V*sxS z&~UD~{Nht#pdx}5Z5feSZO#Ztsj~bgX3Ms3>-Z_yts+rA9c(|~C>-W{=wNHr~lDZ5uGD za29Y+>3_>biX)E3z8Pfv^?L7yAD(QQ!cH+Mi&=I5Y-I52i-Jm!kQ*q`!0DC#Zjv-(p3SzLz8}OKIUvl$&hNTvq|NDmCgU`y!f7q~Q<$&k@ z7;@wKx&M7!Z%Og@|6^fgKKy^Nlg0mDww52Txc?S@jlTb{aKwpY#0RIfM28 z-@ZAQk&R~$U9!-ZSpF6ajnImoLq(nV8rNI#hD1J`S`sSjjru+v)0DVQdy-5Gt-mecAY0s%9wu-@e z^;P`8xBnTY`FC<+;jiNVSI+z7`su%B+Z(|*|FxqKEhX)L&Alka;Rt(xuJ#A1epXsq zsH#?|=GY9?MAX%N_;4;B{BUyuk^NMxjMC?}W9N6~J6LHl#(l#KN~&GBYNQp~Nu?5# z02W)0`up@)*k0bxGl$(h!2j#sXQ=~aq!k?!f*9meeS6Hcsv0SS+jcOV4*(b#I?Tly zpj%*+uiM{cot%EC$c=?9<+?>yE>30ZBh=8P+qBRech+p@qxPT2aOJr1xTkTcM(E5E z?`c+Sdu{Aj&qhUnNA!Mu=vpW!s9qu>Tp^0b9~z*X6g!=rs`0>??c>6X302(1p-VNv z`pF#K)tsl0{wo4kcQ0Y3tO+ax{m*_c$9Lzeyv4~=61n~ldv6^S*VcWDo|6+r5+nqI z27a}M&e9{ZHqD$VYegah;ErW;MB$GEL~VXo-2(Y}V+FCXvEkx=D+pKqG;4Ed=olpp&Fk>TA}|5n z((~Qb9m|fcemKqAOUvB#b;_!_&%xvBs_H=v{pPOcX@{V3BP|^|X7-7oXVuQXAr7$Z zA|p8nF@g7oa7LM!=cNMfl4l^>-u1b)aw($6vpC{}?JF)JzBh;k@z2uLF-!ws0GOpo-pmL;Tipg z>w&?1`J~ffS7gWHdbI#b-gR#7cE#&pV`obi?%jGI;1bv{#l!<^2Ca>}3=V6t!#wG* zTrdHVS*#{hk)CC5wbYWH%!W>Tkl>Zf#v6bRS5o|&-LEW8;SJgyKhe)Zyxq$tG<6p< zwcC>eVu4)$_PDWS+Y?yZ)Y!H#jxUJyrYHS!f41MmULCm~0Y(NFJ- zYO~lmmexv_rE9h3SARI=oii1UVlhlv#M0E*oL40lhs<9Vzp{3)I-n7Dt*2Z5J%m60 z$PcI$cknzNqRjf9b9uf!Bt<863;wz)V<+>IU4{l0jr`#fPk08hv%TI454)A*#!Sn22*yi)>#$J=~YuuU=5 zp;O`UWI`@C+ZAx#v201o)JNE!p$7}TpUx1z{#BdNZ%uvV^tNRih&oH9FFjVQ| zAV8S8kj+8!43l29=-m1hg>;#o6g*`#>3B7NNS z^rV`Kn)t|~>pd1mCjrLeZ1Mr{P2c0)1@k5I;Jn<_)Z*D{C@*0dRj|Z0p0vGVPLPlw zijy{u%N&ZH{Dcy2&CY{~-fRne41iMSXf z?$scjt7KTUjZ=&yXrWj5oZ#ap90{&O++uSHBB}|)`#+z=wlxZ#9!PQOI^pz>W0 zjBjd6lTr1(0{HrbC@i%doHTjU;LsRJs+yYVfq?qdvv{C@v)LGwc=xsg(GK-;Vp+p`Z5&ij_h$OTgUv?f(UEfAWiv>elA8D zc#C}5;Ng~ciRBieMG1$kxp%`k&ErLNuqc@thT_f3o95oFBBZ(vaLY*V^+eM=nv*#t*pPdd$0r3WWWrLeY&O;)GXsMT4fqn3T4Q~U?F^s`~ z0-nc`a|!d>5Nk1{)Fc%4h6e>?g+`~3TPfTRsAz@QWKJ^GIf#4rPC z?G2or&+>+~TkntaZ*IQkrEEJj4zjek?I(`0v66|mufUzr`X<`*31!> z4B79mOX0$jxN9UL4;cs1(B0ETJWgj}=)Rh*hN@5jnEn1DpFWl%csScru8x3O?f#)# z_hL~2!j~<+?2amdoSyNlFkd@|luv<+BN~v;DLigV?yVMT;cH>c_1j;Oa(QN}b6-0; zSXyti5D2y&VRQ1AzClSGCPA(T*N7&Q-!Pt<|gt!=j3x>yk#sd zDq4<8L4lY|Pd~5Xi<``W?0FqaBmX8ViDzZkp^2qwJ!@wx6%@?=rb{*#^Ug%V*Xvb3 zj_3CG?-F#JR)79^Ys{WhUtV2ob#)Sl^tmi-P?mkFL`g+G(tLcKDHbT1`z4cwMdaQW z>7!Fo`KZ@XTKZ&4T~FAl4=bGdBZ2?c)n89u+&2G8;If>l;UtVn{q8m~L==cYN*VpI z(P{fgf5nH#R_w5cp{#!YM23YrtLf1FouCJzWox7=5c6#oitO4|Q8DW8xkbJVN8$wi zk4K|zWR|BYG7|as%~x7FR{LW{y`-LNJIC;zMVCRw7Ci|F4Cb>lB4G12%Nune!h_1) zT%HGZI2=xWpD2=V*9JY$57A9+-Mob<2<@kjpry@%Ri-Zt$YIE)i~ZZn3D^s=JLu{_ zl})RCN4-7dbT(FjOvpo4r&JBf(s0>PVdQ{=i_;Z5zvFPQ*nrx4gkER8Le99ePzS?} zyi0*U@LR}D(BZsItqR$Wo)|=A_}+c_g-Afv1Vxbe`?BHnwXE%Sm{;_x zAvr>?5EZQyiEAD;G4a_S?eyTGjjq2rM zM6=uqr?p&WWH`c?8GGv00aP$X268;NMekHmOnG#hBJ7cO^yVJszWg|x;q*ALx}9DO zr!%b?-enCfU|QDKE~haok24^UvocYUuGJxW%X~TsaKil}x>=I_DkIJcAuwpXMvWpe zv>Ts{s>U2@-=LD_<9^FsVQHe3uweOhpKdJNCGQ+=X660#?4t6uQNo0hufgkt%1#&2 zMcdzhlCN%AZ%7QjxLc;>O<}*Wkk4~kfTGpiQmXD`H-)RDOmx2(vxXM)S9EJR6zm9C zN61=p=Dkq;kRRHVaN}cYZ7z5BTzgI*v(38$1fYw51JKA9Nt>#`7ev?V@W|lz3gl@( zu?Jc*h04_7WIUSz33^NQ=8m0m9;e&FsJVO~)AK)Lil-0p4+{;ImX~fe=&8Y_iSRr< z&YveGCT9OU8XGB;^^w+Jy|A>@gn*k~nhe*db-M#eBS(Bc$pPa@W7w~hVQJmzc^&?0 z*Qqg#rSa40wqm64`DdT^ne{pp(SpcHxaiBkU@zf}!3|&-#yIGLSUzY+AxNT@?$3Dc z%WCKZWjp)o0gdNw=lr2k>bgTxIm9jUfd~Tsl?B)Qf=$cSjblD;bT1rF)B!j#Mhcyb zPQV(0H`Qs6Wf>(6)%C4U*$e}u*TdMP_4;IA+qSJK=hU`M_S9p^5hgeX73QjM%LtC`!E(;wSHI`73F@5-<| zT~$A>0TNy^k6+7^liw9YP!y@@3Q2-H0D%3)8xbr>s^IJ#E}g3aoocD_05P45-*la! ztmU=OofV8!NYC57_G5P7)>ToFMWM=gmBdAUhS$Ddq_E=5Osg5e*@OjWM=9?0=y#CI zYu4_R{8d7brXro&j%8e%1R8dvK1V*sp(B94M*Lg?m=6V41@`uIeUFdhItY}`B^IET zU`|L#Q1=&c&g?yCz05*4S#o;Y$ts)?X+RKf3>sC3D~ND){l<&CAVRfKHRxnVX_OsJ zTOUwhgS53fFw8q>)>*OmK^&GRok@*9>8mzpl*)7V3T#kaocR5&<~3bDG6 zKg?9$bL0tZn4s{->Ny~VVU6waIDklF%u7e3EY)liqLaqC&K@Ev1Mz87c>2j+DVN+k zQ3X%6(sXB~)^P6fZmTFu`LFwPWHW3~`ZMI4j%CD-kd(PB{X!kZr8+sR_p{t&5Bi6o z06c=gI5RlAYR~#trWH@(eEA?#g6UK~`Gi@T(Hz*Yr%tMDznxMIpP2PX0dI3Dzpdvb z>OEc>&I*En4g219jHFZks1C@9o$o`yLp z1(Z`B!LEDPjPWSg^ImY6JfxmRqP&Ic{5EomA)elJ?5sE1sp{`68iD?543rIU3-Y6gFj3UgpTL4_RSvUQawCmt&0w*G>- zV-kJl`#r7h8M3%(oZD;HOWXKsZR~PRRvCrt;e{tnwHpI1j;e@cKIpH#)1T zPGN|d#Jb;HR?O%)=gLxhUbdr3+w9}r7^=rUxgB4bg67f+;(n!>%qO+&-P63p;Z4iZ z*0udYWw4YofUl(Iq3`IH<*iUHFn~}HIR@=o>K}WQFKDj0GgqZzd3}6B#=Wm?Tb=LypBb=x75X3yQm4J*6xqCODO?(>m5Qo{PY^TV3`Agx zjUrtfqV<-Hg5T|Ebg-=DJw({Hfato5C{`kZARQES>W*!?)n@i!9PL=nOKqimTlXmcvMum{3YkWfKa22eCEIjl_N#y{p}rj zY_8WQSkTbWLnKR-G zlZDEYP_#mo9VR$-3Sw4SDtNf>Tk^@um7kxOR1NI@jGu7QX*xZyydRcmN`srqPqVgg)I ztBu_CkY|NNz~`%R(znx7ZQF(h+l*z0hMViXyR*}(DzQ2{n6B$ngGK#UOnUX(Giz%& zk-gb7dx4lF?C?fQxx8(V8d~*^=q|YKFE-iUWAZGqoBjM7$Y8^RUoq;OB0KbhB^lqm zjqOkO+>|2!)^vTr<=C36t)e3fL2K{=S#p(4dZ7{>qWO0E>(>qv0oOE#{JH(wZkc$r z=ta6%>c=F4fCPdl)`L`=!j?NavRGZUD9s3Zs3^i?8V-mL+ZEpKkXnlA+?pAs=amfpek0{Hj)$S?WY5q5_M7bUHy;(_B-YnvR10$Q0GKHg8T2&DYMo+?eV=SZOA7Kn1{+iNt1#^Lb{~aD>QL$eSGKcRL?_=ntR*(RT{g5d#Vk(SOX{9o#Wgiir!qf zapi={hx8{)LYik(!I(-;%cE+GN4t|fBGk6wTx?6;%$`@7Tn0X92cBlXLHBp2hE0us zVO#wA+p0uO2J*Wyx%(Or7xyY1#NXDO>eB_p=Ce$S8Z9A{Q(F7jBo0&1grT^;jD?BZ zpD?h|lr}fth}>U{#N-YJ7l2|gmPXD>rq^UiP`SSFrZZCH_Poh`4XUE5>U%PWkMz}( zgm|DDdV)OiY~!+RB)Z+3}@9C&aP!RiEMrvKUN zKt9CcP6vD|-PazL-Xi*@f7Py7x9%=iT@N>%e{0{o#0USwhi*fU;=u!EdV28lJb8|0 zZO>OD;&mEwBeg*vcB}SORb5rJ4Y`amHr{}IpJH&_PfRsUPieWn5b?)a2x)GfS$30| zwfpsRKM+$sowLGrMHuqE$$p{=)<)}ZAJV6%egVJ92#D0kRa&;Ytts(I86`fxxXO73 zU%7!TIJVy9HD`SV`4%jmX<^wN@z?5{L1!T6;_l6L=LuXvME@2=NUl2rKi(IyJ36LG ze?{*vOCTa&Tr?IXo-HpW@3UT!AJ3#uUaYCBj9h9)wB1;gmVf=&`{rSU5u#zwgX6;tHu`=!y z@41sWy|RShJlW(~)+u>Tmmva*6V&ZseA&~s45Qv}dKC^+NS0==(^>nr6$J7)=$`*% zaUVa886O*yl=EZpd+hIO*{^xur2I3C5l^!9jSY1BspRDO4F)x#qocQ?8ToQ)vJmD3 zXhDHS@du+Ct$;6*H*c7E?-#$Xf2Po?^XVKcYi0gD`#TOynvMHYJj;|6fd(c^Ucjp6 z0H6S(c)@qKsP69W$DSy@juD;tn6&BsHH`2CPBb{qShV3ihvQqiZ`ukJGqk7n0ouMr zO!F+?KcBhlbhKP`pzU72l*h4nOL>M%ny|08U%-s>z_EG8hyewy7WP!nnC02Fqyr&q zT#Ty8*HM$<#%CF^MKaa>VFCYg(HWA%NlE9#_MYcuzltJQfsl1)E%ds(?E-o%ad{Eg z!a(FJYt$UfGo)|QQFhd^oX%P&&#tMZIJA@tQ9x<8j@NTI}Y?C2H!YNIbT>rsi~yS3UNNpqNr$B70x8GCNV zA}CS4m3%22GzUXn80}Q>kMG*8g#?uSr|ke6}XiLrDFE-iOqQn(Y@ZZi~?{eLcRQBl;DR66PZ`aVfxT2-85 zx8Rj2*OpOMwT^B~6)b5kdxsi1!o_BY?yuR*B0;wZJHK9Z_Gw$$tJIFLsU=2VoHUjs zdFheBjzKhGDTp1N!7^V_UhCGT;oYIBtyO(sTGtX2eA<6&OfSZpA=*R+ye|IuV>Ah? zA9KVECshlrs z<6H)ECUU0S$$KpNpV(fQhIL6bF?rH@wj|?WB!V zsPV~?*ZmhiIm=0#rCQzKdccO`(z!#CSqh^JM{Y9kOSM-n^;A4{m(C9aLV%x4PHyfa z?-D$y8kvAk^H|3tbo^(3&b|NZ31{)<*kn|@pOKMKh}lNb)RX6=R;R@a2Y1&gh~Qx3 zx&GMBMlFyIK3#2B5Mi-$dI<8V8OJuv{Ajys4<{TSBoru0Q@F!6j2}%+O##RoTTw^H z>i+JQkgH(I;>iobcaSERgI6Q1tbiHyLgcP`47fa!vsuQM;jy%r{=4@UAv9tNw36?;3aQsc}w_t+6 zB%J-2<$AX4kb=^Y3X_9tJCE5bPBf2um&5k3xj>oZKzp*ANmIwi3$41>SQAW*3&F~F zy<=Y4!ycvO(3Ooc{*tts=I-%^@TXb`D4 zs7OvbWJa`KjrCvrcf@}etzA{^vCmE#06+s5!^6?^!Nb1$%NKp)bZq5!Yis>0GONoy4(HzPR{z;p!!7xK06!i*j=K{AnZL zcF?zMEu>G{#op(2<6;om3v8cMgl3C_&UhW&B3`;bM(| zS&~s0mEG5%W#DcTu;m_aERo7}vv7YqTFopy@oXU3h?5{D7AK_OM>(sRPGWGa)lz(P zv^=Dxs*>>45#GZka|ZQ$VaH9303BiX@vgGAtJ2lp=qM}}3~AqD-GxS$;0Wr6)?Csi zyKe%6_3lFuH>}Lq&prq$G-z2L-{q0hQ&c`_($>Kk4{`i~jg3G~zYHvjJ#?JoD~vJV zi;sQUpMu#?Y`jce6$COVrB9MX(h!G|hMg+R!Uyj;+gffkM)CIXdi`Zp=sV zLGL7g1m+SEwvc3|mklH`Qa=qEJq-FS1p32?8sgx$Q0c7g?jA5_MacUG75icZWxZ1= zmvS%YaszR6^l~12y7*Y*qsHu_EQIFd#KZK=P?H<*9L?qRc|n!s|D;zT)yyWXx%oln zxuu14C|3Wl*=XI56#r7g*LZlwoP?9~ai9y$7jMKDz<$J`Ad5PX%{6}Sa}a#dknjj< z&LGU-!})sY!I!_WGSv0F-==A8t!ArbHERX3Sm7IuaKrVDE%X<_!8}=*$SEHXQMoLq<&p&1 zsCxw8H2HQyE#bWp*rbe>2A53}f{w%eKMp3}Gh#c3ney{}lL4hfH>%_ET}q)82w%^~ z^JYIG^(|6msiL78A*lu$fd(N4-R_;Vvn1O#+DCJ8OA+s$xIeX33Yv0xDV#;SgOxai^r69Sk;>mHxW_-uyiO6`vwxiQO`g&0O?>jL z_LCbQ!^BOOG$^;*F|Dg^4F&y|;GBU1tY{s!ZG^qb6Cs?NW*EF6t|;qs^0u-M%IWkU zW$+&)n9+;BK<=TZLUP)L#;17}}wl(xC_oXx1sOzs1JGGvCf1CNcxcV57`4tN3_ zQF?(;4ZHEUfYy7@BX`0g;E5qsZ(bK#;{0{onMc~uPc0%!kpe!j0pjb~-IZsG5y~S- zpDmWY5m|>YyK3-tD4wA{gHj#d8!ps6P;%RR_sr+sdszGa!Uf9XTFaU*AYIl5&~HZv zabVq2UG0;RXtol}Yo4ivSM)8=jnw;O43()b$(+Ct7y9E^Gg=(itwhVR3ON(D*9 z?Nn4)YTh`CxVS%GI3Y68VMrJRY!9aRWHy4V>x(@Z2-H`9Vm#G5vZL(iYUY?OdhxZQ$Z2&QZ$vPRDDjza->GIgft)yQ4b|tcO52 zjZbm{qZccT#Bmk%e0;L6S)<{%-K{((4i?=jUmLPUp22YxuiCk$W2O-lzOn0bqw9pR z!hG7+((unrGEuh7fqkA2Xg)YzrJTX&{mXwqN_V(dU*=n1dK+n|C5);QC4l7hV>yLj+n?kygVO7w>VDLkJl)b8kfB073RdAKa_^pdM^&FaICQ|h*TZHY#EFY*6D5W6bBtmKBr5JZp)x$GUd>e{ut$5I2n zO4!>h+7_Ro?NqjGM;+#wtZtdjp(KW$%=LC^O$&J_B2kU@LD`y(@bc<;Jy8jx+C7E{ z+ri?F>59)DBe{3v))l~2lIOL8I#8h~+%B z40yXec6j_4v0k~sP}+2E5dqJWPofle=>0Z=J)V`|^1-HX$;S6Gx;I}onb&%LeJEY% zbzt=1hTr4o1OTxc=2?mYwJp$k5XuXxlfS@7F%S0z{pcK0g6Ps{mWyZcT#){ z8#kNm_|Se@%}HKSC*z`(81ZuAuZ%mU#D!ml@@Q}uc5fvSM;P0e;QSS^z)*|Nm$!~l z?rZM3Y*LBu7-@YuLOSoRC*=b%&z=wr*8GB1joQD%rctJT-u!W>^3uP>+$gYvpQ7Dk;7O>YVF6h$rE$fSCB9~Z`kOp){=Y_+`J9?9O;;dBNz zF8pmRMWZSIiqo;79qqvPKad7L$J>TA1vBG5x^EBHywv1maJ8&!%eH(_XN$Jrz@W!3 z2zl+^x!n7B7~?!bwc$eJpyzo2yPC7xm==@Nk0)B+8>gjcroea`mQsKO1E5H~9+^Cr~g{JOlm zt|LWLZNAP$g}I_Z>pvW6UxwzVy8*NeG}Cv(_#BB;-={fGgp*S=5chJq!U{i%#f$dr z7qmZfzVLn#YTi6tSj6AW$1HB1JFFgMrudNCKY}QYQB@UW?OWdn#~3&`fZGlWOU7>g z0l&xoWoGAae9`tt;SAgUabuZy=CBBEH2C??KmWoAqzyC>kKlzWAeJwLF6|7;3mJ(V z(uu87Fh2(?@DVc+QGon>AK)>-P}kn5hf%B9e|Jyu(yKKNs#aG}2qrkuGcV8{uaUrU zlb3=*MBkmVF3(OO`wz{Nat2XZ*J+*1$809}6yK#V(S+TIxjqPdl~uXCs1b{k#OeMl z2Qb&t`SIVNp5?uZl$f=2B;r!?u%DKRfgDYEJ#L@^j5_CYXZ0UK;=Ks`%7pYvS6m7 zxBT`Lh^~<4j7=8cxoOn1zQ_yr@FOo$H`%<}lDl8+y@IG{h7M`Y@RSe7fBS#m(iDF`8TwynEAc?Yl2)1c4zE7CV+f`~n1E`I{}evOk>~#M>7+xWKO7@l64u;_hTL74jx`T#RyE35g60(LP@ONY1wm z$B{0pOr>e5WKwv=)@r6S8;1b{46vjcWl%Fc$3%3j%k2zI+s`C(Yw@oK_Q`% zja$qFUSnmg@@Fm&fok-O;fcuy0cM-HS6r`5BG1kSg*Q$ik2xTFt8VQsXAX4E@wl2MQN9Hc6jUUXe^ejZ!lmt0>1RF^T+=h1!Jpc$~3%Hltv(o7pjp zPB+2jIH<4f#f$}4`c@rc_G(Ayy}WEc8!X`i3RDKJY-^Mv|4{*wjPIji%U zy=h#NUpE#q6(%tq@ovwQ-mg^rbxHE(jzbi*3S z8cx3)l%hhz#Jd-$|~HItW2$d zbJ)ksz_3zf8d)z$PjAr|^F$L zv(mS%6%?PMb*yHiKl9LYmCVbA(jn_EO~?~;QL9$R8JpEFQC|rs|K7iQFO&D!`Ls`w z0{C1iWGu^Nkg&T&X`F*xd^(7H_7jC(f<=Lt1WnsY+vgnz3Teq;#8}J1%))k(2 zo?Ke;0T9)|)9nm={_NUHH%*N8@~3^OhIlg{sLXG^ic(0+%ZElrqBo9=lKc5T0fnly zxq3il2S(?&{?}Xviy9P_8jShH-q?KppAKIW_vAkAmh$TnI_tj`gAwF?lYXkTtfHyk z{?pj{ocqm}YaU6@wZ&j=W)9=aDRVv^f+oxt7pl7nJYI1T+3b%S z-gK20i{eXs`RIJ~jPKFf!dMrlXSa5-5Xv4p#znJ@x@16`Y+cZi^M9PDP zC6-BS)4Bf4Q>jCl1Qy#50@fFo*)PC!FenHen~kC#^G3+X$WT$F4BJ54WH-*Z1+bWO zU%BDW=-{na5pX#`JhTY050>ggMAo_f{&9Y|;JXGP#SSOpF#+5_NVVa{?k4p{n5;zT z4#smhPV@{3uVgZ{C_QFKPj#lDkXk%?%o|uaj<>@-H9DWQ=&ynBmK(F}=aa7=nD_KOp;cV#`r8=oZ_|ZFKD=%|p zV@WhZt=z}TpBTSA`6d?A5 z>@*VhhQAit1%z_IwZ-UU)NZYuvJDLuzB)xW*jfa1Nf1n5P8dzmPXRhNgTFtZw6@*b zx7LRYZd~6C@`);#h+H@U#Gpe>Jo|WBlPAsfkPo7wt6a4`)7^2cU5CITUG!OCGI9Ln zB9kWXIu)1DcG`h#az$uXu-kchPG~4yrZOkkxw-=zs2^Yc;*AIo4c#3|+*wRhErPP6n%VD+sv)(kt6RbZY={ zyV=d<;$Q5L^pSuR2UNM<7YB8p*{=W*ote?fNds*Q95i+6(ZV8lFWZ^20bn(+>0yq5 zUgXy}f1AF&vsRF$LAomU0k4YBXE8C>G(*e#Di>emtf!-BbzEY85!@pxqRSKc7MGmIZ;wOg$M#Z&5~rtV1B2m$jTI$;p*` z-1`yzoFomXCGAMeF3ZUwDtd|))(a78)e|o0zE^R<;QT|PvKB#$_259blpr-LEsJG*A4WYz|e#T#KTmsu;+U zC9@tqkWe+S?*FqwhK2`vZ`7`=j+e$pLGS)IFBFeP6>#C{Rn+Y?P85=2_bOGVU+z;= zgy_WbZf6CO3l=KjFL=g$?4L1aa-E}>zj8^f=@xY<8A!}h*rmBs1zl=t%vKd^X@(_y z-Uo4tA(&feP$qx`^WY92b04* z8SduaK`=VIU+^l-eTv{J6vbb$ZTvXdp=Vz_660HmjPf`*=# z8Q!Hjmedpys$UWqH!+JkC^Z@0yEm~HsGR|>U-#v-F^hV`r1o4 zVUWoLczy7tXWS~u-BwGYzhX}2cCMWJygQeTO33h5Q396ZcGR&U@OnT2Ptfunj8=%ppD!v8nE?wpXw)uh**obzk;Z!q%hzyjXF$!!H1G{laQw$ubTtcLgSZ0=K zx=j~WcaDPq@v0^qPAO|s(oe(lfo>|Q8m=1ZSgAzO@Zincqls2;l)_vP;8pkb!W!&* zoV7~M!K!QqHvWSH199}m)nl}ix+R5$-Ztl9@3&Mf2P~>?FVbAeZZE_zI#UI1_Z>&l zwahDkiPmqngT4DI73fqQ@yfcdNk^u{5R31tPr-7^m$%piUqB%Y0( zl?$o9|Jly6=|yD|1E}0eN`(0ML`1mAxn43XMc|GRH=`o~I^cWYfrFszXcD^<6UHKl zSad`~LvwEv0Y18yua4ZBZSS_)p1dHj(X~}C)^Ubo&h&p~r2|a=UQ@|uz{P}dfk~+f~m6- zry-DFT3KDS(lv>l{(Z)5WbjZ+&mJyHQ|5*0)&Z6bv&z=NXqOYu88OMy0i&xfS0^ib zjiTH1Rw;u(IsK&N3{@fk+uy315BWoMm}DCPOC`KypQUbzLYXMHs9+L%#zXf!>p%o499d(guQKpQ zh|XKZ?U+El5l`Lbnc;pFjKKzLyp1Qm3S7f)vcz5278v9UhL?i-64@3L*;0cCUfeN5 zURZ{m4@@d5()r~`d$0YHX=YA=8Jp&!ReUY4YAmqQhocj1pwvOF6CkWt8YV~R(U5VW z
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 targets. + AllowStale bool `yaml:"allow_stale"` + // By default use blocking queries (https://www.consul.io/api/index.html#blocking-queries) + // but allow users to throttle updates if necessary. This can be useful because of "bugs" like + // https://github.com/hashicorp/consul/issues/3712 which cause an un-necessary + // amount of requests on consul. + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` + + // See https://www.consul.io/api/catalog.html#list-services + // The list of services for which targets are discovered. + // Defaults to all services if empty. + Services []string `yaml:"services,omitempty"` + // An optional tag used to filter instances inside a service. A single tag is supported + // here to match the Consul API. + ServiceTag string `yaml:"tag,omitempty"` + // Desired node metadata. + NodeMeta map[string]string `yaml:"node_meta,omitempty"` + + TLSConfig config_util.TLSConfig `yaml:"tls_config,omitempty"` +} diff --git a/monitoring/promconfig/discovery/dns/dns.go b/monitoring/promconfig/discovery/dns/dns.go new file mode 100644 index 0000000..9cda5dd --- /dev/null +++ b/monitoring/promconfig/discovery/dns/dns.go @@ -0,0 +1,32 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package dns + +import ( + "github.com/prometheus/common/model" +) + +// SDConfig is the configuration for DNS based service discovery. +type SDConfig struct { + Names []string `yaml:"names"` + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` + Type string `yaml:"type"` + Port int `yaml:"port"` // Ignored for SRV records +} diff --git a/monitoring/promconfig/discovery/ec2/ec2.go b/monitoring/promconfig/discovery/ec2/ec2.go new file mode 100644 index 0000000..f731cd4 --- /dev/null +++ b/monitoring/promconfig/discovery/ec2/ec2.go @@ -0,0 +1,45 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ec2 + +import ( + "github.com/prometheus/common/model" + + config_util "github.com/prometheus/common/config" +) + +// Filter is the configuration for filtering EC2 instances. +type Filter struct { + Name string `yaml:"name"` + Values []string `yaml:"values"` +} + +// SDConfig is the configuration for EC2 based service discovery. +type SDConfig struct { + Endpoint string `yaml:"endpoint"` + Region string `yaml:"region"` + AccessKey string `yaml:"access_key,omitempty"` + SecretKey config_util.Secret `yaml:"secret_key,omitempty"` + Profile string `yaml:"profile,omitempty"` + RoleARN string `yaml:"role_arn,omitempty"` + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` + Port int `yaml:"port"` + Filters []*Filter `yaml:"filters"` +} diff --git a/monitoring/promconfig/discovery/file/file.go b/monitoring/promconfig/discovery/file/file.go new file mode 100644 index 0000000..4e5ffea --- /dev/null +++ b/monitoring/promconfig/discovery/file/file.go @@ -0,0 +1,30 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package file + +import ( + "github.com/prometheus/common/model" +) + +// SDConfig is the configuration for file based discovery. +type SDConfig struct { + Files []string `yaml:"files"` + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` +} diff --git a/monitoring/promconfig/discovery/gce/gce.go b/monitoring/promconfig/discovery/gce/gce.go new file mode 100644 index 0000000..174a4ac --- /dev/null +++ b/monitoring/promconfig/discovery/gce/gce.go @@ -0,0 +1,43 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gce + +import ( + "github.com/prometheus/common/model" +) + +// SDConfig is the configuration for GCE based service discovery. +type SDConfig struct { + // Project: The Google Cloud Project ID + Project string `yaml:"project"` + + // Zone: The zone of the scrape targets. + // If you need to configure multiple zones use multiple gce_sd_configs + Zone string `yaml:"zone"` + + // Filter: Can be used optionally to filter the instance list by other criteria. + // Syntax of this filter string is described here in the filter query parameter section: + // https://cloud.google.com/compute/docs/reference/latest/instances/list + Filter string `yaml:"filter,omitempty"` + + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` + Port int `yaml:"port"` + TagSeparator string `yaml:"tag_separator,omitempty"` +} diff --git a/monitoring/promconfig/discovery/kubernetes/kubernetes.go b/monitoring/promconfig/discovery/kubernetes/kubernetes.go new file mode 100644 index 0000000..3eb340f --- /dev/null +++ b/monitoring/promconfig/discovery/kubernetes/kubernetes.go @@ -0,0 +1,60 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package kubernetes + +import ( + config_util "github.com/prometheus/common/config" +) + +// Role is role of the service in Kubernetes. +type Role string + +// The valid options for Role. +const ( + RoleNode Role = "node" + RolePod Role = "pod" + RoleService Role = "service" + RoleEndpoint Role = "endpoints" + RoleIngress Role = "ingress" +) + +// SDConfig is the configuration for Kubernetes service discovery. +type SDConfig struct { + APIServer config_util.URL `yaml:"api_server,omitempty"` + Role Role `yaml:"role"` + BasicAuth *config_util.BasicAuth `yaml:"basic_auth,omitempty"` + BearerToken config_util.Secret `yaml:"bearer_token,omitempty"` + BearerTokenFile string `yaml:"bearer_token_file,omitempty"` + TLSConfig config_util.TLSConfig `yaml:"tls_config,omitempty"` + NamespaceDiscovery NamespaceDiscovery `yaml:"namespaces,omitempty"` +} + +// NamespaceDiscovery is the configuration for discovering +// Kubernetes namespaces. +type NamespaceDiscovery struct { + Names []string `yaml:"names"` +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (c *NamespaceDiscovery) UnmarshalYAML(unmarshal func(interface{}) error) error { + *c = NamespaceDiscovery{} + type plain NamespaceDiscovery + return unmarshal((*plain)(c)) +} diff --git a/monitoring/promconfig/discovery/marathon/marathon.go b/monitoring/promconfig/discovery/marathon/marathon.go new file mode 100644 index 0000000..46d2654 --- /dev/null +++ b/monitoring/promconfig/discovery/marathon/marathon.go @@ -0,0 +1,34 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package marathon + +import ( + config_util "github.com/prometheus/common/config" + "github.com/prometheus/common/model" +) + +// SDConfig is the configuration for services running on Marathon. +type SDConfig struct { + Servers []string `yaml:"servers,omitempty"` + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` + AuthToken config_util.Secret `yaml:"auth_token,omitempty"` + AuthTokenFile string `yaml:"auth_token_file,omitempty"` + HTTPClientConfig config_util.HTTPClientConfig `yaml:",inline"` +} diff --git a/monitoring/promconfig/discovery/openstack/openstack.go b/monitoring/promconfig/discovery/openstack/openstack.go new file mode 100644 index 0000000..9953bb7 --- /dev/null +++ b/monitoring/promconfig/discovery/openstack/openstack.go @@ -0,0 +1,56 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package openstack + +import ( + config_util "github.com/prometheus/common/config" + "github.com/prometheus/common/model" +) + +// SDConfig is the configuration for OpenStack based service discovery. +type SDConfig struct { + IdentityEndpoint string `yaml:"identity_endpoint"` + Username string `yaml:"username"` + UserID string `yaml:"userid"` + Password config_util.Secret `yaml:"password"` + ProjectName string `yaml:"project_name"` + ProjectID string `yaml:"project_id"` + DomainName string `yaml:"domain_name"` + DomainID string `yaml:"domain_id"` + Role Role `yaml:"role"` + Region string `yaml:"region"` + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` + Port int `yaml:"port"` + AllTenants bool `yaml:"all_tenants,omitempty"` + TLSConfig config_util.TLSConfig `yaml:"tls_config,omitempty"` +} + +// OpenStackRole is role of the target in OpenStack. +type Role string + +// The valid options for OpenStackRole. +const ( + // OpenStack document reference + // https://docs.openstack.org/nova/pike/admin/arch.html#hypervisors + OpenStackRoleHypervisor Role = "hypervisor" + // OpenStack document reference + // https://docs.openstack.org/horizon/pike/user/launch-instances.html + OpenStackRoleInstance Role = "instance" +) diff --git a/monitoring/promconfig/discovery/targetgroup/targetgroup.go b/monitoring/promconfig/discovery/targetgroup/targetgroup.go new file mode 100644 index 0000000..e96ae43 --- /dev/null +++ b/monitoring/promconfig/discovery/targetgroup/targetgroup.go @@ -0,0 +1,99 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package targetgroup + +import ( + "bytes" + "encoding/json" + + "github.com/prometheus/common/model" +) + +// Group is a set of targets with a common label set(production , test, staging etc.). +type Group struct { + // Targets is a list of targets identified by a label set. Each target is + // uniquely identifiable in the group by its address label. + Targets []model.LabelSet + // Labels is a set of labels that is common across all targets in the group. + Labels model.LabelSet + + // Source is an identifier that describes a group of targets. + Source string +} + +func (tg Group) String() string { + return tg.Source +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (tg *Group) UnmarshalYAML(unmarshal func(interface{}) error) error { + g := struct { + Targets []string `yaml:"targets"` + Labels model.LabelSet `yaml:"labels"` + }{} + if err := unmarshal(&g); err != nil { + return err + } + tg.Targets = make([]model.LabelSet, 0, len(g.Targets)) + for _, t := range g.Targets { + tg.Targets = append(tg.Targets, model.LabelSet{ + model.AddressLabel: model.LabelValue(t), + }) + } + tg.Labels = g.Labels + return nil +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (tg Group) MarshalYAML() (interface{}, error) { + g := &struct { + Targets []string `yaml:"targets"` + Labels model.LabelSet `yaml:"labels,omitempty"` + }{ + Targets: make([]string, 0, len(tg.Targets)), + Labels: tg.Labels, + } + for _, t := range tg.Targets { + g.Targets = append(g.Targets, string(t[model.AddressLabel])) + } + return g, nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (tg *Group) UnmarshalJSON(b []byte) error { + g := struct { + Targets []string `json:"targets"` + Labels model.LabelSet `json:"labels"` + }{} + + dec := json.NewDecoder(bytes.NewReader(b)) + dec.DisallowUnknownFields() + if err := dec.Decode(&g); err != nil { + return err + } + tg.Targets = make([]model.LabelSet, 0, len(g.Targets)) + for _, t := range g.Targets { + tg.Targets = append(tg.Targets, model.LabelSet{ + model.AddressLabel: model.LabelValue(t), + }) + } + tg.Labels = g.Labels + return nil +} diff --git a/monitoring/promconfig/discovery/triton/triton.go b/monitoring/promconfig/discovery/triton/triton.go new file mode 100644 index 0000000..807fd9e --- /dev/null +++ b/monitoring/promconfig/discovery/triton/triton.go @@ -0,0 +1,38 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package triton + +import ( + "github.com/prometheus/common/model" + + config_util "github.com/prometheus/common/config" +) + +// SDConfig is the configuration for Triton based service discovery. +type SDConfig struct { + Account string `yaml:"account"` + DNSSuffix string `yaml:"dns_suffix"` + Endpoint string `yaml:"endpoint"` + Groups []string `yaml:"groups,omitempty"` + Port int `yaml:"port"` + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` + TLSConfig config_util.TLSConfig `yaml:"tls_config,omitempty"` + Version int `yaml:"version"` +} diff --git a/monitoring/promconfig/discovery/zookeeper/zookeeper.go b/monitoring/promconfig/discovery/zookeeper/zookeeper.go new file mode 100644 index 0000000..513dbcc --- /dev/null +++ b/monitoring/promconfig/discovery/zookeeper/zookeeper.go @@ -0,0 +1,38 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +// Copyright (c) bwplotka/mimic Authors +// Licensed under the Apache License 2.0. + +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zookeeper + +import ( + "github.com/prometheus/common/model" +) + +// ServersetSDConfig is the configuration for Twitter serversets in Zookeeper based discovery. +type ServersetSDConfig struct { + Servers []string `yaml:"servers"` + Paths []string `yaml:"paths"` + Timeout model.Duration `yaml:"timeout,omitempty"` +} + +// NerveSDConfig is the configuration for AirBnB's Nerve in Zookeeper based discovery. +type NerveSDConfig struct { + Servers []string `yaml:"servers"` + Paths []string `yaml:"paths"` + Timeout model.Duration `yaml:"timeout,omitempty"` +} diff --git a/monitoring/promconfig/prometheus.go b/monitoring/promconfig/prometheus.go new file mode 100644 index 0000000..e9a2132 --- /dev/null +++ b/monitoring/promconfig/prometheus.go @@ -0,0 +1,261 @@ +// Copyright (c) The EfficientGo Authors. +// Licensed under the Apache License 2.0. + +package promconfig + +import ( + "net/url" + "regexp" + "strings" + + sdconfig "github.com/efficientgo/e2e/monitoring/promconfig/discovery/config" + "github.com/pkg/errors" + config_util "github.com/prometheus/common/config" + "github.com/prometheus/common/model" +) + +// NOTE(bwplotka): Stripped out Prometheus configuration from: https://github.com/prometheus/prometheus/blob/master/config/config.go +// We cannot import them directly easily as config package has cosmic number of dependencies (50+), dependency hell. +// TODO(bwplotka): Contribute and strip deps in Prometheus upstream once we agree as Prometheus maintainers if that use case we want to be support. + +// Config is the top-level configuration for Prometheus's config files. +type Config struct { + GlobalConfig GlobalConfig `yaml:"global"` + AlertingConfig AlertingConfig `yaml:"alerting,omitempty"` + RuleFiles []string `yaml:"rule_files,omitempty"` + ScrapeConfigs []*ScrapeConfig `yaml:"scrape_configs,omitempty"` + + RemoteWriteConfigs []*RemoteWriteConfig `yaml:"remote_write,omitempty"` + RemoteReadConfigs []*RemoteReadConfig `yaml:"remote_read,omitempty"` +} + +// GlobalConfig configures values that are used across other configuration +// objects. +type GlobalConfig struct { + // How frequently to scrape targets by default. + ScrapeInterval model.Duration `yaml:"scrape_interval,omitempty"` + // The default timeout when scraping targets. + ScrapeTimeout model.Duration `yaml:"scrape_timeout,omitempty"` + // How frequently to evaluate rules by default. + EvaluationInterval model.Duration `yaml:"evaluation_interval,omitempty"` + // The labels to add to any timeseries that this Prometheus instance scrapes. + ExternalLabels model.LabelSet `yaml:"external_labels,omitempty"` +} + +// ScrapeConfig configures a scraping unit for Prometheus. +type ScrapeConfig struct { + // The job name to which the job label is set by default. + JobName string `yaml:"job_name"` + // Indicator whether the scraped metrics should remain unmodified. + HonorLabels bool `yaml:"honor_labels,omitempty"` + // A set of query parameters with which the target is scraped. + Params url.Values `yaml:"params,omitempty"` + // How frequently to scrape the targets of this scrape config. + ScrapeInterval model.Duration `yaml:"scrape_interval,omitempty"` + // The timeout for scraping targets of this config. + ScrapeTimeout model.Duration `yaml:"scrape_timeout,omitempty"` + // The HTTP resource path on which to fetch metrics from targets. + MetricsPath string `yaml:"metrics_path,omitempty"` + // The URL scheme with which to fetch metrics from targets. + Scheme string `yaml:"scheme,omitempty"` + // More than this many samples post metric-relabelling will cause the scrape to fail. + SampleLimit uint `yaml:"sample_limit,omitempty"` + + // We cannot do proper Go type embedding below as the parser will then parse + // values arbitrarily into the overflow maps of further-down types. + + ServiceDiscoveryConfig sdconfig.ServiceDiscoveryConfig `yaml:",inline"` + HTTPClientConfig config_util.HTTPClientConfig `yaml:",inline"` + + // List of target relabel configurations. + RelabelConfigs []*RelabelConfig `yaml:"relabel_configs,omitempty"` + // List of metric relabel configurations. + MetricRelabelConfigs []*RelabelConfig `yaml:"metric_relabel_configs,omitempty"` +} + +// AlertingConfig configures alerting and alertmanager related configs. +type AlertingConfig struct { + AlertRelabelConfigs []*RelabelConfig `yaml:"alert_relabel_configs,omitempty"` + AlertmanagerConfigs []*AlertmanagerConfig `yaml:"alertmanagers,omitempty"` +} + +// AlertmanagerConfig configures how Alertmanagers can be discovered and communicated with. +type AlertmanagerConfig struct { + // We cannot do proper Go type embedding below as the parser will then parse + // values arbitrarily into the overflow maps of further-down types. + + ServiceDiscoveryConfig sdconfig.ServiceDiscoveryConfig `yaml:",inline"` + HTTPClientConfig config_util.HTTPClientConfig `yaml:",inline"` + + // The URL scheme to use when talking to Alertmanagers. + Scheme string `yaml:"scheme,omitempty"` + // Path prefix to add in front of the push endpoint path. + PathPrefix string `yaml:"path_prefix,omitempty"` + // The timeout used when sending alerts. + Timeout model.Duration `yaml:"timeout,omitempty"` + + // List of Alertmanager relabel configurations. + RelabelConfigs []*RelabelConfig `yaml:"relabel_configs,omitempty"` +} + +// ClientCert contains client cert credentials. +type ClientCert struct { + Cert string `yaml:"cert"` + Key config_util.Secret `yaml:"key"` +} + +// FileSDConfig is the configuration for file based discovery. +type FileSDConfig struct { + Files []string `yaml:"files"` + RefreshInterval model.Duration `yaml:"refresh_interval,omitempty"` +} + +// RelabelAction is the action to be performed on relabeling. +type RelabelAction string + +const ( + // RelabelReplace performs a regex replacement. + RelabelReplace RelabelAction = "replace" + // RelabelKeep drops targets for which the input does not match the regex. + RelabelKeep RelabelAction = "keep" + // RelabelDrop drops targets for which the input does match the regex. + RelabelDrop RelabelAction = "drop" + // RelabelHashMod sets a label to the modulus of a hash of labels. + RelabelHashMod RelabelAction = "hashmod" + // RelabelLabelMap copies labels to other labelnames based on a regex. + RelabelLabelMap RelabelAction = "labelmap" + // RelabelLabelDrop drops any label matching the regex. + RelabelLabelDrop RelabelAction = "labeldrop" + // RelabelLabelKeep drops any label not matching the regex. + RelabelLabelKeep RelabelAction = "labelkeep" +) + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (a *RelabelAction) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + switch act := RelabelAction(strings.ToLower(s)); act { + case RelabelReplace, RelabelKeep, RelabelDrop, RelabelHashMod, RelabelLabelMap, RelabelLabelDrop, RelabelLabelKeep: + *a = act + return nil + } + return errors.Errorf("unknown relabel action %q", s) +} + +// RelabelConfig is the configuration for relabeling of target label sets. +type RelabelConfig struct { + // A list of labels from which values are taken and concatenated + // with the configured separator in order. + SourceLabels model.LabelNames `yaml:"source_labels,flow,omitempty"` + // Separator is the string between concatenated values from the source labels. + Separator string `yaml:"separator,omitempty"` + // Regex against which the concatenation is matched. + Regex Regexp `yaml:"regex,omitempty"` + // Modulus to take of the hash of concatenated values from the source labels. + Modulus uint64 `yaml:"modulus,omitempty"` + // TargetLabel is the label to which the resulting string is written in a replacement. + // Regexp interpolation is allowed for the replace action. + TargetLabel string `yaml:"target_label,omitempty"` + // Replacement is the regex replacement pattern to be used. + Replacement string `yaml:"replacement,omitempty"` + // Action is the action to be performed for the relabeling. + Action RelabelAction `yaml:"action,omitempty"` +} + +// Regexp encapsulates a regexp.Regexp and makes it YAML marshallable. +type Regexp struct { + *regexp.Regexp + original string +} + +// NewRegexp creates a new anchored Regexp and returns an error if the +// passed-in regular expression does not compile. +func NewRegexp(s string) (Regexp, error) { + regex, err := regexp.Compile("^(?:" + s + ")$") + return Regexp{ + Regexp: regex, + original: s, + }, err +} + +// MustNewRegexp works like NewRegexp, but panics if the regular expression does not compile. +func MustNewRegexp(s string) Regexp { + re, err := NewRegexp(s) + if err != nil { + panic(err) + } + return re +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (re *Regexp) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + r, err := NewRegexp(s) + if err != nil { + return err + } + *re = r + return nil +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (re Regexp) MarshalYAML() (interface{}, error) { + if re.original != "" { + return re.original, nil + } + return nil, nil +} + +// RemoteWriteConfig is the configuration for writing to remote storage. +type RemoteWriteConfig struct { + URL *config_util.URL `yaml:"url"` + RemoteTimeout model.Duration `yaml:"remote_timeout,omitempty"` + WriteRelabelConfigs []*RelabelConfig `yaml:"write_relabel_configs,omitempty"` + + // We cannot do proper Go type embedding below as the parser will then parse + // values arbitrarily into the overflow maps of further-down types. + HTTPClientConfig config_util.HTTPClientConfig `yaml:",inline"` + QueueConfig QueueConfig `yaml:"queue_config,omitempty"` +} + +// QueueConfig is the configuration for the queue used to write to remote +// storage. +type QueueConfig struct { + // Number of samples to buffer per shard before we start dropping them. + Capacity int `yaml:"capacity,omitempty"` + + // Max number of shards, i.e. amount of concurrency. + MaxShards int `yaml:"max_shards,omitempty"` + + // Maximum number of samples per send. + MaxSamplesPerSend int `yaml:"max_samples_per_send,omitempty"` + + // Maximum time sample will wait in buffer. + BatchSendDeadline model.Duration `yaml:"batch_send_deadline,omitempty"` + + // Max number of times to retry a batch on recoverable errors. + MaxRetries int `yaml:"max_retries,omitempty"` + + // On recoverable errors, backoff exponentially. + MinBackoff model.Duration `yaml:"min_backoff,omitempty"` + MaxBackoff model.Duration `yaml:"max_backoff,omitempty"` +} + +// RemoteReadConfig is the configuration for reading from remote storage. +type RemoteReadConfig struct { + URL *config_util.URL `yaml:"url"` + RemoteTimeout model.Duration `yaml:"remote_timeout,omitempty"` + ReadRecent bool `yaml:"read_recent,omitempty"` + // We cannot do proper Go type embedding below as the parser will then parse + // values arbitrarily into the overflow maps of further-down types. + HTTPClientConfig config_util.HTTPClientConfig `yaml:",inline"` + + // RequiredMatchers is an optional list of equality matchers which have to + // be present in a selector to query the remote read endpoint. + RequiredMatchers model.LabelSet `yaml:"required_matchers,omitempty"` +}