{"action":"created","comment":{"url":"https://api.github.com/repos/stripe/veneur/pulls/comments/236752671","pull_request_review_id":178885234,"id":236752671,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNjc1MjY3MQ==","diff_hunk":"@@ -0,0 +1,164 @@\n+// Package trace provies an API for initiating and reporting SSF\n+// traces and attaching spans to them. Veneur's tracing API also\n+// provides an experimental opentracing compatibility layer.\n+//\n+// The Veneur tracing API is completely independent of the opentracing\n+// compatibility layer, with the exception of the function\n+// StartSpanFromContext.\n+//\n+// Setup and Structure of the API\n+//\n+// To use the API, user code must set its service name via the global\n+// variable Service, which is used by trace visualization tools to\n+// tell apart the spans reported by different services. Code using the\n+// trace API must set its Service, and set it only once, in main():\n+//\n+//    trace.Service = \"my-awesome-service\"\n+//\n+// The trace API is built on three abstractions: the\n+// Client, the ClientBackend and the Span.\n+//\n+// Context\n+//\n+// Since it is very common for networked code to use context.Context,\n+// veneur's trace API is designed to be used together with\n+// Contexts. The API uses Contexts to store the current Span, and will\n+// automatically pick the appropriate parent span from the Context.\n+//\n+// To effectively use the trace API, user code needs to ensure that\n+// all functions that communicate externally (which includes using\n+// traces) take Contexts as parameters, and pass them down.\n+//\n+// See https://blog.golang.org/context for an introduction to using\n+// Context.\n+//\n+// Spans\n+//\n+// Spans represent the duration of a \"unit of work\" in a system: They\n+// have a start and an end time, a name, and additional data that can\n+// help identify what the work was. Example units of work could be the\n+// handling of an HTTP request, or a database read. For convenience,\n+// it is usually easiest to have a span represent a single function to\n+// delineate the start and end, which makes it easy to create the Span\n+// and report it via a defer statement.\n+//\n+// To create a new Span, use StartSpanFromContext. This function will\n+// create a trace parented to the traces that came before it in the\n+// Context. Typically, users should pass \"\" as the name to let\n+// StartSpanFromContext figure out the correct name from caller\n+// information.\n+//\n+//   span, ctx := trace.StartSpanFromContext(ctx, \"\")\n+//   // report the span with the default client when this function returns:\n+//   defer span.Finish()\n+//   ... // do work here\n+//\n+// Reporting Spans via the trace Client\n+//\n+// Once constructed, SSF Spans must be reported to a system that\n+// processes them. To do that, package trace exports a trace\n+// Client. Typical applications will want to use the DefaultClient\n+// exposed by this package. By default, it is set up to send spans to\n+// veneur listening on the default SSF UDP port, 8128. An application\n+// can use SetDefaultClient to change the default client in its main\n+// function.\n+//\n+// To allow testing user code's Span reporting behavior, it is\n+// desirable to take a Client argument in tested functions and report\n+// spans to that client explicitly:\n+//\n+//   span, ctx := trace.StartSpanFromContext(ctx, \"\")\n+//   defer span.ClientFinish(trace.DefaultClient)\n+//\n+// In case it is desired to submit no Spans at all, nil is a supported\n+// trace Client value.\n+//\n+// Client Backends\n+//\n+// The trace Client can use various transports to send (and possibly\n+// serialize) spans somewhere. Package trace exports some networked\n+// backends (using UDP and UNIX domain sockets), and allows users to\n+// define their own ClientBackends, which is useful in tests. See the\n+// interface's documentation for details.\n+//\n+// Additional information on Spans\n+//\n+// There are several additional things that can be put on a Span: the\n+// most common ones are Errors, Tags and Samples. Spans can also be\n+// indicators. The following sections will talk about these in detail.\n+//\n+// Error handling\n+//\n+// Call span.Error with the error that caused a Span to\n+// fail. Different programs have different requirements for when a\n+// Span should be considered to have \"failed\". A typical rule of thumb\n+// is that if you have a traced function that returns an error and it\n+// would return an error, that function should also use\n+// span.Error. This way, anyone who views a trace visualization will\n+// be able to tell that an error happened there. To report an error,\n+// use the following:\n+//\n+//   if err != nil {\n+//           span.Error(err)\n+//           return err\n+//   }\n+//\n+// Tags\n+//\n+// Spans can hold a map of name-value pairs (both strings) on their\n+// Tags field. These will be reported to trace visualization tools as\n+// indexed tags, so it should be possible to search for spans with the\n+// relevant information.\n+//\n+// Note: a Span object, when created, will have a nil Tags map to\n+// reduce the number of unnecessary allocations. To add Tags to a\n+// Span, it is recommended to initialize the Tags object with a\n+// constructed map like so:\n+//\n+//   span.Tags = map[string]string{\n+//           \"user_id\": userID,\n+//           \"action\": \"booped\",\n+//   }\n+//\n+// Samples\n+//\n+// Veneur's trace API supports attaching SSF Samples to Spans. These\n+// can be metrics, service checks or events. Veneur will extract them\n+// from the span and report them to any configured metrics provider.\n+//\n+// In the future, veneur may add information that allows linking the\n+// extracted metrics to the spans on which they were reported.\n+//\n+// See the ssf package and the trace/metrics package for details on\n+// using Samples effectively.\n+//\n+// Indicator Spans\n+//\n+// Typically, a traced service has some units of work that indicate\n+// how well a service is working. For example, a hypothetical\n+// HTTP-based payments API might have a charge endpoint. The time that\n+// an API call takes on that endpoint and its successes or failures\n+// can be used to extract service-level indicators (SLI) for latency,\n+// throughput and error rates.\n+//\n+// Concretely, the veneur server privileges these Indicator Spans by","path":"trace/doc.go","position":144,"original_position":144,"commit_id":"d97dba37e949404e30122ffa88a13ef2728e4f4b","original_commit_id":"d97dba37e949404e30122ffa88a13ef2728e4f4b","user":{"login":"ChimeraCoder","id":376414,"node_id":"MDQ6VXNlcjM3NjQxNA==","avatar_url":"https://avatars0.githubusercontent.com/u/376414?v=4","gravatar_id":"","url":"https://api.github.com/users/ChimeraCoder","html_url":"https://github.com/ChimeraCoder","followers_url":"https://api.github.com/users/ChimeraCoder/followers","following_url":"https://api.github.com/users/ChimeraCoder/following{/other_user}","gists_url":"https://api.github.com/users/ChimeraCoder/gists{/gist_id}","starred_url":"https://api.github.com/users/ChimeraCoder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ChimeraCoder/subscriptions","organizations_url":"https://api.github.com/users/ChimeraCoder/orgs","repos_url":"https://api.github.com/users/ChimeraCoder/repos","events_url":"https://api.github.com/users/ChimeraCoder/events{/privacy}","received_events_url":"https://api.github.com/users/ChimeraCoder/received_events","type":"User","site_admin":false},"body":"`veneur` should be capitalized here too.\r\n\r\nThis is the first time I've seen or used \"Indicator Span\" capitalized, which is interesting. I like the idea of thinking of it as a first-class concept. That probably means we should be consistent about it moving forwards.","created_at":"2018-11-27T16:49:38Z","updated_at":"2018-11-27T16:55:38Z","html_url":"https://github.com/stripe/veneur/pull/581#discussion_r236752671","pull_request_url":"https://api.github.com/repos/stripe/veneur/pulls/581","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/stripe/veneur/pulls/comments/236752671"},"html":{"href":"https://github.com/stripe/veneur/pull/581#discussion_r236752671"},"pull_request":{"href":"https://api.github.com/repos/stripe/veneur/pulls/581"}}},"pull_request":{"url":"https://api.github.com/repos/stripe/veneur/pulls/581","id":232684981,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMyNjg0OTgx","html_url":"https://github.com/stripe/veneur/pull/581","diff_url":"https://github.com/stripe/veneur/pull/581.diff","patch_url":"https://github.com/stripe/veneur/pull/581.patch","issue_url":"https://api.github.com/repos/stripe/veneur/issues/581","number":581,"state":"open","locked":false,"title":"Document trace API","user":{"login":"asf-stripe","id":23062936,"node_id":"MDQ6VXNlcjIzMDYyOTM2","avatar_url":"https://avatars0.githubusercontent.com/u/23062936?v=4","gravatar_id":"","url":"https://api.github.com/users/asf-stripe","html_url":"https://github.com/asf-stripe","followers_url":"https://api.github.com/users/asf-stripe/followers","following_url":"https://api.github.com/users/asf-stripe/following{/other_user}","gists_url":"https://api.github.com/users/asf-stripe/gists{/gist_id}","starred_url":"https://api.github.com/users/asf-stripe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asf-stripe/subscriptions","organizations_url":"https://api.github.com/users/asf-stripe/orgs","repos_url":"https://api.github.com/users/asf-stripe/repos","events_url":"https://api.github.com/users/asf-stripe/events{/privacy}","received_events_url":"https://api.github.com/users/asf-stripe/received_events","type":"User","site_admin":false},"body":"<!-- Checklist For PRs\r\n\r\n* Ensure you've written tests where applicable\r\n* Add a CHANGELOG.md entry describing your change, thank yourself!\r\n* Document any changes to metrics or configuration\r\n-->\r\n\r\n#### Summary\r\nThis PR is an attempt to clean up most of my biggest frustrations with the trace API so far: Lack of documentation & clear examples on how to use it.\r\n\r\nI wrote up a few sections of godoc on how to use this in a real service, made some tested example code that should clear up some of the confusion from real users.\r\n\r\n#### Motivation\r\n\r\nUser asks from all over; my own confusion about which function to use to start a span.\r\n\r\n#### Test plan\r\n\r\nWrote tests & examples!\r\n\r\n#### Rollout/monitoring/revert plan\r\n\r\nJust merge, it's only docs & tests.\r\n\r\nR, @ChimeraCoder?\r\nCc @aubrey-stripe @clin-stripe - I'd love to know if this makes the package any more useful!","created_at":"2018-11-21T14:33:08Z","updated_at":"2018-11-27T16:55:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ee2fb5adf3fa6dfeb2a1c520e7183badf2317f3a","assignee":{"login":"asf-stripe","id":23062936,"node_id":"MDQ6VXNlcjIzMDYyOTM2","avatar_url":"https://avatars0.githubusercontent.com/u/23062936?v=4","gravatar_id":"","url":"https://api.github.com/users/asf-stripe","html_url":"https://github.com/asf-stripe","followers_url":"https://api.github.com/users/asf-stripe/followers","following_url":"https://api.github.com/users/asf-stripe/following{/other_user}","gists_url":"https://api.github.com/users/asf-stripe/gists{/gist_id}","starred_url":"https://api.github.com/users/asf-stripe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asf-stripe/subscriptions","organizations_url":"https://api.github.com/users/asf-stripe/orgs","repos_url":"https://api.github.com/users/asf-stripe/repos","events_url":"https://api.github.com/users/asf-stripe/events{/privacy}","received_events_url":"https://api.github.com/users/asf-stripe/received_events","type":"User","site_admin":false},"assignees":[{"login":"asf-stripe","id":23062936,"node_id":"MDQ6VXNlcjIzMDYyOTM2","avatar_url":"https://avatars0.githubusercontent.com/u/23062936?v=4","gravatar_id":"","url":"https://api.github.com/users/asf-stripe","html_url":"https://github.com/asf-stripe","followers_url":"https://api.github.com/users/asf-stripe/followers","following_url":"https://api.github.com/users/asf-stripe/following{/other_user}","gists_url":"https://api.github.com/users/asf-stripe/gists{/gist_id}","starred_url":"https://api.github.com/users/asf-stripe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asf-stripe/subscriptions","organizations_url":"https://api.github.com/users/asf-stripe/orgs","repos_url":"https://api.github.com/users/asf-stripe/repos","events_url":"https://api.github.com/users/asf-stripe/events{/privacy}","received_events_url":"https://api.github.com/users/asf-stripe/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/stripe/veneur/pulls/581/commits","review_comments_url":"https://api.github.com/repos/stripe/veneur/pulls/581/comments","review_comment_url":"https://api.github.com/repos/stripe/veneur/pulls/comments{/number}","comments_url":"https://api.github.com/repos/stripe/veneur/issues/581/comments","statuses_url":"https://api.github.com/repos/stripe/veneur/statuses/d97dba37e949404e30122ffa88a13ef2728e4f4b","head":{"label":"stripe:asf-document-trace-pkg","ref":"asf-document-trace-pkg","sha":"d97dba37e949404e30122ffa88a13ef2728e4f4b","user":{"login":"stripe","id":856813,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NjgxMw==","avatar_url":"https://avatars1.githubusercontent.com/u/856813?v=4","gravatar_id":"","url":"https://api.github.com/users/stripe","html_url":"https://github.com/stripe","followers_url":"https://api.github.com/users/stripe/followers","following_url":"https://api.github.com/users/stripe/following{/other_user}","gists_url":"https://api.github.com/users/stripe/gists{/gist_id}","starred_url":"https://api.github.com/users/stripe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stripe/subscriptions","organizations_url":"https://api.github.com/users/stripe/orgs","repos_url":"https://api.github.com/users/stripe/repos","events_url":"https://api.github.com/users/stripe/events{/privacy}","received_events_url":"https://api.github.com/users/stripe/received_events","type":"Organization","site_admin":false},"repo":{"id":55277533,"node_id":"MDEwOlJlcG9zaXRvcnk1NTI3NzUzMw==","name":"veneur","full_name":"stripe/veneur","private":false,"owner":{"login":"stripe","id":856813,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NjgxMw==","avatar_url":"https://avatars1.githubusercontent.com/u/856813?v=4","gravatar_id":"","url":"https://api.github.com/users/stripe","html_url":"https://github.com/stripe","followers_url":"https://api.github.com/users/stripe/followers","following_url":"https://api.github.com/users/stripe/following{/other_user}","gists_url":"https://api.github.com/users/stripe/gists{/gist_id}","starred_url":"https://api.github.com/users/stripe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stripe/subscriptions","organizations_url":"https://api.github.com/users/stripe/orgs","repos_url":"https://api.github.com/users/stripe/repos","events_url":"https://api.github.com/users/stripe/events{/privacy}","received_events_url":"https://api.github.com/users/stripe/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/stripe/veneur","description":"A distributed, fault-tolerant pipeline for observability data","fork":false,"url":"https://api.github.com/repos/stripe/veneur","forks_url":"https://api.github.com/repos/stripe/veneur/forks","keys_url":"https://api.github.com/repos/stripe/veneur/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stripe/veneur/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stripe/veneur/teams","hooks_url":"https://api.github.com/repos/stripe/veneur/hooks","issue_events_url":"https://api.github.com/repos/stripe/veneur/issues/events{/number}","events_url":"https://api.github.com/repos/stripe/veneur/events","assignees_url":"https://api.github.com/repos/stripe/veneur/assignees{/user}","branches_url":"https://api.github.com/repos/stripe/veneur/branches{/branch}","tags_url":"https://api.github.com/repos/stripe/veneur/tags","blobs_url":"https://api.github.com/repos/stripe/veneur/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stripe/veneur/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stripe/veneur/git/refs{/sha}","trees_url":"https://api.github.com/repos/stripe/veneur/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stripe/veneur/statuses/{sha}","languages_url":"https://api.github.com/repos/stripe/veneur/languages","stargazers_url":"https://api.github.com/repos/stripe/veneur/stargazers","contributors_url":"https://api.github.com/repos/stripe/veneur/contributors","subscribers_url":"https://api.github.com/repos/stripe/veneur/subscribers","subscription_url":"https://api.github.com/repos/stripe/veneur/subscription","commits_url":"https://api.github.com/repos/stripe/veneur/commits{/sha}","git_commits_url":"https://api.github.com/repos/stripe/veneur/git/commits{/sha}","comments_url":"https://api.github.com/repos/stripe/veneur/comments{/number}","issue_comment_url":"https://api.github.com/repos/stripe/veneur/issues/comments{/number}","contents_url":"https://api.github.com/repos/stripe/veneur/contents/{+path}","compare_url":"https://api.github.com/repos/stripe/veneur/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stripe/veneur/merges","archive_url":"https://api.github.com/repos/stripe/veneur/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stripe/veneur/downloads","issues_url":"https://api.github.com/repos/stripe/veneur/issues{/number}","pulls_url":"https://api.github.com/repos/stripe/veneur/pulls{/number}","milestones_url":"https://api.github.com/repos/stripe/veneur/milestones{/number}","notifications_url":"https://api.github.com/repos/stripe/veneur/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stripe/veneur/labels{/name}","releases_url":"https://api.github.com/repos/stripe/veneur/releases{/id}","deployments_url":"https://api.github.com/repos/stripe/veneur/deployments","created_at":"2016-04-02T04:24:34Z","updated_at":"2018-11-27T16:50:57Z","pushed_at":"2018-11-27T15:01:12Z","git_url":"git://github.com/stripe/veneur.git","ssh_url":"git@github.com:stripe/veneur.git","clone_url":"https://github.com/stripe/veneur.git","svn_url":"https://github.com/stripe/veneur","homepage":"https://veneur.org","size":53959,"stargazers_count":1158,"watchers_count":1158,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":87,"mirror_url":null,"archived":false,"open_issues_count":29,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":87,"open_issues":29,"watchers":1158,"default_branch":"master"}},"base":{"label":"stripe:master","ref":"master","sha":"cdcfb315b61057a0ee5c8bb3fd3b3bca0a69059b","user":{"login":"stripe","id":856813,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NjgxMw==","avatar_url":"https://avatars1.githubusercontent.com/u/856813?v=4","gravatar_id":"","url":"https://api.github.com/users/stripe","html_url":"https://github.com/stripe","followers_url":"https://api.github.com/users/stripe/followers","following_url":"https://api.github.com/users/stripe/following{/other_user}","gists_url":"https://api.github.com/users/stripe/gists{/gist_id}","starred_url":"https://api.github.com/users/stripe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stripe/subscriptions","organizations_url":"https://api.github.com/users/stripe/orgs","repos_url":"https://api.github.com/users/stripe/repos","events_url":"https://api.github.com/users/stripe/events{/privacy}","received_events_url":"https://api.github.com/users/stripe/received_events","type":"Organization","site_admin":false},"repo":{"id":55277533,"node_id":"MDEwOlJlcG9zaXRvcnk1NTI3NzUzMw==","name":"veneur","full_name":"stripe/veneur","private":false,"owner":{"login":"stripe","id":856813,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg1NjgxMw==","avatar_url":"https://avatars1.githubusercontent.com/u/856813?v=4","gravatar_id":"","url":"https://api.github.com/users/stripe","html_url":"https://github.com/stripe","followers_url":"https://api.github.com/users/stripe/followers","following_url":"https://api.github.com/users/stripe/following{/other_user}","gists_url":"https://api.github.com/users/stripe/gists{/gist_id}","starred_url":"https://api.github.com/users/stripe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stripe/subscriptions","organizations_url":"https://api.github.com/users/stripe/orgs","repos_url":"https://api.github.com/users/stripe/repos","events_url":"https://api.github.com/users/stripe/events{/privacy}","received_events_url":"https://api.github.com/users/stripe/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/stripe/veneur","description":"A distributed, fault-tolerant pipeline for observability data","fork":false,"url":"https://api.github.com/repos/stripe/veneur","forks_url":"https://api.github.com/repos/stripe/veneur/forks","keys_url":"https://api.github.com/repos/stripe/veneur/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stripe/veneur/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stripe/veneur/teams","hooks_url":"https://api.github.com/repos/stripe/veneur/hooks","issue_events_url":"https://api.github.com/repos/stripe/veneur/issues/events{/number}","events_url":"https://api.github.com/repos/stripe/veneur/events","assignees_url":"https://api.github.com/repos/stripe/veneur/assignees{/user}","branches_url":"https://api.github.com/repos/stripe/veneur/branches{/branch}","tags_url":"https://api.github.com/repos/stripe/veneur/tags","blobs_url":"https://api.github.com/repos/stripe/veneur/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stripe/veneur/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stripe/veneur/git/refs{/sha}","trees_url":"https://api.github.com/repos/stripe/veneur/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stripe/veneur/statuses/{sha}","languages_url":"https://api.github.com/repos/stripe/veneur/languages","stargazers_url":"https://api.github.com/repos/stripe/veneur/stargazers","contributors_url":"https://api.github.com/repos/stripe/veneur/contributors","subscribers_url":"https://api.github.com/repos/stripe/veneur/subscribers","subscription_url":"https://api.github.com/repos/stripe/veneur/subscription","commits_url":"https://api.github.com/repos/stripe/veneur/commits{/sha}","git_commits_url":"https://api.github.com/repos/stripe/veneur/git/commits{/sha}","comments_url":"https://api.github.com/repos/stripe/veneur/comments{/number}","issue_comment_url":"https://api.github.com/repos/stripe/veneur/issues/comments{/number}","contents_url":"https://api.github.com/repos/stripe/veneur/contents/{+path}","compare_url":"https://api.github.com/repos/stripe/veneur/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stripe/veneur/merges","archive_url":"https://api.github.com/repos/stripe/veneur/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stripe/veneur/downloads","issues_url":"https://api.github.com/repos/stripe/veneur/issues{/number}","pulls_url":"https://api.github.com/repos/stripe/veneur/pulls{/number}","milestones_url":"https://api.github.com/repos/stripe/veneur/milestones{/number}","notifications_url":"https://api.github.com/repos/stripe/veneur/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stripe/veneur/labels{/name}","releases_url":"https://api.github.com/repos/stripe/veneur/releases{/id}","deployments_url":"https://api.github.com/repos/stripe/veneur/deployments","created_at":"2016-04-02T04:24:34Z","updated_at":"2018-11-27T16:50:57Z","pushed_at":"2018-11-27T15:01:12Z","git_url":"git://github.com/stripe/veneur.git","ssh_url":"git@github.com:stripe/veneur.git","clone_url":"https://github.com/stripe/veneur.git","svn_url":"https://github.com/stripe/veneur","homepage":"https://veneur.org","size":53959,"stargazers_count":1158,"watchers_count":1158,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":87,"mirror_url":null,"archived":false,"open_issues_count":29,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":87,"open_issues":29,"watchers":1158,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/stripe/veneur/pulls/581"},"html":{"href":"https://github.com/stripe/veneur/pull/581"},"issue":{"href":"https://api.github.com/repos/stripe/veneur/issues/581"},"comments":{"href":"https://api.github.com/repos/stripe/veneur/issues/581/comments"},"review_comments":{"href":"https://api.github.com/repos/stripe/veneur/pulls/581/comments"},"review_comment":{"href":"https://api.github.com/repos/stripe/veneur/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/stripe/veneur/pulls/581/commits"},"statuses":{"href":"https://api.github.com/repos/stripe/veneur/statuses/d97dba37e949404e30122ffa88a13ef2728e4f4b"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"ChimeraCoder"}}