{"action":"created","comment":{"url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/comments/90219304","pull_request_review_id":10740419,"id":90219304,"diff_hunk":"@@ -0,0 +1,152 @@\n++++\n+date = \"2016-11-22T11:02:30Z\"\n+draft = false\n+title = \"Avoid bottlenecks on a Drupal web application and how identify it with profiling\"\n+description = \"How identify bottleneck of your web application and avoid that can appear in the future\"\n+tags        = [ \"profiling\", \"drupal\", \"performance\", \"web application\"  ]\n+topics      = [ \"Profiling\", \"Drupal\", \"Performance\" ]\n+author = \"Vinz\"\n++++\n+\n+### TL;DR\n+\n+This article is focused on the possible *bottlenecks of a web application*, how you can identify it to improve the performance of your code.\n+\n+We talk about profiling with *Blackfire*, PHP web app focused on *Drupal*. LAMP is the reference stack.\n+\n+<!-- more -->\n+\n+Application's performance is one of characteristics what separates a job from a good job, and demonstrates quality work.\n+\n+A customer's call about website performances, if server infrastructure is adequate to requests, most probably indicates some errors on our code.\n+\n+Google can be our friend if we find some 'web application performance checklist' but we have a problem, now. We need to identify and resolve our performance issues.\n+\n+A little disclaimer: this article is focused on a Drupal application, but information which follow are useful (I hope!) regardless of framework that you have used.\n+\n+### Application's check\n+\n+1. Check caches\n+    1. Check Page cache, block cache and view cache\n+2. Aggregate and minify CSS and js\n+3. Deactivate development component\n+    1. Modules like _devel_, _update_status_, _performance_ are really performances eaters.\n+4. Deactivates _cron_ automation\n+    1. Run tasks autonomously by night or in the hours with light traffic if it's possible. Remember to demand critical tasks or heavy tasks to external workers.\n+5. Deactivates database logger\n+    1. Move logs to _syslog_\n+6. Check images size\n+    1. Use opportune _image_styles_\n+7. Check retrieval process of external resources (feed, streams, etc.)\n+\n+### Detection of application's bottleneck\n+\n+Once make previous checks, probably now our server take a sigh of relief, but _most_ probably this is not enough: we need with precision (specially if we don't have precise reference to slow pages) because we have an high server load. We need to collect data to use to apply right improvement, yes, I'm talking about [profiling](https://en.wikipedia.org/wiki/Profiling_(computer_programming)).\n+\n+#### Application side\n+\n+On Drupal 7, we can use the [Performance Logging](https://www.drupal.org/project/performance) module, to profile time spent to generate pages, memory consumption, and how many queries we have made. We need only to navigate our site to populate the data table. On Drupal 8 there is the very good module called _Web Profiler_ joined in the [Devel project](https://www.drupal.org/project/devel).\n+\n+#### Server side\n+\n+Servers, but generally the hardware which our application runs on, with right tools become our better friend to help us to find reasons of application's bottlenecks. There is a lot of profiler, but an excellent choice is [Blackfire](http://blackfire.io/): free, flexible and very light (his agent can be installed on the production servers with a really really thin overhead). The feature which makes me love Blackfire are his profiler result: a simple and clear diagram of entire code flow from the request response to the return of the last function called.\n+Obviously, remember to puts on the mysql slow query log.\n+\n+#### An example:\n+\n+This is a Blackfire profiling output: [https://blackfire.io/profiles/f911c4ad-792b-4977-af51-d9e3b7649d24/graph](https://blackfire.io/profiles/f911c4ad-792b-4977-af51-d9e3b7649d24/graph)\n+We can clearly see a 'red branch' that indicates us where the most of time is spent to generate the page and we can see that the _node_load_ function was called 200 times after the call to _dsc_module_block_view_ , uhm IMHO it's better take a look to this function:\n+\n+<pre>\n+function dsc_module_block_view($delta = '') {\n+  $block = array();\n+  switch ($delta) {\n+    case 'page_block':\n+\n+    $node_titles = [];\n+    for ($i = 1; $i < 200; $i++) {\n+      $node = node_load($i);\n+      $node_titles[] = $node->title;\n+    }\n+    $content = '<ul>';\n+    foreach ($node_titles as $node_title) {\n+      $content .= '<li>;' . $node_title . '</li>';\n+    }\n+    $content .= '</ul>';\n+    $block['subject'] = t('My block');\n+    $block['content'] = array(\n+      '#type' => 'markup',\n+      '#markup' => $content,\n+      '#title' => t('Last 100 content'),\n+    );\n+    break;\n+  }\n+  return $block;\n+}\n+</pre>\n+\n+We have a simple Drupal 7 application that display 200 node's titles, but in the wrong way.\n+With a simple refactoring we can improve the block generation:\n+\n+<pre>\n+function dsc_module_block_view($delta = '') {\n+  $block = array();\n+\n+  switch ($delta) {\n+    case 'page_block':\n+\n+      $n_ids = [];\n+\n+      for ($i = 1; $i > 200; $i++) {\n+        $n_ids[] = $i;\n+      }\n+\n+      $results = db_select('node', 'n')\n+        ->fields('n', array('title'))\n+        ->condition('nid', $n_ids, 'IN')\n+        ->execute()\n+        ->fetchAll();\n+      $content = '<ul>';\n+      foreach ($results as $node_title) {\n+        $content .= '<li>' . $node_title->title . '</li>';\n+      }\n+      $content .= '</ul>';\n+      $block['subject'] = t('My block');\n+      $block['content'] = array(\n+        '#type' => 'markup',\n+        '#markup' => $content,\n+        '#title' => t('Last 100 content'),\n+      );\n+      break;\n+    }\n+    return $block;\n+  }\n+}\n+</pre>\n+\n+And the Blackfire's verdict become [https://blackfire.io/profiles/b7243495-11d8-41fc-a374-e7bfe6e21ab7/graph](https://blackfire.io/profiles/b7243495-11d8-41fc-a374-e7bfe6e21ab7/graph): 1/3 of the time execution saved only with this refactoring.\n+\n+Obviously this is a very simple example but it's not a remote possibility that these things happens.\n+\n+### Just little advices to write code with an eye to performances\n+\n+* When we querying database, get only data which we need. Avoid `SELECT * FROM`, or\n+<pre>\n+db_select('table', 't')\n+->fields('t')\n+</pre>\n+that are the same things.\n+* Load entity in group and not alone: avoid `entity_load` like `node_load`, `taxonomy_term_load`, etc. Replace it with `node_load_multiple` or simple queries, if it is possible.\n+* Use - the - cache\n+  * Use views'caching and specially _views results_ and _rendered content_ caching\n+  * Use _drupal_static_ to make static data in a request but with _Cache API_ we can store data between requests in the time.\n+* Demands heavy process to external workers like [Gearman](http://gearman.org/) or use Drupal's _Batch API_\n+\n+### Links and tool\n+* DSC Profiling: https://gitlab.sparkfabrik.com/vincenzo.dibiaggio/dsc-profiling\n+* Hints about query caching https://www.percona.com/blog/2006/07/27/mysql-query-cache/","path":"src/content/post/20161122_drupal_application_bottlenecks_avoid_with_profiling.md","position":147,"original_position":147,"commit_id":"45834b45449bb4dcdbe9ef6839adf7c5c918f305","original_commit_id":"45834b45449bb4dcdbe9ef6839adf7c5c918f305","user":{"login":"stickgrinder","id":625436,"avatar_url":"https://avatars.githubusercontent.com/u/625436?v=3","gravatar_id":"","url":"https://api.github.com/users/stickgrinder","html_url":"https://github.com/stickgrinder","followers_url":"https://api.github.com/users/stickgrinder/followers","following_url":"https://api.github.com/users/stickgrinder/following{/other_user}","gists_url":"https://api.github.com/users/stickgrinder/gists{/gist_id}","starred_url":"https://api.github.com/users/stickgrinder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stickgrinder/subscriptions","organizations_url":"https://api.github.com/users/stickgrinder/orgs","repos_url":"https://api.github.com/users/stickgrinder/repos","events_url":"https://api.github.com/users/stickgrinder/events{/privacy}","received_events_url":"https://api.github.com/users/stickgrinder/received_events","type":"User","site_admin":false},"body":"missing colon `:`","created_at":"2016-11-30T12:01:10Z","updated_at":"2016-11-30T12:01:10Z","html_url":"https://github.com/sparkfabrik/sparkfabrik.github.com/pull/46#discussion_r90219304","pull_request_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46","_links":{"self":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/comments/90219304"},"html":{"href":"https://github.com/sparkfabrik/sparkfabrik.github.com/pull/46#discussion_r90219304"},"pull_request":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46"}}},"pull_request":{"url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46","id":94913818,"html_url":"https://github.com/sparkfabrik/sparkfabrik.github.com/pull/46","diff_url":"https://github.com/sparkfabrik/sparkfabrik.github.com/pull/46.diff","patch_url":"https://github.com/sparkfabrik/sparkfabrik.github.com/pull/46.patch","issue_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/46","number":46,"state":"open","locked":false,"title":"dsc-profiling post","user":{"login":"vincenzodibiaggio","id":3719429,"avatar_url":"https://avatars.githubusercontent.com/u/3719429?v=3","gravatar_id":"","url":"https://api.github.com/users/vincenzodibiaggio","html_url":"https://github.com/vincenzodibiaggio","followers_url":"https://api.github.com/users/vincenzodibiaggio/followers","following_url":"https://api.github.com/users/vincenzodibiaggio/following{/other_user}","gists_url":"https://api.github.com/users/vincenzodibiaggio/gists{/gist_id}","starred_url":"https://api.github.com/users/vincenzodibiaggio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vincenzodibiaggio/subscriptions","organizations_url":"https://api.github.com/users/vincenzodibiaggio/orgs","repos_url":"https://api.github.com/users/vincenzodibiaggio/repos","events_url":"https://api.github.com/users/vincenzodibiaggio/events{/privacy}","received_events_url":"https://api.github.com/users/vincenzodibiaggio/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-11-22T22:45:59Z","updated_at":"2016-11-30T12:01:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5cba440f893711d82140df3100167a0e05e55c3a","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46/commits","review_comments_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46/comments","review_comment_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/46/comments","statuses_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/statuses/45834b45449bb4dcdbe9ef6839adf7c5c918f305","head":{"label":"sparkfabrik:post/dsc-profiling","ref":"post/dsc-profiling","sha":"45834b45449bb4dcdbe9ef6839adf7c5c918f305","user":{"login":"sparkfabrik","id":11347456,"avatar_url":"https://avatars.githubusercontent.com/u/11347456?v=3","gravatar_id":"","url":"https://api.github.com/users/sparkfabrik","html_url":"https://github.com/sparkfabrik","followers_url":"https://api.github.com/users/sparkfabrik/followers","following_url":"https://api.github.com/users/sparkfabrik/following{/other_user}","gists_url":"https://api.github.com/users/sparkfabrik/gists{/gist_id}","starred_url":"https://api.github.com/users/sparkfabrik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sparkfabrik/subscriptions","organizations_url":"https://api.github.com/users/sparkfabrik/orgs","repos_url":"https://api.github.com/users/sparkfabrik/repos","events_url":"https://api.github.com/users/sparkfabrik/events{/privacy}","received_events_url":"https://api.github.com/users/sparkfabrik/received_events","type":"Organization","site_admin":false},"repo":{"id":54510645,"name":"sparkfabrik.github.com","full_name":"sparkfabrik/sparkfabrik.github.com","owner":{"login":"sparkfabrik","id":11347456,"avatar_url":"https://avatars.githubusercontent.com/u/11347456?v=3","gravatar_id":"","url":"https://api.github.com/users/sparkfabrik","html_url":"https://github.com/sparkfabrik","followers_url":"https://api.github.com/users/sparkfabrik/followers","following_url":"https://api.github.com/users/sparkfabrik/following{/other_user}","gists_url":"https://api.github.com/users/sparkfabrik/gists{/gist_id}","starred_url":"https://api.github.com/users/sparkfabrik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sparkfabrik/subscriptions","organizations_url":"https://api.github.com/users/sparkfabrik/orgs","repos_url":"https://api.github.com/users/sparkfabrik/repos","events_url":"https://api.github.com/users/sparkfabrik/events{/privacy}","received_events_url":"https://api.github.com/users/sparkfabrik/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/sparkfabrik/sparkfabrik.github.com","description":"Sparkfabrik's tech blog","fork":false,"url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com","forks_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/forks","keys_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/teams","hooks_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/hooks","issue_events_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/events{/number}","events_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/events","assignees_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/assignees{/user}","branches_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/branches{/branch}","tags_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/tags","blobs_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/statuses/{sha}","languages_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/languages","stargazers_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/stargazers","contributors_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/contributors","subscribers_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/subscribers","subscription_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/subscription","commits_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/contents/{+path}","compare_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/merges","archive_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/downloads","issues_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues{/number}","pulls_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls{/number}","milestones_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/milestones{/number}","notifications_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/labels{/name}","releases_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/releases{/id}","deployments_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/deployments","created_at":"2016-03-22T21:41:40Z","updated_at":"2016-04-28T11:46:16Z","pushed_at":"2016-11-29T22:39:00Z","git_url":"git://github.com/sparkfabrik/sparkfabrik.github.com.git","ssh_url":"git@github.com:sparkfabrik/sparkfabrik.github.com.git","clone_url":"https://github.com/sparkfabrik/sparkfabrik.github.com.git","svn_url":"https://github.com/sparkfabrik/sparkfabrik.github.com","homepage":null,"size":2882,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":7,"mirror_url":null,"open_issues_count":7,"forks":7,"open_issues":7,"watchers":0,"default_branch":"dev"}},"base":{"label":"sparkfabrik:dev","ref":"dev","sha":"d9490dc5c2db1b1593f743747d39f2fdf3ca9263","user":{"login":"sparkfabrik","id":11347456,"avatar_url":"https://avatars.githubusercontent.com/u/11347456?v=3","gravatar_id":"","url":"https://api.github.com/users/sparkfabrik","html_url":"https://github.com/sparkfabrik","followers_url":"https://api.github.com/users/sparkfabrik/followers","following_url":"https://api.github.com/users/sparkfabrik/following{/other_user}","gists_url":"https://api.github.com/users/sparkfabrik/gists{/gist_id}","starred_url":"https://api.github.com/users/sparkfabrik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sparkfabrik/subscriptions","organizations_url":"https://api.github.com/users/sparkfabrik/orgs","repos_url":"https://api.github.com/users/sparkfabrik/repos","events_url":"https://api.github.com/users/sparkfabrik/events{/privacy}","received_events_url":"https://api.github.com/users/sparkfabrik/received_events","type":"Organization","site_admin":false},"repo":{"id":54510645,"name":"sparkfabrik.github.com","full_name":"sparkfabrik/sparkfabrik.github.com","owner":{"login":"sparkfabrik","id":11347456,"avatar_url":"https://avatars.githubusercontent.com/u/11347456?v=3","gravatar_id":"","url":"https://api.github.com/users/sparkfabrik","html_url":"https://github.com/sparkfabrik","followers_url":"https://api.github.com/users/sparkfabrik/followers","following_url":"https://api.github.com/users/sparkfabrik/following{/other_user}","gists_url":"https://api.github.com/users/sparkfabrik/gists{/gist_id}","starred_url":"https://api.github.com/users/sparkfabrik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sparkfabrik/subscriptions","organizations_url":"https://api.github.com/users/sparkfabrik/orgs","repos_url":"https://api.github.com/users/sparkfabrik/repos","events_url":"https://api.github.com/users/sparkfabrik/events{/privacy}","received_events_url":"https://api.github.com/users/sparkfabrik/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/sparkfabrik/sparkfabrik.github.com","description":"Sparkfabrik's tech blog","fork":false,"url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com","forks_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/forks","keys_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/teams","hooks_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/hooks","issue_events_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/events{/number}","events_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/events","assignees_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/assignees{/user}","branches_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/branches{/branch}","tags_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/tags","blobs_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/statuses/{sha}","languages_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/languages","stargazers_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/stargazers","contributors_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/contributors","subscribers_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/subscribers","subscription_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/subscription","commits_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/contents/{+path}","compare_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/merges","archive_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/downloads","issues_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues{/number}","pulls_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls{/number}","milestones_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/milestones{/number}","notifications_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/labels{/name}","releases_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/releases{/id}","deployments_url":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/deployments","created_at":"2016-03-22T21:41:40Z","updated_at":"2016-04-28T11:46:16Z","pushed_at":"2016-11-29T22:39:00Z","git_url":"git://github.com/sparkfabrik/sparkfabrik.github.com.git","ssh_url":"git@github.com:sparkfabrik/sparkfabrik.github.com.git","clone_url":"https://github.com/sparkfabrik/sparkfabrik.github.com.git","svn_url":"https://github.com/sparkfabrik/sparkfabrik.github.com","homepage":null,"size":2882,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":7,"mirror_url":null,"open_issues_count":7,"forks":7,"open_issues":7,"watchers":0,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46"},"html":{"href":"https://github.com/sparkfabrik/sparkfabrik.github.com/pull/46"},"issue":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/46"},"comments":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/issues/46/comments"},"review_comments":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46/comments"},"review_comment":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/pulls/46/commits"},"statuses":{"href":"https://api.github.com/repos/sparkfabrik/sparkfabrik.github.com/statuses/45834b45449bb4dcdbe9ef6839adf7c5c918f305"}}}}
{"actor":{"display_login":"stickgrinder"}}