Prometheus Query Language
GreptimeDB 可以作为 Grafana 中 Prometheus 的替代品,因为 GreptimeDB 支持 PromQL(Prometheus Query Language)。GreptimeDB 在 Rust 中重新实现了 PromQL,并通过接口将能力开放,包括 Prometheus 的 HTTP API、GreptimeDB 的 HTTP API 和 SQL 接口。
Prometheus 的 HTTP API
GreptimeDB 实现了兼容 Prometheus 的一系列 API ,通过 /v1/prometheus 路径对外提
供服务:
- Instant queries /api/v1/query
- Range queries /api/v1/query_range
- Series /api/v1/series
- Label names /api/v1/labels
- Label values /api/v1/label/<label_name>/values
这些接口的输入和输出与原生的 Prometheus HTTP API 相同,用户可以把 GreptimeDB 当
作 Prometheus 的直接替换。例如,在 Grafana 中我们可以设置
http://localhost:4000/v1/prometheus/ 作为其 Prometheus 数据源的地址。
访问 Prometheus 文档 获得更详细的说明。
你可以通过设置 HTTP 请求的 db 参数来指定 GreptimeDB 中的数据库名。
GreptimeDB 的 HTTP API
GreptimeDB 同样暴露了一个自己的 HTTP API 用于 PromQL 查询,即在当前的 API 路径 /v1 的后方拼接 /promql,如下示例:
curl -X GET \
  -H 'Authorization: Basic {{authorization if exists}}' \
  -G \
  --data-urlencode 'db=public' \
  --data-urlencode 'query=avg(system_metrics{idc="idc_a"})' \
  --data-urlencode 'start=1667446797' \
  --data-urlencode 'end=1667446799' \
  --data-urlencode 'step=1s' \
  http://localhost:4000/v1/promql
接口中的参数和 Prometheus' HTTP API 的 range_query 接口相似:
- db=<database>:在使用 GreptimeDB 进行鉴权操作时必填。
- query=<string>:必填。Prometheus 表达式查询字符串。
- start=<rfc3339 | unix_timestamp>:必填。开始时间戳,包含在内。它用于设置- TIME INDEX列中的时间范围。
- end=<rfc3339 | unix_timestamp>:必填。结束时间戳,包含在内。它用于设置- TIME INDEX列中的时间范围。
- step=<duration | float>:必填。查询步长,可以使用持续时间格式或秒数的浮点数。
以下是每种参数的类型的示例:
- rfc3339
- 2015-07-01T20:11:00Z(default to seconds resolution)
- 2015-07-01T20:11:00.781Z(with milliseconds resolution)
- 2015-07-02T04:11:00+08:00(with timezone offset)
 
- unix timestamp
- 1435781460(default to seconds resolution)
- 1435781460.781(with milliseconds resolution)
 
- duration
- 1h(1 hour)
- 5d1m(5 days and 1 minute)
- 2(2 seconds)
- 2s(also 2 seconds)
 
结果格式与HTTP 协议中描述的 /sql 接口相同。
{
  "code": 0,
  "output": [
    {
      "records": {
        "schema": {
          "column_schemas": [
            {
              "name": "ts",
              "data_type": "TimestampMillisecond"
            },
            {
              "name": "AVG(system_metrics.cpu_util)",
              "data_type": "Float64"
            },
            {
              "name": "AVG(system_metrics.memory_util)",
              "data_type": "Float64"
            },
            {
              "name": "AVG(system_metrics.disk_util)",
              "data_type": "Float64"
            }
          ]
        },
        "rows": [
          [
            1667446798000,
            80.1,
            70.3,
            90
          ],
          [
            1667446799000,
            80.1,
            70.3,
            90
          ]
        ]
      }
    }
  ],
  "execution_time_ms": 5
}
SQL
GreptimeDB 还扩展了 SQL 语法以支持 PromQL。可以用 TQL(Time-series Query Language)为关键字开始写入参数和进行查询。该语法如下:
TQL [EVAL|EVALUATE] (<START>, <END>, <STEP>) <QUERY>
<START> 指定查询开始时间范围,<END> 指定查询结束时间。 <STEP> 识别查询步幅。它们均可为无引号数字(表示<START>和<END>的 UNIX 时间戳,以及<STEP>的秒数持续时间),或带引号的字符串(表示<START>和<END>的 RFC3339 时间戳,以及<STEP>的字符串格式的持续时间)。
例如:
TQL EVAL (1676738180, 1676738780, '10s') sum(some_metric)
你可以在所有支持 SQL 的地方编写上述命令,包括 GreptimeDB HTTP API、SDK、PostgreSQL 和 MySQL 客户端等。
多列查询
基于表模型,GreptimeDB 支持在单个表(或在 Prometheus 中称为指标)中查询多个字段。默认情况下,查询将应用于每个值字段 (field)。或者也可以使用特殊的过滤器 __field__ 来查询特定的字段:
metric{__field__="field1"}
反选或正则表达式也都支持
metric{__field__!="field1"}
metric{__field__=~"field_1|field_2"}
metric{__field__!~"field_1|field_2"}
局限
尽管 GreptimeDB 支持丰富的数据类型,但 PromQL 的实现仍然局限于以下类型:
- timestamp: Timestamp
- tag: String
- value: Double
目前 GreptimeDB 只支持 PromQL 的一个子集,下方附上了兼容性列表。你也可以在跟踪问题中查看我们最新的兼容性报告。
字符(Literal)
支持字符串和浮点数,与 PromQL 的规则相同。
选择器
- 支持即时和范围选择器,但唯独不支持 label和指标名字的不匹配判断,例如{__name__!="request_count}",等价匹配的情况是支持的,例如{__name__="request_count}"。
- 支持时间长度和偏移量,但不支持 @修改器。
Binary
目前还不支持像 1+1 这样纯粹的 binary 表达式。
- 
支持: Operator Example add a + bsub a - bmul a * bdiv a / bmod a % beqlc a == bneq a != bgtr a > blss a < bgte a >= blte a <= b
- 
不支持: Operator Progress power TBD atan2 TBD and TBD or TBD unless TBD 
Aggregators
- 
支持: Aggregator Example sum sum by (foo)(metric)avg avg by (foo)(metric)min min by (foo)(metric)max max by (foo)(metric)stddev stddev by (foo)(metric)stdvar stdvar by (foo)(metric)
- 
不支持: Aggregator Progress count TBD grouping TBD topk TBD bottomk TBD count_values TBD 
Instant Functions
- 
支持: Function Example abs abs(metric)ceil ceil(metric)exp exp(metric)ln ln(metric)log2 log2(metric)log10 log10(metric)sqrt sqrt(metric)acos acos(metric)asin asin(metric)atan atan(metric)sin sin(metric)cos cos(metric)tan tan(metric)acosh acosh(metric)asinh asinh(metric)atanh atanh(metric)sinh sinh(metric)cosh cosh(metric)tanh tanh(metric)timestamp timestamp()histogram_quantile histogram_quantile(phi, metric)
- 
不支持: Function Progress absent TBD scalar TBD sgn TBD sort TBD sort_desc TBD deg TBD rad TBD other multiple input fns TBD 
Range Functions
- 支持:
Function Example idelta idelta(metric[5m])<aggr>_over_time count_over_time(metric[5m])stddev_over_time stddev_over_time(metric[5m])stdvar_over_time stdvar_over_time(metric[5m])changes changes(metric[5m])delta delta(metric[5m])rate rate(metric[5m])deriv deriv(metric[5m])increase increase(metric[5m])irate irate(metric[5m])reset reset(metric[5m])