blob: 9f29fc7792335d9641d8cb63d6db5bb0ee7cd0ab [file] [log] [blame]
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyzing Rate Limit Exceeded events\n",
"\n",
"Use this notebook to dig into Rate Limit Exceeded events on Monorail."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import gcp\n",
"import gcp.bigquery as bq\n",
"\n",
"context = gcp.Context.default()\n",
"print 'The current project is %s' % context.project_id\n",
"\n",
"# Set the date to analyze here:\n",
"date = 20160514"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%%sql --module by_ip\n",
"SELECT\n",
" protoPayload.ip as ip,\n",
" COUNT(protoPayload.requestId) AS num\n",
"FROM\n",
" [logs.appengine_googleapis_com_request_log_$date]\n",
"WHERE\n",
" protoPayload.moduleId is null # == \"default\", otherwise you get backend queries too.\n",
" AND\n",
" protoPayload.line.logMessage LIKE \"Rate Limit Exceeded%\"\n",
"GROUP BY\n",
" ip\n",
"ORDER BY\n",
" num DESC\n",
"LIMIT\n",
" 100;"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%%sql --module by_ip_class\n",
"SELECT\n",
" REGEXP_EXTRACT(protoPayload.ip,r'^(?:[^\\.]*\\.){0}([^\\.]*)\\.?') AS a,\n",
" REGEXP_EXTRACT(protoPayload.ip,r'^(?:[^\\.]*\\.){1}([^\\.]*)\\.?') AS b,\n",
" REGEXP_EXTRACT(protoPayload.ip,r'^(?:[^\\.]*\\.){2}([^\\.]*)\\.?') AS c,\n",
" REGEXP_EXTRACT(protoPayload.ip,r'^(?:[^\\.]*\\.){3}([^\\.]*)\\.?') AS d,\n",
" COUNT(protoPayload.requestId) AS num\n",
"FROM\n",
" [logs.appengine_googleapis_com_request_log_$date]\n",
"WHERE\n",
" protoPayload.moduleId is null # == \"default\", otherwise you get backend queries too.\n",
" AND\n",
" protoPayload.line.logMessage LIKE \"Rate Limit Exceeded%\"\n",
"GROUP BY\n",
" a,\n",
" b,\n",
" c,\n",
" d\n",
"ORDER BY\n",
" num DESC\n",
"LIMIT\n",
" 100;"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%%sql --module by_country\n",
"SELECT\n",
" protoPayload.line.logMessage as line,\n",
" COUNT(DISTINCT protoPayload.ip) as ip_count,\n",
" COUNT(protoPayload.requestId) AS req_count\n",
"FROM\n",
" FLATTEN ([logs.appengine_googleapis_com_request_log_$date], protoPayload.line)\n",
"WHERE\n",
" protoPayload.moduleId is null # == \"default\", otherwise you get backend queries too.\n",
" AND\n",
" protoPayload.line.logMessage LIKE \"Rate Limit Exceeded%\"\n",
" AND\n",
" REGEXP_MATCH(protoPayload.line.logMessage, 'X-AppEngine-Country')\n",
"GROUP BY\n",
" line\n",
"ORDER BY\n",
" req_count DESC\n",
"LIMIT\n",
" 100;"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%%sql --module by_resource\n",
"SELECT\n",
" protoPayload.resource as resource,\n",
" COUNT(protoPayload.requestId) AS req_count\n",
"FROM\n",
" [logs.appengine_googleapis_com_request_log_$date]\n",
"WHERE\n",
" protoPayload.moduleId is null # == \"default\", otherwise you get backend queries too.\n",
" AND\n",
" protoPayload.line.logMessage LIKE \"Rate Limit Exceeded%\"\n",
"GROUP BY\n",
" resource\n",
"ORDER BY\n",
" req_count DESC\n",
"LIMIT\n",
" 100;"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Requests by IP"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = bq.Query(by_ip, date=date).to_dataframe()\n",
"df.head(20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"if len(df):\n",
" df.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Requests by IP Class"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = bq.Query(by_ip_class, date=date).to_dataframe()\n",
"df.head(20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"if len(df):\n",
" df.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Requests by Country Code"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = bq.Query(by_country, date=date).to_dataframe()\n",
"df.head(20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"if len(df):\n",
" df.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Requests by Requested Resource"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = bq.Query(by_resource, date=date).to_dataframe()\n",
"df.head(20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"if len(df):\n",
" df.plot()"
]
},
{
"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.9"
}
},
"nbformat": 4,
"nbformat_minor": 0
}