普罗米修斯可以比较两个不同的时间序列吗?

Can two different time series be compared in prometheus?

我想比较以下两个彼此不同的时间序列。我想要做的就是将 第二个时间序列 的结果除以 第一个时间序列的结果time series 并在值小于 1 时生成警报。我正在使用的查询低于我在下面提到的时间序列。如何实现我的目标?

第一个时间序列:

container_memory_usage_bytes{container_name="documentation"}

结果:

container_memory_usage_bytes{
   beta_kubernetes_io_arch="amd64",
   beta_kubernetes_io_fluentd_ds_ready="true",
   beta_kubernetes_io_instance_type="n1-highmem-8",
   beta_kubernetes_io_os="linux",
   cloud_google_com_gke_nodepool="pool-1",
   container_name="documentation",
   failure_domain_beta_kubernetes_io_region="europe-west1",
   failure_domain_beta_kubernetes_io_zone="europe-west1-b",
   id="/kubepods/burstable/podb79239ff-1ee9-11e8-a6c1-42010a840fd9/3ccdaa6597d5bd306d228e37d9d4c65a9681dba2e894aa7b7ed4502ec54e5619",
   image="gcr.io/ingenious-169318/publicapi/documentation@sha256:60a5454bb40ed34f24cbeb9f330e1097191754cf2890eee1ca4f2988188a7705",
   instance="gke-ingenious-pool-1-bbd77706-5rbz",
   job="kubernetes-cadvisor",
   kubernetes_io_hostname="gke-ingenious-pool-1-bbd77706-5rbz",
   name="k8s_documentation_documentation-6c4c4c9f5f-dn2bv_apimanager_b79239ff-1ee9-11e8-a6c1-42010a840fd9_0",
   namespace="apimanager",
   pod_name="documentation-6c4c4c9f5f-dn2bv"
}

第二个时间序列:-

kube_pod_container_resource_requests_memory_bytes{容器="documentation"}

结果:

kube_pod_container_resource_requests_memory_bytes{
   container="documentation",
   instance="10.32.0.30:8080",
   job="kubernetes-service-endpoints",
   k8s_app="kube-state-metrics",
   kubernetes_name="kube-state-metrics",
   kubernetes_namespace="kube-system",
   namespace="apimanager",
   node="gke-ingenious-pool-1-bbd77706-pdsz",
   pod="documentation-6c4c4c9f5f-mzd54"
}

PromQL:

kube_pod_container_resource_requests_memory_bytes{容器="documentation"} / (container_memory_usage_bytes{命名空间="apimanager"})

向量匹配

Prometheus 称之为 Vector Matching,如果标签匹配,您可以跨不同的时间序列执行算术二元运算(+、-、*、/ 等)。如果它们不匹配,您可以使用 onignoring 来选择您应该匹配的标签。

One-to-one finds a unique pair of entries from each side of the operation. In the default case, that is an operation following the format vector1 vector2. Two entries match if they have the exact same set of labels and corresponding values. The ignoring keyword allows ignoring certain labels when matching, while the on keyword allows reducing the set of considered labels to a provided list

例如

kube_pod_container_resource_requests_memory_bytes{container="documentation"}
/ on (container)
container_memory_usage_bytes{namespace="apimanager"}

label_join/label_replace

查看您的具体示例,没有任何标签可以使用 on 来匹配。 container_memory_usage_bytescontainer_namekube_pod_container_resource_requests_memory_bytescontainer。 Prometheus 还有其他称为 label_join and label_replace 的查询函数,它允许您在其中一个指标上创建自定义标签。

在您的情况下,您可能希望使用 label_replace 将 _name 附加到 kube_pod_container_resource_requests_memory_bytes。这将允许您使用 / on (container_name) 如上所示。

希望这 2 个普罗米修斯概念、矢量匹配和 label_join/replace 将帮助您跨不同的时间序列执行算术运算。注意我对您的确切用例不够熟悉,不知道 container_name 是否是用于实现所需输出的最佳标签,或者是否有更简单的方法使用 Kubernetes 和 Prometheus 实现此目的。