{"action":"created","comment":{"url":"https://api.github.com/repos/DataDog/dd-agent/pulls/comments/51941683","id":51941683,"diff_hunk":"@@ -0,0 +1,193 @@\n+'''\n+HDFS NameNode Metrics\n+---------------------\n+hdfs.namenode.capacity_total                    Total disk capacity in bytes\n+hdfs.namenode.capacity_used                     Disk usage in bytes\n+hdfs.namenode.capacity_remaining                Remaining disk space left in bytes\n+hdfs.namenode.total_load                        Total load on the file system\n+hdfs.namenode.fs_lock_queue_length              Lock queue length\n+hdfs.namenode.blocks_total                      Total number of blocks\n+hdfs.namenode.max_objects                       Maximum number of files HDFS supports\n+hdfs.namenode.files_total                       Total number of files\n+hdfs.namenode.pending_replication_blocks        Number of blocks pending replication\n+hdfs.namenode.under_replicated_blocks           Number of under replicated blocks\n+hdfs.namenode.scheduled_replication_blocks      Number of blocks scheduled for replication\n+hdfs.namenode.pending_deletion_blocks           Number of pending deletion blocks\n+hdfs.namenode.num_live_data_nodes               Total number of live data nodes\n+hdfs.namenode.num_dead_data_nodes               Total number of dead data nodes\n+hdfs.namenode.num_decom_live_data_nodes         Number of decommissioning live data nodes\n+hdfs.namenode.num_decom_dead_data_nodes         Number of decommissioning dead data nodes\n+hdfs.namenode.volume_failures_total             Total volume failures\n+hdfs.namenode.estimated_capacity_lost_total     Estimated capacity lost in bytes\n+hdfs.namenode.num_decommissioning_data_nodes    Number of decommissioning data nodes\n+hdfs.namenode.num_stale_data_nodes              Number of stale data nodes\n+hdfs.namenode.num_stale_storages                Number of stale storages\n+'''\n+\n+# stdlib\n+from urlparse import urljoin\n+\n+# 3rd party\n+import requests\n+from requests.exceptions import Timeout, HTTPError, InvalidURL, ConnectionError\n+from simplejson import JSONDecodeError\n+\n+# Project\n+from checks import AgentCheck\n+\n+# JMX URI\n+JMX_URI = 'http://localhost:50070'\n+\n+# Service check names\n+JMX_SERVICE_CHECK = 'hdfs.namenode.jmx.can_connect'\n+\n+# URL Paths\n+JMX_PATH = 'jmx'\n+\n+# Namenode Bean\n+HDFS_NAMENODE_BEAN_NAME = 'Hadoop:service=NameNode,name=FSNamesystemState'\n+\n+# Metric types\n+GAUGE = 'gauge'\n+\n+# HDFS metrics\n+HDFS_METRICS = {\n+    'CapacityTotal' : ('hdfs.namenode.capacity_total',  GAUGE),\n+    'CapacityUsed' : ('hdfs.namenode.capacity_used',  GAUGE),\n+    'CapacityRemaining' : ('hdfs.namenode.capacity_remaining',  GAUGE),\n+    'TotalLoad' : ('hdfs.namenode.total_load',  GAUGE),\n+    'FsLockQueueLength' : ('hdfs.namenode.fs_lock_queue_length',  GAUGE),\n+    'BlocksTotal' : ('hdfs.namenode.blocks_total',  GAUGE),\n+    'MaxObjects' : ('hdfs.namenode.max_objects',  GAUGE),\n+    'FilesTotal' : ('hdfs.namenode.files_total',  GAUGE),\n+    'PendingReplicationBlocks' : ('hdfs.namenode.pending_replication_blocks',  GAUGE),\n+    'UnderReplicatedBlocks' : ('hdfs.namenode.under_replicated_blocks',  GAUGE),\n+    'ScheduledReplicationBlocks' : ('hdfs.namenode.scheduled_replication_blocks',  GAUGE),\n+    'PendingDeletionBlocks' : ('hdfs.namenode.pending_deletion_blocks',  GAUGE),\n+    'NumLiveDataNodes' : ('hdfs.namenode.num_live_data_nodes',  GAUGE),\n+    'NumDeadDataNodes' : ('hdfs.namenode.num_dead_data_nodes',  GAUGE),\n+    'NumDecomLiveDataNodes' : ('hdfs.namenode.num_decom_live_data_nodes',  GAUGE),\n+    'NumDecomDeadDataNodes' : ('hdfs.namenode.num_decom_dead_data_nodes',  GAUGE),\n+    'VolumeFailuresTotal' : ('hdfs.namenode.volume_failures_total',  GAUGE),\n+    'EstimatedCapacityLostTotal' : ('hdfs.namenode.estimated_capacity_lost_total',  GAUGE),\n+    'NumDecommissioningDataNodes' : ('hdfs.namenode.num_decommissioning_data_nodes',  GAUGE),\n+    'NumStaleDataNodes' : ('hdfs.namenode.num_stale_data_nodes',  GAUGE),\n+    'NumStaleStorages' : ('hdfs.namenode.num_stale_storages',  GAUGE),\n+}\n+\n+class HDFSNameNode(AgentCheck):\n+\n+    def check(self, instance):\n+        jmx_address = instance.get('hdfs_namenode_jmx_uri', JMX_URI)\n+\n+        # Get metrics from JMX\n+        self._hdfs_namenode_metrics(jmx_address, JMX_PATH)\n+\n+    def _hdfs_namenode_metrics(self, jmx_uri, jmx_path):\n+        '''\n+        Get HDFS data node metrics from JMX\n+        '''\n+        response = self._rest_request_to_json(jmx_uri,\n+            jmx_path,\n+            JMX_SERVICE_CHECK,\n+            qry='Hadoop:service=NameNode,name=FSNamesystemState')\n+\n+        beans = response.get('beans', [])\n+\n+        for bean in beans:\n+            bean_name = bean.get('name')\n+\n+            if bean_name is not None \\\n+                    and bean_name == HDFS_NAMENODE_BEAN_NAME:\n+\n+                for metric, (metric_name, metric_type) in HDFS_METRICS.iteritems():\n+                    metric_value = bean.get(metric)\n+\n+                    if metric_value is not None:\n+                        self._set_metric(metric_name, metric_type, metric_value)\n+\n+    def _set_metric(self, metric_name, metric_type, value, tags=None, device_name=None):\n+        '''\n+        Set a metric\n+        '''\n+        if metric_type == GAUGE:\n+            self.gauge(metric_name, value, tags=tags, device_name=device_name)\n+        else:\n+            self.log.error('Metric type \"%s\" unknown' % (metric_type))\n+\n+    def _rest_request_to_json(self, address, object_path, service_name=JMX_SERVICE_CHECK, *args, **kwargs):\n+        '''\n+        Query the given URL and return the JSON response\n+        '''\n+        response_json = None\n+\n+        service_check_tags = ['instance:%s' % self.hostname]\n+\n+        url = address\n+\n+        if object_path:\n+            url = self._join_url_dir(url, object_path)\n+\n+        # Add args to the url\n+        if args:\n+            for directory in args:\n+                url = self._join_url_dir(url, directory)\n+\n+        # Add kwargs as arguments\n+        if kwargs:\n+            query = '&'.join(['{}={}'.format(key, value) for key, value in kwargs.iteritems()])\n+            url = urljoin(url, '?' + query)","path":"checks.d/hdfs_namenode.py","position":138,"original_position":139,"commit_id":"0c77c664d4f87b2c3d4bc1cb83f944b8da90a953","original_commit_id":"75088a5f25ff5a8c360aead09f15d9dbf806a634","user":{"login":"zachradtka","id":6179033,"avatar_url":"https://avatars.githubusercontent.com/u/6179033?v=3","gravatar_id":"","url":"https://api.github.com/users/zachradtka","html_url":"https://github.com/zachradtka","followers_url":"https://api.github.com/users/zachradtka/followers","following_url":"https://api.github.com/users/zachradtka/following{/other_user}","gists_url":"https://api.github.com/users/zachradtka/gists{/gist_id}","starred_url":"https://api.github.com/users/zachradtka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zachradtka/subscriptions","organizations_url":"https://api.github.com/users/zachradtka/orgs","repos_url":"https://api.github.com/users/zachradtka/repos","events_url":"https://api.github.com/users/zachradtka/events{/privacy}","received_events_url":"https://api.github.com/users/zachradtka/received_events","type":"User","site_admin":false},"body":"I am using the kwargs in one of my calls:\r\n```\r\n        response = self._rest_request_to_json(jmx_uri,\r\n            jmx_path,\r\n            JMX_SERVICE_CHECK,\r\n            qry='Hadoop:service=NameNode,name=FSNamesystemState')\r\n```\r\n\r\nI can remove the service name. Or did you want me to hardcode in the BeanName?","created_at":"2016-02-04T21:38:22Z","updated_at":"2016-02-04T21:38:22Z","html_url":"https://github.com/DataDog/dd-agent/pull/2235#discussion_r51941683","pull_request_url":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235","_links":{"self":{"href":"https://api.github.com/repos/DataDog/dd-agent/pulls/comments/51941683"},"html":{"href":"https://github.com/DataDog/dd-agent/pull/2235#discussion_r51941683"},"pull_request":{"href":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235"}}},"pull_request":{"url":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235","id":57687702,"html_url":"https://github.com/DataDog/dd-agent/pull/2235","diff_url":"https://github.com/DataDog/dd-agent/pull/2235.diff","patch_url":"https://github.com/DataDog/dd-agent/pull/2235.patch","issue_url":"https://api.github.com/repos/DataDog/dd-agent/issues/2235","number":2235,"state":"open","locked":false,"title":"[hdfs_jmx] An HDFS agent that uses JMX","user":{"login":"zachradtka","id":6179033,"avatar_url":"https://avatars.githubusercontent.com/u/6179033?v=3","gravatar_id":"","url":"https://api.github.com/users/zachradtka","html_url":"https://github.com/zachradtka","followers_url":"https://api.github.com/users/zachradtka/followers","following_url":"https://api.github.com/users/zachradtka/following{/other_user}","gists_url":"https://api.github.com/users/zachradtka/gists{/gist_id}","starred_url":"https://api.github.com/users/zachradtka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zachradtka/subscriptions","organizations_url":"https://api.github.com/users/zachradtka/orgs","repos_url":"https://api.github.com/users/zachradtka/repos","events_url":"https://api.github.com/users/zachradtka/events{/privacy}","received_events_url":"https://api.github.com/users/zachradtka/received_events","type":"User","site_admin":false},"body":"An agent check for HDFS that uses the JMX interface to gather HDFS metrics from individual HDFS data nodes. \r\n\r\nThe metrics collected are\r\n```\r\nhdfs.dfs_remaining                  The remaining disk space left in bytes\r\nhdfs.storage_info                   Path to HDFS storage location\r\nhdfs.dfs_capacity                   Disk capacity in bytes\r\nhdfs.dfs_used                       Disk usage in bytes\r\nhdfs.cache_capacity                 Cache capacity in bytes\r\nhdfs.num_failed_volumes             Number of failed volumes\r\nhdfs.last_volume_failure_date       Date the last volume failed\r\nhdfs.estimated_capacity_lost_total  The estimated capacity lost in bytes\r\nhdfs.num_blocks_cached              The number of blocks cached\r\nhdfs.num_blocks_failed_to_cache     The number of blocks that failed to cache\r\nhdfs.num_blocks_failed_to_uncache   The number of failed blocks to remove from cache\r\n```\r\n\r\nAuthors:\r\n@zachradtka\r\n@wjsl","created_at":"2016-01-29T18:57:55Z","updated_at":"2016-02-04T21:38:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"56d3a664bf25d88ccd4aa3035e040da5c6de3b10","assignee":null,"milestone":{"url":"https://api.github.com/repos/DataDog/dd-agent/milestones/62","html_url":"https://github.com/DataDog/dd-agent/milestones/Triage","labels_url":"https://api.github.com/repos/DataDog/dd-agent/milestones/62/labels","id":1485890,"number":62,"title":"Triage","description":null,"creator":{"login":"remh","id":1311477,"avatar_url":"https://avatars.githubusercontent.com/u/1311477?v=3","gravatar_id":"","url":"https://api.github.com/users/remh","html_url":"https://github.com/remh","followers_url":"https://api.github.com/users/remh/followers","following_url":"https://api.github.com/users/remh/following{/other_user}","gists_url":"https://api.github.com/users/remh/gists{/gist_id}","starred_url":"https://api.github.com/users/remh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/remh/subscriptions","organizations_url":"https://api.github.com/users/remh/orgs","repos_url":"https://api.github.com/users/remh/repos","events_url":"https://api.github.com/users/remh/events{/privacy}","received_events_url":"https://api.github.com/users/remh/received_events","type":"User","site_admin":false},"open_issues":18,"closed_issues":2,"state":"open","created_at":"2016-01-05T21:06:49Z","updated_at":"2016-02-01T19:47:57Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235/commits","review_comments_url":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235/comments","review_comment_url":"https://api.github.com/repos/DataDog/dd-agent/pulls/comments{/number}","comments_url":"https://api.github.com/repos/DataDog/dd-agent/issues/2235/comments","statuses_url":"https://api.github.com/repos/DataDog/dd-agent/statuses/0c77c664d4f87b2c3d4bc1cb83f944b8da90a953","head":{"label":"MinerKasch:minerkasch/hdfs-jmx","ref":"minerkasch/hdfs-jmx","sha":"0c77c664d4f87b2c3d4bc1cb83f944b8da90a953","user":{"login":"MinerKasch","id":12733574,"avatar_url":"https://avatars.githubusercontent.com/u/12733574?v=3","gravatar_id":"","url":"https://api.github.com/users/MinerKasch","html_url":"https://github.com/MinerKasch","followers_url":"https://api.github.com/users/MinerKasch/followers","following_url":"https://api.github.com/users/MinerKasch/following{/other_user}","gists_url":"https://api.github.com/users/MinerKasch/gists{/gist_id}","starred_url":"https://api.github.com/users/MinerKasch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MinerKasch/subscriptions","organizations_url":"https://api.github.com/users/MinerKasch/orgs","repos_url":"https://api.github.com/users/MinerKasch/repos","events_url":"https://api.github.com/users/MinerKasch/events{/privacy}","received_events_url":"https://api.github.com/users/MinerKasch/received_events","type":"Organization","site_admin":false},"repo":{"id":47306535,"name":"dd-agent","full_name":"MinerKasch/dd-agent","owner":{"login":"MinerKasch","id":12733574,"avatar_url":"https://avatars.githubusercontent.com/u/12733574?v=3","gravatar_id":"","url":"https://api.github.com/users/MinerKasch","html_url":"https://github.com/MinerKasch","followers_url":"https://api.github.com/users/MinerKasch/followers","following_url":"https://api.github.com/users/MinerKasch/following{/other_user}","gists_url":"https://api.github.com/users/MinerKasch/gists{/gist_id}","starred_url":"https://api.github.com/users/MinerKasch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MinerKasch/subscriptions","organizations_url":"https://api.github.com/users/MinerKasch/orgs","repos_url":"https://api.github.com/users/MinerKasch/repos","events_url":"https://api.github.com/users/MinerKasch/events{/privacy}","received_events_url":"https://api.github.com/users/MinerKasch/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/MinerKasch/dd-agent","description":"Datadog Agent","fork":true,"url":"https://api.github.com/repos/MinerKasch/dd-agent","forks_url":"https://api.github.com/repos/MinerKasch/dd-agent/forks","keys_url":"https://api.github.com/repos/MinerKasch/dd-agent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MinerKasch/dd-agent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MinerKasch/dd-agent/teams","hooks_url":"https://api.github.com/repos/MinerKasch/dd-agent/hooks","issue_events_url":"https://api.github.com/repos/MinerKasch/dd-agent/issues/events{/number}","events_url":"https://api.github.com/repos/MinerKasch/dd-agent/events","assignees_url":"https://api.github.com/repos/MinerKasch/dd-agent/assignees{/user}","branches_url":"https://api.github.com/repos/MinerKasch/dd-agent/branches{/branch}","tags_url":"https://api.github.com/repos/MinerKasch/dd-agent/tags","blobs_url":"https://api.github.com/repos/MinerKasch/dd-agent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MinerKasch/dd-agent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MinerKasch/dd-agent/git/refs{/sha}","trees_url":"https://api.github.com/repos/MinerKasch/dd-agent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MinerKasch/dd-agent/statuses/{sha}","languages_url":"https://api.github.com/repos/MinerKasch/dd-agent/languages","stargazers_url":"https://api.github.com/repos/MinerKasch/dd-agent/stargazers","contributors_url":"https://api.github.com/repos/MinerKasch/dd-agent/contributors","subscribers_url":"https://api.github.com/repos/MinerKasch/dd-agent/subscribers","subscription_url":"https://api.github.com/repos/MinerKasch/dd-agent/subscription","commits_url":"https://api.github.com/repos/MinerKasch/dd-agent/commits{/sha}","git_commits_url":"https://api.github.com/repos/MinerKasch/dd-agent/git/commits{/sha}","comments_url":"https://api.github.com/repos/MinerKasch/dd-agent/comments{/number}","issue_comment_url":"https://api.github.com/repos/MinerKasch/dd-agent/issues/comments{/number}","contents_url":"https://api.github.com/repos/MinerKasch/dd-agent/contents/{+path}","compare_url":"https://api.github.com/repos/MinerKasch/dd-agent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MinerKasch/dd-agent/merges","archive_url":"https://api.github.com/repos/MinerKasch/dd-agent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MinerKasch/dd-agent/downloads","issues_url":"https://api.github.com/repos/MinerKasch/dd-agent/issues{/number}","pulls_url":"https://api.github.com/repos/MinerKasch/dd-agent/pulls{/number}","milestones_url":"https://api.github.com/repos/MinerKasch/dd-agent/milestones{/number}","notifications_url":"https://api.github.com/repos/MinerKasch/dd-agent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MinerKasch/dd-agent/labels{/name}","releases_url":"https://api.github.com/repos/MinerKasch/dd-agent/releases{/id}","deployments_url":"https://api.github.com/repos/MinerKasch/dd-agent/deployments","created_at":"2015-12-03T03:59:28Z","updated_at":"2016-01-15T14:33:35Z","pushed_at":"2016-02-04T21:30:38Z","git_url":"git://github.com/MinerKasch/dd-agent.git","ssh_url":"git@github.com:MinerKasch/dd-agent.git","clone_url":"https://github.com/MinerKasch/dd-agent.git","svn_url":"https://github.com/MinerKasch/dd-agent","homepage":"http://docs.datadoghq.com/","size":30841,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":false,"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":"DataDog:master","ref":"master","sha":"f599428882da85bae85ef4fff2ef3cbcf995d3fa","user":{"login":"DataDog","id":365230,"avatar_url":"https://avatars.githubusercontent.com/u/365230?v=3","gravatar_id":"","url":"https://api.github.com/users/DataDog","html_url":"https://github.com/DataDog","followers_url":"https://api.github.com/users/DataDog/followers","following_url":"https://api.github.com/users/DataDog/following{/other_user}","gists_url":"https://api.github.com/users/DataDog/gists{/gist_id}","starred_url":"https://api.github.com/users/DataDog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DataDog/subscriptions","organizations_url":"https://api.github.com/users/DataDog/orgs","repos_url":"https://api.github.com/users/DataDog/repos","events_url":"https://api.github.com/users/DataDog/events{/privacy}","received_events_url":"https://api.github.com/users/DataDog/received_events","type":"Organization","site_admin":false},"repo":{"id":1210071,"name":"dd-agent","full_name":"DataDog/dd-agent","owner":{"login":"DataDog","id":365230,"avatar_url":"https://avatars.githubusercontent.com/u/365230?v=3","gravatar_id":"","url":"https://api.github.com/users/DataDog","html_url":"https://github.com/DataDog","followers_url":"https://api.github.com/users/DataDog/followers","following_url":"https://api.github.com/users/DataDog/following{/other_user}","gists_url":"https://api.github.com/users/DataDog/gists{/gist_id}","starred_url":"https://api.github.com/users/DataDog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DataDog/subscriptions","organizations_url":"https://api.github.com/users/DataDog/orgs","repos_url":"https://api.github.com/users/DataDog/repos","events_url":"https://api.github.com/users/DataDog/events{/privacy}","received_events_url":"https://api.github.com/users/DataDog/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/DataDog/dd-agent","description":"Datadog Agent","fork":false,"url":"https://api.github.com/repos/DataDog/dd-agent","forks_url":"https://api.github.com/repos/DataDog/dd-agent/forks","keys_url":"https://api.github.com/repos/DataDog/dd-agent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DataDog/dd-agent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DataDog/dd-agent/teams","hooks_url":"https://api.github.com/repos/DataDog/dd-agent/hooks","issue_events_url":"https://api.github.com/repos/DataDog/dd-agent/issues/events{/number}","events_url":"https://api.github.com/repos/DataDog/dd-agent/events","assignees_url":"https://api.github.com/repos/DataDog/dd-agent/assignees{/user}","branches_url":"https://api.github.com/repos/DataDog/dd-agent/branches{/branch}","tags_url":"https://api.github.com/repos/DataDog/dd-agent/tags","blobs_url":"https://api.github.com/repos/DataDog/dd-agent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DataDog/dd-agent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DataDog/dd-agent/git/refs{/sha}","trees_url":"https://api.github.com/repos/DataDog/dd-agent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DataDog/dd-agent/statuses/{sha}","languages_url":"https://api.github.com/repos/DataDog/dd-agent/languages","stargazers_url":"https://api.github.com/repos/DataDog/dd-agent/stargazers","contributors_url":"https://api.github.com/repos/DataDog/dd-agent/contributors","subscribers_url":"https://api.github.com/repos/DataDog/dd-agent/subscribers","subscription_url":"https://api.github.com/repos/DataDog/dd-agent/subscription","commits_url":"https://api.github.com/repos/DataDog/dd-agent/commits{/sha}","git_commits_url":"https://api.github.com/repos/DataDog/dd-agent/git/commits{/sha}","comments_url":"https://api.github.com/repos/DataDog/dd-agent/comments{/number}","issue_comment_url":"https://api.github.com/repos/DataDog/dd-agent/issues/comments{/number}","contents_url":"https://api.github.com/repos/DataDog/dd-agent/contents/{+path}","compare_url":"https://api.github.com/repos/DataDog/dd-agent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DataDog/dd-agent/merges","archive_url":"https://api.github.com/repos/DataDog/dd-agent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DataDog/dd-agent/downloads","issues_url":"https://api.github.com/repos/DataDog/dd-agent/issues{/number}","pulls_url":"https://api.github.com/repos/DataDog/dd-agent/pulls{/number}","milestones_url":"https://api.github.com/repos/DataDog/dd-agent/milestones{/number}","notifications_url":"https://api.github.com/repos/DataDog/dd-agent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DataDog/dd-agent/labels{/name}","releases_url":"https://api.github.com/repos/DataDog/dd-agent/releases{/id}","deployments_url":"https://api.github.com/repos/DataDog/dd-agent/deployments","created_at":"2010-12-31T03:02:47Z","updated_at":"2016-02-04T00:15:35Z","pushed_at":"2016-02-04T21:30:40Z","git_url":"git://github.com/DataDog/dd-agent.git","ssh_url":"git@github.com:DataDog/dd-agent.git","clone_url":"https://github.com/DataDog/dd-agent.git","svn_url":"https://github.com/DataDog/dd-agent","homepage":"http://docs.datadoghq.com/","size":33300,"stargazers_count":423,"watchers_count":423,"language":"Python","has_issues":true,"has_downloads":false,"has_wiki":true,"has_pages":true,"forks_count":382,"mirror_url":null,"open_issues_count":132,"forks":382,"open_issues":132,"watchers":423,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235"},"html":{"href":"https://github.com/DataDog/dd-agent/pull/2235"},"issue":{"href":"https://api.github.com/repos/DataDog/dd-agent/issues/2235"},"comments":{"href":"https://api.github.com/repos/DataDog/dd-agent/issues/2235/comments"},"review_comments":{"href":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235/comments"},"review_comment":{"href":"https://api.github.com/repos/DataDog/dd-agent/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/DataDog/dd-agent/pulls/2235/commits"},"statuses":{"href":"https://api.github.com/repos/DataDog/dd-agent/statuses/0c77c664d4f87b2c3d4bc1cb83f944b8da90a953"}}}}