Skip to content

Commit

Permalink
Adding better documentation and more tests, but still missing tests f…
Browse files Browse the repository at this point in the history
…or Scheduler
  • Loading branch information
mtakaki committed May 1, 2016
1 parent f254bdd commit 072aed1
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 4 deletions.
57 changes: 56 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,59 @@

cachet-url-monitor
========================
Python plugin for [cachet](cachethq.io) that monitors an URL, verifying it's response status and latency.
Python plugin for [cachet](cachethq.io) that monitors an URL, verifying it's response status and latency. The frequency the URL is tested is configurable, along with the assertion applied to the request response.

## Configuration

```yaml
endpoint:
url: http://www.google.com
method: GET
timeout: 0.010 # seconds
expectation:
- type: HTTP_STATUS
status: 200
- type: LATENCY
threshold: 1
- type: REGEX
regex: ".*<body>.*"
cachet:
api_url: http://status.cachethq.io/api/v1/
token: my_token
component_id: 1
metric_id: 1
frequency: 30
```

- **endpoint**, the configuration about the URL that will be monitored.
- **url**, the URL that is going to be monitored.
- **method**, the HTTP method that will be used by the monitor.
- **timeout**, how long we'll wait to consider the request failed. The unit of it is seconds.
- **expectation**, the list of expectations set for the URL.
- **HTTP_STATUS**, we will verify if the response status code matches what we expect.
- **LATENCY**, we measure how long the request took to get a response and fail if it's above the threshold. The unit is in seconds.
- **REGEX**, we verify if the response body matches the given regex.
- **cachet**, this is the settings for our cachet server.
- **api_url**, the cachet API endpoint.
- **token**, the API token.
- **component_id**, the id of the component we're monitoring. This will be used to update the status of the component.
- **metric_id**, this will be used to store the latency of the API. If this is not set, it will be ignored.
- **frequency**, how often we'll send a request to the given URL. The unit is in seconds.

## Setting up

The application should be installed using **virtualenv**, through the following command:

```
$ git clone git@github.com:mtakaki/cachet-url-monitor.git
$ virtualenv cachet-url-monitor
$ cd cachet-url-monitor
$ source bin/activate
$ pip install -r requirements.txt
```

To start the agent:

```
$ python cachet_url_monitor/scheduler.py config.yml
```
2 changes: 2 additions & 0 deletions cachet_url_monitor/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ def __init__(self, config_file):
self.data = load(file(self.config_file, 'r'))
self.expectations = [Expectaction.create(expectation) for expectation
in self.data['endpoint']['expectation']]
for expectation in self.expectations:
self.logger.info('Registered expectation: %s' % (expectation,))

def evaluate(self):
"""Sends the request to the URL set in the configuration and executes
Expand Down
5 changes: 4 additions & 1 deletion cachet_url_monitor/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,21 @@ def __init__(self, config_file):
self.logger = logging.getLogger('cachet_url_monitor.scheduler.Scheduler')
self.configuration = Configuration(config_file)
self.agent = Agent(self.configuration)
self.stop = False

def start(self):
self.agent.start()
self.logger.info('Starting monitor agent...')
while True:
while not self.stop:
schedule.run_pending()
time.sleep(self.configuration.data['frequency'])


if __name__ == "__main__":
FORMAT = "%(levelname)9s [%(asctime)-15s] %(name)s - %(message)s"
logging.basicConfig(format=FORMAT, level=logging.INFO)
for handler in logging.root.handlers:
handler.addFilter(logging.Filter('cachet_url_monitor'))

if len(sys.argv) <= 1:
logging.fatal('Missing configuration file argument')
Expand Down
2 changes: 1 addition & 1 deletion config.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
endpoint:
url: http://localhost:8080/swagger
method: GET
timeout: 0.010
timeout: 0.01
expectation:
- type: HTTP_STATUS
status: 200
Expand Down
18 changes: 17 additions & 1 deletion tests/test_scheduler.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
#!/usr/bin/env python
import logging
import mock
import unittest
import sys
sys.modules['schedule'] = mock.Mock()
from cachet_url_monitor.scheduler import Agent
sys.modules['cachet_url_monitor.configuration.Configuration'] = mock.Mock()
from cachet_url_monitor.scheduler import Agent,Scheduler


class AgentTest(unittest.TestCase):
Expand Down Expand Up @@ -31,3 +33,17 @@ def test_start(self):
every.assert_called_with(5)


class SchedulerTest(unittest.TestCase):
def setUp(self):
self.mock_configuration = sys.modules['cachet_url_monitor.configuration.Configuration']
self.scheduler = Scheduler('config.yml')

def test_init(self):
#TODO(mtakaki|2016-05-01): We need more assertions in this test.
assert self.scheduler.stop == False

def test_start(self):
#TODO(mtakaki|2016-05-01): We need a better way of testing this method.
# Leaving it as a placeholder.
self.scheduler.stop = True
self.scheduler.start()

0 comments on commit 072aed1

Please sign in to comment.