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.
- sf_veritas/__init__.py +20 -0
- sf_veritas/_sffastlog.c +889 -0
- sf_veritas/_sffastlog.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffastnet.c +924 -0
- sf_veritas/_sffastnet.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffastnetworkrequest.c +730 -0
- sf_veritas/_sffastnetworkrequest.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffuncspan.c +2155 -0
- sf_veritas/_sffuncspan.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffuncspan_config.c +617 -0
- sf_veritas/_sffuncspan_config.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sfheadercheck.c +341 -0
- sf_veritas/_sfheadercheck.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sfnetworkhop.c +1451 -0
- sf_veritas/_sfnetworkhop.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sfservice.c +1175 -0
- sf_veritas/_sfservice.cpython-311-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sfteepreload.c +5167 -0
- sf_veritas/app_config.py +49 -0
- sf_veritas/cli.py +336 -0
- sf_veritas/constants.py +10 -0
- sf_veritas/custom_excepthook.py +304 -0
- sf_veritas/custom_log_handler.py +129 -0
- sf_veritas/custom_output_wrapper.py +144 -0
- sf_veritas/custom_print.py +146 -0
- sf_veritas/django_app.py +5 -0
- sf_veritas/env_vars.py +186 -0
- sf_veritas/exception_handling_middleware.py +18 -0
- sf_veritas/exception_metaclass.py +69 -0
- sf_veritas/fast_frame_info.py +116 -0
- sf_veritas/fast_network_hop.py +293 -0
- sf_veritas/frame_tools.py +112 -0
- sf_veritas/funcspan_config_loader.py +556 -0
- sf_veritas/function_span_profiler.py +1174 -0
- sf_veritas/import_hook.py +62 -0
- sf_veritas/infra_details/__init__.py +3 -0
- sf_veritas/infra_details/get_infra_details.py +24 -0
- sf_veritas/infra_details/kubernetes/__init__.py +3 -0
- sf_veritas/infra_details/kubernetes/get_cluster_name.py +147 -0
- sf_veritas/infra_details/kubernetes/get_details.py +7 -0
- sf_veritas/infra_details/running_on/__init__.py +17 -0
- sf_veritas/infra_details/running_on/kubernetes.py +11 -0
- sf_veritas/interceptors.py +497 -0
- sf_veritas/libsfnettee.so +0 -0
- sf_veritas/local_env_detect.py +118 -0
- sf_veritas/package_metadata.py +6 -0
- sf_veritas/patches/__init__.py +0 -0
- sf_veritas/patches/concurrent_futures.py +19 -0
- sf_veritas/patches/constants.py +1 -0
- sf_veritas/patches/exceptions.py +82 -0
- sf_veritas/patches/multiprocessing.py +32 -0
- sf_veritas/patches/network_libraries/__init__.py +76 -0
- sf_veritas/patches/network_libraries/aiohttp.py +281 -0
- sf_veritas/patches/network_libraries/curl_cffi.py +363 -0
- sf_veritas/patches/network_libraries/http_client.py +419 -0
- sf_veritas/patches/network_libraries/httpcore.py +515 -0
- sf_veritas/patches/network_libraries/httplib2.py +204 -0
- sf_veritas/patches/network_libraries/httpx.py +515 -0
- sf_veritas/patches/network_libraries/niquests.py +211 -0
- sf_veritas/patches/network_libraries/pycurl.py +385 -0
- sf_veritas/patches/network_libraries/requests.py +633 -0
- sf_veritas/patches/network_libraries/tornado.py +341 -0
- sf_veritas/patches/network_libraries/treq.py +270 -0
- sf_veritas/patches/network_libraries/urllib_request.py +468 -0
- sf_veritas/patches/network_libraries/utils.py +398 -0
- sf_veritas/patches/os.py +17 -0
- sf_veritas/patches/threading.py +218 -0
- sf_veritas/patches/web_frameworks/__init__.py +54 -0
- sf_veritas/patches/web_frameworks/aiohttp.py +793 -0
- sf_veritas/patches/web_frameworks/async_websocket_consumer.py +317 -0
- sf_veritas/patches/web_frameworks/blacksheep.py +527 -0
- sf_veritas/patches/web_frameworks/bottle.py +502 -0
- sf_veritas/patches/web_frameworks/cherrypy.py +678 -0
- sf_veritas/patches/web_frameworks/cors_utils.py +122 -0
- sf_veritas/patches/web_frameworks/django.py +944 -0
- sf_veritas/patches/web_frameworks/eve.py +395 -0
- sf_veritas/patches/web_frameworks/falcon.py +926 -0
- sf_veritas/patches/web_frameworks/fastapi.py +724 -0
- sf_veritas/patches/web_frameworks/flask.py +520 -0
- sf_veritas/patches/web_frameworks/klein.py +501 -0
- sf_veritas/patches/web_frameworks/litestar.py +551 -0
- sf_veritas/patches/web_frameworks/pyramid.py +428 -0
- sf_veritas/patches/web_frameworks/quart.py +824 -0
- sf_veritas/patches/web_frameworks/robyn.py +697 -0
- sf_veritas/patches/web_frameworks/sanic.py +857 -0
- sf_veritas/patches/web_frameworks/starlette.py +723 -0
- sf_veritas/patches/web_frameworks/strawberry.py +813 -0
- sf_veritas/patches/web_frameworks/tornado.py +481 -0
- sf_veritas/patches/web_frameworks/utils.py +91 -0
- sf_veritas/print_override.py +13 -0
- sf_veritas/regular_data_transmitter.py +409 -0
- sf_veritas/request_interceptor.py +401 -0
- sf_veritas/request_utils.py +550 -0
- sf_veritas/server_status.py +1 -0
- sf_veritas/shutdown_flag.py +11 -0
- sf_veritas/subprocess_startup.py +3 -0
- sf_veritas/test_cli.py +145 -0
- sf_veritas/thread_local.py +970 -0
- sf_veritas/timeutil.py +114 -0
- sf_veritas/transmit_exception_to_sailfish.py +28 -0
- sf_veritas/transmitter.py +132 -0
- sf_veritas/types.py +47 -0
- sf_veritas/unified_interceptor.py +1580 -0
- sf_veritas/utils.py +39 -0
- sf_veritas-0.10.3.dist-info/METADATA +97 -0
- sf_veritas-0.10.3.dist-info/RECORD +132 -0
- sf_veritas-0.10.3.dist-info/WHEEL +5 -0
- sf_veritas-0.10.3.dist-info/entry_points.txt +2 -0
- sf_veritas-0.10.3.dist-info/top_level.txt +1 -0
- sf_veritas.libs/libbrotlicommon-6ce2a53c.so.1.0.6 +0 -0
- sf_veritas.libs/libbrotlidec-811d1be3.so.1.0.6 +0 -0
- sf_veritas.libs/libcom_err-730ca923.so.2.1 +0 -0
- sf_veritas.libs/libcrypt-52aca757.so.1.1.0 +0 -0
- sf_veritas.libs/libcrypto-bdaed0ea.so.1.1.1k +0 -0
- sf_veritas.libs/libcurl-eaa3cf66.so.4.5.0 +0 -0
- sf_veritas.libs/libgssapi_krb5-323bbd21.so.2.2 +0 -0
- sf_veritas.libs/libidn2-2f4a5893.so.0.3.6 +0 -0
- sf_veritas.libs/libk5crypto-9a74ff38.so.3.1 +0 -0
- sf_veritas.libs/libkeyutils-2777d33d.so.1.6 +0 -0
- sf_veritas.libs/libkrb5-a55300e8.so.3.3 +0 -0
- sf_veritas.libs/libkrb5support-e6594cfc.so.0.1 +0 -0
- sf_veritas.libs/liblber-2-d20824ef.4.so.2.10.9 +0 -0
- sf_veritas.libs/libldap-2-cea2a960.4.so.2.10.9 +0 -0
- sf_veritas.libs/libnghttp2-39367a22.so.14.17.0 +0 -0
- sf_veritas.libs/libpcre2-8-516f4c9d.so.0.7.1 +0 -0
- sf_veritas.libs/libpsl-99becdd3.so.5.3.1 +0 -0
- sf_veritas.libs/libsasl2-7de4d792.so.3.0.0 +0 -0
- sf_veritas.libs/libselinux-d0805dcb.so.1 +0 -0
- sf_veritas.libs/libssh-c11d285b.so.4.8.7 +0 -0
- sf_veritas.libs/libssl-60250281.so.1.1.1k +0 -0
- sf_veritas.libs/libunistring-05abdd40.so.2.1.0 +0 -0
- 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
|