diff --git a/.changelog/5387.fixed b/.changelog/5387.fixed new file mode 100644 index 00000000000..552c9c14f80 --- /dev/null +++ b/.changelog/5387.fixed @@ -0,0 +1 @@ +`opentelemetry-exporter-otlp-common`: remove dependency on incubating attributes from OTLP exporters diff --git a/docs/getting_started/tests/requirements.txt b/docs/getting_started/tests/requirements.txt index a9e878ddbad..e1beb185be3 100644 --- a/docs/getting_started/tests/requirements.txt +++ b/docs/getting_started/tests/requirements.txt @@ -23,5 +23,6 @@ wrapt==1.15.0 -e opentelemetry-proto -e exporter/opentelemetry-exporter-otlp-proto-common -e exporter/opentelemetry-exporter-otlp-proto-grpc +-e exporter/opentelemetry-exporter-otlp-common -e opentelemetry-api -e opentelemetry-sdk diff --git a/exporter/opentelemetry-exporter-otlp-common/pyproject.toml b/exporter/opentelemetry-exporter-otlp-common/pyproject.toml index 70413faa1c8..0e693dbf2e1 100644 --- a/exporter/opentelemetry-exporter-otlp-common/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-common/pyproject.toml @@ -26,6 +26,7 @@ classifiers = [ "Programming Language :: Python :: 3.14", ] dependencies = [ + "opentelemetry-api ~= 1.15", "opentelemetry-sdk ~= 1.44.0.dev", ] diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py b/exporter/opentelemetry-exporter-otlp-common/src/opentelemetry/exporter/otlp/common/_exporter_metrics/__init__.py similarity index 64% rename from exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py rename to exporter/opentelemetry-exporter-otlp-common/src/opentelemetry/exporter/otlp/common/_exporter_metrics/__init__.py index 6b3d1d76fa3..134853be3f8 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py +++ b/exporter/opentelemetry-exporter-otlp-common/src/opentelemetry/exporter/otlp/common/_exporter_metrics/__init__.py @@ -10,26 +10,22 @@ from time import perf_counter from typing import TYPE_CHECKING, Protocol -from opentelemetry.metrics import MeterProvider, get_meter_provider -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OTEL_COMPONENT_NAME, - OTEL_COMPONENT_TYPE, +from opentelemetry.exporter.otlp.common._exporter_metrics.semconv import ( + _ERROR_TYPE, + _OTEL_COMPONENT_NAME, + _OTEL_COMPONENT_TYPE, + _SERVER_ADDRESS, + _SERVER_PORT, OtelComponentTypeValues, + _create_otel_sdk_exporter_log_exported, + _create_otel_sdk_exporter_log_inflight, + _create_otel_sdk_exporter_metric_data_point_exported, + _create_otel_sdk_exporter_metric_data_point_inflight, + _create_otel_sdk_exporter_operation_duration, + _create_otel_sdk_exporter_span_exported, + _create_otel_sdk_exporter_span_inflight, ) -from opentelemetry.semconv._incubating.metrics.otel_metrics import ( - create_otel_sdk_exporter_log_exported, - create_otel_sdk_exporter_log_inflight, - create_otel_sdk_exporter_metric_data_point_exported, - create_otel_sdk_exporter_metric_data_point_inflight, - create_otel_sdk_exporter_operation_duration, - create_otel_sdk_exporter_span_exported, - create_otel_sdk_exporter_span_inflight, -) -from opentelemetry.semconv.attributes.error_attributes import ERROR_TYPE -from opentelemetry.semconv.attributes.server_attributes import ( - SERVER_ADDRESS, - SERVER_PORT, -) +from opentelemetry.metrics import MeterProvider, get_meter_provider if TYPE_CHECKING: from typing import Literal @@ -54,6 +50,7 @@ def export_operation( class NoOpExporterMetrics: @contextmanager + # pylint: disable-next=no-self-use def export_operation(self, num_items: int) -> Iterator[ExportResult]: yield ExportResult() @@ -66,20 +63,6 @@ def __init__( endpoint: UrlParseResult, meter_provider: MeterProvider | None, ) -> None: - if signal == "traces": - create_exported = create_otel_sdk_exporter_span_exported - create_inflight = create_otel_sdk_exporter_span_inflight - elif signal == "logs": - create_exported = create_otel_sdk_exporter_log_exported - create_inflight = create_otel_sdk_exporter_log_inflight - else: - create_exported = ( - create_otel_sdk_exporter_metric_data_point_exported - ) - create_inflight = ( - create_otel_sdk_exporter_metric_data_point_inflight - ) - port = endpoint.port if port is None: if endpoint.scheme == "https": @@ -93,19 +76,31 @@ def __init__( count = _component_counter[component_type_value] _component_counter[component_type_value] = count + 1 self._standard_attrs: dict[str, AttributeValue] = { - OTEL_COMPONENT_TYPE: component_type_value, - OTEL_COMPONENT_NAME: f"{component_type_value}/{count}", + _OTEL_COMPONENT_TYPE: component_type_value, + _OTEL_COMPONENT_NAME: f"{component_type_value}/{count}", } if endpoint.hostname: - self._standard_attrs[SERVER_ADDRESS] = endpoint.hostname + self._standard_attrs[_SERVER_ADDRESS] = endpoint.hostname if port is not None: - self._standard_attrs[SERVER_PORT] = port + self._standard_attrs[_SERVER_PORT] = port meter_provider = meter_provider or get_meter_provider() meter = meter_provider.get_meter("opentelemetry-sdk") - self._inflight = create_inflight(meter) - self._exported = create_exported(meter) - self._duration = create_otel_sdk_exporter_operation_duration(meter) + self._duration = _create_otel_sdk_exporter_operation_duration(meter) + match signal: + case "traces": + self._inflight = _create_otel_sdk_exporter_span_inflight(meter) + self._exported = _create_otel_sdk_exporter_span_exported(meter) + case "logs": + self._inflight = _create_otel_sdk_exporter_log_inflight(meter) + self._exported = _create_otel_sdk_exporter_log_exported(meter) + case _: + self._inflight = ( + _create_otel_sdk_exporter_metric_data_point_inflight(meter) + ) + self._exported = ( + _create_otel_sdk_exporter_metric_data_point_exported(meter) + ) @contextmanager def export_operation(self, num_items: int) -> Iterator[ExportResult]: @@ -122,7 +117,7 @@ def export_operation(self, num_items: int) -> Iterator[ExportResult]: end_time = perf_counter() self._inflight.add(-num_items, self._standard_attrs) exported_attrs = ( - {**self._standard_attrs, ERROR_TYPE: type(error).__qualname__} + {**self._standard_attrs, _ERROR_TYPE: type(error).__qualname__} if error else self._standard_attrs ) diff --git a/exporter/opentelemetry-exporter-otlp-common/src/opentelemetry/exporter/otlp/common/_exporter_metrics/semconv.py b/exporter/opentelemetry-exporter-otlp-common/src/opentelemetry/exporter/otlp/common/_exporter_metrics/semconv.py new file mode 100644 index 00000000000..561e9428a3b --- /dev/null +++ b/exporter/opentelemetry-exporter-otlp-common/src/opentelemetry/exporter/otlp/common/_exporter_metrics/semconv.py @@ -0,0 +1,117 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# TODO: This file should be removed once the exporter specific +# metrics become stable (i.e. they are no longer incubating) + +from __future__ import annotations + +from enum import Enum +from typing import TYPE_CHECKING, Final + +if TYPE_CHECKING: + from opentelemetry.metrics import Counter, Histogram, Meter, UpDownCounter + +# TODO: Remove these attributes once "opentelemetry-semantic-conventions" +# becomes stable (i.e. reaches 1.x.y) +_ERROR_TYPE: Final[str] = "error.type" +_SERVER_ADDRESS: Final[str] = "server.address" +_SERVER_PORT: Final[str] = "server.port" + + +class OtelComponentTypeValues(Enum): + OTLP_GRPC_SPAN_EXPORTER = "otlp_grpc_span_exporter" + OTLP_HTTP_SPAN_EXPORTER = "otlp_http_span_exporter" + OTLP_HTTP_JSON_SPAN_EXPORTER = "otlp_http_json_span_exporter" + ZIPKIN_HTTP_SPAN_EXPORTER = "zipkin_http_span_exporter" + OTLP_GRPC_LOG_EXPORTER = "otlp_grpc_log_exporter" + OTLP_HTTP_LOG_EXPORTER = "otlp_http_log_exporter" + OTLP_HTTP_JSON_LOG_EXPORTER = "otlp_http_json_log_exporter" + OTLP_GRPC_METRIC_EXPORTER = "otlp_grpc_metric_exporter" + OTLP_HTTP_METRIC_EXPORTER = "otlp_http_metric_exporter" + OTLP_HTTP_JSON_METRIC_EXPORTER = "otlp_http_json_metric_exporter" + PROMETHEUS_HTTP_TEXT_METRIC_EXPORTER = ( + "prometheus_http_text_metric_exporter" + ) + + +_OTEL_COMPONENT_NAME: Final[str] = "otel.component.name" +_OTEL_COMPONENT_TYPE: Final[str] = "otel.component.type" + +_OTEL_SDK_EXPORTER_SPAN_EXPORTED: Final[str] = ( + "otel.sdk.exporter.span.exported" +) +_OTEL_SDK_EXPORTER_SPAN_INFLIGHT: Final[str] = ( + "otel.sdk.exporter.span.inflight" +) +_OTEL_SDK_EXPORTER_LOG_EXPORTED: Final[str] = "otel.sdk.exporter.log.exported" +_OTEL_SDK_EXPORTER_LOG_INFLIGHT: Final[str] = "otel.sdk.exporter.log.inflight" +_OTEL_SDK_EXPORTER_METRIC_DATA_POINT_EXPORTED: Final[str] = ( + "otel.sdk.exporter.metric_data_point.exported" +) +_OTEL_SDK_EXPORTER_METRIC_DATA_POINT_INFLIGHT: Final[str] = ( + "otel.sdk.exporter.metric_data_point.inflight" +) +_OTEL_SDK_EXPORTER_OPERATION_DURATION: Final[str] = ( + "otel.sdk.exporter.operation.duration" +) + + +def _create_otel_sdk_exporter_span_exported(meter: Meter) -> Counter: + return meter.create_counter( + name=_OTEL_SDK_EXPORTER_SPAN_EXPORTED, + description="The number of spans for which the export has finished, either successful or failed.", + unit="{span}", + ) + + +def _create_otel_sdk_exporter_span_inflight(meter: Meter) -> UpDownCounter: + return meter.create_up_down_counter( + name=_OTEL_SDK_EXPORTER_SPAN_INFLIGHT, + description="The number of spans which were passed to the exporter, but that have not been exported yet (neither successful, nor failed).", + unit="{span}", + ) + + +def _create_otel_sdk_exporter_log_exported(meter: Meter) -> Counter: + return meter.create_counter( + name=_OTEL_SDK_EXPORTER_LOG_EXPORTED, + description="The number of log records for which the export has finished, either successful or failed.", + unit="{log_record}", + ) + + +def _create_otel_sdk_exporter_log_inflight(meter: Meter) -> UpDownCounter: + return meter.create_up_down_counter( + name=_OTEL_SDK_EXPORTER_LOG_INFLIGHT, + description="The number of log records which were passed to the exporter, but that have not been exported yet (neither successful, nor failed).", + unit="{log_record}", + ) + + +def _create_otel_sdk_exporter_metric_data_point_exported( + meter: Meter, +) -> Counter: + return meter.create_counter( + name=_OTEL_SDK_EXPORTER_METRIC_DATA_POINT_EXPORTED, + description="The number of metric data points for which the export has finished, either successful or failed.", + unit="{data_point}", + ) + + +def _create_otel_sdk_exporter_metric_data_point_inflight( + meter: Meter, +) -> UpDownCounter: + return meter.create_up_down_counter( + name=_OTEL_SDK_EXPORTER_METRIC_DATA_POINT_INFLIGHT, + description="The number of metric data points which were passed to the exporter, but that have not been exported yet (neither successful, nor failed).", + unit="{data_point}", + ) + + +def _create_otel_sdk_exporter_operation_duration(meter: Meter) -> Histogram: + return meter.create_histogram( + name=_OTEL_SDK_EXPORTER_OPERATION_DURATION, + description="The duration of exporting a batch of telemetry records.", + unit="s", + ) diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_exporter_metrics.py b/exporter/opentelemetry-exporter-otlp-common/tests/test_exporter_metrics.py similarity index 89% rename from exporter/opentelemetry-exporter-otlp-proto-common/tests/test_exporter_metrics.py rename to exporter/opentelemetry-exporter-otlp-common/tests/test_exporter_metrics.py index e6c1a601c07..03dd2ee42d5 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_exporter_metrics.py +++ b/exporter/opentelemetry-exporter-otlp-common/tests/test_exporter_metrics.py @@ -5,13 +5,11 @@ from unittest.mock import Mock, patch from urllib.parse import urlparse -from opentelemetry.exporter.otlp.proto.common._exporter_metrics import ( +from opentelemetry.exporter.otlp.common._exporter_metrics import ( ExporterMetrics, NoOpExporterMetrics, - create_exporter_metrics, -) -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OtelComponentTypeValues, + create_exporter_metrics, ) @@ -20,7 +18,7 @@ def test_factory_returns_noop_when_disabled(self): meter_provider = Mock() with patch( - "opentelemetry.exporter.otlp.proto.common." + "opentelemetry.exporter.otlp.common." "_exporter_metrics.get_meter_provider" ) as get_meter_provider: metrics = create_exporter_metrics( diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml index ec298864238..6a85870944a 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml @@ -33,6 +33,7 @@ dependencies = [ "opentelemetry-api ~= 1.15", "opentelemetry-proto == 1.44.0.dev", "opentelemetry-sdk ~= 1.44.0.dev", + "opentelemetry-exporter-otlp-common == 0.65b0.dev", "opentelemetry-exporter-otlp-proto-common == 1.44.0.dev", "typing-extensions >= 4.6.0", ] diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py index 6afc1335c09..28fe217978e 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py @@ -7,6 +7,9 @@ from typing import Literal from grpc import ChannelCredentials, Compression, StatusCode +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, +) from opentelemetry.exporter.otlp.proto.common._log_encoder import encode_logs from opentelemetry.exporter.otlp.proto.grpc.exporter import ( OTLPExporterMixin, @@ -36,9 +39,6 @@ OTEL_EXPORTER_OTLP_LOGS_INSECURE, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT, ) -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) class OTLPLogExporter( diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py index f7fa0b8697d..fa2671084a3 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py @@ -44,7 +44,8 @@ secure_channel, ssl_channel_credentials, ) -from opentelemetry.exporter.otlp.proto.common._exporter_metrics import ( +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, create_exporter_metrics, ) from opentelemetry.exporter.otlp.proto.common._internal import ( @@ -98,9 +99,6 @@ from opentelemetry.sdk.resources import Resource as SDKResource from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import SpanExportResult -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) from opentelemetry.semconv._incubating.attributes.rpc_attributes import ( RPC_RESPONSE_STATUS_CODE, ) 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 de97551f9fe..79321228461 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 @@ -10,6 +10,9 @@ from os import environ from grpc import ChannelCredentials, Compression, StatusCode +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, +) from opentelemetry.exporter.otlp.proto.common._internal.metrics_encoder import ( OTLPMetricExporterMixin, ) @@ -63,9 +66,6 @@ from opentelemetry.sdk.metrics.export import ( # noqa: F401 Histogram as HistogramType, ) -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) _logger = getLogger(__name__) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py index 7d396c17a80..d420f93120e 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py @@ -9,6 +9,9 @@ from os import environ from grpc import ChannelCredentials, Compression, StatusCode +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, +) from opentelemetry.exporter.otlp.proto.common.trace_encoder import ( encode_spans, ) @@ -49,9 +52,6 @@ ) from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) logger = logging.getLogger(__name__) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in b/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in index 67ed64abf5d..59ab2f8d9a3 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in @@ -6,6 +6,7 @@ protobuf>=5.29.5 pytest>=7.4.4 -e opentelemetry-api -e tests/opentelemetry-test-utils +-e exporter/opentelemetry-exporter-otlp-common -e exporter/opentelemetry-exporter-otlp-proto-common -e opentelemetry-proto -e opentelemetry-sdk diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.latest.txt b/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.latest.txt index e727780fe58..2c5c0860877 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.latest.txt +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.latest.txt @@ -1,5 +1,9 @@ # This file was autogenerated by uv via the following command: # uv pip compile --python 3.10 --universal -c dev-requirements.txt exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in -o exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.latest.txt +-e exporter/opentelemetry-exporter-otlp-common + # via + # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in + # opentelemetry-exporter-otlp-proto-grpc -e exporter/opentelemetry-exporter-otlp-proto-common # via # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in @@ -9,6 +13,7 @@ -e opentelemetry-api # via # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in + # opentelemetry-exporter-otlp-common # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-sdk # opentelemetry-semantic-conventions @@ -21,6 +26,7 @@ -e opentelemetry-sdk # via # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in + # opentelemetry-exporter-otlp-common # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-test-utils -e opentelemetry-semantic-conventions diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.oldest.txt b/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.oldest.txt index 330ca72eaa9..c5d978d6452 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.oldest.txt +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.oldest.txt @@ -1,5 +1,9 @@ # This file was autogenerated by uv via the following command: # uv pip compile --python 3.10 --universal --resolution lowest -c dev-requirements.txt exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in -o exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.oldest.txt +-e exporter/opentelemetry-exporter-otlp-common + # via + # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in + # opentelemetry-exporter-otlp-proto-grpc -e exporter/opentelemetry-exporter-otlp-proto-common # via # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in @@ -9,6 +13,7 @@ -e opentelemetry-api # via # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in + # opentelemetry-exporter-otlp-common # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-sdk # opentelemetry-semantic-conventions @@ -21,6 +26,7 @@ -e opentelemetry-sdk # via # -r exporter/opentelemetry-exporter-otlp-proto-grpc/test-requirements.in + # opentelemetry-exporter-otlp-common # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-test-utils -e opentelemetry-semantic-conventions diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py index 50996264a09..56b0d700a0f 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py @@ -23,6 +23,9 @@ ) from grpc import ChannelCredentials, Compression, StatusCode, server +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, +) from opentelemetry.exporter.otlp.proto.common.trace_encoder import ( encode_spans, ) @@ -54,9 +57,6 @@ SpanExporter, SpanExportResult, ) -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) from opentelemetry.test.mock_test_classes import IterEntryPoint logger = getLogger(__name__) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml index db7915af4d7..9f77fa4527d 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml @@ -30,6 +30,7 @@ dependencies = [ "opentelemetry-api ~= 1.15", "opentelemetry-proto == 1.44.0.dev", "opentelemetry-sdk ~= 1.44.0.dev", + "opentelemetry-exporter-otlp-common == 0.65b0.dev", "opentelemetry-exporter-otlp-proto-common == 1.44.0.dev", "requests ~= 2.7", "typing-extensions >= 4.5.0", diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py index 56906b96501..c51d505cab5 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py @@ -16,7 +16,8 @@ import requests from requests.exceptions import ConnectionError -from opentelemetry.exporter.otlp.proto.common._exporter_metrics import ( +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, create_exporter_metrics, ) from opentelemetry.exporter.otlp.proto.common._log_encoder import encode_logs @@ -53,9 +54,6 @@ OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) from opentelemetry.semconv.attributes.http_attributes import ( HTTP_RESPONSE_STATUS_CODE, ) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py index eb1e69cfe4f..fcf5572914b 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py @@ -22,7 +22,8 @@ from requests.exceptions import ConnectionError from typing_extensions import deprecated -from opentelemetry.exporter.otlp.proto.common._exporter_metrics import ( +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, create_exporter_metrics, ) from opentelemetry.exporter.otlp.proto.common._internal import ( @@ -89,9 +90,6 @@ Histogram as HistogramType, ) from opentelemetry.sdk.resources import Resource as SDKResource -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) from opentelemetry.semconv.attributes.http_attributes import ( HTTP_RESPONSE_STATUS_CODE, ) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py index 2be240103c0..dc9b8c2997b 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py @@ -16,7 +16,8 @@ import requests from requests.exceptions import ConnectionError -from opentelemetry.exporter.otlp.proto.common._exporter_metrics import ( +from opentelemetry.exporter.otlp.common._exporter_metrics import ( + OtelComponentTypeValues, create_exporter_metrics, ) from opentelemetry.exporter.otlp.proto.common.trace_encoder import ( @@ -51,9 +52,6 @@ ) from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult -from opentelemetry.semconv._incubating.attributes.otel_attributes import ( - OtelComponentTypeValues, -) from opentelemetry.semconv.attributes.http_attributes import ( HTTP_RESPONSE_STATUS_CODE, ) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements.txt b/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements.txt index 1ebae084c42..0d20759bf27 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements.txt +++ b/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements.txt @@ -18,6 +18,7 @@ urllib3==2.2.2 wrapt==1.16.0 -e opentelemetry-api -e tests/opentelemetry-test-utils +-e exporter/opentelemetry-exporter-otlp-common -e exporter/opentelemetry-exporter-otlp-proto-common -e opentelemetry-proto -e opentelemetry-sdk diff --git a/exporter/opentelemetry-exporter-otlp/test-requirements.txt b/exporter/opentelemetry-exporter-otlp/test-requirements.txt index e1119b8a4c4..f4aa76a6743 100644 --- a/exporter/opentelemetry-exporter-otlp/test-requirements.txt +++ b/exporter/opentelemetry-exporter-otlp/test-requirements.txt @@ -12,6 +12,7 @@ wrapt==1.16.0 -e exporter/opentelemetry-exporter-otlp-proto-common -e exporter/opentelemetry-exporter-otlp-proto-grpc -e exporter/opentelemetry-exporter-otlp-proto-http +-e exporter/opentelemetry-exporter-otlp-common -e opentelemetry-proto -e opentelemetry-sdk -e opentelemetry-semantic-conventions diff --git a/pyproject.toml b/pyproject.toml index a273dff32da..1e1cc24af24 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ dependencies = [ "opentelemetry-exporter-otlp-proto-grpc", "opentelemetry-exporter-otlp-proto-http", "opentelemetry-exporter-otlp-proto-common", + "opentelemetry-exporter-otlp-common", "opentelemetry-exporter-otlp-json-common", "opentelemetry-exporter-zipkin-json", "opentelemetry-exporter-prometheus", @@ -39,6 +40,7 @@ opentelemetry-exporter-http-transport = { workspace = true } opentelemetry-exporter-otlp-proto-grpc = { workspace = true } opentelemetry-exporter-otlp-proto-http = { workspace = true } opentelemetry-exporter-otlp-proto-common = { workspace = true } +opentelemetry-exporter-otlp-common = { workspace = true } opentelemetry-exporter-otlp-json-common = { workspace = true } opentelemetry-exporter-zipkin-json = { workspace = true } opentelemetry-exporter-prometheus = {workspace = true } diff --git a/tests/opentelemetry-test-utils/test-requirements.txt b/tests/opentelemetry-test-utils/test-requirements.txt index 7cb9414f47d..8daca31fe5e 100644 --- a/tests/opentelemetry-test-utils/test-requirements.txt +++ b/tests/opentelemetry-test-utils/test-requirements.txt @@ -16,3 +16,4 @@ wrapt==1.16.0 ./opentelemetry-proto ; platform_python_implementation != 'PyPy' ./exporter/opentelemetry-exporter-otlp-proto-common ; platform_python_implementation != 'PyPy' ./exporter/opentelemetry-exporter-otlp-proto-grpc ; platform_python_implementation != 'PyPy' +./exporter/opentelemetry-exporter-otlp-common ; platform_python_implementation != 'PyPy' diff --git a/tox.ini b/tox.ini index 1acd90d9764..d04448e2051 100644 --- a/tox.ini +++ b/tox.ini @@ -367,6 +367,7 @@ deps = otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http + otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp-common otlpexporter: -e {toxinidir}/exporter/opentelemetry-exporter-otlp opencensus: -e {toxinidir}/exporter/opentelemetry-exporter-opencensus @@ -432,6 +433,7 @@ deps = -e {toxinidir}/opentelemetry-sdk[file-configuration] -e {toxinidir}/tests/opentelemetry-test-utils -e {toxinidir}/exporter/opentelemetry-exporter-http-transport + -e {toxinidir}/exporter/opentelemetry-exporter-otlp-common -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common -e {toxinidir}/exporter/opentelemetry-exporter-otlp-json-common -e {toxinidir}/exporter/opentelemetry-exporter-otlp diff --git a/uv.lock b/uv.lock index 55fc9ceef21..3e0f27bc9c8 100644 --- a/uv.lock +++ b/uv.lock @@ -883,6 +883,7 @@ requires-dist = [ name = "opentelemetry-exporter-otlp-common" source = { editable = "exporter/opentelemetry-exporter-otlp-common" } dependencies = [ + { name = "opentelemetry-api" }, { name = "opentelemetry-sdk" }, ] @@ -893,6 +894,7 @@ http = [ [package.metadata] requires-dist = [ + { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-exporter-http-transport", marker = "extra == 'http'", editable = "exporter/opentelemetry-exporter-http-transport" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, ] @@ -943,6 +945,7 @@ dependencies = [ { name = "googleapis-common-protos" }, { name = "grpcio" }, { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-common" }, { name = "opentelemetry-exporter-otlp-proto-common" }, { name = "opentelemetry-proto" }, { name = "opentelemetry-sdk" }, @@ -962,6 +965,7 @@ requires-dist = [ { name = "grpcio", marker = "python_full_version >= '3.14'", specifier = ">=1.75.1,<2.0.0" }, { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-exporter-credential-provider-gcp", marker = "extra == 'gcp-auth'", specifier = ">=0.59b0" }, + { name = "opentelemetry-exporter-otlp-common", editable = "exporter/opentelemetry-exporter-otlp-common" }, { name = "opentelemetry-exporter-otlp-proto-common", editable = "exporter/opentelemetry-exporter-otlp-proto-common" }, { name = "opentelemetry-proto", editable = "opentelemetry-proto" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, @@ -975,6 +979,7 @@ source = { editable = "exporter/opentelemetry-exporter-otlp-proto-http" } dependencies = [ { name = "googleapis-common-protos" }, { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-common" }, { name = "opentelemetry-exporter-otlp-proto-common" }, { name = "opentelemetry-proto" }, { name = "opentelemetry-sdk" }, @@ -992,6 +997,7 @@ requires-dist = [ { name = "googleapis-common-protos", specifier = "~=1.52" }, { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-exporter-credential-provider-gcp", marker = "extra == 'gcp-auth'", specifier = ">=0.59b0" }, + { name = "opentelemetry-exporter-otlp-common", editable = "exporter/opentelemetry-exporter-otlp-common" }, { name = "opentelemetry-exporter-otlp-proto-common", editable = "exporter/opentelemetry-exporter-otlp-proto-common" }, { name = "opentelemetry-proto", editable = "opentelemetry-proto" }, { name = "opentelemetry-sdk", editable = "opentelemetry-sdk" }, @@ -1078,6 +1084,7 @@ dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-codegen-json" }, { name = "opentelemetry-exporter-http-transport" }, + { name = "opentelemetry-exporter-otlp-common" }, { name = "opentelemetry-exporter-otlp-json-common" }, { name = "opentelemetry-exporter-otlp-json-file" }, { name = "opentelemetry-exporter-otlp-proto-common" }, @@ -1108,6 +1115,7 @@ requires-dist = [ { name = "opentelemetry-api", editable = "opentelemetry-api" }, { name = "opentelemetry-codegen-json", editable = "codegen/opentelemetry-codegen-json" }, { name = "opentelemetry-exporter-http-transport", editable = "exporter/opentelemetry-exporter-http-transport" }, + { name = "opentelemetry-exporter-otlp-common", editable = "exporter/opentelemetry-exporter-otlp-common" }, { name = "opentelemetry-exporter-otlp-json-common", editable = "exporter/opentelemetry-exporter-otlp-json-common" }, { name = "opentelemetry-exporter-otlp-json-file", editable = "exporter/opentelemetry-exporter-otlp-json-file" }, { name = "opentelemetry-exporter-otlp-proto-common", editable = "exporter/opentelemetry-exporter-otlp-proto-common" },