栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 云计算 > 云平台

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

云平台 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

9-可观测性信息的开启 9.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());
            }
        }
    }
9.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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/895971.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号