Skip to content

UDP Payload Format Reference

Butler SOS receives real-time events from Qlik Sense Enterprise on Windows (QSEoW) via two UDP endpoints:

  • User Events — default port 9997
  • Log Events — default port 9996

This reference describes the message formats for both endpoints.


User Events UDP Payload

User events capture session start/stop and connection open/close activity from Qlik Sense proxies.

Accepted message types: /qseow-proxy-connection/, /qseow-proxy-session/

Message Format

UDP messages are semicolon-separated text strings with 8 fields:

text
message_type;host;command;user_directory;user_id;origin;context;message

Field Specification

FieldNameMax LengthDescription
1Message Type100/qseow-proxy-connection/ or /qseow-proxy-session/
2Host100Hostname where the event occurred
3Command100Start session, Stop session, Open connection, Close connection
4User Directory100QSEoW user directory (e.g. LAB)
5User ID100QSEoW user ID (e.g. goran)
6Origin200Origin of the event
7Context500Context where the event occurred. May contain /app/<guid> for app ID extraction
8Message1000Event message. May contain semicolons and single quotes. May include UserAgent information

Special Processing

  • Field 8 (Message): The first 7 fields are split by ;, then field 8 is extracted from the remaining content after the 7th semicolon. This preserves semicolons within the message field.
  • App ID extraction: If the context field starts with /app/<guid>, the app ID is extracted.
  • App name lookup: If an app ID is found, Butler SOS looks up the app name from its internal app list. If not found, the app name is set to <unknown app name>.
  • User agent parsing: If the message contains UserAgent:, the user agent string is parsed into structured fields (browser name, browser version, OS name, OS version).
  • User full name: A combined field user_full is created as <user_directory>\<user_id> (e.g. LAB\goran).
  • User blacklist: Users matching Butler-SOS.userEvents.excludeUser (directory + userId) are skipped.

Example Payloads

text
/qseow-proxy-session/;server1.domain.com;Start session;LAB;goran;https://sense.domain.com;app/e7af59a0-c243-480d-9571-08727551a66f;UserAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
text
/qseow-proxy-connection/;server2.domain.com;Open connection;LAB;jdoe;https://sense.domain.com;hub;Connection established

Log Events UDP Payload

Butler SOS supports 5 types of log events from QSEoW services. Each type has a different payload structure.

Common Validations

  • Configured source-type validation: User events only accept supported proxy session/connection payloads. Log events only process payload types that match the enabled source settings in the config file.
  • Date validation: ISO 8601 timestamps are validated. Invalid dates are set to empty string.
  • UUID validation: UUID fields are validated. Invalid UUIDs are set to empty string.
  • Field sanitization: All string fields have control characters removed and are truncated to their maximum length.

Engine Events (/qseow-engine/)

Engine events capture warnings, errors, and fatals from the Qlik Sense engine service. There are 19 fields.

#NameMax LengthValidationDescription
1source100-Always /qseow-engine/
2log_row-Must be integer > 0Row number in log
3ts_iso50ISO 8601Timestamp in compact format: 20211109T153726.028+0200
4ts_local50Local timestampTimestamp in local format: 2021-11-09 15:37:26,028
5level20-WARN, ERROR, FATAL
6host100-Hostname
7subsystem200-QSEoW subsystem
8windows_user100-DOMAIN\qlikservice
9message1000-Log message (may contain ; and ')
10proxy_session_id-UUIDProxy session ID
11user_directory100-QSEoW user directory
12user_id100-QSEoW user ID
13engine_ts50-Engine timestamp (ISO 8601)
14process_id-UUIDEngine process ID
15engine_exe_version50-Engine version
16server_started50-Server start time (ISO 8601)
17entry_type50-Entry type
18session_id-UUIDSession ID
19app_id-UUIDApp ID

Accepted date formats for engine events:

FormatExample
Compact ISO 860120211109T153726.028+0200
Hyphenated ISO 86012021-11-09T15:37:26.028+0200
Local timestamp2021-11-09 15:37:26,028

Proxy Events (/qseow-proxy/)

Proxy events capture warnings, errors, and fatals from the Qlik Sense proxy service. There are 16 fields.

#NameMax LengthValidationDescription
1source100-Always /qseow-proxy/
2log_row-Must be integer > 0Row number
3ts_iso50ISO 8601ISO 8601 timestamp
4ts_local50Local timestampLocal timestamp
5level20-WARN, ERROR, FATAL
6host100-Hostname
7subsystem200-QSEoW subsystem
8windows_user100-DOMAIN\qlikservice
9message1000-Log message
10exception_message1000-Exception message (empty if none)
11user_directory100-QSEoW user directory
12user_id100-QSEoW user ID
13command200-Command carried out
14result_code50-Result code
15origin200-Origin of log event
16context200-Context where event occurred

Repository Events (/qseow-repository/)

Repository events capture warnings, errors, and fatals from the Qlik Sense repository service. The field structure is identical to Proxy Events (16 fields).


Scheduler Events (/qseow-scheduler/)

Scheduler events capture warnings, errors, and fatals from the Qlik Sense scheduler service. There are 18 fields.

#NameMax LengthValidationDescription
1source100-Always /qseow-scheduler/
2log_row-Must be integer > 0Row number
3ts_iso50ISO 8601ISO 8601 timestamp
4ts_local50Local timestampLocal timestamp
5level20-WARN, ERROR, FATAL
6host100-Hostname
7subsystem200-QSEoW subsystem
8windows_user100-DOMAIN\qlikservice
9message1000-Log message
10exception_message1000-Exception message
11user_directory100-QSEoW user directory
12user_id100-QSEoW user ID
13user_full200-DOMAIN\user format
14task_name200-Task name
15app_name200-App name
16task_id-UUIDTask ID
17app_id-UUIDApp ID
18execution_id-UUIDExecution ID

QIX Performance Events (/qseow-qix-perf/)

QIX performance events capture detailed engine performance data including method execution times, memory usage, and object-level metrics. Requires Butler-SOS.logEvents.enginePerformanceMonitor.enable: true. There are 26 fields.

#NameMax LengthValidationDescription
1source100-Always /qseow-qix-perf/
2log_row-Must be integer > 0Row number
3ts_iso50-ISO 8601 timestamp
4ts_local50-Local timestamp
5level20-WARN, ERROR, FATAL
6host100-Hostname
7subsystem200-QSEoW subsystem
8windows_user100-DOMAIN\qlikservice
9proxy_session_id-UUIDProxy session ID. If 0, denotes non-user activity (e.g. scheduled reload)
10user_directory100-QSEoW user directory
11user_id100-QSEoW user ID
12engine_ts50-Engine timestamp
13session_id-UUIDSession ID
14app_id-UUIDDocument/app ID
15request_id-Must be integer >= 0Request ID
16method100-e.g. Global::OpenApp, Doc::GetAppLayout
17process_time-FloatMilliseconds
18work_time-FloatMilliseconds
19lock_time-FloatMilliseconds
20validate_time-FloatMilliseconds
21traverse_time-FloatMilliseconds
22handle-Must be integer >= 0Handle (-1 or number)
23object_id100-UUID or short identifier like rwPjBk
24net_ram-Must be integer >= 0Bytes
25peak_ram-Must be integer >= 0Bytes
26object_type100-e.g. AppPropsList, linechart, barchart

Special Processing

Event activity source: Determined by proxy_session_id. If 0, the activity is classified as non-user (e.g. scheduled reload). Otherwise it is classified as user activity.

App name lookup: If Butler-SOS.logEvents.enginePerformanceMonitor.appNameLookup.enable is true, Butler SOS looks up the app name from its internal app list using the app_id.

Filtering: Two levels of filters in Butler-SOS.logEvents.enginePerformanceMonitor.monitorFilter:

  • appSpecific — filter by app ID, app name, object, method
  • allApps — filter across all apps

Events that do not match any filter are skipped (and can be tracked via the rejected events counter if trackRejectedEvents.enable is true).


Message Processing and Validation

Processing Flow

Validations

Message size validation: Controlled by maxMessageSize (default: 65507 bytes, the UDP maximum). Messages exceeding this limit are dropped and counted in messages_dropped_size.

Rate limiting (optional): Controlled by rateLimit.enable (default: false) and rateLimit.maxMessagesPerMinute (default: 600). Uses a fixed 1-minute window. Messages exceeding the rate are dropped and counted in messages_dropped_rate_limit.

Queue management: Controlled by messageQueue.maxConcurrent (default: 10), messageQueue.maxSize (default: 200), and messageQueue.backpressureThreshold (default: 80%). When the queue is full, messages are dropped and counted in messages_dropped_queue_full.

Network source IP validation (optional): Controlled by enableSourceValidation and allowedSources. This check is applied before size validation, rate limiting, queueing, and payload parsing. Hostnames in allowedSources are resolved to IPv4 at startup. If validation is enabled but no entries are configured or resolved, Butler SOS disables source validation at startup. See UDP Message Queue for full details.

Source/type validation: User events only accept /qseow-proxy-connection/ and /qseow-proxy-session/. Log events must match the enabled sources in the config file (Butler-SOS.logEvents.source.<type>.enable).

Field sanitization: All string fields have control characters (ASCII 0x00-0x1F, 0x7F) removed and are truncated to their specified maximum length.


Configuration Reference

UDP Server Configuration

yaml
Butler-SOS:
  userEvents:
    enable: true
    udpServerConfig:
      serverHost: '<IP or FQDN>'
      portUserActivityEvents: 9997
      enableSourceValidation: false
      allowedSources: []
      messageQueue:
        maxConcurrent: 10
        maxSize: 200
        backpressureThreshold: 80
      rateLimit:
        enable: false
        maxMessagesPerMinute: 600
      maxMessageSize: 65507
      queueMetrics:
        influxdb:
          enable: false
          writeFrequency: 20000
          measurementName: user_events_queue
          tags: []

  logEvents:
    udpServerConfig:
      serverHost: '<IP or FQDN>'
      portLogEvents: 9996
      enableSourceValidation: false
      allowedSources: []
      messageQueue:
        maxConcurrent: 10
        maxSize: 200
        backpressureThreshold: 80
      rateLimit:
        enable: false
        maxMessagesPerMinute: 600
      maxMessageSize: 65507
      queueMetrics:
        influxdb:
          enable: false
          writeFrequency: 20000
          measurementName: log_events_queue
          tags: []
    source:
      engine:
        enable: false
      proxy:
        enable: false
      repository:
        enable: false
      scheduler:
        enable: false
      qixPerf:
        enable: true
        enginePerformanceMonitor:
          enable: true
          appNameLookup:
            enable: true
          monitorFilter:
            appSpecific: []
            allApps: []
          trackRejectedEvents:
            enable: false

Log Event Source Enables

Each log source must be explicitly enabled in the config file:

yaml
Butler-SOS:
  logEvents:
    source:
      engine:   enable: true   # Process /qseow-engine/ messages
      proxy:    enable: true   # Process /qseow-proxy/ messages
      repository: enable: true # Process /qseow-repository/ messages
      scheduler: enable: true  # Process /qseow-scheduler/ messages
      qixPerf:  enable: true   # Process /qseow-qix-perf/ messages

Important Notes

  1. UDP is connectionless: No delivery guarantees. Messages may be lost, duplicated, or arrive out of order.

  2. Message size limit: Default is 65507 bytes (UDP maximum). Can be reduced via maxMessageSize.

  3. Semicolons in fields: User event field 8 (message) and log event field 9 (message) may contain semicolons. Butler SOS uses special handling to preserve these.

  4. Queue is always on: All messages flow through managed queues with controlled concurrency. The queue cannot be disabled.

  5. Rate limiting is optional: Disabled by default. Enable if experiencing message flooding.

  6. UUID validation: Invalid UUIDs are set to empty string, allowing partial processing of otherwise malformed messages.

  7. Date validation: Invalid dates are set to empty string. Both compact and hyphenated ISO 8601 formats are accepted for engine events.

  8. App ID in context: User events can extract app ID from the context field if it matches the /app/<guid> pattern.

  9. Single quotes in fields: Message fields may contain single quotes, which are handled during processing.

Released under the MIT License.