mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-02-28 23:56:36 +00:00
Merge pull request #640 from fischerman/filter_collectors
Add URL filter for collectors
This commit is contained in:
15
README.md
15
README.md
@@ -48,6 +48,21 @@ Name | Description | Enabled by default
|
|||||||
|
|
||||||
See the linked documentation on each collector for more information on reported metrics, configuration settings and usage examples.
|
See the linked documentation on each collector for more information on reported metrics, configuration settings and usage examples.
|
||||||
|
|
||||||
|
### Filtering enabled collectors
|
||||||
|
|
||||||
|
The `windows_exporter` will expose all metrics from enabled collectors by default. This is the recommended way to collect metrics to avoid errors when comparing metrics of different families.
|
||||||
|
|
||||||
|
For advanced use the `windows_exporter` can be passed an optional list of collectors to filter metrics. The `collect[]` parameter may be used multiple times. In Prometheus configuration you can use this syntax under the [scrape config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#<scrape_config>).
|
||||||
|
|
||||||
|
```
|
||||||
|
params:
|
||||||
|
collect[]:
|
||||||
|
- foo
|
||||||
|
- bar
|
||||||
|
```
|
||||||
|
|
||||||
|
This can be useful for having different Prometheus servers collect specific metrics from nodes.
|
||||||
|
|
||||||
## Flags
|
## Flags
|
||||||
|
|
||||||
windows_exporter accepts flags to configure certain behaviours. The ones configuring the global behaviour of the exporter are listed below, while collector-specific ones are documented in the respective collector documentation above.
|
windows_exporter accepts flags to configure certain behaviours. The ones configuring the global behaviour of the exporter are listed below, while collector-specific ones are documented in the respective collector documentation above.
|
||||||
|
|||||||
29
exporter.go
29
exporter.go
@@ -339,9 +339,21 @@ func main() {
|
|||||||
|
|
||||||
h := &metricsHandler{
|
h := &metricsHandler{
|
||||||
timeoutMargin: *timeoutMargin,
|
timeoutMargin: *timeoutMargin,
|
||||||
collectorFactory: func(timeout time.Duration) *windowsCollector {
|
collectorFactory: func(timeout time.Duration, requestedCollectors []string) (error, *windowsCollector) {
|
||||||
return &windowsCollector{
|
filteredCollectors := make(map[string]collector.Collector)
|
||||||
collectors: collectors,
|
// scrape all enabled collectors if no collector is requested
|
||||||
|
if len(requestedCollectors) == 0 {
|
||||||
|
filteredCollectors = collectors
|
||||||
|
}
|
||||||
|
for _, name := range requestedCollectors {
|
||||||
|
col, exists := collectors[name]
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("unavailable collector: %s", name), nil
|
||||||
|
}
|
||||||
|
filteredCollectors[name] = col
|
||||||
|
}
|
||||||
|
return nil, &windowsCollector{
|
||||||
|
collectors: filteredCollectors,
|
||||||
maxScrapeDuration: timeout,
|
maxScrapeDuration: timeout,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -455,7 +467,7 @@ loop:
|
|||||||
|
|
||||||
type metricsHandler struct {
|
type metricsHandler struct {
|
||||||
timeoutMargin float64
|
timeoutMargin float64
|
||||||
collectorFactory func(timeout time.Duration) *windowsCollector
|
collectorFactory func(timeout time.Duration, requestedCollectors []string) (error, *windowsCollector)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mh *metricsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (mh *metricsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -475,7 +487,14 @@ func (mh *metricsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
timeoutSeconds = timeoutSeconds - mh.timeoutMargin
|
timeoutSeconds = timeoutSeconds - mh.timeoutMargin
|
||||||
|
|
||||||
reg := prometheus.NewRegistry()
|
reg := prometheus.NewRegistry()
|
||||||
reg.MustRegister(mh.collectorFactory(time.Duration(timeoutSeconds * float64(time.Second))))
|
err, wc := mh.collectorFactory(time.Duration(timeoutSeconds*float64(time.Second)), r.URL.Query()["collect[]"])
|
||||||
|
if err != nil {
|
||||||
|
log.Warnln("Couldn't create filtered metrics handler: ", err)
|
||||||
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
|
w.Write([]byte(fmt.Sprintf("Couldn't create filtered metrics handler: %s", err)))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
reg.MustRegister(wc)
|
||||||
reg.MustRegister(
|
reg.MustRegister(
|
||||||
prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}),
|
prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}),
|
||||||
prometheus.NewGoCollector(),
|
prometheus.NewGoCollector(),
|
||||||
|
|||||||
Reference in New Issue
Block a user