Wasabi A/B Testing service is an open source project that is no longer under active development or being supported
Wasabi A/B Testing service is an open source project that is no longer under active development or being supported
Wasabi A/B Testing service is an open source project that is no longer under active development or being supported
Documentation: User Guide, JavaDocs
Continuous Integration: License:
Wasabi A/B Testing Service is a real-time, enterprise-grade, 100% API driven project. Users are empowered to own their own data, and run experiments across web, mobile, and desktop. It’s fast, easy to use, it’s chock full of features, and instrumentation is minimal.
Learn more about how Wasabi can empower your team to move from hunches to actionable, data-driven user insights with our simple, flexible, and scalable experimentation platform.
Create an experiment and its buckets:
Filter which customers are considered for your experiment:
Follow your currently running experiments:
Track your experiment results in real-time:
The following steps will help you install the needed tools, then build and run a complete Wasabi stack.
% /usr/bin/ruby \
-e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
% brew install git
% git clone https://github.com/intuit/wasabi.git
% cd wasabi
% ./bin/wasabi.sh bootstrapInstalled tools include: homebrew 0.9, git 2, maven 3, java 1.8, docker 1.12, node 6 and python 2.7.
Bootstrapping on Ubuntu requires sudo privileges to install all the required dependencies. You will be prompted to enter your password. Currently only 16.04 (x64) is supported.
% sudo apt-get install git
% git clone https://github.com/intuit/wasabi.git
% cd wasabi
% ./bin/wasabi.sh bootstrap
% sudo rebootNOTE: A reboot is required after running the bootstrap command on Ubuntu.
For all other processes (build, start etc.) the commands are same for Ubuntu and Mac OS.
Installed tools include: git 2, maven 3, OpenJdk 8, docker 1.12, node 6 and python 2.7
Similar tooling will work for Windows. Contribute a patch :)
Now that we have the necessary tools in place, let's move on to build and start Wasabi, followed by issuing a ping command to verify the build:
…Congratulations! You are the proud owner of a newly minted Wasabi instance. :)
export CASSANDRA_MIGRATION=/location/of/cassandra-migration-0.9-jar-with-dependencies.jarexport MIGRATION_SCRIPT=/location/of/modules/repository-datastax/src/main/resources/com/intuit/wasabi/repository/impl/cassandra/migrationCQLSH_VERSION= CQLSH_USERNAME= CQLSH_PASSWORD= CQLSH_HOST= bin/docker/migration.shMYSQL_HOST= NODE_HOST= ./bin/wasabi.sh start:wasabiWASABI_CONFIGURATION="
-Ddatabase.url.host=$MYSQL_HOST\
-Ddatabase.url.port=$MYSQL_PORT\
-Ddatabase.url.dbname=$MYSQL_DATABASE\
-Ddatabase.user=$MYSQL_USER\
-Ddatabase.password=$MYSQL_PASSWORD\
-Ddatabase.pool.connections.min=$MYSQL_MIN_CONNECTIONS\
-Ddatabase.pool.connections.max=$MYSQL_MAX_CONNECTIONS\
-Dusername=$CASSANDRA_USER\
-Dpassword=$CASSANDRA_PASSWORD\
-DnodeHosts=$CASSANDRA_HOST\
-DtokenAwareLoadBalancingLocalDC=$CASSANDRA_DATACENTER\
-Dapplication.http.port=$PORT" bash usr/local/wasabi-main-*/bin/runWhile starting Wasabi, if you see an error when the docker containers are starting up, you could do the following:
…% ./bin/wasabi.sh start:cassandra
% ./bin/wasabi.sh start:wasabiThese are the 3 common REST endpoints that you will use to instrument your client application with Wasabi.
Let's assume that you've created and started an experiment, 'BuyButton,' in the 'Demo_App' application with the following buckets:
You can assign a user with a unique ID (e.g. 'userID1') to the experiment by making this HTTP request:
Assign a user to experiment and bucket:
% curl -H "Content-Type: application/json" \
http://localhost:8080/api/v1/assignments/applications/Demo_App/experiments/BuyButton/users/userID1
{
"cache":true,
"payload":"green",
"assignment":"BucketA",
"context":"PROD",
"status":"NEW_ASSIGNMENT"
}Now the 'userID1' user is assigned into the 'BucketA' bucket. Let's further record an impression, meaning the user has seen a given experience:
Record an impression:
% curl -H "Content-Type: application/json" \
-d "{\"events\":[{\"name\":\"IMPRESSION\"}]}" \
http://localhost:8080/api/v1/events/applications/Demo_App/experiments/BuyButton/users/userID1If the 'userID1' user performs an action such as clicking the Buy button, you'd record that action with the following request:
Record an action:
% curl -H "Content-Type: application/json" \
-d "{\"events\":[{\"name\":\"BuyClicked\"}]}" \
http://localhost:8080/api/v1/events/applications/Demo_App/experiments/BuyButton/users/userID1The following developer resources are available:
API: Swagger API playground
% ./bin/wasabi.sh resource:apiJavadoc
% ./bin/wasabi.sh resource:docWasabi UI
% ./bin/wasabi.sh resource:uiCassandra: cqlsh shell
% ./bin/wasabi.sh resource:cassandraMySQL: mysql shell
% ./bin/wasabi.sh resource:mysqlJava Debugger: Remote attach configuration
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8180Alas, all good things must come to an end. Let's clean things up a bit stop the newly created Wasabi stack:
At this point in time, we now have all the requisite tools installed, and subsequent invocations of Wasabi will start up much more quickly.
% ./bin/wasabi.sh stopFurther, there are a number of additional wasabi.sh options available you should become familiar with:
…% mvn package
% ./bin/wasabi.sh start:cassandra,mysql
% (cd modules/main/target; \
WASABI_CONFIGURATION="-DnodeHosts=localhost -Ddatabase.url.host=localhost" ./wasabi-main-*-SNAPSHOT-development/bin/run) &
% curl -i http://localhost:8080/api/v1/ping
...The runtime logs can be accessed executing the following command in a another shell:
Viewing runtime logs:
% tail -f modules/main/target/wasabi-main-*-SNAPSHOT-development/logs/wasabi-main-*-SNAPSHOT-development.log% cd modules/ui
% grunt build% grunt serve% ./bin/wasabi.sh stopNow while that was fun, in all likelihood you will be using an IDE to work on Wasabi. In doing so, you need only add the configuration information above to the JVM commandline prior to startup:
Wasabi runtime configuration:
-DnodeHosts=localhost -Ddatabase.url.host=localhostCode changes can readily be verified by running the growing collection of included integration tests:
% ./bin/wasabi.sh start test stopIntegration tests might fail intermittently due to a time drift issue in docker containers on Mac OSX.
When the Mac sleeps and wakes back up, there is a lag created between the clock in the Mac vs the running docker containers. This is a known issue in Docker for Mac.
This can be fixed by running the following command:
% docker run --rm --privileged alpine hwclock -sThe above command will need to be run every time when there is a time drift.
To automatically run this command and update the time each time the Mac wakes up, you could install the following agent:
% curl https://raw.githubusercontent.com/arunvelsriram/docker-time-sync-agent/master/install.sh | bashYou can read more about this at: quick-tip-fixing-time-drift-issue-on-docker-for-mac
Wasabi can readily be packaged as installable rpm or deb distributions and deployed at scale as follows:
Package by running integration tests 1st:
% ./bin/wasabi.sh start package
``No open issues yet, or sync has not completed.