Skip to content

Instantly share code, notes, and snippets.

@Uberi
Created April 1, 2016 17:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Uberi/73fd9a4474925888784e6f2a5b1c0334 to your computer and use it in GitHub Desktop.
Save Uberi/73fd9a4474925888784e6f2a5b1c0334 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Telemetry Hello World"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is a very a brief introduction to Spark and Telemetry in Python. You should have a look at the [tutorial](https://gist.github.com/vitillo/25a20b7c8685c0c82422) in Scala and the associated [talk](http://www.slideshare.net/RobertoAgostinoVitil/spark-meets-telemetry) if you are interested to learn more about Spark."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Unable to parse whitelist (/home/hadoop/anaconda2/lib/python2.7/site-packages/moztelemetry/bucket-whitelist.json). Assuming all histograms are acceptable.\n",
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: pylab import has clobbered these variables: ['Annotation', 'Figure']\n",
"`%matplotlib` prevents importing * from pylab and numpy\n"
]
}
],
"source": [
"import ujson as json\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import numpy as np\n",
"import plotly.plotly as py\n",
"from plotly.graph_objs import *\n",
"\n",
"from moztelemetry import get_pings, get_pings_properties, get_one_ping_per_client, get_clients_history, get_records\n",
"\n",
"%pylab inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Basics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The goal of this example is to plot the startup distribution for each OS. Let's see how many parallel workers we have at our disposal:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"32"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sc.defaultParallelism"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's fetch 10% of Telemetry submissions for a given build-id range..."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"pings = get_pings(sc, app=\"Firefox\", channel=\"nightly\", build_id=(\"20160301000000\", \"20160301999999\"), fraction=0.1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... and extract only the attributes we need from the Telemetry submissions:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"subset = get_pings_properties(pings, [\"clientId\",\n",
" \"environment/system/os/name\",\n",
" \"payload/simpleMeasurements/firstPaint\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's filter out submissions with an invalid startup time:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"subset = subset.filter(lambda p: p.get(\"payload/simpleMeasurements/firstPaint\", -1) >= 0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To prevent pseudoreplication, let's consider only a single submission for each client. As this step requires a distributed shuffle, it should always be run only after extracting the attributes of interest with *get_pings_properties*."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"subset = get_one_ping_per_client(subset)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Caching is fundamental as it allows for an iterative, real-time development workflow:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"cached = subset.cache()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How many pings are we looking at?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"5516"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cached.count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's group the startup timings by OS:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"grouped = cached.map(lambda p: (p[\"environment/system/os/name\"], p[\"payload/simpleMeasurements/firstPaint\"])).groupByKey().collectAsMap()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And finally plot the data:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nAABLYBFT2f9VkveeqSivqqt2PX5qti8WKMoBAAAYhbmuyl5VX5/kryR5d1W9M0kn+cEkj0nS3X1L\nkuur6ruT3JvkM0meN8+YAAAAYJkspMccAAAAONjCVmWHIVTVH1fVHVX1m1X1zqr63qq66NvzVdUv\nVdXlF/t1Ac5XVX3ygGMvqqrnDxEPAHBm7phzpFXVH3T35dPHj0zyb5O8ubs3zvH7H9DdfzzHEAHm\nYnf+A1g2VfUjSba6+2XT8S8n+XB3f9d0/C+S/H6SJ3b3t9+P1z2e5Cnd/bfmEPb+n/WYJHcm+Vvd\n/RPTYz+W5O1JvjbJ1ye5LMljk7xv+m0/1N2/MO/YOHzcMWc0uvvjSb4ryQ3JdjKtqjdW1dunX9dM\njz9zevzVSd5TVX+nqv7W9Lkfrapfmz7+xqr62enjO6vqyulrvreqbpnepf/lqnrgIH9hgH2q6qaq\n+t7p49uq6oer6vaqet90XZhU1fHpB8ud7/kPVfUNVfVlVfXfp7mupnnyzw31dwEOvTcn+bokmc5m\nfGSSP73r+a9L8mv3pyjfZZF3Hn83yd+e7kR1+ud39w3d/cQkz0ryge5+0vRLUc6BFOaMSnffmeSS\nqvriJHcl+XPd/ZQk35Hkx3ad+sRsX/38yiRvSvL06fEnJ3loVT0gyTOSvHHnpXd979VJfqy7vyrJ\nJ5J827z+PgAX6AHd/bQk/0eSjV3Hv+BDbXd/OMkPJ3l5kr+T5D3d/Z8WESRwJP16poV5tgvy30zy\nyaq6oqouS/KVSe6uqncnpy8a/vuqen1V/beqesnOC1XVC6fH3prtu9Q7xx9TVb9WVZtV9atV9eiq\nuqSqPjh9/lhVfa6qnj4dv6Gqvnx6MfKd03bId1TVQ2f8PX4vya8lWb9o7wyjpDBnjHZ6zC9L8tNV\n9V+T/HySP7XrnLdNP4QmyTuSPLmqHp7ks0neku3pSc9I8l/2vWaS3Nnd7971vSsX/W8AcHHs3Ll5\nR7Z3TJmpu/9VksuTvCjJ980xLuCI6+7fSXJvVT062wX6rye5Pcm1SZ6S5N3Z3rVp94XCr0nyl5N8\ndZLnVdWjqupLsn1h8dps30h5wq7zfyzJK7p7Ncm/yfaNk88neV9V/alsF/HvSPKM6cWAR3f3/8h2\nfvue7n5Stj/vfWbWXyXJS5J83zzWMWI8FOaMSlU9Lsnnuvv3sn2H6GPd/dXZ/g/AZbtO/dTOg+7+\nXJKtbF8JfXO2i/FvTPLl3f2+fKHP7nr8x5nztoQAF2AnX+3OVZ/L3s8HD9p5UFUPTvLo6fBhc48O\nOOp+PdvF8ddl+8bHW3eN33zA+b/W3f+zuz+b5D3ZvqD4tCS3dffd089sr9x1/rXZXl8oSX42991N\nf1OSZyb5hiT/NNvF99cm+Y3p829O8qPTVsZHTIv5M+rurWnsf+Xc/trwhRTmHHWnr1xOp6//P7lv\nyvoVSX5n+vgFSR4w43X+S7avnr4x28n8f0/yzrP9TIAB3d9ctHP+VpLVaR/5lyZ56q5zXpLkXyf5\nv5L89AVHCIzdznT2r8r2VPa3ZruYvnb63H67b358PvddUDxTvjtTr/kbc18x/rokx5KsZToTsrtf\nkuSvJXlwkjdX1ePP4e/yT5P8wDmcBwdSmHPUPWhnu7Qkv5Lkl7v7H06f+8kk61X1ziSPz6675Af4\nL0m+JMlbuvt3sz2l6Y27nu8zPAYYyoOr6sNV9ZHpnzdmdq7qJOnuN2e7OH9PkpuzPc0zVfUN2Z5d\n9JLu/rdJPjtd/RjgfP16kmcnubu33ZPtIvlMhflBbk/yDVX1iKr6omxPdd/9+t85ffz83NeC+LZs\nXxD4fHf/UZLNbLfovDHZnmHZ3e/p7n+W7bvoXznj51eSdPd/S/LeJM850zkwiym2HGnd/UUznvtA\ntnuVdvy96fE3JHnDvnP/c5IH7hp/5b7nHzd9eHe2+552jv/f5xs7wIXo7pn/je/uP7vr8e8nedyu\n8Zn2Ov+6Xedcf6ExAqP37iT/S7Zn4uw+9pDuvnu6vs+Z7FxM/FhVbWT7bvs92S6yd7w4ySuq6vuy\nvUjbC6ff80dV9eFsT59Ptgv279i1RtCNVfWN2W7zeU+S158tjql/nOSOs5wDB7KPOQAAAAzIVHYA\nAAAYkKnsAAAAZ1BVX5XtVd13phpXkj/s7muHi4qjxlR2AAAAGJCp7AAAADAghTkAAAAMSGEOAAAA\nA1KYAwAAwID+f7UXNxWmIM4FAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f17402f0fd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"frame = pd.DataFrame({x: np.log10(pd.Series(list(y))) for x, y in grouped.items()})\n",
"plt.figure(figsize=(17, 7))\n",
"frame.boxplot(return_type=\"axes\")\n",
"plt.ylabel(\"log10(firstPaint)\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also create interactive plots with [plotly](https://plot.ly/):"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\"seamless=\"seamless\" src=\"https://plot.ly/~mozilla/416.embed\" height=\"525\" width=\"100%\"></iframe>"
],
"text/plain": [
"<plotly.tools.PlotlyDisplay object>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig = plt.figure(figsize=(18, 7))\n",
"frame[\"Windows_NT\"].plot(kind=\"hist\", bins=50)\n",
"plt.title(\"startup distribution for Windows\")\n",
"plt.ylabel(\"count\")\n",
"plt.xlabel(\"log10(firstPaint)\")\n",
"py.iplot_mpl(fig, strip_style=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Histograms"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's fetch some pings first:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"pings = get_pings(sc, app=\"Firefox\", channel=\"nightly\", submission_date=\"20160301\", fraction=0.1, schema=\"v4\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's extract a histogram from the submissions:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"histograms = get_pings_properties(pings, \"payload/histograms/GC_MARK_MS\", with_processes=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The API returns three distinct histograms for each submission:\n",
"- a histogram for the parent process (*GC_MARK_MS_parent*)\n",
"- an aggregated histogram for the child processes (*GC_MARK_MS_children*)\n",
"- the aggregate of the parent and child histograms (*GC_MARK*)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's aggregate the histogram over all submissions and plot it:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f17202a6610>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA30AAAG9CAYAAACh/R8kAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XuYZFV56P/vC+MICoxAhE642BgYxURjUAZzYmIrcjO/\nAEbBiYkMQnJyAlEfNUbQHGfmmCjwi4q5wImRcDsqIokB8yNAONBJPAEZAsplECYxXGaUVgFRkxwD\n+P7+WKuZounu2tVV0129+/t5nnpmz9p7vbVqd132u9faa0dmIkmSJElqp+0WugGSJEmSpG3HpE+S\nJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJarGvSFxHnRcRERNw2pfxtEXFXRNwe\nEWd0lJ8eEZvqusM7yg+KiNsi4p6IOLujfHlEXFLr3BAR+3asW1O3vzsiTuj/5UqSJEnS0tKkp+98\n4IjOgogYA34ReHFmvhj4g1p+IHA8cCBwFHBOREStdi5wcmauBFZGxGTMk4GHM/MA4GzgrBprV+AD\nwMHAIcDaiFgxx9cpSZIkSUtS16QvM78IPDKl+DeBMzLz8brNt2v5McAlmfl4Zt4LbAJWRcQIsHNm\nbqjbXQQc21Hnwrp8GfCaunwEcE1mPpqZ3wGuAY7s8fVJkiRJ0pI212v6VgI/HxE3RsT1EfGyWr4X\n8EDHdltq2V7A5o7yzbXsKXUy8wng0YjYbZZYkiRJkqSGlvVRb9fMfEVEHAx8Dnj+gNoU3TeZUiEi\nB/TckiRJkrQoZea0udRce/oeAP6yBt4APBERu1N64/bt2G7vWrYF2GeacjrXRcT2wC6Z+fAssaaV\nmbM+1q5d23WbbR1jGNowLDGGoQ2+DveF+8J94b5wXyx0jGFog6/DfeG+aMe+mE3TpC94ag/cX1Gv\nvYuIlcDyzHwIuAJ4U52Rcz9gf+CmzHyQMmxzVZ3Y5QTg8hrrCmBNXT4OuK4uXw0cFhEr6qQuh9Uy\nSZIkSVJDXYd3RsSngTFg94i4H1gL/DlwfkTcDvyAksSRmRsj4lJgI/AYcEpuTTtPBS4AdgCuzMyr\navl5wMURsQl4CFhdYz0SER8EbgYSWJ9lQhdJkiRJUkNdk77MfPMMq94yw/YfBj48Tfk/AS+epvwH\nlNs8TBfrAkqi2LexsbEFjzEMbRiWGMPQhkHEGIY2DEuMYWjDsMQYhjYMS4xhaMOwxBiGNgxLjGFo\nw7DEGIY2DCLGMLRhWGIMQxuGJcYwtGFYYix0G6Lb+M/FICKyDa9DkiRJkuYiIsgBT+QiSZIkSVoE\nTPokSZIkqcVM+iRJkiSpxUz6JEkAjIyMEhGzPkZGRhe6mZIkqUdO5CJJAsoF4OUOObNu1fUGsJIk\naf45kYskSZIkLVEmfZIkSZLUYiZ9kiRJktRiJn2SJEmS1GImfZIkSZLUYiZ9kiRJktRiJn2SJEmS\n1GImfZIkSZLUYiZ9kiRJktRiJn2SpIEZGRklImZ9jIyMLnQzJUlaUiIzF7oNfYuIbMPrkKSFFBFA\nt+/SYLbv20HEkCRJvYsIMjOmW2dPnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmS\nJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIk\ntZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1\nmEmfJEmSJLWYSZ8ktcTIyCgRMeNjZGR0oZsoSZIWQGTmQrehbxGRbXgdktSPiABm+y4MZvuu7F5/\nfmJIkqTeRQSZGdOts6dPkiRJklqsa9IXEedFxERE3DbNundHxA8jYreOstMjYlNE3BURh3eUHxQR\nt0XEPRFxdkf58oi4pNa5ISL27Vi3pm5/d0Sc0N9LlSRJkqSlp0lP3/nAEVMLI2Jv4DDgvo6yA4Hj\ngQOBo4Bzooz1ATgXODkzVwIrI2Iy5snAw5l5AHA2cFaNtSvwAeBg4BBgbUSs6PkVSpIkSdIS1jXp\ny8wvAo9Ms+pjwHumlB0DXJKZj2fmvcAmYFVEjAA7Z+aGut1FwLEddS6sy5cBr6nLRwDXZOajmfkd\n4BrgyEavSpIkSZIEzPGavog4GnggM2+fsmov4IGO/2+pZXsBmzvKN9eyp9TJzCeAR+tw0ZliSZIk\nSZIaWtZrhYjYEXgfZWjntjDtjDPdrFu37snlsbExxsbGBtQcSZIkSRou4+PjjI+PN9q256QP+HFg\nFPhKvV5vb+CWiFhF6Y3bt2PbvWvZFmCfacrpWPf1iNge2CUzH46ILcDYlDrXz9SozqRPkiRJktps\nakfX+vXrZ9y26fDOqA8y847MHMnM52fmfpShmj+dmd8ErgDeVGfk3A/YH7gpMx+kDNtcVRPFE4DL\na+wrgDV1+Tjgurp8NXBYRKyok7ocVsskSZIkSQ117emLiE9Tetx2j4j7gbWZeX7HJsnWhHBjRFwK\nbAQeA07puGv6qcAFwA7AlZl5VS0/D7g4IjYBDwGra6xHIuKDwM31OdbXCV0kSZIkSQ3F1pxs8YqI\nbMPrkKR+lIEUs30XBrN9V3avPz8xJElS7yKCzJx2fpQ5zd4pSZIkSVocTPokSZIkqcVM+iRJkiSp\nxUz6JEmSJKnFTPokSZIkqcVM+iRJkiSpxUz6JEmSJKnFTPokSUNlZGSUiJjxMTIyutBNlCRpUfHm\n7JLUEm25OXu/r0OSpKXIm7NLkiRJ0hJl0idJkiRJLWbSJ0mSJEktZtInSZIkSS1m0idJkiRJLWbS\nJ0mSJEktZtInSZIkSS1m0idJkiRJLWbSJ0mSJEktZtInSZIkSS1m0idJkiRJLWbSJ0mSJEktZtIn\nSZIkSS1m0idJkiRJLWbSJ0mSJEktZtInSZIkSS1m0idJkiRJLWbSJ0lqnZGRUSJixsfIyOhCN1GS\npHkTmbnQbehbRGQbXock9SMigNm+C4PZviu71x+WGLPXH1QMSZIWk4ggM2O6dfb0SZIkSVKLmfRJ\nkiRJUouZ9EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmS\nJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi3VN+iLivIiYiIjbOsrOioi7IuLLEfEXEbFLx7rT\nI2JTXX94R/lBEXFbRNwTEWd3lC+PiEtqnRsiYt+OdWvq9ndHxAmDecmSJEmStHQ06ek7HzhiStk1\nwE9k5kuBTcDpABHxIuB44EDgKOCciIha51zg5MxcCayMiMmYJwMPZ+YBwNnAWTXWrsAHgIOBQ4C1\nEbFiTq9SkiRJkpaorklfZn4ReGRK2bWZ+cP63xuBvevy0cAlmfl4Zt5LSQhXRcQIsHNmbqjbXQQc\nW5ePAS6sy5cBr6nLRwDXZOajmfkdSqJ5ZI+vT5IkSZKWtEFc03cScGVd3gt4oGPdllq2F7C5o3xz\nLXtKncx8Ang0InabJZYkSZIkqaFl/VSOiPcDj2XmZwbUHoDovsnTrVu37snlsbExxsbGBtQcSZIk\nSRou4+PjjI+PN9p2zklfRJwIvI6twzGh9Mbt0/H/vWvZTOWddb4eEdsDu2TmwxGxBRibUuf6mdrT\nmfRJkiRJUptN7ehav379jNs2Hd4ZdPTARcSRwHuAozPzBx3bXQGsrjNy7gfsD9yUmQ9Shm2uqhO7\nnABc3lFnTV0+DriuLl8NHBYRK+qkLofVMklqnZGRUSJixsfIyOhCN1GSJC1SXXv6IuLTlB633SPi\nfmAt8D5gOfC3dXLOGzPzlMzcGBGXAhuBx4BTMjNrqFOBC4AdgCsz86pafh5wcURsAh4CVgNk5iMR\n8UHgZiCB9XVCF0lqnYmJ+yhfdTOtn9PId0mSJGJrTrZ4RUS24XVIWrrKCbTZvseCbt9z/cboXn9Y\nYmz7fSFJ0mITEWTmtGeJBzF7pyRJkiRpSJn0SZIkSVKLmfRJkiRJUouZ9ElSn7rNvOnsm5IkaSE5\nkYsk9aktk5c4kYskSYuXE7lIkiRJ0hJl0idJkiRJLWbSJ0nSFF6nKUlqE6/pk6Q+teU6Nq/p66V+\ns3ZIkjRfvKZPkiRJkpYokz5JkiRJajGTPkmSJElqMZM+SZIkSWoxkz5JkiRJajGTPkmSJElqMZM+\nSZIkSWoxkz5JkiRJajGTPkmSJElqMZM+SZIkSWoxkz5JkiRJajGTPkmSJElqMZM+SZK2gZGRUSJi\n1sfIyOhCN1OStAREZi50G/oWEdmG1yFpcYoIoNt3UDDb91T3GLPXH0SM+Xkdg4ixdPaFJElNRQSZ\nGdOts6dPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJ\nklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmS\nWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWqxr0hcR50XERETc1lG2a0RcExF3R8TVEbGiY93pEbEp\nIu6KiMM7yg+KiNsi4p6IOLujfHlEXFLr3BAR+3asW1O3vzsiThjMS5YkSZKkpaNJT9/5wBFTyk4D\nrs3MFwDXAacDRMSLgOOBA4GjgHMiImqdc4GTM3MlsDIiJmOeDDycmQcAZwNn1Vi7Ah8ADgYOAdZ2\nJpeSJEmSpO66Jn2Z+UXgkSnFxwAX1uULgWPr8tHAJZn5eGbeC2wCVkXECLBzZm6o213UUacz1mXA\na+ryEcA1mfloZn4HuAY4sofXJkmSJElL3lyv6dsjMycAMvNBYI9avhfwQMd2W2rZXsDmjvLNtewp\ndTLzCeDRiNhtlliSJC0JIyOjRMSMj5GR0YVuoiRpEVg2oDg5oDgA0X2Tp1u3bt2Ty2NjY4yNjQ2o\nOZIkLYyJifuY7Sd2YmJOP5mSpBYYHx9nfHy80bZzTfomImLPzJyoQze/Wcu3APt0bLd3LZupvLPO\n1yNie2CXzHw4IrYAY1PqXD9TgzqTPkmSJElqs6kdXevXr59x26bDO4On9sBdAZxYl9cAl3eUr64z\ncu4H7A/cVIeAPhoRq+rELidMqbOmLh9HmRgG4GrgsIhYUSd1OayWSZIkSZIa6trTFxGfpvS47R4R\n9wNrgTOAz0XEScB9lBk7ycyNEXEpsBF4DDglMyfHpZwKXADsAFyZmVfV8vOAiyNiE/AQsLrGeiQi\nPgjcTBnbsr5O6CJJkiRJaii25mSLV0RkG16HpMWpDGDo9h0UzPY91T3G7PUHEWN+XscgYrgvmtaX\nJC0dEUFmTnux91xn75QkSZIkLQImfZIkSZLUYiZ9kiRJktRiJn2SJEmS1GImfZIkSZLUYiZ9kiRJ\nktRiJn2SJEmS1GImfZIkSZLUYiZ9kiRJktRiJn2SJEmS1GImfZKWtJGRUSJi1sfIyOhCN1OSJGnO\nIjMXug19i4hsw+uQNP8iAuj2/RHM9h0zPzFmrz+IGO6LXuoPS4zu+0KStDREBJkZ062zp0+SJEmS\nWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJa\nzKRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrM\npE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsyk\nT5IkSZJazKRPkqQWGxkZJSJmfIyMjC50EyVJ21hk5kK3oW8RkW14HZLmX0QA3b4/gtm+Y+Ynxuz1\nBxHDfdFL/WGJse33hSRpcYgIMjOmW2dPnyRJkiS1mEmfJEmSJLWYSZ8kSZIktVhfSV9EvDMi7oiI\n2yLiUxGxPCJ2jYhrIuLuiLg6IlZ0bH96RGyKiLsi4vCO8oNqjHsi4uyO8uURcUmtc0NE7NtPeyVJ\nkiRpqZlz0hcRPwa8DTgoM18CLAN+GTgNuDYzXwBcB5xet38RcDxwIHAUcE6Uq8sBzgVOzsyVwMqI\nOKKWnww8nJkHAGcDZ821vZIkSZK0FPU7vHN74NkRsQzYEdgCHANcWNdfCBxbl48GLsnMxzPzXmAT\nsCoiRoCdM3ND3e6ijjqdsS4DDu2zvZIkSZK0pMw56cvMrwMfAe6nJHuPZua1wJ6ZOVG3eRDYo1bZ\nC3igI8SWWrYXsLmjfHMte0qdzHwC+E5E7DbXNkuSJEnSUrNsrhUj4jmUnrjnAY8Cn4uIX+HpNwMa\n5M1/pr3vBMC6deueXB4bG2NsbGyATytJkiRJw2N8fJzx8fFG28456QNeC3wtMx8GiIjPA/8FmIiI\nPTNzog7d/GbdfguwT0f9vWvZTOWddb4eEdsDu0w+31SdSZ8kSZIktdnUjq7169fPuG0/1/TdD7wi\nInaoE7IcCmwErgBOrNusAS6vy1cAq+uMnPsB+wM31SGgj0bEqhrnhCl11tTl4ygTw0iSJEmSGppz\nT19m3hQRlwG3Ao/Vfz8B7AxcGhEnAfdRZuwkMzdGxKWUxPAx4JTMnBz6eSpwAbADcGVmXlXLzwMu\njohNwEPA6rm2V5IkSZKWotiady1eEZFteB2S5l8ZYNDt+yOY7TtmfmLMXn8QMdwXvdQflhjbfl9I\nkhaHiCAzp50Dpd9bNkiSJEmShphJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmS\nJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEma0cjIKBEx62NkZHShmylJmkVk5kK3oW8RkW14HZLmX0QA\n3b4/gtm+Y+Ynxuz1BxHDfdFL/WGJsTj2hSRp24sIMjOmW2dPnyRJkiS1mEmfJEmSJLWYSZ8kSZIk\ntZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1\nmEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWY\nSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJnyRJkiS1mEmfJEmSJLWYSZ8kSZIktZhJ\nn6RFbWRklIiY8TEyMrrQTZQkSVpQyxa6AZLUj4mJ+4CcZX3MX2MkSZKGkD19kiRJktRiJn2SJEmS\n1GImfZIkSZLUYn0lfRGxIiI+FxF3RcSdEXFIROwaEddExN0RcXVErOjY/vSI2FS3P7yj/KCIuC0i\n7omIszvKl0fEJbXODRGxbz/tlSRJkqSlpt+evo8DV2bmgcBPAV8FTgOuzcwXANcBpwNExIuA44ED\ngaOAcyJicoaFc4GTM3MlsDIijqjlJwMPZ+YBwNnAWX22V5IkSZKWlDknfRGxC/BzmXk+QGY+npmP\nAscAF9bNLgSOrctHA5fU7e4FNgGrImIE2DkzN9TtLuqo0xnrMuDQubZXkiRJkpaifnr69gO+HRHn\nR8QtEfGJiHgWsGdmTgBk5oPAHnX7vYAHOupvqWV7AZs7yjfXsqfUycwngO9ExG59tFmSJM0z76cp\nSQurn/v0LQMOAk7NzJsj4mOUoZ1Tb5g18w20ejfjDbfWrVv35PLY2BhjY2MDfFpJkjRX3k9TkgZv\nfHyc8fHxRttG5txysojYE7ghM59f//9KStL348BYZk7UoZvXZ+aBEXEakJl5Zt3+KmAtcN/kNrV8\nNfCqzPzNyW0y80sRsT3wjczcY5q25Fxfh6TFrVwaPNvnP5jt+6F7/WGJMXv9QcRwX/RSf1hitGVf\ndH8dkqTZRQSZOe1ZtDkP76xDOB+IiJW16FDgTuAK4MRatga4vC5fAayuM3LuB+wP3FSHgD4aEavq\nxC4nTKmzpi4fR5kYRpIkSZLUUD/DOwHeDnwqIp4BfA14K7A9cGlEnETpxTseIDM3RsSlwEbgMeCU\nju65U4ELgB0os4FeVcvPAy6OiE3AQ8DqPtsrSZIkSUvKnId3DhOHd0pL1+IYujaIGG0ZxjeIGO6L\npvUHEWNYXockaXbbZHinJEmSJGn4mfRJkiRJUouZ9EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmS\nJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIk\nSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi5n0SVowIyOjRMSMj5GR\n0YVuoiRJ0qK3bKEbIGnpmpi4D8hZ1sf8NUaSJKml7OmTJEmSpBYz6ZMkSUPP4eCSNHcO75QkSUPP\n4eCSNHf29EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmS\nJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIkSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIk\nSVKLmfRJkiRJUouZ9EmSJElSi5n0SZIkSVKL9Z30RcR2EXFLRFxR/79rRFwTEXdHxNURsaJj29Mj\nYlNE3BURh3eUHxQRt0XEPRFxdkf58oi4pNa5ISL27be9kiRJkrSUDKKn7x3Axo7/nwZcm5kvAK4D\nTgeIiBcBxwMHAkcB50RE1DrnAidn5kpgZUQcUctPBh7OzAOAs4GzBtBeSZIkSVoy+kr6ImJv4HXA\nJzuKjwEurMsXAsfW5aOBSzLz8cy8F9gErIqIEWDnzNxQt7uoo05nrMuAQ/tpryRJkiQtNf329H0M\neA+QHWV7ZuYEQGY+COxRy/cCHujYbkst2wvY3FG+uZY9pU5mPgF8JyJ267PNkiRJkrRkLJtrxYj4\nBWAiM78cEWOzbJqzrOv5aWdasW7duieXx8bGGBsbG+DTSpIkSdLwGB8fZ3x8vNG2kTm3nCwiPgT8\nKvA4sCOwM/B54OXAWGZO1KGb12fmgRFxGpCZeWatfxWwFrhvcptavhp4VWb+5uQ2mfmliNge+EZm\n7jGlKUREzvV1SFo45bLe2T67QbfPdr8xutcflhjui6b1BxHDfdFL/UHE2PavQ5LaLiLIzGk7yeY8\nvDMz35eZ+2bm84HVwHWZ+RbgC8CJdbM1wOV1+QpgdZ2Rcz9gf+CmOgT00YhYVSd2OWFKnTV1+TjK\nxDCSJEmSpIbmPLxzFmcAl0bESZRevOMBMnNjRFxKmenzMeCUju65U4ELgB2AKzPzqlp+HnBxRGwC\nHqIkl5IkSZKkhuY8vHOYOLxTWpyGYciXw/h6qT8sMdwXTesPIkZbXocktd02Gd4pSZIkSRp+Jn2S\nJEmS1GImfZLmZGRklIiY9TEyMrrQzZQkSVrytsVELpKWgImJ++h2nc/ExIy31pQkSdI8sadPkiRJ\nklrMpE+SJC0J3YalOyRdUls5vFOSJC0J3YalOyRdUlvZ0ydJkiRJLWbSJ0mSJEktZtInSZIkSS1m\n0idJkiRJLWbSJ0mSJEktZtInSZIkSS1m0idJkiRJLWbSJ0mSJEktZtInSZIkSS1m0idJkiRJLWbS\nJ0mSJEktZtInSZIkSS1m0idJkiRJLWbSJy1CIyOjRMSMj5GR0YVuoiRJkoaESZ+0CE1M3AfkjI+y\nXpI0SN1OuHnSTdKwWrbQDZAkSVoMtp5wm22bmJ/GSFIP7OmTliiHiEqSJC0N9vRJS1S3M9aerZYk\nSWoHe/okSZIkqcVM+iRJkiSpxUz6JEmSJKnFTPokSZIkqcVM+iRJkiSpxUz6JEmSJKnFTPqkeeb9\n8SRJkjSfvE+fNM+8P54kSZLmkz19kiRJktRiJn2SJEmS1GImfZIkSZLUYiZ9Ug+6TcLiRCySJEka\nNk7kIvWg2yQsZRsnYpEkSdLwsKdPkiRJklrMpE+SJEmSWmzOSV9E7B0R10XEnRFxe0S8vZbvGhHX\nRMTdEXF1RKzoqHN6RGyKiLsi4vCO8oMi4raIuCcizu4oXx4Rl9Q6N0TEvnNtryRJkiQtRf309D0O\nvCszfwL4GeDUiHghcBpwbWa+ALgOOB0gIl4EHA8cCBwFnBMRkxc/nQucnJkrgZURcUQtPxl4ODMP\nAM4GzuqjvZIkSZK05Mw56cvMBzPzy3X5+8BdwN7AMcCFdbMLgWPr8tHAJZn5eGbeC2wCVkXECLBz\nZm6o213UUacz1mXAoXNtryRJkiQtRQO5pi8iRoGXAjcCe2bmBJTEENijbrYX8EBHtS21bC9gc0f5\n5lr2lDqZ+QTwnYjYbRBtliRJmm/dbv3jbX8kbQt937IhInai9MK9IzO/HxFT57OffX77Hp9uphXr\n1q17cnlsbIyxsbEBPq0kSVL/ut36x9v+SGpqfHyc8fHxRtv2lfRFxDJKwndxZl5eiyciYs/MnKhD\nN79Zy7cA+3RU37uWzVTeWefrEbE9sEtmPjxdWzqTPkmSJElqs6kdXevXr59x236Hd/45sDEzP95R\ndgVwYl1eA1zeUb66zsi5H7A/cFMdAvpoRKyqE7ucMKXOmrp8HGViGEmSJElSQ3Pu6YuInwV+Bbg9\nIm6ljFV4H3AmcGlEnATcR5mxk8zcGBGXAhuBx4BTMnNyfMOpwAXADsCVmXlVLT8PuDgiNgEPAavn\n2l5JkiRJWopia961eEVEtuF1aNsbGRmt11NMb889n8eDD9474/rSGd3tvRbM9n7sHmP2+sMSoy37\nYn5exyBiuC+a1h9EDPdFL/UHEcPvvab1JWkmEUFmTnthcN8TuUiLiRfQS5IkaakZyC0bJEmSJEnD\nyaRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrMpE+SJEmSWsykT5IkSZJazKRPkiRJklrM\npE+SJEmSWsykT5IkSZJazKRPkiRpERkZGSUiZnyMjIwudBMlDZllC90ASZIkNTcxcR+Qs6yP+WuM\n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\nTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f174007fed0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def aggregate_arrays(xs, ys):\n",
" if xs is None:\n",
" return ys\n",
" \n",
" if ys is None:\n",
" return xs\n",
" \n",
" return xs + ys\n",
" \n",
"aggregate = histograms.map(lambda p: p[\"payload/histograms/GC_MARK_MS\"]).reduce(aggregate_arrays)\n",
"aggregate.plot(kind=\"bar\", figsize=(15, 7))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Keyed histograms follow a similar pattern. To extract a keyed histogram for which we know the key/label we are interested in:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"histograms = get_pings_properties(pings, \"payload/keyedHistograms/SUBPROCESS_ABNORMAL_ABORT/plugin\", with_processes=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"List all keys/labels for a keyed histogram:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"keys = pings.flatMap(lambda p: p[\"payload\"].get(\"keyedHistograms\", {}).get(\"MISBEHAVING_ADDONS_JANK_LEVEL\", {}).keys())\n",
"keys = keys.distinct().collect()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[u'autonextfirefox@everhelper.me',\n",
" u'{73a6fe31-595d-460b-a920-fcc0f8843232}',\n",
" u'{c50ca3c4-5656-43c2-a061-13e717f73fc8}',\n",
" u'firefox@zenmate.com',\n",
" u'veggy@veggyAddon.com']"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"keys[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Retrieve the histograms for a set of labels:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"properties = map(lambda k: \"payload/keyedHistograms/{}/{}\".format(\"MISBEHAVING_ADDONS_JANK_LEVEL\", k), keys[:5])"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"histograms = get_pings_properties(pings, properties, with_processes=True)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"34329"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records = get_records(sc, \"telemetry-webrtc\", submissionDate=\"20160101-protobuf-single\")\n",
"records.count()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"34339"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records = get_records(sc, \"telemetry-webrtc\", submissionDate=\"20160101-snappy-single\")\n",
"records.count()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"34327"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records = get_records(sc, \"telemetry-webrtc\", submissionDate=\"20160101-protobuf-50mb\")\n",
"records.count()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"34327"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records = get_records(sc, \"telemetry-webrtc\", submissionDate=\"20160101-snappy-50mb\")\n",
"records.count()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"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.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment