class LogThrottler extends Logging
A thread-safe token bucket-based throttler implementation with nanosecond accuracy.
Each instance must be shared across all scopes it should throttle.
For global throttling that means either by extending this class in an object or
by creating the instance as a field of an object.
- Alphabetic
- By Inheritance
- LogThrottler
- Logging
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new LogThrottler(bucketSize: Int = 100, tokenRecoveryInterval: FiniteDuration = 1.second, timeSource: NanoTimeTimeSource = SystemNanoTimeSource)
- bucketSize
This corresponds to the largest possible burst without throttling, in number of executions.
- tokenRecoveryInterval
Time between two tokens being added back to the bucket. This is reciprocal of the long-term average unthrottled rate. Example: With a bucket size of 100 and a recovery interval of 1s, we could log up to 100 events in under a second without throttling, but at that point the bucket is exhausted and we only regain the ability to log more events at 1 event per second. If we log less than 1 event/s the bucket will slowly refill until it's back at 100. Either way, we can always log at least 1 event/s.
Type Members
- implicit class LogStringContext extends AnyRef
- Definition Classes
- Logging
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def MDC(key: LogKey, value: Any): MDC
- Attributes
- protected
- Definition Classes
- Logging
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- val bucketSize: Int
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @IntrinsicCandidate() @native()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @IntrinsicCandidate() @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @IntrinsicCandidate() @native()
- def initializeLogIfNecessary(isInterpreter: Boolean, silent: Boolean = false): Boolean
- Attributes
- protected
- Definition Classes
- Logging
- def initializeLogIfNecessary(isInterpreter: Boolean): Unit
- Attributes
- protected
- Definition Classes
- Logging
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def isTraceEnabled(): Boolean
- Attributes
- protected
- Definition Classes
- Logging
- def log: Logger
- Attributes
- protected
- Definition Classes
- Logging
- def logBasedOnLevel(level: Level)(f: => MessageWithContext): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logDebug(msg: => String, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logDebug(entry: LogEntry, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logDebug(entry: LogEntry): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logDebug(msg: => String): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logError(msg: => String, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logError(entry: LogEntry, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logError(entry: LogEntry): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logError(msg: => String): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logInfo(msg: => String, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logInfo(entry: LogEntry, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logInfo(entry: LogEntry): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logInfo(msg: => String): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logName: String
- Attributes
- protected
- Definition Classes
- Logging
- def logTrace(msg: => String, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logTrace(entry: LogEntry, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logTrace(entry: LogEntry): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logTrace(msg: => String): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logWarning(msg: => String, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logWarning(entry: LogEntry, throwable: Throwable): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logWarning(entry: LogEntry): Unit
- Attributes
- protected
- Definition Classes
- Logging
- def logWarning(msg: => String): Unit
- Attributes
- protected
- Definition Classes
- Logging
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @IntrinsicCandidate() @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @IntrinsicCandidate() @native()
- def reset(): Unit
Resets throttler state to initial state.
Resets throttler state to initial state. Visible for testing.
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def throttled(thunk: (Long) => Unit): Unit
Run
thunkas long as there are tokens remaining in the bucket, otherwise skip and remember number of skips.Run
thunkas long as there are tokens remaining in the bucket, otherwise skip and remember number of skips.The argument to
thunkis how many previous invocations have been skipped since the last time an invocation actually ran.Note: This method is
synchronized, so it is concurrency safe. However, that also means no heavy-lifting should be done as part of this if the throttler is shared between concurrent threads. This also means that the synchronized block of thethunkthat *does* execute will still hold up concurrentthunks that will actually get rejected once they hold the lock. This is fine at low concurrency/low recovery rates. But if we need this to be more efficient at some point, we will need to decouple the check from thethunkexecution. - def throttledWithSkippedLogMessage(thunk: (MessageWithContext) => Unit): Unit
Same as throttled but turns the number of skipped invocations into a logging message that can be appended to item being logged in
thunk. - val timeSource: NanoTimeTimeSource
- def toString(): String
- Definition Classes
- AnyRef → Any
- val tokenRecoveryInterval: FiniteDuration
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- def withLogContext(context: Map[String, String])(body: => Unit): Unit
- Attributes
- protected
- Definition Classes
- Logging
Deprecated Value Members
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable]) @Deprecated
- Deprecated
(Since version 9)