{"action":"created","comment":{"url":"https://api.github.com/repos/mesosphere/marathon/pulls/comments/177800314","pull_request_review_id":107738178,"id":177800314,"diff_hunk":"@@ -0,0 +1,172 @@\n+package mesosphere.marathon\n+package core.health.impl\n+\n+import akka.actor.{ Actor, Props }\n+import akka.event.EventStream\n+import com.typesafe.scalalogging.StrictLogging\n+import mesosphere.marathon.core.event.InstanceHealthChanged\n+import mesosphere.marathon.core.health.impl.AppHealthCheckActor._\n+import mesosphere.marathon.core.health.{ Health, HealthCheck }\n+import mesosphere.marathon.core.instance.Instance\n+import mesosphere.marathon.state.{ PathId, Timestamp }\n+\n+import scala.collection.generic.Subtractable\n+import scala.collection.mutable\n+\n+object AppHealthCheckActor {\n+  case class ApplicationKey(appId: PathId, version: Timestamp)\n+  case class InstanceKey(applicationKey: ApplicationKey, instanceId: Instance.Id)\n+\n+  def props(eventBus: EventStream): Props = Props(new AppHealthCheckActor(eventBus))\n+\n+  case class AddHealthCheck(appKey: ApplicationKey, healthCheck: HealthCheck)\n+  case class RemoveHealthCheck(appKey: ApplicationKey, healthCheck: HealthCheck)\n+\n+  case class PurgeHealthCheckStatuses(hc: Seq[(InstanceKey, HealthCheck)])\n+  case class HealthCheckStatusChanged(\n+      appKey: ApplicationKey,\n+      healthCheck: HealthCheck, health: Health)\n+\n+  trait InstanceHealthChangedNotifier {\n+    def notify(applicationKey: ApplicationKey, instanceId: Instance.Id,\n+      healthiness: Option[Boolean]): Unit\n+  }\n+\n+  class AppHealthCheckProxy extends StrictLogging {\n+    /**\n+      * Map of health check definitions of all applications\n+      */\n+    private[impl] val healthChecks: mutable.Map[ApplicationKey, Set[HealthCheck]] = mutable.Map.empty\n+\n+    /**\n+      *  Map of results of all health checks for all applications.\n+      *  Results are optional, therefore the global health status of an instance\n+      *  is either:\n+      *    unknown (if some results are still missing)\n+      *    healthy (if all results are known and healthy)\n+      *    not healthy (if all results are known and at least one is unhealthy)\n+      */\n+    private[impl] val healthCheckStates: mutable.Map[InstanceKey, Map[HealthCheck, Option[Health]]] =\n+      mutable.Map.empty\n+\n+    private def computeGlobalHealth(instanceHealthResults: Map[HealthCheck, Option[Health]]): Option[Boolean] = {\n+      val isHealthAlive = (health: Option[Health]) => health.fold(false)(_.alive)\n+      val isHealthUnknown = (health: Option[Health]) => health.isEmpty\n+\n+      if (instanceHealthResults.values.forall(isHealthAlive))\n+        Some(true)\n+      else if (instanceHealthResults.values.exists(isHealthUnknown))\n+        Option.empty[Boolean]\n+      else\n+        Some(false)\n+    }\n+\n+    def addHealthCheck(applicationKey: ApplicationKey, healthCheck: HealthCheck): Unit = {\n+      logger.debug(s\"Add health check $healthCheck to instance appId:${applicationKey.appId} version:${applicationKey.version}\")\n+      healthChecks.update(applicationKey, healthChecks.getOrElse(applicationKey, Set.empty) + healthCheck)\n+    }\n+\n+    def removeHealthCheck(applicationKey: ApplicationKey, healthCheck: HealthCheck): Unit = {","path":"src/main/scala/mesosphere/marathon/core/health/impl/AppHealthCheckActor.scala","position":69,"original_position":69,"commit_id":"9d73a2cbb1eac5782cf20d22e944c53b3c1f72bd","original_commit_id":"9d73a2cbb1eac5782cf20d22e944c53b3c1f72bd","user":{"login":"timcharper","id":183,"avatar_url":"https://avatars1.githubusercontent.com/u/183?v=4","gravatar_id":"","url":"https://api.github.com/users/timcharper","html_url":"https://github.com/timcharper","followers_url":"https://api.github.com/users/timcharper/followers","following_url":"https://api.github.com/users/timcharper/following{/other_user}","gists_url":"https://api.github.com/users/timcharper/gists{/gist_id}","starred_url":"https://api.github.com/users/timcharper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timcharper/subscriptions","organizations_url":"https://api.github.com/users/timcharper/orgs","repos_url":"https://api.github.com/users/timcharper/repos","events_url":"https://api.github.com/users/timcharper/events{/privacy}","received_events_url":"https://api.github.com/users/timcharper/received_events","type":"User","site_admin":false},"body":"Docs :)","created_at":"2018-03-28T15:56:33Z","updated_at":"2018-03-28T15:59:27Z","html_url":"https://github.com/mesosphere/marathon/pull/6046#discussion_r177800314","pull_request_url":"https://api.github.com/repos/mesosphere/marathon/pulls/6046","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/comments/177800314"},"html":{"href":"https://github.com/mesosphere/marathon/pull/6046#discussion_r177800314"},"pull_request":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6046"}}},"pull_request":{"url":"https://api.github.com/repos/mesosphere/marathon/pulls/6046","id":171069033,"html_url":"https://github.com/mesosphere/marathon/pull/6046","diff_url":"https://github.com/mesosphere/marathon/pull/6046.diff","patch_url":"https://github.com/mesosphere/marathon/pull/6046.patch","issue_url":"https://api.github.com/repos/mesosphere/marathon/issues/6046","number":6046,"state":"open","locked":false,"title":"Send Instance health changed event when the overall status changed","user":{"login":"clems4ever","id":3193257,"avatar_url":"https://avatars2.githubusercontent.com/u/3193257?v=4","gravatar_id":"","url":"https://api.github.com/users/clems4ever","html_url":"https://github.com/clems4ever","followers_url":"https://api.github.com/users/clems4ever/followers","following_url":"https://api.github.com/users/clems4ever/following{/other_user}","gists_url":"https://api.github.com/users/clems4ever/gists{/gist_id}","starred_url":"https://api.github.com/users/clems4ever/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/clems4ever/subscriptions","organizations_url":"https://api.github.com/users/clems4ever/orgs","repos_url":"https://api.github.com/users/clems4ever/repos","events_url":"https://api.github.com/users/clems4ever/events{/privacy}","received_events_url":"https://api.github.com/users/clems4ever/received_events","type":"User","site_admin":false},"body":"Before this fix, during a deployment triggered by a restart, the old\r\ninstances of an app were killed before the new ones were healthy. This\r\nwas due to the \"instance_health_changed_event\" event sent too early to\r\nthe ReadinessBehavior instance (when the first health check reported to be\r\nhealthy instead of ALL health checks).\r\n\r\nThe aim of this fix is to aggregate the results of health checks and\r\nmaintain a global instance health state which is Some(true) if all health\r\nchecks of a given instances report healthy, Some(false) if all health checks\r\nreport unhealthy and Option.empty if there is at least one unreported result.\r\nThe \"instance_health_changed_event\" event is now sent only when there is a\r\ntransition between those 3 states.\r\n\r\nThis commit relates to those tickets: MARATHON-7609, MARATHON-2683.\r\n\r\nBackport in branch v1.5: https://github.com/mesosphere/marathon/pull/6045","created_at":"2018-02-23T17:14:25Z","updated_at":"2018-03-28T15:59:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"da6e8ea75a161e3d66cc765ea458c81233786146","assignee":{"login":"alenkacz","id":264608,"avatar_url":"https://avatars1.githubusercontent.com/u/264608?v=4","gravatar_id":"","url":"https://api.github.com/users/alenkacz","html_url":"https://github.com/alenkacz","followers_url":"https://api.github.com/users/alenkacz/followers","following_url":"https://api.github.com/users/alenkacz/following{/other_user}","gists_url":"https://api.github.com/users/alenkacz/gists{/gist_id}","starred_url":"https://api.github.com/users/alenkacz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alenkacz/subscriptions","organizations_url":"https://api.github.com/users/alenkacz/orgs","repos_url":"https://api.github.com/users/alenkacz/repos","events_url":"https://api.github.com/users/alenkacz/events{/privacy}","received_events_url":"https://api.github.com/users/alenkacz/received_events","type":"User","site_admin":false},"assignees":[{"login":"alenkacz","id":264608,"avatar_url":"https://avatars1.githubusercontent.com/u/264608?v=4","gravatar_id":"","url":"https://api.github.com/users/alenkacz","html_url":"https://github.com/alenkacz","followers_url":"https://api.github.com/users/alenkacz/followers","following_url":"https://api.github.com/users/alenkacz/following{/other_user}","gists_url":"https://api.github.com/users/alenkacz/gists{/gist_id}","starred_url":"https://api.github.com/users/alenkacz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alenkacz/subscriptions","organizations_url":"https://api.github.com/users/alenkacz/orgs","repos_url":"https://api.github.com/users/alenkacz/repos","events_url":"https://api.github.com/users/alenkacz/events{/privacy}","received_events_url":"https://api.github.com/users/alenkacz/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"meichstedt","id":414354,"avatar_url":"https://avatars2.githubusercontent.com/u/414354?v=4","gravatar_id":"","url":"https://api.github.com/users/meichstedt","html_url":"https://github.com/meichstedt","followers_url":"https://api.github.com/users/meichstedt/followers","following_url":"https://api.github.com/users/meichstedt/following{/other_user}","gists_url":"https://api.github.com/users/meichstedt/gists{/gist_id}","starred_url":"https://api.github.com/users/meichstedt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meichstedt/subscriptions","organizations_url":"https://api.github.com/users/meichstedt/orgs","repos_url":"https://api.github.com/users/meichstedt/repos","events_url":"https://api.github.com/users/meichstedt/events{/privacy}","received_events_url":"https://api.github.com/users/meichstedt/received_events","type":"User","site_admin":false},{"login":"jeschkies","id":2418440,"avatar_url":"https://avatars3.githubusercontent.com/u/2418440?v=4","gravatar_id":"","url":"https://api.github.com/users/jeschkies","html_url":"https://github.com/jeschkies","followers_url":"https://api.github.com/users/jeschkies/followers","following_url":"https://api.github.com/users/jeschkies/following{/other_user}","gists_url":"https://api.github.com/users/jeschkies/gists{/gist_id}","starred_url":"https://api.github.com/users/jeschkies/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeschkies/subscriptions","organizations_url":"https://api.github.com/users/jeschkies/orgs","repos_url":"https://api.github.com/users/jeschkies/repos","events_url":"https://api.github.com/users/jeschkies/events{/privacy}","received_events_url":"https://api.github.com/users/jeschkies/received_events","type":"User","site_admin":false},{"login":"zen-dog","id":7558454,"avatar_url":"https://avatars2.githubusercontent.com/u/7558454?v=4","gravatar_id":"","url":"https://api.github.com/users/zen-dog","html_url":"https://github.com/zen-dog","followers_url":"https://api.github.com/users/zen-dog/followers","following_url":"https://api.github.com/users/zen-dog/following{/other_user}","gists_url":"https://api.github.com/users/zen-dog/gists{/gist_id}","starred_url":"https://api.github.com/users/zen-dog/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zen-dog/subscriptions","organizations_url":"https://api.github.com/users/zen-dog/orgs","repos_url":"https://api.github.com/users/zen-dog/repos","events_url":"https://api.github.com/users/zen-dog/events{/privacy}","received_events_url":"https://api.github.com/users/zen-dog/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":722765852,"url":"https://api.github.com/repos/mesosphere/marathon/labels/community","name":"community","color":"efa545","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/mesosphere/marathon/pulls/6046/commits","review_comments_url":"https://api.github.com/repos/mesosphere/marathon/pulls/6046/comments","review_comment_url":"https://api.github.com/repos/mesosphere/marathon/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mesosphere/marathon/issues/6046/comments","statuses_url":"https://api.github.com/repos/mesosphere/marathon/statuses/9d73a2cbb1eac5782cf20d22e944c53b3c1f72bd","head":{"label":"criteo-forks:health-check-master","ref":"health-check-master","sha":"9d73a2cbb1eac5782cf20d22e944c53b3c1f72bd","user":{"login":"criteo-forks","id":9960514,"avatar_url":"https://avatars0.githubusercontent.com/u/9960514?v=4","gravatar_id":"","url":"https://api.github.com/users/criteo-forks","html_url":"https://github.com/criteo-forks","followers_url":"https://api.github.com/users/criteo-forks/followers","following_url":"https://api.github.com/users/criteo-forks/following{/other_user}","gists_url":"https://api.github.com/users/criteo-forks/gists{/gist_id}","starred_url":"https://api.github.com/users/criteo-forks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/criteo-forks/subscriptions","organizations_url":"https://api.github.com/users/criteo-forks/orgs","repos_url":"https://api.github.com/users/criteo-forks/repos","events_url":"https://api.github.com/users/criteo-forks/events{/privacy}","received_events_url":"https://api.github.com/users/criteo-forks/received_events","type":"Organization","site_admin":false},"repo":{"id":50347255,"name":"marathon","full_name":"criteo-forks/marathon","owner":{"login":"criteo-forks","id":9960514,"avatar_url":"https://avatars0.githubusercontent.com/u/9960514?v=4","gravatar_id":"","url":"https://api.github.com/users/criteo-forks","html_url":"https://github.com/criteo-forks","followers_url":"https://api.github.com/users/criteo-forks/followers","following_url":"https://api.github.com/users/criteo-forks/following{/other_user}","gists_url":"https://api.github.com/users/criteo-forks/gists{/gist_id}","starred_url":"https://api.github.com/users/criteo-forks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/criteo-forks/subscriptions","organizations_url":"https://api.github.com/users/criteo-forks/orgs","repos_url":"https://api.github.com/users/criteo-forks/repos","events_url":"https://api.github.com/users/criteo-forks/events{/privacy}","received_events_url":"https://api.github.com/users/criteo-forks/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/criteo-forks/marathon","description":"Deploy and manage containers (including Docker) on top of Apache Mesos at scale.","fork":true,"url":"https://api.github.com/repos/criteo-forks/marathon","forks_url":"https://api.github.com/repos/criteo-forks/marathon/forks","keys_url":"https://api.github.com/repos/criteo-forks/marathon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/criteo-forks/marathon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/criteo-forks/marathon/teams","hooks_url":"https://api.github.com/repos/criteo-forks/marathon/hooks","issue_events_url":"https://api.github.com/repos/criteo-forks/marathon/issues/events{/number}","events_url":"https://api.github.com/repos/criteo-forks/marathon/events","assignees_url":"https://api.github.com/repos/criteo-forks/marathon/assignees{/user}","branches_url":"https://api.github.com/repos/criteo-forks/marathon/branches{/branch}","tags_url":"https://api.github.com/repos/criteo-forks/marathon/tags","blobs_url":"https://api.github.com/repos/criteo-forks/marathon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/criteo-forks/marathon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/criteo-forks/marathon/git/refs{/sha}","trees_url":"https://api.github.com/repos/criteo-forks/marathon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/criteo-forks/marathon/statuses/{sha}","languages_url":"https://api.github.com/repos/criteo-forks/marathon/languages","stargazers_url":"https://api.github.com/repos/criteo-forks/marathon/stargazers","contributors_url":"https://api.github.com/repos/criteo-forks/marathon/contributors","subscribers_url":"https://api.github.com/repos/criteo-forks/marathon/subscribers","subscription_url":"https://api.github.com/repos/criteo-forks/marathon/subscription","commits_url":"https://api.github.com/repos/criteo-forks/marathon/commits{/sha}","git_commits_url":"https://api.github.com/repos/criteo-forks/marathon/git/commits{/sha}","comments_url":"https://api.github.com/repos/criteo-forks/marathon/comments{/number}","issue_comment_url":"https://api.github.com/repos/criteo-forks/marathon/issues/comments{/number}","contents_url":"https://api.github.com/repos/criteo-forks/marathon/contents/{+path}","compare_url":"https://api.github.com/repos/criteo-forks/marathon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/criteo-forks/marathon/merges","archive_url":"https://api.github.com/repos/criteo-forks/marathon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/criteo-forks/marathon/downloads","issues_url":"https://api.github.com/repos/criteo-forks/marathon/issues{/number}","pulls_url":"https://api.github.com/repos/criteo-forks/marathon/pulls{/number}","milestones_url":"https://api.github.com/repos/criteo-forks/marathon/milestones{/number}","notifications_url":"https://api.github.com/repos/criteo-forks/marathon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/criteo-forks/marathon/labels{/name}","releases_url":"https://api.github.com/repos/criteo-forks/marathon/releases{/id}","deployments_url":"https://api.github.com/repos/criteo-forks/marathon/deployments","created_at":"2016-01-25T11:48:51Z","updated_at":"2017-11-06T18:28:40Z","pushed_at":"2018-03-28T15:51:39Z","git_url":"git://github.com/criteo-forks/marathon.git","ssh_url":"git@github.com:criteo-forks/marathon.git","clone_url":"https://github.com/criteo-forks/marathon.git","svn_url":"https://github.com/criteo-forks/marathon","homepage":"https://mesosphere.github.io/marathon/","size":33607,"stargazers_count":1,"watchers_count":1,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":1,"default_branch":"criteo_build"}},"base":{"label":"mesosphere:master","ref":"master","sha":"294dce5cefbd0a923961e858d5e14ec33d5c4cbf","user":{"login":"mesosphere","id":3458585,"avatar_url":"https://avatars0.githubusercontent.com/u/3458585?v=4","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"repo":{"id":10941409,"name":"marathon","full_name":"mesosphere/marathon","owner":{"login":"mesosphere","id":3458585,"avatar_url":"https://avatars0.githubusercontent.com/u/3458585?v=4","gravatar_id":"","url":"https://api.github.com/users/mesosphere","html_url":"https://github.com/mesosphere","followers_url":"https://api.github.com/users/mesosphere/followers","following_url":"https://api.github.com/users/mesosphere/following{/other_user}","gists_url":"https://api.github.com/users/mesosphere/gists{/gist_id}","starred_url":"https://api.github.com/users/mesosphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mesosphere/subscriptions","organizations_url":"https://api.github.com/users/mesosphere/orgs","repos_url":"https://api.github.com/users/mesosphere/repos","events_url":"https://api.github.com/users/mesosphere/events{/privacy}","received_events_url":"https://api.github.com/users/mesosphere/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mesosphere/marathon","description":"Deploy and manage containers (including Docker) on top of Apache Mesos at scale.","fork":false,"url":"https://api.github.com/repos/mesosphere/marathon","forks_url":"https://api.github.com/repos/mesosphere/marathon/forks","keys_url":"https://api.github.com/repos/mesosphere/marathon/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mesosphere/marathon/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mesosphere/marathon/teams","hooks_url":"https://api.github.com/repos/mesosphere/marathon/hooks","issue_events_url":"https://api.github.com/repos/mesosphere/marathon/issues/events{/number}","events_url":"https://api.github.com/repos/mesosphere/marathon/events","assignees_url":"https://api.github.com/repos/mesosphere/marathon/assignees{/user}","branches_url":"https://api.github.com/repos/mesosphere/marathon/branches{/branch}","tags_url":"https://api.github.com/repos/mesosphere/marathon/tags","blobs_url":"https://api.github.com/repos/mesosphere/marathon/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mesosphere/marathon/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mesosphere/marathon/git/refs{/sha}","trees_url":"https://api.github.com/repos/mesosphere/marathon/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mesosphere/marathon/statuses/{sha}","languages_url":"https://api.github.com/repos/mesosphere/marathon/languages","stargazers_url":"https://api.github.com/repos/mesosphere/marathon/stargazers","contributors_url":"https://api.github.com/repos/mesosphere/marathon/contributors","subscribers_url":"https://api.github.com/repos/mesosphere/marathon/subscribers","subscription_url":"https://api.github.com/repos/mesosphere/marathon/subscription","commits_url":"https://api.github.com/repos/mesosphere/marathon/commits{/sha}","git_commits_url":"https://api.github.com/repos/mesosphere/marathon/git/commits{/sha}","comments_url":"https://api.github.com/repos/mesosphere/marathon/comments{/number}","issue_comment_url":"https://api.github.com/repos/mesosphere/marathon/issues/comments{/number}","contents_url":"https://api.github.com/repos/mesosphere/marathon/contents/{+path}","compare_url":"https://api.github.com/repos/mesosphere/marathon/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mesosphere/marathon/merges","archive_url":"https://api.github.com/repos/mesosphere/marathon/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mesosphere/marathon/downloads","issues_url":"https://api.github.com/repos/mesosphere/marathon/issues{/number}","pulls_url":"https://api.github.com/repos/mesosphere/marathon/pulls{/number}","milestones_url":"https://api.github.com/repos/mesosphere/marathon/milestones{/number}","notifications_url":"https://api.github.com/repos/mesosphere/marathon/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mesosphere/marathon/labels{/name}","releases_url":"https://api.github.com/repos/mesosphere/marathon/releases{/id}","deployments_url":"https://api.github.com/repos/mesosphere/marathon/deployments","created_at":"2013-06-25T14:56:34Z","updated_at":"2018-03-28T14:40:29Z","pushed_at":"2018-03-28T15:51:42Z","git_url":"git://github.com/mesosphere/marathon.git","ssh_url":"git@github.com:mesosphere/marathon.git","clone_url":"https://github.com/mesosphere/marathon.git","svn_url":"https://github.com/mesosphere/marathon","homepage":"https://mesosphere.github.io/marathon/","size":34771,"stargazers_count":3609,"watchers_count":3609,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":831,"mirror_url":null,"archived":false,"open_issues_count":17,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":831,"open_issues":17,"watchers":3609,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6046"},"html":{"href":"https://github.com/mesosphere/marathon/pull/6046"},"issue":{"href":"https://api.github.com/repos/mesosphere/marathon/issues/6046"},"comments":{"href":"https://api.github.com/repos/mesosphere/marathon/issues/6046/comments"},"review_comments":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6046/comments"},"review_comment":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mesosphere/marathon/pulls/6046/commits"},"statuses":{"href":"https://api.github.com/repos/mesosphere/marathon/statuses/9d73a2cbb1eac5782cf20d22e944c53b3c1f72bd"}},"author_association":"NONE"}}
{"actor":{"display_login":"timcharper"}}