github.com/netdata/go.d.plugin@v0.58.1/agent/discovery/file/read.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package file
     4  
     5  import (
     6  	"context"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/netdata/go.d.plugin/agent/confgroup"
    11  	"github.com/netdata/go.d.plugin/logger"
    12  )
    13  
    14  type (
    15  	staticConfig struct {
    16  		confgroup.Default `yaml:",inline"`
    17  		Jobs              []confgroup.Config `yaml:"jobs"`
    18  	}
    19  	sdConfig []confgroup.Config
    20  )
    21  
    22  func NewReader(reg confgroup.Registry, paths []string) *Reader {
    23  	return &Reader{
    24  		Logger: log,
    25  		reg:    reg,
    26  		paths:  paths,
    27  	}
    28  }
    29  
    30  type Reader struct {
    31  	*logger.Logger
    32  
    33  	reg   confgroup.Registry
    34  	paths []string
    35  }
    36  
    37  func (r *Reader) String() string {
    38  	return r.Name()
    39  }
    40  
    41  func (r *Reader) Name() string {
    42  	return "file reader"
    43  }
    44  
    45  func (r *Reader) Run(ctx context.Context, in chan<- []*confgroup.Group) {
    46  	r.Info("instance is started")
    47  	defer func() { r.Info("instance is stopped") }()
    48  
    49  	select {
    50  	case <-ctx.Done():
    51  	case in <- r.groups():
    52  	}
    53  
    54  	close(in)
    55  }
    56  
    57  func (r *Reader) groups() (groups []*confgroup.Group) {
    58  	for _, pattern := range r.paths {
    59  		matches, err := filepath.Glob(pattern)
    60  		if err != nil {
    61  			continue
    62  		}
    63  
    64  		for _, path := range matches {
    65  			if fi, err := os.Stat(path); err != nil || !fi.Mode().IsRegular() {
    66  				continue
    67  			}
    68  
    69  			group, err := parse(r.reg, path)
    70  			if err != nil {
    71  				r.Warningf("parse '%s': %v", path, err)
    72  				continue
    73  			}
    74  			if group == nil {
    75  				group = &confgroup.Group{Source: path}
    76  			}
    77  			groups = append(groups, group)
    78  		}
    79  	}
    80  
    81  	for _, group := range groups {
    82  		for _, cfg := range group.Configs {
    83  			cfg.SetSource(group.Source)
    84  			cfg.SetProvider(r.Name())
    85  		}
    86  	}
    87  
    88  	return groups
    89  }