首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Grafana 监控系统是否重启

Grafana 监控系统是否重启

作者头像
py3study
发布2020-02-24 15:20:45
1.5K0
发布2020-02-24 15:20:45
举报
文章被收录于专栏:python3python3python3

一、概述

Linux 内核(以下简称内核)是一个不与特定进程相关的功能集合,内核的代码很难轻易的在调试器中执行和跟踪。开发者认为,内核如果发生了错误,就不应该继续运 行。因此内核发生错误时,它的行为通常被设定为系统崩溃,机器重启。基于动态存储器的电气特性,机器重启后,上次错误发生时的现场会遭到破坏,这使得查找 内核的错误变得异常困难。

线上的k8s集群,有时候回出现重启的现象,但是什么原因导致重启,无法得知。

Kdump

Kdump 是一种基于 kexec 的内存转储工具,目前它已经被内核主线接收,成为了内核的一部分,它也由此获得了绝大多数 Linux 发行版的支持。与传统的内存转储机制不同不同,基于 Kdump 的系统工作的时候需要两个内核,一个称为系统内核,即系统正常工作时运行的内核;另外一个称为捕获内核,即正常内核崩溃时,用来进行内存转储的内核。 

关于如何设置 kump,请参考链接:

https://blog.csdn.net/bytxl/article/details/45025183

因此,线上已经部署了Kdump,用来捕捉崩溃

二、监控脚本

系统什么时间发生了重启?不知道。所以需要有一个脚本来监测一下,一旦发生重启,就可以使用 crash分析内存转储文件

怎么知道系统重启

在ubuntu系统中,有一个 last reboot 命令,它会显示系统重启的历史列表

执行命令,效果如下:

root@localhost:~# last reboot
reboot   system boot  4.4.0-119-generi Mon Jan  7 13:50   still running
reboot   system boot  4.4.0-119-generi Sat Jan  5 11:48 - 13:49 (2+02:01)
reboot   system boot  4.4.0-62-generic Sat Jan  5 10:37 - 11:47  (01:10)

wtmp begins Sat Jan  5 10:37:40 2019

 在第一行,也就是最近一次的重启记录。

判断条件

怎么知道昨天,系统有没有重启呢?

很简单,先用 last reboot 获取最近一次的重启时间。再获取昨天的时间,将2个时间做对比,如果一致,就说明昨晚重启了,否则没有。

获取最新一次重启时间

# 最近一次重启时间
lately=`last reboot | head -1 | awk '{print $5,$6,$7}'`

昨日时间

# 昨天时间
yesterday=`date -d  "-1 days" | awk '{print $1,$2,$3}'`

Prometheus数据

我们需要构造Prometheus数据,将数据发送给Pushgateway,最后由Grafana 展示图表以及做报警

这里我们使用shell脚本来构造数据,格式如下:

监控名{destinationName="描述信息",instance="实例,默认值为空"} 值

这些数据,我是放在一个临时文件 /tmp/check_system_restart 里面

echo "system_restart{destinationName=\"system_restart\",instance=\"$HOSTNAME\"} 1" > /tmp/check_system_restart

注意:使用由于echo外部使用了双引号,所以内部再次使用双引号时,需要使用反斜杠进行转义才行。

我们知道,在shell里面,单引号是无法引用变量的,必须使用双引号!

$HOSTNAME 是linux 系统的一个全局变量,表示主机名

发送数据

cat /tmp/check_system_restart|curl --data-binary @- http://$localIP:9091/metrics/job/system_restart_`echo $localIP | awk -F '.' '{print $NF}'`

解释:

--data-binary 参数表示 HTTP POST请求中的数据为纯二进制数据

$localIP  表示 Pushgateway的ip地址

echo $localIP | awk -F '.' '{print $NF}'  表示获取ip地址的最后一位

注意:这里的job后面跟了一段字符串,是为了保证每一台服务器发送的url不一致。这样监控数据就不会被其他主机覆盖!

关于Pushgateway 的搭建,请参考链接:

https://www.cnblogs.com/xiao987334176/p/9933963.html

添加任务计划

常规情况下,我们一般使用 crontab -e 命令来添加任务计划

但是在shell脚本,却不能这么操作。

其实,直接修改  /etc/crontab  文件,也可以添加任务计划

下面一段代码,用来判断任务计划是否已经添加,不存在时,就添加!

if [ `cat /etc/crontab|grep 'check_reboot.sh'|wc -l` -eq 0 ];then
        cp -f /opt/check_reboot.sh /etc/ && chmod 755 /etc/check_reboot.sh 
        echo "0 * * * * root bash /etc/check_reboot.sh" >>/etc/crontabfi

完整代码

请将代码务必放到/opt目录下,因为代码路径写死了!!!

check_reboot.sh

#!/bin/bash

# 最近一次重启时间
lately=`last reboot | head -1 | awk '{print $5,$6,$7}'`

# 昨天时间
yesterday=`date -d  "-1 days" | awk '{print $1,$2,$3}'`

# 判断时间是否一致
if [ "$string" == "$yesterday" ];then
    # 写入日志
    #echo "$HOSTNAME restarted at $lately" >> /opt/restart.log
    echo "system_restart{destinationName=\"system_restart\",instance=\"$HOSTNAME\"} 1" > /tmp/check_system_restart
else
    echo "system_restart{destinationName=\"system_restart\",instance=\"$HOSTNAME\"} 0" > /tmp/check_system_restart
fi

# 获取geteway服务器ip
localIP=`ip addr | grep '192.168' | awk '{print $2}' | cut -d '/' -f 1`

# 发送数据给Pushgateway 
if [ `cat /tmp/check_system_restart|wc -l` -ge 1 ];then
        cat /tmp/check_system_restart|curl --data-binary @- http://$localIP:9091/metrics/job/system_restart_`echo $localIP | awk -F '.' '{print $NF}'`
else
        curl -X DELETE http://$localIP:9091/metrics/job/system_restart_`echo $localIP | awk -F '.' '{print $NF}'`
fi

# 添加任务计划
if [ `cat /etc/crontab|grep 'check_reboot.sh'|wc -l` -eq 0 ];then
        cp -f /opt/check_reboot.sh /etc/ && chmod 755 /etc/check_reboot.sh 
        echo "0 * * * * root bash /etc/check_reboot.sh" >>/etc/crontab
fi

执行脚本,就会自动产生 /tmp/check_system_restart 文件。

查看文件内容

root@localhost:~# cat /tmp/check_system_restart
system_restart{destinationName="system_restart",instance="xx-node01"} 0

自动将脚本复制到 /etc/check_reboot.sh,这样是为了路径统一,方便添加任务计划!

最后,会自动添加任务计划!

任务计划定义的是每个小时执行一次,为了不等那么长时间,可以先手动执行一次 /etc/check_reboot.sh 脚本

查看 Pushgateway 数据

就会看到一条job

1.png
1.png

三、Grafana添加监控

添加一个图形,标题叫做 昨日系统重启

1.png
1.png

设置显示的值

1.png
1.png

设置报警策略

当最后一个值等于1时,触发报警

1.png
1.png

效果如下:

1.png
1.png
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
    • Kdump
    • 二、监控脚本
      • 怎么知道系统重启
        • 判断条件
          • Prometheus数据
            • 发送数据
          • 添加任务计划
            • 完整代码
              • check_reboot.sh
          • 三、Grafana添加监控
          相关产品与服务
          Prometheus 监控服务
          Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档