-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmq_metrics_client.py
120 lines (106 loc) · 5.12 KB
/
mq_metrics_client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# -*- coding: utf-8 -*-
"""Python client for collecting IBM MQ metrics and exporting to Prometheus pushgateway."""
import sys
import time
import traceback
import platform
import requests
import argparse
from requests import ConnectionError
from urllib3.exceptions import ResponseError
from modules.mq_manager import (
get_mq_managers,
get_mq_manager_metrics)
from modules.mq_listener import (
get_listeners,
get_mq_listeners_metrics)
from modules.mq_channels import (
channels_status,
get_mq_channels_metrics)
from modules.mq_queues import (
get_queues_metrics,
get_queues_metrics_monitor)
from log.logger_client import set_logger
from modules.mq_api import run_mq_command
logger = set_logger()
class PrometheusBadResponse(Exception):
pass
def static_content():
"""Client name and version."""
name = "mq-metrics-pyclient"
version = "0.6"
return '{0} v.{1}'.format(name, version)
def parse_commandline_args():
"""Parse command-line arguments."""
parser = argparse.ArgumentParser(prog='mq_metrics_client.py')
parser.add_argument('--pghost', metavar='pushgatewayHost', nargs='?', default=platform.node(), dest='pushgateway_host', help='pushgateway host')
parser.add_argument('--pgport', metavar='pushgatewayPort', nargs='?', default='9091', dest='pushgateway_port', help='pushgateway port')
parser.add_argument('--collectint', metavar='collectInterval', nargs='?', default=15, type=int, dest='sleep_interval', help='time interval between collecting metrics')
args = parser.parse_args()
return args.pushgateway_host, args.pushgateway_port, abs(args.sleep_interval)
def put_metric_to_gateway(metric_data, job, pushgateway_host, pushgateway_port):
"""Sends data to Prometheus pushgateway."""
src_url = "http://{0}:{1}".format(pushgateway_host, pushgateway_port)
headers = {"Content-Type": "text/plain; version=0.0.4"}
dest_url = "{0}/metrics/job/{1}".format(src_url, job)
logger.info("Destination url: {0}".format(dest_url))
# Debug info
# logger.info("Metric data to push: {0}".format(metric_data))
try:
response = requests.put(dest_url, data=metric_data, headers=headers)
if not response.ok:
raise PrometheusBadResponse("Bad response - {0} from {1}\nResponseText: {2}".format(response, dest_url, response.text))
logger.info("Success! Server response: {0}".format(response))
except (ConnectionError, ResponseError):
raise PrometheusBadResponse("{0} is not available!".format(dest_url))
def get_mq_metrics(pushgateway_host, pushgateway_port):
start_time = time.time()
logger.info("Starting metrics collecting for IBM MQ!")
try:
mq_managers_data = run_mq_command(task='get_mq_managers')
mq_managers = get_mq_managers(mq_managers_data=mq_managers_data)
for mq_manager in mq_managers:
mq_manager_metrics, status = get_mq_manager_metrics(mq_manager=mq_manager)
if status == 1:
listeners_data = run_mq_command(task='get_listeners', mqm=mq_manager)
listeners = get_listeners(listeners_data=listeners_data)
mq_listeners_metrics = get_mq_listeners_metrics(listeners=listeners, mq_manager=mq_manager)
mq_channels = channels_status(mqm=mq_manager)
mq_channels_metrics = get_mq_channels_metrics(mq_channels=mq_channels, mq_manager=mq_manager)
mq_queues_metrics = get_queues_metrics(mq_manager=mq_manager)
mq_queues_metrics_monitor = get_queues_metrics_monitor(mq_manager=mq_manager)
metric_data = '{0}{1}{2}{3}{4}'.format(
mq_manager_metrics,
mq_listeners_metrics,
mq_channels_metrics,
mq_queues_metrics,
mq_queues_metrics_monitor)
put_metric_to_gateway(
metric_data=metric_data,
job=mq_manager,
pushgateway_host=pushgateway_host,
pushgateway_port=pushgateway_port)
logger.info("All metrics pushed successfully!")
else:
put_metric_to_gateway(
metric_data=mq_manager_metrics,
job=mq_manager,
pushgateway_host=pushgateway_host,
pushgateway_port=pushgateway_port)
logger.warning("Pushed only metric for mq_manager!")
logger.info("Script finished in - {0} seconds -".format(time.time() - start_time))
except PrometheusBadResponse as error:
logger.error(error)
except Exception as err:
tb = sys.exc_info()[-1]
stk = traceback.extract_tb(tb, 1)[0]
logger.error("Function: {0}\n{1}".format(stk, err))
if __name__ == "__main__":
logger.info("Run {0}".format(static_content()))
pushgateway_host, pushgateway_port, sleep_interval = parse_commandline_args()
logger.info("Metrics will be collected every {0} seconds".format(sleep_interval))
while True:
get_mq_metrics(
pushgateway_host=pushgateway_host,
pushgateway_port=pushgateway_port)
time.sleep(sleep_interval)