Elastic:如何创建一个动态的阈值 watcher

13 篇文章 25 订阅

在我之前的文章 “X-Pack:创建阈值检查警报”,我介绍了如何在 Kibana 中创建一个阈值的警报。这个在很多的情况下是非常有用的,比如我们监控的一个指标,当它超过或低过一个阈值时,那么它就会发生一个警报。但是在实际的生活中,我们也有很多的情况下,我们想动态地设置一个阈值,而不是一个固定的阈值。比如,我们炒股的时候,我们想我们的股票5分钟之内涨幅超过10%,或者跌过10%,这个时候我们想得到一个警报。这意味着可能有人在操盘我们的股票,需要我们人工的干预。

在今天的文章中,我们来介绍如何创建一个动态的阈值。我们还是可以通过我们电脑的 metricbeat 数据为例。

 

安装

如果大家还没有安装好自己的自己的环境的话,请参阅我之前的文章 “Elastic:创建你的第一个 Elastic alert” 来设置自己的环境。在今天的练习中,我们需要在 Ubuntu OS 里安装 Metricbeat 来收集电脑的指标信息。

安装 Metricbeat

我们首先打开我们的 Kibana:

我们点击上面的 Add metric data 按钮:

我们点击上面的 System metrics

我们选择 DEB 平台,这是因为 Ubuntu 是 Debian 平台。我们按照上面的步骤进行按照。在这里需要指出的是,我们必须对 metricbeat.yml 进行配置,以使得 metricbeat 可以连接到我们的 Kibana 及 Elasticsearch。我们在 metricbeat.yml 文件中做如下的修改:

等我们启动完 metricbeat 后,我们可以在 Kibana 中看到数据了:

如果我们能够看到上面的数据,则表明我们的 metricbeat 安装正确。

查询数据

接下来,我们想对我们的 metricbeat 数据进行查询:

  • 只对过去的10分钟的数据感兴趣
  • 我们对每隔5分钟的数据做一个聚合,如果上一个5分钟的数据和接下来的5分钟的数据的指标数据有10%的上升,我们将发送警报

我们仿照之前的我文章 “X-Pack:创建阈值检查警报”,我们还是以字段 system.memory.used.pct (percentage of CPU time) 为例。我们来创建如下的搜索:

GET metricbeat-7.6.0/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "range": {
          "@timestamp": {
            "from": "now-10m",
            "to": "now"
          }
        }
      }
    }
  },
  "aggs": {
    "five_min": {
      "filters": {
        "filters": {
          "latest5" : {
            "range": {
              "@timestamp": {
                "gte": "now-5m",
                "lte": "now"
              }
            }
          },
          "previous5": {
            "range": {
              "@timestamp": {
                "gte": "now-10m",
                "lte": "now-5m"
              }
            }
          }
        }
      },
      "aggs": {
        "avg_pct": {
          "avg": {
            "field": "system.memory.used.pct"
          }
        }
      }
    }
  }
}

上面的查询的结果显示:

{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 926,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "five_min" : {
      "buckets" : {
        "latest5" : {
          "doc_count" : 462,
          "avg_pct" : {
            "value" : 0.18
          }
        },
        "previous5" : {
          "doc_count" : 464,
          "avg_pct" : {
            "value" : 0.18
          }
        }
      }
    }
  }
}

在上面我们可以看到有两个桶:lastest5 及 previous5。对应于这两个 bucket 来看,分别及算出来它们的 avg_pct。从数据显示来看,目前,我的电脑的 load 并不是太重。

创建 watcher

根据我们之前文章的教程 “Elastic:创建你的第一个 Elastic alert”,我们重复之前的步骤。

简单地说,为了配置一个 watcher,我们必须配置如下的几个:

PUT _watcher/watch/my-justme-watcher
{
  "trigger": {},
  "input": {},
  "condition": {},
  "actions": {}
}

我们下面来分别进行描述:

trigger

这个定义多次实践 watcher 运行一次。比如我们可以定义如下:

  "trigger": {
    "schedule" : {
      "interval": "1h"
    }
  },

上面表明,我们希望 watcher 每一个小时运行一次。针对我们的情况,我们定义为:

  "trigger": {
    "schedule": {
      "cron": "0 0/1 * * * ?"
    }
  },

上面表明,我们希望每一分钟运行一次。

input

这个是定义 alert 想搜索的 index,及针对多长时间的 index 来进行的搜索的:

  "input": {
    "search": {
      "request": {
        "indices": [
          "metricbeat-*"
        ],
        "body": {
          "size": 0,
          "query": {
            "bool": {
              "filter": {
                "range": {
                  "@timestamp": {
                    "from": "now-10m",
                    "to": "now"
                  }
                }
              }
            }
          },
          "aggs": {
            "five_min": {
              "filters": {
                "filters": {
                  "latest5": {
                    "range": {
                      "@timestamp": {
                        "gte": "now-5m",
                        "lte": "now"
                      }
                    }
                  },
                  "previous5": {
                    "range": {
                      "@timestamp": {
                        "gte": "now-10m",
                        "lte": "now-5m"
                      }
                    }
                  }
                }
              },
              "aggs": {
                "avg_pct": {
                  "avg": {
                    "field": "system.memory.used.pct"
                  }
                }
              }
            }
          }
        }
      }
    }
  }

我们把我们上面的 search 的语句拷贝过来。这样就可以了。

condition

在这里,我们想如果 CPU 的使用在过去5分钟之内上升了10%,那么我就发生警报。在这里我们使用过 script 来完成这个工作:

  "condition": {
    "script": {
      "source": "return ctx.payload.aggregations.five_min.buckets.latest5.avg_pct.value > 1.1* ctx.payload.aggregations.five_min.buckets.previous5.avg_pct.value"
    }
  },

请查看我们之前的那个查询的语句。我们不难理解上面的判断。

actions

这个是定义当上面的 condition 被满足时,需要采取的一些行动。这些行动可以在地址找到。目前Watcher支持的action为: emailwebhookindexloggingslack 及pagerduty

在今天的练习中,我们使用最简单的 logging:

  "actions": {
    "log": {
      "logging": {
        "text": "WARNING: CPU usage has increased by 10% in the past 5 mins"
      }
    }
  }

经过上面的配置过后,我们完整的 system_memory_watcher 的设计就完成了:

PUT _watcher/watch/system_memory_watcher
{
  "trigger": {
    "schedule": {
      "cron": "0 0/1 * * * ?"
    }
  },
  "input": {
    "search": {
      "request": {
        "indices": [
          "metricbeat-*"
        ],
        "body": {
          "size": 0,
          "query": {
            "bool": {
              "filter": {
                "range": {
                  "@timestamp": {
                    "from": "now-10m",
                    "to": "now"
                  }
                }
              }
            }
          },
          "aggs": {
            "five_min": {
              "filters": {
                "filters": {
                  "latest5": {
                    "range": {
                      "@timestamp": {
                        "gte": "now-5m",
                        "lte": "now"
                      }
                    }
                  },
                  "previous5": {
                    "range": {
                      "@timestamp": {
                        "gte": "now-10m",
                        "lte": "now-5m"
                      }
                    }
                  }
                }
              },
              "aggs": {
                "avg_pct": {
                  "avg": {
                    "field": "system.memory.used.pct"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "condition": {
    "script": {
      "source": "return ctx.payload.aggregations.five_min.buckets.latest5.avg_pct.value > 1.1* ctx.payload.aggregations.five_min.buckets.previous5.avg_pct.value"
    }
  },
  "actions": {
    "log": {
      "logging": {
        "text": "WARNING: CPU usage has increased by 10% in the past 5 mins"
      }
    }
  }
}

运行上面的命令。

监视电脑的运行情况

我们可以打开我们的电脑开始看一些视频,做一些事情。比如下载一些东西之类的。当然这些必须发生在我们的 Ubuntu OS 里。我们也可以打开 Metricbeat 的 Dashboard:

 

从上面,我们可以看出来在操作一些东西后 CPU 的使用率上来了。我们也可以使用如下的指令来运行我们的 watcher 而不用等每隔1分钟运行一次:

PUT _watcher/watch/system_memory_watcher/_execute

依赖于你系统的使用情况,我们可以在某个时间点上,watcher 将被触发:

 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值