sf-veritas 0.10.3__cp311-cp311-manylinux_2_28_x86_64.whl

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.

Potentially problematic release.


This version of sf-veritas might be problematic. Click here for more details.

Files changed (132) hide show
  1. sf_veritas/__init__.py +20 -0
  2. sf_veritas/_sffastlog.c +889 -0
  3. sf_veritas/_sffastlog.cpython-311-x86_64-linux-gnu.so +0 -0
  4. sf_veritas/_sffastnet.c +924 -0
  5. sf_veritas/_sffastnet.cpython-311-x86_64-linux-gnu.so +0 -0
  6. sf_veritas/_sffastnetworkrequest.c +730 -0
  7. sf_veritas/_sffastnetworkrequest.cpython-311-x86_64-linux-gnu.so +0 -0
  8. sf_veritas/_sffuncspan.c +2155 -0
  9. sf_veritas/_sffuncspan.cpython-311-x86_64-linux-gnu.so +0 -0
  10. sf_veritas/_sffuncspan_config.c +617 -0
  11. sf_veritas/_sffuncspan_config.cpython-311-x86_64-linux-gnu.so +0 -0
  12. sf_veritas/_sfheadercheck.c +341 -0
  13. sf_veritas/_sfheadercheck.cpython-311-x86_64-linux-gnu.so +0 -0
  14. sf_veritas/_sfnetworkhop.c +1451 -0
  15. sf_veritas/_sfnetworkhop.cpython-311-x86_64-linux-gnu.so +0 -0
  16. sf_veritas/_sfservice.c +1175 -0
  17. sf_veritas/_sfservice.cpython-311-x86_64-linux-gnu.so +0 -0
  18. sf_veritas/_sfteepreload.c +5167 -0
  19. sf_veritas/app_config.py +49 -0
  20. sf_veritas/cli.py +336 -0
  21. sf_veritas/constants.py +10 -0
  22. sf_veritas/custom_excepthook.py +304 -0
  23. sf_veritas/custom_log_handler.py +129 -0
  24. sf_veritas/custom_output_wrapper.py +144 -0
  25. sf_veritas/custom_print.py +146 -0
  26. sf_veritas/django_app.py +5 -0
  27. sf_veritas/env_vars.py +186 -0
  28. sf_veritas/exception_handling_middleware.py +18 -0
  29. sf_veritas/exception_metaclass.py +69 -0
  30. sf_veritas/fast_frame_info.py +116 -0
  31. sf_veritas/fast_network_hop.py +293 -0
  32. sf_veritas/frame_tools.py +112 -0
  33. sf_veritas/funcspan_config_loader.py +556 -0
  34. sf_veritas/function_span_profiler.py +1174 -0
  35. sf_veritas/import_hook.py +62 -0
  36. sf_veritas/infra_details/__init__.py +3 -0
  37. sf_veritas/infra_details/get_infra_details.py +24 -0
  38. sf_veritas/infra_details/kubernetes/__init__.py +3 -0
  39. sf_veritas/infra_details/kubernetes/get_cluster_name.py +147 -0
  40. sf_veritas/infra_details/kubernetes/get_details.py +7 -0
  41. sf_veritas/infra_details/running_on/__init__.py +17 -0
  42. sf_veritas/infra_details/running_on/kubernetes.py +11 -0
  43. sf_veritas/interceptors.py +497 -0
  44. sf_veritas/libsfnettee.so +0 -0
  45. sf_veritas/local_env_detect.py +118 -0
  46. sf_veritas/package_metadata.py +6 -0
  47. sf_veritas/patches/__init__.py +0 -0
  48. sf_veritas/patches/concurrent_futures.py +19 -0
  49. sf_veritas/patches/constants.py +1 -0
  50. sf_veritas/patches/exceptions.py +82 -0
  51. sf_veritas/patches/multiprocessing.py +32 -0
  52. sf_veritas/patches/network_libraries/__init__.py +76 -0
  53. sf_veritas/patches/network_libraries/aiohttp.py +281 -0
  54. sf_veritas/patches/network_libraries/curl_cffi.py +363 -0
  55. sf_veritas/patches/network_libraries/http_client.py +419 -0
  56. sf_veritas/patches/network_libraries/httpcore.py +515 -0
  57. sf_veritas/patches/network_libraries/httplib2.py +204 -0
  58. sf_veritas/patches/network_libraries/httpx.py +515 -0
  59. sf_veritas/patches/network_libraries/niquests.py +211 -0
  60. sf_veritas/patches/network_libraries/pycurl.py +385 -0
  61. sf_veritas/patches/network_libraries/requests.py +633 -0
  62. sf_veritas/patches/network_libraries/tornado.py +341 -0
  63. sf_veritas/patches/network_libraries/treq.py +270 -0
  64. sf_veritas/patches/network_libraries/urllib_request.py +468 -0
  65. sf_veritas/patches/network_libraries/utils.py +398 -0
  66. sf_veritas/patches/os.py +17 -0
  67. sf_veritas/patches/threading.py +218 -0
  68. sf_veritas/patches/web_frameworks/__init__.py +54 -0
  69. sf_veritas/patches/web_frameworks/aiohttp.py +793 -0
  70. sf_veritas/patches/web_frameworks/async_websocket_consumer.py +317 -0
  71. sf_veritas/patches/web_frameworks/blacksheep.py +527 -0
  72. sf_veritas/patches/web_frameworks/bottle.py +502 -0
  73. sf_veritas/patches/web_frameworks/cherrypy.py +678 -0
  74. sf_veritas/patches/web_frameworks/cors_utils.py +122 -0
  75. sf_veritas/patches/web_frameworks/django.py +944 -0
  76. sf_veritas/patches/web_frameworks/eve.py +395 -0
  77. sf_veritas/patches/web_frameworks/falcon.py +926 -0
  78. sf_veritas/patches/web_frameworks/fastapi.py +724 -0
  79. sf_veritas/patches/web_frameworks/flask.py +520 -0
  80. sf_veritas/patches/web_frameworks/klein.py +501 -0
  81. sf_veritas/patches/web_frameworks/litestar.py +551 -0
  82. sf_veritas/patches/web_frameworks/pyramid.py +428 -0
  83. sf_veritas/patches/web_frameworks/quart.py +824 -0
  84. sf_veritas/patches/web_frameworks/robyn.py +697 -0
  85. sf_veritas/patches/web_frameworks/sanic.py +857 -0
  86. sf_veritas/patches/web_frameworks/starlette.py +723 -0
  87. sf_veritas/patches/web_frameworks/strawberry.py +813 -0
  88. sf_veritas/patches/web_frameworks/tornado.py +481 -0
  89. sf_veritas/patches/web_frameworks/utils.py +91 -0
  90. sf_veritas/print_override.py +13 -0
  91. sf_veritas/regular_data_transmitter.py +409 -0
  92. sf_veritas/request_interceptor.py +401 -0
  93. sf_veritas/request_utils.py +550 -0
  94. sf_veritas/server_status.py +1 -0
  95. sf_veritas/shutdown_flag.py +11 -0
  96. sf_veritas/subprocess_startup.py +3 -0
  97. sf_veritas/test_cli.py +145 -0
  98. sf_veritas/thread_local.py +970 -0
  99. sf_veritas/timeutil.py +114 -0
  100. sf_veritas/transmit_exception_to_sailfish.py +28 -0
  101. sf_veritas/transmitter.py +132 -0
  102. sf_veritas/types.py +47 -0
  103. sf_veritas/unified_interceptor.py +1580 -0
  104. sf_veritas/utils.py +39 -0
  105. sf_veritas-0.10.3.dist-info/METADATA +97 -0
  106. sf_veritas-0.10.3.dist-info/RECORD +132 -0
  107. sf_veritas-0.10.3.dist-info/WHEEL +5 -0
  108. sf_veritas-0.10.3.dist-info/entry_points.txt +2 -0
  109. sf_veritas-0.10.3.dist-info/top_level.txt +1 -0
  110. sf_veritas.libs/libbrotlicommon-6ce2a53c.so.1.0.6 +0 -0
  111. sf_veritas.libs/libbrotlidec-811d1be3.so.1.0.6 +0 -0
  112. sf_veritas.libs/libcom_err-730ca923.so.2.1 +0 -0
  113. sf_veritas.libs/libcrypt-52aca757.so.1.1.0 +0 -0
  114. sf_veritas.libs/libcrypto-bdaed0ea.so.1.1.1k +0 -0
  115. sf_veritas.libs/libcurl-eaa3cf66.so.4.5.0 +0 -0
  116. sf_veritas.libs/libgssapi_krb5-323bbd21.so.2.2 +0 -0
  117. sf_veritas.libs/libidn2-2f4a5893.so.0.3.6 +0 -0
  118. sf_veritas.libs/libk5crypto-9a74ff38.so.3.1 +0 -0
  119. sf_veritas.libs/libkeyutils-2777d33d.so.1.6 +0 -0
  120. sf_veritas.libs/libkrb5-a55300e8.so.3.3 +0 -0
  121. sf_veritas.libs/libkrb5support-e6594cfc.so.0.1 +0 -0
  122. sf_veritas.libs/liblber-2-d20824ef.4.so.2.10.9 +0 -0
  123. sf_veritas.libs/libldap-2-cea2a960.4.so.2.10.9 +0 -0
  124. sf_veritas.libs/libnghttp2-39367a22.so.14.17.0 +0 -0
  125. sf_veritas.libs/libpcre2-8-516f4c9d.so.0.7.1 +0 -0
  126. sf_veritas.libs/libpsl-99becdd3.so.5.3.1 +0 -0
  127. sf_veritas.libs/libsasl2-7de4d792.so.3.0.0 +0 -0
  128. sf_veritas.libs/libselinux-d0805dcb.so.1 +0 -0
  129. sf_veritas.libs/libssh-c11d285b.so.4.8.7 +0 -0
  130. sf_veritas.libs/libssl-60250281.so.1.1.1k +0 -0
  131. sf_veritas.libs/libunistring-05abdd40.so.2.1.0 +0 -0
  132. sf_veritas.libs/libuuid-95b83d40.so.1.3.0 +0 -0
@@ -0,0 +1,204 @@
1
+ import os
2
+ import time
3
+ from typing import List, Optional
4
+
5
+ try:
6
+ import wrapt
7
+
8
+ HAS_WRAPT = True
9
+ except ImportError:
10
+ HAS_WRAPT = False
11
+
12
+ from ...thread_local import trace_id_ctx
13
+ from .utils import (
14
+ init_fast_header_check,
15
+ inject_headers_ultrafast,
16
+ record_network_request,
17
+ )
18
+
19
+ # JSON serialization - try fast orjson first, fallback to stdlib json
20
+ try:
21
+ import orjson
22
+
23
+ HAS_ORJSON = True
24
+ except ImportError:
25
+ import json
26
+
27
+ HAS_ORJSON = False
28
+
29
+
30
+ def _tee_preload_active() -> bool:
31
+ """Detect if LD_PRELOAD tee is active (same logic as http_client.py)."""
32
+ if os.getenv("SF_TEE_PRELOAD_ONLY", "0") == "1":
33
+ return True
34
+ ld = os.getenv("LD_PRELOAD", "")
35
+ return "libsfnettee.so" in ld or "_sfteepreload" in ld
36
+
37
+
38
+ def patch_httplib2(domains_to_not_propagate_headers_to: Optional[List[str]] = None):
39
+ """
40
+ Monkey-patch httplib2.Http.request so that:
41
+ 1. We skip header injection for configured domains.
42
+ 2. We inject SAILFISH_TRACING_HEADER + FUNCSPAN_OVERRIDE_HEADER (fast: <20ns).
43
+ 3. We call NetworkRequestTransmitter().do_send via record_network_request() UNLESS LD_PRELOAD active.
44
+ 4. All HTTP methods (GET, POST, etc.) continue to work as before.
45
+
46
+ When LD_PRELOAD is active: ULTRA-FAST path with <10ns overhead (header injection only).
47
+ When LD_PRELOAD is NOT active: Full capture path with body/header recording.
48
+ """
49
+ try:
50
+ import httplib2
51
+ except ImportError:
52
+ return
53
+
54
+ skip = domains_to_not_propagate_headers_to or []
55
+ preload_active = _tee_preload_active()
56
+
57
+ # Initialize C extension for ultra-fast header checking (if available)
58
+ if preload_active:
59
+ init_fast_header_check(skip)
60
+
61
+ # Store original for both fast and slow paths
62
+ original_request = httplib2.Http.request
63
+
64
+ if preload_active:
65
+ # ========== ULTRA-FAST PATH: When LD_PRELOAD is active ==========
66
+ if HAS_WRAPT:
67
+ # FASTEST: Use wrapt directly (OTEL-style for minimal overhead)
68
+ def instrumented_request(wrapped, instance, args, kwargs):
69
+ """Ultra-fast header injection using inject_headers_ultrafast() via wrapt."""
70
+ # args = (uri, method, ...), kwargs = {body, headers, ...}
71
+ uri = args[0] if len(args) > 0 else kwargs.get("uri", "")
72
+
73
+ # Ensure headers dict exists
74
+ headers = kwargs.get("headers")
75
+ if not headers:
76
+ headers = {}
77
+ elif not isinstance(headers, dict):
78
+ headers = dict(headers)
79
+
80
+ # ULTRA-FAST: inject_headers_ultrafast does domain filtering + header injection (~100ns)
81
+ inject_headers_ultrafast(headers, uri, skip)
82
+
83
+ kwargs["headers"] = headers
84
+
85
+ # Immediately call original and return - NO timing, NO capture!
86
+ return wrapped(*args, **kwargs)
87
+
88
+ wrapt.wrap_function_wrapper(
89
+ "httplib2", "Http.request", instrumented_request
90
+ )
91
+ else:
92
+ # Fallback: Direct patching if wrapt not available
93
+ def patched_request(
94
+ self, uri, method="GET", body=None, headers=None, **kwargs
95
+ ):
96
+ # Ensure headers dict exists
97
+ if not headers:
98
+ headers = {}
99
+ elif not isinstance(headers, dict):
100
+ headers = dict(headers)
101
+
102
+ # ULTRA-FAST: inject_headers_ultrafast does domain filtering + header injection (~100ns)
103
+ inject_headers_ultrafast(headers, uri, skip)
104
+
105
+ # Immediately call original and return - NO timing, NO capture!
106
+ return original_request(
107
+ self, uri, method, body=body, headers=headers, **kwargs
108
+ )
109
+
110
+ httplib2.Http.request = patched_request
111
+
112
+ else:
113
+ # ========== FULL CAPTURE PATH: When LD_PRELOAD is NOT active ==========
114
+ def patched_request(self, uri, method="GET", body=None, headers=None, **kwargs):
115
+ start_ts = int(time.time() * 1_000)
116
+
117
+ # Ensure headers dict exists
118
+ if not headers:
119
+ headers = {}
120
+ elif not isinstance(headers, dict):
121
+ headers = dict(headers)
122
+
123
+ # ULTRA-FAST: inject_headers_ultrafast does domain filtering + header injection (~100ns)
124
+ inject_headers_ultrafast(headers, uri, skip)
125
+
126
+ # Get trace_id for capture
127
+ trace_id = trace_id_ctx.get(None) or ""
128
+
129
+ # Capture request data
130
+ req_data = b""
131
+ req_headers = b""
132
+ try:
133
+ if body:
134
+ if isinstance(body, bytes):
135
+ req_data = body
136
+ elif isinstance(body, str):
137
+ req_data = body.encode("utf-8")
138
+
139
+ # Capture request headers
140
+ if HAS_ORJSON:
141
+ req_headers = orjson.dumps({str(k): str(v) for k, v in headers.items()})
142
+ else:
143
+ req_headers = json.dumps({str(k): str(v) for k, v in headers.items()}).encode("utf-8")
144
+ except Exception: # noqa: BLE001
145
+ pass
146
+
147
+ try:
148
+ # perform the actual HTTP call
149
+ response, content = original_request(
150
+ self, uri, method, body=body, headers=headers, **kwargs
151
+ )
152
+ status_code = getattr(response, "status", None) or getattr(
153
+ response, "status_code", None
154
+ )
155
+ success = isinstance(status_code, int) and 200 <= status_code < 400
156
+
157
+ # Capture response data and headers
158
+ resp_data = b""
159
+ resp_headers = b""
160
+
161
+ # content is already the response body in httplib2
162
+ resp_data = content if isinstance(content, bytes) else b""
163
+ # Capture response headers
164
+ if HAS_ORJSON:
165
+ resp_headers = orjson.dumps({str(k): str(v) for k, v in response.items()})
166
+ else:
167
+ resp_headers = json.dumps({str(k): str(v) for k, v in response.items()}).encode("utf-8")
168
+
169
+ # record success (only when LD_PRELOAD is NOT active)
170
+ record_network_request(
171
+ trace_id,
172
+ uri,
173
+ method,
174
+ status_code,
175
+ success,
176
+ timestamp_start=start_ts,
177
+ timestamp_end=int(time.time() * 1_000),
178
+ request_data=req_data,
179
+ response_data=resp_data,
180
+ request_headers=req_headers,
181
+ response_headers=resp_headers,
182
+ )
183
+
184
+ return response, content
185
+
186
+ except Exception as e:
187
+ # record failures (only when LD_PRELOAD is NOT active)
188
+ record_network_request(
189
+ trace_id,
190
+ uri,
191
+ method,
192
+ 0,
193
+ False,
194
+ error=str(e)[:255],
195
+ timestamp_start=start_ts,
196
+ timestamp_end=int(time.time() * 1_000),
197
+ request_data=req_data,
198
+ request_headers=req_headers,
199
+ )
200
+ raise
201
+
202
+ # apply our patch (only if not using wrapt)
203
+ if not (preload_active and HAS_WRAPT):
204
+ httplib2.Http.request = patched_request