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

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