feat(inputs.win_services): add exclude filter (#10144)

Co-authored-by: Tomas Mikenda <tomas.mikenda@tieto.com>
This commit is contained in:
Sebastian Spaink 2021-11-23 16:07:21 -06:00 committed by GitHub
parent cd0a7cd52f
commit ba8c29acb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 14 deletions

View File

@ -4,25 +4,27 @@ Reports information about Windows service status.
Monitoring some services may require running Telegraf with administrator privileges. Monitoring some services may require running Telegraf with administrator privileges.
### Configuration: ## Configuration
```toml ```toml
[[inputs.win_services]] [[inputs.win_services]]
## Names of the services to monitor. Leave empty to monitor all the available services on the host. Globs accepted. ## Names of the services to monitor. Leave empty to monitor all the available services on the host. Globs accepted. Case sensitive.
service_names = [ service_names = [
"LanmanServer", "LanmanServer",
"TermService", "TermService",
"Win*", "Win*",
] ]
excluded_service_names = ['WinRM'] # optional, list of service names to exclude
``` ```
### Measurements & Fields: ### Measurements & Fields
- win_services - win_services
- state : integer - state : integer
- startup_mode : integer - startup_mode : integer
The `state` field can have the following values: The `state` field can have the following values:
- 1 - stopped - 1 - stopped
- 2 - start pending - 2 - start pending
- 3 - stop pending - 3 - stop pending
@ -32,30 +34,33 @@ The `state` field can have the following values:
- 7 - paused - 7 - paused
The `startup_mode` field can have the following values: The `startup_mode` field can have the following values:
- 0 - boot start - 0 - boot start
- 1 - system start - 1 - system start
- 2 - auto start - 2 - auto start
- 3 - demand start - 3 - demand start
- 4 - disabled - 4 - disabled
### Tags: ### Tags
- All measurements have the following tags: - All measurements have the following tags:
- service_name - service_name
- display_name - display_name
### Example Output: ### Example Output
```
```shell
win_services,host=WIN2008R2H401,display_name=Server,service_name=LanmanServer state=4i,startup_mode=2i 1500040669000000000 win_services,host=WIN2008R2H401,display_name=Server,service_name=LanmanServer state=4i,startup_mode=2i 1500040669000000000
win_services,display_name=Remote\ Desktop\ Services,service_name=TermService,host=WIN2008R2H401 state=1i,startup_mode=3i 1500040669000000000 win_services,display_name=Remote\ Desktop\ Services,service_name=TermService,host=WIN2008R2H401 state=1i,startup_mode=3i 1500040669000000000
``` ```
### TICK Scripts ### TICK Scripts
A sample TICK script for a notification about a not running service. A sample TICK script for a notification about a not running service.
It sends a notification whenever any service changes its state to be not _running_ and when it changes that state back to _running_. It sends a notification whenever any service changes its state to be not _running_ and when it changes that state back to _running_.
The notification is sent via an HTTP POST call. The notification is sent via an HTTP POST call.
``` ```shell
stream stream
|from() |from()
.database('telegraf') .database('telegraf')

View File

@ -86,6 +86,7 @@ var sampleConfig = `
"TermService", "TermService",
"Win*", "Win*",
] ]
#excluded_service_names = [] # optional, list of service names to exclude
` `
var description = "Input plugin to report Windows services info." var description = "Input plugin to report Windows services info."
@ -94,8 +95,9 @@ var description = "Input plugin to report Windows services info."
type WinServices struct { type WinServices struct {
Log telegraf.Logger Log telegraf.Logger
ServiceNames []string `toml:"service_names"` ServiceNames []string `toml:"service_names"`
mgrProvider ManagerProvider ServiceNamesExcluded []string `toml:"excluded_service_names"`
mgrProvider ManagerProvider
servicesFilter filter.Filter servicesFilter filter.Filter
} }
@ -109,7 +111,7 @@ type ServiceInfo struct {
func (m *WinServices) Init() error { func (m *WinServices) Init() error {
var err error var err error
m.servicesFilter, err = filter.NewIncludeExcludeFilter(m.ServiceNames, nil) m.servicesFilter, err = filter.NewIncludeExcludeFilter(m.ServiceNames, m.ServiceNamesExcluded)
if err != nil { if err != nil {
return err return err
} }

View File

@ -225,3 +225,24 @@ func TestGatherContainsTag(t *testing.T) {
acc1.AssertContainsTaggedFields(t, "win_services", fields, tags) acc1.AssertContainsTaggedFields(t, "win_services", fields, tags)
} }
} }
func TestExcludingNamesTag(t *testing.T) {
winServices := &WinServices{
Log: testutil.Logger{},
ServiceNamesExcluded: []string{"Service*"},
mgrProvider: &FakeMgProvider{testSimpleData[0]},
}
winServices.Init()
var acc1 testutil.Accumulator
require.NoError(t, winServices.Gather(&acc1))
for _, s := range testSimpleData[0].services {
fields := make(map[string]interface{})
tags := make(map[string]string)
fields["state"] = int(s.state)
fields["startup_mode"] = int(s.startUpMode)
tags["service_name"] = s.serviceName
tags["display_name"] = s.displayName
acc1.AssertDoesNotContainsTaggedFields(t, "win_services", fields, tags)
}
}