Last active
October 21, 2021 23:27
-
-
Save glennklockwood/f61f52ed6062e6393804b6f37760c974 to your computer and use it in GitHub Desktop.
Demonstrate accessing ESnet's SNMP GraphQL service
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| CSRF_TOK=$(curl --verbose -D - https://my.es.net/ 2>/dev/null | grep -o 'csrftoken=[^;]*' | cut -d= -f2) | |
| echo "CSRF token = [$CSRF_TOK]" | |
| curl \ | |
| --referer https://my.es.net/nersc-400g \ | |
| -X POST \ | |
| -b "csrftoken=$CSRF_TOK" \ | |
| -H "X-CSRFToken: $CSRF_TOK" \ | |
| -H "Content-Type: application/json" \ | |
| -H "Accept: application/json" \ | |
| --data '{"query":"{ mapTopology(name: \"nersc-400g\"){ paths { traffic(beginTime: \"2019-04-01T00:00:00.000Z\", endTime: \"2019-04-01T01:00:00.000Z\") } } }"}' \ | |
| https://my.es.net/graphql |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# Demonstrate ESnet's GraphQL API\n", | |
| "\n", | |
| "This notebook demonstrates how to access SNMP data from ESnet's newer GraphQL query interface." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "%matplotlib inline" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import os\n", | |
| "import json\n", | |
| "import time\n", | |
| "import datetime\n", | |
| "\n", | |
| "import numpy\n", | |
| "import pandas\n", | |
| "import matplotlib\n", | |
| "\n", | |
| "import requests" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Define input parameters" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "END_TIME = datetime.datetime.now()\n", | |
| "START_TIME = END_TIME - datetime.timedelta(seconds=600)\n", | |
| "\n", | |
| "URL = 'https://my.es.net/'\n", | |
| "GRAPHQL_URL = URL + \"graphql\"" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "1. Convert datetime objects into strings to be inserted into the GraphQL query\n", | |
| "2. Build the actual GraphQL query as a string\n", | |
| "3. Embed the query string into JSON before being sent over REST" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "START_STR = datetime.datetime.utcfromtimestamp(time.mktime(START_TIME.timetuple())).strftime(\"%Y-%m-%dT%H:%M:%S.000Z\")\n", | |
| "END_STR = datetime.datetime.utcfromtimestamp(time.mktime(END_TIME.timetuple())).strftime(\"%Y-%m-%dT%H:%M:%S.000Z\")\n", | |
| "\n", | |
| "QUERY = \"query getSiteTraffic($siteName: String, $beginTime: String, $endTime: String) {\\n networkEntity(shortName: $siteName, entityType: \\\"ESnet Site\\\") {\\n id\\n interfaces(beginTime: $beginTime, endTime: $endTime) {\\n traffic {\\n columns\\n name\\n points\\n __typename\\n }\\n __typename\\n }\\n saps(beginTime: $beginTime, endTime: $endTime) {\\n traffic {\\n columns\\n name\\n points\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n}\\n\"\n", | |
| "QUERY_DICT = {\n", | |
| " \"operationName\": \"getSiteTraffic\",\n", | |
| " \"variables\": {\n", | |
| " \"siteName\": \"NERSC\",\n", | |
| " \"beginTime\": START_STR,\n", | |
| " \"endTime\": END_STR,\n", | |
| " },\n", | |
| " \"query\": QUERY,\n", | |
| "}" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Establish the HTTP session, get the required referral and CSRF token, and dispatch the GraphQL query" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/Users/glock/anaconda3/lib/python3.8/site-packages/urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'my.es.net'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings\n", | |
| " warnings.warn(\n", | |
| "/Users/glock/anaconda3/lib/python3.8/site-packages/urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'my.es.net'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings\n", | |
| " warnings.warn(\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "session = requests.Session()\n", | |
| "\n", | |
| "# Get the CSRF token\n", | |
| "response = session.get(URL, verify=False)\n", | |
| "response.raise_for_status()\n", | |
| "csrf = session.cookies['csrftoken']\n", | |
| "\n", | |
| "# Set the CSRF token and referer for all subsequent queries\n", | |
| "session.headers.update({\n", | |
| " \"Referer\": URL,\n", | |
| " \"X-CSRFToken\": csrf,\n", | |
| " \"Accept\": \"application/json\",\n", | |
| "})\n", | |
| "\n", | |
| "# Issue the query\n", | |
| "ret = session.post(\n", | |
| " GRAPHQL_URL,\n", | |
| " json=QUERY_DICT,\n", | |
| " headers={\n", | |
| " \"Content-Type\": \"application/json\",\n", | |
| " },\n", | |
| " verify=False)\n", | |
| "\n", | |
| "# Parse the resulting JSON into a Python dictionary\n", | |
| "raw_rest = ret.json()\n", | |
| "if 'errors' in raw_rest:\n", | |
| " print(json.dumps(raw_rest, indent=2))\n", | |
| "assert 'errors' not in raw_rest" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Convert the raw output from GraphQL into a dictionary of Series, then convert those Series into a single DataFrame" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div>\n", | |
| "<style scoped>\n", | |
| " .dataframe tbody tr th:only-of-type {\n", | |
| " vertical-align: middle;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe tbody tr th {\n", | |
| " vertical-align: top;\n", | |
| " }\n", | |
| "\n", | |
| " .dataframe thead th {\n", | |
| " text-align: right;\n", | |
| " }\n", | |
| "</style>\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>devices/lbnl50-cr6/interfaces/nersc_se-131_in</th>\n", | |
| " <th>devices/lbnl50-cr6/interfaces/nersc_se-131_out</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-128_in</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-128_out</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-129_in</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-129_out</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-603_in</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-603_out</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-610_in</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-610_out</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-130_in</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-130_out</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-127_in</th>\n", | |
| " <th>devices/lbnl59-cr6/interfaces/nersc_se-127_out</th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>2021-10-21 15:34:30</th>\n", | |
| " <td>5269.558333</td>\n", | |
| " <td>5485.083333</td>\n", | |
| " <td>2109.111111</td>\n", | |
| " <td>17439.786667</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.228693e+09</td>\n", | |
| " <td>8.780867e+09</td>\n", | |
| " <td>1.548676e+05</td>\n", | |
| " <td>1.248740e+07</td>\n", | |
| " <td>1.671111</td>\n", | |
| " <td>1.671111</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2021-10-21 15:35:00</th>\n", | |
| " <td>4024.500000</td>\n", | |
| " <td>5471.925000</td>\n", | |
| " <td>2357.946667</td>\n", | |
| " <td>16840.568889</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.775910e+09</td>\n", | |
| " <td>7.903009e+09</td>\n", | |
| " <td>5.299186e+06</td>\n", | |
| " <td>1.473758e+07</td>\n", | |
| " <td>48.462222</td>\n", | |
| " <td>48.462222</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2021-10-21 15:35:30</th>\n", | |
| " <td>5305.491667</td>\n", | |
| " <td>5503.433333</td>\n", | |
| " <td>4855.253333</td>\n", | |
| " <td>18781.617778</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>3.936130e+09</td>\n", | |
| " <td>6.838062e+09</td>\n", | |
| " <td>1.279743e+07</td>\n", | |
| " <td>1.101646e+07</td>\n", | |
| " <td>1.671111</td>\n", | |
| " <td>1.671111</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2021-10-21 15:36:00</th>\n", | |
| " <td>4227.291667</td>\n", | |
| " <td>5723.641667</td>\n", | |
| " <td>3726.933333</td>\n", | |
| " <td>16386.524444</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>3.701776e+09</td>\n", | |
| " <td>7.518067e+09</td>\n", | |
| " <td>1.179103e+07</td>\n", | |
| " <td>1.181213e+07</td>\n", | |
| " <td>48.462222</td>\n", | |
| " <td>48.462222</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>2021-10-21 15:36:30</th>\n", | |
| " <td>5640.333333</td>\n", | |
| " <td>5608.500000</td>\n", | |
| " <td>5424.808889</td>\n", | |
| " <td>17690.764444</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>2.278433e+09</td>\n", | |
| " <td>8.792796e+09</td>\n", | |
| " <td>9.112580e+05</td>\n", | |
| " <td>2.154200e+07</td>\n", | |
| " <td>1.671111</td>\n", | |
| " <td>1.671111</td>\n", | |
| " <td>0.0</td>\n", | |
| " <td>0.0</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "text/plain": [ | |
| " devices/lbnl50-cr6/interfaces/nersc_se-131_in \\\n", | |
| "2021-10-21 15:34:30 5269.558333 \n", | |
| "2021-10-21 15:35:00 4024.500000 \n", | |
| "2021-10-21 15:35:30 5305.491667 \n", | |
| "2021-10-21 15:36:00 4227.291667 \n", | |
| "2021-10-21 15:36:30 5640.333333 \n", | |
| "\n", | |
| " devices/lbnl50-cr6/interfaces/nersc_se-131_out \\\n", | |
| "2021-10-21 15:34:30 5485.083333 \n", | |
| "2021-10-21 15:35:00 5471.925000 \n", | |
| "2021-10-21 15:35:30 5503.433333 \n", | |
| "2021-10-21 15:36:00 5723.641667 \n", | |
| "2021-10-21 15:36:30 5608.500000 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-128_in \\\n", | |
| "2021-10-21 15:34:30 2109.111111 \n", | |
| "2021-10-21 15:35:00 2357.946667 \n", | |
| "2021-10-21 15:35:30 4855.253333 \n", | |
| "2021-10-21 15:36:00 3726.933333 \n", | |
| "2021-10-21 15:36:30 5424.808889 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-128_out \\\n", | |
| "2021-10-21 15:34:30 17439.786667 \n", | |
| "2021-10-21 15:35:00 16840.568889 \n", | |
| "2021-10-21 15:35:30 18781.617778 \n", | |
| "2021-10-21 15:36:00 16386.524444 \n", | |
| "2021-10-21 15:36:30 17690.764444 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-129_in \\\n", | |
| "2021-10-21 15:34:30 0.0 \n", | |
| "2021-10-21 15:35:00 0.0 \n", | |
| "2021-10-21 15:35:30 0.0 \n", | |
| "2021-10-21 15:36:00 0.0 \n", | |
| "2021-10-21 15:36:30 0.0 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-129_out \\\n", | |
| "2021-10-21 15:34:30 0.0 \n", | |
| "2021-10-21 15:35:00 0.0 \n", | |
| "2021-10-21 15:35:30 0.0 \n", | |
| "2021-10-21 15:36:00 0.0 \n", | |
| "2021-10-21 15:36:30 0.0 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-603_in \\\n", | |
| "2021-10-21 15:34:30 2.228693e+09 \n", | |
| "2021-10-21 15:35:00 2.775910e+09 \n", | |
| "2021-10-21 15:35:30 3.936130e+09 \n", | |
| "2021-10-21 15:36:00 3.701776e+09 \n", | |
| "2021-10-21 15:36:30 2.278433e+09 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-603_out \\\n", | |
| "2021-10-21 15:34:30 8.780867e+09 \n", | |
| "2021-10-21 15:35:00 7.903009e+09 \n", | |
| "2021-10-21 15:35:30 6.838062e+09 \n", | |
| "2021-10-21 15:36:00 7.518067e+09 \n", | |
| "2021-10-21 15:36:30 8.792796e+09 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-610_in \\\n", | |
| "2021-10-21 15:34:30 1.548676e+05 \n", | |
| "2021-10-21 15:35:00 5.299186e+06 \n", | |
| "2021-10-21 15:35:30 1.279743e+07 \n", | |
| "2021-10-21 15:36:00 1.179103e+07 \n", | |
| "2021-10-21 15:36:30 9.112580e+05 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-610_out \\\n", | |
| "2021-10-21 15:34:30 1.248740e+07 \n", | |
| "2021-10-21 15:35:00 1.473758e+07 \n", | |
| "2021-10-21 15:35:30 1.101646e+07 \n", | |
| "2021-10-21 15:36:00 1.181213e+07 \n", | |
| "2021-10-21 15:36:30 2.154200e+07 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-130_in \\\n", | |
| "2021-10-21 15:34:30 1.671111 \n", | |
| "2021-10-21 15:35:00 48.462222 \n", | |
| "2021-10-21 15:35:30 1.671111 \n", | |
| "2021-10-21 15:36:00 48.462222 \n", | |
| "2021-10-21 15:36:30 1.671111 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-130_out \\\n", | |
| "2021-10-21 15:34:30 1.671111 \n", | |
| "2021-10-21 15:35:00 48.462222 \n", | |
| "2021-10-21 15:35:30 1.671111 \n", | |
| "2021-10-21 15:36:00 48.462222 \n", | |
| "2021-10-21 15:36:30 1.671111 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-127_in \\\n", | |
| "2021-10-21 15:34:30 0.0 \n", | |
| "2021-10-21 15:35:00 0.0 \n", | |
| "2021-10-21 15:35:30 0.0 \n", | |
| "2021-10-21 15:36:00 0.0 \n", | |
| "2021-10-21 15:36:30 0.0 \n", | |
| "\n", | |
| " devices/lbnl59-cr6/interfaces/nersc_se-127_out \n", | |
| "2021-10-21 15:34:30 0.0 \n", | |
| "2021-10-21 15:35:00 0.0 \n", | |
| "2021-10-21 15:35:30 0.0 \n", | |
| "2021-10-21 15:36:00 0.0 \n", | |
| "2021-10-21 15:36:30 0.0 " | |
| ] | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "columns = []\n", | |
| "\n", | |
| "for blob in raw_rest['data']['networkEntity']['interfaces']:\n", | |
| " blob_data = blob['traffic']\n", | |
| " x = [datetime.datetime.fromtimestamp(point[0] / 1000) for point in blob_data[\"points\"]]\n", | |
| " for i in range(len(blob_data['columns']) - 1):\n", | |
| " columns.append(pandas.Series([point[i+1] for point in blob_data[\"points\"]], index=x))\n", | |
| " columns[-1].name = blob_data['name'] + \"_\" + blob_data['columns'][i+1]\n", | |
| "\n", | |
| "dataframe = pandas.concat(columns, axis=1, keys=[s.name for s in columns])\n", | |
| "dataframe.head()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Plot the data to show aggregate read and write. Note that \"in\" is relative to ESnet, so \"in\" is data that is leaving NERSC and \"out\" is data entering NERSC." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "plot_dfs = {\n", | |
| " \"in\": dataframe[[x for x in dataframe.columns if x.endswith('_in')]],\n", | |
| " \"out\": dataframe[[x for x in dataframe.columns if x.endswith('_out')]],\n", | |
| "}" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 19, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Assigning color C0 to nersc_se-131\n", | |
| "Assigning color C1 to nersc_se-128\n", | |
| "Assigning color C2 to nersc_se-129\n", | |
| "Assigning color C3 to nersc_se-603\n", | |
| "Assigning color C4 to nersc_se-610\n", | |
| "Assigning color C5 to nersc_se-130\n", | |
| "Assigning color C6 to nersc_se-127\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/var/folders/tn/3pp8qwxx7kd1gkwjh1lxpssr0023zg/T/ipykernel_7697/1858954119.py:68: UserWarning: FixedFormatter should only be used together with FixedLocator\n", | |
| " _ = ax.set_yticklabels([\"%d\" % abs(y) for y in ax.get_yticks()])\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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Lc1HkYmIiIiINC2/Dh0pKiqiW7du9e6fOXMmcXFxde6LjY0lIyPDV6GJiIiIiDQpvybaERER2Gy2evffcMMN9e6z2WyEh4f7IiwRERERkSbn16Ej7du3Z9euXZSXlzfovNLSUnbt2qUVFkVERESkxfBroj148GAcDgcff/xxg86bPXs2DoeDwYMH+ygyEREREZGm5ddEe8KECXg8HqZMmcKBAwdO6Jx9+/YxZcoUDAYDEyZM8G2AIiIiIiJNxK+J9jnnnMO4cePYv38/559/Pp999hn1rZfj8XiYO3cuF1xwAdnZ2YwdO5ZzzjnHn+GKiIiIiDSaXydDArz99ttkZmby448/MmbMGBITE7ngggvo1KkT4eHhlJaWkp6ezooVK8jOzsbj8XDBBRcwffp0f4cqIiIiItJofl2CvZrT6WTq1Km89tprlJSUVAViMHj3V4cUERHBH/7wBx5//HEsFou/w/Q7LcEuIiIi0rw1ZAn2gCTa1YqKipg/fz4rVqxg//79FBcXY7Vaad++PRdccAEjRowgOjo6UOH5nRJtERERkeatxSTaUpMSbREREZHmrSGJtl8nQ4qIiIiItBZKtEVEREREfECJtoiIiIiIDyjRFhERERHxASXaIiIiIiI+oERbRERERMQHlGiLiIiIiPiAEm0RERERER9Qoi0iIiIi4gNKtEVEREREfECJtoiIiIiIDyjRFhERERHxASXaIiIiIiI+oERbRERERMQHlGiLiIiIiPiAEm0RERERER9Qoi0iIiIi4gNKtEVEREREfECJtoiIiIiIDyjRFhERERHxASXaIiIiIiI+oERbRERERMQHlGiLiIiIiPiAEm0RERERER9Qoi0iIiIi4gNKtEVEREREfECJtoiIiIiIDyjRFhERERHxASXaIiIiIiI+oERbRERERMQHlGiLiIiIiPiAEm0RERERER9Qoi0iIiIi4gNKtEVEREREfECJtoiIiIiIDyjRFhERERHxASXaIiIiIiI+oERbRERERMQHlGiLiIiIiPiAEm0RERERER9Qoi0iIiIi4gNKtEVEREREfECJtoiIiIiIDyjRFhERERHxASXaIiIiIiI+oERbRERERMQHlGiLiIiIiPiAEm0RERERER9Qoi0iIiIi4gNKtEVEREREfECJtoiIiIiIDyjRFhERERHxASXaTWD+/PlcdtlltGnT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PuqkH6d6Ceb6fs07derE3r172bNnD506dfJuLykpYfTo0d7yVx06dCApKYmysjLS0tK8k36O/PedMWMGt99+O7fddhszZsyo8/mio6MpKioiODiY7t27Exoayr59+7y3aR955BGeeOKJGue8//77TJw4EYfDQVhYGL169aK8vJw9e/ZQUVHBO++8w/jx4+sdK1mXwsJC72Sk8PBwunXrhsViIT09ndzcXAwGA2+++Watcar//ve/ueeee3C5XFitVnr06IHBYCAzM5Ps7GwA/vOf//C73/3uuDFUy8zMrJFglJWVUV5eTnBwsHd8KFStZnfkim7V/7ZWq5UuXbpgNpvZv38/2dnZeDwe4uPj+fLLLznnnHNqPWf//v29i1c4HA5sNhtGo7HGBK0HHnjghEurHWusqr8dyihm9jOrAxpDY4196BziOjRsJcD6rn1rafsNXRmyqdt+RkYGOTk5QMPbPsAXX3zBddddh91uJyEhgQ4dOrBjxw6KiooICwvj008/9fbuH6lt27be7ysrKykpKcFisdR47/zXv/7FuHHjapy3adMmBg8eTEFBAVFRUXTr1o20tDSKiopo06YNP/zwg3e4zPGcyPuwLzkcDubPn8+IESM0ptzP8vLyaNu27QnlawGdDBkUFES3bt1aZJJ9pO7du9e5HC8Q0DfdmPAggs1GKp0nPq6uOQg2G4kJr7vOqb9ERESwcOFCZs2axbvvvsvatWtJTU2lbdu2nHHGGQwZMoQxY8Y0+I/r//73P+bPn8+KFSs4cOAApaWlJCcnM2rUKO699946J/vecsst9O/fnxdeeIElS5awadMmIiMj6dOnD9dcc02tZZtPhNVq5b333mPRokWsXr2a9PR07HY7KSkpXHHFFdx///3069ev1nl33303F198Ma+88grffvstmzdvJjg4mOTkZIYOHcro0aMZMWJEg2JxuVx13qavrKys0Wt49Ept7777LkuWLGH16tVkZmZ6k60LL7yQESNG8Pvf/77ehSny8/NrPafb7a6x7cgexJYkJMKCyWzE1cLavclsJCQi8MmC2n7D2n5SUhJDhw5lzJgxDW77UFWDe82aNTzzzDMsW7aM9evXexeeevDBB+utSFLX3wyHw1Fj+5G1s6v17duXDRs28MQTT7BgwQI2btxIXFwcY8eO5dFHHyU5ObnBr0HkWALao33l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+/btPo0lMTGRG264gWnTprFy5UqMRiNffvmlt0eq+pps3bq1QR9409PT60xSmtIf/vAH3n//fWJjY1m8eHG9QwUASkpKjvv81fuPHNMprYPafstq+/WpHspydKWy8847D6DehL96e/VxIk1BibbIUapXBHv//fdrTJTypYSEBDp37gzAgQMHgKoxgtULr7zwwgt+iQOq3lirbxtXx9K9e3f69u1Lfn4+7777rt9iOZ4pU6bw+uuvY7VaWbhwIX369Dnm8XFxcd7XtmTJkjqP+eabbwDo0aNH0wYrzZ7afstp+/VxOp3e1V/PPPPMGvuqh4rNnj2b4uLiGvuKi4u9C9Vcd911vg9UWg2/J9pr1qyhS5cutb4MBkO9+7p06aLbuOI3Z599NmPHjiUvL4/LL7+81qpnLpeLZcuWcfPNN9eYPHMixo0bx1dffVVrMs4nn3zCxo0bMRgMnHXWWd7tU6dOxWKxMG3aNB566KEaK505HA4++uijRo15tNlsjBs3jmXLltXopXK5XLz66qsUFBQQHh5eYyLWc889h8Fg4O6772batGm1eot2797N008/7beFK1566SWeeeYZQkND+fLLLzn77LOPe47RaOTGG28EquoaV1eZgKqSXv/5z394++23AeqtWCKnLrX9ltH2J0yYwKpVq2r1kG/evJmRI0eybds2EhMTayXMY8aMoVevXuTl5XH77bd7r2lpaSm33347eXl59O3bl2uvvdYvr0NaB4PHj2ucn2xdWoPBgMvlaqJomh+bzUZUVBRFRUXHnYhRUVHBnj176Ny5c43Z1DUcWA9vXtz0gfrDb7+Ddmee9MNUV7ep79e8U6dO7N27lz179tCpUyfv9pKSEkaPHu0tf9WhQweSkpIoKysjLS3NO+mnvLzce/1nzJjB7bffzm233caMGTPqfL7o6GiKiooIDg6me/fuhIaGsm/fPu9t2kceeYQnnniixjnvv/8+EydOxOFwEBYWRq9evSgvL2fPnj1UVFTwzjvvMH78eGw2G5GRkSfUzgoLC72TBcPDw+nWrRsWi4X09HRyc3MxGAy8+eabtUqj/fvf/+aee+7B5XJhtVrp0aMHBoOBzMxMsrOzAfjPf/7D7373u+PGUC0zM7NGglFWVkZ5eTnBwcE15nTMmzfPu3LbgQMHSE5OxuPxEB8fX2sFuCN98sknJCYm1njt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g+jo6Bp1Y5vKfffdx913382wYcMYMGAAl112GYMGDeLiiy+ulWRUX5OKigoGDRpU5+NVJ6j1DcnwtcrKSq699lp27NhBnz59eP/99+s87qmnnuLnn39mxYoVXH311bRr146YmBi2b9+Oy+Xi5ptv5oMPPmixdbSlJrX92pqy7TudTm9t6ube9utSPWxEvdniK0q0pVUIDw+vc3v16mFHlpksKioCqt7s0tLSjvm4dfV61vdcAFdddRVfffUVTz/9ND///DPbtm3jlVdewWw2M2rUKF5++WXvZLzq6gbR0dHHjKGx7rrrLqxWKy+++CJr165l7dq1PPfcc4SEhHDrrbfy/PPPe8c0V18Tm83Gjz/+eMzHPfKaXH/99XWO21y+fHkTvpKqN/sbbriB7777jk6dOrFo0aJ6KxOEhoby7bff8tprr/Hhhx+ybds2iouLufjii5kyZQq7du3igw8+IDExsUljlMBQ26+ttbb9o23dupXU1FQAbrnlliaNS6SaEm2Ro1T3ZL711lt13nY+WSNGjGDEiBHk5+fzww8/sGTJEmbOnMnHH39MWloaK1euxGKxeHuWCgsLmzyGarfeeiu33norBw8e5LvvvmPx4sV89NFHvPXWW2RlZXlXT6y+JgMHDmzQG+Xq1au9PYC+4vF4uP3225k3bx5JSUl88803tGvX7pjnBAcHc//993P//ffX2vfRRx8BMGDAAJ/EK82X2n7D2r7b7cZmsxEZGVlryfPm2vaPVN2bPWjQIDp37uyrMKWV0xhtkaP07t0bqJpY40tt2rRh5MiRvPrqq2zatImoqCjWrVvHmjVrAOjevTtBQUEUFhb6vAJGYmIiN9xwA9OmTWPlypUYjUa+/PJLb49U9TXZunVrgyZepqen4/F4an01pT/84Q+8//77xMbGsnjx4nqHCpwIp9PprRJx9dVXN1WI0kKo7beetu/xePjggw8ADRsR31KiLXKUUaNGAfD+++/XmCjlSwkJCd4elQMHDgBVQxyqF1944YUX/BIHVL2xVt82ro6le/fu9O3bl/z8fN59912/xXI8U6ZM4fXXX8dqtbJw4UL69OlzUo/3yiuvcPDgQXr06MHw4cObKEppKdT2W0/b/+6778jIyNCS6+JzSrRFjnL22WczduxY8vLyuPzyy2uteuZyuVi2bBk333wzlZWVDXrscePG8dVXX2G322ts/+STT9i4cSMGg4GzzjrLu33q1KlYLBamTZvGQw89RFlZmXefw+Hgo48+atSYR5vNxrhx41i2bFmNXiqXy8Wrr75KQUEB4eHhNSZiPffccxgMBu6++26mTZvmnQBVbffu3d4FPfzhpZde4plnniE0NJQvv/yyVnm0+uzbt4/333+/xnjSyspK/vnPf/LXv/4Vk8nEf//731q3wuXUp7Z/arf9I1VPmNSS6+JrBk9T38uRRrPZbERFRVFUVHTcQvsVFRXs2bOHzp07e+u0Hm1L3hZu+PIGX4Tqcx9d/RG9Y3uf9ONUrzha3695p06d2Lt3L3v27KFTp07e7SUlJYwePdpb/qpDhw4kJSVRVlZGWlqaN0krLy/3Xv8ZM2Zw++23c9tttzFjxow6ny86OpqioiKCg4Pp3r07oaGh7Nu3z3ub9pFHHuGJJ56occ7777/PxIkTcTgchIWF0atXL8rLy9mzZw8VFRW88847jB8/vt6xknUpLCz0vrmEh4fTrVs3LBYL6enp5ObmYjAYePPNN2uNU/33v//NPffcg8vlwmq10qNHDwwGA5mZmWRnZwPwn//8h9/97nfHjaFaZmZmjQSjrKyM8vJygoODa1T+mDdvHgMHDgSqetuSk5PxeDzEx8fTvXv3eh//k08+qTGxcf369Zx11lkEBQXRqVMn76p/xcXFhISEMH369AbX9j/WWFV/s+8vIec1/y2J3ZTi/3gWQe0bVu2lvmvfWtp+Q1eGbOq2n5GRQU5ODtD82361iooKEhMTKSoq4rPPPmPkyJEnHPPRj3O892FfcjgczJ8/nxEjRmihHT/Ly8ujbdu2J5SvaTLkKSwmOIYgUxB2l/34BzcjQaYgYoID28MQERHBwoULmTVrFu+++y5r164lNTWVtm3bcsYZZzBkyBDGjBnT4D+u//vf/5g/fz4rVqzgwIEDlJaWkpyczKhRo7j33nsZPHhwrXNuueUW+vfvzwsvvMCSJUvYtGkTkZGR9OnTh2uuuabWss0nwmq18t5777Fo0SJWr15Neno6drudlJQUrrjiCu6//3769etX67y7776biy++mFdeeYVvv/2WzZs3ExwcTHJyMkOHDmX06NENXsLY5XLVeZu+srKyRq+hw+Hwfm+3270JVE5OjveNvi5HLskMVTWE7733XpYtW0Z6ejp79+6lXbt23HzzzUyePLnRq+01F8ZwM5gN4GxhfShmQ1XsAaa237C2n5SUxNChQxkzZkyzb/vVPv/8c4qKirTkuviFerSbkabu0QbIKsmioNI/K9x53B5KSkuICI/AYDQ0+nFigmNIikhqwshOfc2pR7U1am7X31lYgbvUefwDmxFjuBlzdMN7BZvbtW9NWvu1V49266UebfFKikjyW9LqdruxWVrvH12R5sIcHQLRgY5CRESUDYmIiIiI+IB6tEVOAdOnT2fatGmYzSfWpJt6dTYRCYzp06czffr0Ez5ebV/Ev5Roi5wCMjMzWblyZaDDEBE/y8jIOO7S6CISOBo6InIKmDp1KgUFBbhcrjpXY/Pl6mwiEjiPPfbYCbV5tX2RwFCiLSIiIiLiA0q0RURERER8QIm2iIiIiIgPKNEWEREREfEBJdoiIiIiIj6gRFtERERExAeUaIuIiIiI+IASbWDPnj289dZb3HnnnfTr1w+z2YzBYOCpp5467rk//fQTI0eOJC4ujtDQUHr37s2TTz5JRUWFHyIXERERkeZKK0MCr7zyCq+88kqDz/vggw+47bbbcLlctG/fnpSUFDZt2sSjjz7KF198wbJlywgLC/NBxCIiIiLS3KlHG2jbti1XX301TzzxBAsWLGDMmDHHPSc9PZ1Jkybhcrn4xz/+QWZmJqmpqezcuZOePXuyevVqHnjgAT9ELyIiIiLNkXq0gYcffrjGz7NmzTruOc8//zyVlZUMGzaMv/zlL97tHTt2ZPr06QwcOJA333yTRx55hISEhCaPWURERESaNyXajeDxePj0008BmDRpUq39F154Ib169WLbtm3MmzeP3/72t/4O0ctx4ADOggK/PJfH48FRUkpFRDgGg6HRj2OOicHSrl0TRiYtxezZs5k+fTrr1q2jsLCQtm3bcvrppzN27FgmTpxY5zlbt27lqaee4ttvv6WgoID27dszatQoHn74YaKjo2sdn5aWxowZM1i5ciVpaWnk5OTgdrtJSUnhsssuY/LkyXTt2tXHr1RERFoDJdqNkJGRQVZWFgADBw6s85iBAweybds2Vq5cGbBE23HgALuuuBKP3e7X5809yfMNQUF0XbhAyXYrUllZydixY/n888/5//buOzyKqm0D+H02m14IhFCEhNCrkRIEA4gCgtKUHhQsgKBiRYryKVHeF2kiAlKU0EtAukrvCNFA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\n", | |
| "text/plain": [ | |
| "<Figure size 800x600 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "fig, ax = matplotlib.pyplot.subplots(figsize=(8, 6))\n", | |
| "\n", | |
| "UNIT = 2**30\n", | |
| "UNIT_LABEL = \"GiB\"\n", | |
| "\n", | |
| "x = next(iter(plot_dfs.values())).index.values\n", | |
| "y = {\n", | |
| " 'in': numpy.array([0.0 for y in range(len(x))]),\n", | |
| " 'out': numpy.array([0.0 for y in range(len(x))]),\n", | |
| "}\n", | |
| "\n", | |
| "colormap = {}\n", | |
| "for rw, plot_df in plot_dfs.items():\n", | |
| " for isys, system in enumerate(plot_df.columns):\n", | |
| " this = 1.0\n", | |
| " this = y[rw] + plot_df[system].values / UNIT\n", | |
| " label = system.rsplit('/', 1)[-1].rsplit(\"_\", 1)[0]\n", | |
| " if rw == \"in\":\n", | |
| " this *= -1\n", | |
| " color = colormap.get(label)\n", | |
| " if not color:\n", | |
| " color = \"C{:d}\".format(isys % len(plot_df.columns))\n", | |
| " colormap[label] = color\n", | |
| " print(\"Assigning color {} to {}\".format(color, label))\n", | |
| " else:\n", | |
| " label = None\n", | |
| " ax.fill_between(x, y[rw], this,\n", | |
| " label=label,\n", | |
| " color=color)\n", | |
| " y[rw] = this\n", | |
| "\n", | |
| "# Make the y axis mirrored\n", | |
| "xmin, xmax = ax.get_xlim()\n", | |
| "ymin, ymax = ax.get_ylim()\n", | |
| "ymax = max(abs(ymin), ymax)\n", | |
| "ax.set_ylim(-ymax, ymax)\n", | |
| "\n", | |
| "# Draw the zero point\n", | |
| "ax.plot((xmin, xmax), (0, 0), ls='-', color='black')\n", | |
| "ax.set_xlim(min(x), max(x))\n", | |
| "\n", | |
| "# Make the tick marks more sensible\n", | |
| "ax.grid()\n", | |
| "ax.set_axisbelow(True)\n", | |
| "ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter(\"%b-%d %H:%M\"))\n", | |
| "fig.autofmt_xdate()\n", | |
| "\n", | |
| "legend = ax.legend(ncol=2, loc='lower left') # 'upper right' if writes are greater than reads\n", | |
| "\n", | |
| "ydirections = [\n", | |
| " {\n", | |
| " 'y': 0.25,\n", | |
| " 's': '%s in' % UNIT_LABEL,\n", | |
| " },\n", | |
| " {\n", | |
| " 'y': 0.75,\n", | |
| " 's': '%s out' % UNIT_LABEL,\n", | |
| " },\n", | |
| "]\n", | |
| "for kwargs in ydirections:\n", | |
| " ax.text(x=-0.1,\n", | |
| " ha='center',\n", | |
| " va='center',\n", | |
| " rotation=90,\n", | |
| " transform=ax.transAxes,\n", | |
| " **kwargs)\n", | |
| " \n", | |
| "_ = ax.set_yticklabels([\"%d\" % abs(y) for y in ax.get_yticks()])" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3 (ipykernel)", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.8.5" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 4 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment