Monitoring and Feature Toggle Pattern
with JMX
Bruno Bonfils Cyrille Le Clerc 15/06/2011
Thursday, June 16, 2011
Speaker
2
Cyrille Le Clerc
@cyrilleleclerc
blog.xebia.fr
Open Source (Apache CXF, ...)
In Memory Data Grid
Large Scale
“you build it, you run it”
Thursday, June 16, 2011
The use case
3Thursday, June 16, 2011
The Use Case
4
Corporate Data Center
travel-ecommerce
Tomcat
Credit Card Service
travel-ecommerce
Tomcat
anti-fraud
Tomcat
anti-fraud
Tomcat
Travel e-commerce application
Thursday, June 16, 2011
The Use Case
xebia-spring-travel source code▶ http://xebia-france.googlecode.com/svn/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/
▶Groovy JMX scripts» http://xebia-france.googlecode.com/svn/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/xebia-spring-travel-
ecommerce/src/main/scripts/
▶ JMXTrans Configuration» http://xebia-france.googlecode.com/svn/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/xebia-spring-travel-
ecommerce/src/main/jmxtrans/
▶ JMeter plan» http://xebia-france.googlecode.com/svn/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/xebia-spring-travel-
ecommerce/src/main/jmeter/
xebia-management-extras JMX library▶ http://code.google.com/p/xebia-france/wiki/XebiaManagementExtras
5Thursday, June 16, 2011
Part 1Monitoring with JMX
6Thursday, June 16, 2011
Simplified Use Case
7Thursday, June 16, 2011
Simplified Use Case
8
Monitoring Booking and Credit Card Service
Corporate Data Center
travel-ecommerce
Tomcat
Credit Card ServiceMock
Thursday, June 16, 2011
Simplified Use Case
9
Monitoring Booking and Credit Card Service
Corporate Data Center
travel-ecommerce
Tomcat
Credit Card ServiceMock
Thursday, June 16, 2011
Custom/business indicator monitoringwith JMX
10Thursday, June 16, 2011
Custom Indicator Monitoring with JMX
11
CreditCardService MonitoringImpl
#purchase()
CreditCardServiceImpl
#purchase()
CreditCardService
#purchase()
monitoring logic isolated with a delegate pattern
Thursday, June 16, 2011
Custom Indicator Monitoring with JMX
12
@ManagedResourcepublic class CreditCardServiceMonitoringImpl implements CreditCardService {
// delegate private CreditCardService creditCardService; // counters private final AtomicInteger purchaseInvocationCounter = new AtomicInteger(); private final AtomicLong purchaseInvocationDurationInNanosCounter = new AtomicLong(); private final AtomicInteger threeDSecureVerificationExceptionCounter = new AtomicInteger();
@Override public PaymentTransaction purchase(MonetaryAmount total, Order order, String requestId) { long nanosBefore = System.nanoTime();
try { return creditCardService.purchase(total, order, requestId);
} catch (ThreeDSecureVerificationException e) { threeDSecureVerificationExceptionCounter.incrementAndGet(); throw e; } finally { purchaseInvocationCounter.incrementAndGet(); purchaseInvocationDurationInNanosCounter.addAndGet(System.nanoTime() - nanosBefore); } }
http://code.google.com/p/xebia-france/source/browse/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/xebia-spring-travel-ecommerce/src/main/java/fr/xebia/monitoring/demo/payment/CreditCardServiceMonitoringImpl.java
Thursday, June 16, 2011
Accessing JMX is not so difficult
13Thursday, June 16, 2011
JMX Monitoring with Visual VM
14Thursday, June 16, 2011
JMX Monitoring with JSP Pages
Human friendly or script friendly pages
Beware of security▶Basic Auth▶Obfuscated URL : /my-app/seye5E7E/jmx/cxf.jsp
15
Powered by JMX !
Thursday, June 16, 2011
Graphite - JMXTrans Style Reporting Tools
16
{ "servers" : [ { "port" : "6969", "host" : "my-server-1", "alias" : "travel-ecommerce-1", "queries" : [ { "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.GraphiteWriter", "settings" : { "port" : 2003, "host" : "graphite-server" } }], "obj": "travel-ecommerce:name=CreditCardServiceMonitoringImpl,...", "resultAlias" : "CreditCardService", "attr":["PurchaseInvocationCount", "ThreeDSecureVerificationExceptionCount", ...] } ], "numQueryThreads" : 2 } ]} JMX Trans Configuration
Graphite
http://code.google.com/p/xebia-france/source/browse/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/xebia-spring-travel-ecommerce/src/main/jmxtrans/xebia-spring-travel-ecommerce-jmxtrans.json
Thursday, June 16, 2011
Monotoring systems
17
Hyperic
AppDynamics
All others ...
Thursday, June 16, 2011
JVM Based Scripting Language
18http://code.google.com/p/xebia-france/source/browse/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/xebia-spring-travel-ecommerce/src/main/scripts/getAntiFraudVerificationStatus.groovy
Thursday, June 16, 2011
Part 2Feature Toggle Pattern with JMX
19Thursday, June 16, 2011
Simplified Use Case
20Thursday, June 16, 2011
Simplified Use Case
21
Corporate Data Center
travel-ecommerce
Tomcat
Credit Card Service
anti-fraud
Tomcat
Enable anti-fraud
Thursday, June 16, 2011
What ? Why ?
22Thursday, June 16, 2011
What is it ?
Technique to enable/disable a feature without redeploying
Can be simple : on/off
Can be sophisticated : f(user), f(server), etc
23Thursday, June 16, 2011
Benefits of the Feature Toggle Pattern
Dissociate deployment & feature activation
Progressive activation of a feature
Measure impacts of a new version
Differ feature activation on production
Trunk based development
24
Canary Testing
A/B Testing
Thursday, June 16, 2011
Coding Patterns
25Thursday, June 16, 2011
Coding PatternsDispatcher
26
The dispatcher holds the feature toggle
JMXpersistenttransient
AntiFraudServiceV1Impl
AntiFraudServiceV2Impl
AntiFraudServiceDispatchingImpl
AntiFraudService<<Interface>>
http://code.google.com/p/xebia-france/source/browse/training/xebia-spring-travel/tags/xebia-spring-travel-1.0.0/xebia-spring-travel-ecommerce/src/main/java/fr/xebia/ws/travel/antifraud/v1_0/AntiFraudServiceDispatchingImpl.java
Thursday, June 16, 2011
Coding PatternsTo duplicate or not to duplicate ?
27
Version 2
Version 1
Dispatching
Dispatching
Smart reuse and mutualization
Brutal duplication
Thursday, June 16, 2011
Coding PatternsTo duplicate or not to duplicate ?
28
Version 2
Version 1
Dispatching
Dispatching
Smart reuse and mutualization
Brutal duplication
Thursday, June 16, 2011
Coding PatternsTo duplicate or not to duplicate ?
29
Version 2
Version 1
Dispatching
Dispatching
Smart reuse and mutualization
Brutal duplication
Thursday, June 16, 2011
Coding PatternsTo duplicate or not to duplicate ?
30
Version 2
Version 1
Smart reuse and mutualization
Brutal duplication
Old version removal requires cleanup
Old version removal is clean
Thursday, June 16, 2011
Coding PatternsTo duplicate or not to duplicate ?
31
Old code removal is simpler with brutal duplication
Thursday, June 16, 2011
Demo
32Thursday, June 16, 2011
Questions / Answers
33
?
Thursday, June 16, 2011