一波三折!三千字记录 Ambari Metrics 监控无数据的详细排查过程

bd9c874fed336aafed50aa898e927932.gif

点击卡片“大数据实战演练”,选择“设为星标”或“置顶”

回复“资料”可领取独家整理的大数据学习资料!

回复“Ambari知识库”可领取独家整理的Ambari学习资料!

3d2c2f80a10669477bcb05dd22d8d546.jpeg

大家好,我是EDP团队成员,今天给大家分享下 Ambari Metrics 监控无数据的排查过程,最终监视数据已正常显示,希望我接下来的分享给大家带来一些帮助和启发🤔

一、前言

本文主要分享如何排查 ambari 监控无数据的相关问题,其他监控都可以参考,本次分享以 kafka 监控数据不显示为例,提供一种排查思路。

29cb061cf1ee2238722f861317060d07.png

二、排查思路

1、抓取前端请求看是否有数据,判断问题是前端还是在后端

浏览器 F12 看下请求的接口:

http://10.201.60.183:8080/api/v1/clusters/clusterTest/services/KAFKA/components/KAFKA_BROKER?fields=metrics/kafka/server/BrokerTopicMetrics/AllTopicsBytesInPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/server/BrokerTopicMetrics/AllTopicsBytesOutPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/server/BrokerTopicMetrics/AllTopicsMessagesInPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/controller/KafkaController/ActiveControllerCount._sum[1654673428,1654677028,15],metrics/kafka/controller/ControllerStats/LeaderElectionRateAndTimeMs/1MinuteRate[1654673428,1654677028,15],metrics/kafka/controller/ControllerStats/UncleanLeaderElectionsPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/server/ReplicaFetcherManager/Replica-MaxLag[1654673428,1654677028,15],metrics/kafka/server/ReplicaManager/PartitionCount._sum[1654673428,1654677028,15],metrics/kafka/server/ReplicaManager/UnderReplicatedPartitions[1654673428,1654677028,15],metrics/kafka/server/ReplicaManager/LeaderCount._sum[1654673428,1654677028,15]&format=null_padding&_=1654677025364

Response 没有返回监控数据:

{
  "href" : "http://10.201.60.183:8080/api/v1/clusters/clusterTest/services/KAFKA/components/KAFKA_BROKER?fields=metrics/kafka/server/BrokerTopicMetrics/AllTopicsBytesInPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/server/BrokerTopicMetrics/AllTopicsBytesOutPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/server/BrokerTopicMetrics/AllTopicsMessagesInPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/controller/KafkaController/ActiveControllerCount._sum[1654673428,1654677028,15],metrics/kafka/controller/ControllerStats/LeaderElectionRateAndTimeMs/1MinuteRate[1654673428,1654677028,15],metrics/kafka/controller/ControllerStats/UncleanLeaderElectionsPerSec/1MinuteRate[1654673428,1654677028,15],metrics/kafka/server/ReplicaFetcherManager/Replica-MaxLag[1654673428,1654677028,15],metrics/kafka/server/ReplicaManager/PartitionCount._sum[1654673428,1654677028,15],metrics/kafka/server/ReplicaManager/UnderReplicatedPartitions[1654673428,1654677028,15],metrics/kafka/server/ReplicaManager/LeaderCount._sum[1654673428,1654677028,15]&format=null_padding&_=1654677025364",
  "ServiceComponentInfo" : {
    "cluster_name" : "clusterTest",
    "component_name" : "KAFKA_BROKER",
    "service_name" : "KAFKA"
  }
}

总结:经过抓取后发现 ams 后端未返回监控数据。

2、查询底层存储是否有数据,判断是没有数据,还是 ams 自身因为不兼容过滤等逻辑处理的问题

前往 ambari metrics collector 所在的节点,执行以下命令(61181 端口由 hbase.zookeeper.property.clientPort 配置):

/usr/lib/ambari-metrics-collector/bin/sqlline.py localhost:61181:/ams-hbase-secure

执行上述命令后,进入到了 phoenix 交互模式,执行以下命令:

# 查看表
!table
# 查询表记录
select * from METRIC_RECORD where APP_ID = 'kafka_broker' limit 100;
2377a3cb93099a4a199308f5382a06f7.png 如上图所示,hbase 中确实没有监控数据,那么问题就出在数据源。
3、数据源分析

Kafka 的监控数据是 ams 自己提供的 kafka reporter 实现的。

1)这里首先看看 kafka 的 reporter 是否有数据, kafka reporter 作为 plugin 被 kafka 启动时加载
Arthas attach kafka 的线程

通过查看 sink.kafka.KafkaTimelineMetricsReporter 源码可知,数据是通过 report 方法上报的,因此查看下 report 方法的返回值,看看是否有数据。

watch org.apache.hadoop.metrics2.sink.kafka.KafkaTimelineMetricsReporter$TimelineScheduledReporter report '{params,returnObj,throwExp}'  -n 5  -x 4

可以看到没有数据

c4b2d0670e31c07d45c20d06fc11554f.png
2)kafka reporter 自身确实没有数据上报,这里需要确定数据传递的流程,然后判断是是哪个阶段出了问题
  • kafka 自身的 metrics 数据源BUG

  • ams kafka metrics BUG

这里需要知道 kafka 自身如何把数据传递给 reporter,看看 Kafka 自身的 CSV reporter 代码可以看到,数据是从

getMetricsRegistry.allMetrics().entrySet();
KafkaYammerMetrics.defaultRegistry().allMetrics().entrySet();

首先看下

vmtool -x 3 --action getInstances --className org.apache.hadoop.metrics2.sink.kafka.ScheduledReporter  --express 'instances[0].registry'
725a8c9a81d362a4e1a348b5eecd78c0.png Arthas 查看是否有数据

KafkaYammerMetrics.defaultRegistry().allMetrics().entrySet();

命令如下:

ognl -x 3 '@kafka.metrics.KafkaYammerMetrics@defaultRegistry()'
# 数据量太多,查看下总条数
ognl -x 3 '@kafka.metrics.KafkaYammerMetrics@defaultRegistry().allMetrics().size()'

可以看到有数据

64eddf48e90c3cb7b511d1feeef3d8cc.png 看下 kafka.metrics.KafkaYammerMetrics 监控数据容器是否有监控数据,如图是有的:
ognl -x 3 '@kafka.metrics.KafkaYammerMetrics@defaultRegistry().allMetrics()'
3fb228ccab4e23e19cb51f99bf4c7a82.png 好,问题出在 ams 自己实现的 kafka reporter 上,查看了代码,发现其使用的 registry 和 kafka 使用的不同,这里两个情况,分别是:
  • ams 使用的对的,只不过数据处理过程有问题不兼容

  • ams 使用的 kafka metrics 数据源不正确

使用 arthas 直接查看 ams kafka reporter 的 metrics 数据源:

ognl -x 3 '@com.yammer.metrics.Metrics@defaultRegistry().allMetrics()'
Metrics.defaultRegistry()

可以看到没有数据, 去 kafka 中搜索下 该调用,说明 ams 使用了过时的配置:

fa3b46ab1d65f7bd25f9dfecaeab638d.png OK,搜索下代码,发现 kafka 标记了这个方法 deprecated 了,无法获取数据了, 换成新的实现 KafkaYammerMetrics.defaultRegistry() ,然后编译后替换包,发现 panel 还是没有监控数据。

这里用 arthas 查看下 ams kafka reporter 中的数据容器是否有数据:

vmtool -x 3 --action getInstances --className org.apache.hadoop.metrics2.sink.kafka.ScheduledReporter  --express 'instances[0].registry'
88dd4596fad58440531f78436e05678b.png 好,说明我们之前的改动是正确的,那么再看看 ams kafka report 方法是否有正确上报 kafka 数据:
watch org.apache.hadoop.metrics2.sink.kafka.KafkaTimelineMetricsReporter$TimelineScheduledReporter report '{params,returnObj,throwExp}'  -n 5  -x 3
0f3f97161c02cae8fc054306c4a03d66.png 有!说明数据上报了ams,那么看下数据是否正确存入了 hbase

之前这个表没有,现在有了,如下图所示:

325e03d7c23673ae8a2e3fbba7eda14d.png 查看下监控数据,发现有很多 kafka 数据:
select * from METRIC_RECORD where APP_ID = 'kafka_broker' limit 100;
46239443e73764aaf29ab80e40eb7dab.png 但是,查不到页面上展示的那些数据,也就是说,此时 ambari 的 kafka 监视数据还是空的。
select * from METRIC_RECORD where APP_ID='kafka_broker' and  METRIC_NAME like 'jvm%'  limit 1000;
9373efaafb61103cda1d5576f5b88991.png 所以,之前的修复有效,但是还不够!!
3)继续排查

这里有可能 ams 处理数据的过程把数据整没了,也许是 filter 之类的机制,或者干脆是 BUG。

打开 ams 的 debug 日志, 再去看 ams 日志中是否数据没有存进去。

vi /var/log/ambari-metrics-collector/ambari-metrics-collector.log

日志中搜索 jvm.heap_usage 发现 Kafka push 过来的监控数据中确实没有该监控项:

7dada9602ddbda8c4875bedbbfebe0f0.png 直接搜到 Kafka broker 的 reporter 提交的监控数据,查看是否有 JVM 相关数据,如下图所示确实有 JVM 数据,只不过监控数据名字不同。 fc1930b2f613605f56b276d30abc4c27.png 这里到底是谁搞的鬼,是 kafka 更新后 还是 reporter 改动了 metrics 的名?

于是用 arthas 查看运行时的Kafka 中 metrics 的数据

0fb449028549c8e2d2cfc2dbfce8175c.png 根据 ams 的拼写规则,metrics 名字确实是 jvm.memory.heapusage

这里怀疑 ambari 版本太老,用了旧的名字,

然后查看 ambari metrics.json 和 widget.json 确实发现名字为 jvm.heap_usage。

所以破案了,ambari 中定义的 jvm 部分的 metrics 名字过时了,我又用这个文件中的 metrics 名字添加到了白名单中,所以导致 jvm 正确的数据被拉黑,没有存储进去。

在服务器上可以直接修改

/var/lib/ambari-server/resources/common-services/KAFKA/0.9.0/metrics.json

修改 metrics_whitelist、metrics.json 文件,并重启 ams panel-server 即可解决,但是由于 jvm 相关的 metrics 并没有默认丢进 widget.json,所以不用改 widget.json。

改动记录如下图所示:

d6c20796bca33ade8e0629fcad34ac51.png
5a9a8aaf7a3e87794c399f7e61f4d3b2.png
4)修复成功

修复后正常显示的 jvm heap 如图所示:

66f81144deb08e066d0d1826e204b0cd.png

三、总结

小结一下,改动如下:

1、换成了新的实现 KafkaYammerMetrics.defaultRegistry()

2、ambari 中定义的 jvm 部分的 metrics 名字过时了,修改 metrics_whitelist、metrics.json 文件。

排查过程中主要使用了 Arthas 工具,确实好用。

四、EDP 监控开发进展

我们这次给 Ambari 的监控系统进行了大刀阔斧的改造!终于把那个又老又难用的 Ambari Metrics 代替了,拥抱了 Prometheus 生态。

说真的,原来那套用 Phoenix + 单机 HBase 存数据的方案真是让人头大:

  • 运维起来特别折腾

  • 想跟 Prometheus 生态玩不到一块去

  • 查问题全靠蒙,加个监控指标都费劲

所以我们决定大刀阔斧地重构一把,现在是这么个情况:

  • 完美接入了 Prometheus 全家桶。

  • 想用啥时序数据库都行,随你挑!

  • 内置了一堆常用的监控大盘,拿来就能用

  • 想加新监控?随便找个 Prometheus 的 exporter,分分钟搞定!

最爽的是,我们不但把原来监控的功能都给保住了,还全面升级加强了一波。现在的监控更全面、更好用、想怎么扩展就怎么扩展。

总之就是:更强!更快!更好用!目前初见成效,附几张图给大家看看:

0145c824ef47f57811fd6ad089b97b19.png
4bcbb475c3c0916a7f6d089beb42304f.png
677f0e0d8696daa2002e379f4064691e.png 后续再详细给大家汇报开发进展,我们下期见~

ending

图片

图片

一个人可以走得很快,但一群人才能走得更远。我的Ambari课程累计学员已经有 400+。感谢信任的同时,如果你需要一个良好的Ambari学习与交流环境,就请加入我们吧。这是一个学习Ambari的付费私密圈子,里面的人都是Ambari的活跃二次开发者,报名后,你可以享有知识星球 + 学员微信群 + 课程资料(笔记、视频等)+ 导师学习陪伴答疑服务,认识更多大佬,和大家一起成长。也欢迎大家点击左下角阅读原文了解我,希望我能提供的服务可以帮助到你。

图片

最后,把我的座右铭送给大家:执行是消除焦虑的有效办法,明确并拆解自己的目标,一直行动,剩下的交给时间。共勉 💪。

“阅读原文”,查看最新内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

create17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值