--- /dev/null
+# This script is designed to be run in a directory where the karaf.log file is present
+# It greps the log file and produced 3 text files which can then be used to find more
+# information about transactions
+#
+# To properly use this script you must ensure that the karaf.log is produced with the
+# following log settings (this goes in etc/org.ops4j.pax.logging.cfg)
+#
+# log4j.logger.org.opendaylight.controller.cluster.datastore.Shard=DEBUG
+# log4j.logger.org.opendaylight.controller.cluster.datastore.AbstractTransactionContext=DEBUG
+#
+
+grep "Total modifications" karaf.log | awk '{print $1","$2"," $20 "," $23}' > txnbegin.txt
+grep "Applying local modifications for Tx" karaf.log | awk '{print $1","$2","$22}' > txnreached.txt
+grep "currentTransactionComplete" karaf.log | awk '{print $1","$2"," $18}' > txnend.txt
--- /dev/null
+#!/usr/bin/env python
+
+from datetime import datetime
+import collections
+
+
+class Transaction:
+ def __init__(self, txnId, startTime, operations):
+ self.txnId = txnId
+ self.operations = operations
+ self.startTime = datetime.strptime(startTime,
+ '%Y-%m-%d,%H:%M:%S,%f')
+ self.reachedTime = None
+ self.completeTime = None
+
+ def setReachedTime(self, reachedTime):
+ self.reachedTime = datetime.strptime(reachedTime,
+ '%Y-%m-%d,%H:%M:%S,%f')
+
+ def setCompleteTime(self, completeTime):
+ self.completeTime = datetime.strptime(completeTime,
+ '%Y-%m-%d,%H:%M:%S,%f')
+
+ def totalTime(self):
+ return Transaction.diffInMicros(self.startTime, self.completeTime)
+
+ def transferTime(self):
+ return Transaction.diffInMicros(self.startTime, self.reachedTime)
+
+ @staticmethod
+ def diffInMicros(start, end):
+ if end is not None and start is not None:
+ delta = end - start
+ seconds = delta.seconds
+ microseconds = delta.microseconds
+ return (seconds * 1000000 + microseconds) / 1000
+ return -1
+
+ def __str__(self):
+ return "transactionId = " + self.txnId + ", " \
+ + "operations = " + unicode(self.operations) + ", " \
+ + "startTime = " + unicode(self.startTime) + ", " \
+ + "reachedTime = " + unicode(self.reachedTime) + ", " \
+ + "completeTime = " + unicode(self.completeTime) + ", " \
+ + "transferTime = " + unicode(self.transferTime()) + ", " \
+ + "totalTime = " + unicode(self.totalTime())
+
+ def csv(self):
+ return unicode(self.startTime) + "," \
+ + self.txnId + "," \
+ + unicode(self.operations) + "," \
+ + unicode(self.transferTime()) + "," \
+ + unicode(self.totalTime())
+
+ @staticmethod
+ def csv_header():
+ return "Start Time,Transaction Id,Operations,Transfer Time," \
+ "Complete Time"
+
+
+def processFiles():
+ txns = collections.OrderedDict()
+ txnBegin = open("txnbegin.txt", "r")
+ for line in txnBegin:
+ arr = line.split(",")
+ txns[arr[3]] = Transaction(arr[3],
+ arr[0] + "," + arr[1] + "," + arr[2],
+ int(arr[4]))
+
+ txnReached = open("txnreached.txt", "r")
+ for line in txnReached:
+ arr = line.split(",")
+ txnId = arr[3].strip()
+ if txnId in txns:
+ txn = txns[txnId]
+ txn.setReachedTime(arr[0] + "," + arr[1] + "," + arr[2])
+
+ txnComplete = open("txnend.txt", "r")
+ for line in txnComplete:
+ arr = line.split(",")
+ txnId = arr[3].strip()
+ if txnId in txns:
+ txn = txns[txnId]
+ txn.setCompleteTime(arr[0] + "," + arr[1] + "," + arr[2])
+
+ return txns
+
+
+def filterTransactionsByTimeToComplete(timeToComplete):
+ txns = processFiles()
+ totalTime = 0
+ for txn in txns:
+ if txns[txn].totalTime() > timeToComplete:
+ print txns[txn]
+ totalTime += txns[txn].totalTime()
+
+ print "Total time for these transactions = " + unicode(totalTime)
+
+
+def csv():
+ txns = processFiles()
+ print Transaction.csv_header()
+ for txn in txns:
+ print txns[txn].csv()