{"action":"created","comment":{"url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/comments/203897494","pull_request_review_id":138881501,"id":203897494,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMzg5NzQ5NA==","diff_hunk":"@@ -303,15 +306,15 @@ where\n impl<F, B> Future for HyperServerSvcFuture<F>\n where\n     F: Future<Item=http::Response<B>>,\n-    F::Error: fmt::Debug,\n+    F::Error: Error + fmt::Debug + Send + Sync + 'static,\n {\n     type Item = http::Response<BodyPayload<B>>;\n     type Error = h2::Error;\n \n     fn poll(&mut self) -> Poll<Self::Item, Self::Error> {\n         let mut res = try_ready!(self.inner.poll().map_err(|e| {\n-            debug!(\"h2 error: {:?}\", e);\n-            h2::Error::from(io::Error::from(io::ErrorKind::Other))\n+            debug!(\"HTTP/1 error: {}\", e);\n+            h2::Error::from(io::Error::new(io::ErrorKind::Other, e))","path":"src/transparency/glue.rs","position":37,"original_position":37,"commit_id":"4f31829076d419c1af151fedc0e0450e4065c64a","original_commit_id":"4f31829076d419c1af151fedc0e0450e4065c64a","user":{"login":"briansmith","id":16816,"node_id":"MDQ6VXNlcjE2ODE2","avatar_url":"https://avatars0.githubusercontent.com/u/16816?v=4","gravatar_id":"","url":"https://api.github.com/users/briansmith","html_url":"https://github.com/briansmith","followers_url":"https://api.github.com/users/briansmith/followers","following_url":"https://api.github.com/users/briansmith/following{/other_user}","gists_url":"https://api.github.com/users/briansmith/gists{/gist_id}","starred_url":"https://api.github.com/users/briansmith/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/briansmith/subscriptions","organizations_url":"https://api.github.com/users/briansmith/orgs","repos_url":"https://api.github.com/users/briansmith/repos","events_url":"https://api.github.com/users/briansmith/events{/privacy}","received_events_url":"https://api.github.com/users/briansmith/received_events","type":"User","site_admin":false},"body":"Do we need a TODO or something about clarifying this? It's strange to construct an `h2::Error` for a HTTP/1 error.","created_at":"2018-07-19T22:59:44Z","updated_at":"2018-07-19T23:00:08Z","html_url":"https://github.com/linkerd/linkerd2-proxy/pull/18#discussion_r203897494","pull_request_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/comments/203897494"},"html":{"href":"https://github.com/linkerd/linkerd2-proxy/pull/18#discussion_r203897494"},"pull_request":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18"}}},"pull_request":{"url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18","id":202103083,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAyMTAzMDgz","html_url":"https://github.com/linkerd/linkerd2-proxy/pull/18","diff_url":"https://github.com/linkerd/linkerd2-proxy/pull/18.diff","patch_url":"https://github.com/linkerd/linkerd2-proxy/pull/18.patch","issue_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/18","number":18,"state":"open","locked":false,"title":"Improve error messages in logs","user":{"login":"hawkw","id":2796466,"node_id":"MDQ6VXNlcjI3OTY0NjY=","avatar_url":"https://avatars1.githubusercontent.com/u/2796466?v=4","gravatar_id":"","url":"https://api.github.com/users/hawkw","html_url":"https://github.com/hawkw","followers_url":"https://api.github.com/users/hawkw/followers","following_url":"https://api.github.com/users/hawkw/following{/other_user}","gists_url":"https://api.github.com/users/hawkw/gists{/gist_id}","starred_url":"https://api.github.com/users/hawkw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hawkw/subscriptions","organizations_url":"https://api.github.com/users/hawkw/orgs","repos_url":"https://api.github.com/users/hawkw/repos","events_url":"https://api.github.com/users/hawkw/events{/privacy}","received_events_url":"https://api.github.com/users/hawkw/received_events","type":"User","site_admin":false},"body":"Currently, the messages that the proxy logs on errors are often not \r\nvery useful. For example, when an error occurred that caused the proxy\r\nto return HTTP 500, we log a message like this:\r\n\r\n```\r\nERR! proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57416} linkerd2_proxy turning Error caused by underlying HTTP/2 error: protocol error: unexpected internal error encountered into 500\r\n```\r\n\r\nNote that:\r\n+ Regardless of what the error actually was, the current log message\r\n  *always* says protocol error: unexpected internal error encountered,\r\n  which is both fairly unclear *and* often not actually the case.\r\n+ Regardless of whether the error was encountered by an HTTP/1 or \r\n  HTTP/2 client, the error message always includes the string\r\n  \"underlying HTTP/2 error\". This is probably fairly confusing for \r\n  users who are, say, only proxying HTTP/1 traffic.\r\n\r\nThis branch fixes several related issues around the clarity of the\r\nproxy's error messages:\r\n\r\n+ A couple cases in the `transparency` module that returned\r\n  `io::Error::from(io::ErrorKind::Other)` have been replaced with\r\n  more descriptive errors that propagate the underlying error. This\r\n  necessitated adding bounds on some error types.\r\n+ Introduced a new `transparency::client::Error` enum that can be \r\n  either a `h2::Error` or a `hyper::Error`, depending on whether\r\n  the client is HTTP/1 or HTTP/2, and proxies its' `std::error::Error`\r\n  impl to the wrapped error types. This way, we don't return a\r\n  `tower_h2::client::Error` (with format output that includes the \r\n  string \"HTTP/2\") from everything, and discard significantly less\r\n  error information.\r\n\r\n<details>\r\n<summary>Examples</summary>\r\nAs an example, here's what happens when I hit the proxy's inbound \r\nrouter with no inner service running.\r\n\r\nBefore this change:\r\n```\r\n➜ LINKERD2_PROXY_POD_NAMESPACE=foo LINKERD2_PROXY_POD_NAME=bar LINKERD2_PROXY_LOG=info,linkerd2_proxy=debug LINKERD2_PROXY_PRIVATE_FORWARD=tcp://127.0.0.1:8888 cargo run\r\n   Compiling linkerd2-proxy v0.1.0 (file:///Users/eliza/Code/linkerd2-proxy)\r\n    Finished dev [unoptimized + debuginfo] target(s) in 28.95s\r\n     Running `target/debug/linkerd2-proxy`\r\nDBUG linkerd2_proxy::task creating single-threaded proxy\r\nINFO linkerd2_proxy using controller at None\r\nINFO linkerd2_proxy routing on V4(127.0.0.1:4140)\r\nINFO linkerd2_proxy proxying on V4(0.0.0.0:4143) to Some(Addr(V4(127.0.0.1:8888)))\r\nINFO linkerd2_proxy serving Prometheus metrics on V4(127.0.0.1:4191)\r\nINFO linkerd2_proxy protocol detection disabled for inbound ports {25, 3306}\r\nINFO linkerd2_proxy protocol detection disabled for outbound ports {25, 3306}\r\nINFO linkerd2_proxy::telemetry::metrics procinfo not supported on this operating system\r\nDBUG proxy={server=in listen=0.0.0.0:4143} linkerd2_proxy::transport::addr_info no support for SO_ORIGINAL_DST\r\nDBUG proxy={server=in listen=0.0.0.0:4143} linkerd2_proxy::telemetry::sensor server connection open\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57416} linkerd2_proxy::inbound building inbound Http1 { host: Authority(localhost:4143), was_absolute_form: false } client to 127.0.0.1:8888\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57416} linkerd2_proxy::bind bind_stack: endpoint=Endpoint { address: V4(127.0.0.1:8888), metadata: Metadata { dst_labels: None, tls_identity: None(NotProvidedByServiceDiscovery) } }, protocol=Http1 { host: Authority(localhost:4143), was_absolute_form: false }\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57416} linkerd2_proxy::bind rebinding endpoint stack for Endpoint { address: V4(127.0.0.1:8888), metadata: Metadata { dst_labels: None, tls_identity: None(NotProvidedByServiceDiscovery) } }:Http1 { host: Authority(localhost:4143), was_absolute_form: false } on TLS config change\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57416} linkerd2_proxy::bind bind_inner_stack endpoint=Endpoint { address: V4(127.0.0.1:8888), metadata: Metadata { dst_labels: None, tls_identity: None(NotProvidedByServiceDiscovery) } }, protocol=Http1 { host: Authority(localhost:4143), was_absolute_form: false }\r\nDBUG proxy={client=in dst=local remote=127.0.0.1:8888} linkerd2_proxy::transparency::client client request: method=GET uri=http://localhost:4143/ headers={\"host\": \"localhost:4143\", \"user-agent\": \"HTTPie/0.9.9\", \"accept-encoding\": \"gzip, deflate\", \"accept\": \"*/*\"}\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57416} linkerd2_proxy::transparency::client http/1 client error: an error occurred trying to connect: other os error\r\nERR! proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57416} linkerd2_proxy turning Error caused by underlying HTTP/2 error: protocol error: unexpected internal error encountered into 500\r\n```\r\n\r\nAfter this change:\r\n```\r\n➜ LINKERD2_PROXY_POD_NAMESPACE=foo LINKERD2_PROXY_POD_NAME=bar LINKERD2_PROXY_LOG=info,linkerd2_proxy=debug LINKERD2_PROXY_PRIVATE_FORWARD=tcp://127.0.0.1:8888 cargo run\r\n    Finished dev [unoptimized + debuginfo] target(s) in 0.28s\r\n     Running `target/debug/linkerd2-proxy`\r\nDBUG linkerd2_proxy::task creating single-threaded proxy\r\nINFO linkerd2_proxy using controller at None\r\nINFO linkerd2_proxy routing on V4(127.0.0.1:4140)\r\nINFO linkerd2_proxy proxying on V4(0.0.0.0:4143) to Some(Addr(V4(127.0.0.1:8888)))\r\nINFO linkerd2_proxy serving Prometheus metrics on V4(127.0.0.1:4191)\r\nINFO linkerd2_proxy protocol detection disabled for inbound ports {25, 3306}\r\nINFO linkerd2_proxy protocol detection disabled for outbound ports {25, 3306}\r\nINFO linkerd2_proxy::telemetry::metrics procinfo not supported on this operating system\r\nDBUG proxy={server=in listen=0.0.0.0:4143} linkerd2_proxy::transport::addr_info no support for SO_ORIGINAL_DST\r\nDBUG proxy={server=in listen=0.0.0.0:4143} linkerd2_proxy::telemetry::sensor server connection open\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57406} linkerd2_proxy::inbound building inbound Http1 { host: Authority(localhost:4143), was_absolute_form: false } client to 127.0.0.1:8888\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57406} linkerd2_proxy::bind bind_stack: endpoint=Endpoint { address: V4(127.0.0.1:8888), metadata: Metadata { dst_labels: None, tls_identity: None(NotProvidedByServiceDiscovery) } }, protocol=Http1 { host: Authority(localhost:4143), was_absolute_form: false }\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57406} linkerd2_proxy::bind rebinding endpoint stack for Endpoint { address: V4(127.0.0.1:8888), metadata: Metadata { dst_labels: None, tls_identity: None(NotProvidedByServiceDiscovery) } }:Http1 { host: Authority(localhost:4143), was_absolute_form: false } on TLS config change\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57406} linkerd2_proxy::bind bind_inner_stack endpoint=Endpoint { address: V4(127.0.0.1:8888), metadata: Metadata { dst_labels: None, tls_identity: None(NotProvidedByServiceDiscovery) } }, protocol=Http1 { host: Authority(localhost:4143), was_absolute_form: false }\r\nDBUG proxy={client=in dst=local remote=127.0.0.1:8888} linkerd2_proxy::transparency::client client request: method=GET uri=http://localhost:4143/ headers={\"host\": \"localhost:4143\", \"user-agent\": \"HTTPie/0.9.9\", \"accept-encoding\": \"gzip, deflate\", \"accept\": \"*/*\"}\r\nDBUG proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57406} linkerd2_proxy::transparency::client http/1 client error: an error occurred trying to connect: Connection refused (os error 61); cause: Connection refused (os error 61);\r\nERR! proxy={server=in listen=0.0.0.0:4143 remote=127.0.0.1:57406} linkerd2_proxy turning an error occurred trying to connect: Connection refused (os error 61) into 500\r\n^X^CINFO linkerd2_proxy::signal received SIGINT, starting shutdown\r\nDBUG linkerd2_proxy shutdown signaled\r\nDBUG linkerd2_proxy shutdown complete\r\n```\r\n\r\nNote that after the changes in this branch, we actually output that the\r\nerror was caused by \"Connection refused (os error 61)\", rather than\r\nan \"unexpected internal error\", and the string \"HTTP/2\" is no longer\r\npresent in the log output for an HTTP/1 request.\r\n\r\n</details>\r\n","created_at":"2018-07-17T23:42:37Z","updated_at":"2018-07-19T23:00:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cc4490b60484d8598ec0d62c8ba0788cdb86ba36","assignee":{"login":"hawkw","id":2796466,"node_id":"MDQ6VXNlcjI3OTY0NjY=","avatar_url":"https://avatars1.githubusercontent.com/u/2796466?v=4","gravatar_id":"","url":"https://api.github.com/users/hawkw","html_url":"https://github.com/hawkw","followers_url":"https://api.github.com/users/hawkw/followers","following_url":"https://api.github.com/users/hawkw/following{/other_user}","gists_url":"https://api.github.com/users/hawkw/gists{/gist_id}","starred_url":"https://api.github.com/users/hawkw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hawkw/subscriptions","organizations_url":"https://api.github.com/users/hawkw/orgs","repos_url":"https://api.github.com/users/hawkw/repos","events_url":"https://api.github.com/users/hawkw/events{/privacy}","received_events_url":"https://api.github.com/users/hawkw/received_events","type":"User","site_admin":false},"assignees":[{"login":"hawkw","id":2796466,"node_id":"MDQ6VXNlcjI3OTY0NjY=","avatar_url":"https://avatars1.githubusercontent.com/u/2796466?v=4","gravatar_id":"","url":"https://api.github.com/users/hawkw","html_url":"https://github.com/hawkw","followers_url":"https://api.github.com/users/hawkw/followers","following_url":"https://api.github.com/users/hawkw/following{/other_user}","gists_url":"https://api.github.com/users/hawkw/gists{/gist_id}","starred_url":"https://api.github.com/users/hawkw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hawkw/subscriptions","organizations_url":"https://api.github.com/users/hawkw/orgs","repos_url":"https://api.github.com/users/hawkw/repos","events_url":"https://api.github.com/users/hawkw/events{/privacy}","received_events_url":"https://api.github.com/users/hawkw/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18/commits","review_comments_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18/comments","review_comment_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/18/comments","statuses_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/statuses/4f31829076d419c1af151fedc0e0450e4065c64a","head":{"label":"linkerd:eliza/nicer-errors","ref":"eliza/nicer-errors","sha":"4f31829076d419c1af151fedc0e0450e4065c64a","user":{"login":"linkerd","id":25301026,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1MzAxMDI2","avatar_url":"https://avatars3.githubusercontent.com/u/25301026?v=4","gravatar_id":"","url":"https://api.github.com/users/linkerd","html_url":"https://github.com/linkerd","followers_url":"https://api.github.com/users/linkerd/followers","following_url":"https://api.github.com/users/linkerd/following{/other_user}","gists_url":"https://api.github.com/users/linkerd/gists{/gist_id}","starred_url":"https://api.github.com/users/linkerd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkerd/subscriptions","organizations_url":"https://api.github.com/users/linkerd/orgs","repos_url":"https://api.github.com/users/linkerd/repos","events_url":"https://api.github.com/users/linkerd/events{/privacy}","received_events_url":"https://api.github.com/users/linkerd/received_events","type":"Organization","site_admin":false},"repo":{"id":140121383,"node_id":"MDEwOlJlcG9zaXRvcnkxNDAxMjEzODM=","name":"linkerd2-proxy","full_name":"linkerd/linkerd2-proxy","owner":{"login":"linkerd","id":25301026,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1MzAxMDI2","avatar_url":"https://avatars3.githubusercontent.com/u/25301026?v=4","gravatar_id":"","url":"https://api.github.com/users/linkerd","html_url":"https://github.com/linkerd","followers_url":"https://api.github.com/users/linkerd/followers","following_url":"https://api.github.com/users/linkerd/following{/other_user}","gists_url":"https://api.github.com/users/linkerd/gists{/gist_id}","starred_url":"https://api.github.com/users/linkerd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkerd/subscriptions","organizations_url":"https://api.github.com/users/linkerd/orgs","repos_url":"https://api.github.com/users/linkerd/repos","events_url":"https://api.github.com/users/linkerd/events{/privacy}","received_events_url":"https://api.github.com/users/linkerd/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/linkerd/linkerd2-proxy","description":"The Linkerd2 Proxy","fork":false,"url":"https://api.github.com/repos/linkerd/linkerd2-proxy","forks_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/forks","keys_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/teams","hooks_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/hooks","issue_events_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/events{/number}","events_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/events","assignees_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/assignees{/user}","branches_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/branches{/branch}","tags_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/tags","blobs_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/refs{/sha}","trees_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/statuses/{sha}","languages_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/languages","stargazers_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/stargazers","contributors_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/contributors","subscribers_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/subscribers","subscription_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/subscription","commits_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/commits{/sha}","git_commits_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/commits{/sha}","comments_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/comments{/number}","issue_comment_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/comments{/number}","contents_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/contents/{+path}","compare_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/merges","archive_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/downloads","issues_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues{/number}","pulls_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls{/number}","milestones_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/milestones{/number}","notifications_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/labels{/name}","releases_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/releases{/id}","deployments_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/deployments","created_at":"2018-07-07T22:40:57Z","updated_at":"2018-07-19T00:06:48Z","pushed_at":"2018-07-19T22:51:57Z","git_url":"git://github.com/linkerd/linkerd2-proxy.git","ssh_url":"git@github.com:linkerd/linkerd2-proxy.git","clone_url":"https://github.com/linkerd/linkerd2-proxy.git","svn_url":"https://github.com/linkerd/linkerd2-proxy","homepage":null,"size":1379,"stargazers_count":82,"watchers_count":82,"language":"Rust","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1,"open_issues":7,"watchers":82,"default_branch":"master"}},"base":{"label":"linkerd:master","ref":"master","sha":"f208acb3a5f7d6dd86e361ec0e5222a4a035f9ed","user":{"login":"linkerd","id":25301026,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1MzAxMDI2","avatar_url":"https://avatars3.githubusercontent.com/u/25301026?v=4","gravatar_id":"","url":"https://api.github.com/users/linkerd","html_url":"https://github.com/linkerd","followers_url":"https://api.github.com/users/linkerd/followers","following_url":"https://api.github.com/users/linkerd/following{/other_user}","gists_url":"https://api.github.com/users/linkerd/gists{/gist_id}","starred_url":"https://api.github.com/users/linkerd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkerd/subscriptions","organizations_url":"https://api.github.com/users/linkerd/orgs","repos_url":"https://api.github.com/users/linkerd/repos","events_url":"https://api.github.com/users/linkerd/events{/privacy}","received_events_url":"https://api.github.com/users/linkerd/received_events","type":"Organization","site_admin":false},"repo":{"id":140121383,"node_id":"MDEwOlJlcG9zaXRvcnkxNDAxMjEzODM=","name":"linkerd2-proxy","full_name":"linkerd/linkerd2-proxy","owner":{"login":"linkerd","id":25301026,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI1MzAxMDI2","avatar_url":"https://avatars3.githubusercontent.com/u/25301026?v=4","gravatar_id":"","url":"https://api.github.com/users/linkerd","html_url":"https://github.com/linkerd","followers_url":"https://api.github.com/users/linkerd/followers","following_url":"https://api.github.com/users/linkerd/following{/other_user}","gists_url":"https://api.github.com/users/linkerd/gists{/gist_id}","starred_url":"https://api.github.com/users/linkerd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkerd/subscriptions","organizations_url":"https://api.github.com/users/linkerd/orgs","repos_url":"https://api.github.com/users/linkerd/repos","events_url":"https://api.github.com/users/linkerd/events{/privacy}","received_events_url":"https://api.github.com/users/linkerd/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/linkerd/linkerd2-proxy","description":"The Linkerd2 Proxy","fork":false,"url":"https://api.github.com/repos/linkerd/linkerd2-proxy","forks_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/forks","keys_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/teams","hooks_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/hooks","issue_events_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/events{/number}","events_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/events","assignees_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/assignees{/user}","branches_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/branches{/branch}","tags_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/tags","blobs_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/refs{/sha}","trees_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/statuses/{sha}","languages_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/languages","stargazers_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/stargazers","contributors_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/contributors","subscribers_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/subscribers","subscription_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/subscription","commits_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/commits{/sha}","git_commits_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/git/commits{/sha}","comments_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/comments{/number}","issue_comment_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/comments{/number}","contents_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/contents/{+path}","compare_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/merges","archive_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/downloads","issues_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues{/number}","pulls_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls{/number}","milestones_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/milestones{/number}","notifications_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/labels{/name}","releases_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/releases{/id}","deployments_url":"https://api.github.com/repos/linkerd/linkerd2-proxy/deployments","created_at":"2018-07-07T22:40:57Z","updated_at":"2018-07-19T00:06:48Z","pushed_at":"2018-07-19T22:51:57Z","git_url":"git://github.com/linkerd/linkerd2-proxy.git","ssh_url":"git@github.com:linkerd/linkerd2-proxy.git","clone_url":"https://github.com/linkerd/linkerd2-proxy.git","svn_url":"https://github.com/linkerd/linkerd2-proxy","homepage":null,"size":1379,"stargazers_count":82,"watchers_count":82,"language":"Rust","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1,"open_issues":7,"watchers":82,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18"},"html":{"href":"https://github.com/linkerd/linkerd2-proxy/pull/18"},"issue":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/18"},"comments":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/issues/18/comments"},"review_comments":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18/comments"},"review_comment":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/pulls/18/commits"},"statuses":{"href":"https://api.github.com/repos/linkerd/linkerd2-proxy/statuses/4f31829076d419c1af151fedc0e0450e4065c64a"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"briansmith"}}