Internal tables
Note
This document describes Legacy internal table details only. See Internal Tables for information on general Enterprise and Core+ internal tables.
Audit Event Log
Configuration
- Any process that can write to the Audit Event Log or Process Event Log can override several configuration items. All configuration overrides should be based on the process name or main class name.
<process name>.useLas
- iftrue
, then the events will be written through the LAS; iffalse
, then events will be written directly to binary log files.<process name>.useMainClassNameForLogs
- whether to use the class name for log entries; iffalse
, then the retrieved value from the process.name property will be used instead of the class name.
RemoteQueryProcessor.logCommands
- defines whether or not all received commands are logged. The default value isfalse
.LocalInternalPartition
- if specified, defines the internal partition to which data will be written; if not defined, then a local partition based on the host name will be used.
Auditable events by process
Worker audit events (RemoteQueryProcessor)
- ACL details - full details on the ACLs for a user connected to the worker
- Client async query - a client sent an asynchronous query request
- Client command - a command was received from a client; only logged if the
RemoteQueryProcessor.logCommands
property istrue
. - Client disconnection - a client disconnected from the worker
- Client sync query - a client sent a synchronous query request
- Command cancel - a worker command was cancelled
- Disconnect - a client disconnected from the worker
- Primary client - the worker's primary client connected
- Secondary client - a secondary client requested an action from the worker; the details contain further information
- Script source (controller) - a script was loaded by requesting it from the persistent query controller; if an exception occurred, it will be shown in the details
- Script source (remote) - a script was loaded from a remote source, which may be a console
- Table Access - a user attempted to access a table
Process Event Log
Configuration
The following configuration parameters define the process event log configuration.
RemoteQueryProcessor.sendLogsToSystemOut
- if defined and set to true
, tells the query workers to send their logs to standard system output. This cannot be used when writing to the process event log.
Any process that can write to the process event log can override several configuration items. All configuration overrides should be based on the process name or main class name.
<process name>.writeDatabaseProcessLogs
- iftrue
, then process event logs will be created; iffalse
, then process event logs will not be created.<process name>.useLas
- iftrue
, then audit and process events will be written through the LAS; iffalse
, then events will be written directly to binary log files.<process name>.useMainClassNameForLogs
- whether to use the class name for log entries; iffalse
, then the retrieved value from the process.name property will be used instead of the class name.<process name>.logLevel
- the minimum log level event which will be written. The default value isINFO
. Allowed values are:FATAL
EMAIL
STDERR
ERROR
WARN
STDOUT
INFO
DEBUG
TRACE
<process name>.captureLog4j
- iftrue
, any output sent to the Log4J logger is written into the process event log.<process name>.captureSysout
- iftrue
, any system output is written into the process event log.<process name>.captureSyserr
- iftrue
, any error output is written into the process event log.<process name>.aliveMessageSeconds
- if non-zero, a message is periodically written to the process event log indicating that the process is still alive.LocalInternalPartition
- if specified, defines the internal partition to which data will be written; if not defined, then a local partition based on the host name will be used.
Write entries to CSV files
It is possible to write ProcessEventLog entries to CSV files. To turn this on, specify the following property for the dispatchers and workers:
ProcessEventLog.interceptor=com.illumon.iris.db.util.logging.ProcessEventLogInterceptorCsv
Also specify a full path name to a directory where the CSV files will be written with the property. This directory must be writable by all the processes that will generate these files; typically making it group-writable by dbmergegrp
will be adequate:
ProcessEventLog.interceptor.csv.directory=/path/to/directory
CSV file names will consist of the following pattern:
<PQ name if available>-<process name>-<host name>-<optional GUID>.date/timestamp
Some messages (during initial worker startup and shutdown) will be logged in the dispatcher’s log instead of the workers' logs.
The following properties define the behavior:
ProcessEventLog.interceptor.csv.format
- an optional CSV format, from org.apache.commons.csv.CSVFormat#Predefined. If none is specified, the default is Excel.ProcessEventLog.interceptor.csv.delimiter
- an optional delimiter. If none is specified (the property is non-existent or commented out), the default is taken from the CSV format. Delimiters must be one character.ProcessEventLog.interceptor.csv.queueCapacity
- to ensure that CSV writes do not affect performance, all CSV operations are submitted to a queue and performed off-thread. This specifies the queue’s capacity. If the capacity is exceeded (because the writer thread can’t keep up), further writes will hold up the process until there is available queue capacity. The default queue capacity is 1,000.ProcessEventLog.interceptor.csv.rolloverDaily
- if this is specified, the CSV files will roll over daily. The default istrue
. If the files are rolling over daily (or not at all), the date/timestamp will be in the formatyyyy-MM-dd
, such as 2021-04-03.ProcessEventLog.interceptor.csv.rolloverHourly
- if this is specified, the CSV files will roll over hourly. This takes precedence over daily rollover. The default isfalse
. If the files are rolling over hourly, the date/timestamp will include a time and offset, such as 2021-04-29.150000.000-0400.ProcessEventLog.interceptor.csv.timeZone
- the time zone to be used for filenames and timestamps in the CSV files. The default is the system default time zone. This is the text name of the time zone, such asAmerica/New_York
.ProcessEventLog.interceptor.csv.flushMessages
- how frequently to flush the queue to disk (it will always flush when the queue is emptied). The default value is 100.
If you are not seeing CSV files being created, we recommend the following steps:
- Check the most recent startup log or the process event log for the worker. If there is a configuration error in the interceptor properties, this is where it will most likely show up. It is designed to not prevent process and worker startup if it is misconfigured.
- Check the permissions on the directory to which CSV files are being written. It will need to be writable by all the processes, typically
dbmergegrp
. - Since the PQ name is part of the filename, special Linux file path characters can cause issues. For example, a forward-slash
/
will be interpreted as a directory separator. For this case, appropriate subdirectories will need to be created to hold the CSV files.
Process Info
The Process Info table (ProcessInfo
) captures the system properties, JVM arguments, memory and memory pool info, and other initial conditions of processes on startup. Its information is intended primarily for debugging purposes.
To disable the ProcessInfo
table, set the following property to false
:
IrisLogDefaults.writeDatabaseProcessInfo=false
Columns
Column Name | Column Type | Description |
---|---|---|
Date | String | The date on which the process was started. This is the partitioning column. |
ID | String | The randomly generated process info ID. This will be globally unique. |
Type | String | The generic type. |
Key | String | The generic key. |
Value | String | The generic value. |
Process Metrics
The Process Metrics table (ProcessMetrics
) captures internal metrics that were previously written to the stats.log
CSV. The table is disabled by default.
To enable the ProcessMetrics
table, set the following property to true
:
IrisLogDefaults.writeDatabaseProcessMetrics=true
Columns
Column Name | Column Type | Description |
---|---|---|
Date | String | The date on which the information was generated. This is the partitioning column. |
Timestamp | DateTime | The timestamp for this event. |
ProcessID | String | The ProcessInfo ID that generated this event. |
Name | String | The name of the metric. |
Interval | String | The timing interval for the metric. |
Type | String | The type of the metric. |
N | long | |
Sum | long | |
Last | long | |
Min | long | |
Max | long | |
Avg | long | |
Sum2 | long | |
Stdev | long |
Process Telemetry
The DbInternal.ProcessTelemetry table enables monitoring UI performance of the Swing front-end. For each user-initiated action, the console logs the duration between the start of the operation and when the table is ready for use. By aggregating this telemetry, an overall picture of the system's health - as perceived by users - is available. Detailed information can then be used to investigate potential performance problems.
To write these events, the Swing console internally buffers the data and then sends it to the new TelemetryHelperQuery
query. If the TelemetryHelperQuery
is not running, data is buffered up to a configurable limit, at which point the oldest telemetry data is discarded.
Permissions
For new installations, an ACL is automatically applied to the Process Telemetry table. For an upgrade, an ACL editor must create a new "Table ACL" for the raw DbInternal.ProcessTelemetry data to be seen by unprivileged users. The ACL should be similar to the "allusers/DbInternal.ProcessEventLog" ACL, but for the ProcessTelemetry table:
allusers | DbInternal | ProcessTelemetry | new UsernameFilterGenerator("EffectiveUser")
Configuration
Several new startup parameters define the Telemetry behavior for the console under the [service.name=iris_console]
stanza:
Property | Description |
---|---|
Telemetry.remoteTelemetry=true | Identifies if telemetry metrics should be logged in the table. To disable logging to the remote table, set the following property to false . Note that telemetry will still be logged to the local client-logfile unless disabled with the enableFor options described below. |
Telemetry.sendFrequencyMs=15_000 | Defines the frequency for messages to be sent to the server. Events will be batched and sent periodically. The default frequency is 15s. |
Telemetry.initialSendBuffer=1_024 | Defines the initial size of the buffer which stores messages to be sent in a batch, defaulting to 1,024. |
Telemetry.maxSendBuffer=10_000 | Defines the maximum number of messages to store and send in a single batch. New messages appended to the buffer after it is full will cause "older" events to be removed. The default maximum value is 10,000. |
| A number of classes will attempt to log telemetry locally and to the remote table. Individual classes may be prevented from being logged by setting these to false . |
Columns
Column Name | Column Type | Description |
---|---|---|
Date | String | The date on which the event occurred. |
ClientInstance | String | A unique ID that identifies a single front-end instance. |
TelemetryItem | long | An incrementing ID (per ClientInstance), which allow for all Events within a telemetry-item to be identified. |
ClientHost | String | The client hostname. |
EventTime | DateTime | The time when the Event was logged to the table. |
AuthenticatedUser | String | The authenticated user for the logged event. |
EffectiveUser | String | The effective user for the logged event. |
ProcessInfoId | String | Worker ProcessInfoId of the running query. |
Worker | String | The name of the worker of the running query. |
TableName | String | The name of the table being viewed. |
WorkerHost | String | The hostname where the query is running. |
SerialNumber | long | The query's serial number, if applicable. |
Event | String | A string-representation of the telemetry-item. |
Status | String | The most recent status of the telemetry-item. |
ClientTimestamp | DateTime | The client timestamp of when the event occurred. |
Duration | long | The duration (in nanoseconds) between the event and the creation of the telemetry-item. |
Reason | String | If applicable, the exception for the event. |
telemetrySummary()
The telemetrySummary()
function, which accepts an optional "Date" parameter, is available in the default Groovy session. The method will provide summary tables derived from the raw Telemetry data that aggregate the data in meaningful ways.
Worker Performance Tables
Legacy workers write three performance related tables, which can be analyzed with performanceOverview
.
Query Operation Performance Log
The Query Operation Performance Log (QueryOperationPerformanceLog
) contains performance details on Deephaven query operations. Each query is broken up into its component parts for this log, allowing in-depth understanding of the performance impacts of each individual operation for a query.
Columns
Column Name | Column Type | Description |
---|---|---|
Date | String | The date of the event. |
QueryId | long | The ID of the query that logged the event. This is a value assigned by the system. |
DispatcherName | String | The name of the dispatcher that started the query. |
ServerHost | String | The host on which the event was generated. |
ClientHost | String | The client's host name. |
PrimaryAuthenticatedUser | String | The authenticated user that is running the query. |
PrimaryEffectiveUser | String | The effective user that is running the query. |
OperationAuthenticatedUser | String | The authenticated user for this query operation. |
OperationEffectiveUser | String | The effective user for this query operation. |
RequestId | String | The query operation's request ID. |
WorkerName | String | The name of the worker running the query. |
ProcessInfoId | String | Key for joining with DbInternal/ProcessInfo on Id or DbInternal/ProcessMetrics on ProcessId. |
OperationNumber | int | An increasing number that indicates the order operations. |
Description | String | Information on the specific operation. |
CallerLine | String | An automatically-determined "caller line" of code - the first element in the stack that does not begin with com.illumon.iris.db . |
IsTopLevel | boolean | Whether this operation is at the highest level of instrumentation, or whether it is enclosed by another instrumented operation. |
IsCompilation | boolean | true if this operation appears to be a formula or column compilation. |
StartTime | DateTime | The start time of the operation. |
EndTime | DateTime | The end time of the operation. |
Duration | long | The duration of the operation in nanoseconds. |
CpuNanos | long | CPU time in nanoseconds used by threads while processing for this query/operation/update. |
UserCpuNanos | long | User mode CPU time in nanoseconds used by threads while processing for this query/operation/update. |
FreeMemoryChange | long | The difference in free memory in bytes between the beginning and end of the operation. |
TotalMemoryChange | long | The difference in the JVM's total memory in bytes between the beginning and end of the operation. |
AllocatedBytes | long | Memory in bytes allocated by threads while processing for this query/operation/update. |
PoolAllocatedBytes | long | Reusable pool memory in bytes allocated by threads while processing for this query/operation/update. |
InputSize | int | The size of the table being worked on as an int. |
InputSizeLong | long | The size of the table being worked on as a long. |
FirstTimeDataReads | long | Count of data block reads incurred by this operation, for blocks not previously read by this worker. |
RepeatedDataReads | long | Count of data block reads incurred by this operation, for blocks previously read by this worker. These are blocks that have grown, or were otherwise no longer cached when needed. |
AverageFirstTimeDataReadTime | double | Average read duration in nanoseconds for first time data reads. |
AverageRepeatedDataReadTime | double | Average read duration in nanoseconds for repeated data reads. |
WasInterrupted | boolean | true if this operation was interrupted due to an error or cancellation. |
QueryNumber | int | A number which starts at 0 and is incremented within each worker for each new query. |
Query Performance Log
The Query Performance Log (QueryPerformanceLog
) contains details on query-level performance for each worker. A given worker may be running multiple queries; each will have its own set of query performance log entries.
Configuration
RemoteQueryDispatcher.logQueryPerformance
- specifies whether or not to log query performance.
Columns
Column Name | Column Type | Description |
---|---|---|
Date | String | The date of the event |
QueryId | long | An identifier that is incremented for each query started by a remote query dispatcher; the initial value is based on the time a dispatcher started. |
DispatcherName | String | The name of the dispatcher that started the query. |
ServerHost | String | The host on which the event was generated. |
ClientHost | String | The client's host name. |
PrimaryAuthenticatedUser | String | The authenticated user that is running the query. |
PrimaryEffectiveUser | String | The effective user that is running the query. |
OperationAuthenticatedUser | String | The authenticated user for this query operation. |
OperationEffectiveUser | String | The effective user for this query operation. |
RequestId | String | The query operation's request ID. |
WorkerName | String | The name of the worker that is running the query. |
ProcessInfoId | String | Key for joining with DbInternal/ProcessInfo on Id or DbInternal/ProcessMetrics on ProcessId. |
RequestDescription | String | Indication of the request type (e.g., Console-<name> , PersistentQuery-<name> ) |
StartTime | DateTime | The start time of the operation. |
EndTime | DateTime | The end time of the operation. |
QueryClassName | String | The name of the class reporting the details. |
ClientName | String | An identifier for the client which started this job. |
JobName | String | An identifier for the job running this query within the remote query dispatcher. |
WorkerProcessId | int | The host's process ID for the worker. |
QueryNumber | int | A number which starts at 0 and is incremented within each worker for each new query. |
Timeout | long | The maximum duration for the query. |
Duration | long | The duration of this query performance log entry. |
CpuNanos | long | CPU time in nanoseconds used by threads while processing for this query/operation/update. |
UserCpuNanos | long | User mode CPU time in nanoseconds used by threads while processing for this query/operation/update. |
RequestedHeapSize | long | The requested heap size in MB for this worker, usually based on the persistent query configuration or console parameters. |
WorkerHeapSize | long | The actual heap size in MB for this worker. |
TotalMemoryFree | long | The amount of free heap at the end of the operation. See https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#freeMemory--. |
TotalMemoryUsed | long | The total amount of heap allocated by the JVM. See https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#totalMemory--. |
FreeMemoryChange | long | The difference in free memory in bytes between the beginning and end of the operation. |
TotalMemoryChange | long | The difference in free memory in bytes between the beginning and end of the operation. |
AllocatedBytes | long | Memory in bytes allocated by threads while processing for this query/operation/update. |
PoolAllocatedBytes | long | Reusable pool memory in bytes allocated by threads while processing for this query/operation/update. |
FirstTimeDataReads | long | Count of data block reads incurred by this query, for blocks not previously read by this worker. |
RepeatedDataReads | long | Count of data block reads incurred by this query, for blocks previously read by this worker. These are blocks that have grown, or were otherwise no longer cached when needed. |
AverageFirstTimeDataReadTime | double | Average read duration in nanoseconds for first time data reads. |
AverageRepeatedDataReadTime | double | Average read duration in nanoseconds for repeated data reads. |
WasInterrupted | boolean | true if this query was interrupted due to an error or cancellation. |
ResultClassName | String | The resulting class for the query (usually the resulting class sent to a client). |
ResultSize | long | The size in bytes of the query's serialized result. |
IsReplayer | boolean | This column is no longer used. |
Exception | String | The exception details if one was generated. |
Update Performance Log
The Update Performance Log (UpdatePerformanceLog
) contains aggregated performance details on incremental update operations performed in the LiveTableMonitor
loop.
Update performance logging allows three types of logging.
- Database - for workers only, this writes update performance data to the
UpdatePerformanceLog
table's intraday data - Log - the update performance data is printed to standard out
- Listener - the update performance data is supplied to registered
UpdatePerformanceTracker.Listeners
; this can be used to programmatically handle the performance logs in-process.
The mode is driven by the UpdatePerformanceTracker.reportingMode
property, which can be set to the following values:
NONE
LOG_ONLY
DB_ONLY
LISTENER_ONLY
LOG_AND_LISTENER
DB_AND_LISTENER
LOG_AND_DB
ALL
Columns
Column Name | Column Type | Description |
---|---|---|
Date | String | The date of the event |
ServerHost | String | The host on which the event was generated. |
DispatcherName | String | The name of the dispatcher that started the query. |
WorkerName | String | The name of the worker that is running the query. |
ProcessInfoId | String | Key for joining with DbInternal/ProcessInfo on Id or DbInternal/ProcessMetrics on ProcessId. |
WorkerStartTime | DateTime | The time the worker started. |
ClientHost | String | The client's host name. |
PrimaryAuthenticatedUser | String | The authenticated user that is running the query. |
PrimaryEffectiveUser | String | The effective user that is running the query. |
QueryName | String | The name of the query (for persistent queries, the name assigned to the query). |
EntryId | long | A unique identifier for this operation, which can be used to identify a single operation across intervals. |
EntryDescription | String | A human-readable description of the operation. |
EntryCallerLine | String | The class and line number that caused the generation of this log entry. A negative number indicates that the line number is not available. |
IntervalStartTime | DateTime | The start time for this performance interval. |
IntervalEndTime | DateTime | The end time for this performance interval. |
IntervalDuration | long | How long, in nanoseconds, this performance interval took. |
EntryIntervalUsage | long | How many nanoseconds this operation used within the given interval. |
EntryIntervalCpuNanos | long | CPU time in nanoseconds used by threads while processing for this query/operation/update. |
EntryIntervalUserCpuNanos | long | User mode CPU time in nanoseconds used by threads while processing for this query/operation/update. |
EntryIntervalAdded | long | How many rows were added for this operation, during the interval. EntryIntervalAdded , EntryIntervalRemoved , EntryIntervalModified , and EntryIntervalShifted provide an indication of how much data was processed by this operation during the interval. |
EntryIntervalRemoved | long | How many rows were removed for this operation, during the interval. EntryIntervalAdded , EntryIntervalRemoved , EntryIntervalModified , and EntryIntervalShifted provide an indication of how much data was processed by this operation during the interval. |
EntryIntervalModified | long | How many rows were modified for this operation, during the interval. EntryIntervalAdded , EntryIntervalRemoved , EntryIntervalModified , and EntryIntervalShifted provide an indication of how much data was processed by this operation during the interval. |
EntryIntervalShifted | long | How many rows are affected by shifts for this operation, during the interval. EntryIntervalAdded , EntryIntervalRemoved , EntryIntervalModified , and EntryIntervalShifted provide an indication of how much data was processed by this operation during the interval. |
EntryIntervalInitialDataReads | long | Count of data block reads incurred by this operation during the interval, for blocks not previously read by this worker. |
EntryIntervalRepeatDataReads | long | Count of data block reads incurred by this operation during the interval, for blocks previously read by this worker. These are blocks that have grown, or were otherwise no longer cached when needed. |
EntryIntervalAverageInitialDataReadTime | double | Average read duration in nanoseconds for first time data reads incurred by this operation during the interval. |
EntryIntervalAverageRepeatDataReadTime | double | Average read duration in nanoseconds for repeated data reads incurred by this operation during the interval. |
TotalMemoryFree | long | The amount of free heap at the end of the last operation in this interval. |
TotalMemoryUsed | long | The amount of total JVM heap at the end of the last operation in this interval. |
EntryIntervalAllocatedBytes | long | Memory in bytes allocated by threads while processing for this query/operation/update. |
EntryIntervalPoolAllocatedBytes | long | Reusable pool memory in bytes allocated by threads while processing for this query/operation/update. |
Log Index Tables
Index Table | Base Table | Partitioning Column(s) | Key Columns |
---|---|---|---|
ProcessEventLogIndex | ProcessEventLog | Date | Process, ProcessInfoId, AuthenticatedUser, EffectiveUser |
ProcessTelemetryIndex | ProcessTelemetry | Date | ClientInstance, ClientHost, ProcessInfoId, Worker, AuthenticatedUser, EffectiveUser |
QueryOperationPerformanceLogIndex | QueryOperationPerformanceLog | Date | ProcessInfoId, PrimaryAuthenticatedUser, PrimaryEffectiveUser, WorkerName, ServerHost |
QueryPerformanceLogIndex | QueryPerformanceLog | Date | ServerHost, WorkerName, PrimaryAuthenticatedUser, PrimaryEffectiveUser, ProcessInfoId |
UpdatePerformanceLogIndex | UpdatePerformanceLog | Date | ProcessInfoId, ServerHost, WorkerName, PrimaryAuthenticatedUser, PrimaryEffectiveUser |