diff --git a/grafana b/grafana index 1e81f8ecfc7..eb28e63c08a 160000 --- a/grafana +++ b/grafana @@ -1 +1 @@ -Subproject commit 1e81f8ecfc737674705fac7e0d85dc2206519b38 +Subproject commit eb28e63c08a43ada747fbcdae9612301c9c7a531 diff --git a/pkg/api/api.go b/pkg/api/api.go index 9dd1b0bfbba..cbe06fdb071 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -37,8 +37,8 @@ func (self *HttpServer) ListenAndServe() { log.Info("Starting Http Listener on port %v", self.port) defer func() { self.shutdown <- true }() - self.router = gin.Default() - self.router.Use(CacheHeadersMiddleware()) + self.router = gin.New() + self.router.Use(gin.Recovery(), apiLogger(), CacheHeadersMiddleware()) self.router.Static("/public", "./public") self.router.Static("/app", "./public/app") diff --git a/pkg/api/api_logger.go b/pkg/api/api_logger.go new file mode 100644 index 00000000000..8c9a7251774 --- /dev/null +++ b/pkg/api/api_logger.go @@ -0,0 +1,79 @@ +package api + +import ( + "log" + "os" + "strings" + "time" + + "github.com/gin-gonic/gin" +) + +var ( + green = string([]byte{27, 91, 57, 55, 59, 52, 50, 109}) + white = string([]byte{27, 91, 57, 48, 59, 52, 55, 109}) + yellow = string([]byte{27, 91, 57, 55, 59, 52, 51, 109}) + red = string([]byte{27, 91, 57, 55, 59, 52, 49, 109}) + reset = string([]byte{27, 91, 48, 109}) +) + +func ignoreLoggingRequest(code int, contentType string) bool { + return code == 304 || + strings.HasPrefix(contentType, "application/javascript") || + strings.HasPrefix(contentType, "text/") || + strings.HasPrefix(contentType, "application/x-font-woff") +} + +func apiLogger() gin.HandlerFunc { + stdlogger := log.New(os.Stdout, "", 0) + + return func(c *gin.Context) { + // Start timer + start := time.Now() + + // Process request + c.Next() + + code := c.Writer.Status() + contentType := c.Writer.Header().Get("Content-Type") + + // ignore logging some requests + if ignoreLoggingRequest(code, contentType) { + return + } + + // save the IP of the requester + requester := c.Request.Header.Get("X-Real-IP") + // if the requester-header is empty, check the forwarded-header + if len(requester) == 0 { + requester = c.Request.Header.Get("X-Forwarded-For") + } + // if the requester is still empty, use the hard-coded address from the socket + if len(requester) == 0 { + requester = c.Request.RemoteAddr + } + + var color string + switch { + case code >= 200 && code <= 299: + color = green + case code >= 300 && code <= 399: + color = white + case code >= 400 && code <= 499: + color = yellow + default: + color = red + } + + end := time.Now() + latency := end.Sub(start) + stdlogger.Printf("[GIN] %v |%s %3d %s| %12v | %s %4s %s\n%s", + end.Format("2006/01/02 - 15:04:05"), + color, code, reset, + latency, + requester, + c.Request.Method, c.Request.URL.Path, + c.Errors.String(), + ) + } +} diff --git a/pkg/api/api_render.go b/pkg/api/api_render.go index ebe99d60921..21d38a2bf97 100644 --- a/pkg/api/api_render.go +++ b/pkg/api/api_render.go @@ -5,6 +5,7 @@ import ( "github.com/gin-gonic/gin" "github.com/torkelo/grafana-pro/pkg/components" + "github.com/torkelo/grafana-pro/pkg/utils" ) func init() { @@ -15,12 +16,13 @@ func init() { func (self *HttpServer) renderToPng(c *gin.Context, auth *authContext) { accountId := auth.getAccountId() - query := c.Request.URL.Query() + queryReader := utils.NewUrlQueryReader(c.Request.URL) queryParams := "?render&accountId=" + strconv.Itoa(accountId) + "&" + c.Request.URL.RawQuery + renderOpts := &components.RenderOpts{ Url: c.Params.ByName("url") + queryParams, - Width: query["width"][0], - Height: query["height"][0], + Width: queryReader.Get("width", "800"), + Height: queryReader.Get("height", "400"), } renderOpts.Url = "http://localhost:3000" + renderOpts.Url diff --git a/pkg/utils/url.go b/pkg/utils/url.go new file mode 100644 index 00000000000..78ff1cac60f --- /dev/null +++ b/pkg/utils/url.go @@ -0,0 +1,24 @@ +package utils + +import ( + "net/url" +) + +type UrlQueryReader struct { + values url.Values +} + +func NewUrlQueryReader(url *url.URL) *UrlQueryReader { + return &UrlQueryReader{ + values: url.Query(), + } +} + +func (r *UrlQueryReader) Get(name string, def string) string { + val := r.values[name] + if len(val) == 0 { + return def + } + + return val[0] +} diff --git a/start_dependencies.sh b/start_dependencies.sh index a8ecfd53c4c..e1117ab6977 100755 --- a/start_dependencies.sh +++ b/start_dependencies.sh @@ -1,5 +1,5 @@ -docker kill gfdev -docker rm gfdev +docker kill rethinkdb +docker rm rethinkdb docker run -d -p 8180:8080 -p 28015:28015 -p 29015:29015 \ --name rethinkdb \