Skip to content

Commit 0862ed6

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents c42e861 + 2b154aa commit 0862ed6

File tree

2 files changed

+57
-10
lines changed

2 files changed

+57
-10
lines changed

pyprometheus/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
__license__ = "BSD, see LICENSE for more details"
2020

21-
__version__ = "0.0.6"
21+
__version__ = "0.0.7"
2222

2323
__version_info__ = list(map(int, __version__.split(".")))
2424

pyprometheus/contrib/uwsgi_features.py

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ def __init__(self, sharedarea_id=SHAREDAREA_ID, namespace="", stats=False, label
176176
self._stats = stats
177177
self._labels = tuple(sorted(labels.items(), key=lambda x: x[0]))
178178

179+
self._syncs = 0
180+
179181
self._m = uwsgi.sharedarea_memoryview(self._sharedarea_id)
180182

181183
self.init_memory()
@@ -197,17 +199,33 @@ def metric_name(self, name):
197199
"""
198200
return ":".join([self._namespace, name])
199201

202+
203+
@staticmethod
204+
def get_unique_id():
205+
try:
206+
return uwsgi.worker_id()
207+
except Exception:
208+
try:
209+
return uwsgi.mule_id()
210+
except Exception:
211+
return os.getpid()
212+
return "unknown"
213+
200214
def declare_metrics(self):
201215
return {
202-
"memory_sync": Counter(self.metric_name("memory_read"), "UWSGI shared memory syncs", ("sharedarea", ) + self._labels),
216+
"memory_sync": Counter(self.metric_name("memory_read"), "UWSGI shared memory syncs", ("sharedarea", "id") + self._labels),
203217
"memory_size": Gauge(self.metric_name("memory_size"), "UWSGI shared memory size", ("sharedarea", ) + self._labels),
204218
"num_keys": Gauge(self.metric_name("num_keys"), "UWSGI num_keys", ("sharedarea", ) + self._labels)
205219
}
206220

207221
def collect(self):
222+
labels = self._labels + (("sharedarea", self._sharedarea_id), ("id", self.get_unique_id()))
223+
metric = self._collectors["memory_sync"]
224+
metric.add_sample(labels, metric.build_sample(labels, ( (TYPES.GAUGE, metric.name, "", labels, self._syncs), )))
225+
226+
yield metric
227+
208228
labels = self._labels + (("sharedarea", self._sharedarea_id), )
209-
# metric = self._collectors["memory_sync"]
210-
# metric.add_sample(labels, metric.build_sample(labels, ( (TYPES.GAUGE, metric.name, "", labels, ) ))
211229

212230
# yield metric
213231
metric = self._collectors["memory_size"]
@@ -252,6 +270,8 @@ def serialize_key(self, key):
252270
return val
253271

254272
def unserialize_key(self, serialized_key):
273+
if not serialized_key:
274+
raise RuntimeError("Invalid serialized key")
255275
return marshal.loads(serialized_key)
256276

257277
def get_area_size_with_lock(self):
@@ -319,7 +339,7 @@ def read_memory(self):
319339
def load_exists_positions(self):
320340
"""Load all keys from memory
321341
"""
322-
342+
self._syncs += 1
323343
self._used = self.get_area_size()
324344
self._sign = self.get_area_sign()
325345

@@ -376,6 +396,7 @@ def read_key_string(self, position, size):
376396
key_string_bytes = self.m[self.get_slice(position, size)]
377397
return struct.unpack(b"{0}s".format(size), key_string_bytes)[0]
378398

399+
379400
def read_key_value(self, position):
380401
"""Read float value of position
381402
@@ -444,6 +465,9 @@ def inc_value(self, key, value):
444465
except InvalidUWSGISharedareaPagesize as e:
445466
logger.error("Invalid sharedarea pagesize {0} bytes".format(len(self._m)))
446467
return 0
468+
except Exception as e:
469+
logger.error(e, exc_info=True)
470+
return 0
447471

448472
def write_value(self, key, value):
449473
"""Write value to shared memory
@@ -461,6 +485,9 @@ def write_value(self, key, value):
461485
except InvalidUWSGISharedareaPagesize as e:
462486
logger.error("Invalid sharedarea pagesize {0} bytes".format(len(self._m)))
463487
return None
488+
except Exception as e:
489+
logger.error(e, exc_info=True)
490+
return 0
464491

465492
def get_value(self, key):
466493
"""Read value from shared memory
@@ -474,6 +501,9 @@ def get_value(self, key):
474501
except InvalidUWSGISharedareaPagesize:
475502
logger.error("Invalid sharedarea pagesize {0} bytes".format(len(self._m)))
476503
return 0
504+
except Exception as e:
505+
logger.error(e, exc_info=True)
506+
return 0
477507

478508
@property
479509
def is_actual(self):
@@ -495,7 +525,10 @@ def lock(self):
495525
if not self.wlocked and not self.rlocked:
496526
self.wlocked, self.rlocked = lock_id, lock_id
497527
uwsgi.sharedarea_wlock(self._sharedarea_id)
498-
yield
528+
try:
529+
yield
530+
except Exception as e:
531+
logger.error(e, exc_info=True)
499532
uwsgi.sharedarea_unlock(self._sharedarea_id)
500533
self.wlocked, self.rlocked = False, False
501534
else:
@@ -507,7 +540,10 @@ def rlock(self):
507540
if not self.rlocked:
508541
self.rlocked = lock_id
509542
uwsgi.sharedarea_rlock(self._sharedarea_id)
510-
yield
543+
try:
544+
yield
545+
except Exception as e:
546+
logger.error(e, exc_info=True)
511547
uwsgi.sharedarea_unlock(self._sharedarea_id)
512548
self.rlocked = False
513549
else:
@@ -527,14 +563,17 @@ def clear(self):
527563
self._positions.clear()
528564

529565
def get_items(self):
530-
self.validate_actuality()
566+
with self.rlock():
567+
self.validate_actuality()
531568

532569
for key, position in self._positions.items():
533570
yield self.unserialize_key(key), self.read_key_value(position[2])
534571

535572
def inc_items(self, items):
536-
self.validate_actuality()
573+
537574
with self.lock():
575+
self.validate_actuality()
576+
538577
for key, value in items:
539578
try:
540579
positions, created = self.get_key_position(self.serialize_key(key), value)
@@ -543,10 +582,15 @@ def inc_items(self, items):
543582
self.write_key_value(positions[2], self.read_key_value(positions[2]) + value)
544583
except InvalidUWSGISharedareaPagesize:
545584
logger.error("Invalid sharedarea pagesize {0} bytes".format(len(self._m)))
585+
except Exception as e:
586+
logger.error(e, exc_info=True)
587+
return 0
546588

547589
def write_items(self, items):
548-
self.validate_actuality()
590+
549591
with self.lock():
592+
self.validate_actuality()
593+
550594
for key, value in items:
551595
try:
552596
positions, created = self.get_key_position(self.serialize_key(key), value)
@@ -555,6 +599,9 @@ def write_items(self, items):
555599
self.write_key_value(positions[2], value)
556600
except InvalidUWSGISharedareaPagesize:
557601
logger.error("Invalid sharedarea pagesize {0} bytes".format(len(self._m)))
602+
except Exception as e:
603+
logger.error(e, exc_info=True)
604+
return 0
558605

559606

560607
class UWSGIFlushStorage(LocalMemoryStorage):

0 commit comments

Comments
 (0)