Skip to content

Commit 4c031ee

Browse files
committed
feature: Debug the configuration on the web ui.
Signed-off-by: 孙林耀 <sunlinyao@vip.qq.com>
1 parent be8cb84 commit 4c031ee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+41775
-139
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@
1212
*.out
1313
dist/
1414
.idea/
15-
data_exporter
15+
data_exporter
16+
ui/node_modules
17+
ui/build
18+
/ui/yarn-error.log

.yamllint.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ yaml-files:
55

66
ignore: |
77
pkg/tail@v1.0.0
8+
ui/node_modules
89
910
rules:
1011
braces: enable

Makefile.common

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ endif
124124
%: common-% ;
125125

126126
.PHONY: common-all
127-
common-all: precheck style check_license lint yamllint unused build test
127+
common-all: precheck style check_license lint yamllint unused ui build test
128128

129129
.PHONY: common-style
130130
common-style:
@@ -139,7 +139,7 @@ common-style:
139139
.PHONY: common-check_license
140140
common-check_license:
141141
@echo ">> checking license header"
142-
@licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*' ! -path './pkg/tail@v1.0.0/*') ; do \
142+
@licRes=$$(for file in $$(find . -type f -regextype posix-extended -regex ".*\.(go|tsx|css|js|ts)" ! -path './transport/static/*' ! -path './ui/build/*' ! -path './ui/node_modules/*' ! -path './vendor/*' ! -path './pkg/tail@v1.0.0/*') ; do \
143143
awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \
144144
done); \
145145
if [ -n "$${licRes}" ]; then \
@@ -314,4 +314,9 @@ $(1)_precheck:
314314
echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \
315315
exit 1; \
316316
fi
317-
endef
317+
endef
318+
319+
.PHONY: ui
320+
ui:
321+
cd ui/ && yarn build
322+
rm -rf transport/static && mv ui/build transport/static

README-en.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,33 @@ make common-build && docker build -t data_exporter .
3838

3939
#### debug config file
4040

41+
##### Debugging in cli
42+
4143
```shell
4244
./data_exporter --config.path="data_exporter.yaml" --log.level=debug
4345
```
46+
4447
Or use docker:
48+
4549
```bash
4650
docker run -it --rm -v `pwd`:/etc/data_exporter/ --name data_exporter microops/data_exporter debug
4751
```
4852

53+
##### Debugging in web ui
54+
55+
```shell
56+
./data_exporter --config.path="data_exporter.yaml" --web.ui-enable
57+
```
58+
59+
Or use docker:
60+
61+
```bash
62+
docker run -it --rm -v `pwd`:/etc/data_exporter/ -p 9116:9116 --name data_exporter microops/data_exporter --web.ui-enable
63+
```
64+
65+
Then visit `http://localhost:9116/-/ui/static/`
66+
![](./docs/images/debug-ui.png)
67+
4968
#### running examples
5069

5170
```shell

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,33 @@ make common-build && docker build -t data_exporter .
3939

4040
#### 调试配置文件
4141

42+
##### 在CLI中调试
43+
4244
```shell
4345
./data_exporter debug --config.path="data_exporter.yaml"
4446
```
47+
4548
或者使用Docker:
49+
4650
```bash
4751
docker run -it --rm -v `pwd`:/etc/data_exporter/ --name data_exporter microops/data_exporter debug
4852
```
4953

54+
##### 在Web UI中调试
55+
56+
```shell
57+
./data_exporter --config.path="data_exporter.yaml" --web.ui-enable
58+
```
59+
60+
或者使用Docker:
61+
62+
```bash
63+
docker run -it --rm -v `pwd`:/etc/data_exporter/ -p 9116:9116 --name data_exporter microops/data_exporter --web.ui-enable
64+
```
65+
66+
然后访问 `http://localhost:9116/-/ui/static/`
67+
![](./docs/images/debug-ui.png)
68+
5069
#### 启动examples
5170

5271
```shell

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.4.3
1+
0.5.0

collector/collect.go

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -166,19 +166,38 @@ func (c *CollectConfig) GetMetricByDs(ctx context.Context, logger log.Logger, ds
166166
}
167167
}
168168
func (c *CollectConfig) GetMetric(logger log.Logger, data []byte, rcs RelabelConfigs, metrics chan<- MetricGenerator) {
169+
var err error
169170
for _, mc := range c.Metrics {
171+
var dps []Datapoint
170172
rcs = append(rcs, mc.RelabelConfigs...)
171173
metricLogger := log.With(logger, "metric", mc.Name)
172174
level.Debug(metricLogger).Log("title", "Raw Data", "data_format", c.DataFormat, "data", string(wrapper.Limit[byte](data, 256, wrapper.PosCenter, []byte(" ... ")...)))
173175
switch c.DataFormat.ToLower() {
174176
case Regex:
175-
mc.GetMetricByRegex(metricLogger, data, rcs, metrics)
177+
dps = mc.GetDatapointsByRegex(metricLogger, data)
176178
case Json:
177-
mc.GetMetricByJson(metricLogger, data, rcs, metrics)
179+
dps = mc.GetDatapointsByJson(metricLogger, data)
178180
case Xml:
179-
mc.GetMetricByXml(metricLogger, data, rcs, metrics)
181+
dps = mc.GetDatapointsByXml(metricLogger, data)
180182
case Yaml:
181-
mc.GetMetricByYaml(metricLogger, data, rcs, metrics)
183+
dps = mc.GetDatapointsByYaml(metricLogger, data)
184+
}
185+
186+
for _, dp := range dps {
187+
m := MetricGenerator{
188+
logger: logger,
189+
MetricType: mc.MetricType,
190+
Name: mc.Name,
191+
Labels: Labels{Label{Name: "name", Value: mc.Name}},
192+
}
193+
for name, val := range dp {
194+
m.Labels.Append(name, val)
195+
}
196+
m.Labels, err = mc.Relabels(logger, rcs, m.Labels)
197+
if err != nil {
198+
continue
199+
}
200+
metrics <- m
182201
}
183202
}
184203
}
@@ -273,7 +292,7 @@ func (c *CollectContext) Describe(_ chan<- *prometheus.Desc) {
273292
}
274293

275294
func (c *CollectContext) Collect(proMetrics chan<- prometheus.Metric) {
276-
metrics := make(chan MetricGenerator, 10)
295+
mgs := NewMetricGenerators(10, c.logger)
277296
go func() {
278297
wg := sync.WaitGroup{}
279298
for i := range c.Datasource {
@@ -291,20 +310,43 @@ func (c *CollectContext) Collect(proMetrics chan<- prometheus.Metric) {
291310
wg.Add(1)
292311
go func(idx int) {
293312
defer wg.Done()
294-
c.GetMetricByDs(c.Context, c.logger, &ds, metrics)
313+
c.GetMetricByDs(c.Context, c.logger, &ds, mgs.metrics)
295314
}(i)
296315
}
297316
}
298317
wg.Wait()
299-
close(metrics)
318+
close(mgs.metrics)
300319
}()
301-
for metric := range metrics {
320+
mgs.Collect(proMetrics)
321+
c.metrics.Collect(proMetrics)
322+
}
323+
324+
type MetricGenerators struct {
325+
metrics chan MetricGenerator
326+
logger log.Logger
327+
}
328+
329+
func NewMetricGenerators(size int, logger log.Logger) *MetricGenerators {
330+
return &MetricGenerators{
331+
metrics: make(chan MetricGenerator, 10),
332+
logger: logger,
333+
}
334+
}
335+
336+
func (*MetricGenerators) Describe(_ chan<- *prometheus.Desc) {
337+
}
338+
339+
func (mgs *MetricGenerators) Ch() chan MetricGenerator {
340+
return mgs.metrics
341+
}
342+
func (mgs *MetricGenerators) Collect(proMetrics chan<- prometheus.Metric) {
343+
for metric := range mgs.metrics {
302344
if metric.Labels.Has(LabelMetricValues) {
303-
ms, errs := metric.getMetrics()
345+
ms, errs := metric.GetMetrics()
304346
for _, err := range errs {
305347
if err != nil {
306348
collectErrorCount.WithLabelValues("metric", metric.Name).Inc()
307-
level.Error(log.With(c.logger, "metric", metric.Name)).Log("log", "failed to get prometheus metric", "err", err)
349+
level.Error(log.With(mgs.logger, "metric", metric.Name)).Log("log", "failed to get prometheus metric", "err", err)
308350
}
309351
}
310352
for _, m := range ms {
@@ -316,14 +358,12 @@ func (c *CollectContext) Collect(proMetrics chan<- prometheus.Metric) {
316358
m, err := metric.getMetric()
317359
if err != nil {
318360
collectErrorCount.WithLabelValues("metric", metric.Name).Inc()
319-
level.Error(log.With(c.logger, "metric", metric.Name)).Log("log", "failed to get prometheus metric", "err", err)
361+
level.Error(log.With(mgs.logger, "metric", metric.Name)).Log("log", "failed to get prometheus metric", "err", err)
320362
} else {
321363
proMetrics <- m
322364
}
323365
}
324-
325366
}
326-
c.metrics.Collect(proMetrics)
327367
}
328368

329369
type Collects []CollectConfig

collector/labels.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,19 @@ func (re *Regexp) UnmarshalYAML(value *yaml.Node) error {
8787
}
8888
return nil
8989
}
90+
func (re *Regexp) UnmarshalJSON(raw []byte) error {
91+
var regex string
92+
if err := json.Unmarshal(raw, &regex); err != nil {
93+
return err
94+
} else if len(regex) != 0 {
95+
if r, err := NewRegexp(regex); err != nil {
96+
return err
97+
} else {
98+
*re = r
99+
}
100+
}
101+
return nil
102+
}
90103

91104
type Action string
92105

@@ -112,7 +125,7 @@ const (
112125
type RelabelConfig struct {
113126
// A list of labels from which values are taken and concatenated
114127
// with the configured separator in order.
115-
SourceLabels model.LabelNames `yaml:"source_labels,flow,omitempty"`
128+
SourceLabels model.LabelNames `yaml:"source_labels,flow,omitempty" json:"source_labels"`
116129
// Separator is the string between concatenated values from the source labels.
117130
Separator string `yaml:"separator,omitempty"`
118131
// Regex against which the concatenation is matched.
@@ -123,7 +136,7 @@ type RelabelConfig struct {
123136
Modulus uint64 `yaml:"modulus,omitempty"`
124137
// TargetLabel is the label to which the resulting string is written in a replacement.
125138
// Regexp interpolation is allowed for the replace action.
126-
TargetLabel string `yaml:"target_label,omitempty"`
139+
TargetLabel string `yaml:"target_label,omitempty" json:"target_label"`
127140
// Replacement is the regex replacement pattern to be used.
128141
Replacement string `yaml:"replacement,omitempty"`
129142
// Action is the action to be performed for the relabeling.
@@ -150,12 +163,7 @@ func (rcs RelabelConfigs) String() string {
150163
return string(marshal)
151164
}
152165

153-
func (c *RelabelConfig) UnmarshalYAML(value *yaml.Node) error {
154-
*c = DefaultRelabelConfig
155-
type plain RelabelConfig
156-
if err := value.Decode((*plain)(c)); err != nil {
157-
return err
158-
}
166+
func (c *RelabelConfig) init() error {
159167
if c.Regex.Regexp == nil {
160168
c.Regex = MustNewRegexp("")
161169
}
@@ -190,9 +198,24 @@ func (c *RelabelConfig) UnmarshalYAML(value *yaml.Node) error {
190198
return fmt.Errorf("%s action requires only 'regex', and no other fields", c.Action)
191199
}
192200
}
193-
194201
return nil
202+
}
195203

204+
func (c *RelabelConfig) UnmarshalJSON(raw []byte) error {
205+
*c = DefaultRelabelConfig
206+
type plain RelabelConfig
207+
if err := json.Unmarshal(raw, (*plain)(c)); err != nil {
208+
return err
209+
}
210+
return c.init()
211+
}
212+
func (c *RelabelConfig) UnmarshalYAML(value *yaml.Node) error {
213+
*c = DefaultRelabelConfig
214+
type plain RelabelConfig
215+
if err := value.Decode((*plain)(c)); err != nil {
216+
return err
217+
}
218+
return c.init()
196219
}
197220

198221
// Process returns a relabeled copy of the given label set. The relabel configurations

0 commit comments

Comments
 (0)