summaryrefslogtreecommitdiff
path: root/osprofiler/drivers/redis_driver.py
diff options
context:
space:
mode:
Diffstat (limited to 'osprofiler/drivers/redis_driver.py')
-rw-r--r--osprofiler/drivers/redis_driver.py36
1 files changed, 33 insertions, 3 deletions
diff --git a/osprofiler/drivers/redis_driver.py b/osprofiler/drivers/redis_driver.py
index 67445d3..19749b0 100644
--- a/osprofiler/drivers/redis_driver.py
+++ b/osprofiler/drivers/redis_driver.py
@@ -24,11 +24,12 @@ from osprofiler import exc
class Redis(base.Driver):
def __init__(self, connection_str, db=0, project=None,
- service=None, host=None, **kwargs):
+ service=None, host=None, conf=cfg.CONF, **kwargs):
"""Redis driver for OSProfiler."""
super(Redis, self).__init__(connection_str, project=project,
- service=service, host=host)
+ service=service, host=host,
+ conf=conf, **kwargs)
try:
from redis import StrictRedis
except ImportError:
@@ -42,6 +43,7 @@ class Redis(base.Driver):
port=parsed_url.port,
db=db)
self.namespace = "osprofiler:"
+ self.namespace_error = "osprofiler_error:"
@classmethod
def get_name(cls):
@@ -70,6 +72,19 @@ class Redis(base.Driver):
data["timestamp"]
self.db.set(key, jsonutils.dumps(data))
+ if (self.filter_error_trace
+ and data.get("info", {}).get("etype") is not None):
+ self.notify_error_trace(data)
+
+ def notify_error_trace(self, data):
+ """Store base_id and timestamp of error trace to a separate key."""
+ key = self.namespace_error + data["base_id"]
+ value = jsonutils.dumps({
+ "base_id": data["base_id"],
+ "timestamp": data["timestamp"]
+ })
+ self.db.set(key, value)
+
def list_traces(self, fields=None):
"""Query all traces from the storage.
@@ -95,6 +110,20 @@ class Redis(base.Driver):
if key in fields})
return result
+ def list_error_traces(self):
+ """Returns all traces that have error/exception."""
+ ids = self.db.scan_iter(match=self.namespace_error + "*")
+ traces = [jsonutils.loads(self.db.get(i)) for i in ids]
+ traces.sort(key=lambda x: x["timestamp"])
+ seen_ids = set()
+ result = []
+ for trace in traces:
+ if trace["base_id"] not in seen_ids:
+ seen_ids.add(trace["base_id"])
+ result.append(trace)
+
+ return result
+
def get_report(self, base_id):
"""Retrieves and parses notification from Redis.
@@ -123,7 +152,8 @@ class RedisSentinel(Redis, base.Driver):
"""Redis driver for OSProfiler."""
super(RedisSentinel, self).__init__(connection_str, project=project,
- service=service, host=host)
+ service=service, host=host,
+ conf=conf, **kwargs)
try:
from redis.sentinel import Sentinel
except ImportError: