package scouter.agent.counter.task;
import scouter.agent.Configure;
import scouter.agent.counter.CounterBasket;
import scouter.lang.TimeTypeEnum;
import scouter.lang.pack.PerfCounterPack;
import scouter.lang.value.DecimalValue;
import scouter.lang.value.FloatValue;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashSet;
/**
* This prototype was contributed by jeonwoosung@gmail.com
* Deprecated - This feature is going to move https://github.com/scouter-project/scouter-redis-agent
*/
public class RedisMonitor {
private static HashSet<String> floatSet = new HashSet<String>();
private static HashSet<String> decimalSet = new HashSet<String>();
private Socket s;
static {
floatSet.add("used_cpu_sys");
floatSet.add("used_cpu_user");
floatSet.add("used_cpu_sys_children");
floatSet.add("used_cpu_user_children");
floatSet.add("mem_fragmentation_ratio");
decimalSet.add("uptime_in_seconds");
decimalSet.add("uptime_in_days");
decimalSet.add("lru_clock");
decimalSet.add("connected_clients");
decimalSet.add("connected_slaves");
decimalSet.add("client_longest_output_list");
decimalSet.add("client_biggest_input_buf");
decimalSet.add("blocked_clients");
decimalSet.add("used_memory");
decimalSet.add("used_memory_rss");
decimalSet.add("used_memory_peak");
decimalSet.add("loading");
decimalSet.add("aof_enabled");
decimalSet.add("changes_since_last_save");
decimalSet.add("bgsave_in_progress");
decimalSet.add("bgrewriteaof_in_progress");
decimalSet.add("total_connections_received");
decimalSet.add("total_commands_processed");
decimalSet.add("expired_keys");
decimalSet.add("evicted_keys");
decimalSet.add("keyspace_hits");
decimalSet.add("keyspace_misses");
decimalSet.add("pubsub_channels");
decimalSet.add("pubsub_patterns");
decimalSet.add("latest_fork_usec");
decimalSet.add("vm_enabled");
}
//@Counter(interval = 10000)
public void process(CounterBasket pw) throws IOException {
Configure conf = Configure.getInstance();
boolean redisEnabled = conf.getBoolean("redis_enabled", false);
if (redisEnabled) {
String serverIp = conf.getValue("redis_server_ip", "127.0.0.1");
int serverPort = conf.getInt("redis_server_port", 6379);
String perfInfo = getRedisPerfInfo(serverIp, serverPort);
String[] lines = perfInfo.split("\n");
PerfCounterPack p = pw.getPack(conf.getObjName(), TimeTypeEnum.REALTIME);
for (String line : lines) {
String key = line.substring(0, line.indexOf(':'));
String value = line.substring(line.indexOf(':') + 1);
if (floatSet.contains(key)) {
p.put(key, new FloatValue(Float.valueOf(value.trim())));
}
if (decimalSet.contains(key)) {
p.put(key, new DecimalValue(Long.valueOf(value.trim())));
}
}
}
}
private String getRedisPerfInfo(String serverIp, int serverPort) throws IOException {
s = new Socket(serverIp, serverPort);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
os.write("INFO\r\n".getBytes());
os.flush();
byte[] size = new byte[10];
int i = is.read();
int j = 0;
while (i != '\n') {
size[j++] = (byte) i;
i = is.read();
}
int length = Integer.valueOf(new String(size, 1, j - 2));
byte[] b = new byte[length];
is.read(b);
s.close();
return new String(b);
}
}