78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi/*
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * CDDL HEADER START
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi *
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * The contents of this file are subject to the terms of the
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * Common Development and Distribution License, Version 1.0 only
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * (the "License"). You may not use this file except in compliance
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * with the License.
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi *
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * or http://forgerock.org/license/CDDLv1.0.html.
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * See the License for the specific language governing permissions
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * and limitations under the License.
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi *
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * When distributing Covered Code, include this CDDL HEADER in each
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * file and include the License file at legal-notices/CDDLv1_0.txt.
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * If applicable, add the following below this CDDL HEADER, with the
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * fields enclosed by brackets "[]" replaced with your own identifying
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * information:
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * Portions Copyright [yyyy] [name of copyright owner]
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi *
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * CDDL HEADER END
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi *
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi *
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi * Copyright 2015 ForgeRock AS
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi */
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesipackage org.opends.server.backends.pdb;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignacimport static org.opends.server.util.StaticUtils.*;
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport java.lang.reflect.Method;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport java.rmi.RemoteException;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport java.util.ArrayList;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport java.util.Collections;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport java.util.List;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport org.opends.server.admin.std.server.MonitorProviderCfg;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport org.opends.server.api.MonitorProvider;
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignacimport org.opends.server.types.Attribute;
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignacimport org.opends.server.types.Attributes;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignacimport com.persistit.Management.BufferPoolInfo;
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignacimport com.persistit.Management.TreeInfo;
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignacimport com.persistit.Management.VolumeInfo;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport com.persistit.Management.WrappedRemoteException;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiimport com.persistit.Persistit;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac/** Monitoring class for PDB, populating cn=monitor statistics using reflection on objects methods. */
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesiclass PDBMonitor extends MonitorProvider<MonitorProviderCfg>
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi{
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi private final String name;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi private final Persistit db;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi PDBMonitor(String name, Persistit db)
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi this.name = name;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi this.db = db;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi @Override
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi public String getMonitorInstanceName()
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi return name;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi @Override
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi public List<Attribute> getMonitorData()
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi try
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi List<Attribute> monitorAttrs = new ArrayList<>();
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi monitorAttrs.add(Attributes.create("PDBVersion", db.getManagement().getVersion()));
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi for(BufferPoolInfo bufferInfo : db.getManagement().getBufferPoolInfoArray())
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi addAttributesForStatsObject(monitorAttrs, "PDBBuffer", bufferInfo);
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi addAttributesForStatsObject(monitorAttrs, "PDBJournal", db.getManagement().getJournalInfo());
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi addAttributesForStatsObject(monitorAttrs, "PDBTransaction", db.getManagement().getTransactionInfo());
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi for (VolumeInfo vol : db.getManagement().getVolumeInfoArray())
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi addAttributesForStatsObject(monitorAttrs, "PDBVolume", vol);
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi for (TreeInfo tree : db.getManagement().getTreeInfoArray(vol.getName()))
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi // For the time being, depth is not reported.
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac monitorAttrs.add(Attributes.create("PDBVolumeTree", vol.getName() + tree.getName()
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac + ", traverse=" + tree.getTraverseCounter()
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac + ", fetch=" + tree.getFetchCounter()
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac + ", store=" + tree.getStoreCounter()
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac + ", remove=" + tree.getRemoveCounter()));
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi return monitorAttrs;
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac catch (RemoteException e)
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
caa38c1354824a2da50a8fbc8fc85ba1b0dfc7feJean-Noël Rouvignac return Collections.singletonList(Attributes.create("PDBInfo", stackTraceToSingleLineString(e)));
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi private void addAttributesForStatsObject(List<Attribute> monitorAttrs, String attrPrefix, Object stats)
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi throws RemoteException
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi for (Method method : stats.getClass().getMethods())
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi if (method.getName().startsWith("get"))
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi Class<?> returnType = method.getReturnType();
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi if (returnType.equals(int.class) || returnType.equals(long.class) || returnType.equals(String.class))
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi addStatAttribute(monitorAttrs, attrPrefix, stats, method, 3);
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi else if (method.getName().startsWith("is") && method.getReturnType().equals(boolean.class))
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi addStatAttribute(monitorAttrs, attrPrefix, stats, method, 2);
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi private void addStatAttribute(List<Attribute> monitorAttrs, String attrPrefix, Object stats,
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi Method method, int skipNameLen) throws WrappedRemoteException
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi try
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi String attrName = attrPrefix + method.getName().substring(skipNameLen);
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi monitorAttrs.add(Attributes.create(attrName, String.valueOf(method.invoke(stats))));
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi catch (Exception e)
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi {
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi throw new WrappedRemoteException(e);
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi }
78043b33dabe9bf3d985bf964ca2eed2ae9985fcFabio Pistolesi}