Skip to content
Open
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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#5135](https://github.com/open-telemetry/opentelemetry-python/pull/5135))
- ci: wait for tracecontext server readiness instead of a fixed sleep in `scripts/tracecontext-integration-test.sh`
([#5149](https://github.com/open-telemetry/opentelemetry-python/pull/5149))
- `opentelemetry-exporter-otlp-proto-http`: Generalize OTLP HTTP exporters to allow for alternate HTTP client usage
([#5169](https://github.com/open-telemetry/opentelemetry-python/pull/5169))

## Version 1.41.0/0.62b0 (2026-04-09)

Expand Down
1 change: 1 addition & 0 deletions docs-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ wrapt>=1.0.0,<2.0.0
markupsafe~=2.0
protobuf==5.29.6
prometheus-client~=0.22.1
requests~=2.7
5 changes: 5 additions & 0 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
"wrapt": ("https://wrapt.readthedocs.io/en/latest/", None),
"pymongo": ("https://pymongo.readthedocs.io/en/stable/", None),
"grpc": ("https://grpc.github.io/grpc/python/", None),
"requests": ("https://requests.readthedocs.io/en/latest/", None),
}

# http://www.sphinx-doc.org/en/master/config.html#confval-nitpicky
Expand Down Expand Up @@ -132,6 +133,10 @@
"py:class",
"opentelemetry.exporter.otlp.proto.grpc.exporter.OTLPExporterMixin",
),
(
"py:class",
"opentelemetry.exporter.otlp.proto.http._transport.BaseHTTPTransport",
),
(
"py:class",
"opentelemetry.proto.collector.trace.v1.trace_service_pb2.ExportTraceServiceRequest",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ dependencies = [
"opentelemetry-proto == 1.42.0.dev",
"opentelemetry-sdk ~= 1.42.0.dev",
"opentelemetry-exporter-otlp-proto-common == 1.42.0.dev",
"requests ~= 2.7",
"typing-extensions >= 4.5.0",
"urllib3 >= 1.11"
]

[project.entry-points.opentelemetry_traces_exporter]
Expand All @@ -52,6 +52,9 @@ Repository = "https://github.com/open-telemetry/opentelemetry-python"
gcp-auth = [
"opentelemetry-exporter-credential-provider-gcp >= 0.59b0",
]
requests = [
"requests ~= 2.7"
]

[tool.hatch.version]
path = "src/opentelemetry/exporter/otlp/proto/http/version/__init__.py"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,13 @@
"""

import enum
from typing import Final

from .version import __version__

_OTLP_HTTP_HEADERS = {
_CONTENT_ENCODING_HEADER: Final[str] = "Content-Encoding"

_OTLP_HTTP_HEADERS: Final[dict[str, str]] = {
"Content-Type": "application/x-protobuf",
"User-Agent": "OTel-OTLP-Exporter-Python/" + __version__,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,77 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from __future__ import annotations

from os import environ
from typing import Literal, Optional

import requests
from typing import TYPE_CHECKING, Final, Literal

from opentelemetry.exporter.otlp.proto.http import Compression
from opentelemetry.exporter.otlp.proto.http._transport import BaseHTTPTransport
from opentelemetry.exporter.otlp.proto.http._transport._requests import (
RequestsHTTPTransport,
)
from opentelemetry.exporter.otlp.proto.http._transport._urllib3 import (
Urllib3HTTPTransport,
)
from opentelemetry.sdk.environment_variables import (
_OTEL_PYTHON_EXPORTER_OTLP_HTTP_CREDENTIAL_PROVIDER,
OTEL_EXPORTER_OTLP_COMPRESSION,
OTEL_EXPORTER_OTLP_ENDPOINT,
)
from opentelemetry.util._importlib_metadata import entry_points

if TYPE_CHECKING:
import requests

_DEFAULT_ENDPOINT: Final[str] = "http://localhost:4318"
DEFAULT_COMPRESSION: Final[Compression] = Compression.NoCompression


def _compression_from_env(
signal_compression_envvar: Literal[
"OTEL_EXPORTER_OTLP_LOGS_COMPRESSION",
"OTEL_EXPORTER_OTLP_METRICS_COMPRESSION",
"OTEL_EXPORTER_OTLP_TRACES_COMPRESSION",
],
) -> Compression:
compression = (
environ.get(
signal_compression_envvar,
environ.get(
OTEL_EXPORTER_OTLP_COMPRESSION, DEFAULT_COMPRESSION.value
),
)
.lower()
.strip()
)
return Compression(compression)


def _is_retryable(resp: requests.Response) -> bool:
if resp.status_code == 408:
return True
if resp.status_code >= 500 and resp.status_code <= 599:
return True
return False
def _endpoint_from_env(
signal_endpoint_envvar: Literal[
"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT",
"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT",
"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
],
default_signal_path: Literal["v1/logs", "v1/metrics", "v1/traces"],
) -> str:
base = (
environ.get(
OTEL_EXPORTER_OTLP_ENDPOINT, _DEFAULT_ENDPOINT
).removesuffix("/")
+ "/"
)
return environ.get(signal_endpoint_envvar, base + default_signal_path)


def _load_session_from_envvar(
def _session_from_env(
cred_envvar: Literal[
"OTEL_PYTHON_EXPORTER_OTLP_HTTP_LOGS_CREDENTIAL_PROVIDER",
"OTEL_PYTHON_EXPORTER_OTLP_HTTP_TRACES_CREDENTIAL_PROVIDER",
"OTEL_PYTHON_EXPORTER_OTLP_HTTP_METRICS_CREDENTIAL_PROVIDER",
],
) -> Optional[requests.Session]:
) -> requests.Session | None:
_credential_env = environ.get(
_OTEL_PYTHON_EXPORTER_OTLP_HTTP_CREDENTIAL_PROVIDER
) or environ.get(cred_envvar)
Expand All @@ -56,6 +100,8 @@ def _load_session_from_envvar(
f"Requested component '{_credential_env}' not found in "
f"entry point 'opentelemetry_otlp_credential_provider'"
)
import requests # noqa: PLC0415

if isinstance(maybe_session, requests.Session):
return maybe_session
else:
Expand All @@ -64,3 +110,13 @@ def _load_session_from_envvar(
f" must be of type `requests.Session`."
)
return None


def _transport_from_args(
session: requests.Session | None,
verify: bool | str,
cert: str | tuple[str, str] | None,
) -> BaseHTTPTransport:
if session is not None:
return RequestsHTTPTransport(verify=verify, cert=cert, session=session)
return Urllib3HTTPTransport(verify=verify, cert=cert)
Loading
Loading