github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/worker/metrics/sender/sender.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // Package sender contains the implementation of the metric 5 // sender manifold. 6 package sender 7 8 import ( 9 "github.com/juju/errors" 10 11 "github.com/juju/juju/api/metricsadder" 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/worker/metrics/spool" 14 ) 15 16 type sender struct { 17 client metricsadder.MetricsAdderClient 18 factory spool.MetricFactory 19 } 20 21 // Do sends metrics from the metric spool to the 22 // state server via an api call. 23 func (s *sender) Do(stop <-chan struct{}) error { 24 reader, err := s.factory.Reader() 25 if err != nil { 26 return errors.Trace(err) 27 } 28 batches, err := reader.Read() 29 if err != nil { 30 logger.Warningf("failed to open the metric reader: %v", err) 31 return errors.Trace(err) 32 } 33 defer reader.Close() 34 var sendBatches []params.MetricBatchParam 35 for _, batch := range batches { 36 sendBatches = append(sendBatches, spool.APIMetricBatch(batch)) 37 } 38 results, err := s.client.AddMetricBatches(sendBatches) 39 if err != nil { 40 logger.Warningf("could not send metrics: %v", err) 41 return errors.Trace(err) 42 } 43 for batchUUID, resultErr := range results { 44 // if we fail to send any metric batch we log a warning with the assumption that 45 // the unsent metric batches remain in the spool directory and will be sent to the 46 // state server when the network partition is restored. 47 if _, ok := resultErr.(*params.Error); ok || params.IsCodeAlreadyExists(resultErr) { 48 err = reader.Remove(batchUUID) 49 if err != nil { 50 logger.Warningf("could not remove batch %q from spool: %v", batchUUID, err) 51 } 52 } else { 53 logger.Warningf("failed to send batch %q: %v", batchUUID, resultErr) 54 } 55 } 56 return nil 57 } 58 59 func newSender(client metricsadder.MetricsAdderClient, factory spool.MetricFactory) sender { 60 return sender{ 61 client: client, 62 factory: factory, 63 } 64 }