monasca-agent/monasca_agent/collector/checks_d/http_metrics.py

93 lines
3.4 KiB
Python

#!/bin/env python
# (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Monitoring Agent plugin for HTTP/API checks.
"""
import json
from numbers import Number
import monasca_agent.collector.checks.services_checks as services_checks
import monasca_agent.collector.checks_d.http_check as http_check
class HTTPMetrics(http_check.HTTPCheck):
def __init__(self, name, init_config, agent_config, instances=None):
super(HTTPMetrics, self).__init__(name, init_config, agent_config,
instances)
self.metric_method = {
'gauge': self.gauge,
'counter': self.increment,
'rate': self.rate}
def _valid_number(self, value, name):
if not isinstance(value, Number):
self.log.info("Value '{0}' is not a number for metric {1}".format(
value, name))
return False
return True
def _check(self, instance):
addr = instance.get("url", None)
whitelist = instance.get("whitelist", None)
dimensions = self._set_dimensions({'url': addr}, instance)
success, result_string = self._http_check(instance)
if success:
json_data = json.loads(result_string)
for metric in whitelist:
try:
metric_name = metric['name']
metric_type = metric['type']
keys = metric['path'].split('/')
except Exception:
self.log.warning("Invalid configuration for metric '{0}'".format(metric))
continue
current = json_data
try:
for key in keys:
current = current[key]
except Exception:
self.log.warning("Could not find a value at {0} in json message".format(keys))
continue
value = current
# everything requires a number
if metric_type in ['gauge', 'counter', 'rate']:
if not self._valid_number(value, metric_name):
self.log.warning(
"Invalid value '{0}' for metric '{1}'".format(
value, metric_name))
continue
if metric_type in self.metric_method:
self.metric_method[metric_type](metric_name,
value,
dimensions=dimensions)
else:
self.log.warning(
"Unrecognized type '{0}' for metric '{1}'".format(
metric_type, metric_name))
success_string = '{0} is UP'.format(addr)
self.log.debug(success_string)
return services_checks.Status.UP, success_string