github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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  	"github.com/juju/names"
    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  )
    28  
    29  const (
    30  	period = time.Minute * 5
    31  )
    32  
    33  // ManifoldConfig defines configuration of a metric sender manifold.
    34  type ManifoldConfig struct {
    35  	AgentName       string
    36  	APICallerName   string
    37  	MetricSpoolName string
    38  }
    39  
    40  // Manifold creates a metric sender manifold.
    41  func Manifold(config ManifoldConfig) dependency.Manifold {
    42  	return dependency.Manifold{
    43  		Inputs: []string{
    44  			config.AgentName,
    45  			config.APICallerName,
    46  			config.MetricSpoolName,
    47  		},
    48  		Start: func(context dependency.Context) (worker.Worker, error) {
    49  			var apicaller base.APICaller
    50  			var factory spool.MetricFactory
    51  			err := context.Get(config.APICallerName, &apicaller)
    52  			if err != nil {
    53  				return nil, errors.Trace(err)
    54  			}
    55  			err = context.Get(config.MetricSpoolName, &factory)
    56  			if err != nil {
    57  				return nil, errors.Trace(err)
    58  			}
    59  			var agent agent.Agent
    60  			if err := context.Get(config.AgentName, &agent); err != nil {
    61  				return nil, err
    62  			}
    63  			agentConfig := agent.CurrentConfig()
    64  			tag := agentConfig.Tag()
    65  			unitTag, ok := tag.(names.UnitTag)
    66  			if !ok {
    67  				return nil, errors.Errorf("expected a unit tag, got %v", tag)
    68  			}
    69  			paths := uniter.NewWorkerPaths(agentConfig.DataDir(), unitTag, "metrics-send")
    70  
    71  			client := newMetricAdderClient(apicaller)
    72  
    73  			s, err := newSender(client, factory, paths.State.BaseDir, unitTag.String())
    74  			if err != nil {
    75  				return nil, errors.Trace(err)
    76  			}
    77  			return spool.NewPeriodicWorker(s.Do, period, worker.NewTimer, s.stop), nil
    78  		},
    79  	}
    80  }