在 zabbix 中主机监控状态有四种类型:ZBX(Zabbix agent) SNMP/JMX/IPMI,通过对应图标的颜色,即可直观 判断主机数据采集是否正常。使用 Zabbix Agent 作为采集协议,有时会出现灰色的情况,对于初学者是一个较为困惑的点,本次主要阐述不同 zabbix 版本中对 ZBX 标识的状态显示。

主被动模式

Zabbix Agent 的采集分为二种模式,主动模式(Active checks)和被动模式(Passive checks)。可简单理解为拉取(被动模式),推送(主动模式),详细介绍可查看之前的二篇文章
Zabbix Agent 主动模式配置
Zabbix Agent 被动模式配置
默认情况下 Zabbix Agent 会同时配置主动和被动模式,关联被动监控指标后 ZBX 图标会显示绿色。如果 Zabbix 被动模式连接出现问题,ZBX 图标会变成红色,鼠标停留在图标上面会显示具体的错误信息,可根据此信息进行排错。 ZBX 图标显示状态必须关联对应类型的监控指标项,否则图标一直为灰色状态。 对于 Zabbix 6.2 以下版本,ZBX 图标显示情况如下

项目 被动模式(Passive checks) 主动模式(Active checks)
监控正常 绿色 灰色
监控异常 红色 灰色

可以看到在 Zabbix 低版本中,ZBX 图标状态会跟随被动模式状态变化而变化,如果主动模式出现故障,则无法通过 ZBX 图标体现

新版本变化

为了解决以上问题,从 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=

在 6.2 版本开始,主动和被动二种监控状态都可分显示 1 如监控状态异常也会显示对应的错误信息,状态则为绿色和灰色二种

状态 被动模式(Passive checks) 主动模式(Active checks)
监控正常 绿色 绿色
监控异常 红色 红色

如果一个主机同时配置了主动和被动模式,并且同时关联了这二种类型的监控指标,ZBX 图标则会按照下列规则进行显示:

  • 如果被动模式正常,主动模式正常,那么 ZBX 图标会是绿色 1
  • 如果被动模式正常,主动模式异常,那么 ZBX 图标会是黄色 1
  • 如果被动模式正常,主动模式未知,那么 ZBX 图标会显示灰色 1 如果你的 Zabbix Server 为 6.2 版本而 Zabbix Agent 是低于 6.2 的版本,由于低版本 Zabbix Agent 无主动模式心跳检测,因此无法获取。主动模式状态会显示为 Unknown,ZBX 图标会显示灰色。这就是有些同学最近反应新版本中 ZBX 图标配置主动模式后图标也为灰色的原因。

结语

Zabbix 版本更新较快,新版本会带来很多新特性和功能,在使用新版本之前一定要先查看版本的 What’s new 内容,并查看相关版本的在线文档,避免使用经验来套新系统。对于版本选择,生产环境强烈建议选择 LTS 版本。

如果觉得我的文章对您有用,请关注我的公众号,有更多技术干货! 微信