Skip to content

Commit 559840c

Browse files
author
Rakshith Bhyravabhotla
authored
Metrics should be gettable by name (#20878)
* Metrics should be gettable by name * lint
1 parent e6db587 commit 559840c

File tree

4 files changed

+74
-5
lines changed

4 files changed

+74
-5
lines changed

sdk/monitor/azure-monitor-query/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- Added `status` attribute to `LogsQueryResult`.
99
- Added `LogsQueryStatus` Enum to describe the status of a result.
1010
- Added a new `LogsTableRow` type that represents a single row in a table.
11+
- Items in `metrics` list in `MetricsResult` can now be accessed by metric names.
1112

1213
### Breaking Changes
1314

sdk/monitor/azure-monitor-query/azure/monitor/query/_models.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,15 @@ def _from_generated(cls, generated):
5757
)
5858

5959

60-
class LogsTableRow(object):
60+
class LogsTableRow(list):
6161
"""Represents a single row in logs table.
6262
6363
:ivar int index: The index of the row in the table
6464
"""
6565

6666
def __init__(self, **kwargs):
6767
# type: (Any) -> None
68+
super(LogsTableRow, self).__init__(**kwargs)
6869
_col_types = kwargs["col_types"]
6970
row = kwargs["row"]
7071
self._row = process_row(_col_types, row)
@@ -76,6 +77,12 @@ def __iter__(self):
7677
"""This will iterate over the row directly."""
7778
return iter(self._row)
7879

80+
def __len__(self):
81+
return len(self._row)
82+
83+
def __repr__(self):
84+
return repr(self._row)
85+
7986
def __getitem__(self, column):
8087
"""This type must be subscriptable directly to row.
8188
Must be gettableby both column name and row index
@@ -131,11 +138,34 @@ def _from_generated(cls, generated):
131138
granularity=generated.interval,
132139
namespace=generated.namespace,
133140
resource_region=generated.resourceregion,
134-
metrics=[
141+
metrics=MetricsList(metrics=[
135142
Metric._from_generated(m) for m in generated.value # pylint: disable=protected-access
136-
],
143+
]),
137144
)
138145

146+
class MetricsList(list):
147+
"""Custom list for metrics
148+
"""
149+
def __init__(self, **kwargs):
150+
super(MetricsList, self).__init__(**kwargs)
151+
self._metrics = kwargs['metrics']
152+
self._metric_names = {val.name: ind for ind, val in enumerate(self._metrics)}
153+
154+
def __iter__(self):
155+
return iter(self._metrics)
156+
157+
def __len__(self):
158+
return len(self._metrics)
159+
160+
def __repr__(self):
161+
return repr(self._metrics)
162+
163+
def __getitem__(self, metric):
164+
try:
165+
return self._metrics[metric]
166+
except TypeError: # TypeError: list indices must be integers or slices, not str
167+
return self._metrics[self._metric_names[metric]]
168+
139169

140170
class LogsBatchQuery(object):
141171
"""A single request in a batch.

sdk/monitor/azure-monitor-query/tests/async/test_metrics_client_async.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import pytest
33
import os
44
from azure.identity.aio import ClientSecretCredential
5-
from azure.monitor.query import MetricAggregationType
5+
from azure.monitor.query import MetricAggregationType, Metric
66
from azure.monitor.query.aio import MetricsQueryClient
77

88
def _credential():
@@ -42,6 +42,26 @@ async def test_metrics_granularity():
4242
assert response
4343
assert response.granularity == timedelta(minutes=5)
4444

45+
46+
@pytest.mark.live_test_only
47+
@pytest.mark.asyncio
48+
async def test_metrics_list():
49+
credential = _credential()
50+
client = MetricsQueryClient(credential)
51+
response = await client.query_resource(
52+
os.environ['METRICS_RESOURCE_URI'],
53+
metric_names=["MatchedEventCount"],
54+
timespan=timedelta(days=1),
55+
granularity=timedelta(minutes=5),
56+
aggregations=[MetricAggregationType.COUNT]
57+
)
58+
assert response
59+
metrics = response.metrics
60+
assert len(metrics) == 1
61+
assert metrics[0].__class__ == Metric
62+
assert metrics['MatchedEventCount'].__class__ == Metric
63+
assert metrics['MatchedEventCount'] == metrics[0]
64+
4565
@pytest.mark.live_test_only
4666
@pytest.mark.asyncio
4767
async def test_metrics_namespaces():

sdk/monitor/azure-monitor-query/tests/test_metrics_client.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import os
33
from datetime import datetime, timedelta
44
from azure.identity import ClientSecretCredential
5-
from azure.monitor.query import MetricsQueryClient, MetricAggregationType
5+
from azure.monitor.query import MetricsQueryClient, MetricAggregationType, Metric
66

77
def _credential():
88
credential = ClientSecretCredential(
@@ -39,6 +39,24 @@ def test_metrics_granularity():
3939
assert response
4040
assert response.granularity == timedelta(minutes=5)
4141

42+
@pytest.mark.live_test_only
43+
def test_metrics_list():
44+
credential = _credential()
45+
client = MetricsQueryClient(credential)
46+
response = client.query_resource(
47+
os.environ['METRICS_RESOURCE_URI'],
48+
metric_names=["MatchedEventCount"],
49+
timespan=timedelta(days=1),
50+
granularity=timedelta(minutes=5),
51+
aggregations=[MetricAggregationType.COUNT]
52+
)
53+
assert response
54+
metrics = response.metrics
55+
assert len(metrics) == 1
56+
assert metrics[0].__class__ == Metric
57+
assert metrics['MatchedEventCount'].__class__ == Metric
58+
assert metrics['MatchedEventCount'] == metrics[0]
59+
4260
@pytest.mark.live_test_only
4361
def test_metrics_namespaces():
4462
client = MetricsQueryClient(_credential())

0 commit comments

Comments
 (0)