package com.linkedin.databus.monitoring.mbean;
import com.linkedin.databus.core.DbusConstants;
public class GGParserStatistics implements GGParserStatisticsMBean
{
/**
* statistical info about transaction
*/
public static class TransactionInfo {
public long getTransactionSize()
{
return _transactionSize;
}
public long getTransactionTimeRead()
{
return _transactionTimeReadNs;
}
public long getTransactionTimeStampNs()
{
return _transactionEventTSNs;
}
/**
* scn of the most recent 'processes/subscribed' transaction
* @return
*/
public long getScn()
{
return _scn;
}
private final long _transactionSize;
private final long _transactionTimeReadNs;
private final long _transactionEventTSNs; // of the event in the transaction
private final long _scn;
/**
*
* @param size - size of the event
* @param timeReadNs - The time to read the event from the trail file in Ns
* @param tsNs The timestamp associated with the current transaction (The commit timestamp)
* @param scn The scn associated with the transaction (If there are multiple scns(not ideal), this is the max scn)
*/
public TransactionInfo(long size, long timeReadNs, long tsNs, long scn) {
_transactionSize = size;
_transactionTimeReadNs = timeReadNs;
_transactionEventTSNs = tsNs;
_scn = scn;
}
}
final private String _phSourceName;
//errors
private int _numErrors = 0;
private int _numParsingErrors = 0;
private int _numRestarts; //at this point we count number of parsing errors
// file stats
private int _filesAdded=0, _filesParsed=0;
// read stats
private long _bytesRead;
private long _timeMostRecentRead;
private long _timeMostRecentAdded;
// lag info
private long _bytesLag;
private long _modTimeLag; // lag between ts of most recent added and parsed files
private int _filesLag;
// transaction info
private int _numTransactions;
private long _transactionSize;
private long _transactionTimeReadNs;
private long _mostRecentTransTSMs; // ts from transaction itself
private long _maxScn; // maxSCN in transactions for the "subscribed" sources
private int _transactionsWithEvents;
private int _transactionsWithOutEvents;
private int _eventsTotal; // events in transactions for the "subscribed" sources
// SCN Regression related
/**
* NumSCNRegression counts the number of times SCN regressed ( went from a higher value to lower value )
*/
private long _numScnRegressions = 0;
/**
* The regressed SCN which was seen latest during trail file processing.
*/
private long _lastRegressedScn = -1;
public GGParserStatistics(String phSourceName)
{
_phSourceName = phSourceName;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("\npSource=").append(_phSourceName);
sb.append(";maxScn=").append(_maxScn);
sb.append(";evTotal=").append(_eventsTotal);
sb.append("\n");
sb.append("filesAdded=").append(_filesAdded);
sb.append(";filesParsed=").append(_filesParsed);
sb.append(";bytesRead=").append(_bytesRead);
sb.append(";TSMostRecentRead=").append(_timeMostRecentRead);
sb.append(";TSMostRecentAdded=").append(_timeMostRecentAdded);
sb.append(";tSinceRead=").append(getTimeSinceLastAccessMs());
sb.append("\n");
sb.append("LAG=").append(_bytesLag).append(":").append(_filesLag).append(":").append(_modTimeLag);
sb.append("\n");
sb.append("TxnTotal=").append(_transactionsWithEvents).append("+").append(_transactionsWithOutEvents).append("=").append(_numTransactions);
sb.append("\n");
sb.append("TxnStats(totalSize, readTime, lastTS)=").append(_transactionSize).append(":").append(_transactionTimeReadNs).append(":").append(_mostRecentTransTSMs);
sb.append("\n");
sb.append("parseErrofs=").append(_numParsingErrors).append(";errors=").append(_numErrors);
sb.append("\n");
sb.append("LastRegressSCN=").append(_lastRegressedScn).append(";NumSCNRegressions=").append(_numScnRegressions);
return sb.toString();
}
/**
* update on transaction read
* @param size
* @param timeRead
* @param ts
* @param scn
*/
//public void addTransactionInfo(long transSize, long transTimeReadMs, long transTs, long transScn, int numEventsInTrans) {
public void addTransactionInfo(TransactionInfo tr, int numEventsInTrans) {
_transactionSize += tr.getTransactionSize();
_transactionTimeReadNs += tr.getTransactionTimeRead();
_mostRecentTransTSMs = tr.getTransactionTimeStampNs() / DbusConstants.NUM_NSECS_IN_MSEC; //convert to MS
long transScn = tr.getScn();
if(transScn > _maxScn)
_maxScn = transScn;
if(numEventsInTrans > 0) {
_transactionsWithEvents++;
} else {
_transactionsWithOutEvents++;
}
_eventsTotal += numEventsInTrans;
_numTransactions++;
}
public void addError() {
_numErrors ++;
}
public void addParsingError() {
_numParsingErrors ++;
_numRestarts ++;
}
/** update on file add
* @param numNewFiles
*/
public void addNewFile(int numNewFiles) {
_filesAdded += numNewFiles;
}
/**
* update on file parsed
* @param files
*/
public void addParsedFile(int files) {
_filesParsed += files;
}
/**
* update on read
* @param bytesRead
*/
public void addBytesParsed(long bytesParsed) {
_bytesRead = bytesParsed;
_timeMostRecentRead = System.currentTimeMillis();
}
/**
* lag info update (bytes)
* @param lag
*/
public void setBytesLag(long lag) {
_bytesLag = lag;
}
/**
* lag info update (files)
* @param lag
*/
public void setFilesLag(int lag) {
_filesLag = lag;
}
/**
* lag info update (mod time)
* @param lag
*/
public void setModTimeLag(long tsBegin, long tsEnd) {
_modTimeLag = tsEnd - tsBegin;
_timeMostRecentAdded = tsEnd; // TS of the most recent available trail file
}
/////////////////Getters
public String getPhysicalSourceName()
{
return _phSourceName;
}
@Override
public int getNumTransactionsWithEvents()
{
return _transactionsWithEvents;
}
@Override
public int getNumTransactionsWithoutEvents()
{
return _transactionsWithOutEvents;
}
@Override
public int getNumTransactionsTotal()
{
return _numTransactions;
}
@Override
public int getNumFilesParsed()
{
return _filesParsed;
}
@Override
public int getNumFilesAdded()
{
return _filesAdded;
}
@Override
public long getAvgTransactionSize()
{
if(_numTransactions == 0)
return 0;
return _transactionSize/_numTransactions;
}
@Override
public long getAvgParseTransactionTimeNs()
{
if(_numTransactions == 0)
return 0;
return _transactionTimeReadNs/_numTransactions;
}
@Override
public long getTimeSinceLastTransactionMs()
{
if(_mostRecentTransTSMs <= 0)
return -1;
return System.currentTimeMillis() - _mostRecentTransTSMs;
}
@Override
public int getNumTotalEvents()
{
return _eventsTotal;
}
public long getMaxScn()
{
return _maxScn;
}
@Override
public long getNumErrors()
{
return _numErrors;
}
@Override
public long getNumParseErrors()
{
return _numParsingErrors;
}
@Override
public long getNumParseRestarts()
{
return _numRestarts;
}
@Override
public long getTimeSinceLastAccessMs()
{
if(_timeMostRecentRead == 0)
return -1;
return System.currentTimeMillis() - _timeMostRecentRead;
}
/**
* number of files between files available and parsed
* @see com.linkedin.databus.monitoring.mbean.GGParserStatisticsMBean#getNumFilesLag()
*/
@Override
public long getFilesLag()
{
return _filesLag;
}
/**
* difference between modTime of the most recent file added and the one already parsed
* @see com.linkedin.databus.monitoring.mbean.GGParserStatisticsMBean#getTimeLag()
*/
@Override
public long getTimeLag()
{
return _modTimeLag;
}
@Override
public long getBytesLag()
{
return _bytesLag;
}
@Override
public void reset()
{
_numErrors = 0;
_numParsingErrors = 0;
_numRestarts = 0;
_filesAdded=0;
_filesParsed=0;
_bytesRead = 0;
_timeMostRecentRead = 0;
_timeMostRecentAdded = 0;
_bytesLag = 0;
_modTimeLag = 0;
_filesLag = 0;
_numTransactions = 0;
_transactionSize = 0;
_transactionTimeReadNs = 0;
_mostRecentTransTSMs = 0;
_maxScn = 0;
_transactionsWithEvents = 0;
_transactionsWithOutEvents = 0;
_eventsTotal = 0;
_numScnRegressions = 0;
_lastRegressedScn = -1;
}
@Override
public long getAvgFileSize()
{
return (_bytesRead + _bytesLag)/_filesAdded;
}
@Override
public long getNumBytesTotalParsed() {
return _bytesRead;
}
public long getTsMostRecentFileAdded()
{
if(_timeMostRecentAdded == 0)
return -1;
return _timeMostRecentAdded;
}
@Override
public long getNumSCNRegressions()
{
return _numScnRegressions;
}
@Override
public long getLastRegressedScn()
{
return _lastRegressedScn;
}
public void addScnRegression(long regressScn)
{
_numScnRegressions++;
_lastRegressedScn = regressScn;
}
}