mirror of
https://github.com/portainer/portainer.git
synced 2026-06-23 06:20:12 +00:00
89 lines
3.1 KiB
Go
89 lines
3.1 KiB
Go
package libprometheus
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
prometheusreg "github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/common/model"
|
|
"github.com/prometheus/prometheus/config"
|
|
"github.com/prometheus/prometheus/discovery"
|
|
"github.com/prometheus/prometheus/discovery/targetgroup"
|
|
"github.com/prometheus/prometheus/scrape"
|
|
"github.com/prometheus/prometheus/storage"
|
|
)
|
|
|
|
// LoadPrometheusConfig reads and parses dataDir/config.yaml using the
|
|
// standard Prometheus config loader.
|
|
func LoadPrometheusConfig(dataDir string) (*config.Config, error) {
|
|
path := filepath.Join(dataDir, "config.yaml")
|
|
cfg, err := config.LoadFile(path, false, NewZerologSlogger())
|
|
if err != nil {
|
|
return nil, fmt.Errorf("load prometheus config %q: %w", path, err)
|
|
}
|
|
return cfg, nil
|
|
}
|
|
|
|
// NewScrapeManagerFromConfig creates a scrape.Manager from a loaded Prometheus
|
|
// config. It also returns a pre-populated target-sets channel ready to pass to
|
|
// Manager.Run() — targets are extracted from the config's static_configs so the
|
|
// file remains the single source of truth.
|
|
func NewScrapeManagerFromConfig(
|
|
cfg *config.Config,
|
|
appendable storage.Appendable,
|
|
reg prometheusreg.Registerer,
|
|
) (*scrape.Manager, chan map[string][]*targetgroup.Group, error) {
|
|
// DiscoveryReloadInterval defaults to 5s in Prometheus v0.310.0+.
|
|
// For a single static target this is just the delay before the first scrape;
|
|
// cap it at 1s so startup latency stays acceptable regardless of the
|
|
// configured scrape interval.
|
|
reloadInterval := time.Duration(cfg.GlobalConfig.ScrapeInterval)
|
|
if reloadInterval == 0 || reloadInterval > time.Second {
|
|
reloadInterval = time.Second
|
|
}
|
|
opts := &scrape.Options{
|
|
DiscoveryReloadInterval: model.Duration(reloadInterval),
|
|
}
|
|
|
|
mgr, err := scrape.NewManager(opts, NewZerologSlogger(), nil, appendable, nil, reg)
|
|
if err != nil {
|
|
return nil, nil, fmt.Errorf("create scrape manager: %w", err)
|
|
}
|
|
|
|
if err := mgr.ApplyConfig(cfg); err != nil {
|
|
return nil, nil, fmt.Errorf("apply prometheus config: %w", err)
|
|
}
|
|
|
|
serviceDiscoveryConfigs := make(map[string]discovery.Configs, len(cfg.ScrapeConfigs))
|
|
for _, sc := range cfg.ScrapeConfigs {
|
|
serviceDiscoveryConfigs[sc.JobName] = sc.ServiceDiscoveryConfigs
|
|
}
|
|
|
|
return mgr, newStaticTargetSetsChannel(serviceDiscoveryConfigs), nil
|
|
}
|
|
|
|
// newStaticTargetSetsChannel builds the initial target-set payload for manager
|
|
// startup from static discovery configs only.
|
|
func newStaticTargetSetsChannel(serviceDiscoveryConfigs map[string]discovery.Configs) chan map[string][]*targetgroup.Group {
|
|
tsets := make(map[string][]*targetgroup.Group, len(serviceDiscoveryConfigs))
|
|
for key, configs := range serviceDiscoveryConfigs {
|
|
tsets[key] = staticTargetGroups(configs)
|
|
}
|
|
|
|
ch := make(chan map[string][]*targetgroup.Group, 1)
|
|
ch <- tsets
|
|
return ch
|
|
}
|
|
|
|
func staticTargetGroups(serviceDiscoveryConfigs discovery.Configs) []*targetgroup.Group {
|
|
var groups []*targetgroup.Group
|
|
for _, sdCfg := range serviceDiscoveryConfigs {
|
|
if static, ok := sdCfg.(discovery.StaticConfig); ok {
|
|
groups = append(groups, static...)
|
|
}
|
|
}
|
|
|
|
return groups
|
|
}
|