{"action":"created","comment":{"url":"https://api.github.com/repos/paypal/squbs/pulls/comments/88911397","pull_request_review_id":9468257,"id":88911397,"diff_hunk":"@@ -0,0 +1,204 @@\n+/*\n+ * Copyright 2015 PayPal\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package org.squbs.unicomplex.pipeline\n+\n+import java.lang.management.ManagementFactory\n+import javax.management.ObjectName\n+\n+import akka.actor.ActorSystem\n+import akka.http.scaladsl.Http\n+import akka.http.scaladsl.model._\n+import akka.http.scaladsl.model.ws.PeerClosedConnectionException\n+import akka.http.scaladsl.server._\n+import akka.pattern._\n+import akka.stream.ActorMaterializer\n+import akka.stream.scaladsl.{Sink, Source}\n+import akka.testkit.TestKit\n+import com.typesafe.config.ConfigFactory\n+import org.scalatest.{AsyncFlatSpecLike, Matchers}\n+import org.squbs.metrics.{MetricsFlow, MetricsExtension}\n+import org.squbs.pipeline.streaming._\n+import org.squbs.unicomplex.Timeouts._\n+import org.squbs.unicomplex._\n+\n+import scala.concurrent.{Await, Future}\n+\n+object MetricsFlowSpec {\n+  val classPaths = Array(getClass.getClassLoader.getResource(\"classpaths/pipeline/MetricsFlowSpec\").getPath)\n+\n+  val config = ConfigFactory.parseString(\n+    s\"\"\"\n+       |default-listener.bind-port = 0\n+       |squbs {\n+       |  actorsystem-name = ServerMetricsFlowSpec\n+       |  ${JMX.prefixConfig} = true\n+       |}\n+       |\n+       |preFlow {\n+       |  type = squbs.pipelineflow\n+       |  factory = org.squbs.unicomplex.pipeline.DefaultFlow\n+       |}\n+       |squbs.pipeline.streaming.defaults {\n+       |  pre-flow =  preFlow\n+       |}\n+    \"\"\".stripMargin\n+  )\n+\n+  val boot = UnicomplexBoot(config)\n+    .createUsing {(name, config) => ActorSystem(name, config)}\n+    .scanComponents(classPaths)\n+    .initExtensions.start()\n+}\n+\n+class MetricsFlowSpec extends TestKit(MetricsFlowSpec.boot.actorSystem) with AsyncFlatSpecLike with Matchers {\n+\n+  def hello(webContext: String) = HttpRequest(uri = s\"$webContext/hello\") -> 0\n+  def redirect(webContext: String) = HttpRequest(uri = s\"$webContext/redirect\") -> 0\n+  def notFound(webContext: String) = HttpRequest(uri = s\"$webContext/notfound\") -> 0\n+  def internalServerError(webContext: String) = HttpRequest(uri = s\"$webContext/internalservererror\") -> 0\n+  def connectionException(webContext: String) = HttpRequest(uri = s\"$webContext/connectionException\") -> 0\n+  def timeoutException(webContext: String) = HttpRequest(uri = s\"$webContext/timeoutException\") -> 0\n+\n+  implicit val materializer = ActorMaterializer()\n+\n+  val portBindings = Await.result((Unicomplex(system).uniActor ? PortBindings).mapTo[Map[String, Int]], awaitMax)\n+  val port = portBindings(\"default-listener\")\n+  val poolClientFlow = Http().cachedHostConnectionPool[Int](\"localhost\", port)\n+\n+  it should \"collect request count and time metrics when webContext is empty\" in {\n+    val future = Source(hello(\"\") :: hello(\"\") :: Nil).\n+      via(poolClientFlow).\n+      runWith(Sink.ignore)\n+\n+    future map { _ =>\n+      assertJmxValue(\"/-request-count\", \"Count\", 2)\n+      assertJmxValue(\"/-request-time\", \"Count\", 2)\n+      assertJmxEntryExists(\"/-request-time\", \"FifteenMinuteRate\")\n+    }\n+  }\n+\n+  it should \"collect request count and time metrics\" in {\n+    val future = Source(hello(\"/sample\") :: hello(\"/sample\") :: Nil).\n+      via(poolClientFlow).\n+      runWith(Sink.ignore)\n+\n+    future map { _ =>\n+      assertJmxValue(\"sample-request-count\", \"Count\", 2)\n+      assertJmxValue(\"sample-request-time\", \"Count\", 2)\n+      assertJmxEntryExists(\"sample-request-time\", \"FifteenMinuteRate\")\n+    }\n+  }\n+\n+  it should \"collect metrics per http status code category\" in {\n+    val future = Source(hello(\"/sample2\") :: hello(\"/sample2\") :: redirect(\"/sample2\") :: notFound(\"/sample2\")\n+      :: internalServerError(\"/sample2\") :: internalServerError(\"/sample2\") :: Nil).\n+      via(poolClientFlow).\n+      runWith(Sink.ignore)\n+\n+    future map { _ =>\n+      assertJmxValue(\"sample2-request-count\", \"Count\", 6)\n+      assertJmxValue(\"sample2-2XX-count\", \"Count\", 2)\n+      assertJmxValue(\"sample2-3XX-count\", \"Count\", 1)\n+      assertJmxValue(\"sample2-4XX-count\", \"Count\", 1)\n+      assertJmxValue(\"sample2-5XX-count\", \"Count\", 2)\n+    }\n+  }\n+\n+  it should \"be able to collect multiple metrics\" in {\n+\n+    val f1 = Source(hello(\"/sample3\") :: hello(\"/sample3\") :: internalServerError(\"/sample3\") ::\n+      internalServerError(\"/sample3\") :: Nil).\n+      via(poolClientFlow).\n+      runWith(Sink.ignore)\n+\n+    val f2 = Source.single(redirect(\"/sample4\")).\n+      via(poolClientFlow).\n+      runWith(Sink.ignore)\n+\n+    val f3 = Source.single(notFound(\"/sample5\")).\n+      via(poolClientFlow).\n+      runWith(Sink.ignore)\n+\n+    val f = Future.sequence(List(f1, f2, f3))\n+\n+    f map { _ =>\n+      assertJmxValue(\"sample3-request-count\", \"Count\", 4)\n+      assertJmxValue(\"sample3-2XX-count\", \"Count\", 2)\n+      assertJmxValue(\"sample3-5XX-count\", \"Count\", 2)\n+\n+      assertJmxValue(\"sample4-request-count\", \"Count\", 1)\n+      assertJmxValue(\"sample4-3XX-count\", \"Count\", 1)\n+\n+      assertJmxValue(\"sample5-request-count\", \"Count\", 1)\n+      assertJmxValue(\"sample5-4XX-count\", \"Count\", 1)\n+    }\n+  }\n+\n+  it should \"collect metrics for mapped exceptions\" in {\n+\n+    val future = Source(hello(\"/sample6\") :: hello(\"/sample6\") :: connectionException(\"/sample6\")\n+      :: connectionException(\"/sample6\") :: timeoutException(\"/sample6\") :: timeoutException(\"/sample6\") :: Nil).\n+      via(poolClientFlow).\n+      runWith(Sink.ignore)\n+\n+    future map { _ =>\n+      assertJmxValue(\"sample6-request-count\", \"Count\", 6)\n+      assertJmxValue(\"sample6-2XX-count\", \"Count\", 2)\n+      assertJmxValue(\"sample6-5XX-count\", \"Count\", 4)\n+    }\n+  }\n+\n+  def assertJmxValue(beanName: String, key: String, expectedValue: Any) = {","path":"squbs-unicomplex/src/test/scala/org/squbs/unicomplex/pipeline/MetricsFlowSpec.scala","position":165,"original_position":165,"commit_id":"bea12e0e84580dc60563d7b7edc8e5d67b508322","original_commit_id":"3938ae6781dfb597e25ceffae365fbc108b60de1","user":{"login":"anilgursel","id":3316621,"avatar_url":"https://avatars.githubusercontent.com/u/3316621?v=3","gravatar_id":"","url":"https://api.github.com/users/anilgursel","html_url":"https://github.com/anilgursel","followers_url":"https://api.github.com/users/anilgursel/followers","following_url":"https://api.github.com/users/anilgursel/following{/other_user}","gists_url":"https://api.github.com/users/anilgursel/gists{/gist_id}","starred_url":"https://api.github.com/users/anilgursel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anilgursel/subscriptions","organizations_url":"https://api.github.com/users/anilgursel/orgs","repos_url":"https://api.github.com/users/anilgursel/repos","events_url":"https://api.github.com/users/anilgursel/events{/privacy}","received_events_url":"https://api.github.com/users/anilgursel/received_events","type":"User","site_admin":false},"body":"Thought about it.  But, need to pass domain name, system etc..  A few lines of function requires long arguments, I was not sure which one would be more readable..","created_at":"2016-11-21T15:01:22Z","updated_at":"2016-11-21T15:01:22Z","html_url":"https://github.com/paypal/squbs/pull/334#discussion_r88911397","pull_request_url":"https://api.github.com/repos/paypal/squbs/pulls/334","_links":{"self":{"href":"https://api.github.com/repos/paypal/squbs/pulls/comments/88911397"},"html":{"href":"https://github.com/paypal/squbs/pull/334#discussion_r88911397"},"pull_request":{"href":"https://api.github.com/repos/paypal/squbs/pulls/334"}}},"pull_request":{"url":"https://api.github.com/repos/paypal/squbs/pulls/334","id":94373185,"html_url":"https://github.com/paypal/squbs/pull/334","diff_url":"https://github.com/paypal/squbs/pull/334.diff","patch_url":"https://github.com/paypal/squbs/pull/334.patch","issue_url":"https://api.github.com/repos/paypal/squbs/issues/334","number":334,"state":"open","locked":false,"title":"#122 Extract common components to a separate project","user":{"login":"anilgursel","id":3316621,"avatar_url":"https://avatars.githubusercontent.com/u/3316621?v=3","gravatar_id":"","url":"https://api.github.com/users/anilgursel","html_url":"https://github.com/anilgursel","followers_url":"https://api.github.com/users/anilgursel/followers","following_url":"https://api.github.com/users/anilgursel/following{/other_user}","gists_url":"https://api.github.com/users/anilgursel/gists{/gist_id}","starred_url":"https://api.github.com/users/anilgursel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anilgursel/subscriptions","organizations_url":"https://api.github.com/users/anilgursel/orgs","repos_url":"https://api.github.com/users/anilgursel/repos","events_url":"https://api.github.com/users/anilgursel/events{/privacy}","received_events_url":"https://api.github.com/users/anilgursel/received_events","type":"User","site_admin":false},"body":"Thanks for your pull request.  Please review the following guidelines.\r\n\r\n- [x] Title includes issue id.\r\n- [x] Description of the change added.\r\n- [x] Commits are squashed.\r\n- [x] Tests added.\r\n- [ ] Documentation added/updated.\r\n- [x] Also please review [CONTRIBUTING.md](https://github.com/paypal/squbs/blob/master/CONTRIBUTING.md).\r\n\r\n\r\nDescription:\r\n- Moving functionalities that are not specific to httpclient out of squbs-httpclient project:\r\n   - Metrics\r\n   - Endpoint Resolver\r\n   - Environment Resolver\r\n   - Circuit Breaker metrics\r\n- `ConfigUtil` moves to `squbs-ext` so that it can be used by other projects without a unicompelx dependency.\r\n- Http client does not depend on unicomplex anymore https://github.com/paypal/squbs/issues/308.\r\n- Metrics need akka-http-core; however, marking it as `\"provided\"` to make sure it does not bring the dependency to classpath as `squbs-ext` can be used by non-http projects (Endpoint resolver etc).  Http projects (e.g., squbs-httpclient) should specify the http-core dependency.\r\n- Same for dependency on `squbs-streamingpipeline`.  We do not want to bring http transitively, so dependency on `squbs-streamingpipeline` is `\"provided\"`.\r\n- Given that we extracted Metrics to `squbs-ext`, this allowed me to add metrics tests for server side https://github.com/paypal/squbs/issues/113. ","created_at":"2016-11-18T14:41:58Z","updated_at":"2016-11-21T15:01:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a080aefb987ab90aa57cf080427f5d3906d08f70","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/paypal/squbs/pulls/334/commits","review_comments_url":"https://api.github.com/repos/paypal/squbs/pulls/334/comments","review_comment_url":"https://api.github.com/repos/paypal/squbs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/paypal/squbs/issues/334/comments","statuses_url":"https://api.github.com/repos/paypal/squbs/statuses/bea12e0e84580dc60563d7b7edc8e5d67b508322","head":{"label":"anilgursel:squbs-ext","ref":"squbs-ext","sha":"bea12e0e84580dc60563d7b7edc8e5d67b508322","user":{"login":"anilgursel","id":3316621,"avatar_url":"https://avatars.githubusercontent.com/u/3316621?v=3","gravatar_id":"","url":"https://api.github.com/users/anilgursel","html_url":"https://github.com/anilgursel","followers_url":"https://api.github.com/users/anilgursel/followers","following_url":"https://api.github.com/users/anilgursel/following{/other_user}","gists_url":"https://api.github.com/users/anilgursel/gists{/gist_id}","starred_url":"https://api.github.com/users/anilgursel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anilgursel/subscriptions","organizations_url":"https://api.github.com/users/anilgursel/orgs","repos_url":"https://api.github.com/users/anilgursel/repos","events_url":"https://api.github.com/users/anilgursel/events{/privacy}","received_events_url":"https://api.github.com/users/anilgursel/received_events","type":"User","site_admin":false},"repo":{"id":45846928,"name":"squbs","full_name":"anilgursel/squbs","owner":{"login":"anilgursel","id":3316621,"avatar_url":"https://avatars.githubusercontent.com/u/3316621?v=3","gravatar_id":"","url":"https://api.github.com/users/anilgursel","html_url":"https://github.com/anilgursel","followers_url":"https://api.github.com/users/anilgursel/followers","following_url":"https://api.github.com/users/anilgursel/following{/other_user}","gists_url":"https://api.github.com/users/anilgursel/gists{/gist_id}","starred_url":"https://api.github.com/users/anilgursel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anilgursel/subscriptions","organizations_url":"https://api.github.com/users/anilgursel/orgs","repos_url":"https://api.github.com/users/anilgursel/repos","events_url":"https://api.github.com/users/anilgursel/events{/privacy}","received_events_url":"https://api.github.com/users/anilgursel/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/anilgursel/squbs","description":"Akka/Spray for Large-Scale Production Deployments","fork":true,"url":"https://api.github.com/repos/anilgursel/squbs","forks_url":"https://api.github.com/repos/anilgursel/squbs/forks","keys_url":"https://api.github.com/repos/anilgursel/squbs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/anilgursel/squbs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/anilgursel/squbs/teams","hooks_url":"https://api.github.com/repos/anilgursel/squbs/hooks","issue_events_url":"https://api.github.com/repos/anilgursel/squbs/issues/events{/number}","events_url":"https://api.github.com/repos/anilgursel/squbs/events","assignees_url":"https://api.github.com/repos/anilgursel/squbs/assignees{/user}","branches_url":"https://api.github.com/repos/anilgursel/squbs/branches{/branch}","tags_url":"https://api.github.com/repos/anilgursel/squbs/tags","blobs_url":"https://api.github.com/repos/anilgursel/squbs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/anilgursel/squbs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/anilgursel/squbs/git/refs{/sha}","trees_url":"https://api.github.com/repos/anilgursel/squbs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/anilgursel/squbs/statuses/{sha}","languages_url":"https://api.github.com/repos/anilgursel/squbs/languages","stargazers_url":"https://api.github.com/repos/anilgursel/squbs/stargazers","contributors_url":"https://api.github.com/repos/anilgursel/squbs/contributors","subscribers_url":"https://api.github.com/repos/anilgursel/squbs/subscribers","subscription_url":"https://api.github.com/repos/anilgursel/squbs/subscription","commits_url":"https://api.github.com/repos/anilgursel/squbs/commits{/sha}","git_commits_url":"https://api.github.com/repos/anilgursel/squbs/git/commits{/sha}","comments_url":"https://api.github.com/repos/anilgursel/squbs/comments{/number}","issue_comment_url":"https://api.github.com/repos/anilgursel/squbs/issues/comments{/number}","contents_url":"https://api.github.com/repos/anilgursel/squbs/contents/{+path}","compare_url":"https://api.github.com/repos/anilgursel/squbs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/anilgursel/squbs/merges","archive_url":"https://api.github.com/repos/anilgursel/squbs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/anilgursel/squbs/downloads","issues_url":"https://api.github.com/repos/anilgursel/squbs/issues{/number}","pulls_url":"https://api.github.com/repos/anilgursel/squbs/pulls{/number}","milestones_url":"https://api.github.com/repos/anilgursel/squbs/milestones{/number}","notifications_url":"https://api.github.com/repos/anilgursel/squbs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/anilgursel/squbs/labels{/name}","releases_url":"https://api.github.com/repos/anilgursel/squbs/releases{/id}","deployments_url":"https://api.github.com/repos/anilgursel/squbs/deployments","created_at":"2015-11-09T15:27:04Z","updated_at":"2016-02-29T13:50:05Z","pushed_at":"2016-11-20T19:23:37Z","git_url":"git://github.com/anilgursel/squbs.git","ssh_url":"git@github.com:anilgursel/squbs.git","clone_url":"https://github.com/anilgursel/squbs.git","svn_url":"https://github.com/anilgursel/squbs","homepage":"","size":6741,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"paypal:master","ref":"master","sha":"ff78452249375ff4f14665dba10f3ac1dcc486eb","user":{"login":"paypal","id":476675,"avatar_url":"https://avatars.githubusercontent.com/u/476675?v=3","gravatar_id":"","url":"https://api.github.com/users/paypal","html_url":"https://github.com/paypal","followers_url":"https://api.github.com/users/paypal/followers","following_url":"https://api.github.com/users/paypal/following{/other_user}","gists_url":"https://api.github.com/users/paypal/gists{/gist_id}","starred_url":"https://api.github.com/users/paypal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paypal/subscriptions","organizations_url":"https://api.github.com/users/paypal/orgs","repos_url":"https://api.github.com/users/paypal/repos","events_url":"https://api.github.com/users/paypal/events{/privacy}","received_events_url":"https://api.github.com/users/paypal/received_events","type":"Organization","site_admin":false},"repo":{"id":38714007,"name":"squbs","full_name":"paypal/squbs","owner":{"login":"paypal","id":476675,"avatar_url":"https://avatars.githubusercontent.com/u/476675?v=3","gravatar_id":"","url":"https://api.github.com/users/paypal","html_url":"https://github.com/paypal","followers_url":"https://api.github.com/users/paypal/followers","following_url":"https://api.github.com/users/paypal/following{/other_user}","gists_url":"https://api.github.com/users/paypal/gists{/gist_id}","starred_url":"https://api.github.com/users/paypal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paypal/subscriptions","organizations_url":"https://api.github.com/users/paypal/orgs","repos_url":"https://api.github.com/users/paypal/repos","events_url":"https://api.github.com/users/paypal/events{/privacy}","received_events_url":"https://api.github.com/users/paypal/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/paypal/squbs","description":"Akka/Spray for Large-Scale Production Deployments","fork":false,"url":"https://api.github.com/repos/paypal/squbs","forks_url":"https://api.github.com/repos/paypal/squbs/forks","keys_url":"https://api.github.com/repos/paypal/squbs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/paypal/squbs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/paypal/squbs/teams","hooks_url":"https://api.github.com/repos/paypal/squbs/hooks","issue_events_url":"https://api.github.com/repos/paypal/squbs/issues/events{/number}","events_url":"https://api.github.com/repos/paypal/squbs/events","assignees_url":"https://api.github.com/repos/paypal/squbs/assignees{/user}","branches_url":"https://api.github.com/repos/paypal/squbs/branches{/branch}","tags_url":"https://api.github.com/repos/paypal/squbs/tags","blobs_url":"https://api.github.com/repos/paypal/squbs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/paypal/squbs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/paypal/squbs/git/refs{/sha}","trees_url":"https://api.github.com/repos/paypal/squbs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/paypal/squbs/statuses/{sha}","languages_url":"https://api.github.com/repos/paypal/squbs/languages","stargazers_url":"https://api.github.com/repos/paypal/squbs/stargazers","contributors_url":"https://api.github.com/repos/paypal/squbs/contributors","subscribers_url":"https://api.github.com/repos/paypal/squbs/subscribers","subscription_url":"https://api.github.com/repos/paypal/squbs/subscription","commits_url":"https://api.github.com/repos/paypal/squbs/commits{/sha}","git_commits_url":"https://api.github.com/repos/paypal/squbs/git/commits{/sha}","comments_url":"https://api.github.com/repos/paypal/squbs/comments{/number}","issue_comment_url":"https://api.github.com/repos/paypal/squbs/issues/comments{/number}","contents_url":"https://api.github.com/repos/paypal/squbs/contents/{+path}","compare_url":"https://api.github.com/repos/paypal/squbs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/paypal/squbs/merges","archive_url":"https://api.github.com/repos/paypal/squbs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/paypal/squbs/downloads","issues_url":"https://api.github.com/repos/paypal/squbs/issues{/number}","pulls_url":"https://api.github.com/repos/paypal/squbs/pulls{/number}","milestones_url":"https://api.github.com/repos/paypal/squbs/milestones{/number}","notifications_url":"https://api.github.com/repos/paypal/squbs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/paypal/squbs/labels{/name}","releases_url":"https://api.github.com/repos/paypal/squbs/releases{/id}","deployments_url":"https://api.github.com/repos/paypal/squbs/deployments","created_at":"2015-07-07T20:48:12Z","updated_at":"2016-11-19T08:20:53Z","pushed_at":"2016-11-20T19:22:59Z","git_url":"git://github.com/paypal/squbs.git","ssh_url":"git@github.com:paypal/squbs.git","clone_url":"https://github.com/paypal/squbs.git","svn_url":"https://github.com/paypal/squbs","homepage":"http://paypal.github.io/squbs","size":6686,"stargazers_count":728,"watchers_count":728,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":112,"mirror_url":null,"open_issues_count":34,"forks":112,"open_issues":34,"watchers":728,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/paypal/squbs/pulls/334"},"html":{"href":"https://github.com/paypal/squbs/pull/334"},"issue":{"href":"https://api.github.com/repos/paypal/squbs/issues/334"},"comments":{"href":"https://api.github.com/repos/paypal/squbs/issues/334/comments"},"review_comments":{"href":"https://api.github.com/repos/paypal/squbs/pulls/334/comments"},"review_comment":{"href":"https://api.github.com/repos/paypal/squbs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/paypal/squbs/pulls/334/commits"},"statuses":{"href":"https://api.github.com/repos/paypal/squbs/statuses/bea12e0e84580dc60563d7b7edc8e5d67b508322"}}}}
{"actor":{"display_login":"anilgursel"}}