package org.skywalking.apm.collector.worker.storage;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.message.StringFormattedMessage;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.skywalking.apm.collector.actor.AbstractLocalSyncWorker;
import org.skywalking.apm.collector.worker.config.EsConfig;
import java.util.LinkedList;
import java.util.List;
/**
* @author pengys5
*/
public enum PersistenceTimer {
INSTANCE;
private Logger logger = LogManager.getFormatterLogger(PersistenceTimer.class);
public void boot() {
logger.info("persistence timer start");
final long timeInterval = EsConfig.Es.Persistence.Timer.VALUE * 1000;
Runnable runnable = () -> {
while (true) {
try {
extractDataAndSave();
Thread.sleep(timeInterval);
} catch (Throwable e) {
logger.error(e);
}
}
};
Thread persistenceThread = new Thread(runnable);
persistenceThread.setName("timerPersistence");
persistenceThread.start();
}
private void extractDataAndSave() {
List<IndexRequestBuilder> dataList = new LinkedList<>();
List<AbstractLocalSyncWorker> workers = PersistenceWorkerListener.INSTANCE.getWorkers();
for (AbstractLocalSyncWorker worker : workers) {
logger.info("worker role name: %s", worker.getRole().roleName());
try {
worker.allocateJob(new FlushAndSwitch(), dataList);
} catch (Exception e) {
logger.error(new StringFormattedMessage("flush persistence worker data error, worker role name: %s", worker.getRole().roleName()), e);
}
}
EsClient.INSTANCE.bulk(dataList);
}
}