点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
Zabbix是一种企业级的开源网络监控解决方案。它是一个全功能的、开源的解决方案,可以监控系统中大部分数据。
监听kafka端口,当kafka中吐出消息是,我们利用自发现规则创建监控项,并向监控项推送数据。由于kafka消息并不是系统中可以随时采集到的参数,这种情况通过zabbix主动采集数据的方式已经行不通,需要利用Zabbix Trapper方式被动的收集数据。
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>io.github.hengyunabc</groupId>
<artifactId>zabbix-sender</artifactId>
<version>0.0.5</version>
</dependency>
kafka:
consumer:
enable-auto-commit: true
group-id: ${spring.application.name}
#消费模式
#latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
#earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
auto-offset-reset: earliest
bootstrap-servers: 127.0.xx.xx:xxxx,xx.xx.xx.xx:xxxx #kafka地址和端口
max-poll-records: 20 # 一次 poll 最多返回的记录数
listener:
type: batch # 开启批量消费
#消费的topic
kafka:
zabbix:
topic: xx-topic-xx
# zabbix信息
zabbix:
hostname: xx.xx.xx.xx
port: xxxx
# 监控项绑定的主机
binding:
hostname: xx.xx.xx.xx
@Component
public class ZabbixConsumer{
@Value("${zabbix.hostname}")
private String hostName;
@Value("${zabbix.port}")
private int port;
@Value("${binding.hostname}")
private String bindingHostName;
}
懒汉单例 在被外部类调用时创建实例,特点是延迟加载,即在需要的时候才创建对象。如果在创建实例对象时不加上synchronized关键字,则会导致对对象的访问不是线程安全的。但是,如果加上synchronized关键字,虽然可以保证线程安全,但是效率会降低。 饿汉单例 在类被加载时就会实例化一个对象,特点是在类加载的时候就完成实例化,避免了线程同步问题。但是如果从未使用过这个实例,则会造成内存的浪费。
private ZabbixSender sender = null;
public ZabbixSender getZabbixSender() {
if(sender == null) {
sender = new ZabbixSender(hostName, port);
}
return sender;
}
public static final ThreadPoolExecutor EXECUTOR_SERVICE =
new ThreadPoolExecutor(10, 500, 5, TimeUnit.SECONDS,new ArrayBlockingQueue<>(500));
@KafkaListener(topics = "#{'${kafka.zabbix.topic}'.split(',')}")
public void receive(List<String> list) {
try {
EXECUTOR_SERVICE.execute(new ZabbixHBService(list,getZabbixSender(),bindingHostName));
} catch (Exception e) {
log.error("执行ZabbixHBService异常", e);
}
}
colock:当前时间的时间戳,Java中常用System.currentTimeMillis()。 bindingHostName:自发现和监控项推送到的主机,如 linux_127.0.0.1。 selfDiscoveryKey:自发现键值。 zabbixKey:监控项键值。 JSON.toJSONString(itemMap):要推送的数据,推送时转换为json格式,方便阅读。
//监控项自发现
DataObject itemObject = new DataObject(clock, bindingHostName, selfDiscoveryKey, JSON.toJSONString(dataMap));
//监控项数据
DataObject dataObject = new DataObject(clock, bindingHostName, zabbixKey, JSON.toJSONString(itemMap));
/* 自发现监控项 批量处理推送zabbix */
if (itemObjectList.size() > 0) {
try {
log.info("自发现监控项 itemObjectList:{}", JSON.toJSONString(itemObjectList));
SenderResult result = zabbixSender.send(itemObjectList);
log.info("zabbixSender返回结果 result:{}", JSONObject.toJSONString(result));
} catch (IOException e) {
log.error("zabbixSender发送异常", e);
}
}
if (dataObjectList.size() > 0) {
try {
log.info("监控项数据 dataObjectList:{}", JSON.toJSONString(dataObjectList));
SenderResult result = zabbixSender.send(dataObjectList);
log.info("zabbixSender返回结果 result:{}", JSONObject.toJSONString(result));
} catch (IOException e) {
log.error("zabbixSender发送异常", e);
}
}




本文作者:刘怡畅(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




