Skip to content

Instantly share code, notes, and snippets.

@mjf
Last active August 23, 2022 19:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mjf/ac8cb1c1eb1449dbf656ce3edd5af94c to your computer and use it in GitHub Desktop.
Save mjf/ac8cb1c1eb1449dbf656ce3edd5af94c to your computer and use it in GitHub Desktop.
PromQL to SQL Idioms for Promscale

PromQL to SQL Idioms for Promscale

Legend

Variable Meaning
METRIC Metric name (i.e. cpu_usage_system)
NAME Name for the metric value (corresponds to AS "NAME" in SQL)
LABEL[#] Label name
VALUE[#] Value of the label
INTERVAL Interval (e.g. '10s' for SQL or $__interval variable in Grafana)
TIMESTAMP[#] Timestamp value (e.g. 2021-01-01T01:00:00.000Z in SQL)

Basic Queries

Idiom Link PromQL SQL SQL with Time Boundaries
IDIOM-1
avg(
  METRIC{LABEL1=VALUE1,LABEL2=VALUE2}
)
      
SELECT time_bucket('INTERVAL', time) AS time,
       AVG(value) AS NAME
  FROM METRIC
 WHERE time >= 'TIMESTAMP1' AND
       time <  'TIMESTAMP2' AND
       labels ? ('LABEL1' == 'VALUE2') AND
       labels ? ('LABEL2' == 'VALUE2')
 GROUP BY 1
 ORDER BY 1;
      
IDIOM-2
avg(
  METRIC{LABEL1=VALUE1,LABEL2=VALUE2}
)
by(LABEL1)
      
SELECT time_bucket('INTERVAL', time) AS time,
       VAL(LABEL1_id) AS LABEL1,
       AVG(value)     AS NAME
  FROM METRIC
 WHERE time >= 'TIMESTAMP1' AND
       time <  'TIMESTAMP2' AND
       labels ? ('LABEL1' == 'VALUE2') AND
       labels ? ('LABEL2' == 'VALUE2')
 GROUP BY 1,
          2
 ORDER BY 1;
      
IDIOM-3
metrics()
      
SELECT metric_name AS metric
  FROM metric;
      
IDIOM-4
label_names()
      
SELECT key AS label
  FROM label_key
 WHERE key != '__name__';
      
IDIOM-5
label_names(METRIC)
      
SELECT key AS label
  FROM label_key_position
 WHERE key != '__name__' AND
       metric_name = 'METRIC';
      
IDIOM-6
label_values(LABEL)
      
SELECT value
  FROM label
 WHERE key = 'LABEL';
      
IDIOM-7
label_values(METRIC, LABEL)
      
SELECT l.value AS NAME
  FROM label_key_position AS p
       JOIN (
              SELECT key,
                     value
                FROM label
               WHERE key = 'LABEL'
            ) AS l
         ON p.key = l.key AND
            p.metric_name = 'METRIC';
      
SELECT value "NAME"
  FROM label
 WHERE key = 'LABEL' AND
       id IN (
               SELECT UNNEST(labels)
                 FROM prom_data_series."METRIC" s
                      INNER JOIN (
                                   SELECT series_id
                                     FROM prom_data."METRIC"
                                    WHERE time >= 'TIMESTAMP1' AND
                                          time <  'TIMESTAMP2'
                                    GROUP BY 1
                      ) a
                      ON s.id = a.series_id
                GROUP BY 1
             );
      
IDIOM-8
label_values(
  METRIC{LABEL1='VALUE1',LABEL2='VALUE2'},
  LABEL3
)
      
TODO
SELECT value "NAME"
  FROM label
 WHERE key = 'LABEL3' AND
       id IN (
               SELECT UNNEST(labels)
                 FROM prom_data_series."METRIC" s
                      INNER JOIN (
                                   SELECT series_id
                                     FROM prom_data."METRIC"
                                    WHERE time >= 'TIMESTAMP1' AND
                                          time <  'TIMESTAMP2'
                                    GROUP BY 1
                      ) a
                      ON s.id = a.series_id
                WHERE (
                        SELECT id
                          FROM label
                         WHERE (key = 'LABEL1' AND value = 'VALUE1') OR
                               (key = 'LABEL2' AND value = 'VALUE2')
                      ) = ANY(labels)
                GROUP BY 1
             );
      
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment