HowTo use MoSKito producers
Where to use MoSKito?
MoSKito can be embedded into any application layer (see Chart above).
The goal of using MoSKito is to have a complete picture of "What's going on inside the application?" at this very moment or any time ago, within any supported interval.
NOTE: This documentation describes only how to use log files as the MoSKito Statistics Storage. About another variants, please see MoSKito Central page.
Built-in MoSKito producers
Built-in MoSKito producers are producers that are already implemented and ready to monitor the most essential internal system processes, like memory, threads, etc. They are launched by ProducerRegistryFactory static initializing block.
The distinction of the built-in producers is that they return IStatsProducer.SUBSYSTEM_BUILTIN as the SubSystem value (IStatsProducer.getSubsystem()).
Below is the list of some built-in producers:
Producer | Description | Stats Log Examples |
---|---|---|
BuiltInMemoryProducer | Built-in memory producer, use Runtime.get... memory methods. | JavaRuntimeFree CUR: 7822895672 MIN: 0 MAX: 8211983208 |
BuiltInMemoryPoolProducer | Built-in producer for memory pool monitoring. | MemoryPool-Eden Space-Heap INIT: 2863333376 MIN USED: 91624888 USED: 47647 |
BuiltInMemoryPoolVirtualProducer | Built-in producer for monitoring of virtual memory pools, | Heap memory INIT: 10379526144 MIN USED: 91624888 USED: 480843208 MAX USED: |
BuiltInThreadCountProducer | Built-in producer that counts threads based on jmx provided beans. | Sessions Current: 20 Min: 10 Max: 24 Started: 302 Daemon: 17 |
See also Logging for Built-in producers chapter.
Predefined MoSKito producers
There are some predefined (ready to use) producers already implemented:
Producer | Description | Stats Log Examples |
---|---|---|
CacheProducerWrapper | Stats producer for the ano-prise caches, that implements | userobjects REQ: 6 HIT: 6 HR: 1.0 WR: 3 GC: 0 RO: 0 FU: 0 EX: 0 FI: 0 |
OnDemandStatsProducer | This producer is used when the different method producing stats aren't known at compile time | cumulated TR: 200 TT: 27532 CR: 0 MCR: 2 ERR: 86 Last: 0 Min: 0 Max: 27004 Avg: 137.66 |
Custom MoSKito producers
Custom moskito producers should implements net.java.dev.moskito.core.producers.IStatsProducer interface and
use custom, or one of the predefined, net.java.dev.moskito.core.producers.IStats interface implementation to count stats.
See an example of the custom stats producer for some custom queue below:
Logging MoSKito statistics
MoSKito comes with embedded support for major Logging frameworks, in particular log4j, java.util.logging and, for lazy people, System.outs. In order to attach a logger to a StatsProducer you have to perform following steps:
1. Create a logger
Moskito comes with two loggers: the IntervalStatsLogger and the DefaultStatsLogger (Interval for default logger is 60 sec). The IntervalStatsLogger can be attached to an Interval, the DefaultStatsLogger attaches himself to the unresetable StatsProducer. Both are connecting themself to the internal IntervalUpdateService and listens to the interval updates. As soon as the IntervalUpdate is fired they read the current state of the Producer they are attached to and send it to the LogOutput. Here's an example of how to configure and attach a log4j logger to any producer:
import org.apache.log4j.Logger; import net.java.dev.moskito.core.logging.IntervalStatsLogger; import net.java.dev.moskito.core.logging.DefaultStatsLogger; import net.java.dev.moskito.core.logging.Log4JOutput; import net.java.dev.moskito.core.stats.DefaultIntervals; .... IStatsProducer producer = ...; // add moskito logger new DefaultStatsLogger(producer, new Log4JOutput(Logger.getLogger("MoskitoDefault"))); new IntervalStatsLogger(producer, DefaultIntervals.FIVE_MINUTES, new Log4JOutput(Logger.getLogger("Moskito5m"))); new IntervalStatsLogger(producer, DefaultIntervals.FIFTEEN_MINUTES, new Log4JOutput(Logger.getLogger("Moskito15m"))); new IntervalStatsLogger(producer, DefaultIntervals.ONE_HOUR, new Log4JOutput(Logger.getLogger("Moskito1h"))); new IntervalStatsLogger(producer, DefaultIntervals.ONE_DAY, new Log4JOutput(Logger.getLogger("Moskito1d"))); //end moskito logger
2. Configuring Log4J
Attaching a log4j logger to a moskito producer is only half of the work, you still need to tell log4j where to log it, here is an example which creates local files for each interval and logs into them:
2.1 Define Appenders
<!-- MOSKITO APPENDER DECLARATION START --> <appender name="MoskitoDefaultFileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/monitoring_msk.log" /> <param name="MaxFileSize" value="100MB" /> <param name="MaxBackupIndex" value="5" /> <param name="Threshold" value="INFO" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%r %d{ISO8601} %m%n"/> </layout> </appender> <appender name="Moskito5mFileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/monitoring_msk_5m.log" /> <param name="MaxFileSize" value="100MB" /> <param name="MaxBackupIndex" value="5" /> <param name="Threshold" value="INFO" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%r %d{ISO8601} %m%n"/> </layout> </appender> <appender name="Moskito15mFileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/monitoring_msk_15m.log" /> <param name="MaxFileSize" value="100MB" /> <param name="MaxBackupIndex" value="5" /> <param name="Threshold" value="DEBUG" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%r %d{ISO8601} %m%n"/> </layout> </appender> <appender name="Moskito1hFileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/monitoring_msk_1h.log" /> <param name="MaxFileSize" value="100MB" /> <param name="MaxBackupIndex" value="5" /> <param name="Threshold" value="INFO" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%r %d{ISO8601} %m%n"/> </layout> </appender> <appender name="Moskito1dFileAppender" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/monitoring_msk_1d.log" /> <param name="MaxFileSize" value="100MB" /> <param name="MaxBackupIndex" value="5" /> <param name="Threshold" value="INFO" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%r %d{ISO8601} %m%n"/> </layout> </appender> <!-- MOSKITO APPENDLER DECLARATION END -->
2.2 Define Loggers
NOTE: The LogLevel should be INFO.
<!-- MOSKITO LOGGER DECLARATION START --> <logger name="MoskitoDefault" additivity="false"> <level value="INFO"/> <appender-ref ref="MoskitoDefaultFileAppender"/> </logger> <logger name="Moskito5m" additivity="false"> <level value="INFO"/> <appender-ref ref="Moskito5mFileAppender"/> </logger> <logger name="Moskito15m" additivity="false"> <level value="INFO"/> <appender-ref ref="Moskito15mFileAppender"/> </logger> <logger name="Moskito1h" additivity="false"> <level value="INFO"/> <appender-ref ref="Moskito1hFileAppender"/> </logger> <logger name="Moskito1d" additivity="false"> <level value="INFO"/> <appender-ref ref="Moskito1dFileAppender"/> </logger> <!-- MOSKITO LOGGER DECLARATION END -->
Logging for Built-in stats producers
To have built-in producers stats logged, the next code should be executed once, while initializing (Plus there should be MoskitoBIXXAppendler appendlers and MoskitoBiXX loggers configured in the log4j.xml):
IProducerRegistryAPI api = new ProducerRegistryAPIFactory().createProducerRegistryAPI(); List<IStatsProducer> stats = api.getAllProducersBySubsystem(IStatsProducer.SUBSYSTEM_BUILTIN); for (IStatsProducer producer : stats) { new DefaultStatsLogger(producer, new Log4JOutput(Logger.getLogger("MoskitoBIDefault"))); new IntervalStatsLogger(producer, DefaultIntervals.FIVE_MINUTES, new Log4JOutput(Logger.getLogger("MoskitoBI5m"))); new IntervalStatsLogger(producer, DefaultIntervals.FIFTEEN_MINUTES, new Log4JOutput(Logger.getLogger("MoskitoBI15m"))); new IntervalStatsLogger(producer, DefaultIntervals.ONE_HOUR, new Log4JOutput(Logger.getLogger("MoskitoBI1h"))); new IntervalStatsLogger(producer, DefaultIntervals.ONE_DAY, new Log4JOutput(Logger.getLogger("MoskitoBI1d"))); }