From 3514f1c50a8e14005d48e5982d2096abfb790e9d Mon Sep 17 00:00:00 2001 From: Amos Law Date: Tue, 15 Sep 2020 16:50:04 -0700 Subject: [PATCH 1/8] Add type hints to OTLP exporter --- .../opentelemetry/exporter/otlp/exporter.py | 35 ++++++++++++---- .../otlp/metrics_exporter/__init__.py | 36 +++++++++++----- .../exporter/otlp/trace_exporter/__init__.py | 41 +++++++++++-------- 3 files changed, 76 insertions(+), 36 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 7cd9f905e06..49edf6d8b1c 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -18,6 +18,9 @@ from abc import ABC, abstractmethod from collections.abc import Mapping, Sequence from time import sleep +from typing import Any, Callable, Dict, Generic, List, Optional +from typing import Sequence as TypingSequence +from typing import Text, Tuple, TypeVar from backoff import expo from google.rpc.error_details_pb2 import RetryInfo @@ -31,11 +34,17 @@ from opentelemetry.proto.common.v1.common_pb2 import AnyValue, KeyValue from opentelemetry.proto.resource.v1.resource_pb2 import Resource +from opentelemetry.sdk.resources import Resource as SDKResource logger = logging.getLogger(__name__) +SDKDataT = TypeVar("SDKDataT") +ResourceDataT = TypeVar("ResourceDataT") +TypingResourceT = TypeVar("TypingResourceT") +ExportServiceRequestT = TypeVar("ExportServiceRequestT") +ExportResultT = TypeVar("ExportResultT") -def _translate_key_values(key, value): +def _translate_key_values(key: Text, value: Any) -> KeyValue: if isinstance(value, bool): any_value = AnyValue(bool_value=value) @@ -64,8 +73,12 @@ def _translate_key_values(key, value): def _get_resource_data( - sdk_resource_instrumentation_library_data, resource_class, name -): + sdk_resource_instrumentation_library_data: Dict[ + SDKResource, ResourceDataT + ], + resource_class: Callable[..., TypingResourceT], + name: str, +) -> List[TypingResourceT]: resource_data = [] @@ -101,7 +114,9 @@ def _get_resource_data( # pylint: disable=no-member -class OTLPExporterMixin(ABC): +class OTLPExporterMixin( + ABC, Generic[SDKDataT, ExportServiceRequestT, ExportResultT] +): """OTLP span/metric exporter Args: @@ -114,12 +129,12 @@ def __init__( self, endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, - metadata: tuple = None, + metadata: Tuple[Any] = None, ): super().__init__() self._metadata = metadata - self._collector_span_kwargs = None + self._collector_span_kwargs: Optional[Dict[str, Any]] = None if credentials is None: self._client = self._stub(insecure_channel(endpoint)) @@ -127,10 +142,12 @@ def __init__( self._client = self._stub(secure_channel(endpoint, credentials)) @abstractmethod - def _translate_data(self, data): + def _translate_data( + self, data: TypingSequence[SDKDataT] + ) -> ExportServiceRequestT: pass - def _export(self, data): + def _export(self, data: TypingSequence[SDKDataT]) -> ExportResultT: # expo returns a generator that yields delay values which grow # exponentially. Once delay is greater than max_value, the yielded # value will remain constant. @@ -190,5 +207,5 @@ def _export(self, data): return self._result.FAILURE - def shutdown(self): + def shutdown(self) -> None: pass diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py index 944428e37d0..630010f1b2e 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py @@ -15,7 +15,7 @@ """OTLP Metrics Exporter""" import logging -from typing import Sequence +from typing import Any, Dict, List, Sequence, Type, TypeVar # pylint: disable=duplicate-code from opentelemetry.exporter.otlp.exporter import ( @@ -41,9 +41,8 @@ MetricDescriptor, ResourceMetrics, ) -from opentelemetry.sdk.metrics import Counter -from opentelemetry.sdk.metrics import Metric as SDKMetric from opentelemetry.sdk.metrics import ( + Counter, SumObserver, UpDownCounter, UpDownSumObserver, @@ -51,14 +50,19 @@ ValueRecorder, ) from opentelemetry.sdk.metrics.export import ( + MetricRecord, MetricsExporter, MetricsExportResult, ) +from opentelemetry.sdk.resources import Resource logger = logging.getLogger(__name__) +DataPointT = TypeVar("DataPointT", Int64DataPoint, DoubleDataPoint) -def _get_data_points(sdk_metric, data_point_class): +def _get_data_points( + sdk_metric: MetricRecord, data_point_class: Type[DataPointT] +) -> List[DataPointT]: data_points = [] @@ -89,7 +93,7 @@ def _get_data_points(sdk_metric, data_point_class): return data_points -def _get_temporality(instrument): +def _get_temporality(instrument: Any) -> MetricDescriptor.TemporalityValue: # pylint: disable=no-member if isinstance(instrument, (Counter, UpDownCounter)): temporality = MetricDescriptor.Temporality.DELTA @@ -107,7 +111,7 @@ def _get_temporality(instrument): return temporality -def _get_type(value_type): +def _get_type(value_type: Any) -> MetricDescriptor.TypeValue: # pylint: disable=no-member if value_type is int: type_ = MetricDescriptor.Type.INT64 @@ -126,7 +130,13 @@ def _get_type(value_type): return type_ -class OTLPMetricsExporter(MetricsExporter, OTLPExporterMixin): +class OTLPMetricsExporter( + MetricsExporter, + OTLPExporterMixin[ + MetricRecord, ExportMetricsServiceRequest, MetricsExportResult + ], +): + # pylint: disable=unsubscriptable-object """OTLP metrics exporter Args: @@ -138,11 +148,15 @@ class OTLPMetricsExporter(MetricsExporter, OTLPExporterMixin): _stub = MetricsServiceStub _result = MetricsExportResult - def _translate_data(self, data): + def _translate_data( + self, data: Sequence[MetricRecord] + ) -> ExportMetricsServiceRequest: # pylint: disable=too-many-locals,no-member # pylint: disable=attribute-defined-outside-init - sdk_resource_instrumentation_library_metrics = {} + sdk_resource_instrumentation_library_metrics: Dict[ + Resource, InstrumentationLibraryMetrics + ] = {} for sdk_metric in data: @@ -153,7 +167,7 @@ def _translate_data(self, data): sdk_metric.instrument.meter.resource ] = InstrumentationLibraryMetrics() - self._metric_descriptor_kwargs = {} + self._metric_descriptor_kwargs: Dict[Any, Any] = {} metric_descriptor = MetricDescriptor( name=sdk_metric.instrument.name, @@ -193,6 +207,6 @@ def _translate_data(self, data): ) ) - def export(self, metrics: Sequence[SDKMetric]) -> MetricsExportResult: + def export(self, metrics: Sequence[MetricRecord]) -> MetricsExportResult: # pylint: disable=arguments-differ return self._export(metrics) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py index fd1d8e235e4..49c8c53155e 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py @@ -14,7 +14,7 @@ """OTLP Span Exporter""" import logging -from typing import Sequence +from typing import Any, Dict, Sequence from opentelemetry.exporter.otlp.exporter import ( OTLPExporterMixin, @@ -34,6 +34,7 @@ ) from opentelemetry.proto.trace.v1.trace_pb2 import Span as CollectorSpan from opentelemetry.proto.trace.v1.trace_pb2 import Status +from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import Span as SDKSpan from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult @@ -41,7 +42,11 @@ # pylint: disable=no-member -class OTLPSpanExporter(SpanExporter, OTLPExporterMixin): +class OTLPSpanExporter( + SpanExporter, + OTLPExporterMixin[SDKSpan, ExportTraceServiceRequest, SpanExportResult], +): + # pylint: disable=unsubscriptable-object """OTLP span exporter Args: @@ -53,34 +58,34 @@ class OTLPSpanExporter(SpanExporter, OTLPExporterMixin): _result = SpanExportResult _stub = TraceServiceStub - def _translate_name(self, sdk_span): + def _translate_name(self, sdk_span: SDKSpan) -> None: self._collector_span_kwargs["name"] = sdk_span.name - def _translate_start_time(self, sdk_span): + def _translate_start_time(self, sdk_span: SDKSpan) -> None: self._collector_span_kwargs[ "start_time_unix_nano" ] = sdk_span.start_time - def _translate_end_time(self, sdk_span): + def _translate_end_time(self, sdk_span: SDKSpan) -> None: self._collector_span_kwargs["end_time_unix_nano"] = sdk_span.end_time - def _translate_span_id(self, sdk_span): + def _translate_span_id(self, sdk_span: SDKSpan) -> None: self._collector_span_kwargs[ "span_id" ] = sdk_span.context.span_id.to_bytes(8, "big") - def _translate_trace_id(self, sdk_span): + def _translate_trace_id(self, sdk_span: SDKSpan) -> None: self._collector_span_kwargs[ "trace_id" ] = sdk_span.context.trace_id.to_bytes(16, "big") - def _translate_parent(self, sdk_span): + def _translate_parent(self, sdk_span: SDKSpan) -> None: if sdk_span.parent is not None: self._collector_span_kwargs[ "parent_span_id" ] = sdk_span.parent.span_id.to_bytes(8, "big") - def _translate_context_trace_state(self, sdk_span): + def _translate_context_trace_state(self, sdk_span: SDKSpan) -> None: if sdk_span.context.trace_state is not None: self._collector_span_kwargs["trace_state"] = ",".join( [ @@ -89,7 +94,7 @@ def _translate_context_trace_state(self, sdk_span): ] ) - def _translate_attributes(self, sdk_span): + def _translate_attributes(self, sdk_span: SDKSpan) -> None: if sdk_span.attributes: self._collector_span_kwargs["attributes"] = [] @@ -103,7 +108,7 @@ def _translate_attributes(self, sdk_span): except Exception as error: # pylint: disable=broad-except logger.exception(error) - def _translate_events(self, sdk_span): + def _translate_events(self, sdk_span: SDKSpan) -> None: if sdk_span.events: self._collector_span_kwargs["events"] = [] @@ -127,7 +132,7 @@ def _translate_events(self, sdk_span): collector_span_event ) - def _translate_links(self, sdk_span): + def _translate_links(self, sdk_span: SDKSpan) -> None: if sdk_span.links: self._collector_span_kwargs["links"] = [] @@ -153,16 +158,20 @@ def _translate_links(self, sdk_span): collector_span_link ) - def _translate_status(self, sdk_span): + def _translate_status(self, sdk_span: SDKSpan) -> None: if sdk_span.status is not None: self._collector_span_kwargs["status"] = Status( code=sdk_span.status.canonical_code.value, message=sdk_span.status.description, ) - def _translate_data(self, data) -> ExportTraceServiceRequest: + def _translate_data( + self, data: Sequence[SDKSpan] + ) -> ExportTraceServiceRequest: - sdk_resource_instrumentation_library_spans = {} + sdk_resource_instrumentation_library_spans: Dict[ + Resource, InstrumentationLibrarySpans + ] = {} for sdk_span in data: @@ -186,7 +195,7 @@ def _translate_data(self, data) -> ExportTraceServiceRequest: sdk_span.resource ] = instrumentation_library_spans - self._collector_span_kwargs = {} + self._collector_span_kwargs: Dict[str, Any] = {} self._translate_name(sdk_span) self._translate_start_time(sdk_span) From 5e7bc3886bf643bac085096ea182d5c5cd82d50c Mon Sep 17 00:00:00 2001 From: Amos Law Date: Wed, 16 Sep 2020 10:39:59 -0700 Subject: [PATCH 2/8] Update changelog --- exporter/opentelemetry-exporter-otlp/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md index 49e6d8c9410..ec6cc2cb0de 100644 --- a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md +++ b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Add type hints to OTLP exporter + ([#1121](https://github.com/open-telemetry/opentelemetry-python/pull/1121)) - Add instrumentation info to exported spans ([#1095](https://github.com/open-telemetry/opentelemetry-python/pull/1095)) - Add metric OTLP exporter From f8702d45d22f0eeae3621d92040ff24e57510331 Mon Sep 17 00:00:00 2001 From: Amos Law Date: Wed, 16 Sep 2020 10:48:40 -0700 Subject: [PATCH 3/8] Fix incorrect types --- .../opentelemetry/exporter/otlp/metrics_exporter/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py index 630010f1b2e..b769737fb79 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py @@ -93,7 +93,7 @@ def _get_data_points( return data_points -def _get_temporality(instrument: Any) -> MetricDescriptor.TemporalityValue: +def _get_temporality(instrument: Any) -> MetricDescriptor.Temporality: # pylint: disable=no-member if isinstance(instrument, (Counter, UpDownCounter)): temporality = MetricDescriptor.Temporality.DELTA @@ -111,7 +111,7 @@ def _get_temporality(instrument: Any) -> MetricDescriptor.TemporalityValue: return temporality -def _get_type(value_type: Any) -> MetricDescriptor.TypeValue: +def _get_type(value_type: Any) -> MetricDescriptor.Type: # pylint: disable=no-member if value_type is int: type_ = MetricDescriptor.Type.INT64 From 1bbe25ade5e92edbd10e1f9a27140ddb4e01de7c Mon Sep 17 00:00:00 2001 From: Amos Law Date: Wed, 16 Sep 2020 11:05:10 -0700 Subject: [PATCH 4/8] Remove variable annotations for py35 compatibility --- .../src/opentelemetry/exporter/otlp/exporter.py | 4 ++-- .../exporter/otlp/metrics_exporter/__init__.py | 9 +++------ .../exporter/otlp/trace_exporter/__init__.py | 9 +++------ 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 49edf6d8b1c..78aea0d550e 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -18,7 +18,7 @@ from abc import ABC, abstractmethod from collections.abc import Mapping, Sequence from time import sleep -from typing import Any, Callable, Dict, Generic, List, Optional +from typing import Any, Callable, Dict, Generic, List from typing import Sequence as TypingSequence from typing import Text, Tuple, TypeVar @@ -134,7 +134,7 @@ def __init__( super().__init__() self._metadata = metadata - self._collector_span_kwargs: Optional[Dict[str, Any]] = None + self._collector_span_kwargs = None if credentials is None: self._client = self._stub(insecure_channel(endpoint)) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py index b769737fb79..3c66ef879d3 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py @@ -15,7 +15,7 @@ """OTLP Metrics Exporter""" import logging -from typing import Any, Dict, List, Sequence, Type, TypeVar +from typing import Any, List, Sequence, Type, TypeVar # pylint: disable=duplicate-code from opentelemetry.exporter.otlp.exporter import ( @@ -54,7 +54,6 @@ MetricsExporter, MetricsExportResult, ) -from opentelemetry.sdk.resources import Resource logger = logging.getLogger(__name__) DataPointT = TypeVar("DataPointT", Int64DataPoint, DoubleDataPoint) @@ -154,9 +153,7 @@ def _translate_data( # pylint: disable=too-many-locals,no-member # pylint: disable=attribute-defined-outside-init - sdk_resource_instrumentation_library_metrics: Dict[ - Resource, InstrumentationLibraryMetrics - ] = {} + sdk_resource_instrumentation_library_metrics = {} for sdk_metric in data: @@ -167,7 +164,7 @@ def _translate_data( sdk_metric.instrument.meter.resource ] = InstrumentationLibraryMetrics() - self._metric_descriptor_kwargs: Dict[Any, Any] = {} + self._metric_descriptor_kwargs = {} metric_descriptor = MetricDescriptor( name=sdk_metric.instrument.name, diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py index 49c8c53155e..5a70b0dc4e6 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py @@ -14,7 +14,7 @@ """OTLP Span Exporter""" import logging -from typing import Any, Dict, Sequence +from typing import Sequence from opentelemetry.exporter.otlp.exporter import ( OTLPExporterMixin, @@ -34,7 +34,6 @@ ) from opentelemetry.proto.trace.v1.trace_pb2 import Span as CollectorSpan from opentelemetry.proto.trace.v1.trace_pb2 import Status -from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import Span as SDKSpan from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult @@ -169,9 +168,7 @@ def _translate_data( self, data: Sequence[SDKSpan] ) -> ExportTraceServiceRequest: - sdk_resource_instrumentation_library_spans: Dict[ - Resource, InstrumentationLibrarySpans - ] = {} + sdk_resource_instrumentation_library_spans = {} for sdk_span in data: @@ -195,7 +192,7 @@ def _translate_data( sdk_span.resource ] = instrumentation_library_spans - self._collector_span_kwargs: Dict[str, Any] = {} + self._collector_span_kwargs = {} self._translate_name(sdk_span) self._translate_start_time(sdk_span) From e1717dae74e4048b9f7bec3c5aa4c29019cab0a0 Mon Sep 17 00:00:00 2001 From: Amos Law Date: Wed, 16 Sep 2020 12:34:32 -0700 Subject: [PATCH 5/8] Fix lint error --- .../src/opentelemetry/exporter/otlp/trace_exporter/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py index 5a70b0dc4e6..c08d6049e1f 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/trace_exporter/__init__.py @@ -167,6 +167,7 @@ def _translate_status(self, sdk_span: SDKSpan) -> None: def _translate_data( self, data: Sequence[SDKSpan] ) -> ExportTraceServiceRequest: + # pylint: disable=attribute-defined-outside-init sdk_resource_instrumentation_library_spans = {} From e0783565971ab77668e8a056f21ffd3c812e49eb Mon Sep 17 00:00:00 2001 From: Amos Law Date: Wed, 16 Sep 2020 12:34:45 -0700 Subject: [PATCH 6/8] Remove incorrect type --- .../opentelemetry/exporter/otlp/metrics_exporter/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py index 3c66ef879d3..94843e95144 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py @@ -92,7 +92,7 @@ def _get_data_points( return data_points -def _get_temporality(instrument: Any) -> MetricDescriptor.Temporality: +def _get_temporality(instrument: Any): # pylint: disable=no-member if isinstance(instrument, (Counter, UpDownCounter)): temporality = MetricDescriptor.Temporality.DELTA @@ -110,7 +110,7 @@ def _get_temporality(instrument: Any) -> MetricDescriptor.Temporality: return temporality -def _get_type(value_type: Any) -> MetricDescriptor.Type: +def _get_type(value_type: Any): # pylint: disable=no-member if value_type is int: type_ = MetricDescriptor.Type.INT64 From ffcd0e93ae17dd96067d731293939e9a437e1b2c Mon Sep 17 00:00:00 2001 From: Amos Law Date: Wed, 16 Sep 2020 17:57:53 -0700 Subject: [PATCH 7/8] Make changes to type annotations --- exporter/opentelemetry-exporter-otlp/CHANGELOG.md | 4 ++-- .../src/opentelemetry/exporter/otlp/exporter.py | 4 ++-- .../exporter/otlp/metrics_exporter/__init__.py | 11 ++++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md index ec6cc2cb0de..a1459b105c2 100644 --- a/exporter/opentelemetry-exporter-otlp/CHANGELOG.md +++ b/exporter/opentelemetry-exporter-otlp/CHANGELOG.md @@ -2,12 +2,12 @@ ## Unreleased -- Add type hints to OTLP exporter - ([#1121](https://github.com/open-telemetry/opentelemetry-python/pull/1121)) - Add instrumentation info to exported spans ([#1095](https://github.com/open-telemetry/opentelemetry-python/pull/1095)) - Add metric OTLP exporter ([#835](https://github.com/open-telemetry/opentelemetry-python/pull/835)) +- Add type hints to OTLP exporter + ([#1121](https://github.com/open-telemetry/opentelemetry-python/pull/1121)) ## Version 0.12b0 diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 78aea0d550e..079557f831a 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -18,7 +18,7 @@ from abc import ABC, abstractmethod from collections.abc import Mapping, Sequence from time import sleep -from typing import Any, Callable, Dict, Generic, List +from typing import Any, Callable, Dict, Generic, List, Optional from typing import Sequence as TypingSequence from typing import Text, Tuple, TypeVar @@ -129,7 +129,7 @@ def __init__( self, endpoint: str = "localhost:55680", credentials: ChannelCredentials = None, - metadata: Tuple[Any] = None, + metadata: Optional[Tuple[Any]] = None, ): super().__init__() diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py index 94843e95144..5dc4a12b21f 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py @@ -15,13 +15,14 @@ """OTLP Metrics Exporter""" import logging -from typing import Any, List, Sequence, Type, TypeVar +from typing import List, Sequence, Type, TypeVar, Union # pylint: disable=duplicate-code from opentelemetry.exporter.otlp.exporter import ( OTLPExporterMixin, _get_resource_data, ) +from opentelemetry.metrics import InstrumentT from opentelemetry.proto.collector.metrics.v1.metrics_service_pb2 import ( ExportMetricsServiceRequest, ) @@ -92,7 +93,7 @@ def _get_data_points( return data_points -def _get_temporality(instrument: Any): +def _get_temporality(instrument: InstrumentT) -> "MetricDescriptor.TemporalityValue": # pylint: disable=no-member if isinstance(instrument, (Counter, UpDownCounter)): temporality = MetricDescriptor.Temporality.DELTA @@ -110,12 +111,12 @@ def _get_temporality(instrument: Any): return temporality -def _get_type(value_type: Any): +def _get_type(value_type: Union[int, float]) -> "MetricDescriptor.TypeValue": # pylint: disable=no-member - if value_type is int: + if value_type is int: # type: ignore[comparison-overlap] type_ = MetricDescriptor.Type.INT64 - elif value_type is float: + elif value_type is float: # type: ignore[comparison-overlap] type_ = MetricDescriptor.Type.DOUBLE # FIXME What are the types that correspond with From 77dc1f11271e8b05617c9a0173d566e45c3cdcbc Mon Sep 17 00:00:00 2001 From: Amos Law Date: Wed, 16 Sep 2020 18:01:11 -0700 Subject: [PATCH 8/8] Lint --- .../exporter/otlp/metrics_exporter/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py index 5dc4a12b21f..033de0d6ddc 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/metrics_exporter/__init__.py @@ -93,7 +93,9 @@ def _get_data_points( return data_points -def _get_temporality(instrument: InstrumentT) -> "MetricDescriptor.TemporalityValue": +def _get_temporality( + instrument: InstrumentT, +) -> "MetricDescriptor.TemporalityValue": # pylint: disable=no-member if isinstance(instrument, (Counter, UpDownCounter)): temporality = MetricDescriptor.Temporality.DELTA @@ -113,10 +115,10 @@ def _get_temporality(instrument: InstrumentT) -> "MetricDescriptor.TemporalityVa def _get_type(value_type: Union[int, float]) -> "MetricDescriptor.TypeValue": # pylint: disable=no-member - if value_type is int: # type: ignore[comparison-overlap] + if value_type is int: # type: ignore[comparison-overlap] type_ = MetricDescriptor.Type.INT64 - elif value_type is float: # type: ignore[comparison-overlap] + elif value_type is float: # type: ignore[comparison-overlap] type_ = MetricDescriptor.Type.DOUBLE # FIXME What are the types that correspond with