package de.slackspace.alfa.elasticsearch;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.client.Client;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.carrotsearch.hppc.ObjectLookupContainer;
import com.carrotsearch.hppc.cursors.ObjectCursor;
import de.slackspace.alfa.date.DateFormatter;
import de.slackspace.alfa.exception.ConnectionException;
public class LogCleaner implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(LogCleaner.class);
private Client client;
private int maxKeepDays;
public LogCleaner(Client client, int maxKeepDays) {
this.client = client;
this.maxKeepDays = maxKeepDays;
}
public void deleteOldLogs() throws ConnectionException {
if(LOGGER.isDebugEnabled()) {
LOGGER.debug("Deleting old logs...");
}
List<String> indicesToKeep = createIndicesToKeep();
ObjectLookupContainer<String> indizes = client.admin().cluster().state(new ClusterStateRequest()).actionGet().getState().getMetaData().getIndices().keys();
Iterator<ObjectCursor<String>> iter = indizes.iterator();
if(LOGGER.isDebugEnabled()) {
LOGGER.debug("Found " + indizes.size() + " indices.");
}
while(iter.hasNext()) {
ObjectCursor<String> cursor = iter.next();
if(!indicesToKeep.contains(cursor.value)) {
DeleteIndexResponse delete = client.admin().indices().delete(new DeleteIndexRequest(cursor.value)).actionGet();
if (!delete.isAcknowledged()) {
LOGGER.warn("Could not delete index " + cursor.value);
}
}
}
if(LOGGER.isDebugEnabled()) {
LOGGER.debug("Old logs deleted.");
}
}
@Override
public void run() {
try {
deleteOldLogs();
}
catch(Throwable t) {
LOGGER.error("An error occurred during cleaning old logs. Error was: ", t);
}
}
private List<String> createIndicesToKeep() {
List<String> indicesToKeep = new ArrayList<String>();
indicesToKeep.add("kibana-int"); //do not delete internal kibana index
indicesToKeep.add(".kibana"); //do not delete internal kibana index
for (int i = 0; i < maxKeepDays + 1; i++) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, i * -1);
indicesToKeep.add("logs-" + DateFormatter.toYYYYMMDD(cal.getTime()));
indicesToKeep.add("perfcounters-" + DateFormatter.toYYYYMMDD(cal.getTime()));
}
return indicesToKeep;
}
public int getMaxKeepDays() {
return maxKeepDays;
}
}