# ![Logo](https://raw.githubusercontent.com/mozilla/experimenter/master/app/experimenter/static/imgs/favicon_24.png) Experimenter [![CircleCI](https://circleci.com/gh/mozilla/experimenter.svg?style=svg)](https://circleci.com/gh/mozilla/experimenter)


1. Design 2. Launch 3. Analyze

Experimenter is a platform for managing experiments in [Mozilla Firefox](https://www.mozilla.org/en-US/firefox/?utm_medium=referral&utm_source=firefox-com). ## What is an experiment? An experiment is a way to measure how a change to your product affects how people use it. An experiment has three parts: 1. A new feature that can be selectively enabled 1. A group of users to test the new feature 1. Telemetry to measure how people interact with the new feature ## How do I run an experiment?


1. Build a new feature behind a pref flag 1. Define an experiment for that feature in Experimenter 1. Send it to Shield 1. After Shield reviews and approves it, it is sent to Firefox 1. Firefox clients check whether they should enroll in the experiment and configure themselves accordingly 1. Telemetry about the experiment is collected 1. Dashboards are created to visualize the telemetry 1. Analyze and collect the results to understand how the new feature impacted users 1. Do it again! ## Installation 1. Install [docker](https://www.docker.com/) on your machine 1. Clone the repo git clone 1. Copy the sample env file cp .env.sample .env 1. Set DEBUG=True for local development vi .env 1. Create a new secret key and put it in .env make secretkey 1. Run tests make test 1. Run database migrations make migrate 1. Make a local user make createuser 1. Run a dev instance make up 1. Navigate to it and add an SSL exception to your browser https://localhost/ Done! ## Usage Experimenter uses [docker](https://www.docker.com/) for all development, testing, and deployment. The following helpful commands have been provided via a Makefile: ### build Build the application container by executing the [build script](https://github.com/mozilla/experimenter/blob/master/scripts/build.sh) ### compose_build Build the supporting services (nginx, postgresql) defined in the [compose file](https://github.com/mozilla/experimenter/blob/master/docker-compose.yml) ### up Start a dev server listening on port 80 using the [Django runserver](https://docs.djangoproject.com/en/1.10/ref/django-admin/#runserver) ### test Run the Django test suite with code coverage ### lint Run flake8 against the code ### check Run both test and lint ### migrate Apply all django migrations ### createuser Create an admin user in the local dev instance ### shell Start an ipython shell inside the container (this lets you import and test code, interact with the db, etc) ### bash Start a bash shell inside the container (this lets you interact with the containerized filesystem) ### ssl Create dummy SSL certs to use the dev server over a locally secure connection. This helps test client behaviour with a secure connection. This task is run automatically when needed. ### kill Stop and delete all docker containers. WARNING: this will remove your database and all data. Use this to reset your dev environment. ## API ### GET /api/v1/experiments/ List all of the started experiments. #### Optional Query Parameters project__slug - Return only the experiments for a given project, an invalid slug will raise 404 status - Return only the experiments with the given status, options are: - 'Created' - 'Pending' - 'Accepted' - 'Launched' - 'Complete' - 'Rejected' Example: GET /api/v1/experiments/?project__slug=project-slug&status=Pending [ { "accept_url":"https://localhost/api/v1/experiments/self-enabling-needs-based-hardware/accept", "client_matching":"Locales: en-US, en-CA, en-GB\nGeos: US, CA, GB\nSome \"additional\" filtering", "control":{ "description":"Eos sunt adipisci beatae. Aut sunt totam maiores reprehenderit sed vero. Nam fugit sequi repellendus cumque. Fugit maxime suscipit eius quas iure exercitationem voluptatibus.", "name":"Seamless 5thgeneration task-force", "ratio":7, "slug":"seamless-5thgeneration-task-force", "value":"\"synergized-client-driven-artificial-intelligence\"" }, "end_date":1505767052000.0, "experiment_slug":"pref-flip-re-contextualized-systemic-synergy-self-enabling-needs-based-hardware", "experiment_url":"https://localhost/experiments/experiment/144/change/", "firefox_channel":"Release", "firefox_version":"57.0", "name":"Self-enabling needs-based hardware", "objectives":"Illo maiores libero ratione. Dolorum nostrum molestiae blanditiis cumque. Libero saepe ipsum accusantium maxime.", "population_percent":"60.0000", "pref_branch":"default", "pref_key":"browser.phased.hybrid.implementation.enabled", "pref_type":"string", "project_name":"Re-contextualized systemic synergy", "project_slug":"re-contextualized-systemic-synergy", "reject_url":"https://localhost/api/v1/experiments/self-enabling-needs-based-hardware/reject", "slug":"self-enabling-needs-based-hardware", "start_date":1505767052000.0, "variant":{ "description":"Modi perferendis repudiandae ducimus dolorem eum rem. Esse porro iure consectetur facere. Quidem nam enim dolore eius ab facilis.", "name":"Business-focused upward-trending Graphic Interface", "ratio":2, "slug":"business-focused-upward-trending-graphic-interface", "value":"\"synchronized-upward-trending-knowledgebase\"" } }, ] ### PATCH /api/v1/experiments//accept Body: None Set the status of a Pending experiment to Accepted. Example: PATCH /api/v1/experiments/my-first-experiment/accept ### PATCH /api/v1/experiments//reject content-type: application/json Body: {message: "This experiment was rejected for reasons."} Set the status of a Pending experiment to Rejected. Example: PATCH /api/v1/experiments/my-first-experiment/accept ## Contributing 1. Fork the repo! 1. File a new issue describing the change you want to make: Change the things #123 1. Create your feature branch with the issue number: `git checkout -b 123` 1. Commit your changes: `git commit -am 'Changed the things fixes #123'` 1. Push to the branch: `git push origin 123` 1. Submit a pull request :D ## License Experimenter uses the [Mozilla Public License](https://www.mozilla.org/en-US/MPL/)