github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/metrics/sender/manifold.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package sender
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/loggo"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/agent"
    14  	"github.com/juju/juju/api/base"
    15  	"github.com/juju/juju/api/metricsadder"
    16  	"github.com/juju/juju/worker"
    17  	"github.com/juju/juju/worker/dependency"
    18  	"github.com/juju/juju/worker/metrics/spool"
    19  	"github.com/juju/juju/worker/uniter"
    20  )
    21  
    22  var (
    23  	logger               = loggo.GetLogger("juju.worker.metrics.sender")
    24  	newMetricAdderClient = func(apiCaller base.APICaller) metricsadder.MetricsAdderClient {
    25  		return metricsadder.NewClient(apiCaller)
    26  	}
    27  	period = time.Minute * 5
    28  )
    29  
    30  // ManifoldConfig defines configuration of a metric sender manifold.
    31  type ManifoldConfig struct {
    32  	AgentName       string
    33  	APICallerName   string
    34  	MetricSpoolName string
    35  }
    36  
    37  // Manifold creates a metric sender manifold.
    38  func Manifold(config ManifoldConfig) dependency.Manifold {
    39  	return dependency.Manifold{
    40  		Inputs: []string{
    41  			config.AgentName,
    42  			config.APICallerName,
    43  			config.MetricSpoolName,
    44  		},
    45  		Start: func(context dependency.Context) (worker.Worker, error) {
    46  			var apicaller base.APICaller
    47  			var factory spool.MetricFactory
    48  			err := context.Get(config.APICallerName, &apicaller)
    49  			if err != nil {
    50  				return nil, errors.Trace(err)
    51  			}
    52  			err = context.Get(config.MetricSpoolName, &factory)
    53  			if err != nil {
    54  				return nil, errors.Trace(err)
    55  			}
    56  			var agent agent.Agent
    57  			if err := context.Get(config.AgentName, &agent); err != nil {
    58  				return nil, err
    59  			}
    60  			agentConfig := agent.CurrentConfig()
    61  			tag := agentConfig.Tag()
    62  			unitTag, ok := tag.(names.UnitTag)
    63  			if !ok {
    64  				return nil, errors.Errorf("expected a unit tag, got %v", tag)
    65  			}
    66  			paths := uniter.NewWorkerPaths(agentConfig.DataDir(), unitTag, "metrics-send")
    67  
    68  			client := newMetricAdderClient(apicaller)
    69  
    70  			s, err := newSender(client, factory, paths.State.BaseDir, unitTag.String())
    71  			if err != nil {
    72  				return nil, errors.Trace(err)
    73  			}
    74  			return spool.NewPeriodicWorker(s.Do, period, worker.NewTimer, s.stop), nil
    75  		},
    76  	}
    77  }