• Prometheus 查询语言 PromQL 使用说明
    • 表达式语言数据类型
    • 示例
    • 参考

    Prometheus 查询语言 PromQL 使用说明

    目前很多云原生应用使用了 Prometheus 作为监控,例如在 Istio 中查询 Prometheus 指标。

    Prometheus 提供了一种功能表达式语言,允许用户实时选择和汇总时间序列数据。表达式的结果可以显示为图形、表格数据或者由外部系统通过 RESTful API 消费。

    表达式语言数据类型

    Prometheus 查询语言简称 PromQL,其中包含以下四类数据类型:

    • Instant vector(即时向量):一组时间序列,拥有共同的时间戳,每个时间序列中都包含一个样本。
    • Range vector(范围向量):一组时间序列,其中每个时间序列都包含一系列时间范围内的数据点。
    • Scalar(标量):一个简单的浮点值。
    • String(字符串):一个简单的字符串,目前暂未使用。

    示例

    可以通过 Prometheus web 页面查询。

    Prometheus 的查询页面

    还可以使用 HTTP API 直接请求查询,例如你使用 kubernetes-vagrant-centos-cluster 部署了 Istio,会默认安装 Prometheus,你可以在浏览器中请求 http://prometheus.istio.jimmysong.io/api/v1/query?query=http_requests_total{job=%22kubernetes-nodes%22},将会看到如下格式的 json 返回值。

    1. {
    2. "status": "success",
    3. "data": {
    4. "resultType": "vector",
    5. "result": [
    6. {
    7. "metric": {
    8. "__name__": "http_requests_total",
    9. "beta_kubernetes_io_arch": "amd64",
    10. "beta_kubernetes_io_os": "linux",
    11. "code": "200",
    12. "handler": "prometheus",
    13. "instance": "node1",
    14. "job": "kubernetes-nodes",
    15. "kubernetes_io_hostname": "node1",
    16. "method": "get"
    17. },
    18. "value": [
    19. 1539861026.814,
    20. "556"
    21. ]
    22. },
    23. {
    24. "metric": {
    25. "__name__": "http_requests_total",
    26. "beta_kubernetes_io_arch": "amd64",
    27. "beta_kubernetes_io_os": "linux",
    28. "code": "200",
    29. "handler": "prometheus",
    30. "instance": "node2",
    31. "job": "kubernetes-nodes",
    32. "kubernetes_io_hostname": "node2",
    33. "method": "get"
    34. },
    35. "value": [
    36. 1539861026.814,
    37. "555"
    38. ]
    39. },
    40. {
    41. "metric": {
    42. "__name__": "http_requests_total",
    43. "beta_kubernetes_io_arch": "amd64",
    44. "beta_kubernetes_io_os": "linux",
    45. "code": "200",
    46. "handler": "prometheus",
    47. "instance": "node3",
    48. "job": "kubernetes-nodes",
    49. "kubernetes_io_hostname": "node3",
    50. "method": "get"
    51. },
    52. "value": [
    53. 1539861026.814,
    54. "556"
    55. ]
    56. }
    57. ]
    58. }
    59. }

    HTTP API 说明

    上面是对最常用也是比较简单的即时查询,下面是对以上返回结果的简要说明。

    • status:可以为 successerror, 如果为 error,则不会显示 data 字段,而显示 errorTypeerror
    • resultType:返回结果类型,可以为 matrixvectorscalarstring
    • metric:即时查询的到的监控 metric,其中的项为 label,可以在查询 URL 中增加标签选择器来过滤 metric。
    • value :第一个数字是 UNIX 格式的时间戳,例如 1539861026.814 表示的是北京时间 2018/10/18 19:10:26.814(注意:小数点后毫秒数)。Prometheus 中的 metric 时间都是以 UTC(协调世界时间)为单位的,无法调整时区,需要在前端展示时自己来调整。

    您也可以查询一个时间段、根据标签选择一组 metric、Prometheus 中的 target、rule、metadata 等配置进行查询。关于 Prometheus RESTful API 的详细用法请参考 HTTP API。

    参考

    • QUERYING PROMETHEUS - prometheus.io
    • Setting up a distributed Kubernetes cluster along with Istio service mesh locally with Vagrant and VirtualBox - github.com