Skip to content

Commit dbef227

Browse files
authored
Live metric feature detection for statsbeat (#34752)
1 parent 071609d commit dbef227

File tree

5 files changed

+31
-8
lines changed

5 files changed

+31
-8
lines changed

sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
([#34673](https://github.com/Azure/azure-sdk-for-python/pull/34673))
99
- Add live metrics collection of cpu time/process memory
1010
([#34735](https://github.com/Azure/azure-sdk-for-python/pull/34735))
11+
- Add live metrics collection feature detection to statsbeat
12+
([#34752](https://github.com/Azure/azure-sdk-for-python/pull/34752))
1113

1214
### Breaking Changes
1315

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/_quickpulse/_live_metrics.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343
_get_log_record_document,
4444
_get_span_document,
4545
)
46+
from azure.monitor.opentelemetry.exporter.statsbeat._state import (
47+
set_statsbeat_live_metrics_feature_set,
48+
)
4649
from azure.monitor.opentelemetry.exporter._utils import (
4750
_get_sdk_version,
4851
_populate_part_a_fields,
@@ -60,6 +63,7 @@ def enable_live_metrics(**kwargs: Any) -> None:
6063
:rtype: None
6164
"""
6265
_QuickpulseManager(kwargs.get('connection_string'), kwargs.get('resource'))
66+
set_statsbeat_live_metrics_feature_set()
6367

6468

6569
# pylint: disable=protected-access,too-many-instance-attributes

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_state.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"INITIAL_SUCCESS": False,
1515
"SHUTDOWN": False,
1616
"CUSTOM_EVENTS_FEATURE_SET": False,
17+
"LIVE_METRICS_FEATURE_SET": False,
1718
}
1819
_STATSBEAT_STATE_LOCK = threading.Lock()
1920
_STATSBEAT_FAILURE_COUNT_THRESHOLD = 3
@@ -57,3 +58,12 @@ def get_statsbeat_custom_events_feature_set():
5758
def set_statsbeat_custom_events_feature_set():
5859
with _STATSBEAT_STATE_LOCK:
5960
_STATSBEAT_STATE["CUSTOM_EVENTS_FEATURE_SET"] = True
61+
62+
63+
def get_statsbeat_live_metrics_feature_set():
64+
return _STATSBEAT_STATE["LIVE_METRICS_FEATURE_SET"]
65+
66+
67+
def set_statsbeat_live_metrics_feature_set():
68+
with _STATSBEAT_STATE_LOCK:
69+
_STATSBEAT_STATE["LIVE_METRICS_FEATURE_SET"] = True

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/statsbeat/_statsbeat_metrics.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from azure.monitor.opentelemetry.exporter.statsbeat._state import (
3333
_REQUESTS_MAP_LOCK,
3434
_REQUESTS_MAP,
35+
get_statsbeat_live_metrics_feature_set,
3536
get_statsbeat_custom_events_feature_set,
3637
)
3738
from azure.monitor.opentelemetry.exporter import _utils
@@ -64,6 +65,7 @@ class _StatsbeatFeature:
6465
AAD = 2
6566
CUSTOM_EVENTS_EXTENSION = 4
6667
DISTRO = 8
68+
LIVE_METRICS = 16
6769

6870

6971
class _AttachTypes:
@@ -120,6 +122,8 @@ def __init__(
120122
self._feature |= _StatsbeatFeature.DISTRO
121123
if get_statsbeat_custom_events_feature_set():
122124
self._feature |= _StatsbeatFeature.CUSTOM_EVENTS_EXTENSION
125+
if get_statsbeat_live_metrics_feature_set():
126+
self._feature |= _StatsbeatFeature.LIVE_METRICS
123127
self._ikey = instrumentation_key
124128
self._meter_provider = meter_provider
125129
self._meter = self._meter_provider.get_meter(__name__)

sdk/monitor/azure-monitor-opentelemetry-exporter/tests/statsbeat/test_statsbeat.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ def setUp(self):
317317
_STATSBEAT_STATE["INITIAL_SUCCESS"] = False
318318
_STATSBEAT_STATE["SHUTDOWN"] = False
319319
_STATSBEAT_STATE["CUSTOM_EVENTS_FEATURE_SET"] = False
320+
_STATSBEAT_STATE["LIVE_METRICS_FEATURE_SET"] = False
320321

321322

322323
def test_statsbeat_metric_init(self):
@@ -748,11 +749,12 @@ def test_get_feature_metric_aad(self):
748749
self.assertEqual(_StatsbeatMetrics._FEATURE_ATTRIBUTES["feature"], _StatsbeatFeature.AAD)
749750

750751
# pylint: disable=protected-access
751-
def test_get_feature_metric_custom_events_init(self):
752+
@mock.patch("azure.monitor.opentelemetry.exporter.statsbeat._statsbeat_metrics.get_statsbeat_custom_events_feature_set")
753+
def test_get_feature_metric_custom_events(self, feature_mock):
754+
feature_mock.return_value = True
752755
mp = MeterProvider()
753756
ikey = "1aa11111-bbbb-1ccc-8ddd-eeeeffff3334"
754757
endpoint = "https://westus-1.in.applicationinsights.azure.com/"
755-
_STATSBEAT_STATE["CUSTOM_EVENTS_FEATURE_SET"] = True
756758
metric = _StatsbeatMetrics(
757759
mp,
758760
ikey,
@@ -770,11 +772,15 @@ def test_get_feature_metric_custom_events_init(self):
770772
self.assertEqual(obs.value, 1)
771773
self.assertEqual(obs.attributes, attributes)
772774

775+
773776
# pylint: disable=protected-access
774-
def test_get_feature_metric_custom_events_runtime(self):
777+
@mock.patch("azure.monitor.opentelemetry.exporter.statsbeat._statsbeat_metrics.get_statsbeat_live_metrics_feature_set")
778+
def test_get_feature_metric_live_metrics(self, feature_mock):
779+
feature_mock.return_value = True
775780
mp = MeterProvider()
776781
ikey = "1aa11111-bbbb-1ccc-8ddd-eeeeffff3334"
777782
endpoint = "https://westus-1.in.applicationinsights.azure.com/"
783+
_STATSBEAT_STATE["LIVE_METRICS_FEATURE_SET"] = True
778784
metric = _StatsbeatMetrics(
779785
mp,
780786
ikey,
@@ -785,16 +791,13 @@ def test_get_feature_metric_custom_events_runtime(self):
785791
)
786792
attributes = dict(_StatsbeatMetrics._COMMON_ATTRIBUTES)
787793
attributes.update(_StatsbeatMetrics._FEATURE_ATTRIBUTES)
788-
self.assertEqual(attributes["feature"], 0)
794+
self.assertEqual(attributes["feature"], 16)
789795
self.assertEqual(attributes["type"], _FEATURE_TYPES.FEATURE)
790-
_STATSBEAT_STATE["CUSTOM_EVENTS_FEATURE_SET"] = True
791796
observations = metric._get_feature_metric(options=None)
792-
attributes.update(_StatsbeatMetrics._FEATURE_ATTRIBUTES)
793-
self.assertEqual(attributes["feature"], 4)
794-
self.assertEqual(metric._feature, 4)
795797
for obs in observations:
796798
self.assertEqual(obs.value, 1)
797799
self.assertEqual(obs.attributes, attributes)
800+
_STATSBEAT_STATE["LIVE_METRICS_FEATURE_SET"] = False
798801

799802
# pylint: disable=protected-access
800803
def test_get_feature_metric_distro(self):

0 commit comments

Comments
 (0)