/* * Copyright (c) 2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.client.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor; /** * class extends CountingConnectionPoolMonitor for monitoring client operations */ public class CustomConnectionPoolMonitor extends CountingConnectionPoolMonitor { private static final Logger _log = LoggerFactory.getLogger(CustomConnectionPoolMonitor.class); static final int BUSY_CONNECTION_THRESHOLD = 50; static final int SUCCESS_OP_COUNT_THRESHOLD = 5 * 1000; private long _monitorIntervalSeconds = 1000; // every min private AtomicLong prevOpFailureCount = new AtomicLong(); private long opFailureDiff = 0; private AtomicLong prevOpSuccessCount = new AtomicLong(); private long opSuccessDiff = 0; private ScheduledExecutorService _exe = Executors.newScheduledThreadPool(1); public CustomConnectionPoolMonitor(long monitorIntervalSeconds) { super(); _monitorIntervalSeconds = monitorIntervalSeconds; if (_monitorIntervalSeconds <= 0) { _log.info("Connection pool stats monitoring is disabled."); return; } // start after 1min, run every monitorIntervalSeconds _exe.scheduleWithFixedDelay(new Runnable() { private boolean needToDumpStats() { boolean ret = false; // if failures are >0 in the lastinterval opFailureDiff = getOperationFailureCount() - prevOpFailureCount.get(); if (opFailureDiff > 0) { ret = true; } // if success count > SUCCESS_OP_COUNT_THRESHOLD opSuccessDiff = getOperationSuccessCount() - prevOpSuccessCount.get(); if (opSuccessDiff > SUCCESS_OP_COUNT_THRESHOLD) { ret = true; } // if busy connection count > BUSY_CONNECTION_THRESHOLD if (getNumBusyConnections() > BUSY_CONNECTION_THRESHOLD) { ret = true; } return ret; } @Override public void run() { if (needToDumpStats()) { _log.info("In the last {}secs: Failed ops: {}, Successful ops {}, Busy connections {}", new String[] { "" + _monitorIntervalSeconds, "" + opFailureDiff, "" + opSuccessDiff, "" + getNumBusyConnections() }); _log.info(dumpStats()); } prevOpFailureCount.set(getOperationFailureCount()); prevOpSuccessCount.set(getOperationSuccessCount()); } }, 60, _monitorIntervalSeconds, TimeUnit.SECONDS); } private String dumpStats() { return super.toString(); } }