sf-veritas 0.10.3__cp313-cp313-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-313-x86_64-linux-gnu.so +0 -0
  4. sf_veritas/_sffastnet.c +924 -0
  5. sf_veritas/_sffastnet.cpython-313-x86_64-linux-gnu.so +0 -0
  6. sf_veritas/_sffastnetworkrequest.c +730 -0
  7. sf_veritas/_sffastnetworkrequest.cpython-313-x86_64-linux-gnu.so +0 -0
  8. sf_veritas/_sffuncspan.c +2155 -0
  9. sf_veritas/_sffuncspan.cpython-313-x86_64-linux-gnu.so +0 -0
  10. sf_veritas/_sffuncspan_config.c +617 -0
  11. sf_veritas/_sffuncspan_config.cpython-313-x86_64-linux-gnu.so +0 -0
  12. sf_veritas/_sfheadercheck.c +341 -0
  13. sf_veritas/_sfheadercheck.cpython-313-x86_64-linux-gnu.so +0 -0
  14. sf_veritas/_sfnetworkhop.c +1451 -0
  15. sf_veritas/_sfnetworkhop.cpython-313-x86_64-linux-gnu.so +0 -0
  16. sf_veritas/_sfservice.c +1175 -0
  17. sf_veritas/_sfservice.cpython-313-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,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,3 @@
1
+ from .get_infra_details import get_infra_details
2
+
3
+ __all__ = ["get_infra_details"]
@@ -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,3 @@
1
+ from .get_details import get_details
2
+
3
+ __all__ = ["get_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,7 @@
1
+ from typing import Any, Dict
2
+
3
+ from .get_cluster_name import get_cluster_name
4
+
5
+
6
+ def get_details() -> Dict[str, Any]:
7
+ return {"clusterName": get_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