فهرست منبع

Filtered logging and url query helper

Torkel Ödegaard 11 سال پیش
والد
کامیت
5d120de70e
6فایلهای تغییر یافته به همراه113 افزوده شده و 8 حذف شده
  1. 1 1
      grafana
  2. 2 2
      pkg/api/api.go
  3. 79 0
      pkg/api/api_logger.go
  4. 5 3
      pkg/api/api_render.go
  5. 24 0
      pkg/utils/url.go
  6. 2 2
      start_dependencies.sh

+ 1 - 1
grafana

@@ -1 +1 @@
-Subproject commit 1e81f8ecfc737674705fac7e0d85dc2206519b38
+Subproject commit eb28e63c08a43ada747fbcdae9612301c9c7a531

+ 2 - 2
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")

+ 79 - 0
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(),
+		)
+	}
+}

+ 5 - 3
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

+ 24 - 0
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]
+}

+ 2 - 2
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 \