sf-veritas 0.10.3__cp314-cp314-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-314-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffastnet.c +924 -0
- sf_veritas/_sffastnet.cpython-314-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffastnetworkrequest.c +730 -0
- sf_veritas/_sffastnetworkrequest.cpython-314-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffuncspan.c +2155 -0
- sf_veritas/_sffuncspan.cpython-314-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sffuncspan_config.c +617 -0
- sf_veritas/_sffuncspan_config.cpython-314-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sfheadercheck.c +341 -0
- sf_veritas/_sfheadercheck.cpython-314-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sfnetworkhop.c +1451 -0
- sf_veritas/_sfnetworkhop.cpython-314-x86_64-linux-gnu.so +0 -0
- sf_veritas/_sfservice.c +1175 -0
- sf_veritas/_sfservice.cpython-314-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,62 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
import importlib.util
|
|
3
|
+
import sys
|
|
4
|
+
from importlib.abc import MetaPathFinder
|
|
5
|
+
|
|
6
|
+
from .custom_excepthook import custom_excepthook
|
|
7
|
+
from .custom_output_wrapper import get_custom_output_wrapper_django
|
|
8
|
+
from .env_vars import PRINT_CONFIGURATION_STATUSES
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ImportInterceptor:
|
|
12
|
+
def __init__(self, module_name, callback):
|
|
13
|
+
self.module_name = module_name
|
|
14
|
+
self.callback = callback
|
|
15
|
+
|
|
16
|
+
def find_spec(self, fullname, path, target=None):
|
|
17
|
+
if fullname == self.module_name:
|
|
18
|
+
self.callback()
|
|
19
|
+
# Remove the interceptor once the callback has been called
|
|
20
|
+
sys.meta_path.remove(self)
|
|
21
|
+
return importlib.util.find_spec(fullname, path)
|
|
22
|
+
return None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def setup_django_import_hook():
|
|
26
|
+
interceptor = ImportInterceptor(
|
|
27
|
+
"django.core.management", get_custom_output_wrapper_django
|
|
28
|
+
)
|
|
29
|
+
sys.meta_path.insert(0, interceptor)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def wrap_excepthook(old_excepthook):
|
|
33
|
+
def custom_wrapper_excepthook(exc_type, exc_value, exc_traceback):
|
|
34
|
+
# Call your custom exception hook
|
|
35
|
+
custom_excepthook(exc_type, exc_value, exc_traceback)
|
|
36
|
+
# Call the original exception hook (which might be Sentry's)
|
|
37
|
+
if old_excepthook is not None:
|
|
38
|
+
old_excepthook(exc_type, exc_value, exc_traceback)
|
|
39
|
+
|
|
40
|
+
return custom_wrapper_excepthook
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def set_excepthook():
|
|
44
|
+
# Wrap the current excepthook
|
|
45
|
+
current_excepthook = sys.excepthook
|
|
46
|
+
wrapped_excepthook = wrap_excepthook(current_excepthook)
|
|
47
|
+
sys.excepthook = wrapped_excepthook
|
|
48
|
+
if PRINT_CONFIGURATION_STATUSES:
|
|
49
|
+
print("Patched sys.excepthook for custom exception handling.")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ExcepthookImportHook(MetaPathFinder):
|
|
53
|
+
def find_spec(self, fullname, path, target=None):
|
|
54
|
+
print("fullname", fullname, log=False)
|
|
55
|
+
if fullname in sys.modules:
|
|
56
|
+
print("\t> fullname in sys.modules", log=False)
|
|
57
|
+
set_excepthook()
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def install_import_hook():
|
|
62
|
+
sys.meta_path.insert(0, ExcepthookImportHook())
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Any, Dict
|
|
3
|
+
|
|
4
|
+
from .kubernetes import get_details as get_kubernetes_details
|
|
5
|
+
from .running_on import System, running_on
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class InfraDetails:
|
|
10
|
+
system: System
|
|
11
|
+
details: Dict[str, Any]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_running_on_details(system: System) -> Dict[str, Any]:
|
|
15
|
+
if system == System.KUBERNETES:
|
|
16
|
+
return get_kubernetes_details()
|
|
17
|
+
if system == System.UNKNOWN:
|
|
18
|
+
return {}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_infra_details() -> InfraDetails:
|
|
22
|
+
system = running_on()
|
|
23
|
+
details = get_running_on_details(system)
|
|
24
|
+
return InfraDetails(system=system, details=details)
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import socket
|
|
3
|
+
|
|
4
|
+
import requests
|
|
5
|
+
|
|
6
|
+
DEFAULT_CLUSTER_NAME = "UNKNOWN"
|
|
7
|
+
|
|
8
|
+
# ─── 1. ConfigMap (optional) ─────────────────────────────────
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_from_config_map(path: str = "/etc/cluster-info/cluster-name"):
|
|
12
|
+
"""If you’ve mounted a ConfigMap at this path, read it."""
|
|
13
|
+
try:
|
|
14
|
+
with open(path, "r") as f:
|
|
15
|
+
name = f.read().strip()
|
|
16
|
+
if name:
|
|
17
|
+
return name
|
|
18
|
+
except IOError:
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ─── 2. Cloud Metadata ────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_gke_cluster_name(timeout: float = 1.0):
|
|
26
|
+
"""GKE nodes automatically get a 'cluster-name' instance attribute."""
|
|
27
|
+
try:
|
|
28
|
+
resp = requests.get(
|
|
29
|
+
"http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster-name",
|
|
30
|
+
headers={"Metadata-Flavor": "Google"},
|
|
31
|
+
timeout=timeout,
|
|
32
|
+
)
|
|
33
|
+
if resp.ok and resp.text:
|
|
34
|
+
return resp.text
|
|
35
|
+
except requests.RequestException:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def get_eks_cluster_name(timeout: float = 1.0):
|
|
40
|
+
"""EKS-backed EC2 instances are tagged 'eks:cluster-name'."""
|
|
41
|
+
try:
|
|
42
|
+
# 1) fetch IMDSv2 token
|
|
43
|
+
token = requests.put(
|
|
44
|
+
"http://169.254.169.254/latest/api/token",
|
|
45
|
+
headers={"X-aws-ec2-metadata-token-ttl-seconds": "21600"},
|
|
46
|
+
timeout=timeout,
|
|
47
|
+
).text
|
|
48
|
+
# 2) read the eks:cluster-name tag
|
|
49
|
+
resp = requests.get(
|
|
50
|
+
"http://169.254.169.254/latest/meta-data/tags/instance/eks:cluster-name",
|
|
51
|
+
headers={"X-aws-ec2-metadata-token": token},
|
|
52
|
+
timeout=timeout,
|
|
53
|
+
)
|
|
54
|
+
if resp.ok and resp.text:
|
|
55
|
+
return resp.text
|
|
56
|
+
except requests.RequestException:
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def get_aks_cluster_name(timeout: float = 1.0):
|
|
61
|
+
"""AKS nodes live in a VM RG named MC_<resourceGroup>_<clusterName>_<zone>."""
|
|
62
|
+
try:
|
|
63
|
+
resp = requests.get(
|
|
64
|
+
"http://169.254.169.254/metadata/instance",
|
|
65
|
+
params={"api-version": "2021-02-01", "format": "json"},
|
|
66
|
+
headers={"Metadata": "true"},
|
|
67
|
+
timeout=timeout,
|
|
68
|
+
)
|
|
69
|
+
if resp.ok:
|
|
70
|
+
compute = resp.json().get("compute", {})
|
|
71
|
+
rg = compute.get("resourceGroupName", "")
|
|
72
|
+
parts = rg.split("_")
|
|
73
|
+
if len(parts) >= 3:
|
|
74
|
+
return parts[2]
|
|
75
|
+
except requests.RequestException:
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ─── 3. Kubernetes API fallback ────────────────────────────────
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def get_via_k8s_api(timeout: float = 1.0):
|
|
83
|
+
"""
|
|
84
|
+
If you’re running in K8s and have in‑cluster RBAC, try:
|
|
85
|
+
A) ClusterProperty CRD (KEP‑2149)
|
|
86
|
+
B) Node labels on your own Pod’s node
|
|
87
|
+
"""
|
|
88
|
+
try:
|
|
89
|
+
from kubernetes import client, config
|
|
90
|
+
except ImportError:
|
|
91
|
+
return
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
# load service account creds
|
|
95
|
+
config.load_incluster_config()
|
|
96
|
+
|
|
97
|
+
# A) ClusterProperty CRD
|
|
98
|
+
co = client.CustomObjectsApi()
|
|
99
|
+
props = co.list_cluster_custom_object(
|
|
100
|
+
group="multicluster.k8s.io",
|
|
101
|
+
version="v1alpha6",
|
|
102
|
+
plural="clusterproperties",
|
|
103
|
+
).get("items", [])
|
|
104
|
+
if props:
|
|
105
|
+
name = props[0].get("spec", {}).get("clusterName")
|
|
106
|
+
if name:
|
|
107
|
+
return name
|
|
108
|
+
|
|
109
|
+
# B) read this Pod → its Node → cluster label
|
|
110
|
+
v1 = client.CoreV1Api()
|
|
111
|
+
# Pod name = hostname in K8s
|
|
112
|
+
pod_name = socket.gethostname()
|
|
113
|
+
ns = (
|
|
114
|
+
open("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
|
|
115
|
+
.read()
|
|
116
|
+
.strip()
|
|
117
|
+
)
|
|
118
|
+
pod = v1.read_namespaced_pod(
|
|
119
|
+
name=pod_name, namespace=ns, _request_timeout=timeout
|
|
120
|
+
)
|
|
121
|
+
node = v1.read_node(pod.spec.node_name, _request_timeout=timeout)
|
|
122
|
+
labels = node.metadata.labels or {}
|
|
123
|
+
for key in ("cluster.x-k8s.io/cluster-name", "topology.kubernetes.io/cluster"):
|
|
124
|
+
if labels.get(key):
|
|
125
|
+
return labels[key]
|
|
126
|
+
except Exception:
|
|
127
|
+
pass
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# ─── 4. Aggregator ────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def get_cluster_name():
|
|
134
|
+
for fn in (
|
|
135
|
+
get_from_config_map,
|
|
136
|
+
get_gke_cluster_name,
|
|
137
|
+
get_eks_cluster_name,
|
|
138
|
+
get_aks_cluster_name,
|
|
139
|
+
get_via_k8s_api,
|
|
140
|
+
):
|
|
141
|
+
try:
|
|
142
|
+
name = fn()
|
|
143
|
+
if name:
|
|
144
|
+
return name
|
|
145
|
+
except Exception:
|
|
146
|
+
continue
|
|
147
|
+
return DEFAULT_CLUSTER_NAME
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
from .kubernetes import kubernetes
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class System(Enum):
|
|
7
|
+
KUBERNETES = "Kubernetes"
|
|
8
|
+
UNKNOWN = "Unknown"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def running_on() -> System:
|
|
12
|
+
if kubernetes():
|
|
13
|
+
return System.KUBERNETES
|
|
14
|
+
return System.UNKNOWN
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = ["running_on"]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def kubernetes() -> bool:
|
|
5
|
+
# 1) service‐account token (default mount in every Pod)
|
|
6
|
+
if os.path.exists("/var/run/secrets/kubernetes.io/serviceaccount/token"):
|
|
7
|
+
return True
|
|
8
|
+
# 2) built‐in K8s env var
|
|
9
|
+
if os.getenv("KUBERNETES_SERVICE_HOST"):
|
|
10
|
+
return True
|
|
11
|
+
return False
|