ebpf_exporter

Форк
0
/
config.go 
135 строк · 3.9 Кб
1
package config
2

3
import (
4
	"fmt"
5
	"os"
6
	"path/filepath"
7
	"time"
8

9
	"gopkg.in/yaml.v2"
10
)
11

12
// Config describes how to configure and extract metrics
13
type Config struct {
14
	Name    string   `yaml:"name"`
15
	Metrics Metrics  `yaml:"metrics"`
16
	Kaddrs  []string `yaml:"kaddrs"`
17
	BPFPath string
18
}
19

20
// Metrics is a collection of metrics attached to a program
21
type Metrics struct {
22
	Counters   []Counter   `yaml:"counters"`
23
	Histograms []Histogram `yaml:"histograms"`
24
}
25

26
// Counter is a metric defining prometheus counter
27
type Counter struct {
28
	Name           string        `yaml:"name"`
29
	Help           string        `yaml:"help"`
30
	PerfEventArray bool          `yaml:"perf_event_array"`
31
	FlushInterval  time.Duration `yaml:"flush_interval"`
32
	Labels         []Label       `yaml:"labels"`
33
}
34

35
// Histogram is a metric defining prometheus histogram
36
type Histogram struct {
37
	Name             string              `yaml:"name"`
38
	Help             string              `yaml:"help"`
39
	BucketType       HistogramBucketType `yaml:"bucket_type"`
40
	BucketMultiplier float64             `yaml:"bucket_multiplier"`
41
	BucketMin        int                 `yaml:"bucket_min"`
42
	BucketMax        int                 `yaml:"bucket_max"`
43
	BucketKeys       []float64           `yaml:"bucket_keys"`
44
	Labels           []Label             `yaml:"labels"`
45
}
46

47
// Label defines how to decode an element from eBPF map key
48
// with the list of decoders
49
type Label struct {
50
	Name     string    `yaml:"name"`
51
	Size     uint      `yaml:"size"`
52
	Decoders []Decoder `yaml:"decoders"`
53
}
54

55
// Decoder defines how to decode value
56
type Decoder struct {
57
	Name         string            `yaml:"name"`
58
	StaticMap    map[string]string `yaml:"static_map"`
59
	Regexps      []string          `yaml:"regexps"`
60
	AllowUnknown bool              `yaml:"allow_unknown"`
61
}
62

63
// HistogramBucketType is an enum to define how to interpret histogram
64
type HistogramBucketType string
65

66
const (
67
	// HistogramBucketExp2 means histograms with power-of-two keys
68
	HistogramBucketExp2 HistogramBucketType = "exp2"
69
	// HistogramBucketExp2WithZero means histograms with power-of-two keys where the first key is for zero
70
	HistogramBucketExp2WithZero HistogramBucketType = "exp2zero"
71
	// HistogramBucketLinear means histogram with linear keys
72
	HistogramBucketLinear HistogramBucketType = "linear"
73
	// HistogramBucketFixed means histogram with fixed user-defined keys
74
	HistogramBucketFixed HistogramBucketType = "fixed"
75
)
76

77
// ParseConfigs parses the named configs from the provided configs directory
78
func ParseConfigs(dir string, names []string) ([]Config, error) {
79
	configs := make([]Config, len(names))
80

81
	for i, name := range names {
82
		path := filepath.Join(dir, fmt.Sprintf("%s.yaml", name))
83

84
		f, err := os.Open(path)
85
		if err != nil {
86
			return nil, fmt.Errorf("error opening %q for config %q: %v", path, name, err)
87
		}
88

89
		defer f.Close()
90

91
		err = yaml.NewDecoder(f).Decode(&configs[i])
92
		if err != nil {
93
			return nil, fmt.Errorf("error parsing %q for config %q: %v", path, name, err)
94
		}
95

96
		configs[i].Name = name
97

98
		err = validateConfig(&configs[i])
99
		if err != nil {
100
			return nil, fmt.Errorf("error validating config: %v", err)
101
		}
102

103
		configs[i].BPFPath = filepath.Join(dir, fmt.Sprintf("%s.bpf.o", name))
104
	}
105

106
	return configs, nil
107
}
108

109
func validateConfig(cfg *Config) error {
110
	if cfg.Metrics.Counters == nil && cfg.Metrics.Histograms == nil {
111
		return fmt.Errorf("metrics are not defined for config %q", cfg.Name)
112
	}
113

114
	for _, counter := range cfg.Metrics.Counters {
115
		if counter.Name == "" {
116
			return fmt.Errorf("counter %q in config %q lacks name", counter.Name, cfg.Name)
117
		}
118

119
		if counter.Help == "" {
120
			return fmt.Errorf("counter %q in config %q lacks help", counter.Name, cfg.Name)
121
		}
122
	}
123

124
	for _, histogram := range cfg.Metrics.Histograms {
125
		if histogram.Name == "" {
126
			return fmt.Errorf("histogram %q in config %q lacks name", histogram.Name, cfg.Name)
127
		}
128

129
		if histogram.Help == "" {
130
			return fmt.Errorf("histogram %q in config %q lacks help", histogram.Name, cfg.Name)
131
		}
132
	}
133

134
	return nil
135
}
136

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.