mirror of
https://github.com/labstack/echo.git
synced 2024-12-22 20:06:21 +02:00
f4b0004d2b
Signed-off-by: Vishal Rana <vr@labstack.com>
84 lines
1.6 KiB
Go
84 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/labstack/echo"
|
|
"github.com/labstack/echo/engine/standard"
|
|
)
|
|
|
|
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: make(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/2.0")
|
|
return next(c)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
e := echo.New()
|
|
|
|
// Debug mode
|
|
e.SetDebug(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.Run(standard.New(":1323"))
|
|
}
|