package io.analytica.agent.plugins.net.influx;
import io.analytica.api.KProcess;
import io.analytica.api.KProcessConnector;
import io.vertigo.lang.Assertion;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.influxdb.InfluxDB;
import org.influxdb.InfluxDB.ConsistencyLevel;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.BatchPoints;
import org.influxdb.dto.Point;
public final class InfluxProcessConnector implements KProcessConnector {
private final String appName;
private final List<KProcess> processes = new ArrayList<>(); //buffer
private final InfluxDB influxDB;
private static boolean ping(final String host) {
try {
final InetAddress inet = InetAddress.getByName(host);
return inet.getAddress() != null;
} catch (final IOException e) {
return false;
}
}
public InfluxProcessConnector(final String appName) {
Assertion.checkArgNotEmpty(appName);
//-----
this.appName = appName;
if (ping("kasper-redis")) {
influxDB = InfluxDBFactory.connect("http://kasper-redis:8086", "scott", "tiger");
//influxDB.deleteDatabase(appName);
influxDB.createDatabase(appName);
influxDB.enableBatch(2000, 5000, TimeUnit.MILLISECONDS);
} else {
influxDB = null;
}
}
@Override
public synchronized void add(final KProcess process) {
if (influxDB != null) {
processes.add(process);
if (processes.size() > 5000) {
flush();
}
}
}
private void flush() {
final BatchPoints batchPoints = BatchPoints
.database(appName)
.retentionPolicy("default")
.consistency(ConsistencyLevel.ALL)
.build();
for (final KProcess process : processes) {
batchPoints.point(processToPoint(process));
for (final KProcess subProcess : process.getSubProcesses()) {
batchPoints.point(processToPoint(subProcess));
}
}
influxDB.write(batchPoints);
processes.clear();
}
private static Point processToPoint(final KProcess process) {
final Map measures = process.getMeasures();
return Point.measurement(process.getType())
.time(process.getStartDate().getTime(), TimeUnit.MILLISECONDS)
.tag("category", process.getCategory())
.tag("location", process.getLocation())
.tag(process.getMetaDatas())
.fields(measures)
.build();
}
}