0
点赞
收藏
分享

微信扫一扫

[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



举报

相关推荐

0 条评论