/* * Galaxy * Copyright (c) 2012-2014, Parallel Universe Software Co. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 3.0 * as published by the Free Software Foundation. */ package co.paralleluniverse.galaxy.core; import co.paralleluniverse.common.monitoring.Metrics; import co.paralleluniverse.galaxy.core.Message.Type; import com.codahale.metrics.Meter; import static com.codahale.metrics.MetricRegistry.name; import com.codahale.metrics.Timer; import java.util.EnumMap; import java.util.concurrent.TimeUnit; /** * * @author pron */ class MetricsCacheMonitor implements CacheMonitor { private final EnumMap<Message.Type, MessageMonitor> messageMonitors = new EnumMap<Message.Type, MessageMonitor>(Message.Type.class); private final EnumMap<Op.Type, Timer> opMonitors = new EnumMap<Op.Type, Timer>(Op.Type.class); private final EnumMap<MessageDelayReason, DelayedMessageMonitor> messageDelayMonitors = new EnumMap<MessageDelayReason, DelayedMessageMonitor>(MessageDelayReason.class); private final Meter hits = Metrics.meter(metric("hits")); private final Meter staleHits = Metrics.meter(metric("staleHits")); private final Meter misses = Metrics.meter(metric("misses")); private final Meter invalidates = Metrics.meter(metric("invalidates")); private final Meter stalePurges = Metrics.meter(metric("stalePurges")); public MetricsCacheMonitor() { for (Op.Type op : Op.Type.values()) opMonitors.put(op, Metrics.timer(name("co.paralleluniverse", "galaxy", "Cache", "ops", op.name()))); for (Message.Type m : Message.Type.values()) messageMonitors.put(m, new MessageMonitor(m)); for (MessageDelayReason reason : MessageDelayReason.values()) messageDelayMonitors.put(reason, new DelayedMessageMonitor(reason)); } protected final String metric(String name) { return name("co.paralleluniverse", "galaxy", "Cache", name); } @Override public void setMonitoredObject(Object obj) { } @Override public void addHit() { hits.mark(); } @Override public void addStaleHit() { staleHits.mark(); } @Override public void addMiss() { misses.mark(); } @Override public void addInvalidate(int num) { invalidates.mark(num); } @Override public void addMessageSent(Type msg) { messageMonitors.get(msg).addSent(); } @Override public void addMessageReceived(Type msg) { messageMonitors.get(msg).addReceived(); } @Override public void addOp(Op.Type type, long durationMicroSeconds) { opMonitors.get(type).update(durationMicroSeconds, TimeUnit.MICROSECONDS); } @Override public void addMessageHandlingDelay(int numDelayed, long totalDelayNanos, MessageDelayReason reason) { final DelayedMessageMonitor m = messageDelayMonitors.get(reason); m.addMessages(numDelayed); m.addDelay(totalDelayNanos); } @Override public void addStalePurge(int num) { stalePurges.mark(num); } private static class MessageMonitor { private final Meter messagesSent; private final Meter messagesReceived; public MessageMonitor(Message.Type type) { this.messagesSent = Metrics.meter(name("co.paralleluniverse", "galaxy", "Cache", "messages", "sent", type.name())); this.messagesReceived = Metrics.meter(name("co.paralleluniverse", "galaxy", "Cache", "messages", "received", type.name())); } void addSent() { messagesSent.mark(); } void addReceived() { messagesReceived.mark(); } } private static class DelayedMessageMonitor { private final Meter messages; private final Timer delay; public DelayedMessageMonitor(MessageDelayReason reason) { this.messages = Metrics.meter(name("co.paralleluniverse", "galaxy", "Cache", "messages", "messagesDelayed", reason.name())); this.delay = Metrics.timer(name("co.paralleluniverse", "galaxy", "Cache", "messages", "delay", reason.name())); } void addDelay(long nanos) { delay.update(nanos, TimeUnit.NANOSECONDS); } void addMessages(int num) { messages.mark(num); } } }