/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* 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.jumpmind.symmetric.service.impl;
import java.sql.Types;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.jumpmind.db.sql.ISqlRowMapper;
import org.jumpmind.db.sql.Row;
import org.jumpmind.symmetric.db.ISymmetricDialect;
import org.jumpmind.symmetric.service.IParameterService;
import org.jumpmind.symmetric.service.IStatisticService;
import org.jumpmind.symmetric.statistic.ChannelStats;
import org.jumpmind.symmetric.statistic.ChannelStatsByPeriodMap;
import org.jumpmind.symmetric.statistic.HostStats;
import org.jumpmind.symmetric.statistic.HostStatsByPeriodMap;
import org.jumpmind.symmetric.statistic.JobStats;
/**
* @see IStatisticService
*/
public class StatisticService extends AbstractService implements IStatisticService {
public StatisticService(IParameterService parameterService, ISymmetricDialect dialect) {
super(parameterService, dialect);
setSqlMap(new StatisticServiceSqlMap(symmetricDialect.getPlatform(),
createSqlReplacementTokens()));
}
public void save(ChannelStats stats) {
sqlTemplate.update(
getSql("insertChannelStatsSql"),
new Object[] { stats.getNodeId(), stats.getHostName(), stats.getChannelId(),
stats.getStartTime(), stats.getEndTime(), stats.getDataRouted(),
stats.getDataUnRouted(), stats.getDataEventInserted(),
stats.getDataExtracted(), stats.getDataBytesExtracted(),
stats.getDataExtractedErrors(), stats.getDataSent(),
stats.getDataBytesSent(), stats.getDataSentErrors(), stats.getDataLoaded(),
stats.getDataBytesLoaded(), stats.getDataLoadedErrors() }, new int[] {
Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP,
Types.TIMESTAMP, Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT,
Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT,
Types.BIGINT, Types.BIGINT, Types.BIGINT });
}
public void save(JobStats stats) {
sqlTemplate.update(
getSql("insertJobStatsSql"),
new Object[] { stats.getNodeId(), stats.getHostName(), stats.getJobName(),
stats.getStartTime(), stats.getEndTime(), stats.getProcessedCount() }, new int[] {
Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP,
Types.TIMESTAMP, Types.BIGINT });
}
public List<JobStats> getJobStatsForPeriod(Date start, Date end,
String nodeId) {
return sqlTemplate.query(getSql("selectChannelStatsSql"),
new JobStatsMapper(), start, end, nodeId);
}
public TreeMap<Date, Map<String, ChannelStats>> getChannelStatsForPeriod(Date start, Date end,
String nodeId, int periodSizeInMinutes) {
List<ChannelStats> list = sqlTemplate.query(getSql("selectChannelStatsSql"),
new ChannelStatsMapper(), start, end, nodeId);
return new ChannelStatsByPeriodMap(start, end, list, periodSizeInMinutes);
}
public void save(HostStats stats) {
sqlTemplate.update(
getSql("insertHostStatsSql"),
new Object[] { stats.getNodeId(), stats.getHostName(), stats.getStartTime(),
stats.getEndTime(), stats.getRestarted(), stats.getNodesPulled(),
stats.getNodesPushed(), stats.getNodesRejected(),
stats.getNodesRegistered(), stats.getNodesLoaded(),
stats.getNodesDisabled(), stats.getPurgedDataRows(),
stats.getPurgedDataEventRows(), stats.getPurgedBatchOutgoingRows(),
stats.getPurgedBatchIncomingRows(), stats.getTriggersCreatedCount(),
stats.getTriggersRebuiltCount(), stats.getTriggersRemovedCount(),
stats.getTotalNodesPullTime(), stats.getTotalNodesPushTime()},
new int[] { Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP, Types.TIMESTAMP,
Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT,
Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT,
Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT, Types.BIGINT,
Types.BIGINT });
}
public TreeMap<Date, HostStats> getHostStatsForPeriod(Date start, Date end, String nodeId,
int periodSizeInMinutes) {
List<HostStats> list = sqlTemplate.query(getSql("selectHostStatsSql"),
new HostStatsMapper(), start, end, nodeId);
return new HostStatsByPeriodMap(start, end, list, periodSizeInMinutes);
}
public Date truncateToMinutes(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}
class JobStatsMapper implements ISqlRowMapper<JobStats> {
public JobStats mapRow(Row rs) {
JobStats stats = new JobStats();
stats.setNodeId(rs.getString("node_id"));
stats.setHostName(rs.getString("host_name"));
stats.setJobName(rs.getString("job_name"));
stats.setStartTime(truncateToMinutes(rs.getDateTime("start_time")));
stats.setEndTime(truncateToMinutes(rs.getDateTime("end_time")));
stats.setProcessedCount(rs.getLong("processed_count"));
return stats;
}
}
class ChannelStatsMapper implements ISqlRowMapper<ChannelStats> {
public ChannelStats mapRow(Row rs) {
ChannelStats stats = new ChannelStats();
stats.setNodeId(rs.getString("node_id"));
stats.setHostName(rs.getString("host_name"));
stats.setChannelId(rs.getString("channel_id"));
stats.setStartTime(truncateToMinutes(rs.getDateTime("start_time")));
stats.setEndTime(truncateToMinutes(rs.getDateTime("end_time")));
stats.setDataRouted(rs.getLong("data_routed"));
stats.setDataUnRouted(rs.getLong("data_unrouted"));
stats.setDataEventInserted(rs.getLong("data_event_inserted"));
stats.setDataExtracted(rs.getLong("data_extracted"));
stats.setDataBytesExtracted(rs.getLong("data_bytes_extracted"));
stats.setDataExtractedErrors(rs.getLong("data_extracted_errors"));
stats.setDataSent(rs.getLong("data_sent"));
stats.setDataBytesSent(rs.getLong("data_bytes_sent"));
stats.setDataSentErrors(rs.getLong("data_sent_errors"));
stats.setDataLoaded(rs.getLong("data_loaded"));
stats.setDataBytesLoaded(rs.getLong("data_bytes_loaded"));
stats.setDataLoadedErrors(rs.getLong("data_loaded_errors"));
return stats;
}
}
class HostStatsMapper implements ISqlRowMapper<HostStats> {
public HostStats mapRow(Row rs) {
HostStats stats = new HostStats();
stats.setNodeId(rs.getString("node_id"));
stats.setHostName(rs.getString("host_name"));
stats.setStartTime(truncateToMinutes(rs.getDateTime("start_time")));
stats.setEndTime(truncateToMinutes(rs.getDateTime("end_time")));
stats.setRestarted(rs.getLong("restarted"));
stats.setNodesPulled(rs.getLong("nodes_pulled"));
stats.setNodesPushed(rs.getLong("nodes_pushed"));
stats.setNodesRejected(rs.getLong("nodes_rejected"));
stats.setNodesRegistered(rs.getLong("nodes_registered"));
stats.setNodesLoaded(rs.getLong("nodes_loaded"));
stats.setNodesDisabled(rs.getLong("nodes_disabled"));
stats.setPurgedDataRows(rs.getLong("purged_data_rows"));
stats.setPurgedDataEventRows(rs.getLong("purged_data_event_rows"));
stats.setPurgedBatchOutgoingRows(rs.getLong("purged_batch_outgoing_rows"));
stats.setPurgedBatchIncomingRows(rs.getLong("purged_batch_incoming_rows"));
stats.setTriggersCreatedCount(rs.getLong("triggers_created_count"));
stats.setTriggersRebuiltCount(rs.getLong("triggers_rebuilt_count"));
stats.setTriggersRemovedCount(rs.getLong("triggers_removed_count"));
stats.setTotalNodesPullTime(rs.getLong("total_nodes_pull_time"));
stats.setTotalNodesPushTime(rs.getLong("total_nodes_push_time"));
return stats;
}
}
}