package com.linkedin.databus2.producers;
/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* 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.
*
*/
import java.util.ArrayList;
import java.util.List;
import com.linkedin.databus.core.monitoring.mbean.DbusEventsStatisticsCollector;
import com.linkedin.databus.core.monitoring.mbean.DbusEventsTotalStats;
import com.linkedin.databus.monitoring.mbean.EventSourceStatistics;
import com.linkedin.databus2.producers.db.EventReaderSummary;
import com.linkedin.databus2.producers.db.ReadEventCycleSummary;
/**
* Given a DbusEventBufferStatsCollector; produce RelayLogging and RelayStats artifacts *
* @author snagaraj
*
*/
public class RelayStatsAdapter
{
private DbusEventsStatisticsCollector _stats;
private String _name;
ReadEventCycleSummary _lastReadEventSummary = null;
public RelayStatsAdapter(String name, DbusEventsStatisticsCollector statsCollector)
{
_stats = statsCollector;
_name = name;
}
/**
* Return event cycle summary object ; since last invocation
* @return
*/
public synchronized ReadEventCycleSummary getReadEventCycleSummary()
{
ReadEventCycleSummary diff = null;
if (_stats != null)
{
ReadEventCycleSummary currentReadEventSummary = getReadEventSummary();
if (_lastReadEventSummary != null)
{
diff = getDiff(currentReadEventSummary, _lastReadEventSummary);
_lastReadEventSummary = null;
}
else
{
diff = currentReadEventSummary;
}
_lastReadEventSummary = currentReadEventSummary;
}
return diff;
}
/**
* @return eventsummary at this instant of time; readTime will be computed as the diff between cur and last ;
*/
protected ReadEventCycleSummary getReadEventSummary()
{
List<EventReaderSummary> sourceSummaries = new ArrayList<EventReaderSummary>();
for (Integer srcId : _stats.getSources())
{
sourceSummaries.add(getSummary(srcId));
}
ReadEventCycleSummary summary = new ReadEventCycleSummary(_name, sourceSummaries,
_stats.getTotalStats().getMaxScn(), System.currentTimeMillis());
return summary;
}
/**
* Return stats for each table access; readTime will be extrapolated diff between cur and last readings;
* @param sourceId
* @return
*/
protected EventReaderSummary getSummary(int sourceId)
{
DbusEventsTotalStats stats = _stats.getSourceStats(sourceId);
if (stats != null)
{
EventReaderSummary summary = new EventReaderSummary( (short) sourceId, stats.getDimension(),
stats.getMaxScn(), (int) stats.getNumDataEvents(),
stats.getSizeDataEvents()*(int) (stats.getNumDataEvents()),
System.currentTimeMillis(), 0, _stats.getTotalStats().getTimestampMinScnEvent(),
stats.getTimestampMaxScnEvent(),0L);
return summary;
}
return null;
}
/**
* produce diff of two summaries; src1 -src2
*/
protected ReadEventCycleSummary getDiff(ReadEventCycleSummary src1, ReadEventCycleSummary src2)
{
List<EventReaderSummary> src1Summaries = src1.getSourceSummaries();
List<EventReaderSummary> src2Summaries = src2.getSourceSummaries();
if (src1Summaries.size() == src2Summaries.size())
{
List<EventReaderSummary> sourceSummaries = new ArrayList<EventReaderSummary>();
for (int i=0; i < src1Summaries.size();++i)
{
sourceSummaries.add(getDiff(src1Summaries.get(i),src2Summaries.get(i)));
}
ReadEventCycleSummary r1 = new ReadEventCycleSummary(src1.getEventSourceName(), sourceSummaries,
src1.getEndOfWindowScn(), src1.getReadMillis()-src2.getReadMillis());
return r1;
}
return null;
}
/**
* produce diff of eventreader summary s1-s2
*/
protected EventReaderSummary getDiff(EventReaderSummary s1, EventReaderSummary s2)
{
EventReaderSummary diff = new EventReaderSummary(s1.getSourceId(), s1.getSourceName(), s1.getEndOfPeriodSCN(),
s1.getNumberOfEvents()-s2.getNumberOfEvents(), s1.getSizeOfSerializedEvents()-s2.getSizeOfSerializedEvents(), s1.getReadMillis()-s2.getReadMillis(),
s1.getEventMillis(),
s2.getTimeProdEnd(), s1.getTimeProdEnd(), s1.getQueryExecTime());
return diff;
}
/**
* Return event source statistics object ;
* @return
*/
public synchronized EventSourceStatistics[] getEventSourceStatistics()
{
if (_stats == null)
return null;
List<Integer> sourceIds = _stats.getSources();
if (sourceIds.size() > 0)
{
EventSourceStatistics[] stats = new EventSourceStatistics[sourceIds.size()];
int i=0;
for (Integer srcId : sourceIds)
{
EventSourceStatistics stat = getEventSourceStat(_stats.getSourceStats(srcId));
stats[i++] = stat;
}
return stats;
}
return null;
}
protected EventSourceStatistics getEventSourceStat(DbusEventsTotalStats stats)
{
if (stats ==null ) return null;
long numErrors = stats.getNumHeaderErrEvents() + stats.getNumPayloadErrEvents() + stats.getNumInvalidEvents();
EventSourceStatistics eventStats = new EventSourceStatistics(_name,(int) stats.getNumDataEvents(),stats.getTimeSinceLastAccess(),
stats.getMaxScn(), numErrors, stats.getSizeDataEvents());
return eventStats;
}
}