{"action":"created","comment":{"url":"https://api.github.com/repos/firehol/netdata/pulls/comments/120058427","pull_request_review_id":41989515,"id":120058427,"diff_hunk":"@@ -0,0 +1,229 @@\n+# -*- coding: utf-8 -*-\n+# Description: go_expvar netdata python.d module\n+# Author: Jan Kral (kralewitz)\n+\n+from __future__ import print_function\n+from base import UrlService\n+import json\n+\n+# default module values (can be overridden per job in `config`)\n+# update_every = 2\n+priority = 60000\n+retries = 60\n+\n+\n+MEMSTATS_CHARTS = {\n+    'memstats.heap': {\n+        'options': ['heap', 'memory: size of heap memory structures', 'kB', 'memstats', 'expvar.memstats.heap', 'line'],\n+        'lines': [\n+            [\"memstats.heap_alloc\", \"alloc\"],\n+            [\"memstats.heap_inuse\", \"inuse\"]\n+        ]},\n+    'memstats.stack': {\n+        'options': ['stack', 'memory: size of stack memory structures', 'kB', 'memstats', 'expvar.memstats.stack', 'line'],\n+        'lines': [\n+            [\"memstats.stack_inuse\", \"inuse\"]\n+        ]},\n+    'memstats.mspan': {\n+        'options': ['mspan', 'memory: size of mspan memory structures', 'kB', 'memstats', 'expvar.memstats.mspan', 'line'],\n+        'lines': [\n+            [\"memstats.mspan_inuse\", \"inuse\"]\n+        ]},\n+    'memstats.mcache': {\n+        'options': ['mcache', 'memory: size of mcache memory structures', 'kB', 'memstats', 'expvar.memstats.mcache', 'line'],\n+        'lines': [\n+            [\"memstats.mcache_inuse\", \"inuse\"]\n+        ]},\n+    'memstats.live_objects': {\n+        'options': ['live_objects', 'memory: number of live objects', 'objects', 'memstats', 'expvar.memstats.live_objects', 'line'],\n+        'lines': [\n+            [\"memstats.live_objects\", \"live\"]\n+        ]},\n+    'memstats.sys': {\n+        'options': ['sys', 'memory: size of reserved virtual address space', 'kB', 'memstats', 'expvar.memstats.sys', 'line'],\n+        'lines': [\n+            [\"memstats.sys\", \"sys\"]\n+        ]},\n+    'memstats.gc_pauses': {\n+        'options': ['gc_pauses', 'memory: average duration of GC pauses', 'ns', 'memstats', 'expvar.memstats.gc_pauses', 'line'],\n+        'lines': [\n+            [\"memstats.gc_pauses\", \"avg\"]\n+        ]},\n+}\n+\n+MEMSTATS_ORDER = ['memstats.heap', 'memstats.stack', 'memstats.mspan', 'memstats.mcache', 'memstats.sys', 'memstats.live_objects', 'memstats.gc_pauses']\n+\n+\n+def flatten(d, top='', sep='.'):\n+    items = []\n+    for key, val in d.items():\n+        nkey = top + sep + key if top else key\n+        if isinstance(val, dict):\n+            items.extend(flatten(val, nkey, sep=sep).items())\n+        else:\n+            items.append((nkey, val))\n+    return dict(items)\n+\n+\n+class Service(UrlService):\n+    def __init__(self, configuration=None, name=None):\n+        UrlService.__init__(self, configuration=configuration, name=name)\n+\n+        # if memstats collection is enabled, add the charts and their order\n+        if self.configuration.get('collect_memstats'):\n+            self.definitions = MEMSTATS_CHARTS\n+            self.order = MEMSTATS_ORDER\n+        else:\n+            self.definitions = dict()\n+            self.order = list()\n+\n+        # if extra charts are defined, parse their config\n+        extra_charts = self.configuration.get('extra_charts', dict())\n+        if len(extra_charts) > 0:\n+            self._parse_extra_charts_config(extra_charts)\n+\n+    def check(self):\n+        \"\"\"\n+        Check if the module can collect data:\n+        1) At least one JOB configuration has to be specified\n+        2) The JOB configuration needs to define the URL and either collect_memstats must be enabled or at least one\n+           extra_chart must be defined.\n+\n+        The configuration and URL check is provided by the UrlService class.\n+        \"\"\"\n+\n+        if not (self.configuration.get('extra_charts') or self.configuration.get('collect_memstats')):\n+            self.error(\"Memstats collection is disabled and no extra_charts are defined, disabling module.\")\n+            return False\n+\n+        return UrlService.check(self)\n+\n+    def _parse_extra_charts_config(self, extra_charts_config):\n+\n+        # a place to store the expvar keys and their types\n+        self.expvars = dict()\n+\n+        for chart in extra_charts_config:\n+\n+            chart_dict = dict()\n+            chart_id = chart.get('id')\n+            chart_lines = chart.get('lines')\n+            chart_opts = chart.get('options', dict())\n+\n+            if not all([chart_id, chart_lines]):\n+                self.info(\"Chart {} has no ID or no lines defined, skipping\".format(chart))\n+                continue\n+\n+            chart_dict['options'] = [\n+                chart_opts.get('name', ''),\n+                chart_opts.get('title', ''),\n+                chart_opts.get('units', ''),\n+                chart_opts.get('family', ''),\n+                chart_opts.get('context', ''),\n+                chart_opts.get('chart_type', 'line')\n+            ]\n+            chart_dict['lines'] = list()\n+\n+            # add the lines to the chart\n+            for line in chart_lines:\n+\n+                ev_key = line.get('expvar_key')\n+                ev_type = line.get('expvar_type')\n+                line_id = line.get('id')\n+\n+                if not all([ev_key, ev_type, line_id]):\n+                    self.info('Line missing expvar_key, expvar_type, or line_id, skipping: {}'.format(line))\n+                    continue\n+\n+                if ev_type not in ['int', 'float']:\n+                    self.info('Unsupported expvar_type \"{}\". Must be \"int\" or \"float\"'.format(ev_type))\n+                    continue\n+\n+                if ev_key in self.expvars:\n+                    self.info(\"Duplicate expvar key {}: skipping line.\".format(ev_key))\n+                    continue\n+\n+                self.expvars[ev_key] = ev_type\n+\n+                chart_dict['lines'].append(\n+                    [\n+                        line.get('id', ''),\n+                        line.get('name', ''),\n+                        line.get('algorithm', ''),\n+                        line.get('multiplier', 1),\n+                        line.get('divisor', 100 if ev_type == 'float' else 1),\n+                        line.get('hidden', False)\n+                    ]\n+                )\n+\n+            self.order.append(chart_id)\n+            self.definitions[chart_id] = chart_dict\n+\n+    def _get_data(self):\n+        \"\"\"\n+        Format data received from http request\n+        :return: dict\n+        \"\"\"\n+\n+        data = json.loads(self._get_raw_data())\n+\n+        expvars = dict()\n+        if self.configuration.get('collect_memstats'):\n+            expvars.update(self._parse_memstats(data))\n+\n+        if self.configuration.get('extra_charts'):\n+            del (data['memstats'])\n+            flattened = flatten(data)\n+            for k, v in flattened.items():\n+                key_type = self.expvars.get(k)\n+                try:\n+                    if key_type == 'int':\n+                        expvars[k] = int(v)\n+                    elif key_type == 'float':\n+                        # if the value type is float, multiply it by 1000 and set line divisor to 1000\n+                        expvars[k] = float(v) * 100\n+                    else:\n+                        # the key_type is None (not defined in config)\n+                        continue\n+                except ValueError:\n+                    self.info(\"Failed to parse value for key {} as {}, ignoring key.\".format(k, key_type))","path":"python.d/go_expvar.chart.py","position":null,"original_position":189,"commit_id":"b94c9c9aeea64e6b87a34d6e8b5c48bf88970ac3","original_commit_id":"835733e5ecc77da40c0eea523d38674b5bfb2c50","user":{"login":"kralewitz","id":15180106,"avatar_url":"https://avatars0.githubusercontent.com/u/15180106?v=3","gravatar_id":"","url":"https://api.github.com/users/kralewitz","html_url":"https://github.com/kralewitz","followers_url":"https://api.github.com/users/kralewitz/followers","following_url":"https://api.github.com/users/kralewitz/following{/other_user}","gists_url":"https://api.github.com/users/kralewitz/gists{/gist_id}","starred_url":"https://api.github.com/users/kralewitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kralewitz/subscriptions","organizations_url":"https://api.github.com/users/kralewitz/orgs","repos_url":"https://api.github.com/users/kralewitz/repos","events_url":"https://api.github.com/users/kralewitz/events{/privacy}","received_events_url":"https://api.github.com/users/kralewitz/received_events","type":"User","site_admin":false},"body":"havent't checked in 2.6.6, as the module guidelines specify that compatibility is needed only with 2.7+.\r\n\r\nNevertheless, the fix is pretty efortless, so added to [b94c9c9ae](https://github.com/firehol/netdata/pull/2280/commits/b94c9c9aeea64e6b87a34d6e8b5c48bf88970ac3)","created_at":"2017-06-05T07:45:28Z","updated_at":"2017-06-05T07:45:28Z","html_url":"https://github.com/firehol/netdata/pull/2280#discussion_r120058427","pull_request_url":"https://api.github.com/repos/firehol/netdata/pulls/2280","_links":{"self":{"href":"https://api.github.com/repos/firehol/netdata/pulls/comments/120058427"},"html":{"href":"https://github.com/firehol/netdata/pull/2280#discussion_r120058427"},"pull_request":{"href":"https://api.github.com/repos/firehol/netdata/pulls/2280"}}},"pull_request":{"url":"https://api.github.com/repos/firehol/netdata/pulls/2280","id":123878621,"html_url":"https://github.com/firehol/netdata/pull/2280","diff_url":"https://github.com/firehol/netdata/pull/2280.diff","patch_url":"https://github.com/firehol/netdata/pull/2280.patch","issue_url":"https://api.github.com/repos/firehol/netdata/issues/2280","number":2280,"state":"open","locked":false,"title":"Add support for monitoring Go applications via expvar package","user":{"login":"kralewitz","id":15180106,"avatar_url":"https://avatars0.githubusercontent.com/u/15180106?v=3","gravatar_id":"","url":"https://api.github.com/users/kralewitz","html_url":"https://github.com/kralewitz","followers_url":"https://api.github.com/users/kralewitz/followers","following_url":"https://api.github.com/users/kralewitz/following{/other_user}","gists_url":"https://api.github.com/users/kralewitz/gists{/gist_id}","starred_url":"https://api.github.com/users/kralewitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kralewitz/subscriptions","organizations_url":"https://api.github.com/users/kralewitz/orgs","repos_url":"https://api.github.com/users/kralewitz/repos","events_url":"https://api.github.com/users/kralewitz/events{/privacy}","received_events_url":"https://api.github.com/users/kralewitz/received_events","type":"User","site_admin":false},"body":"Hi there,\r\n\r\nthis PR adds support for collecting statistics from running applications written in the Go programming language using the Go stdlib's expvar package.\r\n\r\nYou can use the expvar package to efortlessly (basically in like 5 lines of Go code) expose the Go runtime's memory stats over HTTP, and it is very easy to add your own metrics. I for example like to also monitor the number of currently running Goroutines, or various rate counters in go apps running a HTTP server etc.\r\n\r\nYou can read more about the expvar package [here](https://golang.org/pkg/expvar/#Map).\r\n\r\nHere's how it looks:\r\n\r\n![expvar_memstats](https://cloud.githubusercontent.com/assets/15180106/26762052/62b4af58-493b-11e7-9e69-146705acfc2c.png)\r\n\r\n![expvar_custom](https://cloud.githubusercontent.com/assets/15180106/26762051/62ae915e-493b-11e7-8518-bd25a3886650.png)\r\n\r\nA couple notes:\r\n\r\n1) the plugin is disabled by default, as there is no standard port for running go apps. There is no default configuration for the same reason. I could add a default config for something like localhost:80, as Go's built-in HTTP server can run standalone without an additional reverse proxy, but I think the hit ratio for that default would be pretty low.\r\n\r\n2) The plugin is designed for basically two use-cases:\r\n    - out-of-the-box collection of Go runtime memory stats, can be enabled or disabled in config by a bool, and to add support for this to any Go application, you only need to do a magic import one-liner (if it's already using a HTTP server)\r\n    - custom values collection: as every Go app can expose its own values different from any other app, I have pulled out the charts and dimensions definitions from the plugin to the configuration file. That way, everyone is free to setup what vars to monitor and how to chart them.\r\n\r\nThis PR is not completely ready yet, as I need some help with these things:\r\n\r\n- I have added some chart annotations to `dashboard_info.js`, but for some reason, they are not showing up in the browser. Do i need to set anything else up to get them to show?\r\n\r\n- I have written a pretty long config how-to directly in the config file. I wonder if that should be moved to `python.d/README.md ` and keep only the sample config in the config file itself?\r\n\r\n- I would like someone to go over the plugin code and check if it looks okay. This is my first PR to netdata, so there will probably be lots of room for improvement. There also isn't much error handling - should I add more checks, or is it fine to just let the plugin die when it hits an error?\r\n\r\n\r\nI have tried to build netdata from scratch with the plugin added and it's working fine so far. If you have any questions and/or comments please do let me know.\r\n\r\n\r\n\r\n\r\n\r\n","created_at":"2017-06-04T13:56:17Z","updated_at":"2017-06-05T07:45:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e42763f71154745ce3359820099af0946aefaf14","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/firehol/netdata/pulls/2280/commits","review_comments_url":"https://api.github.com/repos/firehol/netdata/pulls/2280/comments","review_comment_url":"https://api.github.com/repos/firehol/netdata/pulls/comments{/number}","comments_url":"https://api.github.com/repos/firehol/netdata/issues/2280/comments","statuses_url":"https://api.github.com/repos/firehol/netdata/statuses/b94c9c9aeea64e6b87a34d6e8b5c48bf88970ac3","head":{"label":"kralewitz:expvar-devel","ref":"expvar-devel","sha":"b94c9c9aeea64e6b87a34d6e8b5c48bf88970ac3","user":{"login":"kralewitz","id":15180106,"avatar_url":"https://avatars0.githubusercontent.com/u/15180106?v=3","gravatar_id":"","url":"https://api.github.com/users/kralewitz","html_url":"https://github.com/kralewitz","followers_url":"https://api.github.com/users/kralewitz/followers","following_url":"https://api.github.com/users/kralewitz/following{/other_user}","gists_url":"https://api.github.com/users/kralewitz/gists{/gist_id}","starred_url":"https://api.github.com/users/kralewitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kralewitz/subscriptions","organizations_url":"https://api.github.com/users/kralewitz/orgs","repos_url":"https://api.github.com/users/kralewitz/repos","events_url":"https://api.github.com/users/kralewitz/events{/privacy}","received_events_url":"https://api.github.com/users/kralewitz/received_events","type":"User","site_admin":false},"repo":{"id":93241354,"name":"netdata","full_name":"kralewitz/netdata","owner":{"login":"kralewitz","id":15180106,"avatar_url":"https://avatars0.githubusercontent.com/u/15180106?v=3","gravatar_id":"","url":"https://api.github.com/users/kralewitz","html_url":"https://github.com/kralewitz","followers_url":"https://api.github.com/users/kralewitz/followers","following_url":"https://api.github.com/users/kralewitz/following{/other_user}","gists_url":"https://api.github.com/users/kralewitz/gists{/gist_id}","starred_url":"https://api.github.com/users/kralewitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kralewitz/subscriptions","organizations_url":"https://api.github.com/users/kralewitz/orgs","repos_url":"https://api.github.com/users/kralewitz/repos","events_url":"https://api.github.com/users/kralewitz/events{/privacy}","received_events_url":"https://api.github.com/users/kralewitz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kralewitz/netdata","description":"Get control of your servers. Simple. Effective. Awesome! https://my-netdata.io/","fork":true,"url":"https://api.github.com/repos/kralewitz/netdata","forks_url":"https://api.github.com/repos/kralewitz/netdata/forks","keys_url":"https://api.github.com/repos/kralewitz/netdata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kralewitz/netdata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kralewitz/netdata/teams","hooks_url":"https://api.github.com/repos/kralewitz/netdata/hooks","issue_events_url":"https://api.github.com/repos/kralewitz/netdata/issues/events{/number}","events_url":"https://api.github.com/repos/kralewitz/netdata/events","assignees_url":"https://api.github.com/repos/kralewitz/netdata/assignees{/user}","branches_url":"https://api.github.com/repos/kralewitz/netdata/branches{/branch}","tags_url":"https://api.github.com/repos/kralewitz/netdata/tags","blobs_url":"https://api.github.com/repos/kralewitz/netdata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kralewitz/netdata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kralewitz/netdata/git/refs{/sha}","trees_url":"https://api.github.com/repos/kralewitz/netdata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kralewitz/netdata/statuses/{sha}","languages_url":"https://api.github.com/repos/kralewitz/netdata/languages","stargazers_url":"https://api.github.com/repos/kralewitz/netdata/stargazers","contributors_url":"https://api.github.com/repos/kralewitz/netdata/contributors","subscribers_url":"https://api.github.com/repos/kralewitz/netdata/subscribers","subscription_url":"https://api.github.com/repos/kralewitz/netdata/subscription","commits_url":"https://api.github.com/repos/kralewitz/netdata/commits{/sha}","git_commits_url":"https://api.github.com/repos/kralewitz/netdata/git/commits{/sha}","comments_url":"https://api.github.com/repos/kralewitz/netdata/comments{/number}","issue_comment_url":"https://api.github.com/repos/kralewitz/netdata/issues/comments{/number}","contents_url":"https://api.github.com/repos/kralewitz/netdata/contents/{+path}","compare_url":"https://api.github.com/repos/kralewitz/netdata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kralewitz/netdata/merges","archive_url":"https://api.github.com/repos/kralewitz/netdata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kralewitz/netdata/downloads","issues_url":"https://api.github.com/repos/kralewitz/netdata/issues{/number}","pulls_url":"https://api.github.com/repos/kralewitz/netdata/pulls{/number}","milestones_url":"https://api.github.com/repos/kralewitz/netdata/milestones{/number}","notifications_url":"https://api.github.com/repos/kralewitz/netdata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kralewitz/netdata/labels{/name}","releases_url":"https://api.github.com/repos/kralewitz/netdata/releases{/id}","deployments_url":"https://api.github.com/repos/kralewitz/netdata/deployments","created_at":"2017-06-03T10:33:17Z","updated_at":"2017-06-03T10:33:20Z","pushed_at":"2017-06-05T07:41:42Z","git_url":"git://github.com/kralewitz/netdata.git","ssh_url":"git@github.com:kralewitz/netdata.git","clone_url":"https://github.com/kralewitz/netdata.git","svn_url":"https://github.com/kralewitz/netdata","homepage":"","size":18033,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"firehol:master","ref":"master","sha":"faf468984a7dcea5978bb5b5ffa420661289a33d","user":{"login":"firehol","id":9442231,"avatar_url":"https://avatars1.githubusercontent.com/u/9442231?v=3","gravatar_id":"","url":"https://api.github.com/users/firehol","html_url":"https://github.com/firehol","followers_url":"https://api.github.com/users/firehol/followers","following_url":"https://api.github.com/users/firehol/following{/other_user}","gists_url":"https://api.github.com/users/firehol/gists{/gist_id}","starred_url":"https://api.github.com/users/firehol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/firehol/subscriptions","organizations_url":"https://api.github.com/users/firehol/orgs","repos_url":"https://api.github.com/users/firehol/repos","events_url":"https://api.github.com/users/firehol/events{/privacy}","received_events_url":"https://api.github.com/users/firehol/received_events","type":"Organization","site_admin":false},"repo":{"id":10744183,"name":"netdata","full_name":"firehol/netdata","owner":{"login":"firehol","id":9442231,"avatar_url":"https://avatars1.githubusercontent.com/u/9442231?v=3","gravatar_id":"","url":"https://api.github.com/users/firehol","html_url":"https://github.com/firehol","followers_url":"https://api.github.com/users/firehol/followers","following_url":"https://api.github.com/users/firehol/following{/other_user}","gists_url":"https://api.github.com/users/firehol/gists{/gist_id}","starred_url":"https://api.github.com/users/firehol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/firehol/subscriptions","organizations_url":"https://api.github.com/users/firehol/orgs","repos_url":"https://api.github.com/users/firehol/repos","events_url":"https://api.github.com/users/firehol/events{/privacy}","received_events_url":"https://api.github.com/users/firehol/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/firehol/netdata","description":"Get control of your servers. Simple. Effective. Awesome! https://my-netdata.io/","fork":false,"url":"https://api.github.com/repos/firehol/netdata","forks_url":"https://api.github.com/repos/firehol/netdata/forks","keys_url":"https://api.github.com/repos/firehol/netdata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/firehol/netdata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/firehol/netdata/teams","hooks_url":"https://api.github.com/repos/firehol/netdata/hooks","issue_events_url":"https://api.github.com/repos/firehol/netdata/issues/events{/number}","events_url":"https://api.github.com/repos/firehol/netdata/events","assignees_url":"https://api.github.com/repos/firehol/netdata/assignees{/user}","branches_url":"https://api.github.com/repos/firehol/netdata/branches{/branch}","tags_url":"https://api.github.com/repos/firehol/netdata/tags","blobs_url":"https://api.github.com/repos/firehol/netdata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/firehol/netdata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/firehol/netdata/git/refs{/sha}","trees_url":"https://api.github.com/repos/firehol/netdata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/firehol/netdata/statuses/{sha}","languages_url":"https://api.github.com/repos/firehol/netdata/languages","stargazers_url":"https://api.github.com/repos/firehol/netdata/stargazers","contributors_url":"https://api.github.com/repos/firehol/netdata/contributors","subscribers_url":"https://api.github.com/repos/firehol/netdata/subscribers","subscription_url":"https://api.github.com/repos/firehol/netdata/subscription","commits_url":"https://api.github.com/repos/firehol/netdata/commits{/sha}","git_commits_url":"https://api.github.com/repos/firehol/netdata/git/commits{/sha}","comments_url":"https://api.github.com/repos/firehol/netdata/comments{/number}","issue_comment_url":"https://api.github.com/repos/firehol/netdata/issues/comments{/number}","contents_url":"https://api.github.com/repos/firehol/netdata/contents/{+path}","compare_url":"https://api.github.com/repos/firehol/netdata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/firehol/netdata/merges","archive_url":"https://api.github.com/repos/firehol/netdata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/firehol/netdata/downloads","issues_url":"https://api.github.com/repos/firehol/netdata/issues{/number}","pulls_url":"https://api.github.com/repos/firehol/netdata/pulls{/number}","milestones_url":"https://api.github.com/repos/firehol/netdata/milestones{/number}","notifications_url":"https://api.github.com/repos/firehol/netdata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/firehol/netdata/labels{/name}","releases_url":"https://api.github.com/repos/firehol/netdata/releases{/id}","deployments_url":"https://api.github.com/repos/firehol/netdata/deployments","created_at":"2013-06-17T18:39:10Z","updated_at":"2017-06-05T07:35:25Z","pushed_at":"2017-06-05T07:41:45Z","git_url":"git://github.com/firehol/netdata.git","ssh_url":"git@github.com:firehol/netdata.git","clone_url":"https://github.com/firehol/netdata.git","svn_url":"https://github.com/firehol/netdata","homepage":"","size":18024,"stargazers_count":21535,"watchers_count":21535,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1690,"mirror_url":null,"open_issues_count":214,"forks":1690,"open_issues":214,"watchers":21535,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/firehol/netdata/pulls/2280"},"html":{"href":"https://github.com/firehol/netdata/pull/2280"},"issue":{"href":"https://api.github.com/repos/firehol/netdata/issues/2280"},"comments":{"href":"https://api.github.com/repos/firehol/netdata/issues/2280/comments"},"review_comments":{"href":"https://api.github.com/repos/firehol/netdata/pulls/2280/comments"},"review_comment":{"href":"https://api.github.com/repos/firehol/netdata/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/firehol/netdata/pulls/2280/commits"},"statuses":{"href":"https://api.github.com/repos/firehol/netdata/statuses/b94c9c9aeea64e6b87a34d6e8b5c48bf88970ac3"}}}}
{"actor":{"display_login":"kralewitz"}}