aboutsummaryrefslogtreecommitdiffstats
path: root/http/http.go
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-01-11 23:31:16 +0100
committerMartin Polden <mpolden@mpolden.no>2020-01-11 23:37:01 +0100
commit6e9697ef071fceeae3fc9d1fe024034717fd47a2 (patch)
treea03c712b14eafbb13229805deb298d5ca586c86b /http/http.go
parent0281da919acf94402047fd2e185a82b52fad1c23 (diff)
Implement basic metrics
Diffstat (limited to 'http/http.go')
-rw-r--r--http/http.go56
1 files changed, 49 insertions, 7 deletions
diff --git a/http/http.go b/http/http.go
index 053435f..3bf047c 100644
--- a/http/http.go
+++ b/http/http.go
@@ -33,12 +33,35 @@ type entry struct {
Rcode string `json:"rcode,omitempty"`
}
+type summary struct {
+ Since string `json:"since"`
+ Total int64 `json:"total"`
+ Hijacked int64 `json:"hijacked"`
+}
+
+type request struct {
+ Time string `json:"time"`
+ Count int64 `json:"count"`
+}
+
+type logStats struct {
+ Summary summary `json:"summary"`
+ Requests []request `json:"requests"`
+}
+
type httpError struct {
err error
Status int `json:"status"`
Message string `json:"message"`
}
+func newHTTPError(err error) *httpError {
+ return &httpError{
+ err: err,
+ Status: http.StatusInternalServerError,
+ }
+}
+
// NewServer creates a new HTTP server, serving logs from the given logger and listening on addr.
func NewServer(cache *cache.Cache, logger *sql.Logger, addr string) *Server {
server := &http.Server{Addr: addr}
@@ -55,6 +78,7 @@ func (s *Server) handler() http.Handler {
r := newRouter()
r.route(http.MethodGet, "/cache/v1/", s.cacheHandler)
r.route(http.MethodGet, "/log/v1/", s.logHandler)
+ r.route(http.MethodGet, "/metric/v1/", s.metricHandler)
r.route(http.MethodDelete, "/cache/v1/", s.cacheResetHandler)
return r.handler()
}
@@ -89,18 +113,13 @@ func (s *Server) cacheResetHandler(w http.ResponseWriter, r *http.Request) (inte
s.cache.Reset()
return struct {
Message string `json:"message"`
- }{
- "Cleared cache",
- }, nil
+ }{"Cleared cache."}, nil
}
func (s *Server) logHandler(w http.ResponseWriter, r *http.Request) (interface{}, *httpError) {
logEntries, err := s.logger.Read(listCountFrom(r))
if err != nil {
- return nil, &httpError{
- err: err,
- Status: http.StatusInternalServerError,
- }
+ return nil, newHTTPError(err)
}
entries := make([]entry, 0, len(logEntries))
for _, le := range logEntries {
@@ -117,6 +136,29 @@ func (s *Server) logHandler(w http.ResponseWriter, r *http.Request) (interface{}
return entries, nil
}
+func (s *Server) metricHandler(w http.ResponseWriter, r *http.Request) (interface{}, *httpError) {
+ stats, err := s.logger.Stats()
+ if err != nil {
+ return nil, newHTTPError(err)
+ }
+ requests := make([]request, 0, len(stats.Events))
+ for _, e := range stats.Events {
+ requests = append(requests, request{
+ Time: e.Time.Format(time.RFC3339),
+ Count: e.Count,
+ })
+ }
+ logStats := logStats{
+ Summary: summary{
+ Since: stats.Since.Format(time.RFC3339),
+ Total: stats.Total,
+ Hijacked: stats.Hijacked,
+ },
+ Requests: requests,
+ }
+ return logStats, nil
+}
+
// Close shuts down the HTTP server.
func (s *Server) Close() error { return s.server.Shutdown(context.TODO()) }