Skip to content

Commit

Permalink
Add selected_message_queues flag to filter message queues and impro…
Browse files Browse the repository at this point in the history
…ve performances (#12808)

Add selected_message_queues flag + tests
  • Loading branch information
amenasria authored and steveny91 committed Oct 27, 2022
1 parent ff5f088 commit 49792f3
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 3 deletions.
17 changes: 17 additions & 0 deletions ibm_i/assets/configuration/spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,21 @@ files:
- name: "job_queue"
- name: "message_queue_info"
default: *queries_default
- name: message_queue_info
description: |
A configuration mapping for the message_queue_info query.
selected_message_queues restricts the message_queue_info query to a subset of the queues.
This can reduce the CPU usage on the target IBM i machine. By default no filter is applied.
value:
example:
selected_message_queues:
- QSYSOPR
- QPGMR
type: object
properties:
- name: selected_message_queues
type: array
items:
type: string
- template: instances/default
4 changes: 4 additions & 0 deletions ibm_i/datadog_checks/ibm_i/config_models/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ def instance_job_query_timeout(field, value):
return 240


def instance_message_queue_info(field, value):
return get_default_field_value(field, value)


def instance_metric_patterns(field, value):
return get_default_field_value(field, value)

Expand Down
8 changes: 8 additions & 0 deletions ibm_i/datadog_checks/ibm_i/config_models/instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@
from . import defaults, validators


class MessageQueueInfo(BaseModel):
class Config:
allow_mutation = False

selected_message_queues: Optional[Sequence[str]]


class MetricPatterns(BaseModel):
class Config:
allow_mutation = False
Expand All @@ -44,6 +51,7 @@ class Config:
empty_default_hostname: Optional[bool]
hostname: Optional[str] = Field(None, max_length=255, min_length=1)
job_query_timeout: Optional[int] = Field(None, gt=0)
message_queue_info: Optional[MessageQueueInfo]
metric_patterns: Optional[MetricPatterns]
min_collection_interval: Optional[float]
password: Optional[str]
Expand Down
11 changes: 11 additions & 0 deletions ibm_i/datadog_checks/ibm_i/data/conf.yaml.example
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,17 @@ instances:
# - name: job_queue
# - name: message_queue_info

## @param message_queue_info - mapping - optional
## A configuration mapping for the message_queue_info query.
##
## selected_message_queues restricts the message_queue_info query to a subset of the queues.
## This can reduce the CPU usage on the target IBM i machine. By default no filter is applied.
#
# message_queue_info:
# selected_message_queues:
# - QSYSOPR
# - QPGMR

## @param tags - list of strings - optional
## A list of tags to attach to every metric and service check emitted by this instance.
##
Expand Down
19 changes: 16 additions & 3 deletions ibm_i/datadog_checks/ibm_i/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,13 +257,24 @@ def get_job_queue_info(timeout):
}


def get_message_queue_info(timeout, sev):
def get_message_queue_info(timeout, sev, message_queue_info):

# Getting the selected message queues if some were passed in the config file
message_queues_list = []
if hasattr(message_queue_info, 'selected_message_queues') and message_queue_info.selected_message_queues:
message_queues_list = [f"'{elt}'" for elt in message_queue_info.selected_message_queues]

# Building the message queues filter
message_queues_filter = (
f"WHERE MESSAGE_QUEUE_NAME IN ({', '.join(message_queues_list)}) " if message_queues_list else ""
)

return {
'name': 'message_queue_info',
'query': {
'text': (
f'SELECT MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY, COUNT(*), SUM(CASE WHEN SEVERITY >= {sev} THEN 1 ELSE 0 END) ' # noqa:E501
'FROM QSYS2.MESSAGE_QUEUE_INFO GROUP BY MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY'
f'FROM QSYS2.MESSAGE_QUEUE_INFO {message_queues_filter}GROUP BY MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY' # noqa:E501
),
'timeout': timeout,
},
Expand All @@ -287,5 +298,7 @@ def query_map(config: InstanceConfig):
"job_memory_usage": get_job_memory_usage(config.job_query_timeout),
"memory_info": get_memory_info(config.query_timeout),
"job_queue": get_job_queue_info(config.query_timeout),
"message_queue_info": get_message_queue_info(config.system_mq_query_timeout, config.severity_threshold),
"message_queue_info": get_message_queue_info(
config.system_mq_query_timeout, config.severity_threshold, config.message_queue_info
),
}
52 changes: 52 additions & 0 deletions ibm_i/tests/test_sql_queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# (C) Datadog, Inc. 2021-present
# All rights reserved
# Licensed under a 3-clause BSD style license (see LICENSE)

import pytest

from datadog_checks.ibm_i.config_models import InstanceConfig
from datadog_checks.ibm_i.config_models.instance import MessageQueueInfo
from datadog_checks.ibm_i.queries import query_map


@pytest.mark.parametrize(
"selected_message_queues,expected",
[
(
[],
'SELECT MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY, COUNT(*), SUM(CASE WHEN SEVERITY >= 50 THEN 1 ELSE 0 END) ' # noqa:E501
'FROM QSYS2.MESSAGE_QUEUE_INFO GROUP BY MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY',
),
(
['QSYSOPR'],
'SELECT MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY, COUNT(*), SUM(CASE WHEN SEVERITY >= 50 THEN 1 ELSE 0 END) ' # noqa:E501
'FROM QSYS2.MESSAGE_QUEUE_INFO WHERE MESSAGE_QUEUE_NAME IN (\'QSYSOPR\') GROUP BY MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY', # noqa:E501
),
(
['QSYSOPR', 'QPGMR', 'CECUSER'],
'SELECT MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY, COUNT(*), SUM(CASE WHEN SEVERITY >= 50 THEN 1 ELSE 0 END) ' # noqa:E501
'FROM QSYS2.MESSAGE_QUEUE_INFO WHERE MESSAGE_QUEUE_NAME IN (\'QSYSOPR\', \'QPGMR\', \'CECUSER\') GROUP BY MESSAGE_QUEUE_NAME, MESSAGE_QUEUE_LIBRARY', # noqa:E501
),
],
)
def test_get_message_queue_info(selected_message_queues, expected):
instance_conf_attr = {
"query_timeout": 1,
"job_query_timeout": 2,
"system_mq_query_timeout": 3,
"severity_threshold": 50,
}
instance_conf = InstanceConfig(
**instance_conf_attr,
message_queue_info=MessageQueueInfo(selected_message_queues=selected_message_queues),
)
qmap_output = query_map(instance_conf)
assert qmap_output['message_queue_info']['name'] == 'message_queue_info'
assert qmap_output['message_queue_info']['columns'] == [
{'name': 'message_queue_name', 'type': 'tag'},
{'name': 'message_queue_library', 'type': 'tag'},
{'name': 'ibm_i.message_queue.size', 'type': 'gauge'},
{'name': 'ibm_i.message_queue.critical_size', 'type': 'gauge'},
]
assert qmap_output['message_queue_info']['query']['text'] == expected
assert qmap_output['message_queue_info']['query']['timeout'] == 3

0 comments on commit 49792f3

Please sign in to comment.