目录
- 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