// Package metrics provides both a means of generating metrics and the ability
// to send metric data to a graphite endpoint.
// The usage of this package without providing a graphite_addr when calling
// NewBucket results in NOP metric objects. No data will be collected.
package metrics

import (
	"io"

	gometrics "github.com/coreos/etcd/third_party/github.com/rcrowley/go-metrics"
)

type Timer gometrics.Timer
type Gauge gometrics.Gauge

type Bucket interface {
	// If a timer exists in this Bucket, return it. Otherwise, create
	// a new timer with the given name and store it in this Bucket.
	// The returned object will fulfull the Timer interface.
	Timer(name string) Timer

	// This acts similarly to Timer, but with objects that fufill the
	// Gauge interface.
	Gauge(name string) Gauge

	// Write the current state of all Metrics in a human-readable format
	// to the provide io.Writer.
	Dump(io.Writer)

	// Instruct the Bucket to periodically push all metric data to the
	// provided graphite endpoint.
	Publish(string) error
}

// Create a new Bucket object that periodically
func NewBucket(name string) Bucket {
	if name == "" {
		return nilBucket{}
	}

	return newStandardBucket(name)
}