From ed207a9f33136309816f80f437f571f99d362adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Fri, 24 Feb 2023 21:45:14 +0300 Subject: [PATCH 01/13] init docker compose with prom & grafana --- docker-compose.yml | 66 +++++++++++++++++++ monitoring/alertmanager/config.yml | 10 +++ monitoring/grafana/config.monitoring | 3 + .../provisioning/dashboards/dashboard.yml | 11 ++++ .../provisioning/datasources/datasource.yml | 50 ++++++++++++++ monitoring/prometheus/prometheus.yml | 20 ++++++ 6 files changed, 160 insertions(+) create mode 100644 docker-compose.yml create mode 100644 monitoring/alertmanager/config.yml create mode 100644 monitoring/grafana/config.monitoring create mode 100644 monitoring/grafana/provisioning/dashboards/dashboard.yml create mode 100644 monitoring/grafana/provisioning/datasources/datasource.yml create mode 100644 monitoring/prometheus/prometheus.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..30a87de --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,66 @@ +version: '3.8' + +volumes: + prometheus_data: {} + grafana_data: {} + +services: + prometheus: + image: prom/prometheus + restart: always + volumes: + - ./monitoring/prometheus:/etc/prometheus/ + - prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + - '--web.console.libraries=/usr/share/prometheus/console_libraries' + - '--web.console.templates=/usr/share/prometheus/consoles' + ports: + - 9090:9090 + links: + - alertmanager:alertmanager + + node-exporter: + image: prom/node-exporter + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + command: + - '--path.procfs=/host/proc' + - '--path.sysfs=/host/sys' + - --collector.filesystem.ignored-mount-points + - '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)' + ports: + - 9100:9100 + restart: always + deploy: + mode: global + + alertmanager: + image: prom/alertmanager + restart: always + ports: + - 9093:9093 + volumes: + - ./monitoring/alertmanager/:/etc/alertmanager/ + command: + - '--config.file=/etc/alertmanager/config.yml' + - '--storage.path=/alertmanager' + + grafana: + image: grafana/grafana + user: '472' + restart: always + environment: + GF_INSTALL_PLUGINS: 'grafana-clock-panel,grafana-simple-json-datasource' + volumes: + - grafana_data:/var/lib/grafana + - ./monitoring/grafana/provisioning/:/etc/grafana/provisioning/ + env_file: + - ./monitoring/grafana/config.monitoring + ports: + - 3000:3000 + depends_on: + - prometheus \ No newline at end of file diff --git a/monitoring/alertmanager/config.yml b/monitoring/alertmanager/config.yml new file mode 100644 index 0000000..c931962 --- /dev/null +++ b/monitoring/alertmanager/config.yml @@ -0,0 +1,10 @@ +route: + receiver: 'slack' + +receivers: + - name: 'slack' +# slack_configs: +# - send_resolved: true +# username: '' +# channel: '#' +# api_url: '' \ No newline at end of file diff --git a/monitoring/grafana/config.monitoring b/monitoring/grafana/config.monitoring new file mode 100644 index 0000000..b31d46a --- /dev/null +++ b/monitoring/grafana/config.monitoring @@ -0,0 +1,3 @@ +GF_SECURITY_ADMIN_USER=admin +GF_SECURITY_ADMIN_PASSWORD=foobar +GF_USERS_ALLOW_SIGN_UP=false \ No newline at end of file diff --git a/monitoring/grafana/provisioning/dashboards/dashboard.yml b/monitoring/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 0000000..9f7232c --- /dev/null +++ b/monitoring/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'Prometheus' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards \ No newline at end of file diff --git a/monitoring/grafana/provisioning/datasources/datasource.yml b/monitoring/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 0000000..d5dba38 --- /dev/null +++ b/monitoring/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,50 @@ +# config file version +apiVersion: 1 + +# list of datasources that should be deleted from the database +deleteDatasources: + - name: Prometheus + orgId: 1 + +# list of datasources to insert/update depending +# whats available in the database +datasources: + # name of the datasource. Required + - name: Prometheus + # datasource type. Required + type: prometheus + # access mode. direct or proxy. Required + access: proxy + # org id. will default to orgId 1 if not specified + orgId: 1 + # url + url: http://prometheus:9090 + # database password, if used + password: + # database user, if used + user: + # database name, if used + database: + # enable/disable basic auth + basicAuth: false + # basic auth username, if used + basicAuthUser: + # basic auth password, if used + basicAuthPassword: + # enable/disable with credentials headers + withCredentials: + # mark as default datasource. Max one per org + isDefault: true + # fields that will be converted to json and stored in json_data + jsonData: + graphiteVersion: "1.1" + tlsAuth: false + tlsAuthWithCACert: false + # json object of data that will be encrypted. + secureJsonData: + tlsCACert: "..." + tlsClientCert: "..." + tlsClientKey: "..." + version: 1 + # allow users to edit datasources from the UI. + editable: true \ No newline at end of file diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml new file mode 100644 index 0000000..8051d61 --- /dev/null +++ b/monitoring/prometheus/prometheus.yml @@ -0,0 +1,20 @@ +global: + scrape_interval: 15s + scrape_timeout: 10s + evaluation_interval: 15s +alerting: + alertmanagers: + - static_configs: + - targets: [] + scheme: http + timeout: 10s + api_version: v1 +scrape_configs: + - job_name: prometheus + honor_timestamps: true + scrape_interval: 15s + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + static_configs: + - targets: ['localhost:9090'] \ No newline at end of file From 2f3080cd9f134d9f22777bd02dfda5dbb34b09a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sat, 25 Feb 2023 00:12:42 +0300 Subject: [PATCH 02/13] update flow --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a0e2886..49ff761 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,10 @@ flowchart LR Balancer --> Proxy end end - Proxy ---->|275ms| AS1[Provider 1] - Proxy -->|100ms| AS2[Provider 2] - Proxy --->|170ms| ASN[Provider N] - + Proxy -->|TCP - 275ms| AS1[Provider 1] + Proxy -->|TCP - 101ms| AS2[Provider 2] + Proxy -->|TCP - 100ms| AS3[Provider 3] + Proxy -->|TCP - 170ms| ASN[Provider N] ``` if you are curious about details From 18b0cf834ec2cdb0e66b06e1bf00a2fed997c540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sat, 25 Feb 2023 00:27:19 +0300 Subject: [PATCH 03/13] update chart --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 49ff761..6d3f9af 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,13 @@ flowchart LR subgraph fasthttp Routing --> Auth(Auth & Cors) Auth --> Balancer - Balancer --> Proxy end + Balancer --> Proxy end - Proxy -->|TCP - 275ms| AS1[Provider 1] - Proxy -->|TCP - 101ms| AS2[Provider 2] - Proxy -->|TCP - 100ms| AS3[Provider 3] - Proxy -->|TCP - 170ms| ASN[Provider N] + Proxy -->|TCP -> 100ms| Upstream1[Provider 1] + Proxy -->|TCP -> 101ms| Upstream2[Provider 2] + Proxy -->|TCP -> 200ms| Upstream3[Provider 3] + Proxy -->|TCP -> 300ms| Upstream4[Provider N] ``` if you are curious about details From dec38a97bdef4cb5acad726b230b31f381656053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sat, 25 Feb 2023 12:23:25 +0300 Subject: [PATCH 04/13] basic latency calculation --- internal/upstream/node.go | 15 +++++++++------ internal/webserver/proxy.go | 4 +++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/internal/upstream/node.go b/internal/upstream/node.go index 1ab0cb7..1b191c8 100644 --- a/internal/upstream/node.go +++ b/internal/upstream/node.go @@ -25,7 +25,9 @@ type Node struct { } // ServeHTTP server http (actual proxy) through this node -func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) error { +// upstreamTook is only for the upstream request, not total (body reading & writing back to the client etc) +// it can be misleading when you got an error, so, count success only for accurate latency +func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) (err error, upstreamTook time.Duration) { r := fasthttp.AcquireRequest() ctx.Request.CopyTo(r) r.SetRequestURI(n.Endpoint) @@ -33,10 +35,11 @@ func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) error { resp := fasthttp.AcquireResponse() defer fasthttp.ReleaseResponse(resp) // <- do not forget to release defer fasthttp.ReleaseRequest(r) - err := fasthttp.Do(r, resp) - + start := time.Now() + err = fasthttp.Do(r, resp) + upstreamTook = time.Now().Sub(start) if err != nil { - return err + return err, upstreamTook } ctx.Response.Header.SetStatusCode(resp.StatusCode()) @@ -46,10 +49,10 @@ func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) error { err = resp.BodyWriteTo(ctx.Response.BodyWriter()) if err != nil { - return err + return err, upstreamTook } - return nil + return nil, upstreamTook } // NewNode create new node diff --git a/internal/webserver/proxy.go b/internal/webserver/proxy.go index 876b49e..73a355f 100644 --- a/internal/webserver/proxy.go +++ b/internal/webserver/proxy.go @@ -50,7 +50,7 @@ func (s *WebServer) Proxy(ctx *fasthttp.RequestCtx) { return } - err = node.ServeHTTP(ctx) + err, took := node.ServeHTTP(ctx) if err != nil { node.SetHealthy(false) @@ -64,6 +64,8 @@ func (s *WebServer) Proxy(ctx *fasthttp.RequestCtx) { node.SetHealthy(false) return } + + s.logger.Debug("upstream request done", zap.Duration("took", took), zap.String("provider", node.Provider), zap.String("node", node.NodeID())) } // Auth check authentication first From 81246c80d347a8cb3bba9070d404b5196cad2371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sat, 25 Feb 2023 12:25:24 +0300 Subject: [PATCH 05/13] make linter happy --- internal/upstream/node.go | 10 +++++----- internal/webserver/proxy.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/upstream/node.go b/internal/upstream/node.go index 1b191c8..bdadac1 100644 --- a/internal/upstream/node.go +++ b/internal/upstream/node.go @@ -27,7 +27,7 @@ type Node struct { // ServeHTTP server http (actual proxy) through this node // upstreamTook is only for the upstream request, not total (body reading & writing back to the client etc) // it can be misleading when you got an error, so, count success only for accurate latency -func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) (err error, upstreamTook time.Duration) { +func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) (upstreamTook time.Duration, err error) { r := fasthttp.AcquireRequest() ctx.Request.CopyTo(r) r.SetRequestURI(n.Endpoint) @@ -37,9 +37,9 @@ func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) (err error, upstreamTook time defer fasthttp.ReleaseRequest(r) start := time.Now() err = fasthttp.Do(r, resp) - upstreamTook = time.Now().Sub(start) + upstreamTook = time.Since(start) if err != nil { - return err, upstreamTook + return upstreamTook, err } ctx.Response.Header.SetStatusCode(resp.StatusCode()) @@ -49,10 +49,10 @@ func (n *Node) ServeHTTP(ctx *fasthttp.RequestCtx) (err error, upstreamTook time err = resp.BodyWriteTo(ctx.Response.BodyWriter()) if err != nil { - return err, upstreamTook + return upstreamTook, err } - return nil, upstreamTook + return upstreamTook, nil } // NewNode create new node diff --git a/internal/webserver/proxy.go b/internal/webserver/proxy.go index 73a355f..3478896 100644 --- a/internal/webserver/proxy.go +++ b/internal/webserver/proxy.go @@ -50,7 +50,7 @@ func (s *WebServer) Proxy(ctx *fasthttp.RequestCtx) { return } - err, took := node.ServeHTTP(ctx) + took, err := node.ServeHTTP(ctx) if err != nil { node.SetHealthy(false) From f2cb5db0557b6390e3e31c592564e5876b577dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sun, 26 Feb 2023 00:17:47 +0300 Subject: [PATCH 06/13] add some notes about Makefile --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 6d3f9af..e4bf384 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,33 @@ info@rpc.ag If you would like to contribute to the RPC Aggregator with load balancing, please fork the repository and create a pull request with your changes. Be sure to include unit tests and adhere to the project's coding style. +Makefile Overview +----------------- + +This project uses a Makefile to manage different actions related to the project, including building, running, testing, checking, creating a Docker image, running a Docker container, and cleaning. The following is a brief overview of each target in the Makefile: + +- `build`: builds the project using the `go build` command and generates the binary file in the `bin/` directory +- `run`: runs the binary file generated by the `build` target and passes the configuration file as an argument +- `runp`: runs the binary file generated by the `build` target with a private configuration file located in the `_private/` directory +- `test`: tests the project using the `go test` command +- `check`: runs various checks on the project, including verifying the module dependencies, building, vetting, and linting the code +- `image`: builds a Docker image of the project using the `docker build` command +- `run-docker`: runs a Docker container of the project using the `docker run` command and maps port 8080 +- `clean`: removes the binary file and the `bin/` directory + +Usage +----- + +1. Build the project using the `make build` command +2. Run the project using the `make run` or `make runp` command +3. Test the project using the `make test` command +4. Check the project using the `make check` command +5. Build a Docker image of the project using the `make image` command +6. Run a Docker container of the project using the `make run-docker` command +7. Clean the project using the `make clean` command + +Note: Some Makefile targets require the `go`, `docker`, `staticcheck`, and `golint` commands to be installed. + > IF, the project get support (grant from any blockchain) to cover some server expenses and a bit more, we will share it > to developers who contribute to rpc.ag at any level (proxy, doc, monitoring, etc) we will also open some grants for > huge tasks and/or issues From 5806162448649f7b0f7aff5423b14310cbd7de5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sun, 26 Feb 2023 22:10:57 +0300 Subject: [PATCH 07/13] init metrics --- cmd/rpc-aggregator/main.go | 9 +++ go.mod | 9 +++ go.sum | 106 ++++++++++++++++++++++++++++++++ internal/prometheus/metrics.go | 18 ++++++ internal/webserver/proxy.go | 3 +- internal/webserver/webserver.go | 15 +++-- 6 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 internal/prometheus/metrics.go diff --git a/cmd/rpc-aggregator/main.go b/cmd/rpc-aggregator/main.go index 011abbf..8a5aa91 100644 --- a/cmd/rpc-aggregator/main.go +++ b/cmd/rpc-aggregator/main.go @@ -3,10 +3,12 @@ package main import ( "flag" "fmt" + "net/http" "os" "os/signal" "syscall" + "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/rpc-ag/rpc-aggregator/internal/config" "github.com/rpc-ag/rpc-aggregator/internal/webserver" "go.uber.org/zap" @@ -51,6 +53,13 @@ func main() { } }() + go func() { + promErr := http.ListenAndServe(":9090", promhttp.Handler()) + if promErr != nil { + panic(promErr) + } + }() + go server.StartHealthChecker() // Wait for interrupt signal diff --git a/go.mod b/go.mod index 09234dd..820f759 100644 --- a/go.mod +++ b/go.mod @@ -13,12 +13,20 @@ require ( require ( github.com/andybalholm/brotli v1.0.4 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/klauspost/compress v1.15.9 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d // indirect github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect @@ -30,6 +38,7 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/sys v0.3.0 // indirect golang.org/x/text v0.5.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 530dbdf..6c9cf6f 100644 --- a/go.sum +++ b/go.sum @@ -38,10 +38,22 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -66,6 +78,16 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -91,6 +113,9 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -102,7 +127,9 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -128,12 +155,22 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +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.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -141,20 +178,59 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +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/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +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/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d h1:Q+gqLBOPkFGHyCJxXMRqtUgUbTjI8/Ze8vu8GGyNFwo= github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -166,6 +242,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -204,6 +281,7 @@ go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -247,6 +325,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -254,6 +333,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +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-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -276,7 +356,10 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= 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= @@ -287,6 +370,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -298,9 +383,12 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -309,6 +397,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -321,6 +410,8 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/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/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -328,10 +419,14 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= @@ -492,13 +587,24 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/internal/prometheus/metrics.go b/internal/prometheus/metrics.go new file mode 100644 index 0000000..d07c61d --- /dev/null +++ b/internal/prometheus/metrics.go @@ -0,0 +1,18 @@ +package prometheus + +import "github.com/prometheus/client_golang/prometheus" + +type Metrics struct { + NodeRequests prometheus.Histogram +} + +func NewMetrics() *Metrics { + return &Metrics{ + NodeRequests: prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: "provider", + Name: "node_histogram", + Help: "Node latency", + }), + } +} diff --git a/internal/webserver/proxy.go b/internal/webserver/proxy.go index 3478896..0331440 100644 --- a/internal/webserver/proxy.go +++ b/internal/webserver/proxy.go @@ -65,7 +65,8 @@ func (s *WebServer) Proxy(ctx *fasthttp.RequestCtx) { return } - s.logger.Debug("upstream request done", zap.Duration("took", took), zap.String("provider", node.Provider), zap.String("node", node.NodeID())) + s.metrics.NodeRequests.Observe(took.Seconds()) + //s.logger.Debug("upstream request done", zap.Duration("took", took), zap.String("provider", node.Provider), zap.String("node", node.NodeID())) } // Auth check authentication first diff --git a/internal/webserver/webserver.go b/internal/webserver/webserver.go index 0517e28..c2c3cd8 100644 --- a/internal/webserver/webserver.go +++ b/internal/webserver/webserver.go @@ -5,8 +5,10 @@ import ( "time" "github.com/fasthttp/router" + prometheus2 "github.com/prometheus/client_golang/prometheus" "github.com/rpc-ag/rpc-aggregator/internal/config" - upstream2 "github.com/rpc-ag/rpc-aggregator/internal/upstream" + "github.com/rpc-ag/rpc-aggregator/internal/prometheus" + "github.com/rpc-ag/rpc-aggregator/internal/upstream" "github.com/rpc-ag/rpc-aggregator/internal/webserver/middleware" "github.com/tufanbarisyildirim/balancer" "github.com/valyala/fasthttp" @@ -20,7 +22,8 @@ type WebServer struct { auth *config.Auth server *fasthttp.Server router *router.Router - upstream *upstream2.Upstream + upstream *upstream.Upstream + metrics *prometheus.Metrics } type loggerAdapter struct { @@ -48,7 +51,7 @@ func New(config *config.Config, auth *config.Auth, logger *zap.Logger) (*WebServ b := balancer.NewBalancer() for _, n := range config.Nodes { - node, err := upstream2.NewNode(n) + node, err := upstream.NewNode(n) if err != nil { logger.Error("error creating node", zap.Any("node", node), zap.Error(err)) continue @@ -62,8 +65,10 @@ func New(config *config.Config, auth *config.Auth, logger *zap.Logger) (*WebServ auth: auth, server: server, router: r, - upstream: &upstream2.Upstream{Balancer: b}, + upstream: &upstream.Upstream{Balancer: b}, + metrics: prometheus.NewMetrics(), } + prometheus2.MustRegister(ws.metrics.NodeRequests) ws.router.NotFound = ws.NotFound //web service routers @@ -106,7 +111,7 @@ func (s *WebServer) StartHealthChecker() { <-time.After(time.Second * 10) //todo: move this to config for _, n := range s.upstream.Balancer.UpstreamPool { if !n.IsHealthy() { //do check only if it is not healthy - n.(*upstream2.Node).HealthCheck() + n.(*upstream.Node).HealthCheck() s.logger.Info("node is back", zap.String("node-id", n.NodeID())) } } From 25c09afb4e887e9853f1b45e3ce63643710b380d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sun, 26 Feb 2023 22:20:36 +0300 Subject: [PATCH 08/13] remove building from check --- Makefile | 1 - internal/prometheus/metrics.go | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e5f0edc..848172d 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,6 @@ test: .PHONY: check check: go mod verify - go build -v ./... go vet ./... staticcheck ./... golint ./... diff --git a/internal/prometheus/metrics.go b/internal/prometheus/metrics.go index d07c61d..9502271 100644 --- a/internal/prometheus/metrics.go +++ b/internal/prometheus/metrics.go @@ -2,10 +2,12 @@ package prometheus import "github.com/prometheus/client_golang/prometheus" +// Metrics all prometheus metrics type Metrics struct { NodeRequests prometheus.Histogram } +// NewMetrics Creates new metrics holder func NewMetrics() *Metrics { return &Metrics{ NodeRequests: prometheus.NewHistogram( From 8a1885739d601448dc5f7cc1d9f2049bd76c239b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Tue, 28 Feb 2023 22:25:48 +0300 Subject: [PATCH 09/13] rename metrics --- internal/prometheus/metrics.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/prometheus/metrics.go b/internal/prometheus/metrics.go index 9502271..22e4d84 100644 --- a/internal/prometheus/metrics.go +++ b/internal/prometheus/metrics.go @@ -13,8 +13,8 @@ func NewMetrics() *Metrics { NodeRequests: prometheus.NewHistogram( prometheus.HistogramOpts{ Namespace: "provider", - Name: "node_histogram", - Help: "Node latency", + Name: "request_duration_seconds", + Help: "Node request duration", }), } } From b4a2def80c5902fdaab8fa90dcbb22f4e95fb425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Thu, 2 Mar 2023 17:39:40 +0300 Subject: [PATCH 10/13] tidy up docker --- Dockerfile | 29 +++++------------------- cmd/rpc-aggregator/main.go | 8 ++++--- docker-compose.yml | 34 ++++++++++++---------------- monitoring/prometheus/prometheus.yml | 2 +- 4 files changed, 27 insertions(+), 46 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0642693..5d53e1b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,33 +2,16 @@ FROM golang:latest as builder # Set the working directory WORKDIR /app - -# Copy the go.mod and go.sum files COPY go.mod go.sum ./ - -# Download the dependencies RUN go mod download - -# Copy the source code COPY . . +RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o /app/rpc-aggregator ./cmd/rpc-aggregator/main.go -# Build the binary -RUN go build -o rpc-aggregator cmd/rpc-aggregator/main.go - -# Use a lightweight image as the final image FROM alpine:latest - -# Set the working directory WORKDIR /app - -# Copy the binary from the builder image -COPY --from=builder /app/rpc-aggregator . - -# Copy the config.yaml file -COPY config.yaml . - -# Expose the port the server will listen on +COPY --from=builder /app/rpc-aggregator /usr/local/bin/rpc-aggregator +COPY ./_private/solana.yaml /app/config.yaml +COPY ./_private/auth.yaml /app/auth.yaml EXPOSE 8080 - -# Start the rpc-aggregator server -CMD ["./rpc-aggregator"] +#CMD ["/bin/sh"] +CMD ["/usr/local/bin/rpc-aggregator","--config","/app/config.yaml","--auth","/app/auth.yaml"] diff --git a/cmd/rpc-aggregator/main.go b/cmd/rpc-aggregator/main.go index 8a5aa91..6b07de0 100644 --- a/cmd/rpc-aggregator/main.go +++ b/cmd/rpc-aggregator/main.go @@ -42,6 +42,7 @@ func main() { server, err := webserver.New(conf, auth, logger) if err != nil { logger.Panic("failed to start webserver", zap.Error(err)) + return } logger.Info("Starting RPC Aggregator...") @@ -49,14 +50,15 @@ func main() { go func() { er := server.Run() if er != nil { - panic(er) + logger.Panic("failed to start server", zap.Error(er)) } }() go func() { - promErr := http.ListenAndServe(":9090", promhttp.Handler()) + //move the port to the config + promErr := http.ListenAndServe(":9000", promhttp.Handler()) if promErr != nil { - panic(promErr) + logger.Panic("failed to start prim server", zap.Error(promErr)) } }() diff --git a/docker-compose.yml b/docker-compose.yml index 30a87de..25b06f9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,20 @@ volumes: grafana_data: {} services: + aggregator: + container_name: aggregator + build: + context: . + dockerfile: Dockerfile + image: rpc-aggregator:latest + ports: + - 8080:8080 # proxy + - 9000:9000 # exporter + command: | + /usr/local/bin/rpc-aggregator --config /app/config.yaml --auth /app/auth.yaml + prometheus: + container_name: prometheus image: prom/prometheus restart: always volumes: @@ -20,25 +33,8 @@ services: - 9090:9090 links: - alertmanager:alertmanager - - node-exporter: - image: prom/node-exporter - volumes: - - /proc:/host/proc:ro - - /sys:/host/sys:ro - - /:/rootfs:ro - command: - - '--path.procfs=/host/proc' - - '--path.sysfs=/host/sys' - - --collector.filesystem.ignored-mount-points - - '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)' - ports: - - 9100:9100 - restart: always - deploy: - mode: global - alertmanager: + container_name: alertmanager image: prom/alertmanager restart: always ports: @@ -48,8 +44,8 @@ services: command: - '--config.file=/etc/alertmanager/config.yml' - '--storage.path=/alertmanager' - grafana: + container_name: grafana image: grafana/grafana user: '472' restart: always diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml index 8051d61..cec7f91 100644 --- a/monitoring/prometheus/prometheus.yml +++ b/monitoring/prometheus/prometheus.yml @@ -17,4 +17,4 @@ scrape_configs: metrics_path: /metrics scheme: http static_configs: - - targets: ['localhost:9090'] \ No newline at end of file + - targets: ['aggregator:9000'] \ No newline at end of file From 59ff1f8986305fc4de2ac06322d26df45f0a2fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sun, 5 Mar 2023 12:14:44 +0300 Subject: [PATCH 11/13] convert to histogram vec --- internal/prometheus/metrics.go | 6 +++--- internal/webserver/proxy.go | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/internal/prometheus/metrics.go b/internal/prometheus/metrics.go index 22e4d84..427f13f 100644 --- a/internal/prometheus/metrics.go +++ b/internal/prometheus/metrics.go @@ -4,17 +4,17 @@ import "github.com/prometheus/client_golang/prometheus" // Metrics all prometheus metrics type Metrics struct { - NodeRequests prometheus.Histogram + NodeRequests *prometheus.HistogramVec } // NewMetrics Creates new metrics holder func NewMetrics() *Metrics { return &Metrics{ - NodeRequests: prometheus.NewHistogram( + NodeRequests: prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: "provider", Name: "request_duration_seconds", Help: "Node request duration", - }), + }, []string{"chain", "provider", "node_id"}), } } diff --git a/internal/webserver/proxy.go b/internal/webserver/proxy.go index 0331440..f51ecf2 100644 --- a/internal/webserver/proxy.go +++ b/internal/webserver/proxy.go @@ -4,6 +4,7 @@ import ( "errors" "net/http" + "github.com/prometheus/client_golang/prometheus" "github.com/rpc-ag/rpc-aggregator/internal/config" "github.com/rpc-ag/rpc-aggregator/internal/upstream" "github.com/valyala/fasthttp" @@ -65,7 +66,11 @@ func (s *WebServer) Proxy(ctx *fasthttp.RequestCtx) { return } - s.metrics.NodeRequests.Observe(took.Seconds()) + s.metrics.NodeRequests.With(prometheus.Labels{ + "chain": node.Chain, + "provider": node.Provider, + "node_id": node.NodeID(), + }).Observe(took.Seconds()) //s.logger.Debug("upstream request done", zap.Duration("took", took), zap.String("provider", node.Provider), zap.String("node", node.NodeID())) } From cf3c9f947b6f8c55dc39256ca534ec9a5afbc247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Sun, 5 Mar 2023 23:17:50 +0300 Subject: [PATCH 12/13] tidy up --- internal/upstream/node.go | 10 ++++++++++ internal/webserver/proxy.go | 8 +------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/internal/upstream/node.go b/internal/upstream/node.go index bdadac1..8ab961f 100644 --- a/internal/upstream/node.go +++ b/internal/upstream/node.go @@ -4,6 +4,7 @@ import ( "sync/atomic" "time" + "github.com/prometheus/client_golang/prometheus" "github.com/rpc-ag/rpc-aggregator/internal/config" "github.com/tufanbarisyildirim/balancer" "github.com/valyala/fasthttp" @@ -111,3 +112,12 @@ func (n *Node) HealthCheck() { //todo: do health check here, set SetHealthy(true) if pass n.SetHealthy(true) } + +// ToPromLabels return prometheus labels for the node +func (n *Node) ToPromLabels() prometheus.Labels { + return prometheus.Labels{ + "chain": n.Chain, + "provider": n.Provider, + "node_id": n.NodeID(), + } +} diff --git a/internal/webserver/proxy.go b/internal/webserver/proxy.go index f51ecf2..35f6d3a 100644 --- a/internal/webserver/proxy.go +++ b/internal/webserver/proxy.go @@ -4,7 +4,6 @@ import ( "errors" "net/http" - "github.com/prometheus/client_golang/prometheus" "github.com/rpc-ag/rpc-aggregator/internal/config" "github.com/rpc-ag/rpc-aggregator/internal/upstream" "github.com/valyala/fasthttp" @@ -66,12 +65,7 @@ func (s *WebServer) Proxy(ctx *fasthttp.RequestCtx) { return } - s.metrics.NodeRequests.With(prometheus.Labels{ - "chain": node.Chain, - "provider": node.Provider, - "node_id": node.NodeID(), - }).Observe(took.Seconds()) - //s.logger.Debug("upstream request done", zap.Duration("took", took), zap.String("provider", node.Provider), zap.String("node", node.NodeID())) + s.metrics.NodeRequests.With(node.ToPromLabels()).Observe(took.Seconds()) } // Auth check authentication first From fe1c91ac1b27c2250f3fc012605cfce0103da2b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tufan=20Bar=C4=B1=C5=9F=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Mon, 13 Mar 2023 10:40:58 +0300 Subject: [PATCH 13/13] minor update --- README.md | 2 +- internal/webserver/proxy.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e4bf384..f277e43 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ if you are curious about details ### Phase 0: Release v0 ⌛️ -- [ ] Distribute api keys for every project attends to [grizzlython](https://solana.com/grizzlython) with ability of; +- [x] Distribute api keys for every project attends to [grizzlython](https://solana.com/grizzlython) with ability of; - [x] Api key auth & CORS - [x] Rate limiting diff --git a/internal/webserver/proxy.go b/internal/webserver/proxy.go index 35f6d3a..81437a6 100644 --- a/internal/webserver/proxy.go +++ b/internal/webserver/proxy.go @@ -16,7 +16,7 @@ func (s *WebServer) Proxy(ctx *fasthttp.RequestCtx) { next := s.upstream.Balancer.Next("a") if next == nil { ctx.SetStatusCode(fasthttp.StatusBadGateway) - s.logger.Error("no health node") + s.logger.Error("no healthy node") return } node, ok := next.(*upstream.Node)