odigos-opentelemetry-python 1.0.84__tar.gz → 1.0.86__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/PKG-INFO +1 -1
  2. odigos_opentelemetry_python-1.0.86/initializer/version.py +1 -0
  3. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/odigos_opentelemetry_python.egg-info/PKG-INFO +1 -1
  4. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/odigos_opentelemetry_python.egg-info/SOURCES.txt +1 -0
  5. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/http_client.py +11 -19
  6. odigos_opentelemetry_python-1.0.86/opamp/transport.py +64 -0
  7. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/pyproject.toml +1 -1
  8. odigos_opentelemetry_python-1.0.84/initializer/version.py +0 -1
  9. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/LICENSE +0 -0
  10. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/README.md +0 -0
  11. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/__init__.py +0 -0
  12. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/components.py +0 -0
  13. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/distro/__init__.py +0 -0
  14. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/distro/distro.py +0 -0
  15. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/distro/instrumentation_registry.py +0 -0
  16. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/envs.py +0 -0
  17. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/exit_hook.py +0 -0
  18. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/lib_handling.py +0 -0
  19. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/odigos_sampler.py +0 -0
  20. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/odigos_sampler_helpers.py +0 -0
  21. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/post_instrument.py +0 -0
  22. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/process_resource.py +0 -0
  23. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/schemas/__init__.py +0 -0
  24. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/initializer/schemas/sampling.py +0 -0
  25. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/odigos_opentelemetry_python.egg-info/dependency_links.txt +0 -0
  26. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/odigos_opentelemetry_python.egg-info/entry_points.txt +0 -0
  27. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/odigos_opentelemetry_python.egg-info/requires.txt +0 -0
  28. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/odigos_opentelemetry_python.egg-info/top_level.txt +0 -0
  29. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/__init__.py +0 -0
  30. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/anyvalue_pb2.py +0 -0
  31. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/config.py +0 -0
  32. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/health_status.py +0 -0
  33. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/opamp_pb2.py +0 -0
  34. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/opamp_registry.py +0 -0
  35. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/opamp/utils.py +0 -0
  36. {odigos_opentelemetry_python-1.0.84 → odigos_opentelemetry_python-1.0.86}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odigos-opentelemetry-python
3
- Version: 1.0.84
3
+ Version: 1.0.86
4
4
  Summary: Odigos Initializer for Python OpenTelemetry Components
5
5
  Author-email: odigos-io <support@odigos.io>
6
6
  Requires-Python: >=3.9
@@ -0,0 +1 @@
1
+ VERSION = "1.0.86"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odigos-opentelemetry-python
3
- Version: 1.0.84
3
+ Version: 1.0.86
4
4
  Summary: Odigos Initializer for Python OpenTelemetry Components
5
5
  Author-email: odigos-io <support@odigos.io>
6
6
  Requires-Python: >=3.9
@@ -29,4 +29,5 @@ opamp/health_status.py
29
29
  opamp/http_client.py
30
30
  opamp/opamp_pb2.py
31
31
  opamp/opamp_registry.py
32
+ opamp/transport.py
32
33
  opamp/utils.py
@@ -6,6 +6,7 @@ import base64
6
6
  import threading
7
7
  import requests_odigos
8
8
  import logging
9
+ from typing import Optional
9
10
 
10
11
  from uuid_extensions import uuid7
11
12
  from opentelemetry.semconv.resource import ResourceAttributes
@@ -16,7 +17,7 @@ from opentelemetry.context import (
16
17
  set_value,
17
18
  )
18
19
 
19
- from opamp import opamp_pb2, anyvalue_pb2, utils
20
+ from opamp import opamp_pb2, anyvalue_pb2, transport, utils
20
21
  from opamp.health_status import AgentHealthStatus
21
22
  from initializer.process_resource import PROCESS_VPID
22
23
 
@@ -39,8 +40,7 @@ env_var_mappings = {
39
40
 
40
41
  class OpAMPHTTPClient:
41
42
  def __init__(self, opamp_connection_event, condition: threading.Condition):
42
- self.server_host = os.getenv('ODIGOS_OPAMP_SERVER_HOST')
43
- self.server_url = f"http://{self.server_host}/v1/opamp"
43
+ self._transport = transport.from_env()
44
44
  self.container_config = {}
45
45
  self.running = True
46
46
  self.condition = condition
@@ -57,7 +57,7 @@ class OpAMPHTTPClient:
57
57
  def __repr__(self):
58
58
  return f"<OpAMPHTTPClient instance_uid={self.instance_uid} pid={self.pid}>"
59
59
 
60
- def start(self, python_version_supported: bool = None):
60
+ def start(self, python_version_supported: bool = False):
61
61
  if not python_version_supported:
62
62
  python_version = f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}'
63
63
  error_message = f"Opentelemetry SDK require Python in version 3.8 or higher [{python_version} is not supported]"
@@ -263,7 +263,7 @@ class OpAMPHTTPClient:
263
263
 
264
264
  self.send_agent_to_server_message(opamp_pb2.AgentToServer(health=health_msg))
265
265
 
266
- def get_remote_config(self, message) -> dict:
266
+ def get_remote_config(self, message) -> Config:
267
267
  """
268
268
  Given a Protobuf message with a 'remote_config' field,
269
269
  decode all bytes and base64-encoded subfields into a clean Python dict.
@@ -392,8 +392,7 @@ class OpAMPHTTPClient:
392
392
 
393
393
  try:
394
394
  agent_message = attach(set_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY, True))
395
- response = requests_odigos.post(self.server_url, data=message_bytes, headers=headers, timeout=5)
396
- response.raise_for_status()
395
+ response_bytes = self._transport.post(message_bytes, headers, timeout=5)
397
396
  except Exception:
398
397
  return opamp_pb2.ServerToAgent()
399
398
  finally:
@@ -401,24 +400,17 @@ class OpAMPHTTPClient:
401
400
 
402
401
  server_to_agent = opamp_pb2.ServerToAgent()
403
402
  try:
404
- server_to_agent.ParseFromString(response.content)
403
+ server_to_agent.ParseFromString(response_bytes)
405
404
  except (DecodeError, NotImplementedError):
406
405
  return opamp_pb2.ServerToAgent()
407
406
  return server_to_agent
408
407
 
409
408
  def mandatory_env_vars_set(self):
410
- mandatory_env_vars = {
411
- "ODIGOS_OPAMP_SERVER_HOST": self.server_host,
412
- }
413
-
414
- for env_var, value in mandatory_env_vars.items():
415
- if not value:
416
- # opamp_logger.error(f"{env_var} environment variable not set")
417
- return False
418
-
419
- return True
409
+ # Either ODIGOS_OPAMP_UNIX_SOCKET or ODIGOS_OPAMP_SERVER_HOST must be set;
410
+ # transport.from_env() returns None when neither is configured.
411
+ return self._transport is not None
420
412
 
421
- def shutdown(self, custom_failure_message: str = None, component_health: bool = False):
413
+ def shutdown(self, custom_failure_message: Optional[str] = None, component_health: bool = False):
422
414
  self.running = False
423
415
  # opamp_logger.info("Sending agent disconnect message to OpAMP server...")
424
416
  if custom_failure_message:
@@ -0,0 +1,64 @@
1
+ import os
2
+ import socket
3
+ import http.client
4
+
5
+ import requests_odigos
6
+
7
+
8
+ class TCPTransport:
9
+ """HTTP/1.1 over TCP. Talks to ODIGOS_OPAMP_SERVER_HOST."""
10
+
11
+ def __init__(self, host: str):
12
+ self._url = f"http://{host}/v1/opamp"
13
+
14
+ def post(self, body: bytes, headers: dict, timeout: float) -> bytes:
15
+ response = requests_odigos.post(self._url, data=body, headers=headers, timeout=timeout)
16
+ response.raise_for_status()
17
+ return response.content
18
+
19
+
20
+ class UnixTransport:
21
+ """HTTP/1.1 over an AF_UNIX stream socket. Talks to ODIGOS_OPAMP_UNIX_SOCKET."""
22
+
23
+ def __init__(self, socket_path: str):
24
+ self._socket_path = socket_path
25
+
26
+ def post(self, body: bytes, headers: dict, timeout: float) -> bytes:
27
+ conn = _UnixHTTPConnection(self._socket_path, timeout=timeout)
28
+ try:
29
+ conn.request("POST", "/v1/opamp", body=body, headers=headers)
30
+ response = conn.getresponse()
31
+ if response.status >= 400:
32
+ raise RuntimeError(f"opamp unix POST returned status {response.status}")
33
+ return response.read()
34
+ finally:
35
+ conn.close()
36
+
37
+
38
+ class _UnixHTTPConnection(http.client.HTTPConnection):
39
+ """http.client.HTTPConnection that talks over a unix domain socket."""
40
+
41
+ def __init__(self, socket_path: str, timeout: float):
42
+ super().__init__("localhost", timeout=timeout)
43
+ self._socket_path = socket_path
44
+
45
+ def connect(self):
46
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
47
+ sock.settimeout(self.timeout)
48
+ sock.connect(self._socket_path)
49
+ self.sock = sock
50
+
51
+
52
+ def from_env():
53
+ """Pick an OpAMP transport from env vars. ODIGOS_OPAMP_UNIX_SOCKET wins if both are set.
54
+ Returns None if neither is set so the client can fail fast on missing config.
55
+ """
56
+ socket_path = os.getenv("ODIGOS_OPAMP_UNIX_SOCKET")
57
+ if socket_path:
58
+ return UnixTransport(socket_path)
59
+
60
+ host = os.getenv("ODIGOS_OPAMP_SERVER_HOST")
61
+ if host:
62
+ return TCPTransport(host)
63
+
64
+ return None
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "odigos-opentelemetry-python"
7
- version = "1.0.84"
7
+ version = "1.0.86"
8
8
  description = "Odigos Initializer for Python OpenTelemetry Components"
9
9
  requires-python = ">=3.9"
10
10
  authors = [
@@ -1 +0,0 @@
1
- VERSION = "1.0.84"