{"action":"created","comment":{"url":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/comments/193745799","pull_request_review_id":126779135,"id":193745799,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5Mzc0NTc5OQ==","diff_hunk":"@@ -0,0 +1,283 @@\n+/**\n+ * Copyright 2018, OpenCensus Authors\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+import {HttpPlugin} from '@opencensus/instrumentation-http';\n+import {types} from '@opencensus/opencensus-core';\n+import {classes} from '@opencensus/opencensus-core';\n+import {logger} from '@opencensus/opencensus-core';\n+import * as http from 'http';\n+import * as http2 from 'http2';\n+import * as net from 'net';\n+import * as shimmer from 'shimmer';\n+import * as tls from 'tls';\n+import * as url from 'url';\n+import * as uuid from 'uuid';\n+\n+export type Http2Module = typeof http2;\n+export type ConnectFunction = typeof http2.connect;\n+type RequestFunction =\n+    (this: http2.ClientHttp2Session, headers?: http2.OutgoingHttpHeaders,\n+     options?: http2.ClientSessionRequestOptions) => http2.ClientHttp2Stream;\n+export type CreateServerFunction = typeof http2.createServer;\n+\n+/** Http2 instrumentation plugin for Opencensus */\n+export class Http2Plugin extends HttpPlugin {\n+  server: http2.Http2Server|http2.Http2SecureServer;\n+  client: http2.ClientHttp2Session;\n+  clientUrl: url.UrlWithStringQuery;\n+  patchedCreateServer = false;\n+  patchedConnect = false;\n+\n+  /** Constructs a new Http2Plugin instance. */\n+  constructor() {\n+    super('http2');\n+  }\n+\n+  /**\n+   * Patches HTTP2 incoming and outcoming request functions.\n+   * @param moduleExporters The HTTP2 package.\n+   * @param tracer A tracer instance to create spans on.\n+   * @param version The package version.\n+   */\n+  // tslint:disable-next-line:no-any\n+  applyPatch(moduleExports: any, tracer: types.Tracer, version: string) {\n+    this.setPluginContext(moduleExports, tracer, version);\n+    this.logger = tracer.logger || logger.logger('debug');\n+\n+    shimmer.wrap(moduleExports, 'createServer', this.patchCreateServer());\n+    shimmer.wrap(moduleExports, 'createSecureServer', this.patchCreateServer());\n+\n+    shimmer.wrap(moduleExports, 'connect', this.patchConnect());\n+\n+    return moduleExports;\n+  }\n+\n+  /** Unpatches all HTTP2 patched function. */\n+  applyUnpatch(): void {\n+    if (this.patchedCreateServer) {\n+      shimmer.unwrap(plugin.server.constructor.prototype, 'emit');\n+    } else {\n+      shimmer.unwrap(plugin.moduleExports, 'createServer');\n+      shimmer.unwrap(plugin.moduleExports, 'createSecureServer');\n+    }\n+\n+    if (this.patchedConnect) {\n+      shimmer.unwrap(plugin.client, 'request');\n+    } else {\n+      shimmer.unwrap(plugin.moduleExports, 'connect');\n+    }\n+  }\n+\n+  patchConnect() {\n+    const plugin = this;\n+    return (original: ConnectFunction):\n+               types.Func<http2.ClientHttp2Session> => {\n+      return function patchedConnect(authority: string):\n+          http2.ClientHttp2Session {\n+            plugin.client = original.apply(this, arguments);\n+            shimmer.wrap(plugin.client, 'request', plugin.patchRequest());\n+\n+            shimmer.unwrap(plugin.moduleExports, 'connect');\n+            plugin.patchedConnect = true;\n+            plugin.clientUrl = url.parse(authority);\n+\n+            return plugin.client;\n+          };\n+    };\n+  }\n+\n+  patchRequest() {\n+    const plugin = this;\n+    return (original: RequestFunction): types.Func<http2.ClientHttp2Stream> => {\n+      return function patchedRequest(\n+                 headers: http2.IncomingHttpHeaders): http2.ClientHttp2Stream {\n+        // Do not trace ourselves\n+        if (headers['x-opencensus-outgoing-request']) {\n+          return original.apply(this, arguments);\n+        }\n+\n+        const request = original.apply(this, arguments);\n+        plugin.tracer.wrapEmitter(request);\n+\n+        const traceOptions = {\n+          name: `${headers[':method'] ? headers[':method'] : 'GET'} ${\n+              headers[':path']}`,\n+          type: 'CLIENT',\n+        };\n+\n+        // Checks if this outgoing request is part of an operation by checking\n+        // if there is a current root span, if so, we create a child span. In\n+        // case there is no root span, this means that the outgoing request is\n+        // the first operation, therefore we create a root span.\n+        if (!plugin.tracer.currentRootSpan) {\n+          return plugin.tracer.startRootSpan(\n+              traceOptions,\n+              plugin.makeHttp2RequestTrace(request, headers, plugin));\n+        } else {\n+          const span = plugin.tracer.startChildSpan(\n+              traceOptions.name, traceOptions.type);\n+          return (plugin.makeHttp2RequestTrace(request, headers, plugin))(span);\n+        }\n+      };\n+    };\n+  }\n+\n+  makeHttp2RequestTrace(\n+      request: http2.ClientHttp2Stream, headers: http2.IncomingHttpHeaders,\n+      plugin: Http2Plugin): types.Func<http2.ClientHttp2Stream> {\n+    return (span: types.Span): http2.ClientHttp2Stream => {\n+      if (!span) return request;\n+\n+      const setter = {\n+        setHeader(name: string, value: string) {\n+          headers[name] = value;\n+        }\n+      } as types.HeaderSetter;\n+\n+      const propagation = plugin.tracer.propagation;\n+      if (propagation) {\n+        propagation.inject(setter, span.spanContext);\n+      }\n+\n+      request.on('response', (responseHeaders: http2.IncomingHttpHeaders) => {\n+        span.addAttribute(\n+            Http2Plugin.ATTRIBUTE_HTTP_STATUS_CODE,\n+            `${responseHeaders[':status']}`);\n+        span.status = plugin.traceStatus(+responseHeaders[':status']);\n+      });\n+\n+      request.on('end', () => {\n+        const userAgent =\n+            (headers['user-agent'] || headers['User-Agent'] || null) as string;\n+\n+        span.addAttribute(\n+            Http2Plugin.ATTRIBUTE_HTTP_HOST, plugin.clientUrl.host);\n+        span.addAttribute(\n+            Http2Plugin.ATTRIBUTE_HTTP_METHOD, `${headers[':method']}`);\n+        span.addAttribute(\n+            Http2Plugin.ATTRIBUTE_HTTP_PATH, `${headers[':path']}`);\n+        span.addAttribute(\n+            Http2Plugin.ATTRIBUTE_HTTP_ROUTE, `${headers[':path']}`);\n+        span.addAttribute(Http2Plugin.ATTRIBUTE_HTTP_USER_AGENT, userAgent);\n+\n+        span.addMessageEvent(\n+            'MessageEventTypeSent', uuid.v4().split('-').join(''));\n+\n+        span.end();\n+      });\n+\n+      request.on('error', (err: Error) => {\n+        span.addAttribute(HttpPlugin.ATTRIBUTE_HTTP_ERROR_NAME, err.name);\n+        span.addAttribute(HttpPlugin.ATTRIBUTE_HTTP_ERROR_MESSAGE, err.message);\n+\n+        span.end();\n+      });\n+\n+      return request;\n+    };\n+  }\n+\n+  patchCreateServer() {\n+    const plugin = this;\n+    return (original: CreateServerFunction): types.Func<http2.Http2Server> => {\n+      return function patchedCreateServer(): http2.Http2Server {\n+        plugin.server = original.apply(this, arguments);\n+        shimmer.wrap(\n+            plugin.server.constructor.prototype, 'emit', plugin.patchEmit());\n+\n+        shimmer.unwrap(plugin.moduleExports, 'createServer');\n+        shimmer.unwrap(plugin.moduleExports, 'createSecureServer');\n+        plugin.patchedCreateServer = true;\n+\n+        return plugin.server;\n+      };\n+    };\n+  }\n+\n+  patchEmit() {\n+    const plugin = this;\n+    return (original: RequestFunction): types.Func<http2.ClientHttp2Stream> => {\n+      return function patchedEmit(\n+                 event: string, stream: http2.ServerHttp2Stream,\n+                 headers: http2.IncomingHttpHeaders): http2.ClientHttp2Stream {\n+        if (event !== 'stream') {\n+          return original.apply(this, arguments);\n+        }\n+\n+        const propagation = plugin.tracer.propagation;\n+        const getter = {\n+          getHeader(name: string) {\n+            return headers[name];\n+          }\n+        } as types.HeaderGetter;\n+\n+        const traceOptions = {\n+          name: headers[':path'],\n+          type: 'SERVER',\n+          spanContext: propagation ? propagation.extract(getter) : null\n+        } as types.TraceOptions;\n+\n+        let statusCode: number = null;\n+        const originalRespond = stream.respond;\n+        stream.respond = function(this: http2.Http2Stream) {\n+          stream.respond = originalRespond;\n+          statusCode = arguments[0][':status'];\n+          return stream.respond.apply(this, arguments);\n+        };\n+\n+        return plugin.tracer.startRootSpan(traceOptions, rootSpan => {\n+          if (!rootSpan) return original.apply(this, arguments);\n+\n+          plugin.tracer.wrapEmitter(stream);\n+\n+          const originalEnd = stream.end;\n+          stream.end = function(this: http2.Http2Stream) {","path":"packages/opencensus-instrumentation-http2/src/http2.ts","position":247,"original_position":247,"commit_id":"00c3935c6865ea87477e833bc96e7fdae1ffdd7a","original_commit_id":"00c3935c6865ea87477e833bc96e7fdae1ffdd7a","user":{"login":"eduardoemery","id":37382770,"node_id":"MDQ6VXNlcjM3MzgyNzcw","avatar_url":"https://avatars3.githubusercontent.com/u/37382770?v=4","gravatar_id":"","url":"https://api.github.com/users/eduardoemery","html_url":"https://github.com/eduardoemery","followers_url":"https://api.github.com/users/eduardoemery/followers","following_url":"https://api.github.com/users/eduardoemery/following{/other_user}","gists_url":"https://api.github.com/users/eduardoemery/gists{/gist_id}","starred_url":"https://api.github.com/users/eduardoemery/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eduardoemery/subscriptions","organizations_url":"https://api.github.com/users/eduardoemery/orgs","repos_url":"https://api.github.com/users/eduardoemery/repos","events_url":"https://api.github.com/users/eduardoemery/events{/privacy}","received_events_url":"https://api.github.com/users/eduardoemery/received_events","type":"User","site_admin":false},"body":"Unfortunately, server stream has no end event, it calls `stream.end()` when it's done responding. That's why we wrap it.\r\n\r\nErrors are catched by wraping the respond event that sends the status code.","created_at":"2018-06-07T13:28:27Z","updated_at":"2018-06-07T13:28:27Z","html_url":"https://github.com/census-instrumentation/opencensus-node/pull/24#discussion_r193745799","pull_request_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/comments/193745799"},"html":{"href":"https://github.com/census-instrumentation/opencensus-node/pull/24#discussion_r193745799"},"pull_request":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24"}},"in_reply_to_id":193481347},"pull_request":{"url":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24","id":192372554,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkyMzcyNTU0","html_url":"https://github.com/census-instrumentation/opencensus-node/pull/24","diff_url":"https://github.com/census-instrumentation/opencensus-node/pull/24.diff","patch_url":"https://github.com/census-instrumentation/opencensus-node/pull/24.patch","issue_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/issues/24","number":24,"state":"open","locked":false,"title":"feat: add package instrumentation-http2 to opencensus-node","user":{"login":"eduardoemery","id":37382770,"node_id":"MDQ6VXNlcjM3MzgyNzcw","avatar_url":"https://avatars3.githubusercontent.com/u/37382770?v=4","gravatar_id":"","url":"https://api.github.com/users/eduardoemery","html_url":"https://github.com/eduardoemery","followers_url":"https://api.github.com/users/eduardoemery/followers","following_url":"https://api.github.com/users/eduardoemery/following{/other_user}","gists_url":"https://api.github.com/users/eduardoemery/gists{/gist_id}","starred_url":"https://api.github.com/users/eduardoemery/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eduardoemery/subscriptions","organizations_url":"https://api.github.com/users/eduardoemery/orgs","repos_url":"https://api.github.com/users/eduardoemery/repos","events_url":"https://api.github.com/users/eduardoemery/events{/privacy}","received_events_url":"https://api.github.com/users/eduardoemery/received_events","type":"User","site_admin":false},"body":"This PR adds HTTP2 instrumentation package to opencensus-node. Unit tests are included.","created_at":"2018-06-04T11:05:23Z","updated_at":"2018-06-07T13:28:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b8697fcea9ecb96cf4a809d453090f3c100681d4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":925574611,"node_id":"MDU6TGFiZWw5MjU1NzQ2MTE=","url":"https://api.github.com/repos/census-instrumentation/opencensus-node/labels/cla:%20yes","name":"cla: yes","color":"14a839","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24/commits","review_comments_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24/comments","review_comment_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/comments{/number}","comments_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/issues/24/comments","statuses_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/statuses/00c3935c6865ea87477e833bc96e7fdae1ffdd7a","head":{"label":"CESARBR:pkg_http2","ref":"pkg_http2","sha":"00c3935c6865ea87477e833bc96e7fdae1ffdd7a","user":{"login":"CESARBR","id":7859691,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc4NTk2OTE=","avatar_url":"https://avatars2.githubusercontent.com/u/7859691?v=4","gravatar_id":"","url":"https://api.github.com/users/CESARBR","html_url":"https://github.com/CESARBR","followers_url":"https://api.github.com/users/CESARBR/followers","following_url":"https://api.github.com/users/CESARBR/following{/other_user}","gists_url":"https://api.github.com/users/CESARBR/gists{/gist_id}","starred_url":"https://api.github.com/users/CESARBR/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CESARBR/subscriptions","organizations_url":"https://api.github.com/users/CESARBR/orgs","repos_url":"https://api.github.com/users/CESARBR/repos","events_url":"https://api.github.com/users/CESARBR/events{/privacy}","received_events_url":"https://api.github.com/users/CESARBR/received_events","type":"Organization","site_admin":false},"repo":{"id":134257961,"node_id":"MDEwOlJlcG9zaXRvcnkxMzQyNTc5NjE=","name":"opencensus-node","full_name":"CESARBR/opencensus-node","owner":{"login":"CESARBR","id":7859691,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc4NTk2OTE=","avatar_url":"https://avatars2.githubusercontent.com/u/7859691?v=4","gravatar_id":"","url":"https://api.github.com/users/CESARBR","html_url":"https://github.com/CESARBR","followers_url":"https://api.github.com/users/CESARBR/followers","following_url":"https://api.github.com/users/CESARBR/following{/other_user}","gists_url":"https://api.github.com/users/CESARBR/gists{/gist_id}","starred_url":"https://api.github.com/users/CESARBR/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CESARBR/subscriptions","organizations_url":"https://api.github.com/users/CESARBR/orgs","repos_url":"https://api.github.com/users/CESARBR/repos","events_url":"https://api.github.com/users/CESARBR/events{/privacy}","received_events_url":"https://api.github.com/users/CESARBR/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CESARBR/opencensus-node","description":null,"fork":true,"url":"https://api.github.com/repos/CESARBR/opencensus-node","forks_url":"https://api.github.com/repos/CESARBR/opencensus-node/forks","keys_url":"https://api.github.com/repos/CESARBR/opencensus-node/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CESARBR/opencensus-node/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CESARBR/opencensus-node/teams","hooks_url":"https://api.github.com/repos/CESARBR/opencensus-node/hooks","issue_events_url":"https://api.github.com/repos/CESARBR/opencensus-node/issues/events{/number}","events_url":"https://api.github.com/repos/CESARBR/opencensus-node/events","assignees_url":"https://api.github.com/repos/CESARBR/opencensus-node/assignees{/user}","branches_url":"https://api.github.com/repos/CESARBR/opencensus-node/branches{/branch}","tags_url":"https://api.github.com/repos/CESARBR/opencensus-node/tags","blobs_url":"https://api.github.com/repos/CESARBR/opencensus-node/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CESARBR/opencensus-node/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CESARBR/opencensus-node/git/refs{/sha}","trees_url":"https://api.github.com/repos/CESARBR/opencensus-node/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CESARBR/opencensus-node/statuses/{sha}","languages_url":"https://api.github.com/repos/CESARBR/opencensus-node/languages","stargazers_url":"https://api.github.com/repos/CESARBR/opencensus-node/stargazers","contributors_url":"https://api.github.com/repos/CESARBR/opencensus-node/contributors","subscribers_url":"https://api.github.com/repos/CESARBR/opencensus-node/subscribers","subscription_url":"https://api.github.com/repos/CESARBR/opencensus-node/subscription","commits_url":"https://api.github.com/repos/CESARBR/opencensus-node/commits{/sha}","git_commits_url":"https://api.github.com/repos/CESARBR/opencensus-node/git/commits{/sha}","comments_url":"https://api.github.com/repos/CESARBR/opencensus-node/comments{/number}","issue_comment_url":"https://api.github.com/repos/CESARBR/opencensus-node/issues/comments{/number}","contents_url":"https://api.github.com/repos/CESARBR/opencensus-node/contents/{+path}","compare_url":"https://api.github.com/repos/CESARBR/opencensus-node/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CESARBR/opencensus-node/merges","archive_url":"https://api.github.com/repos/CESARBR/opencensus-node/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CESARBR/opencensus-node/downloads","issues_url":"https://api.github.com/repos/CESARBR/opencensus-node/issues{/number}","pulls_url":"https://api.github.com/repos/CESARBR/opencensus-node/pulls{/number}","milestones_url":"https://api.github.com/repos/CESARBR/opencensus-node/milestones{/number}","notifications_url":"https://api.github.com/repos/CESARBR/opencensus-node/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CESARBR/opencensus-node/labels{/name}","releases_url":"https://api.github.com/repos/CESARBR/opencensus-node/releases{/id}","deployments_url":"https://api.github.com/repos/CESARBR/opencensus-node/deployments","created_at":"2018-05-21T11:07:13Z","updated_at":"2018-06-05T19:13:28Z","pushed_at":"2018-06-06T21:19:51Z","git_url":"git://github.com/CESARBR/opencensus-node.git","ssh_url":"git@github.com:CESARBR/opencensus-node.git","clone_url":"https://github.com/CESARBR/opencensus-node.git","svn_url":"https://github.com/CESARBR/opencensus-node","homepage":null,"size":1029,"stargazers_count":2,"watchers_count":2,"language":"TypeScript","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","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"census-instrumentation:master","ref":"master","sha":"7df938bc69dfad26ed71e6dbc6b08c764ce24b89","user":{"login":"census-instrumentation","id":26944525,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2OTQ0NTI1","avatar_url":"https://avatars0.githubusercontent.com/u/26944525?v=4","gravatar_id":"","url":"https://api.github.com/users/census-instrumentation","html_url":"https://github.com/census-instrumentation","followers_url":"https://api.github.com/users/census-instrumentation/followers","following_url":"https://api.github.com/users/census-instrumentation/following{/other_user}","gists_url":"https://api.github.com/users/census-instrumentation/gists{/gist_id}","starred_url":"https://api.github.com/users/census-instrumentation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/census-instrumentation/subscriptions","organizations_url":"https://api.github.com/users/census-instrumentation/orgs","repos_url":"https://api.github.com/users/census-instrumentation/repos","events_url":"https://api.github.com/users/census-instrumentation/events{/privacy}","received_events_url":"https://api.github.com/users/census-instrumentation/received_events","type":"Organization","site_admin":false},"repo":{"id":109782875,"node_id":"MDEwOlJlcG9zaXRvcnkxMDk3ODI4NzU=","name":"opencensus-node","full_name":"census-instrumentation/opencensus-node","owner":{"login":"census-instrumentation","id":26944525,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI2OTQ0NTI1","avatar_url":"https://avatars0.githubusercontent.com/u/26944525?v=4","gravatar_id":"","url":"https://api.github.com/users/census-instrumentation","html_url":"https://github.com/census-instrumentation","followers_url":"https://api.github.com/users/census-instrumentation/followers","following_url":"https://api.github.com/users/census-instrumentation/following{/other_user}","gists_url":"https://api.github.com/users/census-instrumentation/gists{/gist_id}","starred_url":"https://api.github.com/users/census-instrumentation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/census-instrumentation/subscriptions","organizations_url":"https://api.github.com/users/census-instrumentation/orgs","repos_url":"https://api.github.com/users/census-instrumentation/repos","events_url":"https://api.github.com/users/census-instrumentation/events{/privacy}","received_events_url":"https://api.github.com/users/census-instrumentation/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/census-instrumentation/opencensus-node","description":null,"fork":false,"url":"https://api.github.com/repos/census-instrumentation/opencensus-node","forks_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/forks","keys_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/keys{/key_id}","collaborators_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/teams","hooks_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/hooks","issue_events_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/issues/events{/number}","events_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/events","assignees_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/assignees{/user}","branches_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/branches{/branch}","tags_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/tags","blobs_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/git/refs{/sha}","trees_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/git/trees{/sha}","statuses_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/statuses/{sha}","languages_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/languages","stargazers_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/stargazers","contributors_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/contributors","subscribers_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/subscribers","subscription_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/subscription","commits_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/commits{/sha}","git_commits_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/git/commits{/sha}","comments_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/comments{/number}","issue_comment_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/issues/comments{/number}","contents_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/contents/{+path}","compare_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/compare/{base}...{head}","merges_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/merges","archive_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/downloads","issues_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/issues{/number}","pulls_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls{/number}","milestones_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/milestones{/number}","notifications_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/labels{/name}","releases_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/releases{/id}","deployments_url":"https://api.github.com/repos/census-instrumentation/opencensus-node/deployments","created_at":"2017-11-07T03:35:31Z","updated_at":"2018-06-06T23:59:29Z","pushed_at":"2018-06-06T23:59:27Z","git_url":"git://github.com/census-instrumentation/opencensus-node.git","ssh_url":"git@github.com:census-instrumentation/opencensus-node.git","clone_url":"https://github.com/census-instrumentation/opencensus-node.git","svn_url":"https://github.com/census-instrumentation/opencensus-node","homepage":null,"size":836,"stargazers_count":34,"watchers_count":34,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":8,"mirror_url":null,"archived":false,"open_issues_count":8,"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":8,"open_issues":8,"watchers":34,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24"},"html":{"href":"https://github.com/census-instrumentation/opencensus-node/pull/24"},"issue":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/issues/24"},"comments":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/issues/24/comments"},"review_comments":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24/comments"},"review_comment":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/pulls/24/commits"},"statuses":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-node/statuses/00c3935c6865ea87477e833bc96e7fdae1ffdd7a"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"eduardoemery"}}