Skip to content

Instantly share code, notes, and snippets.

@georgf
Created July 6, 2018 15:28
Show Gist options
  • Save georgf/130fff0d991865d8d9905e5870d53822 to your computer and use it in GitHub Desktop.
Save georgf/130fff0d991865d8d9905e5870d53822 to your computer and use it in GitHub Desktop.
Beta 61 use counter payload size
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import datetime as dt\n",
"import ujson as json\n",
"import pandas as pd\n",
"import numpy as np\n",
"import copy as cp\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from moztelemetry import get_pings, get_pings_properties, get_one_ping_per_client\n",
"from moztelemetry.dataset import Dataset\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Load ping data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get a bunch of pings from the last nightly & release Firefox."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"dataset = Dataset.from_source('telemetry')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[u'submissionDate',\n",
" u'sourceName',\n",
" u'sourceVersion',\n",
" u'docType',\n",
" u'appName',\n",
" u'appUpdateChannel',\n",
" u'appVersion',\n",
" u'appBuildId']"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dataset.schema"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING: THIS IS NOT A REPRESENTATIVE SAMPLE.\n",
"This 'sampling' is based on s3 files and is highly\n",
"susceptible to skew. Use only for quicker performance\n",
"while prototyping.\n",
"fetching 673211.12952MB in 35241 files...\n"
]
},
{
"data": {
"text/plain": [
"20721285"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records = Dataset.from_source('telemetry') \\\n",
" .where(docType='main') \\\n",
" .where(appUpdateChannel='beta') \\\n",
" .where(appVersion=lambda x: x.startswith('61.')) \\\n",
" .records(sc, sample=0.1)\n",
"records.count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Explore use counter data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Helper functions"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{u'USE_COUNTER2_PROPERTY_FILLOPACITY_DOCUMENT': {u'bucket_count': 3,\n",
" u'histogram_type': 2,\n",
" u'range': [1, 2],\n",
" u'sum': 1,\n",
" u'values': {u'0': 0, u'1': 1, u'2': 0}},\n",
" u'USE_COUNTER2_PROPERTY_FILL_DOCUMENT': {u'bucket_count': 3,\n",
" u'histogram_type': 2,\n",
" u'range': [1, 2],\n",
" u'sum': 1,\n",
" u'values': {u'0': 0, u'1': 1, u'2': 0}}}"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hs = records.first()[\"payload\"][\"histograms\"]\n",
"use_counters = {k: hs[k] for k in hs if k.startswith(\"USE_COUNTER2_\")}\n",
"use_counters"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def get_from_ping(ping, path):\n",
" try:\n",
" return reduce(lambda d, k: d[k], path.split(\"/\"), ping)\n",
" except (KeyError, IndexError):\n",
" return None\n",
"\n",
"def get_payload_size(ping):\n",
" p = cp.deepcopy(ping)\n",
" hs = get_from_ping(p, \"payload/histograms\")\n",
" use_counters = {k: hs[k] for k in hs if k.startswith(\"USE_COUNTER2_\")}\n",
"\n",
" return len(json.dumps(use_counters))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"262"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_payload_size(records.first())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get Beta size data"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"sizes = pd.Series(records.map(get_payload_size).collect())"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 2.072128e+07\n",
"mean 6.368164e-02\n",
"std 1.135582e-01\n",
"min 1.953125e-03\n",
"25% 1.953125e-03\n",
"50% 1.953125e-03\n",
"75% 1.953125e-03\n",
"90% 2.558594e-01\n",
"95% 2.597656e-01\n",
"99% 2.597656e-01\n",
"99.9% 2.636719e-01\n",
"max 6.768555e+00\n",
"dtype: float64"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(sizes / 1024).describe(percentiles=[0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999])"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f84c8086b10>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f84c66a4410>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"(sizes / 1024).hist()\n",
"plt.xlabel('Size in kb')\n",
"plt.ylabel('Frequency')\n",
"plt.title('Beta use counter payload size')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [default]",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
# coding: utf-8
# In[1]:
import datetime as dt
import ujson as json
import pandas as pd
import numpy as np
import copy as cp
import matplotlib.pyplot as plt
from moztelemetry import get_pings, get_pings_properties, get_one_ping_per_client
from moztelemetry.dataset import Dataset
get_ipython().magic(u'matplotlib inline')
# # Load ping data
# Get a bunch of pings from the last nightly & release Firefox.
# In[2]:
dataset = Dataset.from_source('telemetry')
# In[3]:
dataset.schema
# In[4]:
records = Dataset.from_source('telemetry') .where(docType='main') .where(appUpdateChannel='beta') .where(appVersion=lambda x: x.startswith('61.')) .records(sc, sample=0.1)
records.count()
# # Explore use counter data
# # Helper functions
# In[15]:
hs = records.first()["payload"]["histograms"]
use_counters = {k: hs[k] for k in hs if k.startswith("USE_COUNTER2_")}
use_counters
# In[16]:
def get_from_ping(ping, path):
try:
return reduce(lambda d, k: d[k], path.split("/"), ping)
except (KeyError, IndexError):
return None
def get_payload_size(ping):
p = cp.deepcopy(ping)
hs = get_from_ping(p, "payload/histograms")
use_counters = {k: hs[k] for k in hs if k.startswith("USE_COUNTER2_")}
return len(json.dumps(use_counters))
# In[17]:
get_payload_size(records.first())
# # Get Beta size data
# In[18]:
sizes = pd.Series(records.map(get_payload_size).collect())
# In[23]:
(sizes / 1024).describe(percentiles=[0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999])
# In[24]:
(sizes / 1024).hist()
plt.xlabel('Size in kb')
plt.ylabel('Frequency')
plt.title('Beta use counter payload size')
# In[ ]:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment