// New instantiates a running MetricBatcher. Eventswill be emitted once per batchDuration. All // updates to a given counter name will be combined into a single event and sent to metricSender. func New(metricSender metric_sender.MetricSender, batchDuration time.Duration) *MetricBatcher { mb := &MetricBatcher{ metrics: make(map[string]uint64), batchTicker: time.NewTicker(batchDuration), metricSender: metricSender, } go func() { for { <-mb.batchTicker.C mb.lock.Lock() for name, delta := range mb.metrics { metricSender.AddToCounter(name, delta) } mb.unsafeReset() mb.lock.Unlock() } }() return mb }
package metric_sender_test import ( "errors" "github.com/cloudfoundry/dropsonde/emitter/fake" "github.com/cloudfoundry/dropsonde/events" "github.com/cloudfoundry/dropsonde/metric_sender" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("MetricSender", func() { var ( emitter *fake.FakeEventEmitter sender metric_sender.MetricSender ) BeforeEach(func() { emitter = fake.NewFakeEventEmitter("origin") sender = metric_sender.NewMetricSender(emitter) }) It("sends a metric to its emitter", func() { err := sender.SendValue("metric-name", 42, "answers") Expect(err).NotTo(HaveOccurred()) Expect(emitter.GetMessages()).To(HaveLen(1)) metric := emitter.GetMessages()[0].Event.(*events.ValueMetric) Expect(metric.GetName()).To(Equal("metric-name")) Expect(metric.GetValue()).To(BeNumerically("==", 42))
package metric_sender_test import ( "errors" "github.com/cloudfoundry/dropsonde/emitter/fake" "github.com/cloudfoundry/dropsonde/events" "github.com/cloudfoundry/dropsonde/metric_sender" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("MetricSender", func() { var ( emitter *fake.FakeEventEmitter sender metric_sender.MetricSender ) BeforeEach(func() { emitter = fake.NewFakeEventEmitter("origin") sender = metric_sender.NewMetricSender(emitter) }) It("sends a metric to its emitter", func() { err := sender.SendValue("metric-name", 42, "answers") Expect(err).NotTo(HaveOccurred()) Expect(emitter.Messages).To(HaveLen(1)) metric := emitter.Messages[0].Event.(*events.ValueMetric) Expect(metric.GetName()).To(Equal("metric-name")) Expect(metric.GetValue()).To(BeNumerically("==", 42))