Add end-to-end benchmaking
This commit is contained in:
parent
cd6d6f97a8
commit
4c07ad1102
|
@ -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
|
||||||
|
|
|
@ -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 } } } "}]]
|
|
@ -1,7 +1,9 @@
|
||||||
app_name: "Super Graph Development"
|
app_name: "Super Graph Development"
|
||||||
host_port: 0.0.0.0:8080
|
host_port: 0.0.0.0:8080
|
||||||
web_ui: true
|
web_ui: true
|
||||||
debug_level: 1
|
|
||||||
|
# debug, info, warn, error, fatal, panic
|
||||||
|
log_level: "debug"
|
||||||
|
|
||||||
# enabling tracing also disables query caching
|
# enabling tracing also disables query caching
|
||||||
enable_tracing: true
|
enable_tracing: true
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
app_name: "Super Graph Production"
|
app_name: "Super Graph Production"
|
||||||
host_port: 0.0.0.0:8080
|
host_port: 0.0.0.0:8080
|
||||||
web_ui: false
|
web_ui: false
|
||||||
debug_level: 0
|
|
||||||
|
# debug, info, warn, error, fatal, panic, disable
|
||||||
|
log_level: "info"
|
||||||
|
|
||||||
# disabled tracing enables query caching
|
# disabled tracing enables query caching
|
||||||
enable_tracing: false
|
enable_tracing: false
|
||||||
|
|
2
demo
2
demo
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/sh
|
||||||
|
|
||||||
if [ "$1" == "setup" ]; then
|
if [ "$1" == "setup" ]; then
|
||||||
echo "Downloading pre-built docker images"
|
echo "Downloading pre-built docker images"
|
||||||
|
|
|
@ -11,7 +11,7 @@ type config struct {
|
||||||
Env string
|
Env string
|
||||||
HostPort string `mapstructure:"host_port"`
|
HostPort string `mapstructure:"host_port"`
|
||||||
WebUI bool `mapstructure:"web_ui"`
|
WebUI bool `mapstructure:"web_ui"`
|
||||||
DebugLevel int `mapstructure:"debug_level"`
|
LogLevel string `mapstructure:"log_level"`
|
||||||
EnableTracing bool `mapstructure:"enable_tracing"`
|
EnableTracing bool `mapstructure:"enable_tracing"`
|
||||||
AuthFailBlock string `mapstructure:"auth_fail_block"`
|
AuthFailBlock string `mapstructure:"auth_fail_block"`
|
||||||
Inflections map[string]string
|
Inflections map[string]string
|
||||||
|
|
|
@ -283,7 +283,7 @@ func (c *coreContext) resolveSQL(qc *qcode.QCode, vars variables) (
|
||||||
|
|
||||||
finalSQL := stmt.String()
|
finalSQL := stmt.String()
|
||||||
|
|
||||||
if conf.DebugLevel > 0 {
|
if conf.LogLevel == "debug" {
|
||||||
os.Stdout.WriteString(finalSQL)
|
os.Stdout.WriteString(finalSQL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
21
serv/http.go
21
serv/http.go
|
@ -10,7 +10,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/rs/zerolog/log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -69,18 +68,25 @@ func apiv1Http(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := &coreContext{Context: r.Context()}
|
ctx := &coreContext{Context: r.Context()}
|
||||||
|
|
||||||
if authFailBlock == authFailBlockAlways && authCheck(ctx) == false {
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
b, err := ioutil.ReadAll(io.LimitReader(r.Body, maxReadBytes))
|
b, err := ioutil.ReadAll(io.LimitReader(r.Body, maxReadBytes))
|
||||||
defer r.Body.Close()
|
defer r.Body.Close()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logger.Err(err).Msg("failed to read request body")
|
||||||
errorResp(w, err)
|
errorResp(w, err)
|
||||||
return
|
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)
|
errorResp(w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -128,19 +134,18 @@ func apiv1Http(w http.ResponseWriter, r *http.Request) {
|
||||||
err = ctx.handleReq(w, r)
|
err = ctx.handleReq(w, r)
|
||||||
|
|
||||||
if err == errUnauthorized {
|
if err == errUnauthorized {
|
||||||
http.Error(w, "Not authorized", 401)
|
err := "Not authorized"
|
||||||
|
logger.Debug().Msg(err)
|
||||||
|
http.Error(w, err, 401)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logger.Err(err).Msg("Failed to handle request")
|
||||||
errorResp(w, err)
|
errorResp(w, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func errorResp(w http.ResponseWriter, err error) {
|
func errorResp(w http.ResponseWriter, err error) {
|
||||||
if conf.DebugLevel > 0 {
|
|
||||||
log.Error().Err(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
json.NewEncoder(w).Encode(gqlResp{Error: err.Error()})
|
json.NewEncoder(w).Encode(gqlResp{Error: err.Error()})
|
||||||
}
|
}
|
||||||
|
|
12
serv/serv.go
12
serv/serv.go
|
@ -40,7 +40,10 @@ var (
|
||||||
|
|
||||||
func initLog() *zerolog.Logger {
|
func initLog() *zerolog.Logger {
|
||||||
logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).
|
logger := zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).
|
||||||
With().Caller().Logger()
|
With().
|
||||||
|
Timestamp().
|
||||||
|
Caller().
|
||||||
|
Logger()
|
||||||
|
|
||||||
return &logger
|
return &logger
|
||||||
/*
|
/*
|
||||||
|
@ -69,7 +72,6 @@ func initConf() (*config, error) {
|
||||||
|
|
||||||
vi.SetDefault("host_port", "0.0.0.0:8080")
|
vi.SetDefault("host_port", "0.0.0.0:8080")
|
||||||
vi.SetDefault("web_ui", false)
|
vi.SetDefault("web_ui", false)
|
||||||
vi.SetDefault("debug_level", 0)
|
|
||||||
vi.SetDefault("enable_tracing", false)
|
vi.SetDefault("enable_tracing", false)
|
||||||
vi.SetDefault("auth_fail_block", "always")
|
vi.SetDefault("auth_fail_block", "always")
|
||||||
|
|
||||||
|
@ -184,6 +186,12 @@ func Init() {
|
||||||
logger.Fatal().Err(err).Msg("failed to read config")
|
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)
|
db, err = initDB(conf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Fatal().Err(err).Msg("failed to connect to database")
|
logger.Fatal().Err(err).Msg("failed to connect to database")
|
||||||
|
|
Loading…
Reference in New Issue