张世宏(当代张思德) | Zabbix开源社区签约专家
在Zabbix中主机监控状态有四种类型:Zabbix(Zabbix agent) SNMP/JMX/IPMI,通过对应图标的颜色,即可直观 判断主机数据采集是否正常。使用Zabbix Agent作为采集协议,有时会出现灰色的情况,对于初学者是一个较为困惑的点,本次主要阐述不同Zabbix版本中对ZBX标识的状态显示。
Zabbix Agent的采集分为二种模式,主动模式(Active checks)和被动模式(Passive checks)。可简单理解为拉取(被动模式),推送(主动模式),详细介绍可查看之前的二篇文章
默认情况下Zabbix Agent会同时配置主动和被动模式,关联被动监控指标后ZBX图标会显示绿色。如果Zabbix 被动模式连接出现问题,Zabbix图标会变成红色,鼠标停留在图标上面会显示具体的错误信息,可根据此信息进行排错。Zabbix图标显示状态必须关联对应类型的监控指标项,否则图标一直为灰色状态。对于Zabbix 6.2以下版本,ZBX图标显示情况如下。
项目 | 被动模式(Passive checks) | 主动模式(Active checks) |
---|---|---|
监控正常 | 绿色 | 灰色 |
监控异常 | 红色 | 灰色 |
可以看到在Zabbix低版本中,ZBX图标状态会跟随被动模式状态变化而变化,如果主动模式出现故障,则无法通过Zabbix图标体现。 |
为了解决以上问题,从Zabbix6.2版本开始,官方增加了主动模式下的心跳检测函数send_heartbeat_msg.详见源码 zabbix\src\zabbix_agent\active.c
static void send_heartbeat_msg(zbx_vector_ptr_t *addrs)
{
static ZBX_THREAD_LOCAL int last_ret = SUCCEED;
int ret, level;
zbx_socket_t s;
struct zbx_json json;
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__);
zbx_json_init(&json, ZBX_JSON_STAT_BUF_LEN);
zbx_json_addstring(&json, ZBX_PROTO_TAG_REQUEST, ZBX_PROTO_VALUE_ACTIVE_CHECK_HEARTBEAT, ZBX_JSON_TYPE_STRING);
zbx_json_addstring(&json, ZBX_PROTO_TAG_HOST, CONFIG_HOSTNAME, ZBX_JSON_TYPE_STRING);
zbx_json_addint64(&json, ZBX_PROTO_TAG_HEARTBEAT_FREQ, CONFIG_HEARTBEAT_FREQUENCY);
level = SUCCEED != last_ret ? LOG_LEVEL_DEBUG : LOG_LEVEL_WARNING;
if (SUCCEED == (ret = zbx_connect_to_server(&s, CONFIG_SOURCE_IP, addrs, CONFIG_TIMEOUT, CONFIG_TIMEOUT,
configured_tls_connect_mode, 0, level)))
{
zabbix_log(LOG_LEVEL_DEBUG, "sending [%s]", json.buffer);
if (SUCCEED == (ret = zbx_tcp_send(&s, json.buffer)))
{
(void)zbx_tcp_recv(&s); /* allow Zabbix server or Zabbix proxy to close connection */
if (last_ret == FAIL)
{
zabbix_log(LOG_LEVEL_WARNING, "Successfully sent heartbeat message to [%s]:%d",
((zbx_addr_t *)addrs->values[0])->ip,
((zbx_addr_t *)addrs->values[0])->port);
}
}
}
if (SUCCEED != ret)
{
zabbix_log(level, "Unable to send heartbeat message to [%s]:%d [%s]",
((zbx_addr_t *)addrs->values[0])->ip, ((zbx_addr_t *)addrs->values[0])->port,
zbx_socket_strerror());
}
zbx_tcp_close(&s);
last_ret = ret;
zabbix_log(LOG_LEVEL_DEBUG, "Out %s()", __func__);
}
同时在6.2版本的Agent配置文件中增加了一个HeartbeatFrequency配置,用户可自行配置主动模式心跳检测时间,默认为60秒发送一次检测心跳,如果设置为0,则禁用主动模式心跳检测。
### Option: HeartbeatFrequency
# Frequency of heartbeat messages in seconds.
# Used for monitoring availability of active checks.
# 0 - heartbeat messages disabled.
#
# Mandatory: no
# Range: 0-3600
# Default: 60
# HeartbeatFrequency=
在Zabbix6.2版本开始,主动和被动二种监控状态都可分显示:
如监控状态异常也会显示对应的错误信息,状态则为绿色和灰色二种:
状态 | 被动模式(Passive checks) | 主动模式(Active checks) |
---|---|---|
监控正常 | 绿色 | 绿色 |
监控异常 | 红色 | 红色 |
如果一个主机同时配置了主动和被动模式,并且同时关联了这二种类型的监控指标,ZBX图标则会按照下列规则进行显示: |
如果你的Zabbix Server为6.2版本而Zabbix Agent 是低于6.2的版本,由于低版本Zabbix Agent无主动模式心跳检测,因此无法获取。主动模式状态会显示为Unknown,Zabbix图标会显示灰色。这就是有些同学最近反应新版本中ZBX图标配置主动模式后图标也为灰色的原因。
Zabbix版本更新较快,新版本会带来很多新特性和功能,在使用新版本之前一定要先查看版本的What's new内容,并查看相关版本的在线文档,避免使用经验来套新系统。对于版本选择,生产环境强烈建议选择LTS版本。