From 52c900399c6e5c8e10cfdbdf455013fcce63d2d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thierry=20Yg=C3=A9?= Date: Sun, 8 Nov 2015 09:50:34 +0100 Subject: [PATCH] @releng adding new mbean to track all IndexStats new property (startLastSuccessful) --- .../jackrabbit/oak/api/jmx/AllIndexStatsMBean.java | 29 +++++++++++ .../plugins/index/AllIndexStatsMBeanService.java | 57 ++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/AllIndexStatsMBean.java create mode 100644 oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AllIndexStatsMBeanService.java diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/AllIndexStatsMBean.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/AllIndexStatsMBean.java new file mode 100644 index 0000000..667de17 --- /dev/null +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/AllIndexStatsMBean.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jackrabbit.oak.api.jmx; + +public interface AllIndexStatsMBean { + + String TYPE = "AllIndexStats"; + + /** + * @return the oldest start time of the last successful indexed operation from all IndexStatsMBean + */ + String getOldestStartLastSuccessIndexedTime(); + +} diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AllIndexStatsMBeanService.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AllIndexStatsMBeanService.java new file mode 100644 index 0000000..ba623c4 --- /dev/null +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/AllIndexStatsMBeanService.java @@ -0,0 +1,57 @@ +package org.apache.jackrabbit.oak.plugins.index; + +import org.apache.jackrabbit.oak.api.jmx.AllIndexStatsMBean; +import org.apache.jackrabbit.oak.commons.jmx.AnnotatedStandardMBean; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.management.*; +import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class AllIndexStatsMBeanService extends AnnotatedStandardMBean implements AllIndexStatsMBean { + + private static final Logger log = LoggerFactory.getLogger(AllIndexStatsMBeanService.class); + + public AllIndexStatsMBeanService() { + super(AllIndexStatsMBean.class); + } + + public String getName() { + return "All Indexes Statistics"; + } + + @Override + public String getOldestStartLastSuccessIndexedTime() { + String currentLast = ""; + try { + final MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer(); + String queryName = "org.apache.jackrabbit.oak:*,type=\"IndexStats\""; + Set objectNames = platformMBeanServer.queryNames(new ObjectName(queryName), null); + ArrayList mbeanDates = new ArrayList(); + for (ObjectName indexStatsMBeanName: objectNames) { + mbeanDates.add((String) platformMBeanServer.getAttribute(indexStatsMBeanName, "StartLastSuccessIndexedTime")); + } + currentLast = giveOldestDate(mbeanDates); + } catch (MalformedObjectNameException e) { + log.error(e.getMessage(), e); + } catch (AttributeNotFoundException e) { + log.error(e.getMessage(), e); + } catch (MBeanException e) { + log.error(e.getMessage(), e); + } catch (ReflectionException e) { + log.error(e.getMessage(), e); + } catch (InstanceNotFoundException e) { + log.error(e.getMessage(), e); + } + return currentLast; + } + + private String giveOldestDate(List allDates) { + Collections.sort(allDates); + return allDates.iterator().next(); + } +}