From 4c07ad11023a5c96888f87dbc5a465ef5806cd8b Mon Sep 17 00:00:00 2001 From: Vikram Rangnekar Date: Mon, 17 Jun 2019 01:58:00 -0400 Subject: [PATCH] Add end-to-end benchmaking --- bench/bench.sh | 8 ++++++++ bench/query.lua | 3 +++ config/dev.yml | 4 +++- config/prod.yml | 4 +++- demo | 2 +- serv/config.go | 2 +- serv/core.go | 2 +- serv/http.go | 21 +++++++++++++-------- serv/serv.go | 12 ++++++++++-- 9 files changed, 43 insertions(+), 15 deletions(-) create mode 100755 bench/bench.sh create mode 100644 bench/query.lua diff --git a/bench/bench.sh b/bench/bench.sh new file mode 100755 index 0000000..5ed9094 --- /dev/null +++ b/bench/bench.sh @@ -0,0 +1,8 @@ +#!/bin/sh +if brew ls --versions wrk > /dev/null; then + wrk -t12 -c400 -d30s --timeout 10s --script=query.lua --latency http://localhost:8080/api/v1/graphql +else + brew install wek + wrk -t12 -c400 -d30s --timeout 10s --script=query.lua --latency http://localhost:8080/api/v1/graphql +fi + diff --git a/bench/query.lua b/bench/query.lua new file mode 100644 index 0000000..60aea9f --- /dev/null +++ b/bench/query.lua @@ -0,0 +1,3 @@ +wrk.method = "POST" +wrk.headers["Content-Type"] = "application/json" +wrk.body = [[{"query":" { products( limit: 30, order_by: { price: desc }, distinct: [ price ] where: { id: { and: { greater_or_equals: 20, lt: 28 } } }) { id name price user { id email } } } "}]] diff --git a/config/dev.yml b/config/dev.yml index e5e464c..a35d1f4 100644 --- a/config/dev.yml +++ b/config/dev.yml @@ -1,7 +1,9 @@ app_name: "Super Graph Development" host_port: 0.0.0.0:8080 web_ui: true -debug_level: 1 + +# debug, info, warn, error, fatal, panic +log_level: "debug" # enabling tracing also disables query caching enable_tracing: true diff --git a/config/prod.yml b/config/prod.yml index 1ddcb9e..41e278d 100644 --- a/config/prod.yml +++ b/config/prod.yml @@ -1,7 +1,9 @@ app_name: "Super Graph Production" host_port: 0.0.0.0:8080 web_ui: false -debug_level: 0 + +# debug, info, warn, error, fatal, panic, disable +log_level: "info" # disabled tracing enables query caching enable_tracing: false diff --git a/demo b/demo index 0a386bc..422af8f 100755 --- a/demo +++ b/demo @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh if [ "$1" == "setup" ]; then echo "Downloading pre-built docker images" diff --git a/serv/config.go b/serv/config.go index 198690c..83931be 100644 --- a/serv/config.go +++ b/serv/config.go @@ -11,7 +11,7 @@ type config struct { Env string HostPort string `mapstructure:"host_port"` WebUI bool `mapstructure:"web_ui"` - DebugLevel int `mapstructure:"debug_level"` + LogLevel string `mapstructure:"log_level"` EnableTracing bool `mapstructure:"enable_tracing"` AuthFailBlock string `mapstructure:"auth_fail_block"` Inflections map[string]string diff --git a/serv/core.go b/serv/core.go index 458097a..8b1d523 100644 --- a/serv/core.go +++ b/serv/core.go @@ -283,7 +283,7 @@ func (c *coreContext) resolveSQL(qc *qcode.QCode, vars variables) ( finalSQL := stmt.String() - if conf.DebugLevel > 0 { + if conf.LogLevel == "debug" { os.Stdout.WriteString(finalSQL) } diff --git a/serv/http.go b/serv/http.go index aa1e36d..27af8cc 100644 --- a/serv/http.go +++ b/serv/http.go @@ -10,7 +10,6 @@ import ( "time" "github.com/gorilla/websocket" - "github.com/rs/zerolog/log" ) const ( @@ -69,18 +68,25 @@ func apiv1Http(w http.ResponseWriter, r *http.Request) { ctx := &coreContext{Context: r.Context()} if authFailBlock == authFailBlockAlways && authCheck(ctx) == false { - http.Error(w, "Not authorized", 401) + err := "Not authorized" + logger.Debug().Msg(err) + http.Error(w, err, 401) return } b, err := ioutil.ReadAll(io.LimitReader(r.Body, maxReadBytes)) defer r.Body.Close() + if err != nil { + logger.Err(err).Msg("failed to read request body") errorResp(w, err) return } - if err := json.Unmarshal(b, &ctx.req); err != nil { + err = json.Unmarshal(b, &ctx.req) + + if err != nil { + logger.Err(err).Msg("failed to decode json request body") errorResp(w, err) return } @@ -128,19 +134,18 @@ func apiv1Http(w http.ResponseWriter, r *http.Request) { err = ctx.handleReq(w, r) if err == errUnauthorized { - http.Error(w, "Not authorized", 401) + err := "Not authorized" + logger.Debug().Msg(err) + http.Error(w, err, 401) } if err != nil { + logger.Err(err).Msg("Failed to handle request") errorResp(w, err) } } func errorResp(w http.ResponseWriter, err error) { - if conf.DebugLevel > 0 { - log.Error().Err(err) - } - w.WriteHeader(http.StatusBadRequest) json.NewEncoder(w).Encode(gqlResp{Error: err.Error()}) } diff --git a/serv/serv.go b/serv/serv.go index 3ddc8c7..3ce15d0 100644 --- a/serv/serv.go +++ b/serv/serv.go @@ -40,7 +40,10 @@ var ( func initLog() *zerolog.Logger { logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}). - With().Caller().Logger() + With(). + Timestamp(). + Caller(). + Logger() return &logger /* @@ -69,7 +72,6 @@ func initConf() (*config, error) { vi.SetDefault("host_port", "0.0.0.0:8080") vi.SetDefault("web_ui", false) - vi.SetDefault("debug_level", 0) vi.SetDefault("enable_tracing", false) vi.SetDefault("auth_fail_block", "always") @@ -184,6 +186,12 @@ func Init() { logger.Fatal().Err(err).Msg("failed to read config") } + logLevel, err := zerolog.ParseLevel(conf.LogLevel) + if err != nil { + logger.Error().Err(err).Msg("error setting log_level") + } + zerolog.SetGlobalLevel(logLevel) + db, err = initDB(conf) if err != nil { logger.Fatal().Err(err).Msg("failed to connect to database")