From 6ce2b91fff1d91ba4aa90560e7a9595fdb62d921 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 26 Oct 2017 23:32:54 +1300 Subject: [PATCH] #1183 - Support transaction profiling, move away from binary encoding --- .../transaction/DefaultProfileStream.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java diff --git a/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java b/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java new file mode 100644 index 000000000..240f73e88 --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/transaction/DefaultProfileStream.java @@ -0,0 +1,92 @@ +package io.ebeaninternal.server.transaction; + +/** + * Default transaction profiling event collection. + */ +public class DefaultProfileStream implements ProfileStream { + + private final long startNanos; + private final StringBuilder buffer; + private final TransactionProfile profile; + private final TransactionProfile.Summary summary; + + DefaultProfileStream(int profId, boolean verbose) { + this.startNanos = System.nanoTime(); + this.profile = new TransactionProfile(System.currentTimeMillis(), profId); + this.summary = profile.getSummary(); + this.buffer = (verbose) ? new StringBuilder(200) : null; + } + + /** + * Return the time offset from the beginning of the transaction. + */ + @Override + public long offset() { + return ((System.nanoTime() - startNanos) / 1_000L); + } + + private long exeMicros(long offset) { + return offset() - offset; + } + + /** + * Add a query execution event. + */ + @Override + public void addQueryEvent(String event, long offset, short beanTypeId, int beanCount, short queryId) { + long micros = exeMicros(offset); + summary.addQuery(micros, beanCount); + if (buffer != null) { + add(micros, event, offset, beanTypeId, beanCount, queryId); + } + } + + /** + * Add a persist event. + */ + @Override + public void addPersistEvent(String event, long offset, short beanTypeId, int beanCount) { + long micros = exeMicros(offset); + summary.addPersist(micros, beanCount); + if (buffer != null) { + add(micros, event, offset, beanTypeId, beanCount, (short) 0); + } + } + + /** + * Add the commit/rollback event. + */ + @Override + public void addEvent(String event, long offset) { + long micros = exeMicros(offset); + summary.commitMicros = micros; + if (buffer != null) { + buffer.append(event).append(','); + buffer.append(offset).append(','); + buffer.append(micros).append(';'); + } + } + + private void add(long micros, String event, long offset, short beanTypeId, int beanCount, short queryId) { + buffer.append(event).append(','); + buffer.append(offset).append(','); + buffer.append(micros).append(','); + buffer.append(beanTypeId).append(','); + buffer.append(beanCount).append(','); + buffer.append(queryId).append(";"); + } + + /** + * End the transaction profiling. + */ + @Override + public void end(TransactionManager manager) { + + profile.setTotalMicros(offset()); + if (buffer != null) { + profile.setData(buffer.toString()); + } + manager.profileCollect(profile); + } + +}