github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/pkg/promtail/targets/syslog/syslogtargetmanager.go (about)

     1  package syslog
     2  
     3  import (
     4  	"github.com/go-kit/log"
     5  	"github.com/go-kit/log/level"
     6  	"github.com/prometheus/client_golang/prometheus"
     7  
     8  	"github.com/grafana/loki/clients/pkg/logentry/stages"
     9  	"github.com/grafana/loki/clients/pkg/promtail/api"
    10  	"github.com/grafana/loki/clients/pkg/promtail/scrapeconfig"
    11  	"github.com/grafana/loki/clients/pkg/promtail/targets/target"
    12  )
    13  
    14  // SyslogTargetManager manages a series of SyslogTargets.
    15  // nolint:revive
    16  type SyslogTargetManager struct {
    17  	logger  log.Logger
    18  	targets map[string]*SyslogTarget
    19  }
    20  
    21  // NewSyslogTargetManager creates a new SyslogTargetManager.
    22  func NewSyslogTargetManager(
    23  	metrics *Metrics,
    24  	logger log.Logger,
    25  	client api.EntryHandler,
    26  	scrapeConfigs []scrapeconfig.Config,
    27  ) (*SyslogTargetManager, error) {
    28  	reg := metrics.reg
    29  	if reg == nil {
    30  		reg = prometheus.DefaultRegisterer
    31  	}
    32  
    33  	tm := &SyslogTargetManager{
    34  		logger:  logger,
    35  		targets: make(map[string]*SyslogTarget),
    36  	}
    37  
    38  	for _, cfg := range scrapeConfigs {
    39  		pipeline, err := stages.NewPipeline(log.With(logger, "component", "syslog_pipeline"), cfg.PipelineStages, &cfg.JobName, reg)
    40  		if err != nil {
    41  			return nil, err
    42  		}
    43  
    44  		t, err := NewSyslogTarget(metrics, logger, pipeline.Wrap(client), cfg.RelabelConfigs, cfg.SyslogConfig)
    45  		if err != nil {
    46  			return nil, err
    47  		}
    48  
    49  		tm.targets[cfg.JobName] = t
    50  	}
    51  
    52  	return tm, nil
    53  }
    54  
    55  // Ready returns true if at least one SyslogTarget is also ready.
    56  func (tm *SyslogTargetManager) Ready() bool {
    57  	for _, t := range tm.targets {
    58  		if t.Ready() {
    59  			return true
    60  		}
    61  	}
    62  	return false
    63  }
    64  
    65  // Stop stops the SyslogTargetManager and all of its SyslogTargets.
    66  func (tm *SyslogTargetManager) Stop() {
    67  	for _, t := range tm.targets {
    68  		if err := t.Stop(); err != nil {
    69  			level.Error(t.logger).Log("msg", "error stopping SyslogTarget", "err", err.Error())
    70  		}
    71  	}
    72  }
    73  
    74  // ActiveTargets returns the list of SyslogTargets where syslog data
    75  // is being read. ActiveTargets is an alias to AllTargets as
    76  // SyslogTargets cannot be deactivated, only stopped.
    77  func (tm *SyslogTargetManager) ActiveTargets() map[string][]target.Target {
    78  	return tm.AllTargets()
    79  }
    80  
    81  // AllTargets returns the list of all targets where syslog data
    82  // is currently being read.
    83  func (tm *SyslogTargetManager) AllTargets() map[string][]target.Target {
    84  	result := make(map[string][]target.Target, len(tm.targets))
    85  	for k, v := range tm.targets {
    86  		result[k] = []target.Target{v}
    87  	}
    88  	return result
    89  }