Skip to content

Commit a237b2c

Browse files
maxkuzkinrimey
authored andcommitted
Add support for the comparison filters of Google Monitoring API (#2234)
* Add support for the comparison filters of Google Monitoring API Google Monitoring API filters support <,<=,>,>= operators as described in its documentation: https://cloud.google.com/monitoring/api/v3/filters. Current version of the library only has mappings of: 1. ’{key}_prefix:{value}' -> '{key} = starts_with("{value}")' 2. ’{key}_suffix:{value}' -> '{key} = ends_with("{value}")' This patch introduces additional mappings of: 3. ’{key}_greater:{value}' -> '{key} > {value}' 4. ’{key}_greaterequal:{value}' -> '{key} >= {value}' 5. ’{key}_less:{value}' -> '{key} < {value}' 6. ’{key}_lessequal:{value}' -> '{key} <= {value}' So that it is possible, for example, to filter based on the response_code values range, as shown below: metric.type = "appengine.googleapis.com/http/server/response_count" AND metric.label.response_code < 600 AND metric.label.response_code >= 500
1 parent efe359a commit a237b2c

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

gcloud/monitoring/query.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,25 @@ def select_metrics(self, *args, **kwargs):
313313
314314
metric.label.<label> = ends_with("<value>")
315315
316+
If the label's value type is ``INT64``, a similar notation can be
317+
used to express inequalities:
318+
319+
``<label>_less=<value>`` generates::
320+
321+
metric.label.<label> < <value>
322+
323+
``<label>_lessequal=<value>`` generates::
324+
325+
metric.label.<label> <= <value>
326+
327+
``<label>_greater=<value>`` generates::
328+
329+
metric.label.<label> > <value>
330+
331+
``<label>_greaterequal=<value>`` generates::
332+
333+
metric.label.<label> >= <value>
334+
316335
:type args: tuple
317336
:param args: Raw filter expression strings to include in the
318337
conjunction. If just one is provided and no keyword arguments
@@ -637,7 +656,8 @@ def _build_label_filter(category, *args, **kwargs):
637656
continue
638657

639658
suffix = None
640-
if key.endswith('_prefix') or key.endswith('_suffix'):
659+
if key.endswith(('_prefix', '_suffix', '_greater', '_greaterequal',
660+
'_less', '_lessequal')):
641661
key, suffix = key.rsplit('_', 1)
642662

643663
if category == 'resource' and key == 'resource_type':
@@ -649,6 +669,14 @@ def _build_label_filter(category, *args, **kwargs):
649669
term = '{key} = starts_with("{value}")'
650670
elif suffix == 'suffix':
651671
term = '{key} = ends_with("{value}")'
672+
elif suffix == 'greater':
673+
term = '{key} > {value}'
674+
elif suffix == 'greaterequal':
675+
term = '{key} >= {value}'
676+
elif suffix == 'less':
677+
term = '{key} < {value}'
678+
elif suffix == 'lessequal':
679+
term = '{key} <= {value}'
652680
else:
653681
term = '{key} = "{value}"'
654682

gcloud/monitoring/test_query.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,28 @@ def test_metric_labels(self):
557557
)
558558
self.assertEqual(actual, expected)
559559

560+
def test_metric_label_response_code_greater_less(self):
561+
actual = self._callFUT(
562+
'metric',
563+
response_code_greater=500,
564+
response_code_less=600)
565+
expected = (
566+
'metric.label.response_code < 600'
567+
' AND metric.label.response_code > 500'
568+
)
569+
self.assertEqual(actual, expected)
570+
571+
def test_metric_label_response_code_greater_less_equal(self):
572+
actual = self._callFUT(
573+
'metric',
574+
response_code_greaterequal=500,
575+
response_code_lessequal=600)
576+
expected = (
577+
'metric.label.response_code <= 600'
578+
' AND metric.label.response_code >= 500'
579+
)
580+
self.assertEqual(actual, expected)
581+
560582
def test_resource_labels(self):
561583
actual = self._callFUT(
562584
'resource',

0 commit comments

Comments
 (0)