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

102 lines
3.8 KiB
Python

#!/usr/bin/python
import json
from monasca_agent.collector.checks import AgentCheck
import requests
import requests.adapters
from requests.adapters import HTTPAdapter
from requests.packages import urllib3
from requests.packages.urllib3.poolmanager import PoolManager
import ssl
class SSLHTTPAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.options |= ssl.OP_NO_SSLv2
context.options |= ssl.OP_NO_SSLv3
self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, block=block, ssl_version=context)
class A10Session(object):
def __init__(self, device, username, passwd, ssl):
self.device = device
self.username = username
self.passwd = passwd
def get_authorization_signature(self):
url = "https://" + self.device + "/axapi/v3/auth"
payload = {"credentials": {"username": self.username, "password": self.passwd}}
try:
get_request = requests.post(url=url, headers={"content-type": "application/json"},
data=json.dumps(payload), verify=False)
except urllib3.exceptions.SSLError as e:
self.log.warning("Caught SSL exception {}".format(e))
signature = json.loads(get_request.text)
authorization_signature = str(signature["authresponse"]["signature"])
return authorization_signature
def log_out(self, auth_sig):
url = "https://" + self.device + "/axapi/v3/logoff"
requests.post(url=url, headers={"Content-type": "application/json",
"Authorization": "A10 %s" % auth_sig}, verify=False)
class A10MemoryCheck(AgentCheck):
def __init__(self, name, init_config, agent_config):
super(A10MemoryCheck, self).__init__(name, init_config, agent_config)
def check(self, instance):
a10_device = instance.get("a10_device")
username = instance.get('a10_username')
password = instance.get('a10_password')
dimensions = self._set_dimensions({'service': 'networking', 'a10_device': a10_device}, instance)
try:
authed_session = A10Session(a10_device, username, password, SSLHTTPAdapter)
self.auth_sig = authed_session.get_authorization_signature()
# Raise exception and halt program execution
except Exception as e:
self.log.exception(e)
raise
memory_data = self.get_memory_stats(a10_device)
for key, value in memory_data.items():
self.gauge(key, value, dimensions)
try:
authed_session.log_out(self.auth_sig)
# Log a debug exception and continue on
except Exception as e:
self.log.exception(e)
def get_memory_stats(self, a10_device):
memory_data = {}
try:
url = "https://" + a10_device + "/axapi/v3/system/memory/oper"
try:
request = requests.get(url=url, headers={"Content-type": "application/json",
"Authorization": "A10 %s" % self.auth_sig}, verify=False)
except urllib3.exceptions.SSLError as e:
self.log.warning("Caught SSL exception {}".format(e))
data = request.json()
mem_used = data['memory']['oper']['Usage']
convert_kb_to_mb = 1024
memory_data['a10.memory_total_mb'] = (data['memory']['oper']['Total']) / convert_kb_to_mb
memory_data['a10.memory_used_mb'] = (data['memory']['oper']['Used']) / convert_kb_to_mb
memory_data['a10.memory_free_mb'] = (data['memory']['oper']['Free']) / convert_kb_to_mb
memory_data['a10.memory_used'] = int(mem_used[:2])
except Exception as e:
self.log.exception(e)
return memory_data