Created
October 24, 2019 19:58
-
-
Save chris001177/5b72f89003b2d159f48e158635114bca to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"net/http" | |
"strconv" | |
"sync" | |
"time" | |
"github.com/labstack/echo" | |
) | |
type ( | |
Stats struct { | |
Uptime time.Time `json:"uptime"` | |
RequestCount uint64 `json:"requestCount"` | |
Statuses map[string]int `json:"statuses"` | |
mutex sync.RWMutex | |
} | |
) | |
func NewStats() *Stats { | |
return &Stats{ | |
Uptime: time.Now(), | |
Statuses: map[string]int{}, | |
} | |
} | |
// Process is the middleware function. | |
func (s *Stats) Process(next echo.HandlerFunc) echo.HandlerFunc { | |
return func(c echo.Context) error { | |
if err := next(c); err != nil { | |
c.Error(err) | |
} | |
s.mutex.Lock() | |
defer s.mutex.Unlock() | |
s.RequestCount++ | |
status := strconv.Itoa(c.Response().Status) | |
s.Statuses[status]++ | |
return nil | |
} | |
} | |
// Handle is the endpoint to get stats. | |
func (s *Stats) Handle(c echo.Context) error { | |
s.mutex.RLock() | |
defer s.mutex.RUnlock() | |
return c.JSON(http.StatusOK, s) | |
} | |
// ServerHeader middleware adds a `Server` header to the response. | |
func ServerHeader(next echo.HandlerFunc) echo.HandlerFunc { | |
return func(c echo.Context) error { | |
c.Response().Header().Set(echo.HeaderServer, "Echo/3.0") | |
return next(c) | |
} | |
} | |
func main() { | |
e := echo.New() | |
// Debug mode | |
e.Debug = true | |
//------------------- | |
// Custom middleware | |
//------------------- | |
// Stats | |
s := NewStats() | |
e.Use(s.Process) | |
e.GET("/stats", s.Handle) // Endpoint to get stats | |
// Server header | |
e.Use(ServerHeader) | |
// Handler | |
e.GET("/", func(c echo.Context) error { | |
return c.String(http.StatusOK, "Hello, World!") | |
}) | |
// Start server | |
e.Logger.Fatal(e.Start(":1323")) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment