[Major] Removed tx.setSuppressDoNothingLogging(), replaced with tx.silentThreshold()

This commit is contained in:
Robert von Burg 2020-02-27 11:52:46 +01:00
parent 6adb3bf2c1
commit 56c948a361
3 changed files with 57 additions and 47 deletions

View File

@ -15,11 +15,15 @@
*/ */
package li.strolch.persistence.api; package li.strolch.persistence.api;
import static li.strolch.agent.api.StrolchAgent.getUniqueId;
import static li.strolch.model.StrolchModelConstants.*; import static li.strolch.model.StrolchModelConstants.*;
import static li.strolch.model.Tags.AGENT; import static li.strolch.model.Tags.AGENT;
import static li.strolch.utils.helper.ExceptionHelper.getExceptionMessage;
import static li.strolch.utils.helper.StringHelper.formatNanoDuration;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream; import java.util.stream.Stream;
import li.strolch.agent.api.*; import li.strolch.agent.api.*;
@ -56,7 +60,6 @@ import li.strolch.runtime.privilege.TransactedRestrictable;
import li.strolch.service.api.Command; import li.strolch.service.api.Command;
import li.strolch.utils.collections.MapOfMaps; import li.strolch.utils.collections.MapOfMaps;
import li.strolch.utils.dbc.DBC; import li.strolch.utils.dbc.DBC;
import li.strolch.utils.helper.ExceptionHelper;
import li.strolch.utils.helper.StringHelper; import li.strolch.utils.helper.StringHelper;
import li.strolch.utils.objectfilter.ObjectFilter; import li.strolch.utils.objectfilter.ObjectFilter;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -80,10 +83,10 @@ public abstract class AbstractTransaction implements StrolchTransaction {
private MapOfMaps<String, String, Activity> activityCache; private MapOfMaps<String, String, Activity> activityCache;
private TransactionCloseStrategy closeStrategy; private TransactionCloseStrategy closeStrategy;
private long silentThreshold;
private boolean suppressUpdates; private boolean suppressUpdates;
private boolean suppressAudits; private boolean suppressAudits;
private boolean suppressAuditsForAudits; private boolean suppressAuditsForAudits;
private boolean suppressDoNothingLogging;
private TransactionResult txResult; private TransactionResult txResult;
private List<Command> commands; private List<Command> commands;
@ -234,6 +237,17 @@ public abstract class AbstractTransaction implements StrolchTransaction {
return new StrolchTransactionException(string); return new StrolchTransactionException(string);
} }
@Override
public StrolchTransaction silentThreshold(long silentThreshold, TimeUnit timeUnit) {
this.silentThreshold = timeUnit.toNanos(silentThreshold);
return this;
}
@Override
public long getSilentThreshold() {
return TimeUnit.NANOSECONDS.toMillis(this.silentThreshold);
}
@Override @Override
public void setSuppressUpdates(boolean suppressUpdates) { public void setSuppressUpdates(boolean suppressUpdates) {
this.suppressUpdates = suppressUpdates; this.suppressUpdates = suppressUpdates;
@ -264,16 +278,6 @@ public abstract class AbstractTransaction implements StrolchTransaction {
return this.suppressAuditsForAudits; return this.suppressAuditsForAudits;
} }
@Override
public boolean isSuppressDoNothingLogging() {
return suppressDoNothingLogging;
}
@Override
public void setSuppressDoNothingLogging(boolean quietDoNothing) {
this.suppressDoNothingLogging = quietDoNothing;
}
@Override @Override
public boolean isVersioningEnabled() { public boolean isVersioningEnabled() {
return this.realm.isVersioningEnabled(); return this.realm.isVersioningEnabled();
@ -387,7 +391,7 @@ public abstract class AbstractTransaction implements StrolchTransaction {
} catch (PrivilegeModelException e) { } catch (PrivilegeModelException e) {
throw e; throw e;
} catch (PrivilegeException e) { } catch (PrivilegeException e) {
throw new StrolchAccessDeniedException(this.certificate, query, ExceptionHelper.getExceptionMessage(e), e); throw new StrolchAccessDeniedException(this.certificate, query, getExceptionMessage(e), e);
} }
} }
@ -1404,7 +1408,7 @@ public abstract class AbstractTransaction implements StrolchTransaction {
this.closeStrategy = TransactionCloseStrategy.ROLLBACK; this.closeStrategy = TransactionCloseStrategy.ROLLBACK;
String msg = "Strolch Transaction for realm {0} failed due to {1}"; //$NON-NLS-1$ String msg = "Strolch Transaction for realm {0} failed due to {1}"; //$NON-NLS-1$
msg = MessageFormat.format(msg, getRealmName(), ExceptionHelper.getExceptionMessage(e)); msg = MessageFormat.format(msg, getRealmName(), getExceptionMessage(e));
throw new StrolchTransactionException(msg, e); throw new StrolchTransactionException(msg, e);
} }
} }
@ -1544,9 +1548,6 @@ public abstract class AbstractTransaction implements StrolchTransaction {
private void handleReadOnly(long start, long auditTrailDuration) { private void handleReadOnly(long start, long auditTrailDuration) {
if (this.suppressDoNothingLogging)
return;
long end = System.nanoTime(); long end = System.nanoTime();
long txDuration = end - this.txResult.getStartNanos(); long txDuration = end - this.txResult.getStartNanos();
long closeDuration = end - start; long closeDuration = end - start;
@ -1554,6 +1555,9 @@ public abstract class AbstractTransaction implements StrolchTransaction {
this.txResult.setTxDuration(txDuration); this.txResult.setTxDuration(txDuration);
this.txResult.setCloseDuration(closeDuration); this.txResult.setCloseDuration(closeDuration);
if (this.silentThreshold > 0L && txDuration < this.silentThreshold)
return;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("TX user="); sb.append("TX user=");
sb.append(this.certificate.getUsername()); sb.append(this.certificate.getUsername());
@ -1562,19 +1566,19 @@ public abstract class AbstractTransaction implements StrolchTransaction {
sb.append(getRealmName()); sb.append(getRealmName());
sb.append(", took="); //$NON-NLS-1$ sb.append(", took="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(txDuration)); sb.append(formatNanoDuration(txDuration));
sb.append(", action="); sb.append(", action=");
sb.append(this.action); sb.append(this.action);
if (closeDuration >= 100000000L) { if (closeDuration >= 100000000L) {
sb.append(", close="); //$NON-NLS-1$ sb.append(", close="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(closeDuration)); sb.append(formatNanoDuration(closeDuration));
} }
if (isAuditTrailEnabled() && auditTrailDuration >= 100000000L) { if (isAuditTrailEnabled() && auditTrailDuration >= 100000000L) {
sb.append(", auditTrail="); //$NON-NLS-1$ sb.append(", auditTrail="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(auditTrailDuration)); sb.append(formatNanoDuration(auditTrailDuration));
} }
logger.info(sb.toString()); logger.info(sb.toString());
@ -1589,6 +1593,9 @@ public abstract class AbstractTransaction implements StrolchTransaction {
this.txResult.setTxDuration(txDuration); this.txResult.setTxDuration(txDuration);
this.txResult.setCloseDuration(closeDuration); this.txResult.setCloseDuration(closeDuration);
if (this.silentThreshold > 0L && txDuration < this.silentThreshold)
return;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("TX user="); sb.append("TX user=");
sb.append(this.certificate.getUsername()); sb.append(this.certificate.getUsername());
@ -1597,24 +1604,24 @@ public abstract class AbstractTransaction implements StrolchTransaction {
sb.append(getRealmName()); sb.append(getRealmName());
sb.append(", took="); //$NON-NLS-1$ sb.append(", took="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(txDuration)); sb.append(formatNanoDuration(txDuration));
sb.append(", action="); sb.append(", action=");
sb.append(this.action); sb.append(this.action);
if (closeDuration >= 100000000L) { if (closeDuration >= 100000000L) {
sb.append(", close="); //$NON-NLS-1$ sb.append(", close="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(closeDuration)); sb.append(formatNanoDuration(closeDuration));
} }
if (isAuditTrailEnabled() && auditTrailDuration >= 100000000L) { if (isAuditTrailEnabled() && auditTrailDuration >= 100000000L) {
sb.append(", auditTrail="); //$NON-NLS-1$ sb.append(", auditTrail="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(auditTrailDuration)); sb.append(formatNanoDuration(auditTrailDuration));
} }
if (isObserverUpdatesEnabled() && observerUpdateDuration >= 100000000L) { if (isObserverUpdatesEnabled() && observerUpdateDuration >= 100000000L) {
sb.append(", updates="); //$NON-NLS-1$ sb.append(", updates="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(observerUpdateDuration)); sb.append(formatNanoDuration(observerUpdateDuration));
} }
logger.info(sb.toString()); logger.info(sb.toString());
} }
@ -1636,14 +1643,14 @@ public abstract class AbstractTransaction implements StrolchTransaction {
sb.append(getRealmName()); sb.append(getRealmName());
sb.append(" failed="); //$NON-NLS-1$ sb.append(" failed="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(txDuration)); sb.append(formatNanoDuration(txDuration));
sb.append(", action="); sb.append(", action=");
sb.append(this.action); sb.append(this.action);
if (closeDuration >= 100000000L) { if (closeDuration >= 100000000L) {
sb.append(", close="); //$NON-NLS-1$ sb.append(", close="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(closeDuration)); sb.append(formatNanoDuration(closeDuration));
} }
logger.error(sb.toString()); logger.error(sb.toString());
} }
@ -1666,25 +1673,25 @@ public abstract class AbstractTransaction implements StrolchTransaction {
sb.append(getRealmName()); sb.append(getRealmName());
sb.append(" failed="); //$NON-NLS-1$ sb.append(" failed="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(txDuration)); sb.append(formatNanoDuration(txDuration));
sb.append(", action="); sb.append(", action=");
sb.append(this.action); sb.append(this.action);
if (closeDuration >= 100000000L) { if (closeDuration >= 100000000L) {
sb.append(", close="); //$NON-NLS-1$ sb.append(", close="); //$NON-NLS-1$
sb.append(StringHelper.formatNanoDuration(closeDuration)); sb.append(formatNanoDuration(closeDuration));
} }
if (this.container.hasComponent(OperationsLog.class)) { if (this.container.hasComponent(OperationsLog.class)) {
OperationsLog operationsLog = container.getComponent(OperationsLog.class); OperationsLog operationsLog = container.getComponent(OperationsLog.class);
operationsLog.addMessage(new LogMessage(this.realm.getRealm(), this.certificate.getUsername(), operationsLog.addMessage(new LogMessage(this.realm.getRealm(), this.certificate.getUsername(),
Locator.valueOf(AGENT, "tx", this.action, StrolchAgent.getUniqueId()), LogSeverity.Exception, Locator.valueOf(AGENT, "tx", this.action, getUniqueId()), LogSeverity.Exception,
ResourceBundle.getBundle("strolch-agent"), "agent.tx.failed").withException(e).value("reason", e)); ResourceBundle.getBundle("strolch-agent"), "agent.tx.failed").withException(e).value("reason", e));
} }
String msg = "Strolch Transaction for realm {0} failed due to {1}\n{2}"; //$NON-NLS-1$ String msg = "Strolch Transaction for realm {0} failed due to {1}\n{2}"; //$NON-NLS-1$
msg = MessageFormat.format(msg, getRealmName(), ExceptionHelper.getExceptionMessage(e), sb.toString()); msg = MessageFormat.format(msg, getRealmName(), getExceptionMessage(e), sb.toString());
StrolchTransactionException ex = new StrolchTransactionException(msg, e); StrolchTransactionException ex = new StrolchTransactionException(msg, e);
if (throwEx) if (throwEx)

View File

@ -18,6 +18,7 @@ package li.strolch.persistence.api;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream; import java.util.stream.Stream;
import li.strolch.agent.api.*; import li.strolch.agent.api.*;
@ -310,6 +311,23 @@ public interface StrolchTransaction extends AutoCloseable {
*/ */
boolean isFailed(); boolean isFailed();
/**
* Sets the TX to be silent if the duration is less than the given threshold if the TX was completed successfully
*
* @param silentThreshold
* the threshold duration for the TX to be silent if TX duration is less than this value
* @param timeUnit
* the time unit for the given duration
*/
StrolchTransaction silentThreshold(long silentThreshold, TimeUnit timeUnit);
/**
* Returns the threshold duration in milliseconds for the TX to be silent if TX duration is less than this value
*
* @return the threshold duration in milliseconds for the TX to be silent if TX duration is less than this value
*/
long getSilentThreshold();
/** /**
* If the given argument is true, then no observer updates are performed * If the given argument is true, then no observer updates are performed
* *
@ -357,21 +375,6 @@ public interface StrolchTransaction extends AutoCloseable {
*/ */
boolean isSuppressAuditsForAudits(); boolean isSuppressAuditsForAudits();
/**
* If the given argument is true, then logging of a {@link TransactionCloseStrategy#READ_ONLY} will be suppressed
*
* @param suppressDoNothingLogging
* true to suppress logging of a {@link TransactionCloseStrategy#READ_ONLY}, false to enable logging
*/
void setSuppressDoNothingLogging(boolean suppressDoNothingLogging);
/**
* Returns true if logging of a {@link TransactionCloseStrategy#READ_ONLY} should be suppressed
*
* @return true if logging of a {@link TransactionCloseStrategy#READ_ONLY} should be suppressed
*/
boolean isSuppressDoNothingLogging();
/** /**
* Returns true if versioning is enabled on the {@link StrolchRealm} for which this transaction has been opened * Returns true if versioning is enabled on the {@link StrolchRealm} for which this transaction has been opened
* *

View File

@ -15,6 +15,7 @@
*/ */
package li.strolch.migrations; package li.strolch.migrations;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static li.strolch.migrations.Migration.*; import static li.strolch.migrations.Migration.*;
import static li.strolch.model.StrolchModelConstants.BAG_PARAMETERS; import static li.strolch.model.StrolchModelConstants.BAG_PARAMETERS;
@ -45,8 +46,7 @@ public class CurrentMigrationVersionQuery {
for (String realmName : this.container.getRealmNames()) { for (String realmName : this.container.getRealmNames()) {
StrolchRealm realm = this.container.getRealm(realmName); StrolchRealm realm = this.container.getRealm(realmName);
try (StrolchTransaction tx = realm.openTx(cert, getClass(), false)) { try (StrolchTransaction tx = realm.openTx(cert, getClass(), false).silentThreshold(1, NANOSECONDS)) {
tx.setSuppressDoNothingLogging(true);
Resource migrationsRes = tx.getResourceBy(MIGRATIONS_TYPE, MIGRATIONS_ID); Resource migrationsRes = tx.getResourceBy(MIGRATIONS_TYPE, MIGRATIONS_ID);
if (migrationsRes == null) { if (migrationsRes == null) {