diff --git a/README.md b/README.md index 248dece..e9c47a6 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ The online documentation is available at https://opentelemetry-azure-monitor-pyt ### Trace -The **Azure Monitor Trace Exporter** allows you to export [OpenTelemetry](https://opentelemetry.io/) traces to [Azure Monitor](https://docs.microsoft.com/azure/azure-monitor/). +The **Azure Monitor Span Exporter** allows you to export [OpenTelemetry](https://opentelemetry.io/) traces to [Azure Monitor](https://docs.microsoft.com/azure/azure-monitor/). This example shows how to send a span "hello" to Azure Monitor. @@ -33,17 +33,13 @@ from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchExportSpanProcessor trace.set_tracer_provider(TracerProvider()) - -# We tell OpenTelemetry who it is that is creating spans. In this case, we have -# no real name (no setup.py), so we make one up. If we had a version, we would -# also specify it here. tracer = trace.get_tracer(__name__) +# SpanExporter receives the spans and send them to the target location exporter = AzureMonitorSpanExporter( connection_string='InstrumentationKey=', ) -# SpanExporter receives the spans and send them to the target location. span_processor = BatchExportSpanProcessor(exporter) trace.get_tracer_provider().add_span_processor(span_processor) @@ -75,12 +71,14 @@ trace.set_tracer_provider(TracerProvider()) tracer_provider = trace.get_tracer_provider() exporter = AzureMonitorSpanExporter( - connection_string='InstrumentationKey=', - ) + connection_string='InstrumentationKey=', +) span_processor = BatchExportSpanProcessor(exporter) tracer_provider.add_span_processor(span_processor) RequestsInstrumentor().instrument() + +# This request will be traced response = requests.get(url="https://azure.microsoft.com/") ``` @@ -106,6 +104,7 @@ def callback_function(envelope): exporter = AzureMonitorSpanExporter( connection_string='InstrumentationKey=' ) +# This line will modify telemetry exporter.add_telemetry_processor(callback_function) trace.set_tracer_provider(TracerProvider()) diff --git a/azure_monitor/CHANGELOG.md b/azure_monitor/CHANGELOG.md index 2c0131e..30cd696 100644 --- a/azure_monitor/CHANGELOG.md +++ b/azure_monitor/CHANGELOG.md @@ -2,8 +2,10 @@ ## Unreleased +- Remove request failed per second metrics from auto-collection + ([#102](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/102)) - Remove dependency metrics from auto-collection -- ([#92](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/92)) + ([#92](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/92)) ## 0.3b.1 Released 2020-05-21 diff --git a/azure_monitor/setup.cfg b/azure_monitor/setup.cfg index 35b6b72..3728d63 100644 --- a/azure_monitor/setup.cfg +++ b/azure_monitor/setup.cfg @@ -20,6 +20,7 @@ classifiers = Programming Language :: Python :: 3.5 Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3.8 [options] python_requires = >=3.4 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 4c33a14..59e0705 100644 --- a/azure_monitor/src/azure_monitor/sdk/auto_collection/__init__.py +++ b/azure_monitor/src/azure_monitor/sdk/auto_collection/__init__.py @@ -44,4 +44,6 @@ def __init__( ): col_type = AutoCollectionType.STANDARD_METRICS self._performance_metrics = PerformanceMetrics(meter, labels, col_type) - self._request_metrics = RequestMetrics(meter, labels, span_processor) + self._request_metrics = RequestMetrics( + meter, labels, span_processor, col_type + ) diff --git a/azure_monitor/src/azure_monitor/sdk/auto_collection/live_metrics/__init__.py b/azure_monitor/src/azure_monitor/sdk/auto_collection/live_metrics/__init__.py index 8c2cb46..0bd1428 100644 --- a/azure_monitor/src/azure_monitor/sdk/auto_collection/live_metrics/__init__.py +++ b/azure_monitor/src/azure_monitor/sdk/auto_collection/live_metrics/__init__.py @@ -44,7 +44,9 @@ def __init__( self._dependency_metrics = DependencyMetrics( meter, labels, span_processor ) - self._request_metrics = RequestMetrics(meter, labels, span_processor) + self._request_metrics = RequestMetrics( + meter, labels, span_processor, col_type + ) self._manager = LiveMetricsManager( meter, instrumentation_key, span_processor ) 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 24d70de..c78294d 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 @@ -10,6 +10,7 @@ from azure_monitor.sdk.auto_collection.metrics_span_processor import ( AzureMetricsSpanProcessor, ) +from azure_monitor.sdk.auto_collection.utils import AutoCollectionType logger = logging.getLogger(__name__) requests_map = dict() @@ -32,19 +33,21 @@ def __init__( meter: Meter, labels: Dict[str, str], span_processor: AzureMetricsSpanProcessor, + collection_type: AutoCollectionType, ): self._meter = meter self._labels = labels self._span_processor = span_processor - meter.register_observer( - callback=self._track_request_failed_rate, - name="\\ApplicationInsights\\Requests Failed/Sec", - description="Incoming Requests Failed Rate", - unit="rps", - value_type=float, - observer_type=UpDownSumObserver, - ) + if collection_type == AutoCollectionType.LIVE_METRICS: + meter.register_observer( + callback=self._track_request_failed_rate, + name="\\ApplicationInsights\\Requests Failed/Sec", + description="Incoming Requests Failed Rate", + unit="rps", + value_type=float, + observer_type=UpDownSumObserver, + ) meter.register_observer( callback=self._track_request_duration, name="\\ASP.NET Applications(??APP_W3SVC_PROC??)\\Request Execution Time", diff --git a/azure_monitor/tests/auto_collection/test_request_metrics.py b/azure_monitor/tests/auto_collection/test_request_metrics.py index 2d0b121..a367834 100644 --- a/azure_monitor/tests/auto_collection/test_request_metrics.py +++ b/azure_monitor/tests/auto_collection/test_request_metrics.py @@ -11,6 +11,7 @@ from azure_monitor.sdk.auto_collection.metrics_span_processor import ( AzureMetricsSpanProcessor, ) +from azure_monitor.sdk.auto_collection.utils import AutoCollectionType # pylint: disable=protected-access @@ -35,19 +36,13 @@ def test_constructor(self): meter=mock_meter, labels=self._test_labels, span_processor=self._span_processor, + collection_type=AutoCollectionType.STANDARD_METRICS, ) self.assertEqual(request_metrics_collector._meter, mock_meter) self.assertEqual(request_metrics_collector._labels, self._test_labels) - self.assertEqual(mock_meter.register_observer.call_count, 3) + self.assertEqual(mock_meter.register_observer.call_count, 2) create_metric_calls = mock_meter.register_observer.call_args_list create_metric_calls[0].assert_called_with( - callback=request_metrics_collector._track_request_failed_rate, - name="\\ApplicationInsights\\Requests Failed/Sec", - description="Incoming Requests Failed Rate", - unit="rps", - value_type=float, - ) - create_metric_calls[1].assert_called_with( callback=request_metrics_collector._track_request_duration, name="\\ASP.NET Applications(??APP_W3SVC_PROC??)\\Request Execution Time", description="Incoming Requests Average Execution Time", @@ -55,7 +50,7 @@ def test_constructor(self): value_type=int, ) - create_metric_calls[2].assert_called_with( + create_metric_calls[1].assert_called_with( callback=request_metrics_collector._track_request_rate, name="\\ASP.NET Applications(??APP_W3SVC_PROC??)\\Requests/Sec", description="Incoming Requests Rate", @@ -68,6 +63,7 @@ def test_track_request_duration(self): meter=self._meter, labels=self._test_labels, span_processor=self._span_processor, + collection_type=AutoCollectionType.STANDARD_METRICS, ) self._span_processor.request_duration = 100 self._span_processor.request_count = 10 @@ -90,6 +86,7 @@ def test_track_request_duration_error(self): meter=self._meter, labels=self._test_labels, span_processor=self._span_processor, + collection_type=AutoCollectionType.STANDARD_METRICS, ) self._span_processor.request_duration = 100 self._span_processor.request_count = 10 @@ -113,6 +110,7 @@ def test_track_request_rate(self, time_mock): meter=self._meter, labels=self._test_labels, span_processor=self._span_processor, + collection_type=AutoCollectionType.STANDARD_METRICS, ) time_mock.time.return_value = 100 request_metrics.requests_map["last_time"] = 98 @@ -137,6 +135,7 @@ def test_track_request_rate_time_none(self, time_mock): meter=self._meter, labels=self._test_labels, span_processor=self._span_processor, + collection_type=AutoCollectionType.STANDARD_METRICS, ) request_metrics.requests_map["last_time"] = None obs = Observer( @@ -158,6 +157,7 @@ def test_track_request_rate_error(self, time_mock): meter=self._meter, labels=self._test_labels, span_processor=self._span_processor, + collection_type=AutoCollectionType.STANDARD_METRICS, ) time_mock.time.return_value = 100 request_metrics.requests_map["last_rate"] = 5.0 @@ -174,71 +174,3 @@ def test_track_request_rate_error(self, time_mock): self.assertEqual( obs.aggregators[tuple(self._test_labels.items())].current, 5.0 ) - - @mock.patch("azure_monitor.sdk.auto_collection.request_metrics.time") - def test_track_request_failed_rate(self, time_mock): - request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, - labels=self._test_labels, - span_processor=self._span_processor, - ) - time_mock.time.return_value = 100 - request_metrics.requests_map["last_time"] = 98 - self._span_processor.failed_request_count = 4 - obs = Observer( - callback=request_metrics_collector._track_request_failed_rate, - name="test", - description="test", - unit="test", - value_type=float, - meter=self._meter, - ) - request_metrics_collector._track_request_failed_rate(obs) - self.assertEqual( - obs.aggregators[tuple(self._test_labels.items())].current, 2.0 - ) - - @mock.patch("azure_monitor.sdk.auto_collection.request_metrics.time") - def test_track_request_failed_rate_time_none(self, time_mock): - time_mock.time.return_value = 100 - request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, - labels=self._test_labels, - span_processor=self._span_processor, - ) - request_metrics.requests_map["last_time"] = None - obs = Observer( - callback=request_metrics_collector._track_request_failed_rate, - name="test", - description="test", - unit="test", - value_type=float, - meter=self._meter, - ) - request_metrics_collector._track_request_failed_rate(obs) - self.assertEqual( - obs.aggregators[tuple(self._test_labels.items())].current, 0.0 - ) - - @mock.patch("azure_monitor.sdk.auto_collection.request_metrics.time") - def test_track_request_failed_rate_error(self, time_mock): - request_metrics_collector = request_metrics.RequestMetrics( - meter=self._meter, - labels=self._test_labels, - span_processor=self._span_processor, - ) - time_mock.time.return_value = 100 - request_metrics.requests_map["last_rate"] = 5.0 - request_metrics.requests_map["last_time"] = 100 - obs = Observer( - callback=request_metrics_collector._track_request_failed_rate, - name="test", - description="test", - unit="test", - value_type=float, - meter=self._meter, - ) - request_metrics_collector._track_request_failed_rate(obs) - self.assertEqual( - obs.aggregators[tuple(self._test_labels.items())].current, 5.0 - )