Commit e792136
authored
fix(metrics): prevent thread leak by ensuring singleton initialization (#1492)
****Summary:****
This PR fixes a critical memory and thread leak in the
google-cloud-spanner client when built-in metrics are enabled (default
behavior).
Previously, the Client constructor unconditionally initialized a new
OpenTelemetry MeterProvider and PeriodicExportingMetricReader on every
instantiation. Each reader spawned a new background thread for metric
exporting that was never cleaned up or reused. In environments where
Client objects are frequently created (e.g., Cloud Functions, web
servers, or data pipelines), this caused a linear accumulation of
threads, leading to RuntimeError: can't start new thread and OOM
crashes.
****Fix Implementation:****
***Refactored Metrics Initialization (Thread Safety & Memory Leak
Fix)***:
Implemented a Singleton pattern for the OpenTelemetry MeterProvider
using threading.Lock to prevent infinite background thread creation
(memory leak).
Moved metrics initialization logic to a cleaner helper function
_initialize_metrics in client.py.
Replaced global mutable state in SpannerMetricsTracerFactory with
contextvars.ContextVar to ensure thread-safe, isolated metric tracing
across concurrent requests.
Updated MetricsInterceptor and MetricsCapture to correctly use the
thread-local tracer.
***Fixed Batch.commit Idempotency (AlreadyExists Regression):***
Modified Batch.commit to initialize nth_request and the attempt counter
outside the retry loop.
This ensures that retries (e.g., on ABORTED) reuse the same Request ID,
allowing Cloud Spanner to correctly deduplicate requests and preventing
spurious AlreadyExists (409) errors.
***Verification:***
Added tests/unit/test_metrics_concurrency.py to verify tracer isolation
and thread safety.
Cleaned up tests/unit/test_metrics.py and consolidated mocks in
conftest.py.1 parent 7e79920 commit e792136
File tree
11 files changed
+361
-116
lines changed- .kokoro/presubmit
- google/cloud/spanner_v1
- metrics
- tests/unit
11 files changed
+361
-116
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
29 | 30 | | |
| 31 | + | |
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
| |||
99 | 101 | | |
100 | 102 | | |
101 | 103 | | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
102 | 107 | | |
103 | 108 | | |
104 | 109 | | |
105 | 110 | | |
106 | 111 | | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
107 | 148 | | |
108 | 149 | | |
109 | 150 | | |
| |||
251 | 292 | | |
252 | 293 | | |
253 | 294 | | |
254 | | - | |
255 | 295 | | |
256 | 296 | | |
257 | 297 | | |
258 | 298 | | |
259 | 299 | | |
260 | | - | |
261 | | - | |
262 | | - | |
263 | | - | |
264 | | - | |
265 | | - | |
266 | | - | |
267 | | - | |
268 | | - | |
269 | | - | |
270 | | - | |
271 | | - | |
272 | | - | |
273 | | - | |
274 | | - | |
275 | | - | |
276 | | - | |
277 | | - | |
278 | | - | |
| 300 | + | |
279 | 301 | | |
280 | 302 | | |
281 | 303 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
| 24 | + | |
23 | 25 | | |
24 | 26 | | |
25 | 27 | | |
| |||
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
33 | 38 | | |
34 | 39 | | |
35 | 40 | | |
| |||
45 | 50 | | |
46 | 51 | | |
47 | 52 | | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
53 | 58 | | |
54 | 59 | | |
55 | 60 | | |
| |||
70 | 75 | | |
71 | 76 | | |
72 | 77 | | |
73 | | - | |
74 | | - | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
75 | 85 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
| 100 | + | |
| 101 | + | |
101 | 102 | | |
102 | 103 | | |
103 | 104 | | |
104 | 105 | | |
105 | | - | |
106 | | - | |
107 | | - | |
| 106 | + | |
108 | 107 | | |
109 | | - | |
110 | | - | |
111 | | - | |
| 108 | + | |
112 | 109 | | |
113 | | - | |
114 | | - | |
115 | | - | |
| 110 | + | |
116 | 111 | | |
117 | 112 | | |
118 | 113 | | |
| |||
126 | 121 | | |
127 | 122 | | |
128 | 123 | | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
| 124 | + | |
| 125 | + | |
133 | 126 | | |
134 | 127 | | |
135 | 128 | | |
136 | | - | |
137 | | - | |
138 | | - | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
139 | 137 | | |
140 | 138 | | |
141 | 139 | | |
142 | 140 | | |
143 | 141 | | |
144 | 142 | | |
145 | | - | |
146 | | - | |
| 143 | + | |
| 144 | + | |
147 | 145 | | |
148 | | - | |
| 146 | + | |
149 | 147 | | |
150 | 148 | | |
151 | | - | |
| 149 | + | |
152 | 150 | | |
153 | | - | |
154 | | - | |
155 | | - | |
| 151 | + | |
156 | 152 | | |
Lines changed: 17 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| |||
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
46 | | - | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
47 | 50 | | |
48 | 51 | | |
49 | 52 | | |
| |||
80 | 83 | | |
81 | 84 | | |
82 | 85 | | |
83 | | - | |
| 86 | + | |
84 | 87 | | |
85 | 88 | | |
86 | 89 | | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
87 | 102 | | |
88 | 103 | | |
89 | 104 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
0 commit comments