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  }