/* * Copyright 2017 NAVER Corp. * * Licensed 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 com.navercorp.pinpoint.plugin.hikaricp; import com.navercorp.pinpoint.bootstrap.logging.PLogger; import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory; import com.navercorp.pinpoint.bootstrap.plugin.monitor.DataSourceMonitor; import com.navercorp.pinpoint.common.trace.ServiceType; import java.lang.reflect.Method; /** * @author Taejin Koo */ public class HikariCpDataSourceMonitor implements DataSourceMonitor { private final PLogger logger = PLoggerFactory.getLogger(getClass()); private final String jdbcUrl; private final Object object; private final Method getActiveConnectionsMethod; private final Method getTotalConnectionsMethod; public HikariCpDataSourceMonitor(Object object, String jdbcUrl) { this.object = object; this.jdbcUrl = jdbcUrl; try { this.getActiveConnectionsMethod = getActiveConnectionsMethod(object); this.getTotalConnectionsMethod = getTotalConnectionsMethod(object); } catch (Exception e) { throw new IllegalArgumentException(e.getMessage(), e); } } private volatile boolean closed = false; private Method getActiveConnectionsMethod(Object object) throws NoSuchMethodException { Method getActiveConnectionsMethod = object.getClass().getMethod("getActiveConnections"); if (getActiveConnectionsMethod == null) { throw new IllegalArgumentException("object must has getActiveConnections method"); } Class<?> returnType = getActiveConnectionsMethod.getReturnType(); if (int.class != returnType) { throw new IllegalArgumentException("invalid return type. expected:int, actual:" + returnType); } return getActiveConnectionsMethod; } private Method getTotalConnectionsMethod(Object object) throws NoSuchMethodException { Method getTotalConnections = object.getClass().getMethod("getTotalConnections"); if (getTotalConnections == null) { throw new IllegalArgumentException("object must has getTotalConnections method"); } Class<?> returnType = getTotalConnections.getReturnType(); if (int.class != returnType) { throw new IllegalArgumentException("invalid return type. expected:int, actual:" + returnType); } return getTotalConnections; } @Override public ServiceType getServiceType() { return HikariCpConstants.SERVICE_TYPE; } @Override public String getUrl() { return jdbcUrl; } @Override public int getActiveConnectionSize() { try { Object result = getActiveConnectionsMethod.invoke(object); return (Integer) result; } catch (Exception e) { logger.info("failed while executing getActiveConnectionSize()"); } return -1; } @Override public int getMaxConnectionSize() { try { Object result = getTotalConnectionsMethod.invoke(object); return (Integer) result; } catch (Exception e) { logger.info("failed while executing getActiveConnectionSize()"); } return -1; } @Override public boolean isDisabled() { return closed; } public void close() { closed = true; } }