diff --git a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/checker/DataSourceConnectionUsageRateChecker.java b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/checker/DataSourceConnectionUsageRateChecker.java index aaf33ef01229..66f24a57ed41 100644 --- a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/checker/DataSourceConnectionUsageRateChecker.java +++ b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/checker/DataSourceConnectionUsageRateChecker.java @@ -30,6 +30,9 @@ */ public class DataSourceConnectionUsageRateChecker extends DataSourceAlarmListValueAgentChecker { + private static String SMS_MESSAGE_FORMAT = "[PINPOINT Alarm - %s] DataSource %s connection pool usage %s%s (Threshold : %s%s, Raw : %s/%s)"; + private static String EMAIL_MESSAGE_FORMAT = " Value of agent(%s) has %s%s(DataSource %s connection pool usage) during the past 5 mins.(Threshold : %s%s, Raw : %s/%s)"; + public DataSourceConnectionUsageRateChecker(DataSourceDataCollector dataSourceDataCollector, Rule rule) { super(rule, "%", dataSourceDataCollector); } @@ -61,10 +64,12 @@ protected Map> getAgentValues() { public List getSmsMessage() { List messages = new LinkedList<>(); + for (Map.Entry> detected : detectedAgents.entrySet()) { - for (DataSourceAlarmVO dataSourceAlarmVO : detected.getValue()) { - if (decideResult0(dataSourceAlarmVO)) { - messages.add(String.format("[PINPOINT Alarm - %s] DataSource %s connection pool usage %s%s (Threshold : %s%s)", detected.getKey(), dataSourceAlarmVO.getDatabaseName(), dataSourceAlarmVO.getConnectionUsedRate(), unit, rule.getThreshold(), unit)); + for (DataSourceAlarmVO eachVo : detected.getValue()) { + if (decideResult0(eachVo)) { + String message = String.format(SMS_MESSAGE_FORMAT, detected.getKey(), eachVo.getDatabaseName(), eachVo.getConnectionUsedRate(), unit, rule.getThreshold(), unit, eachVo.getActiveConnectionAvg(), eachVo.getMaxConnectionAvg()); + messages.add(message); } } } @@ -74,16 +79,17 @@ public List getSmsMessage() { @Override public String getEmailMessage() { - StringBuilder message = new StringBuilder(); + StringBuilder contents = new StringBuilder(); for (Map.Entry> detected : detectedAgents.entrySet()) { - for (DataSourceAlarmVO dataSourceAlarmVO : detected.getValue()) { - if (decideResult0(dataSourceAlarmVO)) { - message.append(String.format(" Value of agent(%s) has %s%s(DataSource %s connection pool usage) during the past 5 mins.(Threshold : %s%s)", detected.getKey(), dataSourceAlarmVO.getConnectionUsedRate(), unit, dataSourceAlarmVO.getDatabaseName(), rule.getThreshold(), unit)); + for (DataSourceAlarmVO eachVo : detected.getValue()) { + if (decideResult0(eachVo)) { + String message = String.format(EMAIL_MESSAGE_FORMAT, detected.getKey(), eachVo.getConnectionUsedRate(), unit, eachVo.getDatabaseName(), rule.getThreshold(), unit, eachVo.getActiveConnectionAvg(), eachVo.getMaxConnectionAvg()); + contents.append(message); } } } - return message.toString(); + return contents.toString(); } } diff --git a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/collector/DataSourceDataCollector.java b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/collector/DataSourceDataCollector.java index bb977ce64f25..84e6aa4e15a9 100644 --- a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/collector/DataSourceDataCollector.java +++ b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/collector/DataSourceDataCollector.java @@ -16,22 +16,24 @@ package com.navercorp.pinpoint.batch.alarm.collector; +import com.navercorp.pinpoint.batch.alarm.DataCollectorFactory; +import com.navercorp.pinpoint.batch.alarm.vo.DataSourceAlarmVO; +import com.navercorp.pinpoint.batch.util.ListUtils; import com.navercorp.pinpoint.common.server.bo.stat.DataSourceBo; import com.navercorp.pinpoint.common.server.bo.stat.DataSourceListBo; import com.navercorp.pinpoint.common.util.CollectionUtils; -import com.navercorp.pinpoint.batch.util.ListUtils; -import com.navercorp.pinpoint.batch.alarm.DataCollectorFactory; -import com.navercorp.pinpoint.batch.alarm.vo.DataSourceAlarmVO; import com.navercorp.pinpoint.web.dao.ApplicationIndexDao; import com.navercorp.pinpoint.web.dao.stat.AgentStatDao; import com.navercorp.pinpoint.web.vo.Application; import com.navercorp.pinpoint.web.vo.Range; + import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; /** * @author Taejin Koo @@ -75,11 +77,14 @@ public void collect() { for (Map.Entry> entry : partitions.entrySet()) { List dataSourceBoList = entry.getValue(); + if (CollectionUtils.hasLength(dataSourceBoList)) { - long usedPercent = getPercent(dataSourceBoList); + double activeConnectionAvg = dataSourceBoList.stream().mapToInt(b -> b.getActiveConnectionSize()).average().getAsDouble(); + double maxConnectionAvg = dataSourceBoList.stream().mapToInt(b -> b.getMaxConnectionSize()).average().getAsDouble(); DataSourceBo dataSourceBo = ListUtils.getFirst(dataSourceBoList); - DataSourceAlarmVO dataSourceAlarmVO = new DataSourceAlarmVO(dataSourceBo.getId(), dataSourceBo.getDatabaseName(), usedPercent); + DataSourceAlarmVO dataSourceAlarmVO = new DataSourceAlarmVO(dataSourceBo.getId(), dataSourceBo.getDatabaseName(), + new Double(Math.floor(activeConnectionAvg)).intValue(), new Double(Math.floor(maxConnectionAvg)).intValue()); agentDataSourceConnectionUsageRateMap.add(agentId, dataSourceAlarmVO); } @@ -112,21 +117,6 @@ private MultiValueMap partitionDataSourceId(List dataSourceBos) { - long totalMaxConnectionSize = 0; - long totalActiveConnectionSize = 0; - - for (DataSourceBo dataSourceBo : dataSourceBos) { - int maxConnectionSize = dataSourceBo.getMaxConnectionSize(); - totalMaxConnectionSize += maxConnectionSize; - - int activeConnectionSize = dataSourceBo.getActiveConnectionSize(); - totalActiveConnectionSize += activeConnectionSize; - } - - return calculatePercent(totalActiveConnectionSize, totalMaxConnectionSize); - } - @Override public DataCollectorFactory.DataCollectorCategory getDataCollectorCategory() { return super.getDataCollectorCategory(); diff --git a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVO.java b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVO.java index 0c334d0c477f..6fb5413bcf01 100644 --- a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVO.java +++ b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVO.java @@ -27,12 +27,15 @@ public class DataSourceAlarmVO { private final int id; private final String databaseName; - private final long connectionUsedRate; + private final int activeConnectionAvg; + private final int maxConnectionAvg; - public DataSourceAlarmVO(int id, String databaseName, long connectionUsedRate) { + public DataSourceAlarmVO(int id, String databaseName, int activeConnectionAvg, int maxConnectionAvg) { this.id = id; this.databaseName = databaseName; - this.connectionUsedRate = connectionUsedRate; + + this.activeConnectionAvg = activeConnectionAvg; + this.maxConnectionAvg = maxConnectionAvg; } public int getId() { @@ -43,8 +46,20 @@ public String getDatabaseName() { return databaseName; } + public int getActiveConnectionAvg() { + return activeConnectionAvg; + } + + public int getMaxConnectionAvg() { + return maxConnectionAvg; + } + public long getConnectionUsedRate() { - return connectionUsedRate; + if (activeConnectionAvg == 0 || maxConnectionAvg == 0) { + return 0; + } else { + return (activeConnectionAvg * 100L) / maxConnectionAvg; + } } @Override @@ -55,16 +70,17 @@ public boolean equals(Object o) { DataSourceAlarmVO that = (DataSourceAlarmVO) o; if (id != that.id) return false; - if (connectionUsedRate != that.connectionUsedRate) return false; + if (activeConnectionAvg != that.activeConnectionAvg) return false; + if (maxConnectionAvg != that.maxConnectionAvg) return false; return databaseName != null ? databaseName.equals(that.databaseName) : that.databaseName == null; - } @Override public int hashCode() { int result = id; result = 31 * result + (databaseName != null ? databaseName.hashCode() : 0); - result = 31 * result + (int) (connectionUsedRate ^ (connectionUsedRate >>> 32)); + result = 31 * result + activeConnectionAvg; + result = 31 * result + maxConnectionAvg; return result; } @@ -73,9 +89,9 @@ public String toString() { final StringBuilder sb = new StringBuilder("DataSourceAlarmVO{"); sb.append("id=").append(id); sb.append(", databaseName='").append(databaseName).append('\''); - sb.append(", connectionUsedRate=").append(connectionUsedRate); + sb.append(", activeConnectionAvg=").append(activeConnectionAvg); + sb.append(", maxConnectionAvg=").append(maxConnectionAvg); sb.append('}'); return sb.toString(); } - } diff --git a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVOSerializer.java b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVOSerializer.java index f3b38338d4a4..c2fcc1d0b5d9 100644 --- a/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVOSerializer.java +++ b/batch/src/main/java/com/navercorp/pinpoint/batch/alarm/vo/DataSourceAlarmVOSerializer.java @@ -32,6 +32,10 @@ public void serialize(DataSourceAlarmVO dataSourceAlarmVO, JsonGenerator jgen, S jgen.writeStartObject(); jgen.writeStringField("databaseName", dataSourceAlarmVO.getDatabaseName()); + + jgen.writeNumberField("activeConnectionAvg", dataSourceAlarmVO.getActiveConnectionAvg()); + jgen.writeNumberField("maxConnectionAvg", dataSourceAlarmVO.getMaxConnectionAvg()); + jgen.writeNumberField("connectionValue", dataSourceAlarmVO.getConnectionUsedRate()); jgen.writeEndObject();