zabbix自定义自动发现服务(low-level-discovery)监控系统服务

一、概述

由于工作关系很久没有更新博客了,本文基于生产配置,是zabbix系列的另一补充;本次要讲的是zabbix Low-level discovery简称(LLD),我们在配置items(监控项)时,有时需要对类似的Items进行添加,换句话说,多台机器上的某一监控具有类似的items,如系统开放的服务,再如磁盘分区,网卡名称等,后两种zabbix已经自带,今天我们以自定义监控每个系统开放的服务来说明 LLD的使用逻辑;

和普通items获取不同的是,LLD 脚本在获取返回时,格式必须是json形式;
和自动发现不同的是,自动发现通过网络发现设备;而LLD是针对主机或模板中用来自动发现定义的items和添加触发器和图形的;

本次测试操作基于zabbix3.4.4 本文中的相关脚本和模板下载

二、LLD脚本

1、获取开放的服务

任何获取items都要基于程序脚本,LLD发现也不例外,以下是获取系统开放服务脚本discovery_services.sh

# cat /usr/local/zabbix-3.4.4/scripts/discovery_services.sh

#!/bin/bash
proarray=($(find /var/run/ -name "*.pid"  2> /dev/null||egrep -v '(rpc|php_daemon|haldaemon|irqbalance|console-kit-daemon)' |awk -F'/' '{print $NF}'|awk -F'.' '{print $1}'))    # 排除不监控的服务

length=${#proarray[@]}
printf "{n"
printf  't'""data":["
printf "t"
printf 'ntt{'
printf ""{#PRO_NAME}":"iptables"}"       #必须要添加的iptables
printf  ","
for ((i=0;i<$length;i++))
do
        printf 'ntt{'
        printf ""{#PRO_NAME}":"${proarray[$i]}"}"
        if [ $i -lt $[$length-1] ];then
                printf ','
        fi
done
printf  "nt]n"
printf "}n"

说明:以上脚本基于 /var/run下的pid进行监控开放的服务,所以如果是公司运维人员自已经开发的管理脚本服务,pid文件请按默认的放到/var/run下 ,这样就不会漏掉,再说大部分系统或知名程序都遵守这一规定,你为什么不能遵守呢?

在一台监控机器上执行如下:

未分类

记住这里的{#PRO_NAME} 这个就是自动发现规则中的宏变量;另外这个脚本返回的是json格式;

2、检查系统状态

对获取的服务进行检查

# cat /usr/local/zabbix-3.4.4/scripts/program_status.sh

#!/bin/bash
procjetName="${1:-NULL}"
LOCK_PATH="/var/lock/subsys"     
RUN_PATH="/var/run"
ret_ok=1
ret_critical=3
ret_unknown=4

if  [[ ${procjetName} == "NULL" ]] ; then
        echo ${ret_unknown}
fi

if [ -f "${LOCK_PATH}/${procjetName}" ] || [ -f "${RUN_PATH}/${procjetName}.pid" ]  || [ -f "${RUN_PATH}/${procjetName}/${procjetName}.pid" ] ; then
        echo ${ret_ok}
else
        echo ${ret_critical}
fi

以上脚本检查如果服务存在则返回1 否则返回 3 ,如果服务不存在则返回4
检查的原则就是在/var/run/下是否有和服务同名的pid文件存在,或/var/run/服务/服务.pid存在,对于像iptabls这种则检查 /var/run/subsys/服务.pid 三种情况满足一种即可;

运行效果如下:

未分类

对iptables服务检查 返回 1说明 iptables正常

关闭iptables 再次进行检查:

未分类

而对httpd服务进行检查,由于本机根本没有httpd服务,所以返回的是3

未分类

3、定义items

# cat /usr/local/zabbix-3.4.4/etc/zabbix_agentd.conf.d/LLD_Services.conf
UserParameter=services.scan,/bin/bash /usr/local/zabbix-3.4.4/scripts/discovery_services.sh
UserParameter=services.status[*],/bin/bash /usr/local/zabbix-3.4.4/scripts/program_status.sh $1

三、添加模板和自动发现规则

这里需要在web页上添加,和添加items很类似;

1、创建模板

进入web端;单击 配置–模板–配置模板–创建模板– 这里模板名叫 “Ickey Services status” –创建应用集(“Services_status”) 如图:

未分类

未分类

2、创建自动发现规则(LLD)

如上图点自动发现规则在模板中创建 自动发现规则 — 创建自动发现规则 如图:

未分类

这里需要注意的是 键值: servies.scan 即item 是在2.3小节的配置文件中定义的,不可乱写

再配置上图中的过滤器 配置变量(宏)如图:

未分类

此处的{#PRO_NAME}就是上面2.1节中脚本返回的变量; — 保存

3、创建 配置 监控项原型

如图:

未分类

填写名称,等相关信息如图:

未分类

此处需要注意的$1 和键值 是 2.3 定义items中的$1 也即是服务名; 保存;

4、创建触发器类型

如图:

未分类

未分类

说明:触发器名称:即是 “服务名” is down

表达式的意思就是 当发现某服务返回的值不是 1时发出警告

保存 这个 模板中的自动发现规则 就完成啦

但是这里存在一个问题,当我们机器上yum工具时,会在/var/run下生成yum.pid这样就会侦测到一个新服务,yum,但yum执行完后yum.pid会被删除,此时触发器就会报yum is down,为了解决这类问题,我们可以修改触发器报警策略,修改成如下:

未分类

意思就是,最后状态不是1 同时一小时前的状态是1;这样那此在/var/run生成临时pid的程序就不会被触发;

接下来就是在主机上应用模板,可以批量添加;这里就忽略了;

5、测试

看下效果图:

未分类

未分类

可以看到此主机应用了模板后已经可以拿到监控项数据了,我们来关闭这台主机的防火墙服务试试,看看触发器是否正常;

如图:

未分类

再把iptables服务启动

未分类

可以看到服务关闭和启动可以报警与恢复;至此自动发现服务已经可以正常使用啦!通过这个实例,希望大家能理解自动发现规则的原理逻辑!本文基于生产故有些截图带有涂;主要用于备忘与分享,如有错误之处欢迎留言!

redhat 6.5 安装和配置zabbix客户端

一、安装zabbix-agent端

rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
yum install zabbix-agent-2.4.6-1.el6.x86_64

二、配置agent端配置文件

配置agent端配置文件

vim /etc/zabbix/zabbix_agentd.conf       #此处千万别写成了zabbix_agent.conf,否则配置了不生效
Server=115.29.245.240                    #填写Server的IP地址
ServerActive=115.29.245.240              #修改为Server的IP地址
Hostname=115.29.245.240                   #填写Server的HostName,注意Server端要能解析
UnsafeUserParameters=1                   #是否允许自定义的key,1为允许,0为不允许
Include= vi etc/zabbix/zabbix_agentd.conf.d/  #自定义的agentd配置文件(key)可以在这里面写

如果该文件中的内容(安装目录和可执行文件目录)与实际状况不同,那么则需要修改

三、启动Zabbix Agent

启动Zabbix Agent服务

service zabbix-agentd_ctl start

四、设置开机启动

设置Zabbix-Agent服务自启动

chkconfig zabbix-agent on

利用zabbix生成awstats日志分析图表并用Python调用zabbix API批量添加item

awstats作为一款日志分析软件,功能不错,但是界面过于简单,也没有图表功能,这里我采取了一种变通的方法,将awstats的分析结果(pv、hits(文件数)、bandwidth、visits(独立ip))添加到zabbix,并通过zabbix生成趋势图表。

在前两篇文章中,我们队awstats的使用及其工作方式进行了简明扼要的介绍:awstats对每个站点进行分析之后,会生成一个“awstats012016.txt”格式的“数据库”文件;awstats的展示页面便是从该文件中取数据生成的。

  1. 多server多站点情况下awstats日志分析:http://kaifly.blog.51cto.com/3209616/1719248

  2. awstats CGI模式下动态生成页面缓慢的改进:http://blog.51cto.com/kaifly/1770137

这篇文章的思路就是从这个文本格式的‘数据库文件’中取得我们想要的数据,然后通过自定义的脚本将其添加到zabbix中,最终满足我们生成pv趋势图表的需求。

而完成此任务的关键就是分析似‘awstats052016.txt’的数据文件的内容格式(ps:以笔者“多年”shell经验来看,”分析源文件格式“和“生成目标文件格式”这俩“格式”在日常的shell编程中占用了很大一部分时间。扯远了O(∩_∩)O~)

首先是自定义脚本作为zabbix的key,从对应的‘数据文件’中取得pv、hits、bandwidth、visits的值。用shell实现如下

cat web_pv.sh

#!/bin/sh
#从例如api/awstats052016.txt这样的awstats数据库文件里取得昨天的pv等统计(因为awstats本身就是统计到昨天的日志)
#by  ljk  20160506
#blog    http://kaifly.blog.51cto.com/

#shell脚本的$1 $2分别代表站点名称(格式如www或bbs)和统计项(pv 文件数 字节 独立ip)

basedir='/usr/local/awstats-7.4/result'
date_f1=$(date +%m%Y -d '1 day ago')
date_f2=$(date +%Y%m%d -d '1 day ago')

cd $basedir/$1
#下面关于awk的用法中有一个小技巧,匹配到指定的项之后,停止继续搜索余下的内容。这对于体积较大的文件可以节约不少时间
content=`awk '$1 == "'$date_f2'" {{print} {exit}}' awstats$date_f1.txt`
case $2 in
    "pages")
        echo $content|awk '{print $2}';;    #pv
    "hits")
        echo $content|awk '{print $3}';;    #hits/文件数
    "bandwidth")
        echo $content|awk '{print $4}';;    #bandwidth/字节
    "visits")
        echo $content|awk '{print $5}';;    #visits/独立ip
    *)
        echo "unknow value";;
esac

然后在awstats所在的server的zabbix的‘userparameter.conf’文件中添用户自定义key,并重启zabbix_agentd

UserParameter=web_pv[*],/bin/sh /usr/local/zabbix/etc/zabbix_agentd.conf.d/web_pv.sh $1 $2

接着在zabbix_server端通过zabbix_get命令尝试获取这些值,key格式为“web_pv[站点名,监控项]”,例如

未分类

能取到值,说明自定义key是ok的。

接下来就是在zabbix里添加各站点的item了,这里通过Python实现(zbx接口通过json传递数据,处理json python比shell方便太多了)

这里需要仔细阅读下zabbix的api文档https://www.zabbix.com/documentation/3.0/manual/api和查看zabbix数据库结构(确保万无一失嘛)

首先在zabbix里创建一个template,名为Template site PV,这一步手动创建即可

然后开始通过Python自动化添加items

cat shells/add_web-pv_item_to_zabbix.py

#!/bin/env python3
"""
将各站点的4种(pages,hits,bandwidth,visits)item添加/更新到zabbix的 'Template Site-PV'
by ljk  20160507
"""

import os,requests

basedir='/usr/local/services/awstats-7.4/result/'
items=['pages','hits','bandwidth','visits']

url='http://192.168.1.199/api_jsonrpc.php'
zbx_api_headers={'Content-Type':'application/json-rpc'}    #定义通过zabbix api操作时必带的header

#取得用于zabbix api认证的token,通过用户名密码请求api生成
#生成方式请参考api文档,有个这个token,可以省去账号密码认证
api_auth="738024dfda33cc6020fb1f5e3617" 

#这里我在前期实验的时候,手动添加了几个item了,所以这里先取出template里已经存在的item,以便后期创建时过滤掉这些item
exist_items_filter={    #通过zabbix api查询已经存在的web_pv[*,*]的item,这里是json格式的过滤条件
    "jsonrpc": "2.0",
    "method": "item.get",
    "params": {
        "output":[
            "name",
        ],
        "search": {
            "key_":"web_pv"
        }
    },
    "auth":api_auth,
    "id": 0
}
exist_items=requests.post(url,headers=zbx_api_headers,json=exist_items_filter)

os.chdir(basedir)
sites=os.listdir(path='.')

def create_item():
    for site in sites:
        for item in items:
            if site+'-'+item not in exist_items.text:
                #先给不同情况下的units和multiplier赋值
                if item=='pages' or item=='hits':
                    units='万'
                    multiplier=0.0001
                elif item=='bandwidth':
                    units='B'
                    multiplier=1
                else:
                    units=''
                    multiplier=1
                #定义创建item的json数据格式
                num=10
                create_item_post={
                    "jsonrpc": "2.0",
                    "method": "item.create",
                    "params": {
                        "name": site+','+item,
                        "key_": "www_pv["+site+','+item+"]",
                        "hostid": "10134",
                        "type": 0,
                        "value_type": 3,
                        "history": 7,
                        "delay": 28800,
                        "units": units,
                        "applications": [774],
                        "interfaceid": "0",
                        "formula": multiplier
                    },
                    "auth": api_auth,
                    "id": num
                }
                try:

                    create_item_result=requests.post(url,headers=zbx_api_headers,json=create_item_post)            
                    #打印处理每个条目的结果
                    print('{}-{}: return_code {} details {}'.format(site,item,create_item_result.status_code,create_item_result.json))
                    num+=1
                except:
                    print('{}-{}: error'.format(site,item))
                    import sys
                    sys.exit(255)

#create_item()

#update函数,其实是我在执行create_item()的时候将key的名字写错了,无奈在写一个update_item()吧
def update_item():
    num=100    #对应zbx api中的id字段,随意指定,确保每次调用api时该值不同即可(这里用自增的方式)

    #定义更新item的json数据格式
    update={
        "jsonrpc": "2.0",
        "method": "item.update",
        "params": {
            "itemid": "",
            "key_": ""
        },
        "auth": api_auth,
        "id": num
    }

    #取得site pv模板下所有错误的item(key以www_py开头的),hostid的值实际为template site PV模板的templateid
    wrong_items_filter={
            "jsonrpc": "2.0",
            "method": "item.get",
            "params": {
               "output":["key_","hostid"],
                "search": {"hostid":"10134","key_":"www_pv"}
            },
            "auth": api_auth,
            "id": 0
        }

    wrong_items=requests.post(url,headers=zbx_api_headers,json=wrong_items_filter).json()['result']    #wrong_items为list

    for wrong_item in wrong_items:
        if wrong_item['hostid'] != '10119':    #img2从template site pv继承而来 所以这里每个item对应两条记录对应template site pv的hostid:10134和img2的hostid:10119,所以不需要修改img2的
            update['params']['itemid']=wrong_item['itemid']
            update['params']['key_']=wrong_item['key_'].replace('www','web',1)            
            try:
                update_item_result=requests.post(url,headers=zbx_api_headers,json=update)
                print('{} ---- details {}'.format(wrong_item['key_'],update_item_result.json()))
                num+=1
            except:
                print('{}-{}: error'.format(site,item))
                import sys
                sys.exit(255)
#update_item()

后续的批量生成image和生成screen都可以通过zbx 的API来完成,这里就不再列举了

ok,最后看两张zabbix生成的靓图吧

未分类

未分类

Centos 7 安装配置Zabbix 3.4和报错解决方法

Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 访问官网https://www.zabbix.com/

1. 运行环境搭建

Zabbix组成:Web展示端(Zabbix-Web)、服务端(Zabbix-Server)、数据存储端和客户端(Zabbix-Agents)。可以安装在同一台服务器上,但是如果你拥有一个更大更复杂的环境,将它们安装在不同的主机上也是一个选项。
Zabbix服务器能够直接监控到同一网络中的设备,如果其他网络的设备也需要被监控,那还需要一台Zabbix代理服务器(Zabbix-Proxy)。

环境准备:lnmp(linux+nginx+mysql+php)或者lamp(linux+apache+mysql+php),大同小异,本文采用宝塔面板(linux管理面板)编译安装nginx+mysql+php,首先新建Zabbix站点和创建Zabbix数据库。

2. 安装 Repository with MySQL database

rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

3. 安装 Zabbix server

yum install zabbix-server-mysql

说明:

  • 如果出现类似以下报错
Loaded plugins: fastestmirror
...
One of the configured repositories failed (Unknown),and yum doesn't have enough cached data to continue.
...
Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
  • 解决办法:

1、将/etc/yum.repos.d/epel.repo中的mirrorlist改为baseurl
2、/etc/resolv.conf文件中增加nameserver 144.144.144.144

4. 导入数据库

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

由于我使用的是宝塔面板,直接通过面板导入create.sql文件。

5. 配置数据库用户及密码

vi /etc/zabbix/zabbix_server.conf

找到添加下面三项,按自己数据库实际信息填写(数据库如果在本地,DBHost默认即可)。

DBHost=localhost    
DBName=zabbix
DBUser=zabbix
DBPassword=zabbixpw

启动zabbix-server并允许开机自启

systemctl enable zabbix-server
systemctl start zabbix-server

6. 配置Web前端

前端路径是/zabbix-3.4.9/frontends/php,上传到网站根目录,运行。

  • 根据报错,修改PHP参数:
max_input_time = 300
date.timezone = Asia/Shanghai
  • 安装完成后,出现下面报错:
zabbix server is not running: the information displayed may not be current.

查看log:

cat /var/log/zabbix/zabbix_server.log

看到类似如下信息:

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

查看/var/lib/mysql文件夹的确没有mysql.sock文件,通过find查找mysql:

find / -name mysql.sock

文件在/tmp/mysql.sock这个位置,做个软连接报错消失。

ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

Zabbix 3.2 配置邮件告警实践指南

下面为大家介绍zabbix邮件告警配置,报警方式有好几种,最常用的就是邮件了,比较有钱的公司可能会使用短信,等后面有时间,再写一篇zabbix基于企业微信告警的文章。那么现在就开始讲邮件告警啦。

第一、安装邮件发送工具mailx

这里我选择的是mailx,Centos6默认会安装,如果没有安装的话,请使用语句进行安装。

yum install -y mailx

第二、查看是否有其他的邮件发送工具,进行关闭。

service sendmail  stop
chkconfig sendmail off
service  postfix  stop
chkconfig  postfix off

第三、配置Zabbix服务端外部邮箱

打开文件vim /etc/mail.rc 如果没有的话,有可能是 /etc/nail.rc,在最后加内容如下:

set  sendcharsets=iso-8859-1,utf-8     #设置发送支持的编码
set  from=xxx@139.com              #在邮件头中可以看到的发送人 
set  smtp=smtp.139.com             #smtp服务器 
set  smtp-auth-user=xxx@139.com       #发送邮件的用户 
set  smtp-auth-password=xxx          #邮件发送人密码

第四、测试发送邮件是否可用

echo   “test”  |  mailx    -s   “test  mail”     xxx@139.com

未分类

发送成功

第五、编辑zabbix-server配置文件,启用脚本执行路径,编写发送邮件脚本

vim    /etc/zabbix/zabbix-server.conf 
AlertScriptsPath=/usr/lib/zabbix/alertscripts/         启用选项

编写脚本

vim  /usr/lib/zabbix/alertscripts/sendmail.sh 
#!/bin/bash export.UTF-8               #解决发送的中文变成了乱码的问题
FILE=/tmp/mailtmp.txt echo "$3" > $FILE 
dos2unix -k $FILE                       #解决了发送的邮件内容变成附件的问题。
bin/mailx  -s  "2" $1 < $FILE

上面涉及3个参数,$1:收件人邮箱 $2:邮件标题 $3:邮件正文

chmod  +x  /usr/lib/zabbix/alertscripts/sendmail.sh       #赋予执行权限 
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/sendmail.sh   #属主属组为zabbix用户
service   zabbix-server    restart

第六、在zabbix的web界面上配置发送告警

1、点击配置 –> 报警媒介类型 –> 创建媒介类型

未分类

2、$1,$2,$3分别表示发送脚本中的$1,$2,$3,配置好后保存,点击更新

未分类

3、给用户添加报警媒介

点击 管理–> 用户 –> Admin用户,或者自己另创建用户

未分类

4、添加媒介

未分类

5、编辑添加,填写后点击 已启用 –> 更新

未分类

6、创建触发告警动作

未分类

填写动作选项

未分类

填写操作,步骤1-0表示无限制,步骤持续时间表示多久发生一次告警

未分类

填写恢复操作

未分类

以上操作完成后点击更新

第七、测试阶段

将一台添加到 Template OS Linux 模板的服务器进行关闭客户端

service  zabbix-agent stop

登录到zabbix Web界面,看触发告警

未分类

触发成功,并显示发送告警成功,查看邮件

未分类

邮件接收成功

启动服务器zabbix客户端查看是否会发生恢复邮件

service   zabbix-agent   start

未分类

接收到恢复告警邮件,查看web界面是否触发问题已取消

未分类

服务器均正常。

到此,zabbix邮件告警就结束了。

zabbix企业级监控之监控数据库大小、表大小

1.怎么去获取到数据库大小、表大小?

information_schema数据库存储了关于数据库的信息

未分类

使用information_schema数据库

MariaDB [(none)]> use information_schema ;

查询数据库总大小

MariaDB [information_schema]> select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables;

未分类

查询指定数据库zabbix的大小

MariaDB [information_schema]> select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='zabbix';

未分类

查询指定数据库的指定表的大小(zabbix数据库的items表的大小)

select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='zabbix' and table_name='items';

未分类

2.如何通过shell 脚本去获取?

vim /etc/zabbix/shell/monitor_mysql.sh

#!/bin/bash

DB_size() {
       mysql -Dinformation_schema -e "select concat(round(sum(data_length/1024/1024),2)) as data from tables" |awk 'NR==2{print $1}'
}

DB_zabbix_size() {
     mysql -Dinformation_schema -e "select concat(round(sum(data_length/1024/1024),2)) as data from tables where table_schema='zabbix'" | 
     awk 'NR==2{print $1}'
}

$1

3.agent定义模板

vim userparameter_my.conf

UserParameter=monitor_mysql[*],/bin/bash /etc/zabbix/shell/monitor_mysql.sh "$1"

参数解释:
monitor_mysql[]:是自定义key,是传参 是从server端自定义键值的时候传参传下来的

4.server端自定义键值,请参考第二篇,监控QPS和TPS的那篇
5.准备更新一个关于zabbix监控的专题,欢迎加入我们的Linux技术交流群:642921645,zabbix监控交流群:832462735 ,我们不定期去更新很多关于系统运维的资料在群里,期待你的加入!
6.在腾讯课堂有zabbix监控的免费技术分享,欢迎来听!地址如下:https://ke.qq.com/course/316681?tuin=6645db32

Zabbix企业级监控之监控Nginx

1.如何监控Nginx?

需要添加http_stub_status_module 模块

2.安装Nginx需要的模块

(1)安装依赖包

yum -y install vim gcc wget pcre-devel openssl-devel gcc-c++ pcre-dev  zlib-devel 

(2)安装nginx

wget http://101.96.10.63/nginx.org/download/nginx-1.12.1.tar.gz

解压

tar -zxvf nginx-1.12.1.tar.gz

添加nginx组并添加nginx用户

useradd -M -s /sbin/nologin nginx

(3)编译安装

cd nginx-1.12.1
./configure --prefix=/etc/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install

(4)vim nginx.conf

在server {} 添加nginx统计模块

#nginx状态监控
        location /nginx_status {
              stub_status on;
              access_log off;
              allow all;        }

(5)重启nginx

3.重启agent

systemctl restart zabbix-agent

4.添加nginx模板

vim /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf
UserParameter=nginx_status[*],/bin/bash /etc/zabbix/shell/monitor_nginx.sh "$1"

5.编写shell脚本

vim /etc/zabbix/shell/monitor_nginx.sh

#!/bin/bash

nginx_port=81
nginx_ip=127.0.0.1
curl_addres="http://$nginx_ip:$nginx_port/nginx_status"
nginx_active() {
    curl -s $curl_addres|grep "Active"|awk '{print $3}'
}

nginx_reading() {
   curl -s $curl_addres |grep "Reading"| awk '{print $2}'
}
nginx_writing() {
   curl -s $curl_addres |grep "Writing"|awk '{print $4}'
}

nginx_waiting() {
   curl -s $curl_addres |grep "Waiting"|awk '{print $6}'
}

nginx_accept() {
   curl -s $curl_addres |awk 'NR==3{print $1}'
}
nginx_handled() {
   curl -s $curl_addres |awk 'NR==3{print $2}'
}

nginx_requests() {
   curl -s $curl_addres |awk 'NR==3{print $3}'
}

case $1 in 
    nginx_active)
        nginx_active;
    ;;
    nginx_reading)
        nginx_reading;
    ;;
    nginx_writing)
        nginx_writing;
    ;;
    nginx_waiting)
        nginx_waiting;
    ;;
    nginx_accept)
        nginx_accept;
    ;;
    nginx_handled)
        nginx_handled;
    ;;
    nginx_requests)
        nginx_requests;
    ;;
    *)
esac

zabbix实战应用-zabbix配置钉钉报

当我们把 zabbix 的基础建设构建完成之后,就能够对 Linux 服务器的一些基本项进行监控了,在 web 界面也可以看到相关问题的一些报警了,但是这样的报警显然是不够的,我们需要的是那种与实际工作常用工具相结合的报警,这样既容易发现告警,先显得比较高端,再加上一些基础的服务器信息以及告警项,做出对应的处理就非常容易了。

今天我们就来整理一下 zabbix 结合钉钉机器人的报警配置。

一、首先是钉钉客户端配置

1、建立一个钉钉群组。
2、添加一个机器人。

未分类

注意,这里要复制下来这个 wenhook 值,等会要用到的。

二、zabbix 服务器端配置

1、Zabbix 配置文件中查找”Alert”查看告警脚本存放路径。

[root@localhost ~]# vim /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts       (455 行,默认的,不用修改)

2、进入配置中路径创建配置文件,并添加监听脚本。

[root@localhost ~]# cd /usr/lib/zabbix/alertscripts/

3、然后添加脚本。

[root@localhost alertscripts]# vim token.sh

#!/bin/bash
to=$1
subject=$2
text=$3
curl 'xxxxxxxxx'       #此处的 xxxxx 就是刚刚复制存留的 api 接口地址。
-H 'Content-Type: application/json' 
-d '
{"msgtype": "text",
"text": {
"content": "'"$text"'"
},
"at":{
"atMobiles":[
"'"$1"'"
],
"isAtAll":false
}
}'

三、配置执行文件权限与归属

[root@localhost alertscripts]# chown zabbix.zabbix token.sh
[root@localhost alertscripts]# chmod +x token.sh

切换至 zabbix 用户测试脚本是否执行成功。

bash  token.sh 11 22 33

如果钉钉已经有了提示消息,说明配置成功。

四、设置前端创建脚本及报警媒介

再添加以下 3 个参数,分别对应脚本需要的 3 个参数:收件人地址、主题、详细内容。

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

未分类

五、创建动作

配置
--->动作
--->右上角触发器
--->创建动作
--->名称(钉钉)
--->新的触发条件(触发器示警度--->大于等于--->警告)
--->添加(上边出现了两条--->计算方式选和)
--->选择右边操作

未分类

--->步骤时间--->1000
--->标题(故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!)
--->默认信息下边的添加

        告警主机:{HOSTNAME1}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    告警等级:{TRIGGER.SEVERITY}
    告警信息: {TRIGGER.NAME}
    告警项目:{TRIGGER.KEY1}
    问题详情:{ITEM.NAME}:{ITEM.VALUE}
    当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
    事件 ID:{EVENT.ID}

--->操作添加
--->步骤--->5 表示触发 5 次动作
--->步骤持续时间--->每隔 120 秒触发一次
--->告警发给 admin 用户
--->用”钉钉”媒介发送。  
--->点击小”add”添加选项,否则等于没写

未分类

点击添加之后
--->右边恢复操作,相当于服务正常之后的操作
--->标题改为--->恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
--->信息改为--->

    告警主机:{HOSTNAME1}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    告警等级:{TRIGGER.SEVERITY}
    告警信息: {TRIGGER.NAME}
    告警项目:{TRIGGER.KEY1}
    问题详情:{ITEM.NAME}:{ITEM.VALUE}
    当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
    事件 ID:{EVENT.ID}

--->点击”新的”添加发送选项
--->添加群组
--->添加用户 Admin
--->仅送到--->钉钉
--->点击小”添加”添加选项,否则等于没写  
点击小 add 添加选项后再点击大 ADD 完成动作增加。

未分类

六、添加报警媒介

--->点击右上角用户头像
--->点击报警媒介
--->添加
--->类型--->钉钉
--->收件人--->要@的人的手机号
--->当启用时--->这个设置的是报警的时间设置
--->添加
--->然后直接点击更新

未分类

更新。

未分类

七、配置提示

--->点击右上角用户头像
--->选择正在发送消息
--->选中前端消息
--->下边的全选中,,更新。

未分类

测试
直接把监控的 nginx 服务器网卡断掉,然后等待报警!!!

未分类

现在再将网卡链接,看等会儿会是怎样的报警。

这样,一个非常给力好用的 zabbix 结合钉钉的报警就配置完成了。

zabbix监控之监控MYSQL吞吐量

1. 监控MYSQL的吞吐量监控哪些指标?

监控MYSQL的插入、查询、删除、更新等

2. 如何获取吞吐量的指标?

注意:为了shell脚本与mysql更好的交互,设置了mysql免密登录

mysqladmin status
mysqladmin extended-status

3. 如何通过shell脚本获取监控指标?

vim /etc/zabbix/shell/monitor_mysql.sh

#!/bin/bash
#监控mysql的吞吐量
slow_queries() {
mysqladmin status | awk '{print $9}'
}
Com_delete() {
mysqladmin extended-status | awk '/<Com_delete>/{print $4}'
}
Com_insert() {
mysqladmin extended-status | awk '/<Com_insert>/{print $4}'
}
Com_update() {
mysqladmin extended-status | awk '/<Com_update>/{print $4}'
}
Com_select() {
mysqladmin extended-status | awk '/<Com_select>/{print $4}'
}
$1

4. 定义agent端得模板

UserParameter=mysql_status[*],/bin/bash /etc/zabbix/shell/monitor_mysql.sh "$1"

5. 还有更多企业级监控项目,获取更多关于信息

zabbix自定义监控规则

这里先需要再zabbix端安装一个测试工具,用于测试自定义的规则是否可用
查看可以安装的工具:

yum list all |grep zabbix 

进行安装

yum install zabbix-get.x86_64

现在举一个监控进程状态的例子

1、先编写脚本,这个脚本可以是python也可以是shell,下面以shell为例子

1)无需传参数的脚本

#!/bin/sh

ret_ok=1
ret_warn=0

info_count=`/etc/init.d/workflow status|grep running|wc -l` #进程在运行中
#echo ${info_count}
#process_count=$((${info_count}-0))
if [[ ${info_count} == 1 ]]; then
      echo ${ret_ok} #成功返回1,打印出来就会被zabbix接收,zabbix触发器也是比较这个值
else
      echo ${ret_warn} #失败返回0
fi

2)可以传参数的脚本

#!/bin/sh

ret_ok=1
ret_warn=0
model=$1 #接收一个参数,用于监控不同模块
info_count=`/etc/init.d/$1 status|grep running|wc -l`
#echo ${info_count}
#process_count=$((${info_count}-0))
if [[ ${info_count} == 1 ]]; then
      echo ${ret_ok}
else
      echo ${ret_warn}
fi

2、修改zabbix_client的配置文件

模块好像不用配置,我的没有配置,但是网上很多人都手动配置了一下

vim /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf

创建一个conf文件

vim /etc/zabbix/zabbix_agentd.d/check_process.conf 

填入下面两行

UserParameter=checkworkflow,sh /home/zabbix/moniterworkflow.sh #监控单个模块,对应的是没有传参的那个脚本
UserParameter=checkmodel[*],sh /home/zabbix/moniall.sh $1 #监控多个模块,对应的是可以传参的脚本

3、再到zabbix-server上去测试一下

 不传参的:
[root@localhost ~]# zabbix_get -s 200.200.169.212 -k "checkworkflow"
1
传参的
[root@localhost ~]# zabbix_get -s 200.200.169.212 -k "checkmodel[workflow]"
1

4、配置到web端监控

键值需要自己输入,选择里面是没有的

未分类

添加触发器

未分类

查看结果

未分类