diff --git a/README.md b/README.md index 1f4f3de..ab67d5c 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ opentelemetry-instrument gunicorn main:app ## Configuration -The distribution supports all the configuration variables from OpenTelemetry Python project version 1.27.0. +The distribution supports all the configuration variables from OpenTelemetry Python project version 1.28.1. ### Default configuration variables @@ -79,6 +79,7 @@ This distribution sets the following defaults: - `OTEL_METRICS_EXPORTER`: `otlp` - `OTEL_EXPORTER_OTLP_PROTOCOL`: `grpc` - `OTEL_EXPERIMENTAL_RESOURCE_DETECTORS`: `process_runtime,os,otel,telemetry_distro` +- `OTEL_METRICS_EXEMPLAR_FILTER`: `always_off` ### Distribution specific configuration variables diff --git a/dev-requirements.txt b/dev-requirements.txt index e5ae372..4d02b7a 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -36,7 +36,7 @@ iniconfig==2.0.0 # via pytest leb128==1.0.8 # via elastic-opentelemetry (pyproject.toml) -opentelemetry-api==1.27.0 +opentelemetry-api==1.28.1 # via # elastic-opentelemetry (pyproject.toml) # opentelemetry-exporter-otlp-proto-grpc @@ -46,48 +46,50 @@ opentelemetry-api==1.27.0 # opentelemetry-sdk # opentelemetry-semantic-conventions # oteltest -opentelemetry-exporter-otlp==1.27.0 +opentelemetry-exporter-otlp==1.28.1 # via elastic-opentelemetry (pyproject.toml) -opentelemetry-exporter-otlp-proto-common==1.27.0 +opentelemetry-exporter-otlp-proto-common==1.28.1 # via # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-http -opentelemetry-exporter-otlp-proto-grpc==1.27.0 +opentelemetry-exporter-otlp-proto-grpc==1.28.1 # via opentelemetry-exporter-otlp -opentelemetry-exporter-otlp-proto-http==1.27.0 +opentelemetry-exporter-otlp-proto-http==1.28.1 # via opentelemetry-exporter-otlp -opentelemetry-instrumentation==0.48b0 +opentelemetry-instrumentation==0.49b1 # via # elastic-opentelemetry (pyproject.toml) # opentelemetry-instrumentation-system-metrics -opentelemetry-instrumentation-system-metrics==0.48b0 +opentelemetry-instrumentation-system-metrics==0.49b1 # via elastic-opentelemetry (pyproject.toml) -opentelemetry-proto==1.27.0 +opentelemetry-proto==1.28.1 # via # opentelemetry-exporter-otlp-proto-common # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-http # oteltest -opentelemetry-sdk==1.27.0 +opentelemetry-sdk==1.28.1 # via # elastic-opentelemetry (pyproject.toml) # opentelemetry-exporter-otlp-proto-grpc # opentelemetry-exporter-otlp-proto-http -opentelemetry-semantic-conventions==0.48b0 +opentelemetry-semantic-conventions==0.49b1 # via # elastic-opentelemetry (pyproject.toml) + # opentelemetry-instrumentation # opentelemetry-sdk oteltest==0.24.0 # via elastic-opentelemetry (pyproject.toml) packaging==24.1 # via # build + # opentelemetry-instrumentation # pytest pip-tools==7.4.1 # via elastic-opentelemetry (pyproject.toml) pluggy==1.5.0 # via pytest -protobuf==4.25.3 +protobuf==5.28.3 # via # googleapis-common-protos # opentelemetry-proto diff --git a/operator/requirements.txt b/operator/requirements.txt index 2629e70..a22d802 100644 --- a/operator/requirements.txt +++ b/operator/requirements.txt @@ -1,56 +1,56 @@ -opentelemetry-exporter-prometheus==0.48b0 +opentelemetry-exporter-prometheus==0.49b1 opentelemetry-propagator-aws-xray==1.0.2 -opentelemetry-propagator-b3==1.27.0 -opentelemetry-propagator-jaeger==1.27.0 -opentelemetry-propagator-ot-trace==0.48b0 +opentelemetry-propagator-b3==1.28.1 +opentelemetry-propagator-jaeger==1.28.1 +opentelemetry-propagator-ot-trace==0.49b1 -opentelemetry-instrumentation-aio-pika==0.48b0 -opentelemetry-instrumentation-aiohttp-client==0.48b0 -opentelemetry-instrumentation-aiohttp-server==0.48b0 -opentelemetry-instrumentation-aiopg==0.48b0 -opentelemetry-instrumentation-asgi==0.48b0 -opentelemetry-instrumentation-asyncio==0.48b0 -opentelemetry-instrumentation-asyncpg==0.48b0 -opentelemetry-instrumentation-aws-lambda==0.48b0 -opentelemetry-instrumentation-boto==0.48b0 -opentelemetry-instrumentation-boto3sqs==0.48b0 -opentelemetry-instrumentation-botocore==0.48b0 -opentelemetry-instrumentation-cassandra==0.48b0 -opentelemetry-instrumentation-celery==0.48b0 -opentelemetry-instrumentation-confluent-kafka==0.48b0 -opentelemetry-instrumentation-dbapi==0.48b0 -opentelemetry-instrumentation-django==0.48b0 -opentelemetry-instrumentation-elasticsearch==0.48b0 -opentelemetry-instrumentation-falcon==0.48b0 -opentelemetry-instrumentation-fastapi==0.48b0 -opentelemetry-instrumentation-flask==0.48b0 -opentelemetry-instrumentation-grpc==0.48b0 -opentelemetry-instrumentation-httpx==0.48b0 -opentelemetry-instrumentation-jinja2==0.48b0 -opentelemetry-instrumentation-kafka-python==0.48b0 -opentelemetry-instrumentation-logging==0.48b0 -opentelemetry-instrumentation-mysql==0.48b0 -opentelemetry-instrumentation-mysqlclient==0.48b0 -opentelemetry-instrumentation-pika==0.48b0 -opentelemetry-instrumentation-psycopg==0.48b0 -opentelemetry-instrumentation-psycopg2==0.48b0 -opentelemetry-instrumentation-pymemcache==0.48b0 -opentelemetry-instrumentation-pymongo==0.48b0 -opentelemetry-instrumentation-pymysql==0.48b0 -opentelemetry-instrumentation-pyramid==0.48b0 -opentelemetry-instrumentation-redis==0.48b0 -opentelemetry-instrumentation-remoulade==0.48b0 -opentelemetry-instrumentation-requests==0.48b0 -opentelemetry-instrumentation-sqlalchemy==0.48b0 -opentelemetry-instrumentation-sqlite3==0.48b0 -opentelemetry-instrumentation-starlette==0.48b0 -opentelemetry-instrumentation-system-metrics==0.48b0 -opentelemetry-instrumentation-threading==0.48b0 -opentelemetry-instrumentation-tornado==0.48b0 -opentelemetry-instrumentation-tortoiseorm==0.48b0 -opentelemetry-instrumentation-urllib==0.48b0 -opentelemetry-instrumentation-urllib3==0.48b0 -opentelemetry-instrumentation-wsgi==0.48b0 +opentelemetry-instrumentation-aio-pika==0.49b1 +opentelemetry-instrumentation-aiohttp-client==0.49b1 +opentelemetry-instrumentation-aiohttp-server==0.49b1 +opentelemetry-instrumentation-aiokafka==0.49b1 +opentelemetry-instrumentation-aiopg==0.49b1 +opentelemetry-instrumentation-asgi==0.49b1 +opentelemetry-instrumentation-asyncio==0.49b1 +opentelemetry-instrumentation-asyncpg==0.49b1 +opentelemetry-instrumentation-boto==0.49b1 +opentelemetry-instrumentation-boto3sqs==0.49b1 +opentelemetry-instrumentation-botocore==0.49b1 +opentelemetry-instrumentation-cassandra==0.49b1 +opentelemetry-instrumentation-celery==0.49b1 +opentelemetry-instrumentation-confluent-kafka==0.49b1 +opentelemetry-instrumentation-dbapi==0.49b1 +opentelemetry-instrumentation-django==0.49b1 +opentelemetry-instrumentation-elasticsearch==0.49b1 +opentelemetry-instrumentation-falcon==0.49b1 +opentelemetry-instrumentation-fastapi==0.49b1 +opentelemetry-instrumentation-flask==0.49b1 +opentelemetry-instrumentation-grpc==0.49b1 +opentelemetry-instrumentation-httpx==0.49b1 +opentelemetry-instrumentation-jinja2==0.49b1 +opentelemetry-instrumentation-kafka-python==0.49b1 +opentelemetry-instrumentation-logging==0.49b1 +opentelemetry-instrumentation-mysql==0.49b1 +opentelemetry-instrumentation-mysqlclient==0.49b1 +opentelemetry-instrumentation-pika==0.49b1 +opentelemetry-instrumentation-psycopg==0.49b1 +opentelemetry-instrumentation-psycopg2==0.49b1 +opentelemetry-instrumentation-pymemcache==0.49b1 +opentelemetry-instrumentation-pymongo==0.49b1 +opentelemetry-instrumentation-pymysql==0.49b1 +opentelemetry-instrumentation-pyramid==0.49b1 +opentelemetry-instrumentation-redis==0.49b1 +opentelemetry-instrumentation-remoulade==0.49b1 +opentelemetry-instrumentation-requests==0.49b1 +opentelemetry-instrumentation-sqlalchemy==0.49b1 +opentelemetry-instrumentation-sqlite3==0.49b1 +opentelemetry-instrumentation-starlette==0.49b1 +opentelemetry-instrumentation-system-metrics==0.49b1 +opentelemetry-instrumentation-threading==0.49b1 +opentelemetry-instrumentation-tornado==0.49b1 +opentelemetry-instrumentation-tortoiseorm==0.49b1 +opentelemetry-instrumentation-urllib==0.49b1 +opentelemetry-instrumentation-urllib3==0.49b1 +opentelemetry-instrumentation-wsgi==0.49b1 elastic-opentelemetry-instrumentation-openai==0.3.0 diff --git a/pyproject.toml b/pyproject.toml index ef94c73..8aabe07 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,12 +27,12 @@ classifiers = [ ] dependencies = [ - "opentelemetry-api == 1.27.0", - "opentelemetry-exporter-otlp == 1.27.0", - "opentelemetry-instrumentation == 0.48b0", - "opentelemetry-instrumentation-system-metrics == 0.48b0", - "opentelemetry-semantic-conventions == 0.48b0", - "opentelemetry-sdk == 1.27.0", + "opentelemetry-api == 1.28.1", + "opentelemetry-exporter-otlp == 1.28.1", + "opentelemetry-instrumentation == 0.49b1", + "opentelemetry-instrumentation-system-metrics == 0.49b1", + "opentelemetry-semantic-conventions == 0.49b1", + "opentelemetry-sdk == 1.28.1", ] [project.optional-dependencies] diff --git a/src/elasticotel/distro/__init__.py b/src/elasticotel/distro/__init__.py index 1a26e87..d1ac784 100644 --- a/src/elasticotel/distro/__init__.py +++ b/src/elasticotel/distro/__init__.py @@ -30,10 +30,11 @@ ) from opentelemetry.sdk._configuration import _OTelSDKConfigurator from opentelemetry.sdk.environment_variables import ( + OTEL_METRICS_EXEMPLAR_FILTER, OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, OTEL_EXPORTER_OTLP_PROTOCOL, ) -from pkg_resources import EntryPoint +from opentelemetry.util._importlib_metadata import EntryPoint from elasticotel.distro.environment_variables import ELASTIC_OTEL_SYSTEM_METRICS_ENABLED @@ -48,17 +49,9 @@ class ElasticOpenTelemetryConfigurator(_OTelSDKConfigurator): class ElasticOpenTelemetryDistro(BaseDistro): def load_instrumentor(self, entry_point: EntryPoint, **kwargs): # When running in the k8s operator loading of an instrumentor may fail because the environment - # in which python extensions are built does not match the one from the running container. - # There are at least two cases: - # - different python version - # - different kind of wheels, e.g. manylinux vs musllinux - # To avoid the distro loading to fail catch ImportError here, that is the kind of exception we see - # when loading shared objects or cython extensions fails. - try: - instrumentor_class: BaseInstrumentor = entry_point.load() - except ImportError: - logger.exception("Instrumenting of %s failed", entry_point.name) - return + # in which python extensions are built does not match the one from the running container but + # ImportErrors raised here are handled by the autoinstrumentation code + instrumentor_class: BaseInstrumentor = entry_point.load() instrumentor_kwargs = {} if instrumentor_class == SystemMetricsInstrumentor: @@ -76,3 +69,5 @@ def _configure(self, **kwargs): os.environ.setdefault(OTEL_LOGS_EXPORTER, "otlp") os.environ.setdefault(OTEL_EXPORTER_OTLP_PROTOCOL, "grpc") os.environ.setdefault(OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, "process_runtime,os,otel,telemetry_distro") + # disable exemplars by default for now + os.environ.setdefault(OTEL_METRICS_EXEMPLAR_FILTER, "always_off") diff --git a/tests/distro/test_distro.py b/tests/distro/test_distro.py index 89e65c4..6f37c20 100644 --- a/tests/distro/test_distro.py +++ b/tests/distro/test_distro.py @@ -25,6 +25,7 @@ OTEL_TRACES_EXPORTER, ) from opentelemetry.sdk.environment_variables import ( + OTEL_METRICS_EXEMPLAR_FILTER, OTEL_EXPERIMENTAL_RESOURCE_DETECTORS, OTEL_EXPORTER_OTLP_PROTOCOL, ) @@ -42,6 +43,7 @@ def test_default_configuration(self): self.assertEqual( "process_runtime,os,otel,telemetry_distro", os.environ.get(OTEL_EXPERIMENTAL_RESOURCE_DETECTORS) ) + self.assertEqual("always_off", os.environ.get(OTEL_METRICS_EXEMPLAR_FILTER)) @mock.patch.dict("os.environ", {}, clear=True) def test_load_instrumentor_call_with_default_kwargs_for_SystemMetricsInstrumentor(self): @@ -85,18 +87,3 @@ def test_load_instrumentor_default_kwargs_for_instrumentors(self): distro.load_instrumentor(entryPoint_mock) instrumentor_mock.assert_called_once_with() - - def test_load_instrumentor_handles_import_error_from_instrumentor_loading(self): - distro = ElasticOpenTelemetryDistro() - entryPoint_mock = mock.Mock() - entryPoint_mock.load.side_effect = ImportError - - distro.load_instrumentor(entryPoint_mock) - - def test_load_instrumentor_forwards_exceptions(self): - distro = ElasticOpenTelemetryDistro() - entryPoint_mock = mock.Mock() - entryPoint_mock.load.side_effect = ValueError - - with self.assertRaises(ValueError): - distro.load_instrumentor(entryPoint_mock) diff --git a/tests/integration/utils.py b/tests/integration/utils.py index 8bfedaf..67f5675 100644 --- a/tests/integration/utils.py +++ b/tests/integration/utils.py @@ -24,11 +24,11 @@ from typing import Callable, Mapping, Optional import leb128 -import pkg_resources +from opentelemetry.util._importlib_metadata import version from oteltest import private as ot -OTEL_VERSION = pkg_resources.get_distribution("opentelemetry-api").version -OTEL_INSTRUMENTATION_VERSION = pkg_resources.get_distribution("opentelemetry-instrumentation").version +OTEL_VERSION = version("opentelemetry-api") +OTEL_INSTRUMENTATION_VERSION = version("opentelemetry-instrumentation") ROOT_DIR = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))