mirror of https://github.com/chubin/wttr.in
parent
8fd712f790
commit
ec264850a4
@ -1,40 +1,85 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
// import (
|
import (
|
||||||
// "log"
|
"bytes"
|
||||||
// "sync"
|
"fmt"
|
||||||
// "time"
|
"net/http"
|
||||||
// )
|
"sync"
|
||||||
//
|
"time"
|
||||||
// type safeCounter struct {
|
)
|
||||||
// v map[int]int
|
|
||||||
// mux sync.Mutex
|
// Stats holds processed requests statistics.
|
||||||
// }
|
type Stats struct {
|
||||||
//
|
m sync.Mutex
|
||||||
// func (c *safeCounter) inc(key int) {
|
v map[string]int
|
||||||
// c.mux.Lock()
|
startTime time.Time
|
||||||
// c.v[key]++
|
}
|
||||||
// c.mux.Unlock()
|
|
||||||
// }
|
// NewStats returns new Stats.
|
||||||
//
|
func NewStats() *Stats {
|
||||||
// // func (c *safeCounter) val(key int) int {
|
return &Stats{
|
||||||
// // c.mux.Lock()
|
v: map[string]int{},
|
||||||
// // defer c.mux.Unlock()
|
startTime: time.Now(),
|
||||||
// // return c.v[key]
|
}
|
||||||
// // }
|
}
|
||||||
// //
|
|
||||||
// // func (c *safeCounter) reset(key int) int {
|
// Inc key by one.
|
||||||
// // c.mux.Lock()
|
func (c *Stats) Inc(key string) {
|
||||||
// // defer c.mux.Unlock()
|
c.m.Lock()
|
||||||
// // result := c.v[key]
|
c.v[key]++
|
||||||
// // c.v[key] = 0
|
c.m.Unlock()
|
||||||
// // return result
|
}
|
||||||
// // }
|
|
||||||
//
|
// Get current key counter value.
|
||||||
// var queriesPerMinute safeCounter
|
func (c *Stats) Get(key string) int {
|
||||||
//
|
c.m.Lock()
|
||||||
// func printStat() {
|
defer c.m.Unlock()
|
||||||
// _, min, _ := time.Now().Clock()
|
return c.v[key]
|
||||||
// queriesPerMinute.inc(min)
|
}
|
||||||
// log.Printf("Processed %d requests\n", min)
|
|
||||||
// }
|
// Reset key counter.
|
||||||
|
func (c *Stats) Reset(key string) int {
|
||||||
|
c.m.Lock()
|
||||||
|
defer c.m.Unlock()
|
||||||
|
result := c.v[key]
|
||||||
|
c.v[key] = 0
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show returns current statistics formatted as []byte.
|
||||||
|
func (c *Stats) Show() []byte {
|
||||||
|
var (
|
||||||
|
b bytes.Buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
c.m.Lock()
|
||||||
|
defer c.m.Unlock()
|
||||||
|
|
||||||
|
uptime := time.Since(c.startTime) / time.Second
|
||||||
|
|
||||||
|
fmt.Fprintf(&b, "%-20s: %v\n", "Running since", c.startTime.Format(time.RFC3339))
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Uptime (min)", uptime/60)
|
||||||
|
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Total queries", c.v["total"])
|
||||||
|
if uptime != 0 {
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Throughput (QpM)", c.v["total"]*60/int(uptime))
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Cache L1 queries", c.v["cache1"])
|
||||||
|
if c.v["total"] != 0 {
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Cache L1 queries (%)", (100*c.v["cache1"])/c.v["total"])
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Upstream queries", c.v["total"]-c.v["cache1"])
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Queries with format", c.v["format"])
|
||||||
|
fmt.Fprintf(&b, "%-20s: %d\n", "Queries with format=j1", c.v["format=j1"])
|
||||||
|
|
||||||
|
return b.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Stats) Response(*http.Request) *ResponseWithHeader {
|
||||||
|
return &ResponseWithHeader{
|
||||||
|
Body: c.Show(),
|
||||||
|
StatusCode: 200,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in new issue