Skip to content

Config File Format

The config file is the heart of Butler SOS. All settings must be defined in the config file—runtime errors are likely to occur otherwise.

TIP

The config file uses YAML notation, with file extensions of .yaml or .yml.
The .yaml extension is recommended.

A sample config file is included in the release ZIP files, and also available on GitHub.

Important Notes

  • Topic names (e.g. Butler-SOS.logLevel) are case sensitive
  • First time Butler SOS starts, it checks if the specified InfluxDB database exists. If not, it creates the database along with a default InfluxDB retention policy based on the time period set in the config file
  • Conditional validation: Starting with Butler SOS 12.0.0, configuration settings for disabled features are not validated for format or types. This means you can leave placeholder values for features you have disabled without getting validation errors

Configuration Sections

Top Level Settings

ParameterDescription
logLevelThe level of detail in logs. Possible values: silly, debug, verbose, info, warn, error (in order of decreasing detail)
fileLoggingtrue/false to enable/disable logging to disk file
logDirectorySubdirectory where log files are stored
anonTelemetryCan Butler SOS share anonymous data about itself with the Butler SOS project? More info in telemetry docs

Butler-SOS.configVisualisation

Settings for Butler SOS' web-based configuration visualization feature.

ParameterDescription
enableShould Butler SOS' config file be visualized in a web UI? true/false
hostHostname or IP address where the web server will listen. Should be localhost or the host's IP address in most cases
portPort where the web server will listen. Change if port 3100 is already in use
obfuscateShould the config file shown in the web UI be obfuscated? true/false

Butler-SOS.systemInfo

Control whether Butler SOS gathers detailed system information about the host it's running on.

When enabled, Butler SOS uses the underlying systeminformation npm package which executes various OS commands to gather detailed host information. In some enterprise environments, these commands may be flagged as suspicious by security monitoring tools.

ParameterDescription
enableShould Butler SOS gather detailed system information? true/false. Default: true. Set to false in security-sensitive environments where OS command execution is restricted. Note that telemetry requires system information to be enabled—Butler SOS will refuse to start if telemetry is enabled but systemInfo is disabled

Butler-SOS.heartbeat

Heartbeats can be used to send "I'm alive" messages to some other tool, e.g., an infrastructure monitoring tool. The concept is simple: The remoteURL will be called at the specified frequency. The receiving tool will then know that Butler SOS is alive.

ParameterDescription
enableShould heartbeats be sent to some URL, indicating that Butler SOS is alive and well? true/false
remoteURLURL that will be called for heartbeats
frequencyHow often should heartbeats be sent? Format according to later.js parser

Butler-SOS.dockerHealthCheck

Docker health checks are used when running Butler SOS as a Docker container. The Docker engine will call the container's health check REST endpoint with a set interval to determine whether the container is alive/well or not.

If you are not running Butler SOS in Docker you can disable this feature.

ParameterDescription
enableShould a Docker healthcheck endpoint be created within Butler SOS? Set to false if not running Butler SOS under Docker. true/false
portPort the healthcheck should use. Usually 12398, but might need to be changed if several Butler instances run on the same server

Butler-SOS.uptimeMonitor

ParameterDescription
enableShould messages with Butler SOS uptime and memory usage be written to console and logs? true/false
frequencyHow often should uptime messages be written? Format according to later.js parser
logLevelAt what log level should uptime messages appear? Possible values: silly, debug, verbose, info, warn, error
storeInInfluxdb.butlerSOSMemoryUsageShould data on Butler SOS' own memory use be stored in InfluxDB? true/false
storeInInfluxdb.instanceTagTag used to differentiate data from multiple Butler SOS instances
storeNewRelic.enableShould uptime data be sent to New Relic? true/false
storeNewRelic.destinationAccountArray of New Relic account names to which uptime data will be sent
storeNewRelic.metric.dynamic.butlerMemoryUsage.enableShould Butler SOS memory metrics be sent to New Relic? true/false
storeNewRelic.metric.dynamic.butlerUptime.enableShould Butler uptime be sent to New Relic? true/false
storeNewRelic.attribute.staticArray of attributes added to all uptime metrics sent to New Relic
storeNewRelic.attribute.dynamic.butlerVersion.enableShould uptime metrics be tagged with Butler SOS version number? true/false

Butler-SOS.thirdPartyToolsCredentials

ParameterDescription
newRelicArray of credentials for New Relic accounts to which data should be sent
newRelic[].accountNameName of New Relic account. This is a "friendly name" used within Butler SOS to identify each NR account
newRelic[].insertApiKeyInsert API key associated with the NR account. Get this from the NR account's settings page
newRelic[].accountIdNew Relic account ID. Get this from the NR account's settings page

Butler-SOS.userEvents

Track individual users opening/closing apps and starting/stopping sessions. Requires log appender XML file(s) to be added to Sense server(s).

ParameterDescription
enableShould Butler SOS track detailed user events (session start/stop, connection open/close)? true/false
excludeUserArray of users (directory/userId pairs) that should be disregarded when user events arrive from Sense
udpServerConfig.serverHostIP/host where the user event UDP server should listen. Using 0.0.0.0 will listen on all available IPs
udpServerConfig.portUserActivityEventsPort on which the user event UDP server will listen. Should match the port in the log appender
tagsArray of tags (tagName/tagValue pairs) added to each user event before sending to InfluxDB
sendToMQTT.enableShould user events be sent to MQTT? true/false
sendToMQTT.postTo.everythingTopic.enableShould all user event messages be sent to an MQTT topic? true/false
sendToMQTT.postTo.everythingTopic.topicMQTT topic to which all user event messages will be sent
sendToMQTT.postTo.sessionStartTopic.enableShould session start messages be sent to an MQTT topic? true/false
sendToMQTT.postTo.sessionStartTopic.topicMQTT topic for session start messages
sendToMQTT.postTo.sessionStopTopic.enableShould session stop messages be sent to an MQTT topic? true/false
sendToMQTT.postTo.sessionStopTopic.topicMQTT topic for session stop messages
sendToMQTT.postTo.connectionOpenTopic.enableShould connection open messages be sent to an MQTT topic? true/false
sendToMQTT.postTo.connectionOpenTopic.topicMQTT topic for connection open messages
sendToMQTT.postTo.connectionCloseTopic.enableShould connection close messages be sent to an MQTT topic? true/false
sendToMQTT.postTo.connectionCloseTopic.topicMQTT topic for connection close messages
sendToInfluxdb.enableShould user events be saved in InfluxDB? true/false
sendToNewRelic.enableShould user events be saved in New Relic? true/false
sendToNewRelic.destinationAccountArray of New Relic account names to which user events will be sent
sendToNewRelic.scrambleShould user directory and user ID fields be scrambled before sending to New Relic? true/false

Butler-SOS.logEvents

Log events are used to capture Sense warnings, errors, and fatals in real time. Requires log appender XML file(s) to be added to Sense server(s).

Note that log events can be enabled/disabled per source (repository, proxy, scheduler, etc.).

ParameterDescription
udpServerConfig.serverHostIP/host where the log event UDP server should listen. Using 0.0.0.0 will listen on all available IPs
udpServerConfig.portLogEventsPort on which the log event UDP server will listen. Should match the port in the log appender
tagsArray of tags (tagName/tagValue pairs) added to each log event before sending to InfluxDB
source.engine.enableShould log events from the engine service be handled? true/false
source.proxy.enableShould log events from the proxy service be handled? true/false
source.repository.enableShould log events from the repository service be handled? true/false
source.scheduler.enableShould log events from the scheduler service be handled? true/false
categorise.enableShould categorization of log events be enabled? true/false
categorise.rulesArray of rules used to categorise log events
categorise.rules[].descriptionDescription of the rule
categorise.rules[].logLevel[]Array of log levels to match against this rule
categorise.rules[].actionAction to take if matched. Values: categorise, drop
categorise.rules[].category[]Array of name-value pairs added to the log event if matched
categorise.rules[].filter[]Array of type-value pairs used to match log events
categorise.rules[].filter[].typeFilter type. Values: sw (starts with), ew (ends with), so (substring of)
categorise.ruleDefaultDefault values for categorization if no other rule matches
categorise.ruleDefault.enableShould the default rule be used? true/false
categorise.ruleDefault.category[]Array of name-value pairs added if no other rule matches
sendToMQTT.enableShould log events be sent to MQTT? true/false
sendToMQTT.baseTopicRoot MQTT topic for all log event messages
sendToMQTT.postTo.baseTopicShould all log events be posted to the root topic? true/false
sendToMQTT.postTo.subsystemTopicsShould log events be posted to subsystem-specific topics? true/false
sendToInfluxdb.enableShould log events be saved in InfluxDB? true/false
sendToNewRelic.enableShould log events be sent to New Relic? true/false
sendToNewRelic.destinationAccountArray of New Relic account names to which log events will be sent
sendToNewRelic.source.engine.enableShould log events from the engine service be handled?
sendToNewRelic.source.engine.logLevel.errorShould ERROR log events from the engine service be handled?
sendToNewRelic.source.engine.logLevel.warnShould WARN log events from the engine service be handled?
sendToNewRelic.source.proxy.enableShould log events from the proxy service be handled?
sendToNewRelic.source.proxy.logLevel.errorShould ERROR log events from the proxy service be handled?
sendToNewRelic.source.proxy.logLevel.warnShould WARN log events from the proxy service be handled?
sendToNewRelic.source.repository.enableShould log events from the repository service be handled?
sendToNewRelic.source.repository.logLevel.errorShould ERROR log events from the repository service be handled?
sendToNewRelic.source.repository.logLevel.warnShould WARN log events from the repository service be handled?
sendToNewRelic.source.scheduler.enableShould log events from the scheduler service be handled?
sendToNewRelic.source.scheduler.logLevel.errorShould ERROR log events from the scheduler service be handled?
sendToNewRelic.source.scheduler.logLevel.warnShould WARN log events from the scheduler service be handled?

Butler-SOS.cert

Certificates to use when connecting to Sense. Get these from the Certificate Export in QMC.

ParameterDescription
clientCertCertificate file. Exported from QMC
clientCertKeyCertificate key file. Exported from QMC
clientCertCARoot certificate for above certificate files. Exported from QMC
clientCertPassphrasePassword used to protect the certificate (as set when exporting cert from QMC)

Butler-SOS.mqttConfig

MQTT config parameters. These must be correctly defined for any other MQTT features in Butler SOS to work.

ParameterDescription
enableShould health metrics be sent to MQTT? true/false
brokerHostIP or FQDN of MQTT broker
brokerPortBroker port
baseTopicDefault topic used if not otherwise specified elsewhere. Should end with /. For example: butler-sos/

Butler-SOS.newRelic

If enabled, select Butler SOS metrics and events will be sent to New Relic.

Note that New Relic destination accounts for events are defined in Butler-SOS.userEvent and Butler-SOS.logEvent sections, whereas destination accounts for metrics are defined in this section.

ParameterDescription
enableShould Qlik Sense health metrics be sent to New Relic? true/false
event.urlAPI URL for sending events to New Relic. Options: https://insights-collector.eu01.nr-data.net or https://insights-collector.newrelic.com
event.headerArray of name/value pairs added as HTTP headers to all calls to New Relic event API
event.attribute.staticArray of name/value pairs representing attributes added to all events sent to New Relic
event.attribute.dynamic.butlerSosVersion.enableShould Butler SOS' version be attached as an attribute to events? true/false
metric.destinationAccountArray of New Relic account names to which Sense health metrics will be sent
metric.urlAPI URL for sending metrics. Options: https://insights-collector.eu01.nr-data.net/metric/v1 or https://metric-api.newrelic.com/metric/v1
metric.headerArray of name/value pairs added as HTTP headers to all calls to New Relic metric API
metric.dynamic.engine.memory.enableSend Sense memory metrics to New Relic? true/false
metric.dynamic.engine.cpu.enableSend Sense CPU metrics to New Relic? true/false
metric.dynamic.engine.calls.enableSend metrics about calls to the Sense engine? true/false
metric.dynamic.engine.selections.enableSend metrics about selections made in Sense apps? true/false
metric.dynamic.engine.sessions.enableSend aggregated Sense engine session metrics? true/false
metric.dynamic.engine.users.enableSend aggregated Sense user metrics? true/false
metric.dynamic.engine.saturated.enableSend Sense engine saturation status? true/false
metric.dynamic.apps.docCount.enableSend metrics on loaded/active/in-memory Sense apps? true/false
metric.dynamic.apps.activeDocs.enableShould data on active docs be sent to New Relic? true/false
metric.dynamic.apps.loadedDocs.enableShould data on loaded docs be sent to New Relic? true/false
metric.dynamic.apps.inMemoryDocs.enableShould data on in-memory docs be sent to New Relic? true/false
metric.dynamic.cache.cache.enableSend Sense cache metrics to New Relic? true/false
metric.dynamic.proxy.sessions.enableSend aggregated Sense proxy metrics to New Relic? true/false
metric.attribute.staticArray of name/value pairs representing attributes added to all Sense health metrics
metric.attribute.dynamic.butlerSosVersion.enableShould Butler SOS' version be attached to Sense health metrics? true/false

Butler-SOS.prometheus

If enabled, select Butler SOS metrics will be exposed on a Prometheus compatible URL from where they can be scraped by Prometheus.

ParameterDescription
enableShould health metrics be made available on a Prometheus compatible endpoint? true/false
hostIP on which the Prometheus endpoint should be available. Using 0.0.0.0 will listen on all available IPs
portPort on which the Prometheus endpoint will be available. Default 9842

Butler-SOS.influxdbConfig

InfluxDB config parameters. These must be correctly defined for any other InfluxDB features in Butler SOS to work.

ParameterDescription
enableShould health metrics be stored in InfluxDB? true/false
hostIP or FQDN of InfluxDB server
portPort where InfluxDB server is listening. NOTE: Must be set to a value (e.g., 8086)
versionInfluxDB version. Valid values: 1 and 2
v2Config.orgOrganization name for InfluxDB v2
v2Config.bucketBucket name for InfluxDB v2
v2Config.descriptionDescription of the InfluxDB bucket
v2Config.tokenToken for InfluxDB v2
v2Config.retentionDurationRetention duration for the InfluxDB bucket
v1Config.auth.enableEnable if using a password-protected InfluxDB v1 database
v1Config.auth.usernameInfluxDB username
v1Config.auth.passwordInfluxDB password
v1Config.dbNameName of InfluxDB v1 database to use
v1Config.retentionPolicy.nameName of default retention policy created when database is first created
v1Config.retentionPolicy.durationDuration during which metrics are kept. See InfluxDB docs for syntax
includeFields.activeDocsShould a list of currently active Sense apps be stored? true/false
includeFields.loadedDocsShould a list of Sense apps opened in a user session be stored? true/false
includeFields.inMemoryDocsShould a list of Sense apps loaded into memory be stored? true/false

Butler-SOS.appNames

ParameterDescription
enableAppNameExtractShould app names be extracted from Qlik Sense server? true/false
extractIntervalHow often (milliseconds) should app names be extracted from Sense server?
hostIPIP or FQDN of Sense server from which app names should be extracted

Butler-SOS.userSessions

Extract user session data per virtual proxy.

ParameterDescription
enableSessionExtractShould user session data be extracted? true/false
pollingIntervalHow often (milliseconds) to poll for user session data
excludeUserArray of users (directory/userId pairs) that should be disregarded

Butler-SOS.serversToMonitor

ParameterDescription
pollingIntervalHow often to query the Sense healthcheck API
rejectUnauthorizedSet to false to ignore warnings/errors caused by Qlik Sense's self-signed certificates. Set to true if the Qlik Sense root CA is available on the Butler SOS computer
serverTagsDefinitionList of tags to add to each server when storing data in InfluxDB. All tags defined here MUST be present in each server's definition section
serversArray of servers to monitor. For each server, a set of properties MUST be defined
servers[].hostFQDN of server. Domain should match that of the certificate exported from QMC. NOTE: Include the port (should be :4747 unless changed from default)
servers[].serverNameHuman friendly server name
servers[].serverDescriptionHuman friendly server description
servers[].userSessions.enableControl whether user session data should be retrieved for this server
servers[].userSessions.hostHost and port from which to retrieve user session data. Usually servername.mydomain.net:4243
servers[].userSessions.virtualProxiesA list of key-value pairs specifying which virtual proxies on this server to retrieve user session data from
servers[].serverTagsA list of key-value pairs providing metadata for servers. Can be used in Grafana dashboards
servers[].headersA list of key-value pairs. Headers specified here will be used when retrieving metrics from this Sense server

Released under the MIT License.