From fe55d5cbf4d89893085fceaebbdc6d82b6c8bd20 Mon Sep 17 00:00:00 2001
From: Diego Hurtado <ocelotl@users.noreply.github.com>
Date: Thu, 5 May 2022 19:55:34 -0600
Subject: [PATCH] Refactored type for metrics data structure

---
 .../proto/grpc/_metric_exporter/__init__.py   | 19 ++++-----------
 .../exporter/prometheus/__init__.py           |  2 +-
 .../sdk/_metrics/_internal/export/__init__.py | 24 +++++++------------
 .../sdk/_metrics/_internal/metric_reader.py   |  2 +-
 .../sdk/_metrics/export/__init__.py           |  1 +
 5 files changed, 16 insertions(+), 32 deletions(-)

diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_metric_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_metric_exporter/__init__.py
index a36b8e329a8..e7d47d31b78 100644
--- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_metric_exporter/__init__.py
+++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_metric_exporter/__init__.py
@@ -13,7 +13,7 @@
 
 from logging import getLogger
 from os import environ
-from typing import Optional, Sequence, Dict, Iterable
+from typing import Optional, Sequence, Dict
 from grpc import ChannelCredentials, Compression
 from opentelemetry.exporter.otlp.proto.grpc.exporter import (
     OTLPExporterMixin,
@@ -40,14 +40,12 @@
 from opentelemetry.sdk._metrics.export import (
     MetricExporter,
     MetricExportResult,
+    MappingMetricT,
 )
 from opentelemetry.sdk.resources import Resource
 from opentelemetry.sdk.util.instrumentation import (
     InstrumentationScope as SDKInstrumentationScope,
 )
-from opentelemetry.sdk._metrics.metric_reader import (
-    Metric as MetricReaderMetric,
-)
 
 _logger = getLogger(__name__)
 
@@ -86,11 +84,7 @@ def __init__(
         )
 
     def _translate_data(
-        self,
-        data: Dict[
-            Resource,
-            Dict[SDKInstrumentationScope, Iterable[MetricReaderMetric]],
-        ],
+        self, data: MappingMetricT
     ) -> ExportMetricsServiceRequest:
 
         sdk_resource_scope_metrics: Dict[
@@ -202,12 +196,7 @@ def _translate_data(
         )
 
     def export(
-        self,
-        metrics: Dict[
-            Resource, Dict[InstrumentationScope, Iterable[MetricReaderMetric]]
-        ],
-        *args,
-        **kwargs
+        self, metrics: MappingMetricT, *args, **kwargs
     ) -> MetricExportResult:
         return self._export(metrics)
 
diff --git a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py
index 3f3f8861f1d..1d86cc8e048 100644
--- a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py
+++ b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py
@@ -121,7 +121,7 @@ def _receive_metrics(
             Resource, Dict[InstrumentationScope, Iterable[MetricReaderMetric]]
         ],
         *args,
-        **kwargs
+        **kwargs,
     ) -> None:
         if metrics is None:
             return
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/export/__init__.py
index e41305a4ff8..41d69d075d8 100644
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/export/__init__.py
+++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/export/__init__.py
@@ -19,7 +19,7 @@
 from os import environ, linesep
 from sys import stdout
 from threading import Event, RLock, Thread
-from typing import IO, Callable, Dict, Iterable, List, Optional, Sequence
+from typing import IO, Callable, Dict, Iterable, List, Mapping, Optional
 
 from opentelemetry.context import (
     _SUPPRESS_INSTRUMENTATION_KEY,
@@ -39,6 +39,10 @@
 
 _logger = logging.getLogger(__name__)
 
+MappingMetricT = Mapping[
+    Resource, Mapping[InstrumentationScope, Iterable[MetricReaderMetric]]
+]
+
 
 class MetricExportResult(Enum):
     """Result of exporting a metric
@@ -58,7 +62,7 @@ class MetricExporter(ABC):
 
     @abstractmethod
     def export(
-        self, metrics: Sequence[Metric], *args, **kwargs
+        self, metrics: MappingMetricT, *args, **kwargs
     ) -> "MetricExportResult":
         """Exports a batch of telemetry data.
 
@@ -95,7 +99,7 @@ def __init__(
         self.formatter = formatter
 
     def export(
-        self, metrics: Sequence[Metric], *args, **kwargs
+        self, metrics: MappingMetricT, *args, **kwargs
     ) -> MetricExportResult:
         for metric in metrics:
             self.out.write(self.formatter(metric))
@@ -135,12 +139,7 @@ def get_metrics(self) -> List[Metric]:
         return metrics
 
     def _receive_metrics(
-        self,
-        metrics: Dict[
-            Resource, Dict[InstrumentationScope, Iterable[MetricReaderMetric]]
-        ],
-        *args,
-        **kwargs
+        self, metrics: MappingMetricT, *args, **kwargs
     ) -> None:
         with self._lock:
             self._metrics = metrics
@@ -212,12 +211,7 @@ def _ticker(self) -> None:
         self.collect()
 
     def _receive_metrics(
-        self,
-        metrics: Dict[
-            Resource, Dict[InstrumentationScope, Iterable[MetricReaderMetric]]
-        ],
-        *args,
-        **kwargs
+        self, metrics: MappingMetricT, *args, **kwargs
     ) -> None:
         if metrics is None:
             return
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/metric_reader.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/metric_reader.py
index d9841295f45..9783dafc34f 100644
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/metric_reader.py
+++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/_internal/metric_reader.py
@@ -216,7 +216,7 @@ def _receive_metrics(
         self,
         metrics: Dict[Resource, Dict[InstrumentationScope, Iterable[Metric]]],
         *args,
-        **kwargs
+        **kwargs,
     ) -> None:
         """Called by `MetricReader.collect` when it receives a batch of metrics"""
 
diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/export/__init__.py
index 06dc1e77766..c894139a66d 100644
--- a/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/export/__init__.py
+++ b/opentelemetry-sdk/src/opentelemetry/sdk/_metrics/export/__init__.py
@@ -17,6 +17,7 @@
 from opentelemetry.sdk._metrics._internal.export import (  # noqa: F401
     ConsoleMetricExporter,
     InMemoryMetricReader,
+    MappingMetricT,
     MetricExporter,
     MetricExportResult,
     PeriodicExportingMetricReader,