2019-03-08 19:03:59 +03:00
# Mozilla Experimenter
2017-04-28 00:24:36 +03:00
[![CircleCI ](https://circleci.com/gh/mozilla/experimenter.svg?style=svg )](https://circleci.com/gh/mozilla/experimenter)
2017-08-09 20:19:36 +03:00
< p align = "center" >
< img src = "https://cdn1.iconfinder.com/data/icons/simple-arrow/512/arrow_20-128.png" > < br / >
< b > 1. Design 2. Launch 3. Analyze< / b >
< br > < br >
< / p >
2019-03-08 19:03:59 +03:00
Experimenter is a platform for managing experiments in [Mozilla Firefox ](https://www.mozilla.org/en-US/firefox/?utm_medium=referral&utm_source=firefox-com ).
2017-08-09 20:19:36 +03:00
2018-05-23 22:43:50 +03:00
## Deployments
### Shared Dev
[https://experimenter-app.dev.mozaws.net/ ](https://experimenter-app.dev.mozaws.net/ )
### Staging
[https://experimenter.stage.mozaws.net/ ](https://experimenter.stage.mozaws.net/ )
### Production
[https://experimenter.services.mozilla.com/ ](https://experimenter.services.mozilla.com/ )
2017-08-09 20:19:36 +03:00
## 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
2019-03-08 19:03:59 +03:00
1. A group of users to test the new feature
1. Telemetry to measure how people interact with the new feature
2017-08-09 20:19:36 +03:00
2019-03-08 19:03:59 +03:00
## How do I run an experiment?
2017-08-09 20:19:36 +03:00
< p align = "center" >
< img src = "https://raw.githubusercontent.com/mozilla/experimenter/164/app/experimenter/static/imgs/architecture.png" > < br / >
< / p >
2017-04-11 22:45:02 +03:00
2017-08-09 20:19:36 +03:00
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
2019-03-08 19:03:59 +03:00
1. Dashboards are created to visualize the telemetry
1. Analyze and collect the results to understand how the new feature impacted users
2017-08-09 20:19:36 +03:00
1. Do it again!
2017-04-11 22:45:02 +03:00
## Installation
2019-03-08 19:03:59 +03:00
1. Install [docker ](https://www.docker.com/ ) on your machine
2017-04-11 22:45:02 +03:00
2017-08-09 20:19:36 +03:00
1. Clone the repo
2017-04-11 22:45:02 +03:00
git clone < your fork >
2017-08-09 20:19:36 +03:00
1. Copy the sample env file
2017-04-11 22:45:02 +03:00
cp .env.sample .env
2018-02-12 19:15:13 +03:00
1. Set DEBUG=True for local development
vi .env
2017-08-09 20:19:36 +03:00
1. Create a new secret key and put it in .env
2017-04-11 22:45:02 +03:00
make secretkey
2017-08-09 20:19:36 +03:00
1. Run tests
2017-04-11 22:45:02 +03:00
make test
2017-08-09 20:19:36 +03:00
1. Run database migrations
2017-05-04 23:32:01 +03:00
make migrate
2017-08-09 20:19:36 +03:00
1. Make a local user
2017-05-04 23:32:01 +03:00
make createuser
2017-08-09 20:19:36 +03:00
1. Run a dev instance
2017-05-04 23:32:01 +03:00
make up
2017-10-16 23:33:19 +03:00
1. Navigate to it and add an SSL exception to your browser
https://localhost/
2017-04-11 22:45:02 +03:00
Done!
## Usage
2019-03-08 19:03:59 +03:00
Experimenter uses [docker ](https://www.docker.com/ ) for all development, testing, and deployment.
2017-04-11 22:45:02 +03:00
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
2017-05-04 23:32:01 +03:00
### createuser
Create an admin user in the local dev instance
2017-04-11 22:45:02 +03:00
### 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)
2017-10-16 23:33:19 +03:00
### ssl
2017-10-18 00:58:04 +03:00
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.
2017-10-16 23:33:19 +03:00
2018-02-12 19:15:13 +03:00
### kill
2019-03-08 19:03:59 +03:00
Stop and delete all docker containers.
2018-02-12 19:15:13 +03:00
WARNING: this will remove your database and all data. Use this to reset your dev environment.
2017-05-04 23:32:01 +03:00
## API
2017-08-02 22:10:16 +03:00
### GET /api/v1/experiments/
List all of the started experiments.
2017-05-04 23:32:01 +03:00
2017-08-02 22:10:16 +03:00
#### Optional Query Parameters
project__slug - Return only the experiments for a given project, an invalid slug will raise 404
2017-08-23 23:25:57 +03:00
status - Return only the experiments with the given status, options are:
2018-06-19 20:15:17 +03:00
- 'Draft'
- 'Review'
- 'Ship'
2017-08-23 23:25:57 +03:00
- 'Accepted'
2018-06-19 20:15:17 +03:00
- 'Live'
2017-08-23 23:25:57 +03:00
- 'Complete'
- 'Rejected'
Example: GET /api/v1/experiments/?project__slug=project-slug& status=Pending
2017-05-04 23:32:01 +03:00
[
2017-09-07 20:39:26 +03:00
{
2017-09-18 23:36:44 +03:00
"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",
2017-09-07 20:39:26 +03:00
"ratio":7,
2017-09-18 23:36:44 +03:00
"slug":"seamless-5thgeneration-task-force",
"value":"\"synergized-client-driven-artificial-intelligence\""
2017-09-07 20:39:26 +03:00
},
2017-09-18 23:36:44 +03:00
"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",
2017-09-18 23:48:53 +03:00
"project_slug":"re-contextualized-systemic-synergy",
2017-09-18 23:36:44 +03:00
"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\""
2017-09-07 20:39:26 +03:00
}
2017-09-18 23:36:44 +03:00
},
2017-05-04 23:32:01 +03:00
]
2017-04-11 22:45:02 +03:00
2018-06-19 20:15:17 +03:00
### GET /api/v1/experiments/<experiment_slug>/
Return a serialization of the requested experiment.
Example: GET /api/v1/experiments/self-enabled-needs-based-hardware/
{
"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\""
}
}
2017-09-07 20:39:26 +03:00
2017-08-18 22:14:45 +03:00
### PATCH /api/v1/experiments/<experiment_slug>/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/<experiment_slug>/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
2017-04-11 22:45:02 +03:00
## Contributing
2019-02-27 20:52:42 +03:00
Please see our [Contributing Guidelines ](https://github.com/mozilla/experimenter/blob/master/contributing.md )
2017-04-11 22:45:02 +03:00
## License
Experimenter uses the [Mozilla Public License ](https://www.mozilla.org/en-US/MPL/ )