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

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

查看原文,技术咨询支持,可以扫描微信公众号进行回复咨询
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宋小生的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值