gauge.go 442 B

12345678910111213141516171819202122232425262728293031323334
  1. package metrics
  2. type Gauge interface {
  3. Update(int64)
  4. Value() int64
  5. }
  6. type gauge struct {
  7. in, out chan int64
  8. }
  9. func NewGauge() Gauge {
  10. g := &gauge{make(chan int64), make(chan int64)}
  11. go g.arbiter()
  12. return g
  13. }
  14. func (g *gauge) Update(v int64) {
  15. g.in <- v
  16. }
  17. func (g *gauge) Value() int64 {
  18. return <-g.out
  19. }
  20. func (g *gauge) arbiter() {
  21. var value int64
  22. for {
  23. select {
  24. case v := <-g.in: value = v
  25. case g.out <- value:
  26. }
  27. }
  28. }