Last active
August 29, 2015 14:10
-
-
Save remh/68c1a96f44c9fa2bcf12 to your computer and use it in GitHub Desktop.
Windows Service checks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ Collect status information for Windows services | |
| """ | |
| # project | |
| from checks import AgentCheck | |
| # 3rd party | |
| import wmi | |
| class WindowsService(AgentCheck): | |
| STATE_TO_VALUE = { | |
| 'Stopped': AgentCheck.CRITICAL, | |
| 'Start Pending': AgentCheck.WARNING, | |
| 'Stop Pending': AgentCheck.WARNING, | |
| 'Running': AgentCheck.OK, | |
| 'Continue Pending': AgentCheck.WARNING, | |
| 'Pause Pending': AgentCheck.WARNING, | |
| 'Paused': AgentCheck.WARNING, | |
| 'Unknown': AgentCheck.UNKNOWN | |
| } | |
| def __init__(self, name, init_config, agentConfig): | |
| AgentCheck.__init__(self, name, init_config, agentConfig) | |
| self.wmi_conns = {} | |
| def _get_wmi_conn(self, host, user, password): | |
| key = "%s:%s:%s" % (host, user, password) | |
| if key not in self.wmi_conns: | |
| self.wmi_conns[key] = wmi.WMI(host, user=user, password=password) | |
| return self.wmi_conns[key] | |
| def check(self, instance): | |
| # Connect to the WMI provider | |
| host = instance.get('host', None) | |
| user = instance.get('username', None) | |
| password = instance.get('password', None) | |
| tags = instance.get('tags') or [] | |
| services = instance.get('services') or [] | |
| w = self._get_wmi_conn(host, user, password) | |
| if len(services) == 0: | |
| raise Exception('No services defined in windows_service.yaml') | |
| for service in services: | |
| results = w.Win32_Service(name=service) | |
| if len(results) == 0: | |
| self.warning(u"No services found matching %s" % service) | |
| continue | |
| elif len(results) > 1: | |
| self.warning(u"Multiple services found matching %s" % service) | |
| continue | |
| wmi_service = results[0] | |
| self._create_service_check(wmi_service, host) | |
| def _create_service_check(self, wmi_service, host): | |
| """ Given an instance of a wmi_object from Win32_Service, write any | |
| performance counters to be gathered and flushed by the collector. | |
| """ | |
| if host == ".": | |
| host_name = self.hostname | |
| else: | |
| host_name = host | |
| tags = [u'service:%s' % wmi_service.Name, u'host:%s' % host_name] | |
| state_value = self.STATE_TO_VALUE.get(wmi_service.State, AgentCheck.UNKNOWN) | |
| self.service_check('windows_service.state', state_value, tags=tags) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| init_config: | |
| instances: | |
| # For each instance you define what host to connect to (defaulting to the | |
| # current host) as well as a list of services you care about. The service | |
| # names should match the Service name in the properties and NOT the display | |
| # name in the services.msc list. | |
| # | |
| # If you want to check services on a remote host, you have to specify a | |
| # hostname and (optional) credentials | |
| # | |
| #- host: MYREMOTESERVER | |
| # username: MYREMOTESERVER\fred | |
| # password: mysecretpassword | |
| # tags: | |
| # - fredserver | |
| # | |
| # The sample configuration will monitor the WMI Performance Adapter service, | |
| # named "wmiApSrv" in the service properties. | |
| # | |
| - host: . # "." means the current host | |
| services: | |
| - wmiApSrv |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add windows_service.py in C:\ProgramData\Datadog\checks.d
Add windows_service.yaml in C:\ProgramData\Datadog\conf.d and customize
Restart the agent