如何处理Zabbix监控值中文字符乱码情况?3点思路分享

感谢本文作者胡璞玉投稿!欢迎更多用户分享踩过的坑的使用经验!

如何处理Zabbix监控值中文字符乱码情况?3点思路分享

文章插图
胡璞玉 | Zabbix手册官方译者
Zabbix 5.0、6.0指导手册官方译者
系统架构师 , 长期从事IT工作 , 目前关注医疗信息化、医疗大数据方向
在使用Zabbix监控中 , 发现最新值中有些项对应的值为乱码 , 其他字段显示正常 。检查对应的值 , 发现应该是中文被显示为乱码 。

如何处理Zabbix监控值中文字符乱码情况?3点思路分享

文章插图
通常在监控一些网络设备时常出现 , 尤其是提供Web界面配置时 , 在描述字段使用中文 , 导致乱码 , 如端口描述、设备描述等:

如何处理Zabbix监控值中文字符乱码情况?3点思路分享

文章插图
对于这种情况 , 可以有以下几种处理方法 。
更换为英文
通常Zabbix是支持中文的 , 包括中文界面 , 使用UTF-8的字符监控内容也可以正常显示 。出现乱码一般是无法识别字符集导致的 。常见中文编码有GB2312、GBK、GB18030等 , 容易产生乱码 。英文26个字母在不同的字符集中保存一致 , 一般不会产生乱码 。对于可以修改的目标监控项的值 , 最简单的策略是换成英文或者拼音 。对于一些有终端界面的网络设备 , 即使一些描述可以在Web界面配置成中文 , 也不建议使用 。后续在终端操作 , 较大概率会出现乱码无法显示的情况 。
使用值映射
【如何处理Zabbix监控值中文字符乱码情况?3点思路分享】如果无法调整或必须使用中文 , 建议先进行观察 , 如果文字较少且固定 , 可采用映射替换的办法 。在Zabix中设立相应的中文值映射 , 主要步骤如下:
在“模版”或“主机”下 , 选择“值映射” , 创建对应项后 , 对话框保存后在“模版”或“主机”下保存 。

如何处理Zabbix监控值中文字符乱码情况?3点思路分享

文章插图
再次打开出现乱码的监控项 , 在“值映射”栏选择对应的映射
进行测试

如何处理Zabbix监控值中文字符乱码情况?3点思路分享

文章插图
使用值映射 , 需要预先配置 。优点是简单好用 。如果发生变化了修改或值超出映射范围 , 那只能进行调整的映射信息 。涉及的监控项目较多或者值变化较大 , 会产生大量工作 , 且容易出错 。
使用预处理
对于变化较大或其他复杂场景 , 可使用预处理方式 。原理是将获取到的字符串逐项使用脚本 , 按照规则替换成文本 。以某医院的无线网络监控为例 , 在AC中对120个AP采用中文命名 , 命名规则为”XXX单位+ 数字+无线AP” , 需要将AC及管理的AP接入基于zabbix搭建的全院监控平台 。

如何处理Zabbix监控值中文字符乱码情况?3点思路分享

文章插图
Zabbix使用SNMP方式监控AC , 得到管理的AP名数据为类似 “ED CC F3 …” 的字符串 , 十六进制每个字符都认识 , 但连在一起却无法识别 , 相当于乱码 。经检查发现编码中汉字使用Unicode , 两个字节可以表示为一个汉字 , 获取到的是两个字节用十六进制字符显示 。由于涉及AP较多 , 且名字中有变量 , 使用值映射配置就较麻烦 , 宜采用预处理方式 , 加载js代码 。本例中直接替换掉中文(固定名称作用不大 , 当然也可以直接添加) , 取出英文、数字后组合输出 , 参考js如下:
var out=\"\"value = https://www.fajihao.com/i/value.replace(//s+/g,/"\").replace(/[\\r\\n]/g,\"\")for (var i = 0; i < value.length / 2; i++) {if (value[2*i] < \'8\' ){var tmp = \"0x\" + value[2*i] + value[2*i + 1]out += String.fromCharCode(tmp);} else {// 忽略非ascii码字符i +=1}}return out
此外 , 可以使用js进行编码转化 , 由于常用中文字符较多 , 对应的js代码体积大 , 运行消耗资源较多 。对于监控 , 不建议在Zabbix的预处理中使用复杂的js脚本 , 可以使用第三方工具进行转码后再由Zabbix监控 。