odigos-opentelemetry-python 1.0.88__tar.gz → 1.0.89__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.88/odigos_opentelemetry_python.egg-info → odigos_opentelemetry_python-1.0.89}/PKG-INFO +1 -1
  2. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/components.py +12 -1
  3. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/lib_handling.py +42 -0
  4. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/odigos_sampler.py +13 -4
  5. odigos_opentelemetry_python-1.0.89/initializer/version.py +1 -0
  6. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89/odigos_opentelemetry_python.egg-info}/PKG-INFO +1 -1
  7. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/pyproject.toml +1 -1
  8. odigos_opentelemetry_python-1.0.88/initializer/version.py +0 -1
  9. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/LICENSE +0 -0
  10. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/README.md +0 -0
  11. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/__init__.py +0 -0
  12. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/distro/__init__.py +0 -0
  13. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/distro/distro.py +0 -0
  14. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/distro/instrumentation_registry.py +0 -0
  15. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/envs.py +0 -0
  16. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/exit_hook.py +0 -0
  17. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/odigos_sampler_helpers.py +0 -0
  18. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/post_instrument.py +0 -0
  19. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/process_resource.py +0 -0
  20. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/schemas/__init__.py +0 -0
  21. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/initializer/schemas/sampling.py +0 -0
  22. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/odigos_opentelemetry_python.egg-info/SOURCES.txt +0 -0
  23. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/odigos_opentelemetry_python.egg-info/dependency_links.txt +0 -0
  24. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/odigos_opentelemetry_python.egg-info/entry_points.txt +0 -0
  25. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/odigos_opentelemetry_python.egg-info/requires.txt +0 -0
  26. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/odigos_opentelemetry_python.egg-info/top_level.txt +0 -0
  27. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/__init__.py +0 -0
  28. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/anyvalue_pb2.py +0 -0
  29. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/config.py +0 -0
  30. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/health_status.py +0 -0
  31. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/http_client.py +0 -0
  32. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/opamp_pb2.py +0 -0
  33. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/opamp_registry.py +0 -0
  34. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/transport.py +0 -0
  35. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/opamp/utils.py +0 -0
  36. {odigos_opentelemetry_python-1.0.88 → odigos_opentelemetry_python-1.0.89}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odigos-opentelemetry-python
3
- Version: 1.0.88
3
+ Version: 1.0.89
4
4
  Summary: Odigos Initializer for Python OpenTelemetry Components
5
5
  Author-email: odigos-io <support@odigos.io>
6
6
  Requires-Python: >=3.9
@@ -1,5 +1,11 @@
1
1
  from typing import Union
2
- from .lib_handling import reorder_python_path, reload_distro_modules, handle_django_instrumentation, handle_eventlet_instrumentation
2
+ from .lib_handling import (
3
+ reorder_python_path,
4
+ reload_distro_modules,
5
+ handle_django_instrumentation,
6
+ handle_eventlet_instrumentation,
7
+ patch_otlp_span_flags,
8
+ )
3
9
 
4
10
  handle_eventlet_instrumentation()
5
11
 
@@ -38,6 +44,11 @@ from opentelemetry.trace import set_tracer_provider, get_tracer_provider
38
44
  # before reshuffling) and before opamp below (it imports protobuf—the app should own that).
39
45
  reorder_python_path()
40
46
 
47
+ # Backport OTLP Span.flags trace-flags encoding
48
+ # (upstream PR #4761: https://github.com/open-telemetry/opentelemetry-python/pull/4761)
49
+ # onto the canonical exporter module now that sys.path prefers the agent's copy.
50
+ patch_otlp_span_flags()
51
+
41
52
  from .version import VERSION
42
53
  from .exit_hook import ExitHooks
43
54
  from .envs import set_static_otel_env
@@ -1,6 +1,14 @@
1
+ from __future__ import annotations
2
+
1
3
  import sys
2
4
  import importlib
3
5
  import os
6
+ from typing import TYPE_CHECKING, Optional, Sequence
7
+
8
+ if TYPE_CHECKING:
9
+ from opentelemetry.proto.trace.v1.trace_pb2 import Span as PB2Span
10
+ from opentelemetry.sdk.trace import ReadableSpan
11
+ from opentelemetry.trace import Link
4
12
 
5
13
 
6
14
  def reorder_python_path():
@@ -71,6 +79,40 @@ def handle_django_instrumentation():
71
79
  os.environ.setdefault("OTEL_PYTHON_DJANGO_INSTRUMENT", 'False')
72
80
 
73
81
 
82
+ def patch_otlp_span_flags() -> None:
83
+ # Backport of https://github.com/open-telemetry/opentelemetry-python/pull/4761:
84
+ # include W3C TraceFlags (lower 8 bits, e.g. the sampled bit) in the OTLP Span.flags / Link.flags alongside the existing is-remote bits (8-9).
85
+ # We wrap the encode helpers instead of replacing _span_flags because the PR also changed that function's signature and both of its call sites.
86
+ try:
87
+ from opentelemetry.exporter.otlp.proto.common._internal import trace_encoder
88
+ except ImportError:
89
+ return
90
+
91
+ original_encode_span = trace_encoder._encode_span
92
+ original_encode_links = trace_encoder._encode_links
93
+
94
+ # W3C TraceFlags is a single byte (values 0-255), and the encoder's existing
95
+ # flags only ever set the higher has-remote / is-remote bits.
96
+ def encode_span(sdk_span: ReadableSpan) -> PB2Span:
97
+ encoded_span = original_encode_span(sdk_span)
98
+ # THE FIX: fold the W3C trace flags into Span.flags (PR #4761).
99
+ encoded_span.flags |= int(sdk_span.get_span_context().trace_flags)
100
+ return encoded_span
101
+
102
+ def encode_links(links: Sequence[Link]) -> Optional[Sequence[PB2Span.Link]]:
103
+ encoded_links = original_encode_links(links)
104
+ if encoded_links:
105
+ # Propagate the trace flags to links as well
106
+ for link, encoded_link in zip(links, encoded_links):
107
+ # THE FIX: fold the W3C trace flags into Link.flags (PR #4761).
108
+ encoded_link.flags |= int(link.context.trace_flags)
109
+ return encoded_links
110
+
111
+ setattr(trace_encoder, "_encode_span", encode_span)
112
+ setattr(trace_encoder, "_encode_links", encode_links)
113
+ setattr(trace_encoder, "_odigos_trace_flags_patched", True)
114
+
115
+
74
116
  def handle_eventlet_instrumentation():
75
117
  """Checks if eventlet is importable and applies eventlet.monkey_patch if available."""
76
118
  # Apply monkey_patch early to enable Eventlet's green threads for non-blocking I/O.
@@ -98,10 +98,10 @@ class OdigosSampler(Sampler):
98
98
  matched = True
99
99
  else: # When we have a granular operation, check it vs the server/client rules specified in the noisy operation
100
100
  matched = False
101
- if http_server_sample := http_operation_sample.get("httpServer"):
101
+ if (http_server_sample := http_operation_sample.get("httpServer")) and kind == SpanKind.SERVER:
102
102
  matched = self._match_http_server_sample_rule(http_server_sample, attributes) or matched
103
103
 
104
- if http_client_sample := http_operation_sample.get("httpClient"):
104
+ if (http_client_sample := http_operation_sample.get("httpClient")) and kind == SpanKind.CLIENT:
105
105
  matched = self._match_http_client_sample_rule(http_client_sample, attributes) or matched
106
106
 
107
107
  # sampler_logger.debug(f'Noisy operation matched: {matched}, percentage: {percentage_to_sample}')
@@ -156,8 +156,10 @@ class OdigosSampler(Sampler):
156
156
  if target:
157
157
  return self._match_rule_route_to_span(http_server_rule["route"], target)
158
158
 
159
- if http_server_rule.get("routePrefix") and not (span_route or "").startswith(http_server_rule["routePrefix"]):
160
- return False
159
+ if route_prefix := http_server_rule.get("routePrefix"):
160
+ candidate = span_route or target
161
+ if not candidate or not self._match_rule_route_to_span(route_prefix, candidate, route_has_prefix=True):
162
+ return False
161
163
  if http_server_rule.get("method") and http_server_rule["method"] != span_method:
162
164
  return False
163
165
 
@@ -175,6 +177,13 @@ class OdigosSampler(Sampler):
175
177
  server_address = get_attribute(span_attributes, server_attributes_semconv.SERVER_ADDRESS, "net.peer.name", "http.host")
176
178
  if server_address:
177
179
  server_address = strip_port(server_address)
180
+ else:
181
+ # some instrumentations (like urllib) never puts a host attribute on the span. it sets only method + url,
182
+ # so if we want the host we need to extract it from the full url
183
+ # default (old) semconv mode the full URL is http.url; in stable mode url.full.
184
+ full_url = get_attribute(span_attributes, "url.full", "http.url")
185
+ if full_url:
186
+ server_address = urlsplit(full_url).hostname
178
187
 
179
188
  # Old semconv for url is a target that we need to get the client_path from → new semconv: "url.template"/"url.path"
180
189
  client_path = get_attribute(span_attributes, "url.template", url_attributes_semconv.URL_PATH)
@@ -0,0 +1 @@
1
+ VERSION = "1.0.89"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odigos-opentelemetry-python
3
- Version: 1.0.88
3
+ Version: 1.0.89
4
4
  Summary: Odigos Initializer for Python OpenTelemetry Components
5
5
  Author-email: odigos-io <support@odigos.io>
6
6
  Requires-Python: >=3.9
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "odigos-opentelemetry-python"
7
- version = "1.0.88"
7
+ version = "1.0.89"
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.88"