Implements A10 Load Balancer plugin configurations

Change-Id: Ic8a66d15f96da7262a3ceb0d2c74031fbb291cb9
This commit is contained in:
Kevin Kirkpatrick 2017-01-18 10:00:35 -07:00
parent 8d133c4013
commit dae6e46c4c
3 changed files with 130 additions and 0 deletions

View File

@ -0,0 +1,7 @@
init_config:
instances:
- name: a10_system_check
a10_device: a10_device_ip
a10_username: admin
a10_password: password

View File

@ -118,6 +118,7 @@ The following plugins are delivered via setup as part of the standard plugin che
| Setup Plugin Name | Dot File | Detail |
| ----------------- | --------- | ---------------------- |
| a10 | | |
| apache | /root/.apache.cnf | Apache web server |
| cacti | | |
| cert_check | | |
@ -289,6 +290,7 @@ These are the detection plugins included with the Monasca Agent. See [Customiza
| Detection Plugin Name | Type |
| --------------------- | ---------------------- |
| a10 | Plugin |
| apache | Plugin |
| barbican | ServicePlugin |
| bind | Plugin |
@ -441,6 +443,26 @@ These parameters may added to `instances` in the plugin `.yaml` configuration fi
By default, all metrics are enabled.
## A10
This section describes the A10 System Check.
```
init_config:
instances:
- name: a10_system_check
a10_device: a10_device_ip
a10_username: admin
a10_password: password
```
| Metric Name | Dimensions | Semantics |
| ----------- | ---------- | --------- |
| a10.memory_total_mb | a10_device, service=networking | Total memory presented in MB
| a10.memory_used_mb | a10_device, service=networking | Memory used presented in MB
| a10.memory_free_mb | a10_device, service=networking | Free memory presented in MB
| a10.memory_used | a10_device, service=networking | Realtime Memory Usage
## Apache
This section describes the Apache Web Server check that can be performed by the Agent. The Apache check gathers metrics on the Apache Web Server. The Apache check requires a configuration file called apache.yaml to be available in the agent conf.d configuration directory. The config file must contain the server url, username and password (If you are using authentication) that you are interested in monitoring.

View File

@ -0,0 +1,101 @@
#!/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