Move basic features of stats logger into base structure
This commit is contained in:
parent
98ff2625a4
commit
1cace592e6
49
stats/base.go
Normal file
49
stats/base.go
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/rcrowley/go-metrics"
|
||||||
|
)
|
||||||
|
|
||||||
|
type base struct {
|
||||||
|
sync.Mutex
|
||||||
|
stats map[string]*baseStats
|
||||||
|
}
|
||||||
|
|
||||||
|
type baseStats struct {
|
||||||
|
time metrics.Histogram
|
||||||
|
errors metrics.Counter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *base) Add(name string, dur time.Duration) {
|
||||||
|
b.metrics(name).time.Update(int64(dur))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *base) Error(name string) {
|
||||||
|
b.metrics(name).errors.Inc(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *base) init() {
|
||||||
|
b.stats = make(map[string]*baseStats)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *base) metrics(name string) *baseStats {
|
||||||
|
if _, ok := b.stats[name]; !ok {
|
||||||
|
b.Lock()
|
||||||
|
defer b.Unlock()
|
||||||
|
|
||||||
|
// Double checking being protected by mutex
|
||||||
|
if s, ok := b.stats[name]; ok {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
b.stats[name] = &baseStats{
|
||||||
|
time: metrics.NewHistogram(metrics.NewUniformSample(1000)),
|
||||||
|
errors: metrics.NewCounter(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return b.stats[name]
|
||||||
|
}
|
@ -4,30 +4,22 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/rcrowley/go-metrics"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Logger struct {
|
type Logger struct {
|
||||||
sync.Mutex
|
base
|
||||||
|
|
||||||
out io.Writer
|
out io.Writer
|
||||||
interval time.Duration
|
interval time.Duration
|
||||||
stats map[string]*loggerStats
|
|
||||||
}
|
|
||||||
|
|
||||||
type loggerStats struct {
|
|
||||||
time metrics.Histogram
|
|
||||||
errors metrics.Counter
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLogger(out io.Writer, interval time.Duration) *Logger {
|
func NewLogger(out io.Writer, interval time.Duration) *Logger {
|
||||||
l := &Logger{
|
l := &Logger{
|
||||||
out: out,
|
out: out,
|
||||||
interval: interval,
|
interval: interval,
|
||||||
stats: make(map[string]*loggerStats),
|
|
||||||
}
|
}
|
||||||
|
l.init()
|
||||||
go l.printWithInterval()
|
go l.printWithInterval()
|
||||||
|
|
||||||
return l
|
return l
|
||||||
@ -37,14 +29,6 @@ func NewStdoutLogger(interval time.Duration) *Logger {
|
|||||||
return NewLogger(os.Stdout, interval)
|
return NewLogger(os.Stdout, interval)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) Add(name string, dur time.Duration) {
|
|
||||||
l.metrics(name).time.Update(int64(dur))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Logger) Error(name string) {
|
|
||||||
l.metrics(name).errors.Inc(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Logger) Print() {
|
func (l *Logger) Print() {
|
||||||
for name, s := range l.stats {
|
for name, s := range l.stats {
|
||||||
fmt.Fprintf(l.out, "%s statistics:\n"+
|
fmt.Fprintf(l.out, "%s statistics:\n"+
|
||||||
@ -78,22 +62,3 @@ func (l *Logger) printWithInterval() {
|
|||||||
l.Print()
|
l.Print()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Logger) metrics(name string) *loggerStats {
|
|
||||||
if _, ok := l.stats[name]; !ok {
|
|
||||||
l.Lock()
|
|
||||||
defer l.Unlock()
|
|
||||||
|
|
||||||
// Double checking being protected by mutex
|
|
||||||
if s, ok := l.stats[name]; ok {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
l.stats[name] = &loggerStats{
|
|
||||||
time: metrics.NewHistogram(metrics.NewUniformSample(1000)),
|
|
||||||
errors: metrics.NewCounter(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return l.stats[name]
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user