diff --git a/azure_monitor/README.md b/azure_monitor/README.md index 112d3ff..e31d400 100644 --- a/azure_monitor/README.md +++ b/azure_monitor/README.md @@ -152,9 +152,9 @@ requests_counter = meter.create_metric( label_keys=("environment",), ) -testing_label_set = meter.get_label_set({"environment": "testing"}) +testing_labels = {"environment": "testing"} -requests_counter.add(25, testing_label_set) +requests_counter.add(25, testing_labels) time.sleep(100) ``` diff --git a/azure_monitor/examples/metrics/auto_collector.py b/azure_monitor/examples/metrics/auto_collector.py index cd899d7..75b1230 100644 --- a/azure_monitor/examples/metrics/auto_collector.py +++ b/azure_monitor/examples/metrics/auto_collector.py @@ -14,10 +14,10 @@ ) controller = PushController(meter, exporter, 5) -testing_label_set = meter.get_label_set({"environment": "testing"}) +testing_label_set = {"environment": "testing"} # Automatically collect standard metrics -auto_collection = AutoCollection(meter=meter, label_set=testing_label_set) +auto_collection = AutoCollection(meter=meter, labels=testing_label_set) # To configure a separate export interval specific for standard metrics # meter_standard = metrics.get_meter(__name__ + "_standard") diff --git a/azure_monitor/examples/metrics/client.py b/azure_monitor/examples/metrics/client.py deleted file mode 100644 index 57bec03..0000000 --- a/azure_monitor/examples/metrics/client.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -# pylint: disable=import-error -# pylint: disable=no-member -# pylint: disable=no-name-in-module -import requests -from opentelemetry import trace -from opentelemetry.ext import http_requests -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import BatchExportSpanProcessor - -from azure_monitor import AzureMonitorSpanExporter - -trace.set_tracer_provider(TracerProvider()) -tracer = trace.get_tracer(__name__) -http_requests.enable(trace.get_tracer_provider()) -span_processor = BatchExportSpanProcessor( - AzureMonitorSpanExporter( - connection_string="InstrumentationKey=" - ) -) -trace.get_tracer_provider().add_span_processor(span_processor) - -response = requests.get(url="http://google.com") - -input("Press any key to exit...") diff --git a/azure_monitor/examples/metrics/observer.py b/azure_monitor/examples/metrics/observer.py new file mode 100644 index 0000000..1ce8332 --- /dev/null +++ b/azure_monitor/examples/metrics/observer.py @@ -0,0 +1,50 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +import psutil +from opentelemetry import metrics +from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics.export.controller import PushController + +from azure_monitor import AzureMonitorMetricsExporter + +metrics.set_meter_provider(MeterProvider()) +meter = metrics.get_meter(__name__) +exporter = AzureMonitorMetricsExporter( + connection_string="InstrumentationKey=" +) +controller = PushController(meter=meter, exporter=exporter, interval=2) + + +# Callback to gather cpu usage +def get_cpu_usage_callback(observer): + for (number, percent) in enumerate(psutil.cpu_percent(percpu=True)): + labels = {"cpu_number": str(number)} + observer.observe(percent, labels) + + +meter.register_observer( + callback=get_cpu_usage_callback, + name="cpu_percent", + description="per-cpu usage", + unit="1", + value_type=float, + label_keys=("cpu_number",), +) + + +# Callback to gather RAM memory usage +def get_ram_usage_callback(observer): + ram_percent = psutil.virtual_memory().percent + observer.observe(ram_percent, {}) + + +meter.register_observer( + callback=get_ram_usage_callback, + name="ram_percent", + description="RAM memory usage", + unit="1", + value_type=float, + label_keys=(), +) + +input("Metrics will be printed soon. Press a key to finish...\n") diff --git a/azure_monitor/examples/metrics/simple.py b/azure_monitor/examples/metrics/simple.py index 3547764..5c11f79 100644 --- a/azure_monitor/examples/metrics/simple.py +++ b/azure_monitor/examples/metrics/simple.py @@ -22,8 +22,8 @@ label_keys=("environment",), ) -testing_label_set = meter.get_label_set({"environment": "testing"}) +testing_labels = {"environment": "testing"} -requests_counter.add(25, testing_label_set) +requests_counter.add(25, testing_labels) input("Press any key to exit...") diff --git a/azure_monitor/src/azure_monitor/export/metrics/__init__.py b/azure_monitor/src/azure_monitor/export/metrics/__init__.py index 98d7369..d7b987b 100644 --- a/azure_monitor/src/azure_monitor/export/metrics/__init__.py +++ b/azure_monitor/src/azure_monitor/export/metrics/__init__.py @@ -60,12 +60,12 @@ def _metric_to_envelope( if not metric_record: return None - # TODO: Opentelemetry does not have last updated timestamp for observer - # type metrics yet. + # TODO: Opentelemetry has timestamp for Observer, awaiting release + # TODO: Timestamp info is also moved into aggregators _time = time_ns() if isinstance(metric_record.metric, Metric): _time = metric_record.metric.bind( - metric_record.label_set + dict(metric_record.labels) ).last_update_timestamp envelope = protocol.Envelope( ikey=self.options.instrumentation_key, @@ -93,7 +93,7 @@ def _metric_to_envelope( ) properties = {} - for label_tuple in metric_record.label_set.labels: + for label_tuple in metric_record.labels: properties[label_tuple[0]] = label_tuple[1] data = protocol.MetricData(metrics=[data_point], properties=properties) envelope.data = protocol.Data(base_data=data, base_type="MetricData") diff --git a/azure_monitor/src/azure_monitor/sdk/auto_collection/__init__.py b/azure_monitor/src/azure_monitor/sdk/auto_collection/__init__.py index b7ebe41..949c015 100644 --- a/azure_monitor/src/azure_monitor/sdk/auto_collection/__init__.py +++ b/azure_monitor/src/azure_monitor/sdk/auto_collection/__init__.py @@ -1,7 +1,9 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. # -from opentelemetry.metrics import LabelSet, Meter +from typing import Dict + +from opentelemetry.metrics import Meter from azure_monitor.sdk.auto_collection.dependency_metrics import ( DependencyMetrics, @@ -25,10 +27,10 @@ class AutoCollection: Args: meter: OpenTelemetry Meter - label_set: OpenTelemetry label set + labels: Dictionary of labels """ - def __init__(self, meter: Meter, label_set: LabelSet): - self._performance_metrics = PerformanceMetrics(meter, label_set) - self._dependency_metrics = DependencyMetrics(meter, label_set) - self._request_metrics = RequestMetrics(meter, label_set) + def __init__(self, meter: Meter, labels: Dict[str, str]): + self._performance_metrics = PerformanceMetrics(meter, labels) + self._dependency_metrics = DependencyMetrics(meter, labels) + self._request_metrics = RequestMetrics(meter, labels) diff --git a/azure_monitor/src/azure_monitor/sdk/auto_collection/dependency_metrics.py b/azure_monitor/src/azure_monitor/sdk/auto_collection/dependency_metrics.py index 4b86a13..5600612 100644 --- a/azure_monitor/src/azure_monitor/sdk/auto_collection/dependency_metrics.py +++ b/azure_monitor/src/azure_monitor/sdk/auto_collection/dependency_metrics.py @@ -2,11 +2,11 @@ # Licensed under the MIT License. import threading import time +from typing import Dict import requests from opentelemetry import context from opentelemetry.metrics import Meter -from opentelemetry.sdk.metrics import LabelSet dependency_map = dict() _dependency_lock = threading.Lock() @@ -30,12 +30,12 @@ class DependencyMetrics: Args: meter: OpenTelemetry Meter - label_set: OpenTelemetry label set + labels: Dictionary of labels """ - def __init__(self, meter: Meter, label_set: LabelSet): + def __init__(self, meter: Meter, labels: Dict[str, str]): self._meter = meter - self._label_set = label_set + self._labels = labels # Patch requests requests.Session.request = dependency_patch meter.register_observer( @@ -70,8 +70,8 @@ def _track_dependency_rate(self, observer) -> None: dependency_map["last_time"] = current_time dependency_map["last_count"] = current_count dependency_map["last_result"] = result - observer.observe(int(result), self._label_set) + observer.observe(int(result), self._labels) except ZeroDivisionError: # If elapsed_seconds is 0, exporter call made too close to previous # Return the previous result if this is the case - observer.observe(int(last_result), self._label_set) + observer.observe(int(last_result), self._labels) diff --git a/azure_monitor/src/azure_monitor/sdk/auto_collection/performance_metrics.py b/azure_monitor/src/azure_monitor/sdk/auto_collection/performance_metrics.py index 0a66fce..9e1927a 100644 --- a/azure_monitor/src/azure_monitor/sdk/auto_collection/performance_metrics.py +++ b/azure_monitor/src/azure_monitor/sdk/auto_collection/performance_metrics.py @@ -1,10 +1,10 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. import logging +from typing import Dict import psutil from opentelemetry.metrics import Meter -from opentelemetry.sdk.metrics import LabelSet logger = logging.getLogger(__name__) PROCESS = psutil.Process() @@ -18,12 +18,12 @@ class PerformanceMetrics: Args: meter: OpenTelemetry Meter - label_set: OpenTelemetry label set + labels: Dictionary of labels """ - def __init__(self, meter: Meter, label_set: LabelSet): + def __init__(self, meter: Meter, labels: Dict[str, str]): self._meter = meter - self._label_set = label_set + self._labels = labels # Create performance metrics meter.register_observer( callback=self._track_cpu, @@ -63,7 +63,7 @@ def _track_cpu(self, observer) -> None: from 0.0 to 100.0 inclusive. """ cpu_times_percent = psutil.cpu_times_percent() - observer.observe(100.0 - cpu_times_percent.idle, self._label_set) + observer.observe(100.0 - cpu_times_percent.idle, self._labels) def _track_memory(self, observer) -> None: """ Track Memory @@ -71,7 +71,7 @@ def _track_memory(self, observer) -> None: Available memory is defined as memory that can be given instantly to processes without the system going into swap. """ - observer.observe(psutil.virtual_memory().available, self._label_set) + observer.observe(psutil.virtual_memory().available, self._labels) def _track_process_cpu(self, observer) -> None: """ Track Process CPU time @@ -84,9 +84,7 @@ def _track_process_cpu(self, observer) -> None: # CPU cores, the returned value of cpu_percent() can be > 100.0. We # normalize the cpu process using the number of logical CPUs cpu_count = psutil.cpu_count(logical=True) - observer.observe( - PROCESS.cpu_percent() / cpu_count, self._label_set - ) + observer.observe(PROCESS.cpu_percent() / cpu_count, self._labels) except Exception: # pylint: disable=broad-except logger.exception("Error handling get process cpu usage.") @@ -97,6 +95,6 @@ def _track_process_memory(self, observer) -> None: processes without the system going into swap. """ try: - observer.observe(PROCESS.memory_info().rss, self._label_set) + observer.observe(PROCESS.memory_info().rss, self._labels) except Exception: # pylint: disable=broad-except logger.exception("Error handling get process private bytes.") diff --git a/azure_monitor/src/azure_monitor/sdk/auto_collection/request_metrics.py b/azure_monitor/src/azure_monitor/sdk/auto_collection/request_metrics.py index 2505cbe..8647ec6 100644 --- a/azure_monitor/src/azure_monitor/sdk/auto_collection/request_metrics.py +++ b/azure_monitor/src/azure_monitor/sdk/auto_collection/request_metrics.py @@ -4,8 +4,9 @@ import threading import time from http.server import HTTPServer +from typing import Dict -from opentelemetry.metrics import LabelSet, Meter +from opentelemetry.metrics import Meter logger = logging.getLogger(__name__) @@ -59,12 +60,12 @@ class RequestMetrics: Args: meter: OpenTelemetry Meter - label_set: OpenTelemetry label set + labels: Dictionary of labels """ - def __init__(self, meter: Meter, label_set: LabelSet): + def __init__(self, meter: Meter, labels: Dict[str, str]): self._meter = meter - self._label_set = label_set + self._labels = labels # Patch the HTTPServer handler to track request information HTTPServer.__init__ = server_patch @@ -102,13 +103,11 @@ def _track_request_duration(self, observer) -> None: requests_map["last_average_duration"] = result requests_map["last_duration"] = requests_map.get("duration", 0) # Convert to milliseconds - observer.observe(int(result * 1000.0), self._label_set) + observer.observe(int(result * 1000.0), self._labels) except ZeroDivisionError: # If interval_count is 0, exporter call made too close to previous # Return the previous result if this is the case - observer.observe( - int(last_average_duration * 1000.0), self._label_set - ) + observer.observe(int(last_average_duration * 1000.0), self._labels) def _track_request_rate(self, observer) -> None: """ Track Request execution rate @@ -134,8 +133,8 @@ def _track_request_rate(self, observer) -> None: requests_map["last_time"] = current_time requests_map["last_count"] = requests_map.get("count", 0) requests_map["last_rate"] = result - observer.observe(int(result), self._label_set) + observer.observe(int(result), self._labels) except ZeroDivisionError: # If elapsed_seconds is 0, exporter call made too close to previous # Return the previous result if this is the case - observer.observe(int(last_rate), self._label_set) + observer.observe(int(last_rate), self._labels) diff --git a/azure_monitor/src/azure_monitor/storage.py b/azure_monitor/src/azure_monitor/storage.py index d01c1d8..5c554cb 100644 --- a/azure_monitor/src/azure_monitor/storage.py +++ b/azure_monitor/src/azure_monitor/storage.py @@ -187,16 +187,19 @@ def put(self, data, lease_period=0, silent=False): def _check_storage_size(self): size = 0 + # pylint: disable=unused-variable for dirpath, dirnames, filenames in os.walk(self.path): - for f in filenames: - fp = os.path.join(dirpath, f) + for filename in filenames: + path = os.path.join(dirpath, filename) # skip if it is symbolic link - if not os.path.islink(fp): + if not os.path.islink(path): try: - size += os.path.getsize(fp) + size += os.path.getsize(path) except OSError: - logger.error("Path %s does not exist or is " - "inaccessible.", fp) + logger.error( + "Path %s does not exist or is " "inaccessible.", + path, + ) continue if size >= self.max_size: logger.warning( @@ -204,7 +207,7 @@ def _check_storage_size(self): "reached. Currently at %fKB. Telemetry will be " "lost. Please consider increasing the value of " "'storage_max_size' in exporter config.", - format(size/1024) + format(size / 1024), ) return False return True diff --git a/azure_monitor/tests/auto_collection/test_auto_collection.py b/azure_monitor/tests/auto_collection/test_auto_collection.py index 301d249..c965d4b 100644 --- a/azure_monitor/tests/auto_collection/test_auto_collection.py +++ b/azure_monitor/tests/auto_collection/test_auto_collection.py @@ -16,8 +16,7 @@ class TestAutoCollection(unittest.TestCase): def setUpClass(cls): metrics.set_meter_provider(MeterProvider()) cls._meter = metrics.get_meter(__name__) - kvp = {"environment": "staging"} - cls._test_label_set = cls._meter.get_label_set(kvp) + cls._test_labels = tuple({"environment": "staging"}.items()) @classmethod def tearDownClass(cls): @@ -36,17 +35,13 @@ def test_constructor( self, mock_performance, mock_dependencies, mock_requests ): """Test the constructor.""" - AutoCollection(meter=self._meter, label_set=self._test_label_set) + AutoCollection(meter=self._meter, labels=self._test_labels) self.assertEqual(mock_performance.called, True) self.assertEqual(mock_dependencies.called, True) self.assertEqual(mock_requests.called, True) self.assertEqual(mock_performance.call_args[0][0], self._meter) - self.assertEqual( - mock_performance.call_args[0][1], self._test_label_set - ) + self.assertEqual(mock_performance.call_args[0][1], self._test_labels) self.assertEqual(mock_dependencies.call_args[0][0], self._meter) - self.assertEqual( - mock_dependencies.call_args[0][1], self._test_label_set - ) + self.assertEqual(mock_dependencies.call_args[0][1], self._test_labels) self.assertEqual(mock_requests.call_args[0][0], self._meter) - self.assertEqual(mock_requests.call_args[0][1], self._test_label_set) + self.assertEqual(mock_requests.call_args[0][1], self._test_labels) diff --git a/azure_monitor/tests/auto_collection/test_dependency_metrics.py b/azure_monitor/tests/auto_collection/test_dependency_metrics.py index fe273df..df0a8a1 100644 --- a/azure_monitor/tests/auto_collection/test_dependency_metrics.py +++ b/azure_monitor/tests/auto_collection/test_dependency_metrics.py @@ -21,8 +21,7 @@ class TestDependencyMetrics(unittest.TestCase): def setUpClass(cls): metrics.set_meter_provider(MeterProvider()) cls._meter = metrics.get_meter(__name__) - kvp = {"environment": "staging"} - cls._test_label_set = cls._meter.get_label_set(kvp) + cls._test_labels = {"environment": "staging"} @classmethod def tearDown(cls): @@ -38,10 +37,10 @@ def setUp(self): def test_constructor(self): mock_meter = mock.Mock() metrics_collector = dependency_metrics.DependencyMetrics( - meter=mock_meter, label_set=self._test_label_set + meter=mock_meter, labels=self._test_labels ) self.assertEqual(metrics_collector._meter, mock_meter) - self.assertEqual(metrics_collector._label_set, self._test_label_set) + self.assertEqual(metrics_collector._labels, self._test_labels) self.assertEqual(mock_meter.register_observer.call_count, 1) mock_meter.register_observer.assert_called_with( callback=metrics_collector._track_dependency_rate, @@ -55,7 +54,7 @@ def test_constructor(self): def test_track_dependency_rate(self, time_mock): time_mock.time.return_value = 100 metrics_collector = dependency_metrics.DependencyMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) obs = Observer( callback=metrics_collector._track_dependency_rate, @@ -68,13 +67,15 @@ def test_track_dependency_rate(self, time_mock): dependency_metrics.dependency_map["last_time"] = 98 dependency_metrics.dependency_map["count"] = 4 metrics_collector._track_dependency_rate(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 2) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 2 + ) @mock.patch("azure_monitor.sdk.auto_collection.dependency_metrics.time") def test_track_dependency_rate_time_none(self, time_mock): time_mock.time.return_value = 100 metrics_collector = dependency_metrics.DependencyMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) dependency_metrics.dependency_map["last_time"] = None obs = Observer( @@ -86,13 +87,15 @@ def test_track_dependency_rate_time_none(self, time_mock): meter=self._meter, ) metrics_collector._track_dependency_rate(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 0) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 0 + ) @mock.patch("azure_monitor.sdk.auto_collection.dependency_metrics.time") def test_track_dependency_rate_error(self, time_mock): time_mock.time.return_value = 100 metrics_collector = dependency_metrics.DependencyMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) dependency_metrics.dependency_map["last_time"] = 100 dependency_metrics.dependency_map["last_result"] = 5 @@ -105,7 +108,9 @@ def test_track_dependency_rate_error(self, time_mock): meter=self._meter, ) metrics_collector._track_dependency_rate(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 5) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 5 + ) @mock.patch( "azure_monitor.sdk.auto_collection.dependency_metrics.ORIGINAL_REQUEST" diff --git a/azure_monitor/tests/auto_collection/test_performance_metrics.py b/azure_monitor/tests/auto_collection/test_performance_metrics.py index 6637913..ec81d2a 100644 --- a/azure_monitor/tests/auto_collection/test_performance_metrics.py +++ b/azure_monitor/tests/auto_collection/test_performance_metrics.py @@ -24,8 +24,7 @@ class TestPerformanceMetrics(unittest.TestCase): def setUpClass(cls): metrics.set_meter_provider(MeterProvider()) cls._meter = metrics.get_meter(__name__) - kvp = {"environment": "staging"} - cls._test_label_set = cls._meter.get_label_set(kvp) + cls._test_labels = {"environment": "staging"} @classmethod def tearDownClass(cls): @@ -34,11 +33,11 @@ def tearDownClass(cls): def test_constructor(self): mock_meter = mock.Mock() performance_metrics_collector = PerformanceMetrics( - meter=mock_meter, label_set=self._test_label_set + meter=mock_meter, labels=self._test_labels ) self.assertEqual(performance_metrics_collector._meter, mock_meter) self.assertEqual( - performance_metrics_collector._label_set, self._test_label_set + performance_metrics_collector._labels, self._test_labels ) self.assertEqual(mock_meter.register_observer.call_count, 4) reg_obs_calls = mock_meter.register_observer.call_args_list @@ -73,7 +72,7 @@ def test_constructor(self): def test_track_cpu(self): performance_metrics_collector = PerformanceMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) with mock.patch("psutil.cpu_times_percent") as processor_mock: cpu = collections.namedtuple("cpu", "idle") @@ -89,13 +88,13 @@ def test_track_cpu(self): ) performance_metrics_collector._track_cpu(obs) self.assertEqual( - obs.aggregators[self._test_label_set].current, 5.5 + obs.aggregators[tuple(self._test_labels.items())].current, 5.5 ) @mock.patch("psutil.virtual_memory") def test_track_memory(self, psutil_mock): performance_metrics_collector = PerformanceMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) memory = collections.namedtuple("memory", "available") vmem = memory(available=100) @@ -109,7 +108,9 @@ def test_track_memory(self, psutil_mock): meter=self._meter, ) performance_metrics_collector._track_memory(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 100) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 100 + ) @mock.patch("azure_monitor.sdk.auto_collection.performance_metrics.psutil") def test_track_process_cpu(self, psutil_mock): @@ -117,7 +118,7 @@ def test_track_process_cpu(self, psutil_mock): "azure_monitor.sdk.auto_collection.performance_metrics.PROCESS" ) as process_mock: performance_metrics_collector = PerformanceMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) process_mock.cpu_percent.return_value = 44.4 psutil_mock.cpu_count.return_value = 2 @@ -131,7 +132,7 @@ def test_track_process_cpu(self, psutil_mock): ) performance_metrics_collector._track_process_cpu(obs) self.assertEqual( - obs.aggregators[self._test_label_set].current, 22.2 + obs.aggregators[tuple(self._test_labels.items())].current, 22.2 ) @mock.patch("azure_monitor.sdk.auto_collection.performance_metrics.logger") @@ -140,7 +141,7 @@ def test_track_process_cpu_exception(self, logger_mock): "azure_monitor.sdk.auto_collection.performance_metrics.psutil" ) as psutil_mock: performance_metrics_collector = PerformanceMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) psutil_mock.cpu_count.return_value = None obs = Observer( @@ -159,7 +160,7 @@ def test_track_process_memory(self): "azure_monitor.sdk.auto_collection.performance_metrics.PROCESS" ) as process_mock: performance_metrics_collector = PerformanceMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) memory = collections.namedtuple("memory", "rss") pmem = memory(rss=100) @@ -174,7 +175,7 @@ def test_track_process_memory(self): ) performance_metrics_collector._track_process_memory(obs) self.assertEqual( - obs.aggregators[self._test_label_set].current, 100 + obs.aggregators[tuple(self._test_labels.items())].current, 100 ) @mock.patch("azure_monitor.sdk.auto_collection.performance_metrics.logger") @@ -184,7 +185,7 @@ def test_track_process_memory_exception(self, logger_mock): throw(Exception), ): performance_metrics_collector = PerformanceMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) obs = Observer( callback=performance_metrics_collector._track_process_memory, diff --git a/azure_monitor/tests/auto_collection/test_request_metrics.py b/azure_monitor/tests/auto_collection/test_request_metrics.py index 63030d1..62b5a88 100644 --- a/azure_monitor/tests/auto_collection/test_request_metrics.py +++ b/azure_monitor/tests/auto_collection/test_request_metrics.py @@ -21,8 +21,7 @@ class TestRequestMetrics(unittest.TestCase): def setUpClass(cls): metrics.set_meter_provider(MeterProvider()) cls._meter = metrics.get_meter(__name__) - kvp = {"environment": "staging"} - cls._test_label_set = cls._meter.get_label_set(kvp) + cls._test_labels = {"environment": "staging"} @classmethod def tearDown(cls): @@ -36,12 +35,10 @@ def setUp(self): def test_constructor(self): mock_meter = mock.Mock() request_metrics_collector = request_metrics.RequestMetrics( - meter=mock_meter, label_set=self._test_label_set + meter=mock_meter, labels=self._test_labels ) self.assertEqual(request_metrics_collector._meter, mock_meter) - self.assertEqual( - request_metrics_collector._label_set, self._test_label_set - ) + self.assertEqual(request_metrics_collector._labels, self._test_labels) self.assertEqual(mock_meter.register_observer.call_count, 2) @@ -65,7 +62,7 @@ def test_constructor(self): def test_track_request_duration(self): request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) request_metrics.requests_map["duration"] = 0.1 request_metrics.requests_map["count"] = 10 @@ -79,11 +76,13 @@ def test_track_request_duration(self): meter=self._meter, ) request_metrics_collector._track_request_duration(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 20) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 20 + ) def test_track_request_duration_error(self): request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) request_metrics.requests_map["duration"] = 0.1 request_metrics.requests_map["count"] = 10 @@ -97,12 +96,14 @@ def test_track_request_duration_error(self): meter=self._meter, ) request_metrics_collector._track_request_duration(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 0) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 0 + ) @mock.patch("azure_monitor.sdk.auto_collection.request_metrics.time") def test_track_request_rate(self, time_mock): request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) time_mock.time.return_value = 100 request_metrics.requests_map["last_time"] = 98 @@ -116,13 +117,15 @@ def test_track_request_rate(self, time_mock): meter=self._meter, ) request_metrics_collector._track_request_rate(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 2) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 2 + ) @mock.patch("azure_monitor.sdk.auto_collection.request_metrics.time") def test_track_request_rate_time_none(self, time_mock): time_mock.time.return_value = 100 request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) request_metrics.requests_map["last_time"] = None obs = Observer( @@ -134,12 +137,14 @@ def test_track_request_rate_time_none(self, time_mock): meter=self._meter, ) request_metrics_collector._track_request_rate(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 0) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 0 + ) @mock.patch("azure_monitor.sdk.auto_collection.request_metrics.time") def test_track_request_rate_error(self, time_mock): request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, label_set=self._test_label_set + meter=self._meter, labels=self._test_labels ) time_mock.time.return_value = 100 request_metrics.requests_map["last_rate"] = 5 @@ -153,7 +158,9 @@ def test_track_request_rate_error(self, time_mock): meter=self._meter, ) request_metrics_collector._track_request_rate(obs) - self.assertEqual(obs.aggregators[self._test_label_set].current, 5) + self.assertEqual( + obs.aggregators[tuple(self._test_labels.items())].current, 5 + ) def test_request_patch(self): map = request_metrics.requests_map # pylint: disable=redefined-builtin diff --git a/azure_monitor/tests/metrics/test_metrics.py b/azure_monitor/tests/metrics/test_metrics.py index 1984c3b..ee5e28e 100644 --- a/azure_monitor/tests/metrics/test_metrics.py +++ b/azure_monitor/tests/metrics/test_metrics.py @@ -67,8 +67,7 @@ def setUpClass(cls): Counter, ["environment"], ) - kvp = {"environment": "staging"} - cls._test_label_set = cls._meter.get_label_set(kvp) + cls._test_labels = tuple({"environment": "staging"}.items()) def setUp(self): for filename in os.listdir(STORAGE_PATH): @@ -99,7 +98,7 @@ def test_constructor(self): def test_export(self,): record = MetricRecord( - CounterAggregator(), self._test_label_set, self._test_metric + CounterAggregator(), self._test_labels, self._test_metric ) exporter = self._exporter with mock.patch( @@ -111,7 +110,7 @@ def test_export(self,): def test_export_failed_retryable(self): record = MetricRecord( - CounterAggregator(), self._test_label_set, self._test_metric + CounterAggregator(), self._test_labels, self._test_metric ) exporter = self._exporter with mock.patch( @@ -127,7 +126,7 @@ def test_export_failed_retryable(self): @mock.patch("azure_monitor.export.metrics.logger") def test_export_exception(self, logger_mock): record = MetricRecord( - CounterAggregator(), self._test_label_set, self._test_metric + CounterAggregator(), self._test_labels, self._test_metric ) exporter = self._exporter with mock.patch( @@ -146,9 +145,7 @@ def test_metric_to_envelope(self): aggregator = CounterAggregator() aggregator.update(123) aggregator.take_checkpoint() - record = MetricRecord( - aggregator, self._test_label_set, self._test_metric - ) + record = MetricRecord(aggregator, self._test_labels, self._test_metric) exporter = self._exporter envelope = exporter._metric_to_envelope(record) self.assertIsInstance(envelope, Envelope) @@ -157,7 +154,7 @@ def test_metric_to_envelope(self): self.assertEqual( envelope.time, ns_to_iso_str( - record.metric.bind(record.label_set).last_update_timestamp + record.metric.bind(dict(record.labels)).last_update_timestamp ), ) self.assertEqual(envelope.sample_rate, None) @@ -188,7 +185,8 @@ def test_observer_to_envelope(self): aggregator = ObserverAggregator() aggregator.update(123) aggregator.take_checkpoint() - record = MetricRecord(aggregator, self._test_label_set, self._test_obs) + record = MetricRecord(aggregator, self._test_labels, self._test_obs) + print(record.labels) exporter = self._exporter envelope = exporter._metric_to_envelope(record) self.assertIsInstance(envelope, Envelope) @@ -231,7 +229,7 @@ def test_observer_to_envelope_value_none(self): aggregator = ObserverAggregator() aggregator.update(None) aggregator.take_checkpoint() - record = MetricRecord(aggregator, self._test_label_set, self._test_obs) + record = MetricRecord(aggregator, self._test_labels, self._test_obs) exporter = self._exporter envelope = exporter._metric_to_envelope(record) self.assertIsInstance(envelope, Envelope) @@ -259,6 +257,7 @@ def test_observer_to_envelope_value_none(self): self.assertEqual(envelope.data.base_data.metrics[0].ns, "testdesc") self.assertEqual(envelope.data.base_data.metrics[0].name, "testname") self.assertEqual(envelope.data.base_data.metrics[0].value, 0) + print(envelope.data.base_data.properties) self.assertEqual( envelope.data.base_data.properties["environment"], "staging" ) @@ -276,7 +275,7 @@ def test_measure_to_envelope(self, logger_mock): aggregator.update(123) aggregator.take_checkpoint() record = MetricRecord( - aggregator, self._test_label_set, self._test_measure + aggregator, self._test_labels, self._test_measure ) exporter = self._exporter envelope = exporter._metric_to_envelope(record) @@ -286,7 +285,7 @@ def test_measure_to_envelope(self, logger_mock): self.assertEqual( envelope.time, ns_to_iso_str( - record.metric.bind(record.label_set).last_update_timestamp + record.metric.bind(dict(record.labels)).last_update_timestamp ), ) self.assertEqual(envelope.sample_rate, None) diff --git a/azure_monitor/tests/test_storage.py b/azure_monitor/tests/test_storage.py index c4258b0..cee8cb6 100644 --- a/azure_monitor/tests/test_storage.py +++ b/azure_monitor/tests/test_storage.py @@ -110,7 +110,7 @@ def test_put(self): def test_put_max_size(self): test_input = (1, 2, 3) - with LocalFileStorage(os.path.join(TEST_FOLDER, 'asd')) as stor: + with LocalFileStorage(os.path.join(TEST_FOLDER, "asd")) as stor: size_mock = mock.Mock() size_mock.return_value = False stor._check_storage_size = size_mock @@ -119,34 +119,34 @@ def test_put_max_size(self): def test_check_storage_size_full(self): test_input = (1, 2, 3) - with LocalFileStorage(os.path.join(TEST_FOLDER, 'asd2'), 1) as stor: + with LocalFileStorage(os.path.join(TEST_FOLDER, "asd2"), 1) as stor: stor.put(test_input) self.assertFalse(stor._check_storage_size()) def test_check_storage_size_not_full(self): test_input = (1, 2, 3) - with LocalFileStorage(os.path.join(TEST_FOLDER, 'asd3'), 1000) as stor: + with LocalFileStorage(os.path.join(TEST_FOLDER, "asd3"), 1000) as stor: stor.put(test_input) self.assertTrue(stor._check_storage_size()) def test_check_storage_size_no_files(self): - with LocalFileStorage(os.path.join(TEST_FOLDER, 'asd3'), 1000) as stor: + with LocalFileStorage(os.path.join(TEST_FOLDER, "asd3"), 1000) as stor: self.assertTrue(stor._check_storage_size()) def test_check_storage_size_links(self): test_input = (1, 2, 3) - with LocalFileStorage(os.path.join(TEST_FOLDER, 'asd4'), 1000) as stor: + with LocalFileStorage(os.path.join(TEST_FOLDER, "asd4"), 1000) as stor: stor.put(test_input) - with mock.patch('os.path.islink') as os_mock: + with mock.patch("os.path.islink") as os_mock: os_mock.return_value = True self.assertTrue(stor._check_storage_size()) def test_check_storage_size_error(self): test_input = (1, 2, 3) - with LocalFileStorage(os.path.join(TEST_FOLDER, 'asd5'), 1) as stor: - with mock.patch('os.path.getsize', side_effect=throw(OSError)): + with LocalFileStorage(os.path.join(TEST_FOLDER, "asd5"), 1) as stor: + with mock.patch("os.path.getsize", side_effect=throw(OSError)): stor.put(test_input) - with mock.patch('os.path.islink') as os_mock: + with mock.patch("os.path.islink") as os_mock: os_mock.return_value = True self.assertTrue(stor._check_storage_size()) diff --git a/azure_monitor/tests/trace/test_trace.py b/azure_monitor/tests/trace/test_trace.py index 3e3f161..44d8853 100644 --- a/azure_monitor/tests/trace/test_trace.py +++ b/azure_monitor/tests/trace/test_trace.py @@ -92,6 +92,7 @@ def test_export_failure(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557338, + is_remote=False, ), ) test_span.start() @@ -108,6 +109,7 @@ def test_export_success(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557338, + is_remote=False, ), ) test_span.start() @@ -129,6 +131,7 @@ def test_export_exception(self, logger_mock): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557338, + is_remote=False, ), ) test_span.start() @@ -149,6 +152,7 @@ def test_export_not_retryable(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557338, + is_remote=False, ), ) test_span.start() @@ -176,6 +180,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557338, + is_remote=False, ), ) @@ -188,6 +193,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -237,6 +243,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -275,6 +282,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -323,6 +331,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -376,6 +385,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -429,6 +439,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -472,6 +483,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=None, sampler=None, @@ -510,6 +522,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -543,6 +556,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195432, span_id=12030755672171557338, + is_remote=False, ) ) ) @@ -551,6 +565,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -582,6 +597,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -609,6 +625,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -636,6 +653,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -662,6 +680,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -688,6 +707,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -714,6 +734,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -741,6 +762,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -777,6 +799,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -804,6 +827,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -840,6 +864,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None, @@ -873,6 +898,7 @@ def test_span_to_envelope(self): context=SpanContext( trace_id=36873507687745823477771305566750195431, span_id=12030755672171557337, + is_remote=False, ), parent=parent_span, sampler=None,