目录

  • 10-可观测性信息的开启
    • 10.1 Log4j JMX mbean
    • 10.2 Metrics开启指标数据采集

10-可观测性信息的开启

10.1 Log4j JMX mbean

针对Java的JMX MBean可以参考地址:JMX官网链接

先来看第一步注册log4j JMX mbean 设置环境变量zookeeper.jmx.log4j.disable
为true可以禁用注册.

我们往往需要运行时调整一下日志记录水平参数,又不想重启进程然后将配置全部重新Load一次, JMX就排上用场了。Log4j是内置JMX的支持,对于这个问题是有很好的解决的。只需要把相应的Log4j对象包装到MBean中去并注册到MBean服务器中去便可通过相应MBean管理环境来进行日志记录水平运行时调整。关于JMX的介绍也可以参考这个文章JMX超详细解读

这里主要通过添加org.apache.log4j.jmx.HierarchyDynamicMBean来实现在运行时对log4j的控制

在runFromConfig配置加载的第一行有这么一个代码:

ManagedUtil.registerLog4jMBeans();

如下所示:

public static void registerLog4jMBeans() throws JMException {if (isLog4jJmxEnabled()) {LOG.debug("registerLog4jMBeans()");MBeanServer mbs = MBeanRegistry.getInstance().getPlatformMBeanServer();try {// Create and Register the top level Log4J MBean// org.apache.log4j.jmx.HierarchyDynamicMBean hdm = new org.apache.log4j.jmx.HierarchyDynamicMBean();Object hdm = Class.forName("org.apache.log4j.jmx.HierarchyDynamicMBean").getConstructor().newInstance();String mbean = System.getProperty("zookeeper.jmx.log4j.mbean", "log4j:hierarchy=default");ObjectName mbo = new ObjectName(mbean);mbs.registerMBean(hdm, mbo);// Add the root logger to the Hierarchy MBean// org.apache.log4j.Logger rootLogger =// org.apache.log4j.Logger.getRootLogger();Object rootLogger = Class.forName("org.apache.log4j.Logger").getMethod("getRootLogger", (Class<?>[]) null).invoke(null, (Object[]) null);// hdm.addLoggerMBean(rootLogger.getName());Object rootLoggerName = rootLogger.getClass().getMethod("getName", (Class<?>[]) null).invoke(rootLogger, (Object[]) null);hdm.getClass().getMethod("addLoggerMBean", String.class).invoke(hdm, rootLoggerName);// Get each logger from the Log4J Repository and add it to the// Hierarchy MBean created above.// org.apache.log4j.spi.LoggerRepository r =// org.apache.log4j.LogManager.getLoggerRepository();Object r = Class.forName("org.apache.log4j.LogManager").getMethod("getLoggerRepository", (Class<?>[]) null).invoke(null, (Object[]) null);// Enumeration enumer = r.getCurrentLoggers();Enumeration enumer = (Enumeration) r.getClass().getMethod("getCurrentLoggers", (Class<?>[]) null).invoke(r, (Object[]) null);while (enumer.hasMoreElements()) {Object logger = enumer.nextElement();// hdm.addLoggerMBean(logger.getName());Object loggerName = logger.getClass().getMethod("getName", (Class<?>[]) null).invoke(logger, (Object[]) null);hdm.getClass().getMethod("addLoggerMBean", String.class).invoke(hdm, loggerName);}} catch (Exception e) {LOG.error("Problems while registering log4j 1.2 jmx beans!", e);throw new JMException(e.toString());}}}

10.2 Metrics开启指标数据采集

指标数据可以用来监控,优化等功能使用比如我们系统提供的PrometheusMetricsProvider
可以有效的将监控数据转化为普罗米修斯监控系统需要的数据指标。
指标数据收集开启主要代码如下:

 final MetricsProvider metricsProvider;try {metricsProvider = MetricsProviderBootstrap.startMetricsProvider(config.getMetricsProviderClassName(),config.getMetricsProviderConfiguration());} catch (MetricsProviderLifeCycleException error) {throw new IOException("Cannot boot MetricsProvider " + config.getMetricsProviderClassName(), error);}try {ServerMetrics.metricsProviderInitialized(metricsProvider);

通过配置中的指标提供类型和配置来初始化指标提供器:MetricsProvider类型,
MetricsProvider是一个收集度量指标并向外部服务发布当前值的系统,provider既可以在ZooKeeper服务器上使用,也可以在ZooKeeper客户端使用
目前系统主要提供了如下指标提供器类型:

  • DefaultMetricsProvider:
    系统默认的配置,主要的数据指标可以通过开启Zookeeper四字命令然后输入四字命令获取数据
    例如mntr四字命令获取监控数据
echo "mntr" |nc 127.0.0.1 2181

结果如下:

➜  github echo "mntr" |nc 127.0.0.1 2181
zk_version  3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
zk_avg_latency  0
zk_max_latency  696
zk_min_latency  0
zk_packets_received 7178
zk_packets_sent 7181
zk_num_alive_connections    1
zk_outstanding_requests 0
zk_server_state standalone
zk_znode_count  36
zk_watch_count  0
zk_ephemerals_count 0
zk_approximate_data_size    5955
zk_open_file_descriptor_count   34
zk_max_file_descriptor_count    10240
zk_fsync_threshold_exceed_count 0
  • NullMetricsProvider 什么也不做

  • PrometheusMetricsProvider
    将数据指标输出给外部服务普罗米修斯监控,在zoo.cfg配置信息方式如下:

    配置普罗米修斯数据提供器

metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider提供服务的端口
metricsProvider.httpPort=7000是否输出jvm信息
metricsProvider.exportJvmInfo=true

查看原文,技术咨询支持,可以扫描微信公众号进行回复咨询

[Zookeeper-3.6.2源码解析系列]-10-可观测性信息的开启相关推荐

  1. Redux 源码解析系列(一) -- Redux的实现思想

    文章来源: IMweb前端社区 黄qiong(imweb.io) IMweb团队正在招聘啦,简历发至jayccchen@tencent.com Redux 其实是用来帮我们管理状态的一个框架,它暴露给 ...

  2. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析

    作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...

  3. Tomcat源码解析系列二:Tomcat总体架构

    Tomcat即是一个HTTP服务器,也是一个servlet容器,主要目的就是包装servlet,并对请求响应相应的servlet,纯servlet的web应用似乎很好理解Tomcat是如何装载serv ...

  4. prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)

    本文为 TiKV 源码解析系列的第四篇,接上篇继续为大家介绍 rust-prometheus.上篇主要介绍了基础知识以及最基本的几个指标的内部工作机制,本篇会进一步介绍更多高级功能的实现原理. 与上篇 ...

  5. TiKV 源码解析系列 - Raft 的优化

    这篇文章转载TiDB大牛 唐刘 的博客:https://mp.weixin.qq.com/s?__biz=MzI3NDIxNTQyOQ==&mid=2247484544&idx=1&a ...

  6. Netty 源码解析系列-服务端启动流程解析

    netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...

  7. Mybatis3 源码解析系列

    简介 Mybatis作为一个优秀的Java持久化框架,在我们的日常工作中相信都会用到,本次源码解析系列,就开始探索下Mybatis 总结 在MyBatis的学习中,首先通读了<MyBatis3源 ...

  8. openGauss数据库源码解析系列文章——openGauss开发快速入门(二)

    在上一篇openGauss数据库源码解析系列文章--openGauss开发快速入门(上)中,我们介绍了openGauss的安装部署方法,本篇将具体介绍openGauss基本使用. 二. openGau ...

  9. openGauss数据库源码解析系列文章--openGauss简介(一)

    openGauss数据库是华为深度融合在数据库领域多年经验,结合企业级场景要求推出的新一代企业级开源数据库.此前,Gauss松鼠会已经发布了openGauss数据库核心技术系列文章,介绍了openGa ...

  10. SkeyePlayer RTSP/RTMP流媒体超低延迟播放器源码解析系列之H264一帧多NAL写MP4录像花屏问题解决方案

    接上一篇[SkeyePlayer源码解析系列之录像写MP4]之续篇,我们来讲解一下关于H264编码格式中的一帧多nal(Network Abstract Layer, 即网络抽象层),关于H264和N ...

最新文章

  1. 重庆理工大学两江校区计算机学院,重庆理工大学两江校区国际项目9月开学
  2. android实战技巧,实战技巧:Android异步指南
  3. 自动化缺陷检测系统---项目总览
  4. pdf批量转换为图片
  5. 工业无线开关量信号传输器
  6. EasyBoot教程一:制作WIN7原版多重启动盘方法
  7. RabbitMQ-operation queue.declare caused a channel exception precondition_failed错误
  8. cad图转成shp文件并把其平面坐标投影配准成大地坐标(配准针对没有底图的情况)
  9. 初级C语言之【操作符】
  10. 你可以把Linux内核当成一家软件外包公司的老板
  11. springboot整合websocket异常集合
  12. 戴尔台式机修复计算机,dell电脑win10自动修复你的电脑未正确启动怎么修复
  13. AD生成BOM表_材料清单 (Bill of Material)
  14. C51编程语言bit和sbit,你知道bit和sbit有什么区别吗
  15. 作为PM,要知道的四类产品文档
  16. 5G能否成化合物半导体产业突破口
  17. Hbuild-X使用生成签名证书失败,怎么解决 +云打包
  18. 【豆舞咖啡】量变到质变
  19. 详解Oracle统计信息
  20. [单调栈]「Poetize4」玉蟾宫

热门文章

  1. 开心网上的暴强真心话和暴强回复
  2. python爬虫实战之爬取中国农药网
  3. java调用Filemaker data api
  4. u盘固定盘符_高手固定U盘盘符有绝招
  5. 基于javaweb敬老院/养老院管理系统的设计和实现
  6. nginx重启配置命令
  7. 华为鸿蒙系统开发者大会视频,鸿蒙OS、EMUI 10正式发布!HDC华为开发者大会2019直播(视频)...
  8. 基于PaddlePaddle的视频联合时空建模方法
  9. 古诗文开放数据库_4个开放资源来发现古英语文学
  10. JS获取当前日期,获取上个月的日期,一个月有多少天