{"id":13989217,"url":"https://github.com/intuit/wasabi","last_synced_at":"2025-05-15T09:03:53.664Z","repository":{"id":9331668,"uuid":"61667990","full_name":"intuit/wasabi","owner":"intuit","description":"Wasabi A/B Testing service is an open source project that is no longer under active development or being supported","archived":false,"fork":false,"pushed_at":"2023-05-26T10:25:00.000Z","size":19421,"stargazers_count":1140,"open_issues_count":124,"forks_count":238,"subscribers_count":72,"default_branch":"develop","last_synced_at":"2025-05-15T09:03:04.083Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/intuit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2016-06-21T21:21:06.000Z","updated_at":"2025-05-02T04:59:59.000Z","dependencies_parsed_at":"2023-01-13T16:23:58.048Z","dependency_job_id":"58ca5cab-ed4f-4eff-8cb0-f228eb5f489f","html_url":"https://github.com/intuit/wasabi","commit_stats":null,"previous_names":[],"tags_count":53,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fwasabi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fwasabi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fwasabi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intuit%2Fwasabi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/intuit","download_url":"https://codeload.github.com/intuit/wasabi/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254310513,"owners_count":22049468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-09T13:01:33.824Z","updated_at":"2025-05-15T09:03:53.631Z","avatar_url":"https://github.com/intuit.png","language":"Java","funding_links":[],"categories":["Java","测试"],"sub_categories":[],"readme":"Wasabi A/B Testing service is an open source project that is no longer under active development or being supported\n\n# Wasabi - A/B Testing Platform\n\n**Support:** [![Join the chat at https://gitter.im/intuit/wasabi](https://badges.gitter.im/intuit/wasabi.svg)](https://gitter.im/intuit/wasabi?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge) \u003cbr/\u003e\n**Documentation:** [User Guide](https://intuit.github.io/wasabi/v1/guide/index.html), [JavaDocs](https://intuit.github.io/wasabi/v1/javadocs/latest/)\n\u003cbr/\u003e\n**A/B Testing Overview:** [![A/B Testing Overview](http://img.shields.io/badge/video-A%2FB%20Testing%20Overview-red.svg)](https://www.youtube.com/watch?v=_HtvJwBPUqk\u0026feature=youtu.be) [![Blog Meet Wasabi](https://img.shields.io/badge/blog-Meet%20Wasabi-brightgreen.svg)](https://medium.com/blueprint-by-intuit/open-sourcing-wasabi-the-a-b-testing-platform-by-intuit-a8d5abc958d) [![Blog Architecture Behind Wasabi](https://img.shields.io/badge/blog-Architecture%20Behind%20Wasabi-orange.svg)](https://medium.com/blueprint-by-intuit/the-architecture-behind-wasabi-an-open-source-a-b-testing-platform-b52430d3fd80) \u003cbr/\u003e\n**Continuous Integration:** [![Build Status](https://api.travis-ci.org/intuit/wasabi.svg?branch=develop)](https://travis-ci.org/intuit/wasabi)\n[![Coverage Status](https://coveralls.io/repos/github/intuit/wasabi/badge.svg)](https://coveralls.io/github/intuit/wasabi?branch=develop)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.intuit.wasabi/wasabi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.intuit.wasabi/wasabi) \u003cbr/\u003e\n**License:** [![Apache 2](http://img.shields.io/badge/license-Apache%202-brightgreen.svg)](http://www.apache.org/licenses/LICENSE-2.0) \u003cbr/\u003e\n\n## Project\n\nWasabi 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.\n\nLearn 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.\n\n### Features\n\n* **Own your own data** - Wasabi runs on your servers, in the cloud or on-premise, where you have complete control over your data.\n* **Proven** - Wasabi is battle-tested in production at Intuit, Inc., a financial technology company. Wasabi is the experimentation platform for TurboTax, QuickBooks, Mint.com, and other Intuit offerings.\n* **High Performance** - Consistent server-side response times for user assignments within 30ms.\n* **100% API-Driven** - The Wasabi REST API is compatible with any language and environment.\n* **Platform Agnostic** - Uniform, consistent testing across Web, mobile, desktop. Also supports front-end, back-end integrations.\n* **Real-time user assignments** - Assign users into experiments in real time, to preserve traffic for other parallel A/B tests.\n* **Cloud and on-premise** - Designed to live in the cloud or in your own data center.\n* **Analytics** - Core experiment analytics and metrics visualization out of the box, as well as the ability to send data to your existing analytics infrastructure.\n* **Pluggable** - Well-defined interfaces for plugging in your own access control, sending data to data pipelines, and providing fully custom bucket allocations.\n* **Experiment Management UI** - Setup and manage experiments via a modern Web interface. Management via REST API is also possible.\n* **Dockerized** - Spin up a Wasabi Docker instance in 5 minutes and be in production with the platform, instrumentation, and experiments within a day.\n\n### User Interface\n\n* **Create an experiment and its buckets:**\n![](https://intuit.github.io/wasabi/v1/guide/images/readme/CreateBucket.png)\n* **Filter which customers are considered for your experiment:**\n![](https://intuit.github.io/wasabi/v1/guide/images/readme/SegmentationRules.png)\n* **Follow your currently running experiments:**\n![](https://intuit.github.io/wasabi/v1/guide/images/readme/ExperimentList.png)\n* **Track your experiment results in real-time:**\n![](https://intuit.github.io/wasabi/v1/guide/images/readme/ExperimentDetails.png)\n\n## Get Started\n\nThe following steps will help you install the needed tools, then build and run a complete Wasabi stack.\n\n#### Bootstrap Your Environment\n\n\n##### Mac OS\n\n```bash\n% /usr/bin/ruby \\\n  -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"\n% brew install git\n% git clone https://github.com/intuit/wasabi.git\n% cd wasabi\n% ./bin/wasabi.sh bootstrap\n```\n\nInstalled tools include: [homebrew 0.9](http://brew.sh), [git 2](https://git-scm.com),\n[maven 3](https://maven.apache.org), [java 1.8](http://www.oracle.com/technetwork/java/javase/overview/index.html),\n[docker 1.12](https://docker.com), [node 6](https://nodejs.org/en) and [python 2.7](https://www.python.org).\n\n\n##### Ubuntu\n\nBootstrapping 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.\n\n```bash\n% sudo apt-get install git\n% git clone https://github.com/intuit/wasabi.git\n% cd wasabi\n% ./bin/wasabi.sh bootstrap\n% sudo reboot\n```\n\nNOTE: A reboot is required after running the bootstrap command on Ubuntu.\n\nFor all other processes (build, start etc.) the commands are same for Ubuntu and Mac OS.\n\nInstalled tools include: [git 2](https://git-scm.com),\n[maven 3](https://maven.apache.org), [OpenJdk 8](http://openjdk.java.net/projects/jdk8/),\n[docker 1.12](https://docker.com), [node 6](https://nodejs.org/en) and [python 2.7](https://www.python.org)\n\nSimilar tooling will work for Windows. Contribute a patch :)\n\n#### Start Wasabi\n\nNow that we have the necessary tools in place, let's move on to build and start Wasabi, followed by issuing a _ping_\ncommand to verify the build:\n\n```bash\n% ./bin/wasabi.sh build start\n...\nwasabi is operational:\n\n  ui: % open http://localhost:8080     note: sign in as admin/admin\n  ping: % curl -i http://localhost:8080/api/v1/ping\n  debug: attach to localhost:8180\n\n% curl -i http://localhost:8080/api/v1/ping\nHTTP/1.1 200 OK\nDate: Wed, 25 May 2016 00:25:47 GMT\n...\nX-Application-Id: wasabi-api-20151215171929-SNAPSHOT-development\nContent-Type: application/json\nTransfer-Encoding: chunked\nServer: Jetty(9.3.z-SNAPSHOT)\n\n{\n  \"componentHealths\":[\n    {\n      \"componentName\":\"Experiments Cassandra\",\n      \"healthy\":true\n    },\n    {\n      \"componentName\":\"MySql\",\"healthy\":true\n    }\n  ],\n  \"wasabiVersion\":\"wasabi-api-20151215171929-SNAPSHOT-development\"\n}\n```\n\nCongratulations! You are the proud owner of a newly minted Wasabi instance. :)\n\n### Running Wasabi with remote storage\n\n##### Set Mysql and Cassandra credentials\n* Modify /pom.xml to set the values that apply to your environment\n\n##### Download Cassandra migration tool https://oss.sonatype.org/content/repositories/public/com/builtamont/cassandra-migration/0.9/cassandra-migration-0.9-jar-with-dependencies.jar\n\n##### Set up your environment variables\n* Set location of the migration tool\n```bash\nexport CASSANDRA_MIGRATION=/location/of/cassandra-migration-0.9-jar-with-dependencies.jar\n```\n* Set location of migration scripts within your project\n```bash\nexport MIGRATION_SCRIPT=/location/of/modules/repository-datastax/src/main/resources/com/intuit/wasabi/repository/impl/cassandra/migration\n```\n\n##### Set up Cassandra tables\n```bash\nCQLSH_VERSION=\u003cversion\u003e CQLSH_USERNAME=\u003cusername\u003e CQLSH_PASSWORD=\u003cpwd\u003e CQLSH_HOST=\u003chost\u003e bin/docker/migration.sh\n```\n\n##### Run Wasabi with env variables for remote storage hosts\n```bash\nMYSQL_HOST=\u003cmysql_host\u003e NODE_HOST=\u003ccassandra_host\u003e ./bin/wasabi.sh start:wasabi\n```\n\n##### Run Wasabi outside of docker with WASABI_CONFIGURATION for remote storage hosts\n```bash\nWASABI_CONFIGURATION=\"\n  -Ddatabase.url.host=$MYSQL_HOST\\\n  -Ddatabase.url.port=$MYSQL_PORT\\\n  -Ddatabase.url.dbname=$MYSQL_DATABASE\\\n  -Ddatabase.user=$MYSQL_USER\\\n  -Ddatabase.password=$MYSQL_PASSWORD\\\n  -Ddatabase.pool.connections.min=$MYSQL_MIN_CONNECTIONS\\\n  -Ddatabase.pool.connections.max=$MYSQL_MAX_CONNECTIONS\\\n  -Dusername=$CASSANDRA_USER\\\n  -Dpassword=$CASSANDRA_PASSWORD\\\n  -DnodeHosts=$CASSANDRA_HOST\\\n  -DtokenAwareLoadBalancingLocalDC=$CASSANDRA_DATACENTER\\\n  -Dapplication.http.port=$PORT\" bash usr/local/wasabi-main-*/bin/run\n```\n\n#### Troubleshooting\n\n* While starting Wasabi, if you see an error when the docker containers are starting up, you could do the following:\n\n  * Look at the current docker containers that have been successfully started.\n\n```bash\n% ./bin/wasabi.sh status\n\nCONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                                     NAMES\n8c12458057ef        wasabi-main              \"entrypoint.sh wasabi\"   25 minutes ago      Up 25 minutes       0.0.0.0:8080-\u003e8080/tcp, 0.0.0.0:8090-\u003e8090/tcp, 0.0.0.0:8180-\u003e8180/tcp    wasabi-main\n979ecc885239        mysql:5.6                \"docker-entrypoint.sh\"   26 minutes ago      Up 26 minutes       0.0.0.0:3306-\u003e3306/tcp                                                    wasabi-mysql\n2d33a96abdcb        cassandra:2.1            \"/docker-entrypoint.s\"   27 minutes ago      Up 27 minutes       7000-7001/tcp, 0.0.0.0:9042-\u003e9042/tcp, 7199/tcp, 0.0.0.0:9160-\u003e9160/tcp   wasabi-cassandra\n```\n\n  * The above shell output shows a successful start of 3 docker containers needed by Wasabi: wasabi-main (the Wasabi server),\nwasabi-mysql, and wasabi-cassandra. If any of these are not running, try starting them individually. For example, if the\nMySQL container is running, but Cassandra and Wasabi containers failed to start (perhaps due to a network timeout docker\ncould not download the Cassandra image), do the following:\n\n```bash\n% ./bin/wasabi.sh start:cassandra\n\n% ./bin/wasabi.sh start:wasabi\n```\n\n\n\n#### Call Wasabi\n\nThese are the 3 common REST endpoints that you will use to instrument your client application with Wasabi.\n\nLet's assume that you've created and started an experiment, 'BuyButton,' in the 'Demo_App' application with the following buckets:\n\n* 'BucketA': green button (control bucket)\n* 'BucketB': orange button bucket\n\nYou can assign a user with a unique ID (e.g. 'userID1') to the experiment by making this HTTP request:\n\n\u003e Assign a user to experiment and bucket:\n\n```bash\n% curl -H \"Content-Type: application/json\" \\\n    http://localhost:8080/api/v1/assignments/applications/Demo_App/experiments/BuyButton/users/userID1\n\n{  \n   \"cache\":true,\n   \"payload\":\"green\",\n   \"assignment\":\"BucketA\",\n   \"context\":\"PROD\",\n   \"status\":\"NEW_ASSIGNMENT\"\n}\n```\n\nNow the 'userID1' user is assigned into the 'BucketA' bucket. Let's further record an impression, meaning the user has seen a given experience:\n\n\u003e Record an impression:\n\n```bash\n% curl -H \"Content-Type: application/json\" \\\n    -d \"{\\\"events\\\":[{\\\"name\\\":\\\"IMPRESSION\\\"}]}\" \\\n    http://localhost:8080/api/v1/events/applications/Demo_App/experiments/BuyButton/users/userID1\n```\n\nIf the 'userID1' user performs an action such as clicking the Buy button, you'd record that action with the following request:\n\n\u003e Record an action:\n\n```bash\n% curl -H \"Content-Type: application/json\" \\\n    -d \"{\\\"events\\\":[{\\\"name\\\":\\\"BuyClicked\\\"}]}\" \\\n    http://localhost:8080/api/v1/events/applications/Demo_App/experiments/BuyButton/users/userID1\n```\n\n#### Explore Various Resources\n\nThe following developer resources are available:\n\n\u003e API: Swagger API playground\n\n```bash\n% ./bin/wasabi.sh resource:api\n```\n\n\u003e Javadoc\n\n```bash\n% ./bin/wasabi.sh resource:doc\n```\n\n\u003e Wasabi UI\n\n```bash\n% ./bin/wasabi.sh resource:ui\n```\n\n\u003e Cassandra: cqlsh shell\n\n```bash\n% ./bin/wasabi.sh resource:cassandra\n```\n\n\u003e MySQL: mysql shell\n\n```bash\n% ./bin/wasabi.sh resource:mysql\n```\n\n\u003e Java Debugger: Remote attach configuration\n\n```bash\n-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8180\n```\n\n\n#### Stop Wasabi\n\nAlas, all good things must come to an end. Let's clean things up a bit stop the newly created Wasabi stack:\n\nAt this point in time, we now have all the requisite tools installed, and subsequent invocations of Wasabi will\nstart up much more quickly.\n\n```bash\n% ./bin/wasabi.sh stop\n```\n\n#### Get Familiar with wasabi.sh\n\nFurther, there are a number of additional wasabi.sh options available you should become familiar with:\n\n```bash\n% ./bin/wasabi.sh --help\n\n  usage: wasabi.sh [options] [commands]\n\n  options:\n    -e | --endpoint [ host:port ]          : api endpoint; default: localhost:8080\n    -v | --verify [ true | false ]         : verify installation configuration; default: false\n    -s | --sleep [ sleep-time ]            : sleep/wait time in seconds; default: 30\n    -h | --help                            : help message\n\n  commands:\n    bootstrap                              : install dependencies\n    build                                  : build project\n    start[:cassandra,mysql,wasabi]         : start all, cassandra, mysql, wasabi\n    test                                   : test wasabi\n    stop[:wasabi,cassandra,mysql]          : stop all, wasabi, cassandra, mysql\n    resource[:ui,api,doc,cassandra,mysql]  : open resource api, javadoc, cassandra, mysql\n    status                                 : display resource status\n    remove[:wasabi,cassandra,mysql]        : remove all, wasabi, cassandra, mysql\n    package                                : build deployable packages\n    release[:start,finish]                 : promote release\n```\n\n## Develop\n\n#### Build and Run Wasabi Server\n\n```bash\n% mvn package\n% ./bin/wasabi.sh start:cassandra,mysql\n% (cd modules/main/target; \\\n    WASABI_CONFIGURATION=\"-DnodeHosts=localhost -Ddatabase.url.host=localhost\" ./wasabi-main-*-SNAPSHOT-development/bin/run) \u0026\n% curl -i http://localhost:8080/api/v1/ping\n...\n```\n\nThe runtime logs can be accessed executing the following command in a another shell:\n\n\u003e Viewing runtime logs:\n\n```bash\n% tail -f modules/main/target/wasabi-main-*-SNAPSHOT-development/logs/wasabi-main-*-SNAPSHOT-development.log\n```\n\n#### Build and Run Wasabi UI\n\n```bash\n% cd modules/ui\n% grunt build\n```\n\n```bash\n% grunt serve\n```\n\n#### Stop Wasabi\n\n```bash\n% ./bin/wasabi.sh stop\n```\n\nNow while that was fun, in all likelihood you will be using an IDE to work on Wasabi. In doing so, you need only\nadd the configuration information above to the JVM commandline prior to startup:\n\n\u003e Wasabi runtime configuration:\n\n```bash\n-DnodeHosts=localhost -Ddatabase.url.host=localhost\n```\n\n#### Run Integration Tests\n\nCode changes can readily be verified by running the growing collection of included integration tests:\n\n```bash\n% ./bin/wasabi.sh start test stop\n```\n##### Troubleshooting\n\nIntegration tests might fail intermittently due to a time drift issue in docker containers on Mac OSX.\n\nWhen the Mac sleeps and wakes back up, there is a lag created between the clock in the Mac vs the\nrunning docker containers. This is a known issue in Docker for Mac.\n\nThis can be fixed by running the following command:\n\n```bash\n% docker run --rm --privileged alpine hwclock -s\n```\n\nThe above command will need to be run every time when there is a time drift.\n\nTo automatically run this command and update the time each time the Mac wakes up, you could install \nthe following agent:\n\n```bash\n% curl https://raw.githubusercontent.com/arunvelsriram/docker-time-sync-agent/master/install.sh | bash\n```\n\nYou can read more about this at: [quick-tip-fixing-time-drift-issue-on-docker-for-mac](https://blog.shameerc.com/2017/03/quick-tip-fixing-time-drift-issue-on-docker-for-mac)\n\n## Package and Deploy at Scale\n\nWasabi can readily be packaged as installable *rpm* or *deb* distributions and deployed at scale as follows:\n\n\u003e Package by running integration tests 1st:\n\n```bash\n% ./bin/wasabi.sh start package\n```\n\n\u003e Package without integration tests, if needed:\n\n```bash\n% ./bin/wasabi.sh -t false package\n```\n\n\u003e Find generated package files:\n\n```bash\n% find . -type f \\( -name \"*.rpm\" -or -name \"*.deb\" \\)\n```\n\nNote: [Java 8](http://www.oracle.com/technetwork/java/javase/overview/index.html) is a runtime dependency\n\n## Integrate\n\nWasabi is readily embeddable via the following *maven* dependency GAV family:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.intuit.wasabi\u003c/groupId\u003e\n    \u003cartifactId\u003ewasabi\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.20160627213750\u003cbuild_timestamp\u003e\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Contribute\n\nWe greatly encourage contributions! You can add new features, report and fix existing bugs, write docs and\ntutorials, or any of the above. Feel free to open issues and/or send pull requests.\n\nThe `master` branch of this repository contains the latest stable release of Wasabi, while snapshots are published to the `develop` branch. In general, pull requests should be submitted against `develop` by forking this repo into your account, developing and testing your changes, and creating pull requests to request merges. See the [Contributing to a Project](https://guides.github.com/activities/contributing-to-open-source/)\narticle for more details about how to contribute in general and find more specific information on how to write code for Wasabi in our [user guide](https://intuit.github.io/wasabi/v1/guide/index.html#developing-wasabi).\n\nExtension projects such as browser plugins, client integration libraries, and apps can be contributed under the `contrib` directory.\n\nSteps to contribute:\n\n1. Fork this repository into your account on Github\n2. Clone *your forked repository* (not our original one) to your hard drive with `git clone https://github.com/YOURUSERNAME/wasabi.git`\n3. Design and develop your changes\n4. Add/update unit tests\n5. Add/update integration tests\n6. Add/update documentation on `gh-pages` branch\n7. Create a pull request for review to request merge\n8. Obtain 2 approval _squirrels_ before your changes can be merged\n\nThank you for your contribution!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintuit%2Fwasabi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fintuit%2Fwasabi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintuit%2Fwasabi/lists"}