【问题标题】:curl, split string and exit if neededcurl,拆分字符串并在需要时退出
【发布时间】:2018-12-04 14:07:49
【问题描述】:

这是运行curl --silent localhost:9091/health时的输出

# HELP metrics_qollector_ttt_health_check The status of ttt.
# TYPE metrics_qollector_ttt_health_check gauge
metrics_qollector_ttt_health_check 1.0
# HELP metrics_qollector_database_health_check The status of the database.
# TYPE metrics_qollector_database_health_check gauge
metrics_qollector_database_health_check 1.0
# HELP metrics_qollector_health_checks_latency_seconds Health check latency in seconds.
# TYPE metrics_qollector_health_checks_latency_seconds summary
metrics_qollector_health_checks_latency_seconds_count{method="runtime",} 1.0
metrics_qollector_health_checks_latency_seconds_sum{method="runtime",} 9.51166E-4

我需要编写一个 bash 脚本来检查是 metrics_qollector_ttt_health_check == "1.0" 还是 metrics_qollector_database_health_check == "1.0" 然后是 exit 0; 否则是 exit 1;

我一直在尝试做的是以下

#!/usr/bin/env bash

set -e

HEALTHSTATUS=$(curl --silent localhost:9091/health)

for item in ${HEALTHSTATUS}
    if [[ item[0] = "metrics_qollector_ttt_health_check" && item[1] = "1.0" ]  || [ item[0] = "metrics_qollector_database_health_check" && item[1] "1.0" ]]; then
        exit 0;
    else
        exit 1;
done

【问题讨论】:

    标签: bash split


    【解决方案1】:

    grep -q 如果找到匹配项,则以状态 0 退出,如果未找到匹配项,则以状态 1 存在。您可以使用以下单行替换整个脚本:

    curl --silent localhost:9091/health |
    grep -Eq '^metrics_qollector_(ttt|database)_health_check 1\.0$'
    

    【讨论】:

    • 这个解决方案的唯一问题是当后一个字符串为0.0时,它exits 0,但如果两个字符串中的任何一个为1.0,我希望它exit 1,这是如何实现的?
    • @JonB 我不确定我是否理解正确。如果您在问题中提出的问题,那不是完全相反吗?你能列出所有案例和预期的输出吗? ttt 1.0 and dat 1.0 → exit 1ttt 1.0 and dat 0.0 → exit ...ttt missing and ... 等等。
    • metrics_qollector_ttt_health_check 1.0 metrics_qollector_database_health_check 0.0 如果tttdatabase 有值0.0我想返回exit 1
    • ttt 1.0 and dat 1.0 = 退出 = 0 ttt 1.0 and dat 0.0 = 退出 = 1 ttt 0.0 and dat 1.0 = 退出 = 1 ttt 0.0 and dat 0.0 = 退出 = 1
    • 值得指出这是有效的if cat health | grep -Eq '^metrics_qollector_(trafero|database)_health_check 0.0$'; then echo "exit 1"; else echo "exit 0"; fi,因为我有点颠倒了默认状态码!
    【解决方案2】:

    你有很多方法可以做到这一点,但这里有一个:

    #!/bin/bash
    
    STATUS=$(curl --silent http://localhost:9091/health | egrep "^metrics_qollector_ttt_health_check |^metrics_qollector_database_health_check ")
    
    EXIT_STATUS=$(echo $STATUS | awk '{if(NF == 4) { if(($2 == 0) || ($4 == 0)) {print "0"} else {print "1"} } else {print "2"}}')
    
    exit $EXIT_STATUS
    

    awk 应该将您的浮点值 (1.0) 解析为数值以进行比较。它还会检查您是否同时拥有这两个指标。

    脚本退出代码

    0 - 至少有一个值为 0.0

    1 - 没有一个值是 0.0

    2 - 如果由于某种原因您的指标中没有一个或两个指标 健康API

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多