/*
* Copyright 2012 Nodeable Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.streamreduce.core.transformer.message;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
import com.mongodb.BasicDBObject;
import com.streamreduce.core.event.EventId;
import com.streamreduce.core.model.Event;
import com.streamreduce.core.model.messages.details.SobaMessageDetails;
import com.streamreduce.util.MessageUtils;
public class AgentMessageTransformer extends SobaMessageTransformer implements MessageTransformer {
public AgentMessageTransformer(Properties messageProperties, SobaMessageDetails messageDetails) {
super(messageProperties, messageDetails);
}
/**
* {@inheritDoc}
*/
@Override
public String doTransform(Event event) {
EventId eventId = event.getEventId();
Map<String, Object> eventMetadata = event.getMetadata();
String msg = "";
switch (eventId) {
case ACTIVITY:
BasicDBObject payload = (BasicDBObject) eventMetadata.get("payload");
StringBuilder sb = new StringBuilder();
sb.append("Current system overview at ")
.append(eventMetadata.get("activityGenerated")) // Should we format this?
.append("\n\n");
sb.append("Uptime: ")
.append(payload.getString("uptime"))
.append("s\n")
.append("Disk usage:\n");
BasicDBObject partitionsObj = (BasicDBObject) payload.get("partitions");
Set<String> partitions = new TreeSet<>(partitionsObj.keySet());
for (String key : partitions) {
BasicDBObject partition = (BasicDBObject) partitionsObj.get(key);
double totalAsKb = partition.getDouble("total");
// Certain devices show as 0.00GB and should be pruned
if (totalAsKb == 0) {
continue;
}
double totalAsGB = MessageUtils.kbToGB(totalAsKb);
double usedAsGB = MessageUtils.kbToGB(partition.getDouble("used"));
double freeAsGB = MessageUtils.kbToGB(partition.getDouble("free"));
sb.append(" ")
.append(key)
.append(": Total ")
.append(MessageUtils.roundAndTruncate(totalAsGB, 2))
.append("GB, Used ")
.append(MessageUtils.roundAndTruncate(usedAsGB, 2))
.append("GB, Free ")
.append(MessageUtils.roundAndTruncate(freeAsGB, 2))
.append("GB\n");
}
sb.append("Disk I/O:\n");
BasicDBObject diskIO = (BasicDBObject) payload.get("disk_io");
Set<String> disks = new TreeSet<>(diskIO.keySet());
if (disks.size() == 0) {
sb.append(" Unavailable\n");
} else {
for (String key : disks) {
BasicDBObject disk = (BasicDBObject) diskIO.get(key);
long reads = disk.getLong("read_count");
long writes = disk.getLong("write_count");
double gbRead = MessageUtils.kbToGB(disk.getLong("read_kbytes"));
double gbWrite = MessageUtils.kbToGB(disk.getLong("write_kbytes"));
long readSecs = disk.getLong("read_time");
long writeSecs = disk.getLong("write_time");
sb.append(" ")
.append(key)
.append(": Reads ")
.append(reads)
.append(", Writes ")
.append(writes)
.append(", GB Read ")
.append(MessageUtils.roundAndTruncate(gbRead, 2))
.append(", GB Written ")
.append(MessageUtils.roundAndTruncate(gbWrite, 2))
.append(", Read Time ")
.append(readSecs)
.append("s, Write Time ")
.append(writeSecs)
.append("s\n");
}
}
sb.append("Network I/O:\n");
BasicDBObject netIO = (BasicDBObject) payload.get("network_io");
Set<String> nics = new TreeSet<>(netIO.keySet());
int nicsDisplayed = 0;
for (String key : nics) {
BasicDBObject nic = (BasicDBObject) netIO.get(key);
long packetsIn = nic.getInt("packets_in");
long packetsOut = nic.getInt("packets_out");
// Certain devices show 0 packets in/out and should be pruned
if (packetsIn == 0 && packetsOut == 0) {
continue;
}
double gbIn = MessageUtils.kbToGB(nic.getLong("kbytes_in"));
double gbOut = MessageUtils.kbToGB(nic.getLong("kbytes_out"));
sb.append(" ")
.append(key)
.append(": Packets In ")
.append(packetsIn)
.append(", Packets Out ")
.append(packetsOut)
.append(", GB In ")
.append(MessageUtils.roundAndTruncate(gbIn, 2))
.append(", GB Out ")
.append(MessageUtils.roundAndTruncate(gbOut, 2))
.append("\n");
nicsDisplayed++;
}
if (nicsDisplayed == 0) {
sb.append(" Unavailable\n");
}
sb.append("Load: 1m ")
.append(MessageUtils.roundAndTruncate(payload.getDouble("load_avg_0"), 2))
.append(", ")
.append("5m ")
.append(MessageUtils.roundAndTruncate(payload.getDouble("load_avg_1"), 2))
.append(", ")
.append("15m ")
.append(MessageUtils.roundAndTruncate(payload.getDouble("load_avg_2"), 2))
.append("\n");
float gbTotalRAM = (float) MessageUtils.kbToGB(payload.getLong("phy_ram_total"));
float gbUsedRAM = (float) MessageUtils.kbToGB(payload.getLong("phy_ram_used"));
float gbFreeRAM = (float) MessageUtils.kbToGB(payload.getLong("phy_ram_free"));
sb.append("Real Mem: Total ")
.append(MessageUtils.roundAndTruncate(gbTotalRAM, 2))
.append("GB, Used ")
.append(MessageUtils.roundAndTruncate(gbUsedRAM, 2))
.append("GB, Free ")
.append(MessageUtils.roundAndTruncate(gbFreeRAM, 2))
.append("GB\n");
double gbTotalVRAM = MessageUtils.kbToGB(payload.getLong("vir_ram_total"));
double gbUsedVRAM = MessageUtils.kbToGB(payload.getLong("vir_ram_used"));
double gbFreeVRAM = MessageUtils.kbToGB(payload.getLong("vir_ram_free"));
sb.append("Virt Mem: Total ")
.append(MessageUtils.roundAndTruncate(gbTotalVRAM, 2))
.append("GB, Used ")
.append(MessageUtils.roundAndTruncate(gbUsedVRAM, 2))
.append("GB, Free ")
.append(MessageUtils.roundAndTruncate(gbFreeVRAM, 2))
.append("GB\n");
sb.append("Processes: ")
.append(payload.getInt("processes"))
.append("\n");
sb.append("Users: Total ")
.append(payload.getInt("users_total"))
.append(", Unique ")
.append(payload.getInt("users_unique"))
.append("\n");
msg = sb.toString();
break;
default:
super.doTransform(event);
break;
}
return msg;
}
}