From c67c01556b76e899729f6b65d837a801c09966cd Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Fri, 22 Mar 2019 18:48:39 +0100 Subject: [PATCH 01/21] adds channel metrics --- ibm_mq/datadog_checks/ibm_mq/config.py | 2 + .../ibm_mq/data/conf.yaml.example | 6 ++ ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 57 +++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/ibm_mq/datadog_checks/ibm_mq/config.py b/ibm_mq/datadog_checks/ibm_mq/config.py index f0378c86e5330..41358ee22ac72 100644 --- a/ibm_mq/datadog_checks/ibm_mq/config.py +++ b/ibm_mq/datadog_checks/ibm_mq/config.py @@ -41,6 +41,8 @@ def __init__(self, instance): self.queues = instance.get('queues', []) self.queue_patterns = instance.get('queue_patterns', []) + self.channels = instance.get('channels', []) + self.custom_tags = instance.get('tags', []) self.auto_discover_queues = is_affirmative(instance.get('auto_discover_queues', False)) diff --git a/ibm_mq/datadog_checks/ibm_mq/data/conf.yaml.example b/ibm_mq/datadog_checks/ibm_mq/data/conf.yaml.example index 5d6fa1e4d360e..a9e3b469938a1 100644 --- a/ibm_mq/datadog_checks/ibm_mq/data/conf.yaml.example +++ b/ibm_mq/datadog_checks/ibm_mq/data/conf.yaml.example @@ -44,6 +44,12 @@ instances: # - 'DEV.*' # - 'SYSTEM.*' + ## @param channels - list of string - optional + ## Check the status of the following channels + # + # channels: + # - '' + ## @param auto_discover_queues - string - optional - default: false ## Autodiscover the queues to monitor ## Warning: this will lead to some warnings in your logs diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 26aab77b113a2..c1acadef3a4b4 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -30,6 +30,12 @@ class IbmMqCheck(AgentCheck): QUEUE_MANAGER_SERVICE_CHECK = 'ibm_mq.queue_manager' QUEUE_SERVICE_CHECK = 'ibm_mq.queue' + CHANNEL_SERVICE_CHECK = 'ibm_mq.channel' + + CHANNEL_ARGS = { + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' + } + def check(self, instance): config = IBMMQConfig(instance) config.check_properly_configured() @@ -160,3 +166,54 @@ def get_pcf_queue_metrics(self, queue_manager, queue_name, tags): msg = "Unable to get {}, turn on queue level monitoring to access these metrics for {}" msg = msg.format(mname, queue_name) log.debug(msg) + + def get_pcf_channel_metrics(self, queue_manager, tags, config): + try: + response = pcf.MQCMD_INQUIRE_CHANNEL(CHANNEL_ARGS) + except pymqi.MQMIError as e: + self.warning("Error getting CHANNEL stats {}".format(e)) + else: + channels = len(response) + mname = '{}.channels'.format(self.METRIC_PREFIX) + self.gauge(mname, channels, tags=tags) + + try: + response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(CHANNEL_ARGS) + except pymqi.MQMIError as e: + self.warning("Error getting CHANNEL stats {}".format(e)) + else: + for channel_info in response: + name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME] + name = name.strip() + + channel_tags = tags + ["channel:{}".format(name)] + + # running = 3, stopped = 4 + status = channel_info[pymqi.CMQCFC.MQIACH_CHANNEL_STATUS] + if status == 3: + self.service_check(self.SERVICE_CHECK, AgentCheck.OK, channel_tags) + elif status == 4: + self.service_check(self.SERVICE_CHECK, AgentCheck.WARNING, channel_tags) + + for channel in config.channels: + + channel_tags = tags + ["channel:{}".format(channel)] + try: + args = { + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: channel + } + response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(args) + except pymqi.MQMIError as e: + self.warning("Error getting CHANNEL stats {}".format(e)) + self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, channel_tags) + else: + for channel_info in response: + name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME] + name = name.strip() + + # running = 3, stopped = 4 + status = channel_info[pymqi.CMQCFC.MQIACH_CHANNEL_STATUS] + if status == 3: + self.service_check(self.SERVICE_CHECK, AgentCheck.OK, channel_tags) + elif status == 4: + self.service_check(self.SERVICE_CHECK, AgentCheck.WARNING, channel_tags) From a9ab308ccda6d2e08d44a9533f22acf19fd5c7a1 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 11:21:32 +0100 Subject: [PATCH 02/21] pcf --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index c1acadef3a4b4..7810c95c68a08 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -169,6 +169,7 @@ def get_pcf_queue_metrics(self, queue_manager, queue_name, tags): def get_pcf_channel_metrics(self, queue_manager, tags, config): try: + pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL(CHANNEL_ARGS) except pymqi.MQMIError as e: self.warning("Error getting CHANNEL stats {}".format(e)) @@ -178,6 +179,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): self.gauge(mname, channels, tags=tags) try: + pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(CHANNEL_ARGS) except pymqi.MQMIError as e: self.warning("Error getting CHANNEL stats {}".format(e)) @@ -202,6 +204,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): args = { pymqi.CMQCFC.MQCACH_CHANNEL_NAME: channel } + pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(args) except pymqi.MQMIError as e: self.warning("Error getting CHANNEL stats {}".format(e)) From 0cec554367d8f1d750da98495e036615754e75dd Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 11:24:53 +0100 Subject: [PATCH 03/21] add to tests --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 7810c95c68a08..8d5113446917d 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -175,7 +175,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): self.warning("Error getting CHANNEL stats {}".format(e)) else: channels = len(response) - mname = '{}.channels'.format(self.METRIC_PREFIX) + mname = '{}.channel.channels'.format(self.METRIC_PREFIX) self.gauge(mname, channels, tags=tags) try: From 7c23e9eba33de36c84b1acd5bdb7fe1d6dd4802c Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 11:26:00 +0100 Subject: [PATCH 04/21] add to check fn --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 6 ++++-- ibm_mq/tests/test_ibm_mq.py | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 8d5113446917d..7870be89ca099 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -52,6 +52,8 @@ def check(self, instance): self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, config.tags) return + self.get_pcf_channel_metrics(queue_manager, tags, config) + self.discover_queues(queue_manager, config) try: @@ -170,7 +172,7 @@ def get_pcf_queue_metrics(self, queue_manager, queue_name, tags): def get_pcf_channel_metrics(self, queue_manager, tags, config): try: pcf = pymqi.PCFExecute(queue_manager) - response = pcf.MQCMD_INQUIRE_CHANNEL(CHANNEL_ARGS) + response = pcf.MQCMD_INQUIRE_CHANNEL(self.CHANNEL_ARGS) except pymqi.MQMIError as e: self.warning("Error getting CHANNEL stats {}".format(e)) else: @@ -180,7 +182,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): try: pcf = pymqi.PCFExecute(queue_manager) - response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(CHANNEL_ARGS) + response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(self.CHANNEL_ARGS) except pymqi.MQMIError as e: self.warning("Error getting CHANNEL stats {}".format(e)) else: diff --git a/ibm_mq/tests/test_ibm_mq.py b/ibm_mq/tests/test_ibm_mq.py index 393f6354a99ec..1bc192a1e33e7 100644 --- a/ibm_mq/tests/test_ibm_mq.py +++ b/ibm_mq/tests/test_ibm_mq.py @@ -42,6 +42,7 @@ 'ibm_mq.queue.depth_percent', 'ibm_mq.queue_manager.dist_lists', 'ibm_mq.queue_manager.max_msg_list', + 'ibm_mq.channel.channels', ] OPTIONAL_METRICS = [ From 830037c58238b4a51e36f906831f88307c9a3635 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 11:27:04 +0100 Subject: [PATCH 05/21] fix --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 7870be89ca099..eecf032ffc148 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -52,7 +52,7 @@ def check(self, instance): self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, config.tags) return - self.get_pcf_channel_metrics(queue_manager, tags, config) + self.get_pcf_channel_metrics(queue_manager, config.tags, config) self.discover_queues(queue_manager, config) From aa105467e27f9f42f36b794dbba821a4fbbb0d34 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 11:30:18 +0100 Subject: [PATCH 06/21] fix --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index eecf032ffc148..856a1cb5e711f 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -33,7 +33,7 @@ class IbmMqCheck(AgentCheck): CHANNEL_SERVICE_CHECK = 'ibm_mq.channel' CHANNEL_ARGS = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: pymqi.ByteString('*') } def check(self, instance): From da54d296f022cc329daa7ea7eff2eea101b1fa6b Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 11:34:57 +0100 Subject: [PATCH 07/21] log --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 856a1cb5e711f..853a48b5bc1f6 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -174,7 +174,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL(self.CHANNEL_ARGS) except pymqi.MQMIError as e: - self.warning("Error getting CHANNEL stats {}".format(e)) + self.log.warning("Error getting CHANNEL stats {}".format(e)) else: channels = len(response) mname = '{}.channel.channels'.format(self.METRIC_PREFIX) @@ -184,7 +184,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(self.CHANNEL_ARGS) except pymqi.MQMIError as e: - self.warning("Error getting CHANNEL stats {}".format(e)) + self.log.warning("Error getting CHANNEL stats {}".format(e)) else: for channel_info in response: name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME] @@ -209,7 +209,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(args) except pymqi.MQMIError as e: - self.warning("Error getting CHANNEL stats {}".format(e)) + self.log.warning("Error getting CHANNEL stats {}".format(e)) self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, channel_tags) else: for channel_info in response: From aa63110610bf0027cb5b5b660eb49f138823e4ad Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 12:06:33 +0100 Subject: [PATCH 08/21] try --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 853a48b5bc1f6..e268903efa652 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -6,7 +6,7 @@ from datadog_checks.base import ensure_bytes -from six import iteritems +from six import iteritems, PY3 import logging from . import errors, metrics, connection @@ -32,10 +32,6 @@ class IbmMqCheck(AgentCheck): CHANNEL_SERVICE_CHECK = 'ibm_mq.channel' - CHANNEL_ARGS = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: pymqi.ByteString('*') - } - def check(self, instance): config = IBMMQConfig(instance) config.check_properly_configured() @@ -170,6 +166,15 @@ def get_pcf_queue_metrics(self, queue_manager, queue_name, tags): log.debug(msg) def get_pcf_channel_metrics(self, queue_manager, tags, config): + if PY3: + args = { + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: pymqi.ByteString('*') + } + else: + args = { + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' + } + try: pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL(self.CHANNEL_ARGS) From c32a5b853763c36edf81674fddbf4fb172968634 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 12:08:41 +0100 Subject: [PATCH 09/21] fix --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index e268903efa652..a88c5ff0d749d 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -177,7 +177,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): try: pcf = pymqi.PCFExecute(queue_manager) - response = pcf.MQCMD_INQUIRE_CHANNEL(self.CHANNEL_ARGS) + response = pcf.MQCMD_INQUIRE_CHANNEL(args) except pymqi.MQMIError as e: self.log.warning("Error getting CHANNEL stats {}".format(e)) else: @@ -187,7 +187,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): try: pcf = pymqi.PCFExecute(queue_manager) - response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(self.CHANNEL_ARGS) + response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(args) except pymqi.MQMIError as e: self.log.warning("Error getting CHANNEL stats {}".format(e)) else: From 5999c6e21cca457314d2eca2c08c09967737467b Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 12:12:12 +0100 Subject: [PATCH 10/21] bytes --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index a88c5ff0d749d..59d02a0169f29 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -168,11 +168,11 @@ def get_pcf_queue_metrics(self, queue_manager, queue_name, tags): def get_pcf_channel_metrics(self, queue_manager, tags, config): if PY3: args = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: pymqi.ByteString('*') + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' } else: args = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: ensure_bytes('*') } try: From 14acd720a8ef10f0f11f1fe7d8bd768d42b70179 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 12:16:06 +0100 Subject: [PATCH 11/21] fix --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 59d02a0169f29..c6c93dec15d84 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -168,11 +168,11 @@ def get_pcf_queue_metrics(self, queue_manager, queue_name, tags): def get_pcf_channel_metrics(self, queue_manager, tags, config): if PY3: args = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: ensure_bytes('*') } else: args = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: ensure_bytes('*') + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' } try: From a97c73b785ac216c0c8b42dc1116775e63c94359 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 12:18:03 +0100 Subject: [PATCH 12/21] ibmmq --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index c6c93dec15d84..b7637152ab959 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -166,14 +166,9 @@ def get_pcf_queue_metrics(self, queue_manager, queue_name, tags): log.debug(msg) def get_pcf_channel_metrics(self, queue_manager, tags, config): - if PY3: - args = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: ensure_bytes('*') - } - else: - args = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: '*' - } + args = { + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: ensure_bytes('*') + } try: pcf = pymqi.PCFExecute(queue_manager) From 081ab2f9c3ae6c33fa9979ef383e0f06d0fd0fc0 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 12:19:57 +0100 Subject: [PATCH 13/21] fi --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index b7637152ab959..6ce15321230e4 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -6,7 +6,7 @@ from datadog_checks.base import ensure_bytes -from six import iteritems, PY3 +from six import iteritems import logging from . import errors, metrics, connection From d23769278917030d034ba47e2dc7b9ceb8721a18 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 14:34:44 +0100 Subject: [PATCH 14/21] refactor --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 41 ++++++++++---------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index 6ce15321230e4..aec20690167fa 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -180,45 +180,34 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): mname = '{}.channel.channels'.format(self.METRIC_PREFIX) self.gauge(mname, channels, tags=tags) + # grab all the discoverable channels + self._get_channel_status(queue_manager, '*', tags, config) + + # check specific channels as well + # if a channel is not listed in the above one, a user may want to check it specifically, + # in this case it'll fail + for channel in config.channels: + self._get_channel_status(queue_manager, channel, tags, config) + + def _get_channel_status(queue_manager, channel, tags, config): + channel_tags = tags + ["channel:{}".format(channel)] try: + args = { + pymqi.CMQCFC.MQCACH_CHANNEL_NAME: ensure_bytes(channel) + } pcf = pymqi.PCFExecute(queue_manager) response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(args) except pymqi.MQMIError as e: self.log.warning("Error getting CHANNEL stats {}".format(e)) + self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, channel_tags) else: for channel_info in response: name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME] name = name.strip() - channel_tags = tags + ["channel:{}".format(name)] - # running = 3, stopped = 4 status = channel_info[pymqi.CMQCFC.MQIACH_CHANNEL_STATUS] if status == 3: self.service_check(self.SERVICE_CHECK, AgentCheck.OK, channel_tags) elif status == 4: self.service_check(self.SERVICE_CHECK, AgentCheck.WARNING, channel_tags) - - for channel in config.channels: - - channel_tags = tags + ["channel:{}".format(channel)] - try: - args = { - pymqi.CMQCFC.MQCACH_CHANNEL_NAME: channel - } - pcf = pymqi.PCFExecute(queue_manager) - response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(args) - except pymqi.MQMIError as e: - self.log.warning("Error getting CHANNEL stats {}".format(e)) - self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, channel_tags) - else: - for channel_info in response: - name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME] - name = name.strip() - - # running = 3, stopped = 4 - status = channel_info[pymqi.CMQCFC.MQIACH_CHANNEL_STATUS] - if status == 3: - self.service_check(self.SERVICE_CHECK, AgentCheck.OK, channel_tags) - elif status == 4: - self.service_check(self.SERVICE_CHECK, AgentCheck.WARNING, channel_tags) From 8626989dec46945f5d4270188273d8bf7f88ec31 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 14:47:45 +0100 Subject: [PATCH 15/21] typo --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index aec20690167fa..ee9894772355b 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -189,7 +189,7 @@ def get_pcf_channel_metrics(self, queue_manager, tags, config): for channel in config.channels: self._get_channel_status(queue_manager, channel, tags, config) - def _get_channel_status(queue_manager, channel, tags, config): + def _get_channel_status(self, queue_manager, channel, tags, config): channel_tags = tags + ["channel:{}".format(channel)] try: args = { From 4258ea9068dae654e1e570ab89d19ca5cd4ff3bb Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 14:55:45 +0100 Subject: [PATCH 16/21] adds tests --- ibm_mq/tests/common.py | 14 ++++++++++++++ ibm_mq/tests/test_ibm_mq.py | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/ibm_mq/tests/common.py b/ibm_mq/tests/common.py index e5289564e89c0..dc80b73d438f7 100644 --- a/ibm_mq/tests/common.py +++ b/ibm_mq/tests/common.py @@ -20,6 +20,8 @@ QUEUE = 'DEV.QUEUE.1' +BAD_CHANNEL = 'DEV.NOTHERE.SVRCONN' + MQ_VERSION = os.environ.get('IBM_MQ_VERSION', '9') COMPOSE_FILE_NAME = 'docker-compose-v{}.yml'.format(MQ_VERSION) @@ -35,6 +37,10 @@ 'password': PASSWORD, 'queues': [ QUEUE + ], + 'channels': [ + CHANNEL, + BAD_CHANNEL, ] } @@ -48,6 +54,10 @@ 'queue_patterns': [ 'DEV.*', 'SYSTEM.*' + ], + 'channels': [ + CHANNEL, + BAD_CHANNEL, ] } @@ -59,4 +69,8 @@ 'username': USERNAME, 'password': PASSWORD, 'auto_discover_queues': True, + 'channels': [ + CHANNEL, + BAD_CHANNEL, + ] } diff --git a/ibm_mq/tests/test_ibm_mq.py b/ibm_mq/tests/test_ibm_mq.py index 1bc192a1e33e7..7ce0222ce510a 100644 --- a/ibm_mq/tests/test_ibm_mq.py +++ b/ibm_mq/tests/test_ibm_mq.py @@ -8,6 +8,8 @@ from datadog_checks.ibm_mq import IbmMqCheck +from . import common + log = logging.getLogger(__file__) METRICS = [ @@ -69,6 +71,11 @@ def test_check(aggregator, instance, seed_data): aggregator.assert_all_metrics_covered() + tags = ['channel:{}'.format(common.CHANNEL)] + aggregator.assert_service_check('ibm_mq.channel', check.OK, tags=tags) + tags = ['channel:{}'.format(common.BAD_CHANNEL)] + aggregator.assert_service_check('ibm_mq.channel', check.CRITICAL, tags=tags) + @pytest.mark.usefixtures("dd_environment") def test_check_pattern(aggregator, instance_pattern, seed_data): From db8e227dc1bf47d864e38e1ea6bb8a7eb5ece287 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 14:58:51 +0100 Subject: [PATCH 17/21] test --- ibm_mq/tests/test_ibm_mq.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ibm_mq/tests/test_ibm_mq.py b/ibm_mq/tests/test_ibm_mq.py index 7ce0222ce510a..3eb0c09bfd7a7 100644 --- a/ibm_mq/tests/test_ibm_mq.py +++ b/ibm_mq/tests/test_ibm_mq.py @@ -71,9 +71,13 @@ def test_check(aggregator, instance, seed_data): aggregator.assert_all_metrics_covered() - tags = ['channel:{}'.format(common.CHANNEL)] + from six import iteritems + for sc, data in iteritems(aggregator._service_checks): + log.warning("{} {}".format(sc, data)) + + channel_tags = ['channel:{}'.format(common.CHANNEL)] aggregator.assert_service_check('ibm_mq.channel', check.OK, tags=tags) - tags = ['channel:{}'.format(common.BAD_CHANNEL)] + bad_channel_tags = ['channel:{}'.format(common.BAD_CHANNEL)] aggregator.assert_service_check('ibm_mq.channel', check.CRITICAL, tags=tags) From d341f04ade41149fb747bcd5cb695d123f21bc36 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 15:15:51 +0100 Subject: [PATCH 18/21] fix tags --- ibm_mq/tests/test_ibm_mq.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ibm_mq/tests/test_ibm_mq.py b/ibm_mq/tests/test_ibm_mq.py index 3eb0c09bfd7a7..240ef17fcc830 100644 --- a/ibm_mq/tests/test_ibm_mq.py +++ b/ibm_mq/tests/test_ibm_mq.py @@ -75,10 +75,12 @@ def test_check(aggregator, instance, seed_data): for sc, data in iteritems(aggregator._service_checks): log.warning("{} {}".format(sc, data)) - channel_tags = ['channel:{}'.format(common.CHANNEL)] - aggregator.assert_service_check('ibm_mq.channel', check.OK, tags=tags) - bad_channel_tags = ['channel:{}'.format(common.BAD_CHANNEL)] - aggregator.assert_service_check('ibm_mq.channel', check.CRITICAL, tags=tags) + tags = ['queue_manager:datadog', 'host:localhost', 'port:11414'] + + channel_tags = tags + ['channel:{}'.format(common.CHANNEL)] + aggregator.assert_service_check('ibm_mq.channel', check.OK, tags=channel_tags) + bad_channel_tags = tags + ['channel:{}'.format(common.BAD_CHANNEL)] + aggregator.assert_service_check('ibm_mq.channel', check.CRITICAL, tags=bad_channel_tags) @pytest.mark.usefixtures("dd_environment") From 59782e222f2e4cef88935e963fc6db3af62c9240 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 15:17:45 +0100 Subject: [PATCH 19/21] typo --- ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index ee9894772355b..ab72011a7c115 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -199,7 +199,7 @@ def _get_channel_status(self, queue_manager, channel, tags, config): response = pcf.MQCMD_INQUIRE_CHANNEL_STATUS(args) except pymqi.MQMIError as e: self.log.warning("Error getting CHANNEL stats {}".format(e)) - self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, channel_tags) + self.service_check(self.CHANNEL_SERVICE_CHECK, AgentCheck.CRITICAL, channel_tags) else: for channel_info in response: name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME] @@ -208,6 +208,6 @@ def _get_channel_status(self, queue_manager, channel, tags, config): # running = 3, stopped = 4 status = channel_info[pymqi.CMQCFC.MQIACH_CHANNEL_STATUS] if status == 3: - self.service_check(self.SERVICE_CHECK, AgentCheck.OK, channel_tags) + self.service_check(self.CHANNEL_SERVICE_CHECK, AgentCheck.OK, channel_tags) elif status == 4: - self.service_check(self.SERVICE_CHECK, AgentCheck.WARNING, channel_tags) + self.service_check(self.CHANNEL_SERVICE_CHECK, AgentCheck.WARNING, channel_tags) From 39bd61a8db94737c1b7ba690a9b972a2a008695b Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 15:19:51 +0100 Subject: [PATCH 20/21] no channel tag on channel metrics --- ibm_mq/datadog_checks/ibm_mq/config.py | 8 ++++++++ ibm_mq/datadog_checks/ibm_mq/ibm_mq.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ibm_mq/datadog_checks/ibm_mq/config.py b/ibm_mq/datadog_checks/ibm_mq/config.py index 41358ee22ac72..6bb0d4ff9a55f 100644 --- a/ibm_mq/datadog_checks/ibm_mq/config.py +++ b/ibm_mq/datadog_checks/ibm_mq/config.py @@ -74,3 +74,11 @@ def tags(self): "port:{}".format(self.port), "channel:{}".format(self.channel) ] + self.custom_tags + + @property + def tags_no_channel(self): + return [ + "queue_manager:{}".format(self.queue_manager_name), + "host:{}".format(self.host), + "port:{}".format(self.port), + ] + self.custom_tags diff --git a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py index ab72011a7c115..af8239bc91ab2 100644 --- a/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py +++ b/ibm_mq/datadog_checks/ibm_mq/ibm_mq.py @@ -48,7 +48,7 @@ def check(self, instance): self.service_check(self.SERVICE_CHECK, AgentCheck.CRITICAL, config.tags) return - self.get_pcf_channel_metrics(queue_manager, config.tags, config) + self.get_pcf_channel_metrics(queue_manager, config.tags_no_channel, config) self.discover_queues(queue_manager, config) From 686507a3b2128762fab80beb627c9806973e32e0 Mon Sep 17 00:00:00 2001 From: Greg Meyer Date: Mon, 25 Mar 2019 15:48:17 +0100 Subject: [PATCH 21/21] cleanup --- ibm_mq/tests/test_ibm_mq.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ibm_mq/tests/test_ibm_mq.py b/ibm_mq/tests/test_ibm_mq.py index 240ef17fcc830..219fb8bcaa683 100644 --- a/ibm_mq/tests/test_ibm_mq.py +++ b/ibm_mq/tests/test_ibm_mq.py @@ -71,10 +71,6 @@ def test_check(aggregator, instance, seed_data): aggregator.assert_all_metrics_covered() - from six import iteritems - for sc, data in iteritems(aggregator._service_checks): - log.warning("{} {}".format(sc, data)) - tags = ['queue_manager:datadog', 'host:localhost', 'port:11414'] channel_tags = tags + ['channel:{}'.format(common.CHANNEL)]