diff --git a/kwollect/tools/kwollect_setup_db.py b/kwollect/tools/kwollect_setup_db.py index 5f8a3ea39a6e013062857cb494a8906e516e5c59..4f54969086eeb8d765546c159ffd740a724eb7d9 100644 --- a/kwollect/tools/kwollect_setup_db.py +++ b/kwollect/tools/kwollect_setup_db.py @@ -306,19 +306,15 @@ UPDATE pg_language SET lanpltrusted = true WHERE lanname = 'plpython3u'; SET LOCAL SESSION AUTHORIZATION {kwollect_user}; -DROP FUNCTION IF EXISTS api.get_metrics(job_id INTEGER, - nodes TEXT, - devices TEXT, - metrics TEXT, - start_time TEXT, - end_time TEXT); +DROP FUNCTION IF EXISTS api.get_metrics; CREATE OR REPLACE FUNCTION api.get_metrics(job_id INTEGER DEFAULT NULL, nodes TEXT DEFAULT NULL, devices TEXT DEFAULT NULL, metrics TEXT DEFAULT NULL, start_time TEXT DEFAULT NULL, end_time TEXT DEFAULT NULL, - summary BOOLEAN DEFAULT FALSE) + summary BOOLEAN DEFAULT FALSE, + as_rate BOOLEAN DEFAULT FALSE) RETURNS SETOF metrics AS $$ from plpy import spiexceptions @@ -371,6 +367,22 @@ if metrics: req += " AND ".join(cond) req += " ORDER BY timestamp ASC" + +if as_rate: + req = "WITH cte AS (%s)" % req + req += "\\n" \ +"SELECT " \ + "timestamp, device_id, metric_id, " \ + "CASE WHEN timestamp = LAG(timestamp) OVER w THEN NULL " \ + "WHEN LAG(value) OVER w IS NULL THEN NULL " \ + "WHEN value < LAG(value) OVER w THEN MAX(value) OVER w - LAG(value) OVER w + value " \ + "ELSE (value - LAG(value) OVER w) " \ + "END / EXTRACT(epoch FROM timestamp - LAG(timestamp) OVER w) AS value, " \ + "labels " \ +"FROM cte " \ +"WINDOW w AS (PARTITION BY metric_id, device_id, labels) "\ +"ORDER BY timestamp ASC" + plpy.info(req) try: return plpy.execute(req)