/* * 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.addthis.hydra.task.output.tree; import java.io.IOException; import java.text.DecimalFormat; import com.addthis.basis.jmx.FieldBasedDynamicMBean; import com.addthis.basis.jmx.WrappingDynamicMBean; import com.google.common.base.Strings; import com.fasterxml.jackson.databind.ObjectMapper; /** * Encapsulation of statistics about a running hydra instance. Registered * in JMX so people can look in on a Hydra remotely. */ public class TreeMapperStats extends WrappingDynamicMBean { private static final DecimalFormat percent = new DecimalFormat("0.0% "); public static final ObjectMapper mapper = new ObjectMapper(); public TreeMapperStats() { this.wrapped = new Snapshot(); } public void setSnapshot(Snapshot snapshot) { this.wrapped = snapshot; } public static class Snapshot extends FieldBasedDynamicMBean { public long streamRate; public long streamWaitTime; public long mapWriteTime; public long localPacketRate; public long ruleProcessRate; public long nodesUpdated; public long totalPackets; public int treeCacheSize; public double treeCacheHitRate; public long treeDbCount; public long freeMemory; public String averageTimestamp; public long runningTime; public Snapshot() { super(true); } public String toString() { try { return mapper.writeValueAsString(this); } catch (IOException io) { return "com.addthis.hydra.task.output.tree.Snapshot:" + io.toString(); } } public String toFormattedString() { StringBuilder msg = new StringBuilder(); msg.append(pad(streamWaitTime, 6)); msg.append(pad(mapWriteTime, 6)); msg.append(pad(streamRate, 6)); msg.append(pad(localPacketRate, 6)); msg.append(pad(ruleProcessRate, 7)); msg.append(pad(nodesUpdated, 6)); msg.append(pad(totalPackets, 8)); msg.append(pad(treeCacheSize, 6)); msg.append(Strings.padStart(percent.format(treeCacheHitRate), 7, ' ')); msg.append(pad(treeDbCount, 6)); msg.append(pad(freeMemory, 6)); msg.append(Strings.padEnd(averageTimestamp, 14, ' ')); return msg.toString(); } /** number right pad utility for log data */ private static String pad(long v, int chars) { String sv = Long.toString(v); String[] opt = {"K", "M", "B", "T"}; DecimalFormat[] dco = {new DecimalFormat("0.00"), new DecimalFormat("0.0"), new DecimalFormat("0")}; int indx = 0; double div = 1000.0d; outer: while ((sv.length() > (chars - 1)) && (indx < opt.length)) { for (DecimalFormat dc : dco) { sv = dc.format(v / div).concat(opt[indx]); if (sv.length() <= (chars - 1)) { break outer; } } div *= 1000; indx++; } return Strings.padEnd(sv, chars, ' '); } } }