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