Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save georgf/372b442487e1752081c75314d276203d to your computer and use it in GitHub Desktop.
Save georgf/372b442487e1752081c75314d276203d to your computer and use it in GitHub Desktop.
Current histogram & scalar payload sizes
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 23335.24989MB in 35099 files...\n"
]
},
{
"data": {
"text/plain": [
"448150"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records_nightly = Dataset.from_source('telemetry') \\\n",
" .where(docType='main') \\\n",
" .where(appUpdateChannel='nightly') \\\n",
" .where(submissionDate=lambda x: x.startswith('201804')) \\\n",
" .where(appVersion=lambda x: x.startswith('61.')) \\\n",
" .records(sc, sample=0.1)\n",
"records_nightly.count()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"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 335129.79932MB in 5872 files...\n"
]
},
{
"data": {
"text/plain": [
"69216592"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records_release = Dataset.from_source('telemetry') \\\n",
" .where(docType='main') \\\n",
" .where(appUpdateChannel='release') \\\n",
" .where(submissionDate=lambda x: x.startswith('201804')) \\\n",
" .where(appVersion=lambda x: x.startswith('59.')) \\\n",
" .records(sc, sample=0.01)\n",
"records_release.count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Helper functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define the functions to extract the fields from each ping and map them to their json length in bytes."
]
},
{
"cell_type": "code",
"execution_count": 6,
"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 extract_fields_size(ping):\n",
" field_list = [\n",
" \"payload/histograms\",\n",
" \"payload/keyedHistograms\",\n",
" \"payload/processes/content/histograms\",\n",
" \"payload/processes/content/keyedHistograms\",\n",
" \"payload/processes/parent/scalars\",\n",
" \"payload/processes/parent/keyedScalars\",\n",
" \"payload/processes/content/scalars\",\n",
" \"payload/processes/content/keyedScalars\",\n",
" ]\n",
" # Build a tuple (field_name, json_field_size) for each field.\n",
" p = cp.deepcopy(ping)\n",
" tuples = [(e, len(json.dumps(get_from_ping(p, e)))) for e in field_list if get_from_ping(p, e)]\n",
" return tuples\n",
"\n",
"def get_payload_size(ping):\n",
" field_sizes = extract_fields_size(ping)\n",
" return sum([t[1] for t in field_sizes])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('payload/histograms', 64114),\n",
" ('payload/keyedHistograms', 54503),\n",
" ('payload/processes/content/histograms', 50623),\n",
" ('payload/processes/content/keyedHistograms', 91918),\n",
" ('payload/processes/parent/scalars', 394),\n",
" ('payload/processes/parent/keyedScalars', 116),\n",
" ('payload/processes/content/scalars', 351),\n",
" ('payload/processes/content/keyedScalars', 72)]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"extract_fields_size(records_nightly.first())"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"262091"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_payload_size(records_nightly.first())"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('payload/histograms', 7266),\n",
" ('payload/keyedHistograms', 5959),\n",
" ('payload/processes/content/histograms', 1774),\n",
" ('payload/processes/parent/scalars', 481),\n",
" ('payload/processes/parent/keyedScalars', 72),\n",
" ('payload/processes/content/scalars', 204)]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"extract_fields_size(records_release.first())"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"15756"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_payload_size(records_release.first())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get Nightly size data"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"sizes_nightly = pd.Series(records_nightly.map(get_payload_size).collect())"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 448150.000000\n",
"mean 214.175386\n",
"std 66.612948\n",
"min 0.677734\n",
"25% 171.038330\n",
"50% 215.050781\n",
"75% 259.729248\n",
"90% 300.079199\n",
"95% 322.355029\n",
"99% 361.666533\n",
"99.9% 402.282392\n",
"max 474.317383\n",
"dtype: float64"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(sizes_nightly / 1024).describe(percentiles=[0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999])"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f1f6b699850>"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nmVll/Q9cBYgyqeCrkAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1f6b8721d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"(sizes_nightly / 1024).hist()\n",
"plt.xlabel('Size in kb')\n",
"plt.ylabel('Frequency')\n",
"plt.title('Nightly histogram & scalar payload size')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Get Release size data"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"sizes_release = pd.Series(records_release.map(get_payload_size).collect())"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 6.919251e+07\n",
"mean 1.742651e+01\n",
"std 4.832082e+00\n",
"min 0.000000e+00\n",
"25% 1.485840e+01\n",
"50% 1.763477e+01\n",
"75% 2.041895e+01\n",
"90% 2.312402e+01\n",
"95% 2.492871e+01\n",
"99% 2.888281e+01\n",
"99.9% 3.260645e+01\n",
"max 1.923057e+02\n",
"dtype: float64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(sizes_release / 1024).describe(percentiles=[0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999])"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x7f1f6b7af350>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nz9svwG3A7zsbCmuuzi7cepvzbBbnaWVV3lSModrNJzbtVq5cWXUJlpHzbBbnaWVVPlBzNBHx/Kpr\nsOm1bt26qkuwjJxnszhPK6uuWypsJzNjxoyqS7CMnGezOE8ry02FmZmZZeGmwszMzLJwU2G10Hls\ntvU259ksztPKclNhtTBr1qyqS7CMnGezOE8ry02F1cKxxx5bdQmWkfNsFudpZbmpMDMzsyzcVJiZ\nmVkWbiqsFjp/WMd6m/NsFudpZbmpsFpYunRp1SVYRs6zWZynleWmwmph9erVVZdgGTnPZnGeVpab\nCqsFH7LWLM6zWZynleWmwszMzLJwU2FmZmZZuKmwWlixYkXVJVhGzrNZnKeV5abCamF4eLjqEiwj\n59ksztPKUkRUXcOkSOoDNsEFwOFVl1PSMfT1XcKmTRdVXYiZme3EBgcH6e/vB+iPiMHcy/eWCjMz\nM8vCTYWZmZll4abCamFoaKjqEiwj59ksztPKclNhtbBgwYKqS7CMnGezOE8ry02F1cLy5curLsEy\ncp7N4jytLDcVVgt9fX1Vl2AZOc9mcZ5WlpsKMzMzy8JNhZmZmWXhpsJqYe3atVWXYBk5z2ZxnlaW\nmwqrhcHB7Cd2swo5z2ZxnlaWmwqrhTVr1lRdgmXkPJvFeVpZbirMzMwsCzcVZmZmloWbCjMzM8vC\nTYXVQqvVqroEy8h5NovztLLcVFgtLFq0qOoSLCPn2SzO08pyU2G1MGfOnKpLsIycZ7M4TyvLTYWZ\nmZll4abCzMzMsnBTYbWwfv36qkuwjJxnszhPK8tNhdXCwMBA1SVYRs6zWZynleWmwmrhrLPOqroE\ny8h5NovztLLcVJiZmVkWbirMzMwsCzcVZmZmloWbCquF+fPnV12CZeQ8m8V5WlluKqwWfMa+ZnGe\nzeI8rSw3FVYL8+bNq7oEy8h5NovztLLcVJiZmVkWbirMzMwsCzcVVgsbN26sugTLyHk2i/O0stxU\nWC2sXLmy6hIsI+fZLM7TynJTYbWwbt26qkuwjJxnszhPK8tNhdXCjBkzqi7BMnKezeI8razKmwpJ\nb5T0E0k3FZfvSfrbqusyMzOzyam8qQB+BRwH9AH9wAXAlyQdUGlVZmZmNimVNxUR8dWIOC8iroyI\nX0bEu4FbgYOrrs2mz5IlS6ouwTJyns3iPK2srpoKSa+WtHvuYiTdT9I/ATOA7+devtXXrFmzqi7B\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1f6b868950>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"(sizes_release / 1024).hist()\n",
"plt.xlabel('Size in kb')\n",
"plt.ylabel('Frequency')\n",
"plt.title('Release histogram & scalar 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_nightly = Dataset.from_source('telemetry') .where(docType='main') .where(appUpdateChannel='nightly') .where(submissionDate=lambda x: x.startswith('201804')) .where(appVersion=lambda x: x.startswith('61.')) .records(sc, sample=0.1)
records_nightly.count()
# In[5]:
records_release = Dataset.from_source('telemetry') .where(docType='main') .where(appUpdateChannel='release') .where(submissionDate=lambda x: x.startswith('201804')) .where(appVersion=lambda x: x.startswith('59.')) .records(sc, sample=0.01)
records_release.count()
# # Helper functions
# Define the functions to extract the fields from each ping and map them to their json length in bytes.
# In[6]:
def get_from_ping(ping, path):
try:
return reduce(lambda d, k: d[k], path.split("/"), ping)
except (KeyError, IndexError):
return None
def extract_fields_size(ping):
field_list = [
"payload/histograms",
"payload/keyedHistograms",
"payload/processes/content/histograms",
"payload/processes/content/keyedHistograms",
"payload/processes/parent/scalars",
"payload/processes/parent/keyedScalars",
"payload/processes/content/scalars",
"payload/processes/content/keyedScalars",
]
# Build a tuple (field_name, json_field_size) for each field.
p = cp.deepcopy(ping)
tuples = [(e, len(json.dumps(get_from_ping(p, e)))) for e in field_list if get_from_ping(p, e)]
return tuples
def get_payload_size(ping):
field_sizes = extract_fields_size(ping)
return sum([t[1] for t in field_sizes])
# In[7]:
extract_fields_size(records_nightly.first())
# In[8]:
get_payload_size(records_nightly.first())
# In[9]:
extract_fields_size(records_release.first())
# In[10]:
get_payload_size(records_release.first())
# # Get Nightly size data
# In[12]:
sizes_nightly = pd.Series(records_nightly.map(get_payload_size).collect())
# In[13]:
(sizes_nightly / 1024).describe(percentiles=[0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999])
# In[26]:
(sizes_nightly / 1024).hist()
plt.xlabel('Size in kb')
plt.ylabel('Frequency')
plt.title('Nightly histogram & scalar payload size')
# # Get Release size data
# In[15]:
sizes_release = pd.Series(records_release.map(get_payload_size).collect())
# In[16]:
(sizes_release / 1024).describe(percentiles=[0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999])
# In[25]:
(sizes_release / 1024).hist()
plt.xlabel('Size in kb')
plt.ylabel('Frequency')
plt.title('Release histogram & scalar payload size')
# In[ ]:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment