Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down
24 changes: 13 additions & 11 deletions dev-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
102 changes: 51 additions & 51 deletions operator/requirements.txt
Original file line number Diff line number Diff line change
@@ -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
12 changes: 6 additions & 6 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
19 changes: 7 additions & 12 deletions src/elasticotel/distro/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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:
Expand All @@ -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")
17 changes: 2 additions & 15 deletions tests/distro/test_distro.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand All @@ -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):
Expand Down Expand Up @@ -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)
6 changes: 3 additions & 3 deletions tests/integration/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__))))

Expand Down