Skip to content

Commit

Permalink
Merge pull request #51 from joschi/configuration_refactoring
Browse files Browse the repository at this point in the history
Configuration refactoring
  • Loading branch information
Lennart Koopmann committed Oct 27, 2011
2 parents 2269b3c + 72981f1 commit 1ac6103
Show file tree
Hide file tree
Showing 5 changed files with 317 additions and 406 deletions.
10 changes: 10 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,16 @@
<artifactId>commons-io</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.github.joschi</groupId>
<artifactId>jadconfig</artifactId>
<version>0.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>

<build>
Expand Down
309 changes: 167 additions & 142 deletions src/main/java/org/graylog2/Configuration.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@

package org.graylog2;

import com.github.joschi.jadconfig.Parameter;
import com.github.joschi.jadconfig.ValidationException;
import com.github.joschi.jadconfig.ValidatorMethod;
import com.github.joschi.jadconfig.converters.StringListConverter;
import com.github.joschi.jadconfig.validators.InetPortValidator;
import com.github.joschi.jadconfig.validators.PositiveIntegerValidator;
import com.github.joschi.jadconfig.validators.PositiveLongValidator;
import com.mongodb.ServerAddress;
import org.apache.log4j.Logger;
import org.graylog2.messagehandlers.amqp.AMQPSubscribedQueue;
Expand All @@ -29,7 +36,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

/**
* Helper class to hold configuration of Graylog2
Expand All @@ -41,58 +47,169 @@ public class Configuration {

private static final Logger LOG = Logger.getLogger(Configuration.class);

// Define required configuration fields.
private static final String[] requiredProperties = {
"syslog_listen_port",
"syslog_protocol",
"mongodb_useauth",
"mongodb_user",
"mongodb_password",
"mongodb_database",
"mongodb_port",
"messages_collection_size",
"use_gelf",
"gelf_listen_port",
};

private static final String[] allowedSyslogProtocols = { "tcp", "udp" };
private static final String[] deprecatedProperties = { "rrd_storage_dir" };
private static final String[] numericalPositiveProperties = {
"mongodb_port",
"mongodb_max_connections",
"mongodb_threads_allowed_to_block_multiplier",
"messages_collection_size",
"gelf_listen_port",
"syslog_listen_port",
"amqp_port",
"forwarder_loggly_timeout",
};


private Properties properties;

public Configuration(Properties properties) {

if(properties == null) {
throw new IllegalArgumentException("Properties must not be null");
}
@Parameter(value = "syslog_listen_port", required = true, validator = InetPortValidator.class)
private int syslogListenPort = 514;

@Parameter(value = "syslog_protocol", required = true)
private String syslogProtocol = "udp";

@Parameter(value = "mongodb_useauth", required = true)
private boolean mongoUseAuth = false;

@Parameter(value = "mongodb_user", required = true)
private String mongoUser;

@Parameter(value = "mongodb_password", required = true)
private String mongoPassword;

@Parameter(value = "mongodb_database", required = true)
private String mongoDatabase = "graylog2";

@Parameter(value = "mongodb_host", required = true)
private String mongoHost = "localhost";

@Parameter(value = "mongodb_port", required = true, validator = InetPortValidator.class)
private int mongoPort = 27017;

@Parameter(value = "mongodb_max_connections", validator = PositiveIntegerValidator.class)
private int mongoMaxConnections = 1000;

@Parameter(value = "mongodb_threads_allowed_to_block_multiplier", validator = PositiveIntegerValidator.class)
private int mongoThreadsAllowedToBlockMultiplier = 5;

@Parameter(value = "mongodb_replica_set", converter = StringListConverter.class)
private List<String> mongoReplicaSet;

@Parameter(value = "messages_collection_size", required = true, validator = PositiveLongValidator.class)
private long messagesCollectionSize = 50*1000*1000;

@Parameter(value = "use_gelf", required = true)
private boolean useGELF = false;

@Parameter(value = "gelf_listen_port", required = true, validator = InetPortValidator.class)
private int gelfListenPort = 12201;

@Parameter("amqp_enabled")
private boolean amqpEnabled = false;

@Parameter("amqp_host")
private String amqpHost = "localhost";

@Parameter(value = "amqp_port", validator = InetPortValidator.class)
private int amqpPort = 5672;

@Parameter(value = "amqp_subscribed_queues", converter = StringListConverter.class)
private List<String> amqpSubscribedQueues;

@Parameter("amqp_username")
private String amqpUsername = "guest";

@Parameter("amqp_password")
private String amqpPassword = "guest";

@Parameter("amqp_virtualhost")
private String amqpVirtualhost = "/";

@Parameter(value = "forwarder_loggly_timeout", validator = PositiveIntegerValidator.class)
private int forwarderLogglyTimeout = 3;

@Parameter("rules_file")
private String droolsRulesFile;

public int getSyslogListenPort() {
return syslogListenPort;
}

public String getSyslogProtocol() {
return syslogProtocol;
}

public boolean isMongoUseAuth() {
return mongoUseAuth;
}

public String getMongoUser() {
return mongoUser;
}

public String getMongoPassword() {
return mongoPassword;
}

public String getMongoDatabase() {
return mongoDatabase;
}

public int getMongoPort() {
return mongoPort;
}

public String getMongoHost() {
return mongoHost;
}

public int getMongoMaxConnections() {
return mongoMaxConnections;
}

public int getMongoThreadsAllowedToBlockMultiplier() {
return mongoThreadsAllowedToBlockMultiplier;
}

public long getMessagesCollectionSize() {
return messagesCollectionSize;
}

public boolean isUseGELF() {
return useGELF;
}

public int getGelfListenPort() {
return gelfListenPort;
}

this.properties = properties;
public boolean isAmqpEnabled() {
return amqpEnabled;
}

public List<ServerAddress> getMongoDBReplicaSetServers() {
public String getAmqpHost() {
return amqpHost;
}

public int getAmqpPort() {
return amqpPort;
}

public String getAmqpUsername() {
return amqpUsername;
}

public String getAmqpPassword() {
return amqpPassword;
}

public String getAmqpVirtualhost() {
return amqpVirtualhost;
}

public int getForwarderLogglyTimeout() {
return forwarderLogglyTimeout*1000;
}

public String getDroolsRulesFile() {
return droolsRulesFile;
}

public List<ServerAddress> getMongoReplicaSet() {
List<ServerAddress> replicaServers = new ArrayList<ServerAddress>();

String rawSet = get("mongodb_replica_set");
List<String> rawSet = mongoReplicaSet;

if (rawSet == null || rawSet.isEmpty()) {
return null;
}

// Get every host:port pair
String[] hosts = rawSet.split(",");

for (String host : hosts) {
for (String host : rawSet) {
// Split host:port.
String[] replicaTarget = host.split(":");

Expand All @@ -114,33 +231,17 @@ public List<ServerAddress> getMongoDBReplicaSetServers() {
return replicaServers;
}

public int getMaximumMongoDBConnections() {
return getInteger("mongodb_max_connections", 1000);
}


public int getThreadsAllowedToBlockMultiplier() {
return getInteger("mongodb_threads_allowed_to_block_multiplier", 5);
}

public int getLogglyTimeout() {
int timeout = getInteger("forwarder_loggly_timeout", 3);

return timeout*1000;
}

public List<AMQPSubscribedQueue> getAMQPSubscribedQueues() {
public List<AMQPSubscribedQueue> getAmqpSubscribedQueues() {
List<AMQPSubscribedQueue> queueList = new ArrayList<AMQPSubscribedQueue>();

String rawQueues = get("amqp_subscribed_queues");
List<String> rawQueues = amqpSubscribedQueues;

if (rawQueues == null || rawQueues.isEmpty()) {
return null;
}

// Get every queue.
String[] queues = rawQueues.split(",");
for (String queue : queues) {
for (String queue : rawQueues) {
String[] queueDefinition = queue.split(":");

// Check if valid.
Expand All @@ -159,88 +260,12 @@ public List<AMQPSubscribedQueue> getAMQPSubscribedQueues() {
return queueList;
}

public void validate() throws ConfigurationException {

for (String requiredProperty : requiredProperties) {
String value = get(requiredProperty);

if (value == null || value.isEmpty()) {
throw new ConfigurationException("Mandatory configuration option " + requiredProperty + " not set.");
}
}

// Check if numerical properties are positive
for (String property : numericalPositiveProperties) {

int value = getInteger(property, 0);

if (value < 0) {
throw new ConfigurationException("Configuration option " + property + " must be a positive integer.");
}
}

// Check if a MongoDB replica set or host is defined.
if (!contains("mongodb_host") && !contains("mongodb_replica_set")) {
throw new ConfigurationException("Neither MongoDB host (mongodb_host) nor replica set (mongodb_replica_set) has been defined.");
}
@ValidatorMethod
public void validate() throws ValidationException {

// Is the syslog_procotol valid?
if(!Arrays.asList(allowedSyslogProtocols).contains(get("syslog_protocol"))) {
throw new ConfigurationException("Invalid syslog_protocol: " + get("syslog_protocol"));
if(!Arrays.asList("tcp", "udp").contains(getSyslogProtocol())) {
throw new ValidationException("Invalid syslog_protocol: " + getSyslogProtocol());
}

// Print out a deprecation warning if any deprecated configuration option is set.
for (String deprecatedProperty : deprecatedProperties) {

if (get(deprecatedProperty) != null) {
LOG.warn("Configuration option " + deprecatedProperty + " has been deprecated.");
}
}
}

public String get(String property) {

return properties.getProperty(property);
}

public int getInteger(String property, int defaultValue) {

String value = get(property);
int result = defaultValue;

if(value != null) {
try {
result = Integer.parseInt(value);
} catch (NumberFormatException ex) {
LOG.warn("Couldn't convert configuration property " + property + " to Integer", ex);
}
}

return result;
}

public long getLong(String property, long defaultValue) {

String value = get(property);
long result = defaultValue;

if(value != null) {
try {
result = Long.parseLong(value);
} catch (NumberFormatException ex) {
LOG.warn("Couldn't convert configuration property " + property + " to Long", ex);
}
}

return result;
}

public boolean contains(String property) {
return properties.containsKey(property);
}

public boolean getBoolean(String property) {

return Boolean.parseBoolean(get(property));
}
}
Loading

0 comments on commit 1ac6103

Please sign in to comment.