Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MoSKito for JUGF

MoSKito for JUGF

Slides from MoSKito presentation at the Java User Group Frankfurt

Leon Rosenberg

November 13, 2013
Tweet

More Decks by Leon Rosenberg

Other Decks in Technology

Transcript

  1. 3 Who am I? Leon Rosenberg - Architect, DevOps. !

    1997 - Started programming with Java. ! 2000 - Started building Portals.! 2003 - Founded anotheria.net.! 2007 - Started MoSKito.
  2. Why MoSKito MoSKito is a framework that simplifies your efforts

    to measure and optimize the performance and runtime behavior of your application and makes your architectural decisions visible and measurable. 9
  3. What is MoSKito MoSKito is a multi-purpose, non-invasive, interval based

    monitoring system kit for collection, storage and instant analysis of application’s performance and behavior data. 10
  4. Key Features Collect and Store.! Inspect and Monitor.! Analyze and

    Alert.! Continuos production profiling without performance impacts with Journeys. 11
  5. Interval based. The behavior of a system depends on hour,

    weekday, weather, holidays and good karma.! Large amounts of collected data make monitoring nonsensitive to anomalies. ! Inspection of short intervals offers more understanding about system’s behavior. 5m t 5m 5m 5m 5m 5m 5m 15m 15m now 12
  6. Core Concepts 13 Do something measureable, produce stats. Service, Filter,

    Action, Resource, Gateway, Payment Provider. Statistic of a use case, i.e. method name, url, cumulated producer statistics Value type, i.e. request count, avg duration, error count, cache hits, payments etc. Container for different values for intervals
  7. Core Sections Producers and Stats - gather monitoring data.! Thresholds

    - monitor changes in critical sections of the application.! Accumulators - builds trends and allow visual analysis. ! Journeys - make inner life of the application visible. 14
  8. 15 A picture is worth 1000 words...  ... and

    live presentation is worth 1000 pictures.

  9. Integration AOP / CDI / Spring! Proxies! WEB! ! Guide:

    https:// confluence.opensource.anotheria.net/display/ MSK/Integration+Guide 16
  10. AOP 17 @Monitor public class YourClass { public class YourClass

    { @Monitor public void firstMonitoredMethod(){... @Monitor public void secondMonitoredMethod(){... public void notMonitoredMethod(){... @Monitor public class YourClass { public void thisMethodWillBeMonitored(){... @DontMonitor public void thisMethodWillBeExcludedFromMonitoring(){ @Count public class PaymentCounter { @Count public class PaymentCounter { /** * Electronic card payment (lastchrifteinzug in germany). */ public void ec(){} /** * Credit card payment. */ public void cc(){} /** * Payment via paypal. */ public void paypal(){} }
  11. AOP + MAVEN 18 <dependencies> <dependency> <groupId>net.anotheria</groupId> <artifactId>moskito-core</artifactId> <version>2.3.2</version> </dependency>

    <dependency> <groupId>net.anotheria</groupId> <artifactId>moskito-aop</artifactId> <version>2.3.2</version> </dependency> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.4</version> <configuration> <aspectLibraries> <aspectLibrary> <groupId>net.anotheria</groupId> <artifactId>moskito-aop</artifactId> </aspectLibrary> </aspectLibraries> <source>1.6</source> <target>1.6</target> </configuration> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
  12. CDI 19 @Monitor @ProducerRuntime(producerId=”Foo”, category=”my”) public class YourClass { public

    class YourClass { @Monitor public void firstMonitoredMethod(){... @Monitor(“dao”) public void secondMonitoredMethod(){... public void notMonitoredMethod(){... @Monitor(MonitoringCategorySelector.WEB) public class YourClass { public void thisMethodWillBeMonitored(){... @DontMonitor public void thisMethodWillBeExcludedFromMonitoring(){ @Count public class PaymentCounter { @Count public class PaymentCounter { /** * Electronic card payment (lastchrifteinzug in germany). */ public void ec(){} /** * Credit card payment. */ public void cc(){} /** * Payment via paypal. */ public void paypal(){} }
  13. CDI 20 <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"! xsi:schemaLocation="! http://java.sun.com/xml/ns/javaee! http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">! <interceptors>! <class>net.anotheria.moskito.integration.cdi.CountInterceptor</class>!

    <class>net.anotheria.moskito.integration.cdi.CallInterceptor</class>! ! <class>net.anotheria.moskito.integration.cdi.WebCallInterceptor<class>! <class>net.anotheria.moskito.integration.cdi.ServiceCallInterceptor</class>! <class>net.anotheria.moskito.integration.cdi.DaoCallInterceptor</class>! ! <class>de.ayn.integration.moskito.ApiCallInterceptor</class>! <class>de.ayn.integration.moskito.MobileApiCallInterceptor</class>! <class>de.ayn.integration.moskito.WebCallInterceptor</class>! </interceptors>! </beans>
  14. Proxies 21 public interface SimpleService{ void doSomethingMethod(); } public class

    SimpleServiceImpl implements SimpleService{ public void doSomethingMethod(){ } } SimpleService service = ProxyUtils.createServiceInstance(new SimpleServiceImpl(), "default", SimpleService.class); SimpleService unmonitoredInstance = new SimpleServiceImpl(); MoskitoInvokationProxy proxy = new MoskitoInvokationProxy( unmonitoredInstance, new ServiceStatsCallHandler(), new ServiceStatsFactory(), "SimpleService", "service", "test-sub-system", SimpleService.class ); SimpleService monitoredInstance = (SimpleService)proxy.createProxy();
  15. WEB 22 <filter> <filter-name>RequestURIFilter</filter-name> <filter-class>net.anotheria.moskito.web.filters.RequestURIFilter</filter-class> <init-param> <param-name>limit</param-name> <param-value>1000</param-value> </init-param> </filter>

    <filter-mapping> <filter-name>RequestURIFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>DomainFilter</filter-name> <filter-class>net.anotheria.moskito.web.filters.DomainFilter</filter-class> <init-param> <param-name>limit</param-name> <param-value>50</param-value> </init-param> </filter> <filter-mapping> <filter-name>DomainFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
  16. WebUI 23 web.xml <!-- MOSKITO UI--> <!-- Adding filter to

    moskito ui which redirects requests to /mui/* to moskito user interface --> <filter> <filter-name>MoskitoUIFilter</filter-name> <filter-class>net.anotheria.moskito.webui.MoskitoUIFilter</filter-class> <init-param> <param-name>path</param-name> <param-value>/mui/</param-value> </init-param> </filter> <filter-mapping> <filter-name>MoskitoUIFilter</filter-name> <url-pattern>/mui/*</url-pattern> </filter-mapping> <!-- / MOSKITO UI END --> <!-- somewhere else ---> <listener> <listener-class> net.anotheria.moskito.webui.util.StartStopListener </listener-class> </listener> <listener> <listener-class> net.anotheria.moskito.web.session.SessionCountProducer </listener-class> </listener> <listener> <listener-class> org.anotheria.moskitodemo.threshold.presentation.listener.SetupThresholds </listener-class> </listener>
  17. Multi-purpose MoSKito can collect data about almost everything:
 Threads. Memory.

    Caches. Storages. Services. ! Averages. ExecutionTime. RequestCount. CPU Usage. IOStats. ! Registrations. Payments. Conversion. Partner Performance. Online Users. ScamScores. Load distribution. User-dependent load (guest/member). Call traversal. Path-dependent measurement. ! ... whatever you need! 24
  18. What else ? Memory leak detection in storages (maps etc)

    with put/get ratios, efficiency checks with get/ put/remove/miss ratios.! Cache/Proxies hit rates in warmed and cold states.! Error monitoring, which components produces (handled or unhandled) errors.! Concurrent load on components (number of parallel requests). Lock contention optimization. 25
  19. Capacity planing What do I have to buy to handle

    5.000 more concurrent users?! Memory per user. ! Requests per user.! CPU Time per user.! Separation by domain (multiple sites), guest/ member/paying member traffic, male/female traffic. 26
  20. more? Post release analysis (what have changed).! Network traffic optimization.!

    Call trace over multiple VMs.! ...! ...! EVERYTHING IS MEASURABLE! 27
  21. 30

  22. MoSKito Central Central server for snapshot storage.! Attachable storages can

    store data into sql- or nosql- based databases, xml/json files etc.! Runs in remote or embedded mode. 32
  23. 34

  24. I After a release of a new version huge traffic

    increase on one of the databases was detected.! The database in question was used by a service. There were 20 clients (code components) using this service. ! MoSKito showed that 55% of the traffic to the service came from one client. With MoSKito inspection we were able to detect which client was producing most traffic. 36
  25. I Closer inspection (code review) of the client revealed a

    bug which led to double calls to the service. ! Incident solved in 30 minutes. Most traffic Created here 37
  26. II Application overall performance was insufficient.! With moskito journeys and

    call tree analysis we were able to find redundant calls to the backend and remove them.! Request duration reduced to 50% with 4 hours analysis and 4 hours coding effort. 38
  27. III A bug only reproduceable by one user.! Second page

    of received messages won’t show. No exception logged. 40
  28. Broken Call red color indicates that the method was terminated

    abnormaly (exception) possible reason - user didn’t exist in the db and the code didn’t know how to handle it. 41
  29. 43

  30. 44

  31. 46 One More Thing Where: Berlin, Dahlem! ! When: 18.11.2013!

    ! What: Zaunberg Talks - DevOps in Real Life http://www.zaunberg-talks.de/berlin2013