{"action":"created","comment":{"url":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/comments/172040646","pull_request_review_id":100998242,"id":172040646,"diff_hunk":"@@ -0,0 +1,273 @@\n+/*\n+ * Copyright 2017, 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+package io.opencensus.exporter.trace.jaeger;\n+\n+import static com.google.common.base.Preconditions.checkNotNull;\n+import static java.lang.String.format;\n+import static java.util.concurrent.TimeUnit.NANOSECONDS;\n+import static java.util.concurrent.TimeUnit.SECONDS;\n+\n+import com.google.common.collect.Lists;\n+import com.google.common.primitives.Ints;\n+import com.google.common.primitives.Longs;\n+import com.uber.jaeger.senders.HttpSender;\n+import com.uber.jaeger.thriftjava.Log;\n+import com.uber.jaeger.thriftjava.Process;\n+import com.uber.jaeger.thriftjava.Span;\n+import com.uber.jaeger.thriftjava.SpanRef;\n+import com.uber.jaeger.thriftjava.SpanRefType;\n+import com.uber.jaeger.thriftjava.Tag;\n+import com.uber.jaeger.thriftjava.TagType;\n+import io.opencensus.common.Function;\n+import io.opencensus.common.Timestamp;\n+import io.opencensus.trace.Annotation;\n+import io.opencensus.trace.AttributeValue;\n+import io.opencensus.trace.Link;\n+import io.opencensus.trace.SpanContext;\n+import io.opencensus.trace.SpanId;\n+import io.opencensus.trace.Status;\n+import io.opencensus.trace.TraceId;\n+import io.opencensus.trace.TraceOptions;\n+import io.opencensus.trace.Tracer;\n+import io.opencensus.trace.Tracing;\n+import io.opencensus.trace.export.SpanData;\n+import io.opencensus.trace.export.SpanExporter;\n+import java.util.Collection;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.logging.Level;\n+import java.util.logging.Logger;\n+import javax.annotation.Nullable;\n+import javax.annotation.concurrent.NotThreadSafe;\n+import org.apache.thrift.TException;\n+\n+@NotThreadSafe\n+final class JaegerExporterHandler extends SpanExporter.Handler {\n+  private static final Logger logger = Logger.getLogger(JaegerExporterHandler.class.getName());\n+  private static final Tracer tracer = Tracing.getTracer();\n+\n+  private static final Function<? super String, Tag> stringAttributeConverter =\n+      new Function<String, Tag>() {\n+        @Override\n+        public Tag apply(final String value) {\n+          final Tag tag = new Tag();\n+          tag.setVType(TagType.STRING);\n+          tag.setVStr(value);\n+          return tag;\n+        }\n+      };\n+\n+  private static final Function<? super Boolean, Tag> booleanAttributeConverter =\n+      new Function<Boolean, Tag>() {\n+        @Override\n+        public Tag apply(final Boolean value) {\n+          final Tag tag = new Tag();\n+          tag.setVType(TagType.BOOL);\n+          tag.setVBool(value);\n+          return tag;\n+        }\n+      };\n+\n+  private static final Function<? super Long, Tag> longAttributeConverter =\n+      new Function<Long, Tag>() {\n+        @Override\n+        public Tag apply(final Long value) {\n+          final Tag tag = new Tag();\n+          tag.setVType(TagType.LONG);\n+          tag.setVLong(value);\n+          return tag;\n+        }\n+      };\n+\n+  private static final Function<Object, Tag> defaultAttributeConverter =\n+      new Function<Object, Tag>() {\n+        @Override\n+        public Tag apply(final Object value) {\n+          final Tag tag = new Tag();\n+          tag.setVType(TagType.STRING);\n+          tag.setVStr(value.toString());\n+          return tag;\n+        }\n+      };\n+\n+  // Re-usable buffers to avoid too much memory allocation during conversions.\n+  // N.B.: these make instances of this class thread-unsafe, hence the above\n+  // @NotThreadSafe annotation.\n+  private final byte[] spanIdBuffer = new byte[SpanId.SIZE];\n+  private final byte[] traceIdBuffer = new byte[TraceId.SIZE];\n+  private final byte[] optionsBuffer = new byte[Integer.SIZE / Byte.SIZE];\n+\n+  private final HttpSender sender;\n+  private final Process process;\n+\n+  JaegerExporterHandler(final HttpSender sender, final Process process) {\n+    this.sender = checkNotNull(sender, \"Jaeger sender must NOT be null.\");\n+    this.process = checkNotNull(process, \"Process sending traces must NOT be null.\");\n+  }\n+\n+  @Override\n+  public void export(final Collection<SpanData> spanDataList) {\n+    final List<Span> spans = spanDataToJaegerThriftSpans(spanDataList);\n+    logger.log(Level.INFO, \"About to export \" + spans.size() + \" traces to Jaeger\");\n+    exportToJaeger(spans);\n+  }\n+\n+  private List<Span> spanDataToJaegerThriftSpans(final Collection<SpanData> spanDataList) {\n+    final List<Span> spans = Lists.newArrayListWithExpectedSize(spanDataList.size());\n+    for (final SpanData spanData : spanDataList) {\n+      spans.add(spanDataToJaegerThriftSpan(spanData));\n+    }\n+    return spans;\n+  }\n+\n+  private void exportToJaeger(final List<Span> spans) {\n+    try {\n+      sender.send(process, spans);\n+    } catch (TException e) {\n+      tracer\n+          .getCurrentSpan()\n+          .setStatus(\n+              Status.UNKNOWN.withDescription(\n+                  e.getMessage() == null ? e.getClass().getSimpleName() : e.getMessage()));\n+      throw new RuntimeException(e); // TODO: should we instead do drop metrics?\n+    }\n+  }\n+\n+  private Span spanDataToJaegerThriftSpan(final SpanData spanData) {\n+    final long startTimeInMicros = timestampToMicros(spanData.getStartTimestamp());\n+    final long endTimeInMicros = timestampToMicros(spanData.getEndTimestamp());\n+\n+    final SpanContext context = spanData.getContext();\n+    copyToBuffer(context.getTraceId());\n+\n+    return new com.uber.jaeger.thriftjava.Span(\n+            traceIdLow(),\n+            traceIdHigh(),\n+            spanIdToLong(context.getSpanId()),\n+            spanIdToLong(spanData.getParentSpanId()),\n+            spanData.getName(),\n+            optionsToFlags(context.getTraceOptions()),\n+            startTimeInMicros,\n+            endTimeInMicros - startTimeInMicros)\n+        .setReferences(linksToReferences(spanData.getLinks().getLinks()))\n+        .setTags(attributesToTags(spanData.getAttributes().getAttributeMap()))\n+        .setLogs(annotationEventsToLogs(spanData.getAnnotations().getEvents()));\n+  }\n+\n+  private void copyToBuffer(final TraceId traceId) {\n+    // Attempt to minimise allocations, since TraceId#getBytes currently creates a defensive copy:\n+    traceId.copyBytesTo(traceIdBuffer, 0);\n+  }\n+\n+  private long traceIdHigh() {\n+    return Longs.fromBytes(\n+        traceIdBuffer[0],\n+        traceIdBuffer[1],\n+        traceIdBuffer[2],\n+        traceIdBuffer[3],\n+        traceIdBuffer[4],\n+        traceIdBuffer[5],\n+        traceIdBuffer[6],\n+        traceIdBuffer[7]);\n+  }\n+\n+  private long traceIdLow() {\n+    return Longs.fromBytes(\n+        traceIdBuffer[8],\n+        traceIdBuffer[9],\n+        traceIdBuffer[10],\n+        traceIdBuffer[11],\n+        traceIdBuffer[12],\n+        traceIdBuffer[13],\n+        traceIdBuffer[14],\n+        traceIdBuffer[15]);\n+  }\n+\n+  private long spanIdToLong(final @Nullable SpanId traceId) {\n+    if (traceId == null) {\n+      return 0L;\n+    }\n+    // Attempt to minimise allocations, since SpanId#getBytes currently creates a defensive copy:\n+    traceId.copyBytesTo(spanIdBuffer, 0);\n+    return Longs.fromByteArray(spanIdBuffer);\n+  }\n+\n+  private int optionsToFlags(final TraceOptions traceOptions) {\n+    // Attempt to minimise allocations, since SpanId#getBytes currently creates a defensive copy:","path":"exporters/trace/jaeger/src/main/java/io/opencensus/exporter/trace/jaeger/JaegerExporterHandler.java","position":210,"original_position":210,"commit_id":"ca7cf91af78ab306db966eea4eccc1990047b3ec","original_commit_id":"ca7cf91af78ab306db966eea4eccc1990047b3ec","user":{"login":"marccarre","id":836014,"avatar_url":"https://avatars0.githubusercontent.com/u/836014?v=4","gravatar_id":"","url":"https://api.github.com/users/marccarre","html_url":"https://github.com/marccarre","followers_url":"https://api.github.com/users/marccarre/followers","following_url":"https://api.github.com/users/marccarre/following{/other_user}","gists_url":"https://api.github.com/users/marccarre/gists{/gist_id}","starred_url":"https://api.github.com/users/marccarre/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marccarre/subscriptions","organizations_url":"https://api.github.com/users/marccarre/orgs","repos_url":"https://api.github.com/users/marccarre/repos","events_url":"https://api.github.com/users/marccarre/events{/privacy}","received_events_url":"https://api.github.com/users/marccarre/received_events","type":"User","site_admin":false},"body":"Sorry, bad copy-pasting, consider it fixed!","created_at":"2018-03-04T08:18:21Z","updated_at":"2018-03-04T08:18:21Z","html_url":"https://github.com/census-instrumentation/opencensus-java/pull/1023#discussion_r172040646","pull_request_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/comments/172040646"},"html":{"href":"https://github.com/census-instrumentation/opencensus-java/pull/1023#discussion_r172040646"},"pull_request":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023"}},"in_reply_to_id":171709375},"pull_request":{"url":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023","id":171320239,"html_url":"https://github.com/census-instrumentation/opencensus-java/pull/1023","diff_url":"https://github.com/census-instrumentation/opencensus-java/pull/1023.diff","patch_url":"https://github.com/census-instrumentation/opencensus-java/pull/1023.patch","issue_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/issues/1023","number":1023,"state":"open","locked":false,"title":"WIP: Add traces exporter to Jaeger","user":{"login":"marccarre","id":836014,"avatar_url":"https://avatars0.githubusercontent.com/u/836014?v=4","gravatar_id":"","url":"https://api.github.com/users/marccarre","html_url":"https://github.com/marccarre","followers_url":"https://api.github.com/users/marccarre/followers","following_url":"https://api.github.com/users/marccarre/following{/other_user}","gists_url":"https://api.github.com/users/marccarre/gists{/gist_id}","starred_url":"https://api.github.com/users/marccarre/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marccarre/subscriptions","organizations_url":"https://api.github.com/users/marccarre/orgs","repos_url":"https://api.github.com/users/marccarre/repos","events_url":"https://api.github.com/users/marccarre/events{/privacy}","received_events_url":"https://api.github.com/users/marccarre/received_events","type":"User","site_admin":false},"body":"Fixes #1003.\r\n\r\n**Description**:\r\nThis is an attempt to add support for Jaeger, inspired from:\r\n\r\n- https://github.com/census-instrumentation/opencensus-go/blob/master/exporter/jaeger/jaeger.go\r\n- https://github.com/jaegertracing/jaeger-client-java/blob/master/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/JaegerThriftSpanConverter.java\r\n\r\n**Disclaimer**:\r\n\r\n- I'm new to both OpenCensus and Jaeger -- please be forgiving 🙂.\r\n- I'm still confirming everything works end-to-end.\r\n  I plan to share this soon, ideally in an automated/reproducible way.\r\n\r\n**The Ask**: \r\nGiven this PR is still WIP, and especially since I'm new to OpenCensus and Jaeger, I'm looking for early feedback, and ideally, some guidance.\r\n\r\n**Remaining tasks**:\r\n\r\n- [ ] Fix issues reported by CI.\r\n- [ ] Unit test(s) should verify all converted fields.\r\n- [ ] Unit test(s) should verify registration of the exporter.\r\n- [ ] Integration test(s) should prove that Jaeger properly receives exported traces.\r\n\r\n**Out of scope**:\r\n\r\n- Add support for UDP sender (currently only supports HTTP+Thrift via port `14268`).","created_at":"2018-02-26T09:27:09Z","updated_at":"2018-03-04T08:18:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fcf6cbb016155d7103d636610083fbf70ef6bda9","assignee":{"login":"adriancole","id":64215,"avatar_url":"https://avatars2.githubusercontent.com/u/64215?v=4","gravatar_id":"","url":"https://api.github.com/users/adriancole","html_url":"https://github.com/adriancole","followers_url":"https://api.github.com/users/adriancole/followers","following_url":"https://api.github.com/users/adriancole/following{/other_user}","gists_url":"https://api.github.com/users/adriancole/gists{/gist_id}","starred_url":"https://api.github.com/users/adriancole/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adriancole/subscriptions","organizations_url":"https://api.github.com/users/adriancole/orgs","repos_url":"https://api.github.com/users/adriancole/repos","events_url":"https://api.github.com/users/adriancole/events{/privacy}","received_events_url":"https://api.github.com/users/adriancole/received_events","type":"User","site_admin":false},"assignees":[{"login":"adriancole","id":64215,"avatar_url":"https://avatars2.githubusercontent.com/u/64215?v=4","gravatar_id":"","url":"https://api.github.com/users/adriancole","html_url":"https://github.com/adriancole","followers_url":"https://api.github.com/users/adriancole/followers","following_url":"https://api.github.com/users/adriancole/following{/other_user}","gists_url":"https://api.github.com/users/adriancole/gists{/gist_id}","starred_url":"https://api.github.com/users/adriancole/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adriancole/subscriptions","organizations_url":"https://api.github.com/users/adriancole/orgs","repos_url":"https://api.github.com/users/adriancole/repos","events_url":"https://api.github.com/users/adriancole/events{/privacy}","received_events_url":"https://api.github.com/users/adriancole/received_events","type":"User","site_admin":false},{"login":"bogdandrutu","id":1373887,"avatar_url":"https://avatars0.githubusercontent.com/u/1373887?v=4","gravatar_id":"","url":"https://api.github.com/users/bogdandrutu","html_url":"https://github.com/bogdandrutu","followers_url":"https://api.github.com/users/bogdandrutu/followers","following_url":"https://api.github.com/users/bogdandrutu/following{/other_user}","gists_url":"https://api.github.com/users/bogdandrutu/gists{/gist_id}","starred_url":"https://api.github.com/users/bogdandrutu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bogdandrutu/subscriptions","organizations_url":"https://api.github.com/users/bogdandrutu/orgs","repos_url":"https://api.github.com/users/bogdandrutu/repos","events_url":"https://api.github.com/users/bogdandrutu/events{/privacy}","received_events_url":"https://api.github.com/users/bogdandrutu/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"adriancole","id":64215,"avatar_url":"https://avatars2.githubusercontent.com/u/64215?v=4","gravatar_id":"","url":"https://api.github.com/users/adriancole","html_url":"https://github.com/adriancole","followers_url":"https://api.github.com/users/adriancole/followers","following_url":"https://api.github.com/users/adriancole/following{/other_user}","gists_url":"https://api.github.com/users/adriancole/gists{/gist_id}","starred_url":"https://api.github.com/users/adriancole/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adriancole/subscriptions","organizations_url":"https://api.github.com/users/adriancole/orgs","repos_url":"https://api.github.com/users/adriancole/repos","events_url":"https://api.github.com/users/adriancole/events{/privacy}","received_events_url":"https://api.github.com/users/adriancole/received_events","type":"User","site_admin":false},{"login":"bogdandrutu","id":1373887,"avatar_url":"https://avatars0.githubusercontent.com/u/1373887?v=4","gravatar_id":"","url":"https://api.github.com/users/bogdandrutu","html_url":"https://github.com/bogdandrutu","followers_url":"https://api.github.com/users/bogdandrutu/followers","following_url":"https://api.github.com/users/bogdandrutu/following{/other_user}","gists_url":"https://api.github.com/users/bogdandrutu/gists{/gist_id}","starred_url":"https://api.github.com/users/bogdandrutu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bogdandrutu/subscriptions","organizations_url":"https://api.github.com/users/bogdandrutu/orgs","repos_url":"https://api.github.com/users/bogdandrutu/repos","events_url":"https://api.github.com/users/bogdandrutu/events{/privacy}","received_events_url":"https://api.github.com/users/bogdandrutu/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":616301408,"url":"https://api.github.com/repos/census-instrumentation/opencensus-java/labels/cla:%20yes","name":"cla: yes","color":"0e8a16","default":false},{"id":678369455,"url":"https://api.github.com/repos/census-instrumentation/opencensus-java/labels/exporters","name":"exporters","color":"c2e0c6","default":false},{"id":566180166,"url":"https://api.github.com/repos/census-instrumentation/opencensus-java/labels/tracing","name":"tracing","color":"006b75","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023/commits","review_comments_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023/comments","review_comment_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/comments{/number}","comments_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/issues/1023/comments","statuses_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/statuses/ca7cf91af78ab306db966eea4eccc1990047b3ec","head":{"label":"marccarre:issues/1003-jaeger-trace-exporter","ref":"issues/1003-jaeger-trace-exporter","sha":"ca7cf91af78ab306db966eea4eccc1990047b3ec","user":{"login":"marccarre","id":836014,"avatar_url":"https://avatars0.githubusercontent.com/u/836014?v=4","gravatar_id":"","url":"https://api.github.com/users/marccarre","html_url":"https://github.com/marccarre","followers_url":"https://api.github.com/users/marccarre/followers","following_url":"https://api.github.com/users/marccarre/following{/other_user}","gists_url":"https://api.github.com/users/marccarre/gists{/gist_id}","starred_url":"https://api.github.com/users/marccarre/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marccarre/subscriptions","organizations_url":"https://api.github.com/users/marccarre/orgs","repos_url":"https://api.github.com/users/marccarre/repos","events_url":"https://api.github.com/users/marccarre/events{/privacy}","received_events_url":"https://api.github.com/users/marccarre/received_events","type":"User","site_admin":false},"repo":{"id":122864300,"name":"opencensus-java","full_name":"marccarre/opencensus-java","owner":{"login":"marccarre","id":836014,"avatar_url":"https://avatars0.githubusercontent.com/u/836014?v=4","gravatar_id":"","url":"https://api.github.com/users/marccarre","html_url":"https://github.com/marccarre","followers_url":"https://api.github.com/users/marccarre/followers","following_url":"https://api.github.com/users/marccarre/following{/other_user}","gists_url":"https://api.github.com/users/marccarre/gists{/gist_id}","starred_url":"https://api.github.com/users/marccarre/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marccarre/subscriptions","organizations_url":"https://api.github.com/users/marccarre/orgs","repos_url":"https://api.github.com/users/marccarre/repos","events_url":"https://api.github.com/users/marccarre/events{/privacy}","received_events_url":"https://api.github.com/users/marccarre/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/marccarre/opencensus-java","description":"A stats collection and distributed tracing framework","fork":true,"url":"https://api.github.com/repos/marccarre/opencensus-java","forks_url":"https://api.github.com/repos/marccarre/opencensus-java/forks","keys_url":"https://api.github.com/repos/marccarre/opencensus-java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/marccarre/opencensus-java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/marccarre/opencensus-java/teams","hooks_url":"https://api.github.com/repos/marccarre/opencensus-java/hooks","issue_events_url":"https://api.github.com/repos/marccarre/opencensus-java/issues/events{/number}","events_url":"https://api.github.com/repos/marccarre/opencensus-java/events","assignees_url":"https://api.github.com/repos/marccarre/opencensus-java/assignees{/user}","branches_url":"https://api.github.com/repos/marccarre/opencensus-java/branches{/branch}","tags_url":"https://api.github.com/repos/marccarre/opencensus-java/tags","blobs_url":"https://api.github.com/repos/marccarre/opencensus-java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/marccarre/opencensus-java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/marccarre/opencensus-java/git/refs{/sha}","trees_url":"https://api.github.com/repos/marccarre/opencensus-java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/marccarre/opencensus-java/statuses/{sha}","languages_url":"https://api.github.com/repos/marccarre/opencensus-java/languages","stargazers_url":"https://api.github.com/repos/marccarre/opencensus-java/stargazers","contributors_url":"https://api.github.com/repos/marccarre/opencensus-java/contributors","subscribers_url":"https://api.github.com/repos/marccarre/opencensus-java/subscribers","subscription_url":"https://api.github.com/repos/marccarre/opencensus-java/subscription","commits_url":"https://api.github.com/repos/marccarre/opencensus-java/commits{/sha}","git_commits_url":"https://api.github.com/repos/marccarre/opencensus-java/git/commits{/sha}","comments_url":"https://api.github.com/repos/marccarre/opencensus-java/comments{/number}","issue_comment_url":"https://api.github.com/repos/marccarre/opencensus-java/issues/comments{/number}","contents_url":"https://api.github.com/repos/marccarre/opencensus-java/contents/{+path}","compare_url":"https://api.github.com/repos/marccarre/opencensus-java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/marccarre/opencensus-java/merges","archive_url":"https://api.github.com/repos/marccarre/opencensus-java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/marccarre/opencensus-java/downloads","issues_url":"https://api.github.com/repos/marccarre/opencensus-java/issues{/number}","pulls_url":"https://api.github.com/repos/marccarre/opencensus-java/pulls{/number}","milestones_url":"https://api.github.com/repos/marccarre/opencensus-java/milestones{/number}","notifications_url":"https://api.github.com/repos/marccarre/opencensus-java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/marccarre/opencensus-java/labels{/name}","releases_url":"https://api.github.com/repos/marccarre/opencensus-java/releases{/id}","deployments_url":"https://api.github.com/repos/marccarre/opencensus-java/deployments","created_at":"2018-02-25T18:37:19Z","updated_at":"2018-02-25T18:37:21Z","pushed_at":"2018-02-27T07:16:38Z","git_url":"git://github.com/marccarre/opencensus-java.git","ssh_url":"git@github.com:marccarre/opencensus-java.git","clone_url":"https://github.com/marccarre/opencensus-java.git","svn_url":"https://github.com/marccarre/opencensus-java","homepage":"","size":3414,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":false,"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":0,"default_branch":"master"}},"base":{"label":"census-instrumentation:master","ref":"master","sha":"23756c1f95752b1ff8b20c471b81a1a2a699a419","user":{"login":"census-instrumentation","id":26944525,"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":64431348,"name":"opencensus-java","full_name":"census-instrumentation/opencensus-java","owner":{"login":"census-instrumentation","id":26944525,"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-java","description":"A stats collection and distributed tracing framework","fork":false,"url":"https://api.github.com/repos/census-instrumentation/opencensus-java","forks_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/forks","keys_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/teams","hooks_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/hooks","issue_events_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/issues/events{/number}","events_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/events","assignees_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/assignees{/user}","branches_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/branches{/branch}","tags_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/tags","blobs_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/git/refs{/sha}","trees_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/statuses/{sha}","languages_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/languages","stargazers_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/stargazers","contributors_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/contributors","subscribers_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/subscribers","subscription_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/subscription","commits_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/commits{/sha}","git_commits_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/git/commits{/sha}","comments_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/comments{/number}","issue_comment_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/issues/comments{/number}","contents_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/contents/{+path}","compare_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/merges","archive_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/downloads","issues_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/issues{/number}","pulls_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls{/number}","milestones_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/milestones{/number}","notifications_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/labels{/name}","releases_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/releases{/id}","deployments_url":"https://api.github.com/repos/census-instrumentation/opencensus-java/deployments","created_at":"2016-07-28T22:10:03Z","updated_at":"2018-03-03T02:03:08Z","pushed_at":"2018-03-04T01:58:20Z","git_url":"git://github.com/census-instrumentation/opencensus-java.git","ssh_url":"git@github.com:census-instrumentation/opencensus-java.git","clone_url":"https://github.com/census-instrumentation/opencensus-java.git","svn_url":"https://github.com/census-instrumentation/opencensus-java","homepage":"","size":3436,"stargazers_count":309,"watchers_count":309,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":70,"mirror_url":null,"archived":false,"open_issues_count":56,"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":70,"open_issues":56,"watchers":309,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023"},"html":{"href":"https://github.com/census-instrumentation/opencensus-java/pull/1023"},"issue":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/issues/1023"},"comments":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/issues/1023/comments"},"review_comments":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023/comments"},"review_comment":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/pulls/1023/commits"},"statuses":{"href":"https://api.github.com/repos/census-instrumentation/opencensus-java/statuses/ca7cf91af78ab306db966eea4eccc1990047b3ec"}},"author_association":"NONE"}}
{"actor":{"display_login":"marccarre"}}