{"action":"created","comment":{"url":"https://api.github.com/repos/DataDog/datadog-agent/pulls/comments/209897458","pull_request_review_id":145997285,"id":209897458,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwOTg5NzQ1OA==","diff_hunk":"@@ -10,97 +10,187 @@ import (\n \t\"sync\"\n \t\"time\"\n \n-\t\"github.com/DataDog/datadog-agent/pkg/util/log\"\n-\n \t\"github.com/DataDog/datadog-agent/pkg/collector/check\"\n \t\"github.com/DataDog/datadog-agent/pkg/status/health\"\n+\t\"github.com/DataDog/datadog-agent/pkg/util/log\"\n )\n \n+type jobBucket struct {\n+\tjobs []check.Check\n+\tmu   sync.RWMutex // to protect critical sections in struct's fields\n+}\n+\n+func (jb *jobBucket) size() int {\n+\tjb.mu.RLock()\n+\tdefer jb.mu.RUnlock()\n+\n+\treturn len(jb.jobs)\n+}\n+\n+func (jb *jobBucket) addJob(c check.Check) {\n+\tjb.mu.Lock()\n+\tdefer jb.mu.Unlock()\n+\n+\tjb.jobs = append(jb.jobs, c)\n+}\n+\n // jobQueue contains a list of checks (called jobs) that need to be\n // scheduled at a certain interval.\n type jobQueue struct {\n-\tinterval time.Duration\n-\tstop     chan bool // to stop this queue\n-\tstopped  chan bool // signals that this queue has stopped\n-\tticker   *time.Ticker\n-\tjobs     []check.Check\n-\trunning  bool\n-\thealth   *health.Handle\n-\tmu       sync.RWMutex // to protect critical sections in struct's fields\n+\tinterval            time.Duration\n+\tstop                chan bool // to stop this queue\n+\tstopped             chan bool // signals that this queue has stopped\n+\tbuckets             []*jobBucket\n+\tbucketTicker        *time.Ticker\n+\tlastTick            time.Time\n+\tsparseStep          uint\n+\tcurrentBucketIdx    uint\n+\tschedulingBucketIdx uint\n+\trunning             bool\n+\thealth              *health.Handle\n+\tmu                  sync.RWMutex // to protect critical sections in struct's fields\n }\n \n // newJobQueue creates a new jobQueue instance\n func newJobQueue(interval time.Duration) *jobQueue {\n-\treturn &jobQueue{\n-\t\tinterval: interval,\n-\t\tticker:   time.NewTicker(time.Duration(interval)),\n-\t\tstop:     make(chan bool),\n-\t\tstopped:  make(chan bool),\n-\t\thealth:   health.Register(\"collector-queue\"),\n+\tjq := &jobQueue{\n+\t\tinterval:     interval,\n+\t\tstop:         make(chan bool),\n+\t\tstopped:      make(chan bool),\n+\t\thealth:       health.Register(\"collector-queue\"),\n+\t\tbucketTicker: time.NewTicker(time.Second),\n+\t}\n+\n+\tvar nb int\n+\tif interval <= time.Second {\n+\t\tnb = 1\n+\t} else {\n+\t\tnb = int(interval.Truncate(time.Second).Seconds())\n+\t}\n+\tfor i := 0; i < nb; i++ {\n+\t\tbucket := &jobBucket{}\n+\t\tjq.buckets = append(jq.buckets, bucket)\n+\t}\n+\n+\t// compute step for sparse scheduling\n+\tswitch nb % 2 {","path":"pkg/collector/scheduler/job.go","position":83,"original_position":83,"commit_id":"bb95d121ffa71d05b5b27dc0a3055597b18dcad6","original_commit_id":"bb95d121ffa71d05b5b27dc0a3055597b18dcad6","user":{"login":"truthbk","id":448216,"node_id":"MDQ6VXNlcjQ0ODIxNg==","avatar_url":"https://avatars0.githubusercontent.com/u/448216?v=4","gravatar_id":"","url":"https://api.github.com/users/truthbk","html_url":"https://github.com/truthbk","followers_url":"https://api.github.com/users/truthbk/followers","following_url":"https://api.github.com/users/truthbk/following{/other_user}","gists_url":"https://api.github.com/users/truthbk/gists{/gist_id}","starred_url":"https://api.github.com/users/truthbk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/truthbk/subscriptions","organizations_url":"https://api.github.com/users/truthbk/orgs","repos_url":"https://api.github.com/users/truthbk/repos","events_url":"https://api.github.com/users/truthbk/events{/privacy}","received_events_url":"https://api.github.com/users/truthbk/received_events","type":"User","site_admin":false},"body":"I didn't base myself off any other implementation. I deduced this from modular arithmetic. The goals were:\r\n1) let's schedule the checks as far apart from each other as possible, so as to smoothen the CPU load over the entire interval (best effort).\r\n2) make sure that the steps would make us fill every bucket with a single check, before adding the next round of checks. \r\n\r\nIf you need formal mathematical proof I can work on it. But basically the above will hold true (we could improve and make it even more sparse, but I don't think we need to go crazy) when:\r\na) Even number of buckets: we use the first odd index to the left of the middle index (doesn't matter if that index is even or odd - ie. 20 -> 9, 22 -> 9). \r\nb) Odd number of buckets: we use the middle index. (ie. 9 -> 4, 15 -> 7).\r\n\r\nThe reason this works is because when we wrap around the modular ring, we \"land\" in a bucket that was previously unused. With case (b) this is quite easy to see, we are always one off the previous location when wrapping around. (ie. 9: 0, 4, 8, 3, 7, 2, 6, 1, 5). With case (a) it's less trivial, you need to rely on the fact that since the number of buckets is even, and our \"step\" is odd, in the general case we will have three \"steps\" before wrapping around and since `odd*odd = odd`, so by definition we will not land on the same bucket, and the offset is such that we will continue to wrap around landing in free buckets until all buckets have been filled.\r\n\r\nNote:  for (a) if N <= 6, the general case begins to break down, as we go down to a step of just 1, but that will work just fine as well. It's easy to see that steps of 2 or 3 would not work as we'd always be hitting the same buckets.","created_at":"2018-08-14T10:07:33Z","updated_at":"2018-08-14T10:07:33Z","html_url":"https://github.com/DataDog/datadog-agent/pull/2127#discussion_r209897458","pull_request_url":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/DataDog/datadog-agent/pulls/comments/209897458"},"html":{"href":"https://github.com/DataDog/datadog-agent/pull/2127#discussion_r209897458"},"pull_request":{"href":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127"}},"in_reply_to_id":209235813},"pull_request":{"url":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127","id":206772826,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA2NzcyODI2","html_url":"https://github.com/DataDog/datadog-agent/pull/2127","diff_url":"https://github.com/DataDog/datadog-agent/pull/2127.diff","patch_url":"https://github.com/DataDog/datadog-agent/pull/2127.patch","issue_url":"https://api.github.com/repos/DataDog/datadog-agent/issues/2127","number":2127,"state":"open","locked":false,"title":"[scheduler] bucketed scheduler - single ticker implementation","user":{"login":"truthbk","id":448216,"node_id":"MDQ6VXNlcjQ0ODIxNg==","avatar_url":"https://avatars0.githubusercontent.com/u/448216?v=4","gravatar_id":"","url":"https://api.github.com/users/truthbk","html_url":"https://github.com/truthbk","followers_url":"https://api.github.com/users/truthbk/followers","following_url":"https://api.github.com/users/truthbk/following{/other_user}","gists_url":"https://api.github.com/users/truthbk/gists{/gist_id}","starred_url":"https://api.github.com/users/truthbk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/truthbk/subscriptions","organizations_url":"https://api.github.com/users/truthbk/orgs","repos_url":"https://api.github.com/users/truthbk/repos","events_url":"https://api.github.com/users/truthbk/events{/privacy}","received_events_url":"https://api.github.com/users/truthbk/received_events","type":"User","site_admin":false},"body":"### What does this PR do?\r\n\r\nIntroduces the bucketed scheduler with a simpler single ticker implementation. It will not enforce deadlines and will stay at a bucket until all checks in it have been correctly enqueued. We lose some flexibility in unlikely scenarios where we might be running low on runners, but gain predictability.\r\n\r\n### Motivation\r\n\r\nWe want to spread the load during collection intervals, hence the buckets. The single ticker is aimed at providing a simple, predictable approach to the scheduling of the checks in these buckets. \r\n\r\n### Additional Notes\r\n\r\nAnything else we should know when reviewing?\r\n","created_at":"2018-08-07T17:32:25Z","updated_at":"2018-08-14T10:07:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5f702b53eb1049abf1e977e83e34e5ca1c21ab89","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[{"name":"container-integrations","id":2380322,"node_id":"MDQ6VGVhbTIzODAzMjI=","slug":"container-integrations","description":"(formerly kenafeh) containers and their orchestrators","privacy":"closed","url":"https://api.github.com/teams/2380322","members_url":"https://api.github.com/teams/2380322/members{/member}","repositories_url":"https://api.github.com/teams/2380322/repos","permission":"pull"}],"labels":[{"id":695415843,"node_id":"MDU6TGFiZWw2OTU0MTU4NDM=","url":"https://api.github.com/repos/DataDog/datadog-agent/labels/team/agent-core","name":"team/agent-core","color":"d4c5f9","default":false}],"milestone":{"url":"https://api.github.com/repos/DataDog/datadog-agent/milestones/33","html_url":"https://github.com/DataDog/datadog-agent/milestone/33","labels_url":"https://api.github.com/repos/DataDog/datadog-agent/milestones/33/labels","id":3503075,"node_id":"MDk6TWlsZXN0b25lMzUwMzA3NQ==","number":33,"title":"6.5.0","description":null,"creator":{"login":"xvello","id":6241083,"node_id":"MDQ6VXNlcjYyNDEwODM=","avatar_url":"https://avatars2.githubusercontent.com/u/6241083?v=4","gravatar_id":"","url":"https://api.github.com/users/xvello","html_url":"https://github.com/xvello","followers_url":"https://api.github.com/users/xvello/followers","following_url":"https://api.github.com/users/xvello/following{/other_user}","gists_url":"https://api.github.com/users/xvello/gists{/gist_id}","starred_url":"https://api.github.com/users/xvello/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xvello/subscriptions","organizations_url":"https://api.github.com/users/xvello/orgs","repos_url":"https://api.github.com/users/xvello/repos","events_url":"https://api.github.com/users/xvello/events{/privacy}","received_events_url":"https://api.github.com/users/xvello/received_events","type":"User","site_admin":false},"open_issues":28,"closed_issues":27,"state":"open","created_at":"2018-07-17T14:38:39Z","updated_at":"2018-08-14T09:48:40Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127/commits","review_comments_url":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127/comments","review_comment_url":"https://api.github.com/repos/DataDog/datadog-agent/pulls/comments{/number}","comments_url":"https://api.github.com/repos/DataDog/datadog-agent/issues/2127/comments","statuses_url":"https://api.github.com/repos/DataDog/datadog-agent/statuses/bb95d121ffa71d05b5b27dc0a3055597b18dcad6","head":{"label":"DataDog:jaime/scheduler-single","ref":"jaime/scheduler-single","sha":"bb95d121ffa71d05b5b27dc0a3055597b18dcad6","user":{"login":"DataDog","id":365230,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NTIzMA==","avatar_url":"https://avatars1.githubusercontent.com/u/365230?v=4","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":49970739,"node_id":"MDEwOlJlcG9zaXRvcnk0OTk3MDczOQ==","name":"datadog-agent","full_name":"DataDog/datadog-agent","owner":{"login":"DataDog","id":365230,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NTIzMA==","avatar_url":"https://avatars1.githubusercontent.com/u/365230?v=4","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/datadog-agent","description":"Datadog Agent ","fork":false,"url":"https://api.github.com/repos/DataDog/datadog-agent","forks_url":"https://api.github.com/repos/DataDog/datadog-agent/forks","keys_url":"https://api.github.com/repos/DataDog/datadog-agent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DataDog/datadog-agent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DataDog/datadog-agent/teams","hooks_url":"https://api.github.com/repos/DataDog/datadog-agent/hooks","issue_events_url":"https://api.github.com/repos/DataDog/datadog-agent/issues/events{/number}","events_url":"https://api.github.com/repos/DataDog/datadog-agent/events","assignees_url":"https://api.github.com/repos/DataDog/datadog-agent/assignees{/user}","branches_url":"https://api.github.com/repos/DataDog/datadog-agent/branches{/branch}","tags_url":"https://api.github.com/repos/DataDog/datadog-agent/tags","blobs_url":"https://api.github.com/repos/DataDog/datadog-agent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DataDog/datadog-agent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DataDog/datadog-agent/git/refs{/sha}","trees_url":"https://api.github.com/repos/DataDog/datadog-agent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DataDog/datadog-agent/statuses/{sha}","languages_url":"https://api.github.com/repos/DataDog/datadog-agent/languages","stargazers_url":"https://api.github.com/repos/DataDog/datadog-agent/stargazers","contributors_url":"https://api.github.com/repos/DataDog/datadog-agent/contributors","subscribers_url":"https://api.github.com/repos/DataDog/datadog-agent/subscribers","subscription_url":"https://api.github.com/repos/DataDog/datadog-agent/subscription","commits_url":"https://api.github.com/repos/DataDog/datadog-agent/commits{/sha}","git_commits_url":"https://api.github.com/repos/DataDog/datadog-agent/git/commits{/sha}","comments_url":"https://api.github.com/repos/DataDog/datadog-agent/comments{/number}","issue_comment_url":"https://api.github.com/repos/DataDog/datadog-agent/issues/comments{/number}","contents_url":"https://api.github.com/repos/DataDog/datadog-agent/contents/{+path}","compare_url":"https://api.github.com/repos/DataDog/datadog-agent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DataDog/datadog-agent/merges","archive_url":"https://api.github.com/repos/DataDog/datadog-agent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DataDog/datadog-agent/downloads","issues_url":"https://api.github.com/repos/DataDog/datadog-agent/issues{/number}","pulls_url":"https://api.github.com/repos/DataDog/datadog-agent/pulls{/number}","milestones_url":"https://api.github.com/repos/DataDog/datadog-agent/milestones{/number}","notifications_url":"https://api.github.com/repos/DataDog/datadog-agent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DataDog/datadog-agent/labels{/name}","releases_url":"https://api.github.com/repos/DataDog/datadog-agent/releases{/id}","deployments_url":"https://api.github.com/repos/DataDog/datadog-agent/deployments","created_at":"2016-01-19T17:40:41Z","updated_at":"2018-08-14T08:32:05Z","pushed_at":"2018-08-14T09:56:19Z","git_url":"git://github.com/DataDog/datadog-agent.git","ssh_url":"git@github.com:DataDog/datadog-agent.git","clone_url":"https://github.com/DataDog/datadog-agent.git","svn_url":"https://github.com/DataDog/datadog-agent","homepage":"https://docs.datadoghq.com/","size":26627,"stargazers_count":223,"watchers_count":223,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":103,"mirror_url":null,"archived":false,"open_issues_count":131,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":103,"open_issues":131,"watchers":223,"default_branch":"master"}},"base":{"label":"DataDog:master","ref":"master","sha":"e207ab29054a6c5b1e0b47572ff70090f1e7531a","user":{"login":"DataDog","id":365230,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NTIzMA==","avatar_url":"https://avatars1.githubusercontent.com/u/365230?v=4","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":49970739,"node_id":"MDEwOlJlcG9zaXRvcnk0OTk3MDczOQ==","name":"datadog-agent","full_name":"DataDog/datadog-agent","owner":{"login":"DataDog","id":365230,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NTIzMA==","avatar_url":"https://avatars1.githubusercontent.com/u/365230?v=4","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/datadog-agent","description":"Datadog Agent ","fork":false,"url":"https://api.github.com/repos/DataDog/datadog-agent","forks_url":"https://api.github.com/repos/DataDog/datadog-agent/forks","keys_url":"https://api.github.com/repos/DataDog/datadog-agent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DataDog/datadog-agent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DataDog/datadog-agent/teams","hooks_url":"https://api.github.com/repos/DataDog/datadog-agent/hooks","issue_events_url":"https://api.github.com/repos/DataDog/datadog-agent/issues/events{/number}","events_url":"https://api.github.com/repos/DataDog/datadog-agent/events","assignees_url":"https://api.github.com/repos/DataDog/datadog-agent/assignees{/user}","branches_url":"https://api.github.com/repos/DataDog/datadog-agent/branches{/branch}","tags_url":"https://api.github.com/repos/DataDog/datadog-agent/tags","blobs_url":"https://api.github.com/repos/DataDog/datadog-agent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DataDog/datadog-agent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DataDog/datadog-agent/git/refs{/sha}","trees_url":"https://api.github.com/repos/DataDog/datadog-agent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DataDog/datadog-agent/statuses/{sha}","languages_url":"https://api.github.com/repos/DataDog/datadog-agent/languages","stargazers_url":"https://api.github.com/repos/DataDog/datadog-agent/stargazers","contributors_url":"https://api.github.com/repos/DataDog/datadog-agent/contributors","subscribers_url":"https://api.github.com/repos/DataDog/datadog-agent/subscribers","subscription_url":"https://api.github.com/repos/DataDog/datadog-agent/subscription","commits_url":"https://api.github.com/repos/DataDog/datadog-agent/commits{/sha}","git_commits_url":"https://api.github.com/repos/DataDog/datadog-agent/git/commits{/sha}","comments_url":"https://api.github.com/repos/DataDog/datadog-agent/comments{/number}","issue_comment_url":"https://api.github.com/repos/DataDog/datadog-agent/issues/comments{/number}","contents_url":"https://api.github.com/repos/DataDog/datadog-agent/contents/{+path}","compare_url":"https://api.github.com/repos/DataDog/datadog-agent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DataDog/datadog-agent/merges","archive_url":"https://api.github.com/repos/DataDog/datadog-agent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DataDog/datadog-agent/downloads","issues_url":"https://api.github.com/repos/DataDog/datadog-agent/issues{/number}","pulls_url":"https://api.github.com/repos/DataDog/datadog-agent/pulls{/number}","milestones_url":"https://api.github.com/repos/DataDog/datadog-agent/milestones{/number}","notifications_url":"https://api.github.com/repos/DataDog/datadog-agent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DataDog/datadog-agent/labels{/name}","releases_url":"https://api.github.com/repos/DataDog/datadog-agent/releases{/id}","deployments_url":"https://api.github.com/repos/DataDog/datadog-agent/deployments","created_at":"2016-01-19T17:40:41Z","updated_at":"2018-08-14T08:32:05Z","pushed_at":"2018-08-14T09:56:19Z","git_url":"git://github.com/DataDog/datadog-agent.git","ssh_url":"git@github.com:DataDog/datadog-agent.git","clone_url":"https://github.com/DataDog/datadog-agent.git","svn_url":"https://github.com/DataDog/datadog-agent","homepage":"https://docs.datadoghq.com/","size":26627,"stargazers_count":223,"watchers_count":223,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":103,"mirror_url":null,"archived":false,"open_issues_count":131,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":103,"open_issues":131,"watchers":223,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127"},"html":{"href":"https://github.com/DataDog/datadog-agent/pull/2127"},"issue":{"href":"https://api.github.com/repos/DataDog/datadog-agent/issues/2127"},"comments":{"href":"https://api.github.com/repos/DataDog/datadog-agent/issues/2127/comments"},"review_comments":{"href":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127/comments"},"review_comment":{"href":"https://api.github.com/repos/DataDog/datadog-agent/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/DataDog/datadog-agent/pulls/2127/commits"},"statuses":{"href":"https://api.github.com/repos/DataDog/datadog-agent/statuses/bb95d121ffa71d05b5b27dc0a3055597b18dcad6"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"truthbk"}}