Skip to content

Commit

Permalink
Merge pull request #4 from mtakaki/mtakaki_push_metrics
Browse files Browse the repository at this point in the history
Creating push_metrics() method to start pushing the URL latency, if it the metric id is configured
  • Loading branch information
mtakaki committed May 3, 2016
2 parents a91a1ad + f563526 commit 47ff348
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 17 deletions.
30 changes: 25 additions & 5 deletions cachet_url_monitor/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import logging
import re
import requests
import timeit
import time
from yaml import load


Expand All @@ -22,6 +22,7 @@ def __init__(self, config_file):
in self.data['endpoint']['expectation']]
for expectation in self.expectations:
self.logger.info('Registered expectation: %s' % (expectation,))
self.headers = {'X-Cachet-Token': self.data['cachet']['token']}

def evaluate(self):
"""Sends the request to the URL set in the configuration and executes
Expand All @@ -32,6 +33,7 @@ def evaluate(self):
self.request = requests.request(self.data['endpoint']['method'],
self.data['endpoint']['url'],
timeout=self.data['endpoint']['timeout'])
self.current_timestamp = int(time.time())
except requests.ConnectionError:
self.logger.warning('The URL is unreachable: %s %s' %
(self.data['endpoint']['method'],
Expand All @@ -56,22 +58,40 @@ def evaluate(self):
if status > self.status:
self.status = status

def push_status_and_metrics(self):
def push_status(self):
params = {'id': self.data['cachet']['component_id'], 'status':
self.status}
headers = {'X-Cachet-Token': self.data['cachet']['token']}
component_request = requests.put('%s/components/%d' %
(self.data['cachet']['api_url'],
self.data['cachet']['component_id']),
params=params, headers=headers)
if component_request.status_code == 200:
params=params, headers=self.headers)
if component_request.ok:
# Successful update
self.logger.info('Component update: status [%d]' % (self.status,))
else:
# Failed to update the API status
self.logger.warning('Component update failed with status [%d]: API'
' status: [%d]' % (component_request.status_code, self.status))

def push_metrics(self):
if 'metric_id' in self.data['cachet'] and hasattr(self, 'request'):
params = {'id': self.data['cachet']['metric_id'], 'value':
self.request.elapsed.total_seconds(), 'timestamp':
self.current_timestamp}
metrics_request = requests.post('%s/metrics/%d/points' %
(self.data['cachet']['api_url'],
self.data['cachet']['metric_id']), params=params,
headers=self.headers)

if metrics_request.ok:
# Successful metrics upload
self.logger.info('Metric uploaded: %.6f seconds' %
(self.request.elapsed.total_seconds(),))
else:
self.logger.warning('Metric upload failed with status [%d]' %
(metrics_request.status_code,))


class Expectaction(object):
"""Base class for URL result expectations. Any new excpectation should extend
this class and the name added to create() method.
Expand Down
3 changes: 2 additions & 1 deletion cachet_url_monitor/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ def execute(self):
cachet server.
"""
self.configuration.evaluate()
self.configuration.push_status_and_metrics()
self.configuration.push_status()
self.configuration.push_metrics()

def start(self):
"""Sets up the schedule based on the configuration file."""
Expand Down
6 changes: 3 additions & 3 deletions config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ endpoint:
- type: LATENCY
threshold: 1
- type: REGEX
regex: ".*<body>.*"
regex: '.*<body>.*'
cachet:
api_url: http://status.cachethq.io/api/v1/
api_url: https://demo.cachethq.io/api/v1
token: my_token
component_id: 1
metric_id: 1
#metric_id: 1
frequency: 30
12 changes: 6 additions & 6 deletions tests/test_configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,9 @@ def request(method, url, timeout=None):
self.mock_logger.exception.assert_called_with(('Unexpected HTTP '
'response'))

def test_push_status_and_metrics(self):
def test_push_status(self):
def put(url, params=None, headers=None):
assert url == 'http://status.cachethq.io/api/v1//components/1'
assert url == 'https://demo.cachethq.io/api/v1/components/1'
assert params == {'id': 1, 'status': 1}
assert headers == {'X-Cachet-Token': 'my_token'}

Expand All @@ -112,11 +112,11 @@ def put(url, params=None, headers=None):

sys.modules['requests'].put = put
self.configuration.status = 1
self.configuration.push_status_and_metrics()
self.configuration.push_status()

def test_push_status_and_metrics_with_failure(self):
def test_push_status_with_failure(self):
def put(url, params=None, headers=None):
assert url == 'http://status.cachethq.io/api/v1//components/1'
assert url == 'https://demo.cachethq.io/api/v1/components/1'
assert params == {'id': 1, 'status': 1}
assert headers == {'X-Cachet-Token': 'my_token'}

Expand All @@ -126,4 +126,4 @@ def put(url, params=None, headers=None):

sys.modules['requests'].put = put
self.configuration.status = 1
self.configuration.push_status_and_metrics()
self.configuration.push_status()
4 changes: 2 additions & 2 deletions tests/test_scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ def test_init(self):

def test_execute(self):
evaluate = self.configuration.evaluate
push_status_and_metrics = self.configuration.push_status_and_metrics
push_status = self.configuration.push_status
self.agent.execute()

evaluate.assert_called_once()
push_status_and_metrics.assert_called_once()
push_status.assert_called_once()

def test_start(self):
every = sys.modules['schedule'].every
Expand Down

0 comments on commit 47ff348

Please sign in to comment.