概述
默认模板监控项
通过 Zabbix 客户端 + 各种模板可以实现以下监控:
| 类别 | 监控内容 |
|---|---|
| CPU | 使用率、负载、上下文切换等 |
| 磁盘 | 磁盘空间、I/O、inode 等 |
| 内存 | 内存使用、swap、缓存等 |
| 网络 | 网卡流量、丢包、错误等 |
| 系统 | 进程数、登录用户、运行时长等 |
自定义监控的应用场景
默认模板中没有需要的监控项
- 特定业务指标
- 自定义应用程序状态
- 特定硬件设备
模板中监控项过多
- 精简监控项,减少资源消耗
- 只关注关键指标
自定义监控全流程
┌─────────────────────────────────────────────────────────────┐
│ 客户端 │
│ 1. 通过命令/脚本取出对应的值 │
│ 2. 按 Zabbix 格式书写配置文件,创建键值对 │
│ 3. 重启客户端并测试键值 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 服务端 │
│ 1. 服务端测试键值是否可用 │
│ 2. Web 界面:键值与监控项关联 │
│ 3. Web 界面:配置触发器 │
│ 4. Web 界面:创建图形 │
└─────────────────────────────────────────────────────────────┘详细步骤
| 步骤 | 位置 | 操作 | 说明 |
|---|---|---|---|
| 1 | 客户端 | 通过命令/脚本取出对应的值 | 获取监控数据 |
| 2 | 客户端 | 创建键值对配置文件 | 键值对 key 用于获取客户端数据 |
| 3 | 客户端 | 重启客户端并测试 | 本地验证 |
| 4 | 服务端 | 测试键值是否可用 | 使用 zabbix_get |
| 5 | Web | 键值与监控项关联 | 创建监控项 |
| 6 | Web | 配置触发器 | 设置告警条件 |
| 7 | Web | 创建图形 | 可视化展示 |
实战案例
案例一:监控 MySQL 3306 端口
1. 确定监控命令
# 检查 3306 端口是否存在
ss -lntpu | grep -w 3306 | wc -l
# 返回 1 表示端口存在,返回 0 表示不存在2. 创建配置文件
# 进入配置目录
cd /etc/zabbix/zabbix_agent2.d/
# 创建配置文件
cat > 3306.conf << 'EOF'
# 格式:UserParameter=key,cmd
# UserParameter=固定写法,表示要自定义键值
# key 表示键值名称,建议使用"单词.单词"格式
# cmd 表示命令或脚本
UserParameter=check.mysql,ss -lntpu | grep -w 3306 | wc -l
EOF3. 重启客户端
systemctl restart zabbix-agent24. 本地测试
zabbix_agent2 -t check.mysql
# 预期输出:
# check.mysql [s|1]5. 服务端测试
# 安装测试工具
yum install -y zabbix-get
# 测试键值
zabbix_get -s 192.168.5.134 -k check.mysql
# 预期输出:1 或 06. Web 界面配置
创建监控项:
- 进入 Configuration → Hosts → 选择主机 → Items
- 点击 Create item
填写信息:
- Name: MySQL 3306 Port Status
- Key:
check.mysql - Type of information: Numeric (unsigned)
- Update interval: 1m
创建触发器:
- 进入 Triggers 选项卡
- 点击 Create trigger
填写信息:
- Name: MySQL 3306 port is down
- Expression:
{Host:check.mysql.last()}=0 - Severity: High
案例二:带参数的自定义监控
目标
检查指定用户是否存在异地登录。
实现思路
- 使用
lastlog命令获取用户最后登录的 IP - 在服务端通过触发器进行对比判断
命令选择
# lastlog 可以显示所有用户的最后登录信息
lastlog | grep -w root | awk '{print $3}'
# 输出示例:192.168.1.100创建带参数的配置
cat > /etc/zabbix/zabbix_agent2.d/user_login.conf << 'EOF'
# 注意:使用 $$3 而不是 $3,避免与 Zabbix 参数冲突
UserParameter=user.login.check[*],lastlog | grep -w "$1" | awk '{print $$3}'
EOF测试
# 本地测试
zabbix_agent2 -t user.login.check[root]
# 服务端测试
zabbix_get -s 192.168.5.134 -k 'user.login.check[root]'Web 配置
创建监控项:
- Key:
user.login.check[root] - Type: Character
创建触发器:
表达式:{Host:user.login.check[root].str(192.168.1.100)}=0
说明:如果返回值不是 192.168.1.100,则触发告警自定义模板
为什么要使用模板
- 实现监控项、触发器、图形的批量复用
- 便于管理和维护
- 支持多主机快速部署
创建步骤
1. 创建模板
- 进入 Configuration → Templates
- 点击 Create template
填写信息:
- Template name: Template Custom MySQL Monitor
- Groups: Templates/Databases
2. 添加监控项
在模板中添加之前创建的监控项:
- Name: MySQL Port Status
- Key:
check.mysql - Type: Zabbix agent
3. 添加触发器
- Name: MySQL is not running
- Expression:
{Template Custom MySQL Monitor:check.mysql.last()}=0
4. 添加图形
- 进入 Graphs 选项卡
- 点击 Create graph
- 选择监控项添加到图形
5. 模板关联主机
- 进入 Configuration → Hosts
- 选择主机 → Templates 选项卡
- 选择创建的模板 → Add → Update
监控报警
报警方式对比
| 报警方式 | 企业应用场景 | 费用 |
|---|---|---|
| 邮件 | 个人邮箱、企业邮箱 | 免费 |
| 企业微信-告警应用 | 需要企业微信 | 免费 |
| 钉钉 | 与阿里云集成 | 免费 |
| 短信 | 阿里云短信服务 | ~0.045元/条 |
| 电话 | 紧急告警 | 收费 |
| OneAlert | 第三方报警平台 | 免费(有限制)/收费 |
邮件告警配置
1. 配置报警媒介类型
- 进入 Administration → Media types → Email
配置 SMTP 服务器信息:
- SMTP server: smtp.example.com
- SMTP server port: 587
- SMTP helo: example.com
- SMTP email: zabbix@example.com
- Authentication: 用户名密码
2. 配置用户报警媒介
- 进入 Administration → Users → 选择用户
- 进入 Media 选项卡
点击 Add:
- Type: Email
- Send to: user@example.com
3. 配置动作
- 进入 Configuration → Actions → Trigger actions
- 创建或编辑动作
- 配置 Operations 发送邮件
微信告警配置
1. 创建告警脚本
创建 /usr/local/share/zabbix/alertscripts/wechat.py:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Zabbix WeChat Alerts Scripts
import requests
import sys
import os
import json
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename=os.path.join('/tmp', 'wechat.log'),
filemode='a'
)
# 企业微信配置(需要修改)
CORP_ID = 'wxd074861951c67ba6'
APP_SECRET = 'QtraZrI936DZ0jZ3aSWTZ-lFVheAMgLmq3toM4B9U1A'
AGENT_ID = 1
def get_access_token():
"""获取 access_token"""
url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={APP_SECRET}'
resp = requests.get(url)
return resp.json()['access_token']
def send_message(access_token, party_id, subject, message):
"""发送消息"""
url = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}'
data = {
"toparty": party_id,
"msgtype": "text",
"agentid": AGENT_ID,
"text": {
"content": f"{subject}\n\n{message}"
},
"safe": 0
}
resp = requests.post(url, data=json.dumps(data))
return resp.json()
if __name__ == '__main__':
if len(sys.argv) < 4:
print("Usage: wechat.py <party_id> <subject> <message>")
sys.exit(1)
party_id = sys.argv[1]
subject = sys.argv[2]
message = sys.argv[3]
try:
token = get_access_token()
result = send_message(token, party_id, subject, message)
logging.info(f'Sent to: {party_id}, Subject: {subject}, Message: {message}')
print(json.dumps(result))
except Exception as e:
logging.error(f'Error: {str(e)}')
print(f'Error: {str(e)}')
sys.exit(1)2. 安装依赖
# 安装 Python3 和 pip
yum install -y python3 python3-pip
# 安装 requests 库
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests3. 测试脚本
cd /usr/local/share/zabbix/alertscripts/
python3 wechat.py "部门ID" "测试标题" "测试消息内容"4. 配置报警媒介类型
- 进入 Administration → Media types → Create media type
- 选择 Type: Script
填写信息:
- Name: WeChat
- Script name: wechat.py
Script parameters:
{ALERT.SENDTO}# 发给谁{ALERT.SUBJECT}# 报警标题{ALERT.MESSAGE}# 报警内容
5. 配置告警消息模板
故障消息模板:
故障目前已经解决时间: {EVENT.RECOVERY.TIME} {EVENT.RECOVERY.DATE}
故障名称: {EVENT.NAME}
故障经历多久: {EVENT.DURATION}
故障主机: {HOST.NAME}
故障级别: {EVENT.SEVERITY}
故障ID: {EVENT.ID}
{TRIGGER.URL}常用宏变量
| 宏 | 说明 |
|---|---|
{ALERT.SENDTO} | 告警接收人 |
{ALERT.SUBJECT} | 告警标题 |
{ALERT.MESSAGE} | 告警内容 |
{EVENT.NAME} | 事件名称 |
{EVENT.TIME} | 事件发生时间 |
{EVENT.DATE} | 事件发生日期 |
{EVENT.DURATION} | 事件持续时间 |
{EVENT.RECOVERY.TIME} | 恢复时间 |
{EVENT.RECOVERY.DATE} | 恢复日期 |
{HOST.NAME} | 主机名 |
{EVENT.SEVERITY} | 严重程度 |
{EVENT.ID} | 事件 ID |
常用内置键值参考
| 键值 | 说明 |
|---|---|
agent.ping | 检查 Agent 是否存活 |
system.cpu.util | CPU 使用率 |
system.cpu.load | CPU 负载 |
vm.memory.size | 内存大小/使用率 |
vfs.fs.size | 文件系统大小/使用率 |
net.if.in | 网卡入流量 |
net.if.out | 网卡出流量 |
proc.num | 进程数量 |
system.uptime | 系统运行时间 |
system.users.num | 登录用户数 |