Add comprehensive tests demonstrating conditional validation fix

Co-authored-by: mountaindude <1029262+mountaindude@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2025-07-25 19:35:17 +00:00
parent 8dbc6d7982
commit d1021ffea7
9 changed files with 680 additions and 1283 deletions

1
.gitignore vendored
View File

@@ -57,3 +57,4 @@ jspm_packages
build.cjs
butler-sos
src/config/production_vac.yaml
tmp/

View File

@@ -1,2 +0,0 @@
import configFileSchema from './src/lib/config-file-schema.js';
console.log("MQTT Schema:", JSON.stringify(configFileSchema.properties['Butler-SOS'].properties.mqttConfig, null, 2));

View File

@@ -0,0 +1,592 @@
/**
* Demonstrate the fix for issue #1036: Conditional config validation based on enable flags
*/
import { jest } from '@jest/globals';
import { dump } from 'js-yaml';
import fs from 'fs/promises';
import { verifyConfigFileSchema } from '../config-file-verify.js';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
describe('Issue #1036: Conditional Config Validation', () => {
let tempConfigPath;
afterEach(async () => {
if (tempConfigPath) {
try {
await fs.unlink(tempConfigPath);
} catch (err) {
// Ignore if file doesn't exist
}
tempConfigPath = null;
}
});
async function createTempConfig(configObject) {
const tempDir = path.join(__dirname, '../../../tmp');
await fs.mkdir(tempDir, { recursive: true });
tempConfigPath = path.join(tempDir, `test-config-${Date.now()}.yaml`);
const yamlContent = dump(configObject);
await fs.writeFile(tempConfigPath, yamlContent);
return tempConfigPath;
}
/**
* This test demonstrates the main issue and its resolution:
* Users should be able to leave sample/placeholder values in the config file
* for features that are disabled, without getting validation errors.
*/
test('should accept invalid config values when feature is disabled', async () => {
const config = {
'Butler-SOS': {
// Basic required settings
logLevel: 'info',
fileLogging: true,
logDirectory: 'log',
anonTelemetry: true,
// Features with enable flags - all disabled with placeholder/invalid values
configVisualisation: {
enable: false,
host: 'localhost',
port: 3100,
obfuscate: true
},
heartbeat: {
enable: false,
remoteURL: 'http://my.monitoring.server/some/path/', // Placeholder from template
frequency: 'every 1 hour'
},
dockerHealthCheck: {
enable: false,
port: 12398
},
mqttConfig: {
enable: false,
brokerHost: '<IP of MQTT broker/server>', // Placeholder - invalid hostname
brokerPort: 1883,
baseTopic: 'butler-sos/'
},
newRelic: {
enable: false,
event: {
url: 'https://insights-collector.eu01.nr-data.net',
header: [],
attribute: {
static: [],
dynamic: {
butlerSosVersion: { enable: true }
}
}
},
metric: {
destinationAccount: [],
url: 'https://insights-collector.eu01.nr-data.net/metric/v1',
header: [],
dynamic: {
engine: {
memory: { enable: true },
cpu: { enable: true },
calls: { enable: true },
selections: { enable: true },
sessions: { enable: true },
users: { enable: true },
saturated: { enable: true }
},
apps: {
docCount: { enable: true },
activeDocs: { enable: true },
loadedDocs: { enable: true },
inMemoryDocs: { enable: true }
},
cache: {
cache: { enable: true }
},
proxy: {
sessions: { enable: true }
}
},
attribute: {
static: [],
dynamic: {
butlerSosVersion: { enable: true }
}
}
}
},
prometheus: {
enable: false,
host: 'localhost',
port: 9842
},
influxdbConfig: {
enable: false,
host: 'localhost',
port: 8086,
version: 2,
v2Config: {
org: 'org',
bucket: 'bucket',
description: 'description',
token: 'token',
retentionDuration: '30d'
},
v1Config: {
auth: {
enable: false,
username: 'user',
password: 'pass'
},
dbName: 'butler-sos',
retentionPolicy: {
name: 'autogen',
duration: '30d'
}
},
includeFields: {
activeDocs: true,
loadedDocs: true,
inMemoryDocs: true
}
},
// Required sections with minimal valid config
uptimeMonitor: {
enable: true,
frequency: 'every 15 minutes',
logLevel: 'verbose',
storeInInfluxdb: {
butlerSOSMemoryUsage: true,
instanceTag: 'DEV'
},
storeNewRelic: {
enable: false,
destinationAccount: [],
metric: {
dynamic: {
butlerMemoryUsage: { enable: true },
butlerUptime: { enable: true }
}
},
attribute: {
static: [],
dynamic: {
butlerVersion: { enable: true }
}
}
}
},
thirdPartyToolsCredentials: {
newRelic: []
},
qlikSenseEvents: {
influxdb: {
enable: false,
writeFrequency: 20000
},
eventCount: {
enable: false,
influxdb: {
measurementName: 'event_count',
tags: []
}
},
rejectedEventCount: {
enable: false,
influxdb: {
measurementName: 'rejected_event_count'
}
}
},
userEvents: {
enable: false,
excludeUser: [],
udpServerConfig: {
serverHost: 'localhost',
portUserActivityEvents: 9997
},
tags: [],
sendToMQTT: {
enable: false,
postTo: {
everythingTopic: { enable: true, topic: 'test' },
sessionStartTopic: { enable: true, topic: 'test' },
sessionStopTopic: { enable: true, topic: 'test' },
connectionOpenTopic: { enable: true, topic: 'test' },
connectionCloseTopic: { enable: true, topic: 'test' }
}
},
sendToInfluxdb: { enable: true },
sendToNewRelic: {
enable: false,
destinationAccount: [],
scramble: true
}
},
logEvents: {
udpServerConfig: {
serverHost: 'localhost',
portLogEvents: 9996
},
tags: [],
source: {
engine: { enable: false },
proxy: { enable: false },
repository: { enable: false },
scheduler: { enable: false },
qixPerf: { enable: true }
},
categorise: {
enable: false,
ruleDefault: {
enable: false,
category: []
},
rules: []
},
appNameLookup: {
enable: true
},
sendToMQTT: {
enable: false,
baseTopic: 'qliksense/logevent',
postTo: {
baseTopic: true,
subsystemTopics: true
}
},
sendToInfluxdb: { enable: false },
sendToNewRelic: {
enable: false,
destinationAccount: [],
source: {
engine: {
enable: true,
logLevel: { error: true, warn: true }
},
proxy: {
enable: true,
logLevel: { error: true, warn: true }
},
repository: {
enable: true,
logLevel: { error: true, warn: true }
},
scheduler: {
enable: true,
logLevel: { error: true, warn: true }
}
}
}
},
cert: {
clientCert: '/path/to/cert',
clientCertKey: '/path/to/key',
clientCertCA: '/path/to/ca',
clientCertPassphrase: ''
},
appNames: {
enableAppNameExtract: true,
extractInterval: 30000,
hostIP: 'localhost',
enableAppNameLookup: true,
lookupFrequency: 30000
},
userSessions: {
enableSessionExtract: true,
pollingInterval: 30000,
excludeUser: []
},
serversToMonitor: {
pollingInterval: 30000,
rejectUnauthorized: true,
serverTagsDefinition: [],
servers: []
}
}
};
const configPath = await createTempConfig(config);
const result = await verifyConfigFileSchema(configPath);
// Before the fix, this would fail because MQTT validation would reject '<IP of MQTT broker/server>'
// After the fix, this should pass because MQTT is disabled
expect(result).toBe(true);
});
test('should still validate enabled features properly', async () => {
const config = {
'Butler-SOS': {
logLevel: 'info',
fileLogging: true,
logDirectory: 'log',
anonTelemetry: true,
configVisualisation: {
enable: false,
host: 'localhost',
port: 3100,
obfuscate: true
},
heartbeat: {
enable: false,
remoteURL: 'http://example.com',
frequency: 'every 1 hour'
},
dockerHealthCheck: {
enable: false,
port: 12398
},
mqttConfig: {
enable: true, // Enabled with invalid config
brokerHost: '<INVALID>', // Invalid hostname format
brokerPort: 1883,
baseTopic: 'butler-sos/'
},
newRelic: {
enable: false,
event: {
url: 'https://insights-collector.eu01.nr-data.net',
header: [],
attribute: {
static: [],
dynamic: {
butlerSosVersion: { enable: true }
}
}
},
metric: {
destinationAccount: [],
url: 'https://insights-collector.eu01.nr-data.net/metric/v1',
header: [],
dynamic: {
engine: {
memory: { enable: true },
cpu: { enable: true },
calls: { enable: true },
selections: { enable: true },
sessions: { enable: true },
users: { enable: true },
saturated: { enable: true }
},
apps: {
docCount: { enable: true },
activeDocs: { enable: true },
loadedDocs: { enable: true },
inMemoryDocs: { enable: true }
},
cache: {
cache: { enable: true }
},
proxy: {
sessions: { enable: true }
}
},
attribute: {
static: [],
dynamic: {
butlerSosVersion: { enable: true }
}
}
}
},
prometheus: {
enable: false,
host: 'localhost',
port: 9842
},
influxdbConfig: {
enable: false,
host: 'localhost',
port: 8086,
version: 2,
v2Config: {
org: 'org',
bucket: 'bucket',
description: 'description',
token: 'token',
retentionDuration: '30d'
},
v1Config: {
auth: {
enable: false,
username: 'user',
password: 'pass'
},
dbName: 'butler-sos',
retentionPolicy: {
name: 'autogen',
duration: '30d'
}
},
includeFields: {
activeDocs: true,
loadedDocs: true,
inMemoryDocs: true
}
},
uptimeMonitor: {
enable: true,
frequency: 'every 15 minutes',
logLevel: 'verbose',
storeInInfluxdb: {
butlerSOSMemoryUsage: true,
instanceTag: 'DEV'
},
storeNewRelic: {
enable: false,
destinationAccount: [],
metric: {
dynamic: {
butlerMemoryUsage: { enable: true },
butlerUptime: { enable: true }
}
},
attribute: {
static: [],
dynamic: {
butlerVersion: { enable: true }
}
}
}
},
thirdPartyToolsCredentials: {
newRelic: []
},
qlikSenseEvents: {
influxdb: {
enable: false,
writeFrequency: 20000
},
eventCount: {
enable: false,
influxdb: {
measurementName: 'event_count',
tags: []
}
},
rejectedEventCount: {
enable: false,
influxdb: {
measurementName: 'rejected_event_count'
}
}
},
userEvents: {
enable: false,
excludeUser: [],
udpServerConfig: {
serverHost: 'localhost',
portUserActivityEvents: 9997
},
tags: [],
sendToMQTT: {
enable: false,
postTo: {
everythingTopic: { enable: true, topic: 'test' },
sessionStartTopic: { enable: true, topic: 'test' },
sessionStopTopic: { enable: true, topic: 'test' },
connectionOpenTopic: { enable: true, topic: 'test' },
connectionCloseTopic: { enable: true, topic: 'test' }
}
},
sendToInfluxdb: { enable: true },
sendToNewRelic: {
enable: false,
destinationAccount: [],
scramble: true
}
},
logEvents: {
udpServerConfig: {
serverHost: 'localhost',
portLogEvents: 9996
},
tags: [],
source: {
engine: { enable: false },
proxy: { enable: false },
repository: { enable: false },
scheduler: { enable: false },
qixPerf: { enable: true }
},
categorise: {
enable: false,
ruleDefault: {
enable: false,
category: []
},
rules: []
},
appNameLookup: {
enable: true
},
sendToMQTT: {
enable: false,
baseTopic: 'qliksense/logevent',
postTo: {
baseTopic: true,
subsystemTopics: true
}
},
sendToInfluxdb: { enable: false },
sendToNewRelic: {
enable: false,
destinationAccount: [],
source: {
engine: {
enable: true,
logLevel: { error: true, warn: true }
},
proxy: {
enable: true,
logLevel: { error: true, warn: true }
},
repository: {
enable: true,
logLevel: { error: true, warn: true }
},
scheduler: {
enable: true,
logLevel: { error: true, warn: true }
}
}
}
},
cert: {
clientCert: '/path/to/cert',
clientCertKey: '/path/to/key',
clientCertCA: '/path/to/ca',
clientCertPassphrase: ''
},
appNames: {
enableAppNameExtract: true,
extractInterval: 30000,
hostIP: 'localhost',
enableAppNameLookup: true,
lookupFrequency: 30000
},
userSessions: {
enableSessionExtract: true,
pollingInterval: 30000,
excludeUser: []
},
serversToMonitor: {
pollingInterval: 30000,
rejectUnauthorized: true,
serverTagsDefinition: [],
servers: []
}
}
};
const configPath = await createTempConfig(config);
const result = await verifyConfigFileSchema(configPath);
// This should fail because MQTT is enabled with invalid hostname
expect(result).toBe(false);
});
});

View File

@@ -0,0 +1,87 @@
/**
* Test conditional validation against realistic configuration scenarios
*/
import { jest } from '@jest/globals';
import { dump, load } from 'js-yaml';
import fs from 'fs/promises';
import { verifyConfigFileSchema } from '../config-file-verify.js';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
describe('Realistic Config Conditional Validation', () => {
let tempConfigPath;
afterEach(async () => {
if (tempConfigPath) {
try {
await fs.unlink(tempConfigPath);
} catch (err) {
// Ignore if file doesn't exist
}
tempConfigPath = null;
}
});
async function createTempConfig(configObject) {
const tempDir = path.join(__dirname, '../../../tmp');
await fs.mkdir(tempDir, { recursive: true });
tempConfigPath = path.join(tempDir, `test-config-${Date.now()}.yaml`);
const yamlContent = dump(configObject);
await fs.writeFile(tempConfigPath, yamlContent);
return tempConfigPath;
}
test('should allow placeholder/invalid values when MQTT is disabled', async () => {
// Load the production template
const templatePath = path.join(__dirname, '../../../src/config/production_template.yaml');
const templateContent = await fs.readFile(templatePath, 'utf8');
const templateConfig = load(templateContent);
// Modify the MQTT config to have disabled feature with invalid placeholders
templateConfig['Butler-SOS'].mqttConfig = {
enable: false,
brokerHost: '<IP of MQTT broker/server>', // Placeholder from template - should be allowed when disabled
brokerPort: 1883,
baseTopic: 'butler-sos/'
};
// Also disable other features that might have validation issues in the template
templateConfig['Butler-SOS'].newRelic.enable = false;
templateConfig['Butler-SOS'].userEvents.enable = false;
templateConfig['Butler-SOS'].prometheus.enable = false;
templateConfig['Butler-SOS'].configVisualisation.enable = false;
templateConfig['Butler-SOS'].heartbeat.enable = false;
templateConfig['Butler-SOS'].dockerHealthCheck.enable = false;
const configPath = await createTempConfig(templateConfig);
// This should pass validation because features are disabled
const result = await verifyConfigFileSchema(configPath);
expect(result).toBe(true);
});
test('should fail validation when MQTT is enabled with placeholder values', async () => {
// Load the production template
const templatePath = path.join(__dirname, '../../../src/config/production_template.yaml');
const templateContent = await fs.readFile(templatePath, 'utf8');
const templateConfig = load(templateContent);
// Enable MQTT but leave placeholder values that should be invalid
templateConfig['Butler-SOS'].mqttConfig = {
enable: true, // Enable MQTT
brokerHost: '<IP of MQTT broker/server>', // Invalid placeholder - should cause validation to fail
brokerPort: 1883,
baseTopic: 'butler-sos/'
};
const configPath = await createTempConfig(templateConfig);
// This should fail validation because MQTT is enabled with invalid config
const result = await verifyConfigFileSchema(configPath);
expect(result).toBe(false);
});
});

View File

@@ -1,280 +0,0 @@
Butler-SOS:
logLevel: info
fileLogging: true
logDirectory: log
anonTelemetry: true
configVisualisation:
enable: false
host: localhost
port: 3100
obfuscate: true
heartbeat:
enable: false
remoteURL: http://example.com
frequency: every 1 hour
dockerHealthCheck:
enable: false
port: 12398
uptimeMonitor:
enable: true
frequency: every 15 minutes
logLevel: verbose
storeInInfluxdb:
butlerSOSMemoryUsage: true
instanceTag: DEV
storeNewRelic:
enable: false
destinationAccount: []
metric:
dynamic:
butlerMemoryUsage:
enable: true
butlerUptime:
enable: true
attribute:
static: []
dynamic:
butlerVersion:
enable: true
thirdPartyToolsCredentials:
newRelic: []
qlikSenseEvents:
influxdb:
enable: false
writeFrequency: 20000
eventCount:
enable: false
influxdb:
measurementName: event_count
tags: []
rejectedEventCount:
enable: false
influxdb:
measurementName: rejected_event_count
userEvents:
enable: false
excludeUser: []
udpServerConfig:
serverHost: localhost
portUserActivityEvents: 9997
tags: []
sendToMQTT:
enable: false
postTo:
everythingTopic:
enable: true
topic: test
sessionStartTopic:
enable: true
topic: test
sessionStopTopic:
enable: true
topic: test
connectionOpenTopic:
enable: true
topic: test
connectionCloseTopic:
enable: true
topic: test
sendToInfluxdb:
enable: true
sendToNewRelic:
enable: false
destinationAccount: []
scramble: true
logEvents:
udpServerConfig:
serverHost: localhost
portLogEvents: 9996
tags: []
source:
engine:
enable: false
proxy:
enable: false
repository:
enable: false
scheduler:
enable: false
qixPerf:
enable: true
categorise:
enable: false
rules: []
appNameLookup:
enable: true
appAccess:
enable: false
influxdb:
enable: false
measurementName: app_access
rejectedEventCount:
enable: false
influxdb:
measurementName: rejected_app_access
allApps:
enable: false
appsInclude: []
appsExclude: []
someApps:
enable: false
appsInclude: []
sendToMQTT:
enable: false
baseTopic: qliksense/logevent
postTo:
baseTopic: true
subsystemTopics: true
sendToInfluxdb:
enable: false
sendToNewRelic:
enable: false
destinationAccount: []
source:
engine:
enable: true
logLevel:
error: true
warn: true
proxy:
enable: true
logLevel:
error: true
warn: true
repository:
enable: true
logLevel:
error: true
warn: true
scheduler:
enable: true
logLevel:
error: true
warn: true
cert:
clientCert: /path/to/cert
clientCertKey: /path/to/key
clientCertCA: /path/to/ca
clientCertPassphrase: ''
mqttConfig:
enable: false
brokerHost: INVALID_HOST_FORMAT
brokerPort: INVALID_PORT
baseTopic: ''
newRelic:
enable: false
event:
url: https://insights-collector.eu01.nr-data.net
header: []
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
metric:
destinationAccount: []
url: https://insights-collector.eu01.nr-data.net/metric/v1
header: []
dynamic:
engine:
memory:
enable: true
cpu:
enable: true
calls:
enable: true
selections:
enable: true
sessions:
enable: true
users:
enable: true
saturated:
enable: true
apps:
docCount:
enable: true
activeDocs:
enable: true
loadedDocs:
enable: true
inMemoryDocs:
enable: true
cache:
cache:
enable: true
proxy:
sessions:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
prometheus:
enable: false
host: localhost
port: 9842
influxdbConfig:
enable: true
version: 2
hostIP: localhost
hostPort: 8086
auth:
enable: false
username: ''
password: ''
dbName: butler-sos
instanceTag: DEV
v1Config:
host: localhost
port: 8086
database: butler-sos
retentionPolicy: autogen
v2Config:
url: http://localhost:8086
token: token
org: org
bucket: bucket
writeSchedule:
frequency: 10000
tags: []
appNames:
enableAppNameLookup: true
lookupFrequency: 30000
influxdb:
enable: true
newRelic:
enable: true
destinationAccount: []
metric:
dynamic:
butlerSosVersion:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
userSessions:
enableSessionExtract: true
pollingFrequency: 30000
excludeUser: []
influxdb:
enable: true
newRelic:
enable: false
destinationAccount: []
metric:
dynamic:
butlerSosVersion:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
serversToMonitor:
pollingFrequency: 30000
serverTagsDefinition: []
servers: []

View File

@@ -1,280 +0,0 @@
Butler-SOS:
logLevel: info
fileLogging: true
logDirectory: log
anonTelemetry: true
configVisualisation:
enable: false
host: localhost
port: 3100
obfuscate: true
heartbeat:
enable: false
remoteURL: http://example.com
frequency: every 1 hour
dockerHealthCheck:
enable: false
port: 12398
uptimeMonitor:
enable: true
frequency: every 15 minutes
logLevel: verbose
storeInInfluxdb:
butlerSOSMemoryUsage: true
instanceTag: DEV
storeNewRelic:
enable: false
destinationAccount: []
metric:
dynamic:
butlerMemoryUsage:
enable: true
butlerUptime:
enable: true
attribute:
static: []
dynamic:
butlerVersion:
enable: true
thirdPartyToolsCredentials:
newRelic: []
qlikSenseEvents:
influxdb:
enable: false
writeFrequency: 20000
eventCount:
enable: false
influxdb:
measurementName: event_count
tags: []
rejectedEventCount:
enable: false
influxdb:
measurementName: rejected_event_count
userEvents:
enable: false
excludeUser: []
udpServerConfig:
serverHost: localhost
portUserActivityEvents: 9997
tags: []
sendToMQTT:
enable: false
postTo:
everythingTopic:
enable: true
topic: test
sessionStartTopic:
enable: true
topic: test
sessionStopTopic:
enable: true
topic: test
connectionOpenTopic:
enable: true
topic: test
connectionCloseTopic:
enable: true
topic: test
sendToInfluxdb:
enable: true
sendToNewRelic:
enable: false
destinationAccount: []
scramble: true
logEvents:
udpServerConfig:
serverHost: localhost
portLogEvents: 9996
tags: []
source:
engine:
enable: false
proxy:
enable: false
repository:
enable: false
scheduler:
enable: false
qixPerf:
enable: true
categorise:
enable: false
rules: []
appNameLookup:
enable: true
appAccess:
enable: false
influxdb:
enable: false
measurementName: app_access
rejectedEventCount:
enable: false
influxdb:
measurementName: rejected_app_access
allApps:
enable: false
appsInclude: []
appsExclude: []
someApps:
enable: false
appsInclude: []
sendToMQTT:
enable: false
baseTopic: qliksense/logevent
postTo:
baseTopic: true
subsystemTopics: true
sendToInfluxdb:
enable: false
sendToNewRelic:
enable: false
destinationAccount: []
source:
engine:
enable: true
logLevel:
error: true
warn: true
proxy:
enable: true
logLevel:
error: true
warn: true
repository:
enable: true
logLevel:
error: true
warn: true
scheduler:
enable: true
logLevel:
error: true
warn: true
cert:
clientCert: /path/to/cert
clientCertKey: /path/to/key
clientCertCA: /path/to/ca
clientCertPassphrase: ''
mqttConfig:
enable: false
brokerHost: INVALID_HOST_FORMAT
brokerPort: INVALID_PORT
baseTopic: ''
newRelic:
enable: false
event:
url: https://insights-collector.eu01.nr-data.net
header: []
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
metric:
destinationAccount: []
url: https://insights-collector.eu01.nr-data.net/metric/v1
header: []
dynamic:
engine:
memory:
enable: true
cpu:
enable: true
calls:
enable: true
selections:
enable: true
sessions:
enable: true
users:
enable: true
saturated:
enable: true
apps:
docCount:
enable: true
activeDocs:
enable: true
loadedDocs:
enable: true
inMemoryDocs:
enable: true
cache:
cache:
enable: true
proxy:
sessions:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
prometheus:
enable: false
host: localhost
port: 9842
influxdbConfig:
enable: true
version: 2
hostIP: localhost
hostPort: 8086
auth:
enable: false
username: ''
password: ''
dbName: butler-sos
instanceTag: DEV
v1Config:
host: localhost
port: 8086
database: butler-sos
retentionPolicy: autogen
v2Config:
url: http://localhost:8086
token: token
org: org
bucket: bucket
writeSchedule:
frequency: 10000
tags: []
appNames:
enableAppNameLookup: true
lookupFrequency: 30000
influxdb:
enable: true
newRelic:
enable: true
destinationAccount: []
metric:
dynamic:
butlerSosVersion:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
userSessions:
enableSessionExtract: true
pollingFrequency: 30000
excludeUser: []
influxdb:
enable: true
newRelic:
enable: false
destinationAccount: []
metric:
dynamic:
butlerSosVersion:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
serversToMonitor:
pollingFrequency: 30000
serverTagsDefinition: []
servers: []

View File

@@ -1,239 +0,0 @@
Butler-SOS:
logLevel: info
fileLogging: true
logDirectory: log
anonTelemetry: true
configVisualisation:
enable: false
host: localhost
port: 3100
obfuscate: true
heartbeat:
enable: false
remoteURL: http://example.com
frequency: every 1 hour
dockerHealthCheck:
enable: false
port: 12398
uptimeMonitor:
enable: true
frequency: every 15 minutes
logLevel: verbose
storeInInfluxdb:
butlerSOSMemoryUsage: true
instanceTag: DEV
storeNewRelic:
enable: false
destinationAccount: []
metric:
dynamic:
butlerMemoryUsage:
enable: true
butlerUptime:
enable: true
attribute:
static: []
dynamic:
butlerVersion:
enable: true
thirdPartyToolsCredentials:
newRelic: []
qlikSenseEvents:
influxdb:
enable: false
writeFrequency: 20000
eventCount:
enable: false
influxdb:
measurementName: event_count
tags: []
rejectedEventCount:
enable: false
influxdb:
measurementName: rejected_event_count
userEvents:
enable: false
excludeUser: []
udpServerConfig:
serverHost: localhost
portUserActivityEvents: 9997
tags: []
sendToMQTT:
enable: false
postTo:
everythingTopic:
enable: true
topic: test
sessionStartTopic:
enable: true
topic: test
sessionStopTopic:
enable: true
topic: test
connectionOpenTopic:
enable: true
topic: test
connectionCloseTopic:
enable: true
topic: test
sendToInfluxdb:
enable: true
sendToNewRelic:
enable: false
destinationAccount: []
scramble: true
logEvents:
udpServerConfig:
serverHost: localhost
portLogEvents: 9996
tags: []
source:
engine:
enable: false
proxy:
enable: false
repository:
enable: false
scheduler:
enable: false
qixPerf:
enable: true
categorise:
enable: false
ruleDefault:
enable: false
rules: []
appNameLookup:
enable: true
sendToMQTT:
enable: false
baseTopic: qliksense/logevent
postTo:
baseTopic: true
subsystemTopics: true
sendToInfluxdb:
enable: false
sendToNewRelic:
enable: false
destinationAccount: []
source:
engine:
enable: true
logLevel:
error: true
warn: true
proxy:
enable: true
logLevel:
error: true
warn: true
repository:
enable: true
logLevel:
error: true
warn: true
scheduler:
enable: true
logLevel:
error: true
warn: true
cert:
clientCert: /path/to/cert
clientCertKey: /path/to/key
clientCertCA: /path/to/ca
clientCertPassphrase: ''
mqttConfig:
enable: false
brokerHost: INVALID_HOST_FORMAT
brokerPort: INVALID_PORT
baseTopic: ''
newRelic:
enable: false
event:
url: https://insights-collector.eu01.nr-data.net
header: []
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
metric:
destinationAccount: []
url: https://insights-collector.eu01.nr-data.net/metric/v1
header: []
dynamic:
engine:
memory:
enable: true
cpu:
enable: true
calls:
enable: true
selections:
enable: true
sessions:
enable: true
users:
enable: true
saturated:
enable: true
apps:
docCount:
enable: true
activeDocs:
enable: true
loadedDocs:
enable: true
inMemoryDocs:
enable: true
cache:
cache:
enable: true
proxy:
sessions:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
prometheus:
enable: false
host: localhost
port: 9842
influxdbConfig:
enable: false
host: localhost
port: 8086
version: 2
v2Config:
org: org
bucket: bucket
description: description
token: token
retentionDuration: 30d
v1Config:
auth:
enable: false
username: user
password: pass
dbName: butler-sos
retentionPolicy:
name: autogen
duration: 30d
includeFields:
activeDocs: true
loadedDocs: true
inMemoryDocs: true
appNames:
enableAppNameLookup: true
lookupFrequency: 30000
userSessions:
enableSessionExtract: true
pollingInterval: 30000
excludeUser: []
serversToMonitor:
pollingInterval: 30000
rejectUnauthorized: true
serverTagsDefinition: []
servers: []

View File

@@ -1,239 +0,0 @@
Butler-SOS:
logLevel: info
fileLogging: true
logDirectory: log
anonTelemetry: true
configVisualisation:
enable: false
host: localhost
port: 3100
obfuscate: true
heartbeat:
enable: false
remoteURL: http://example.com
frequency: every 1 hour
dockerHealthCheck:
enable: false
port: 12398
uptimeMonitor:
enable: true
frequency: every 15 minutes
logLevel: verbose
storeInInfluxdb:
butlerSOSMemoryUsage: true
instanceTag: DEV
storeNewRelic:
enable: false
destinationAccount: []
metric:
dynamic:
butlerMemoryUsage:
enable: true
butlerUptime:
enable: true
attribute:
static: []
dynamic:
butlerVersion:
enable: true
thirdPartyToolsCredentials:
newRelic: []
qlikSenseEvents:
influxdb:
enable: false
writeFrequency: 20000
eventCount:
enable: false
influxdb:
measurementName: event_count
tags: []
rejectedEventCount:
enable: false
influxdb:
measurementName: rejected_event_count
userEvents:
enable: false
excludeUser: []
udpServerConfig:
serverHost: localhost
portUserActivityEvents: 9997
tags: []
sendToMQTT:
enable: false
postTo:
everythingTopic:
enable: true
topic: test
sessionStartTopic:
enable: true
topic: test
sessionStopTopic:
enable: true
topic: test
connectionOpenTopic:
enable: true
topic: test
connectionCloseTopic:
enable: true
topic: test
sendToInfluxdb:
enable: true
sendToNewRelic:
enable: false
destinationAccount: []
scramble: true
logEvents:
udpServerConfig:
serverHost: localhost
portLogEvents: 9996
tags: []
source:
engine:
enable: false
proxy:
enable: false
repository:
enable: false
scheduler:
enable: false
qixPerf:
enable: true
categorise:
enable: false
ruleDefault:
enable: false
rules: []
appNameLookup:
enable: true
sendToMQTT:
enable: false
baseTopic: qliksense/logevent
postTo:
baseTopic: true
subsystemTopics: true
sendToInfluxdb:
enable: false
sendToNewRelic:
enable: false
destinationAccount: []
source:
engine:
enable: true
logLevel:
error: true
warn: true
proxy:
enable: true
logLevel:
error: true
warn: true
repository:
enable: true
logLevel:
error: true
warn: true
scheduler:
enable: true
logLevel:
error: true
warn: true
cert:
clientCert: /path/to/cert
clientCertKey: /path/to/key
clientCertCA: /path/to/ca
clientCertPassphrase: ''
mqttConfig:
enable: false
brokerHost: INVALID_HOST_FORMAT
brokerPort: INVALID_PORT
baseTopic: ''
newRelic:
enable: false
event:
url: https://insights-collector.eu01.nr-data.net
header: []
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
metric:
destinationAccount: []
url: https://insights-collector.eu01.nr-data.net/metric/v1
header: []
dynamic:
engine:
memory:
enable: true
cpu:
enable: true
calls:
enable: true
selections:
enable: true
sessions:
enable: true
users:
enable: true
saturated:
enable: true
apps:
docCount:
enable: true
activeDocs:
enable: true
loadedDocs:
enable: true
inMemoryDocs:
enable: true
cache:
cache:
enable: true
proxy:
sessions:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
prometheus:
enable: false
host: localhost
port: 9842
influxdbConfig:
enable: false
host: localhost
port: 8086
version: 2
v2Config:
org: org
bucket: bucket
description: description
token: token
retentionDuration: 30d
v1Config:
auth:
enable: false
username: user
password: pass
dbName: butler-sos
retentionPolicy:
name: autogen
duration: 30d
includeFields:
activeDocs: true
loadedDocs: true
inMemoryDocs: true
appNames:
enableAppNameLookup: true
lookupFrequency: 30000
userSessions:
enableSessionExtract: true
pollingInterval: 30000
excludeUser: []
serversToMonitor:
pollingInterval: 30000
rejectUnauthorized: true
serverTagsDefinition: []
servers: []

View File

@@ -1,243 +0,0 @@
Butler-SOS:
logLevel: info
fileLogging: true
logDirectory: log
anonTelemetry: true
configVisualisation:
enable: false
host: localhost
port: 3100
obfuscate: true
heartbeat:
enable: false
remoteURL: http://example.com
frequency: every 1 hour
dockerHealthCheck:
enable: false
port: 12398
uptimeMonitor:
enable: true
frequency: every 15 minutes
logLevel: verbose
storeInInfluxdb:
butlerSOSMemoryUsage: true
instanceTag: DEV
storeNewRelic:
enable: false
destinationAccount: []
metric:
dynamic:
butlerMemoryUsage:
enable: true
butlerUptime:
enable: true
attribute:
static: []
dynamic:
butlerVersion:
enable: true
thirdPartyToolsCredentials:
newRelic: []
qlikSenseEvents:
influxdb:
enable: false
writeFrequency: 20000
eventCount:
enable: false
influxdb:
measurementName: event_count
tags: []
rejectedEventCount:
enable: false
influxdb:
measurementName: rejected_event_count
userEvents:
enable: false
excludeUser: []
udpServerConfig:
serverHost: localhost
portUserActivityEvents: 9997
tags: []
sendToMQTT:
enable: false
postTo:
everythingTopic:
enable: true
topic: test
sessionStartTopic:
enable: true
topic: test
sessionStopTopic:
enable: true
topic: test
connectionOpenTopic:
enable: true
topic: test
connectionCloseTopic:
enable: true
topic: test
sendToInfluxdb:
enable: true
sendToNewRelic:
enable: false
destinationAccount: []
scramble: true
logEvents:
udpServerConfig:
serverHost: localhost
portLogEvents: 9996
tags: []
source:
engine:
enable: false
proxy:
enable: false
repository:
enable: false
scheduler:
enable: false
qixPerf:
enable: true
categorise:
enable: false
ruleDefault:
enable: false
category: []
rules: []
appNameLookup:
enable: true
sendToMQTT:
enable: false
baseTopic: qliksense/logevent
postTo:
baseTopic: true
subsystemTopics: true
sendToInfluxdb:
enable: false
sendToNewRelic:
enable: false
destinationAccount: []
source:
engine:
enable: true
logLevel:
error: true
warn: true
proxy:
enable: true
logLevel:
error: true
warn: true
repository:
enable: true
logLevel:
error: true
warn: true
scheduler:
enable: true
logLevel:
error: true
warn: true
cert:
clientCert: /path/to/cert
clientCertKey: /path/to/key
clientCertCA: /path/to/ca
clientCertPassphrase: ''
mqttConfig:
enable: false
brokerHost: INVALID_HOST_FORMAT
brokerPort: INVALID_PORT
baseTopic: ''
newRelic:
enable: false
event:
url: https://insights-collector.eu01.nr-data.net
header: []
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
metric:
destinationAccount: []
url: https://insights-collector.eu01.nr-data.net/metric/v1
header: []
dynamic:
engine:
memory:
enable: true
cpu:
enable: true
calls:
enable: true
selections:
enable: true
sessions:
enable: true
users:
enable: true
saturated:
enable: true
apps:
docCount:
enable: true
activeDocs:
enable: true
loadedDocs:
enable: true
inMemoryDocs:
enable: true
cache:
cache:
enable: true
proxy:
sessions:
enable: true
attribute:
static: []
dynamic:
butlerSosVersion:
enable: true
prometheus:
enable: false
host: localhost
port: 9842
influxdbConfig:
enable: false
host: localhost
port: 8086
version: 2
v2Config:
org: org
bucket: bucket
description: description
token: token
retentionDuration: 30d
v1Config:
auth:
enable: false
username: user
password: pass
dbName: butler-sos
retentionPolicy:
name: autogen
duration: 30d
includeFields:
activeDocs: true
loadedDocs: true
inMemoryDocs: true
appNames:
enableAppNameExtract: true
extractInterval: 30000
hostIP: localhost
enableAppNameLookup: true
lookupFrequency: 30000
userSessions:
enableSessionExtract: true
pollingInterval: 30000
excludeUser: []
serversToMonitor:
pollingInterval: 30000
rejectUnauthorized: true
serverTagsDefinition: []
servers: []