blob: 35539ea8ae7afdc98daf658dd2f711bf714cd4f4 [file] [log] [blame]
package metrics2
import (
"fmt"
"time"
)
// muxClient is a Client that can be used to multiplex
// N Clients, it implements the Client interface.
type muxClient struct {
clients []Client
}
// newMuxClient creates a new Client that mirrors all calls to one or more
// Clients.
func newMuxClient(clients []Client) (Client, error) {
if len(clients) == 0 {
return nil, fmt.Errorf("At least one client must be passed to NewMuxClient.")
}
return &muxClient{
clients: clients,
}, nil
}
func (m *muxClient) Flush() error {
var err error
for _, c := range m.clients {
if nextErr := c.Flush(); nextErr != nil {
err = nextErr
}
}
return err
}
func (m *muxClient) GetCounter(name string, tagList ...map[string]string) Counter {
ret := &muxCounter{
metrics: []Counter{},
}
for _, c := range m.clients {
ret.metrics = append(ret.metrics, c.GetCounter(name, tagList...))
}
return ret
}
func (m *muxClient) GetFloat64Metric(name string, tagList ...map[string]string) Float64Metric {
ret := &muxFloat64Metric{
metrics: []Float64Metric{},
}
for _, c := range m.clients {
ret.metrics = append(ret.metrics, c.GetFloat64Metric(name, tagList...))
}
return ret
}
func (m *muxClient) GetFloat64SummaryMetric(name string, tagList ...map[string]string) Float64SummaryMetric {
ret := &muxFloat64SummaryMetric{
metrics: []Float64SummaryMetric{},
}
for _, c := range m.clients {
ret.metrics = append(ret.metrics, c.GetFloat64SummaryMetric(name, tagList...))
}
return ret
}
func (m *muxClient) GetInt64Metric(name string, tagList ...map[string]string) Int64Metric {
ret := &muxInt64Metric{
metrics: []Int64Metric{},
}
for _, c := range m.clients {
ret.metrics = append(ret.metrics, c.GetInt64Metric(name, tagList...))
}
return ret
}
func (m *muxClient) NewLiveness(name string, tagList ...map[string]string) Liveness {
ret := &muxLiveness{
livenesses: []Liveness{},
}
for _, c := range m.clients {
ret.livenesses = append(ret.livenesses, c.NewLiveness(name, tagList...))
}
return ret
}
func (m *muxClient) NewTimer(name string, tagList ...map[string]string) Timer {
ret := &muxTimer{
timers: []Timer{},
}
for _, c := range m.clients {
ret.timers = append(ret.timers, c.NewTimer(name, tagList...))
}
return ret
}
func (m *muxClient) Int64MetricExists(name string, tagList ...map[string]string) bool {
for _, c := range m.clients {
if c.Int64MetricExists(name, tagList...) {
return true
}
}
return false
}
// muxTimer implements the Timer interface.
type muxTimer struct {
timers []Timer
}
func (mt *muxTimer) Start() {
for _, t := range mt.timers {
t.Start()
}
}
func (mt *muxTimer) Stop() time.Duration {
var d time.Duration
for _, t := range mt.timers {
d = t.Stop()
}
return d
}
// muxLiveness implements the Liveness interface.
type muxLiveness struct {
livenesses []Liveness
}
func (ml *muxLiveness) Get() int64 {
return ml.livenesses[0].Get()
}
func (ml *muxLiveness) ManualReset(lastSuccessfulUpdate time.Time) {
for _, l := range ml.livenesses {
l.ManualReset(lastSuccessfulUpdate)
}
}
func (ml *muxLiveness) Reset() {
for _, l := range ml.livenesses {
l.Reset()
}
}
// Close implements the Liveness interface.
func (ml *muxLiveness) Close() {
for _, l := range ml.livenesses {
l.Close()
}
}
// muxInt64Metric implements Int64Metric.
type muxInt64Metric struct {
metrics []Int64Metric
}
func (mi *muxInt64Metric) Delete() error {
var err error
for _, l := range mi.metrics {
if nextErr := l.Delete(); nextErr != nil {
err = nextErr
}
}
return err
}
func (mi *muxInt64Metric) Get() int64 {
return mi.metrics[0].Get()
}
func (mi *muxInt64Metric) Update(v int64) {
for _, m := range mi.metrics {
m.Update(v)
}
}
// muxFloat64Metric implements the Float64Metric interface.
type muxFloat64Metric struct {
metrics []Float64Metric
}
func (mf *muxFloat64Metric) Delete() error {
var err error
for _, l := range mf.metrics {
if nextErr := l.Delete(); nextErr != nil {
err = nextErr
}
}
return err
}
func (mf *muxFloat64Metric) Get() float64 {
return mf.metrics[0].Get()
}
func (mf *muxFloat64Metric) Update(v float64) {
for _, m := range mf.metrics {
m.Update(v)
}
}
// muxFloat64SummaryMetric implements the Float64SummaryMetric interface.
type muxFloat64SummaryMetric struct {
metrics []Float64SummaryMetric
}
func (mf *muxFloat64SummaryMetric) Observe(v float64) {
for _, m := range mf.metrics {
m.Observe(v)
}
}
// muxCounter implements the Counter interface.
type muxCounter struct {
metrics []Counter
}
func (mc *muxCounter) Dec(i int64) {
for _, m := range mc.metrics {
m.Dec(i)
}
}
func (mc *muxCounter) Delete() error {
var err error
for _, l := range mc.metrics {
if nextErr := l.Delete(); nextErr != nil {
err = nextErr
}
}
return err
}
func (mc *muxCounter) Get() int64 {
return mc.metrics[0].Get()
}
func (mc *muxCounter) Inc(i int64) {
for _, m := range mc.metrics {
m.Inc(i)
}
}
func (mc *muxCounter) Reset() {
for _, m := range mc.metrics {
m.Reset()
}
}
// Validate that the concrete structs faithfully implement their respective interfaces.
var _ Client = (*muxClient)(nil)
var _ Counter = (*muxCounter)(nil)
var _ Float64Metric = (*muxFloat64Metric)(nil)
var _ Int64Metric = (*muxInt64Metric)(nil)
var _ Liveness = (*muxLiveness)(nil)
var _ Timer = (*muxTimer)(nil)