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