Skip to content

Commit

Permalink
Adds another enpoint and gauge
Browse files Browse the repository at this point in the history
  • Loading branch information
chelnak committed Jul 18, 2019
1 parent 01d8fe4 commit c843702
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 31 deletions.
73 changes: 56 additions & 17 deletions exporter/collectors/test_collector.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,43 @@
import sys
import logging
from prometheus_client.core import GaugeMetricFamily
from status_cake_client import tests
from status_cake_client import tests as t

logger = logging.getLogger("test_collector")


def parse_test_response(r):
tests = []
t = []
for i in r.json():
tests.append(
t.append(
{
"test_id": str(i['TestID']),
"test_type": i['TestType'],
"test_name": i['WebsiteName'],
"test_url": i['WebsiteURL'],
"test_status": i['Status'],
"test_uptime": str(i['Uptime'])
"test_status_int": str(1 if (i["Status"] == "Up") else 0)
}
)

return tests
return t


def parse_test_details_response(r):
t = []
for i in r:
t.append(
{
"test_id": str(i['TestID']),
"test_status_string": i['Status'],
"test_status_int": str(1 if (i["Status"] == "Up") else 0),
"test_uptime_percent": str(i['Uptime']),
"test_last_tested": i['LastTested'],
"test_processing": i['Processing'],
"test_down_times": str(i['DownTimes'])
}
)

return t


class TestCollector(object):
Expand All @@ -38,22 +55,44 @@ def collect(self):

try:

response = tests.get_tests(self.api_key, self.username, self.tags)
tests = t.get_tests(self.api_key, self.username, self.tags)
parsed_tests = parse_test_response(tests)

test_id_list = [i['TestID'] for i in tests.json()]
test_details = []
for i in test_id_list:
test_details.append(
t.get_test_details(self.api_key, self.username, i).json()
)
parsed_test_details = parse_test_details_response(test_details)

# status_cake_test_info - gauge
label_names = parsed_tests[0].keys()
info_gauge = GaugeMetricFamily(
"status_cake_test_info",
"A basic listing of the tests under the current account.",
labels=label_names)

for i in parsed_tests:
info_gauge.add_metric(i.values(), i["test_status_int"])

test_results = parse_test_response(response)
yield info_gauge

label_names = test_results[0].keys()
# status_cake_test_uptime_percent - gauge
uptime_label_names = [
"test_id"
]

gauge = GaugeMetricFamily(
"status_cake_tests",
"A basic listing of the tests under the current account.",
labels=label_names)
uptime_gauge = GaugeMetricFamily(
"status_cake_test_uptime_percent",
"Tests and their uptime percetage",
labels=uptime_label_names)

for i in test_results:
status = 1 if (i["test_status"] == "Up") else 0
gauge.add_metric(i.values(), status)
for i in parsed_test_details:
uptime_gauge.add_metric(
[i["test_id"]], i["test_uptime_percent"])

yield gauge
yield uptime_gauge

except Exception as e:
logger.error(e)
Expand Down
29 changes: 29 additions & 0 deletions exporter/status_cake_client/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env python3

import logging
import requests

STATUS_CAKE_BASE_URL = "https://app.statuscake.com/API/"

logger = logging.getLogger(__name__)


def get(apikey, username, endpoint, params={}):

request_url = "{base}{endpoint}".format(
base=STATUS_CAKE_BASE_URL, endpoint=endpoint)

logger.debug("Starting request: {request_url} {endpoint} {params}".format(
request_url=request_url,
endpoint=endpoint,
params=params))

headers = {
"API": apikey,
"Username": username
}

response = requests.get(url=request_url, params=params, headers=headers)
response.raise_for_status()

return response
25 changes: 11 additions & 14 deletions exporter/status_cake_client/tests.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,28 @@
#!/usr/bin/env python3

import requests
import logging
from status_cake_client import STATUS_CAKE_BASE_URL

from .base import get

logger = logging.getLogger(__name__)


def get_tests(apikey, username, tags=""):
endpoint = "Tests"
request_url = "{base}{endpoint}".format(
base=STATUS_CAKE_BASE_URL, endpoint=endpoint)
params = {
"tags": tags
}

logger.info("Sending request to {request_url}".format(
request_url=request_url))
response = get(apikey, username, endpoint, params)

headers = {
"API": apikey,
"Username": username
}
return response


def get_test_details(apikey, username, test_id):
endpoint = "Tests/Details/"
params = {
"tags": tags
"TestID": test_id
}

response = requests.get(url=request_url, params=params, headers=headers)
response.raise_for_status()
response = get(apikey, username, endpoint, params)

return response

0 comments on commit c843702

Please sign in to comment.