当值不存在时,默认求和运算符为0

时间:2018-05-18 23:41:31

标签: prometheus google-kubernetes-engine promql

我使用以下查询来计算GKE集群中节点的成本(为了便于阅读而添加新行)

fun <Item, Key> TabLayout.bindTabs(items: List<Item>, toKey: (Item) -> Key, tab: (Item) -> TabLayout.Tab, bind: (Item, TabLayout.Tab) -> Unit) {
    val old = (0 until tabCount).map { getTabAt(it)?.tag as Key }
    val new = items.map(toKey)

    val add = new - old
    val remove = old - new
    val keep = new.intersect(old)

    val tagToChildren = (0 until tabCount).map { getTabAt(it) }.associateBy { it?.tag as Key }
    val idToItem = items.associateBy(toKey)

    remove.forEach { tagToChildren[it].let { removeTab(it) } }
    keep.forEach { bind(idToItem[it]!!, tagToChildren[it]!!) }
    add.forEach { key -> tab(idToItem[key]!!).also { it.tag = key }.also { addTab(it, items.indexOf(idToItem[key])) } }
}

如果集群具有可抢占节点,则它起作用,因为至少有一个节点具有sum( kube_node_status_capacity_cpu_cores * on(node) group_left(label_cloud_google_com_gke_nodepool) kube_node_labels{ label_cloud_google_com_gke_preemptible = "true" } ) * 5.10 + sum( kube_node_status_capacity_cpu_cores * on(node) group_left(label_cloud_google_com_gke_nodepool) kube_node_labels{ label_cloud_google_com_gke_preemptible = "" } ) * 16.95 ,因此第一个和运算符返回一个值。

当群集没有可预留节点时失败,因为没有label_cloud_google_com_gke_preemptible = "true"的节点,因此第一个总和不返回值

是否可以修改查询以使第一个和返回0值?

1 个答案:

答案 0 :(得分:2)

如果值不存在,您可以使用or插入值:

  (
      sum(
          kube_node_status_capacity_cpu_cores 
        * on(node) group_left(label_cloud_google_com_gke_nodepool) 
          kube_node_labels{label_cloud_google_com_gke_preemptible = "true"}
      ) * 5.10 
    or
      vector(0)
  )
+ 
  sum(
      kube_node_status_capacity_cpu_cores 
    * on(node) group_left(label_cloud_google_com_gke_nodepool) 
      kube_node_labels{label_cloud_google_com_gke_preemptible = ""}
  ) * 16.95