{"action":"created","comment":{"url":"https://api.github.com/repos/honeycombio/beeline-go/pulls/comments/215100685","pull_request_review_id":152294313,"id":215100685,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNTEwMDY4NQ==","diff_hunk":"@@ -0,0 +1,348 @@\n+package trace\n+\n+import (\n+\t\"context\"\n+\t\"sync\"\n+\n+\t\"github.com/google/uuid\"\n+\t\"github.com/honeycombio/beeline-go/propagation\"\n+\t\"github.com/honeycombio/beeline-go/sample\"\n+\t\"github.com/honeycombio/beeline-go/timer\"\n+\tlibhoney \"github.com/honeycombio/libhoney-go\"\n+)\n+\n+var GlobalConfig Config\n+\n+type Config struct {\n+\t// TODO describe what these are and the return values\n+\tSamplerHook func(map[string]interface{}) (bool, int)\n+\tPresendHook func(map[string]interface{})\n+}\n+\n+// Trace holds some trace level state and the root of the span tree that will be\n+// the entire in-process trace. Traces are sent to Honeycomb when the root span\n+// is finished. You can send a trace manually, and that will cause all\n+// synchronous  spans in the trace to be finished and sent. Asynchronous spans\n+// must still be sent manually\n+type Trace struct {\n+\t// TODO add shouldDrop\n+\tbuilder          *libhoney.Builder\n+\ttraceID          string\n+\tparentID         string\n+\trollupFields     map[string]float64\n+\trollupLock       sync.Mutex\n+\trootSpan         *Span\n+\ttlfLock          sync.Mutex\n+\ttraceLevelFields map[string]interface{}\n+}\n+\n+// NewTrace creates a brand new trace. serializedHeaders is optional, and if\n+// included, should be the header as written by trace.SerializeHeaders(). When\n+// not starting from an upstream trace, pass the empty string here.\n+func NewTrace(ctx context.Context, serializedHeaders string) (context.Context, *Trace) {\n+\ttrace := &Trace{\n+\t\tbuilder:          libhoney.NewBuilder(),\n+\t\trollupFields:     make(map[string]float64),\n+\t\ttraceLevelFields: make(map[string]interface{}),\n+\t}\n+\tif serializedHeaders == \"\" {\n+\t\ttrace.traceID = uuid.Must(uuid.NewRandom()).String()\n+\t} else {\n+\t\tprop, err := propagation.UnmarshalTraceContext(serializedHeaders)\n+\t\tif err == nil {\n+\t\t\ttrace.traceID = prop.TraceID\n+\t\t\ttrace.parentID = prop.ParentID\n+\t\t\tfor k, v := range prop.TraceContext {\n+\t\t\t\ttrace.traceLevelFields[k] = v\n+\t\t\t}\n+\t\t}\n+\t}\n+\trootSpan := newSpan()\n+\trootSpan.amRoot = true\n+\trootSpan.ev = trace.builder.NewEvent()\n+\trootSpan.trace = trace\n+\ttrace.rootSpan = rootSpan\n+\n+\t// put trace and root span in context\n+\tctx = PutTraceInContext(ctx, trace)\n+\tctx = PutSpanInContext(ctx, rootSpan)\n+\treturn ctx, trace\n+}\n+\n+// AddField adds a field to the trace. Every span in the trace will have this\n+// field added to it. These fields are also passed along to downstream services.\n+// It is useful to add fields here that pertain to the entire trace, to aid in\n+// filtering spans at many different areas of the trace together.\n+func (t *Trace) AddField(key string, val interface{}) {\n+\tt.tlfLock.Lock()\n+\tdefer t.tlfLock.Unlock()\n+\tif t.traceLevelFields != nil {\n+\t\tt.traceLevelFields[key] = val\n+\t}\n+}\n+\n+// GetRootSpan returns the root of the in-process trace. Finishing the root span\n+// will send the entire trace to Honeycomb. From the root span you can walk the\n+// entire span tree using GetChildren.\n+func (t *Trace) GetRootSpan() *Span {\n+\treturn t.rootSpan\n+}\n+\n+// Send will finish and send the all synchronous spans in the trace to Honeycomb\n+func (t *Trace) Send() {\n+\t// TODO add sampling\n+\t// make sure all sync spans are finished\n+\trs := t.rootSpan\n+\tif !rs.amFinished {\n+\t\trs.Finish()\n+\t}\n+\t// start at the root span and send them all\n+\trecursiveSend(rs)\n+}\n+\n+// Span represents a specific task or portion of an application. It has a time\n+// and duration, and is linked to parent and children.\n+type Span struct {\n+\tamAsync      bool\n+\tamFinished   bool\n+\tamRoot       bool\n+\tchildren     []*Span\n+\tev           *libhoney.Event\n+\tspanID       string\n+\tparentID     string\n+\tparent       *Span\n+\trollupFields map[string]float64\n+\trollupLock   sync.Mutex\n+\tsent         bool // records whether this span has already been sent.\n+\ttimer        timer.Timer\n+\ttrace        *Trace\n+}\n+\n+// newSpan takes care of *some* of the initialization necessary to create a new\n+// span. IMPORTANT it is not all of the initialization! It does *not* set parent\n+// ID or assign the pointer to the trace that contains this span. See existing\n+// uses of this function to get an example of the other things necessary to\n+// create a well formed span.\n+func newSpan() *Span {\n+\treturn &Span{\n+\t\tspanID:       uuid.Must(uuid.NewRandom()).String(),\n+\t\ttimer:        timer.Start(),\n+\t\tchildren:     make([]*Span, 0),\n+\t\trollupFields: make(map[string]float64),\n+\t}\n+}\n+\n+// AddField adds a key/value pair to this span\n+func (s *Span) AddField(key string, val interface{}) {\n+\tif s.ev != nil {\n+\t\ts.ev.AddField(key, val)\n+\t}\n+}\n+\n+// AddRollupField adds a key/value pair to this span. If it is called repeatedly\n+// on the same span, the values will be summed together.  Additionally, this\n+// field will be summed across all spans and added to the trace as a total. It\n+// is especially useful for doing things like adding the duration spent talking\n+// to a specific external service - eg database time. The root span will then\n+// get a field that represents the total time spent talking to the database from\n+// all of the spans that are part of the trace.\n+func (s *Span) AddRollupField(key string, val float64) {\n+\ts.rollupLock.Lock()\n+\tif s.rollupFields != nil {\n+\t\ts.rollupFields[key] += val\n+\t}\n+\ts.rollupLock.Unlock()\n+\tif s.trace != nil {\n+\t\ts.trace.rollupLock.Lock()\n+\t\tdefer s.trace.rollupLock.Unlock()\n+\t\ts.trace.rollupFields[key] += val\n+\t}\n+}\n+\n+// AddTraceField adds a key/value pair to this span and all others involved in\n+// this trace. These fields are also passed along to downstream services. This\n+// method is functionally identical to `Trace.AddField()`.\n+func (s *Span) AddTraceField(key string, val interface{}) {\n+\t// these get added to this span when it gets sent, so don't bother adding\n+\t// them here\n+\tif s.trace != nil {\n+\t\ts.trace.AddField(key, val)\n+\t}\n+}\n+\n+// Finish marks a span complete. It does not actually send the span to\n+// Honeycomb; spans stick around until the entire trace is complete and then get\n+// dispatched to Honeycomb. Finishing a span also triggers finishing all\n+// synchronous child spans - in other words, if any synchronous child span has\n+// not yet been finished, finishing the parent will finish the children as well.\n+func (s *Span) Finish() {\n+\tif s.ev == nil {\n+\t\treturn\n+\t}\n+\t// finish the timer for this span\n+\tif s.timer != nil {\n+\t\tdur := s.timer.Finish()\n+\t\ts.ev.AddField(\"duration_ms\", dur)\n+\t}\n+\t// set trace IDs for this span\n+\ts.ev.AddField(\"trace.trace_id\", s.trace.traceID)\n+\tif s.parentID != \"\" {\n+\t\ts.ev.AddField(\"trace.parent_id\", s.parentID)\n+\t}\n+\ts.ev.AddField(\"trace.span_id\", s.spanID)\n+\t// add rollup fields to the event\n+\tfor k, v := range s.rollupFields {\n+\t\ts.ev.AddField(k, v)\n+\t}\n+\tfor _, child := range s.children {\n+\t\tif !child.AmAsync() {\n+\t\t\tif !child.amFinished {\n+\t\t\t\tchild.AddField(\"meta.finished_by_parent\", true)\n+\t\t\t\tchild.Finish()\n+\t\t\t}\n+\t\t}\n+\t}\n+\ts.amFinished = true\n+\t// if we're closing the root span, send the whole trace\n+\tif s.amRoot {\n+\t\ts.trace.Send()\n+\t}\n+}\n+\n+// AmAsync reveals whether the span is asynchronous (true) or synchronous (false).\n+func (s *Span) AmAsync() bool {\n+\treturn s.amAsync\n+}\n+\n+// GetChildren returns a list of all child spans (both synchronous and\n+// asynchronous).\n+func (s *Span) GetChildren() []*Span {\n+\treturn s.children\n+}\n+\n+// Get Parent returns this span's parent.\n+func (s *Span) GetParent() *Span {\n+\treturn s.parent\n+}\n+\n+// ChildAsyncSpan creates a child of the current span that is expected to\n+// outlive the current span (and trace). Async spans must be manually sent using\n+// the `Send()` method but are otherwise identical to normal spans.\n+func (s *Span) ChildAsyncSpan(ctx context.Context) (context.Context, *Span) {","path":"trace/trace.go","position":231,"original_position":231,"commit_id":"47041f3ba89fb3142ae1180d8136afbb78b752b2","original_commit_id":"47041f3ba89fb3142ae1180d8136afbb78b752b2","user":{"login":"maplebed","id":361454,"node_id":"MDQ6VXNlcjM2MTQ1NA==","avatar_url":"https://avatars0.githubusercontent.com/u/361454?v=4","gravatar_id":"","url":"https://api.github.com/users/maplebed","html_url":"https://github.com/maplebed","followers_url":"https://api.github.com/users/maplebed/followers","following_url":"https://api.github.com/users/maplebed/following{/other_user}","gists_url":"https://api.github.com/users/maplebed/gists{/gist_id}","starred_url":"https://api.github.com/users/maplebed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maplebed/subscriptions","organizations_url":"https://api.github.com/users/maplebed/orgs","repos_url":"https://api.github.com/users/maplebed/repos","events_url":"https://api.github.com/users/maplebed/events{/privacy}","received_events_url":"https://api.github.com/users/maplebed/received_events","type":"User","site_admin":false},"body":"Nathan objected to `New` in the name because it has strong meaning in normal go usage as a constructor (which this really isn't in the way that it would be in other Go things)","created_at":"2018-09-04T23:55:25Z","updated_at":"2018-09-04T23:55:26Z","html_url":"https://github.com/honeycombio/beeline-go/pull/17#discussion_r215100685","pull_request_url":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/honeycombio/beeline-go/pulls/comments/215100685"},"html":{"href":"https://github.com/honeycombio/beeline-go/pull/17#discussion_r215100685"},"pull_request":{"href":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17"}},"in_reply_to_id":215049934},"pull_request":{"url":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17","id":209710103,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5NzEwMTAz","html_url":"https://github.com/honeycombio/beeline-go/pull/17","diff_url":"https://github.com/honeycombio/beeline-go/pull/17.diff","patch_url":"https://github.com/honeycombio/beeline-go/pull/17.patch","issue_url":"https://api.github.com/repos/honeycombio/beeline-go/issues/17","number":17,"state":"open","locked":false,"title":"Ben.api tracepkg","user":{"login":"maplebed","id":361454,"node_id":"MDQ6VXNlcjM2MTQ1NA==","avatar_url":"https://avatars0.githubusercontent.com/u/361454?v=4","gravatar_id":"","url":"https://api.github.com/users/maplebed","html_url":"https://github.com/maplebed","followers_url":"https://api.github.com/users/maplebed/followers","following_url":"https://api.github.com/users/maplebed/following{/other_user}","gists_url":"https://api.github.com/users/maplebed/gists{/gist_id}","starred_url":"https://api.github.com/users/maplebed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maplebed/subscriptions","organizations_url":"https://api.github.com/users/maplebed/orgs","repos_url":"https://api.github.com/users/maplebed/repos","events_url":"https://api.github.com/users/maplebed/events{/privacy}","received_events_url":"https://api.github.com/users/maplebed/received_events","type":"User","site_admin":false},"body":"Biggest change - Trace and Span objects are pulled out of the `internal` package and into a `trace` package, intended to be used directly. Also created a `wrappers/common` package for things that all the HTTP and DB wrappers share. That felt better, because they're really specific to those wrappers rather than anything internal to the beeline itself.\r\n\r\nThis is ready to merge! I would like feedback on the overall shape as well as anything you pick out that I have missed, since I've been staring at this for too long.","created_at":"2018-08-21T05:10:55Z","updated_at":"2018-09-04T23:55:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f05bd9162cd07b434209289aee0172fbc7b2032d","assignee":null,"assignees":[],"requested_reviewers":[{"login":"rfong","id":1322207,"node_id":"MDQ6VXNlcjEzMjIyMDc=","avatar_url":"https://avatars2.githubusercontent.com/u/1322207?v=4","gravatar_id":"","url":"https://api.github.com/users/rfong","html_url":"https://github.com/rfong","followers_url":"https://api.github.com/users/rfong/followers","following_url":"https://api.github.com/users/rfong/following{/other_user}","gists_url":"https://api.github.com/users/rfong/gists{/gist_id}","starred_url":"https://api.github.com/users/rfong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rfong/subscriptions","organizations_url":"https://api.github.com/users/rfong/orgs","repos_url":"https://api.github.com/users/rfong/repos","events_url":"https://api.github.com/users/rfong/events{/privacy}","received_events_url":"https://api.github.com/users/rfong/received_events","type":"User","site_admin":false},{"login":"emfree","id":1868186,"node_id":"MDQ6VXNlcjE4NjgxODY=","avatar_url":"https://avatars1.githubusercontent.com/u/1868186?v=4","gravatar_id":"","url":"https://api.github.com/users/emfree","html_url":"https://github.com/emfree","followers_url":"https://api.github.com/users/emfree/followers","following_url":"https://api.github.com/users/emfree/following{/other_user}","gists_url":"https://api.github.com/users/emfree/gists{/gist_id}","starred_url":"https://api.github.com/users/emfree/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emfree/subscriptions","organizations_url":"https://api.github.com/users/emfree/orgs","repos_url":"https://api.github.com/users/emfree/repos","events_url":"https://api.github.com/users/emfree/events{/privacy}","received_events_url":"https://api.github.com/users/emfree/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17/commits","review_comments_url":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17/comments","review_comment_url":"https://api.github.com/repos/honeycombio/beeline-go/pulls/comments{/number}","comments_url":"https://api.github.com/repos/honeycombio/beeline-go/issues/17/comments","statuses_url":"https://api.github.com/repos/honeycombio/beeline-go/statuses/47041f3ba89fb3142ae1180d8136afbb78b752b2","head":{"label":"honeycombio:ben.api_tracepkg","ref":"ben.api_tracepkg","sha":"47041f3ba89fb3142ae1180d8136afbb78b752b2","user":{"login":"honeycombio","id":15988027,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1OTg4MDI3","avatar_url":"https://avatars1.githubusercontent.com/u/15988027?v=4","gravatar_id":"","url":"https://api.github.com/users/honeycombio","html_url":"https://github.com/honeycombio","followers_url":"https://api.github.com/users/honeycombio/followers","following_url":"https://api.github.com/users/honeycombio/following{/other_user}","gists_url":"https://api.github.com/users/honeycombio/gists{/gist_id}","starred_url":"https://api.github.com/users/honeycombio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/honeycombio/subscriptions","organizations_url":"https://api.github.com/users/honeycombio/orgs","repos_url":"https://api.github.com/users/honeycombio/repos","events_url":"https://api.github.com/users/honeycombio/events{/privacy}","received_events_url":"https://api.github.com/users/honeycombio/received_events","type":"Organization","site_admin":false},"repo":{"id":124302425,"node_id":"MDEwOlJlcG9zaXRvcnkxMjQzMDI0MjU=","name":"beeline-go","full_name":"honeycombio/beeline-go","owner":{"login":"honeycombio","id":15988027,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1OTg4MDI3","avatar_url":"https://avatars1.githubusercontent.com/u/15988027?v=4","gravatar_id":"","url":"https://api.github.com/users/honeycombio","html_url":"https://github.com/honeycombio","followers_url":"https://api.github.com/users/honeycombio/followers","following_url":"https://api.github.com/users/honeycombio/following{/other_user}","gists_url":"https://api.github.com/users/honeycombio/gists{/gist_id}","starred_url":"https://api.github.com/users/honeycombio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/honeycombio/subscriptions","organizations_url":"https://api.github.com/users/honeycombio/orgs","repos_url":"https://api.github.com/users/honeycombio/repos","events_url":"https://api.github.com/users/honeycombio/events{/privacy}","received_events_url":"https://api.github.com/users/honeycombio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/honeycombio/beeline-go","description":"Easy instrumentation for golang apps with Honeycomb","fork":false,"url":"https://api.github.com/repos/honeycombio/beeline-go","forks_url":"https://api.github.com/repos/honeycombio/beeline-go/forks","keys_url":"https://api.github.com/repos/honeycombio/beeline-go/keys{/key_id}","collaborators_url":"https://api.github.com/repos/honeycombio/beeline-go/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/honeycombio/beeline-go/teams","hooks_url":"https://api.github.com/repos/honeycombio/beeline-go/hooks","issue_events_url":"https://api.github.com/repos/honeycombio/beeline-go/issues/events{/number}","events_url":"https://api.github.com/repos/honeycombio/beeline-go/events","assignees_url":"https://api.github.com/repos/honeycombio/beeline-go/assignees{/user}","branches_url":"https://api.github.com/repos/honeycombio/beeline-go/branches{/branch}","tags_url":"https://api.github.com/repos/honeycombio/beeline-go/tags","blobs_url":"https://api.github.com/repos/honeycombio/beeline-go/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/honeycombio/beeline-go/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/honeycombio/beeline-go/git/refs{/sha}","trees_url":"https://api.github.com/repos/honeycombio/beeline-go/git/trees{/sha}","statuses_url":"https://api.github.com/repos/honeycombio/beeline-go/statuses/{sha}","languages_url":"https://api.github.com/repos/honeycombio/beeline-go/languages","stargazers_url":"https://api.github.com/repos/honeycombio/beeline-go/stargazers","contributors_url":"https://api.github.com/repos/honeycombio/beeline-go/contributors","subscribers_url":"https://api.github.com/repos/honeycombio/beeline-go/subscribers","subscription_url":"https://api.github.com/repos/honeycombio/beeline-go/subscription","commits_url":"https://api.github.com/repos/honeycombio/beeline-go/commits{/sha}","git_commits_url":"https://api.github.com/repos/honeycombio/beeline-go/git/commits{/sha}","comments_url":"https://api.github.com/repos/honeycombio/beeline-go/comments{/number}","issue_comment_url":"https://api.github.com/repos/honeycombio/beeline-go/issues/comments{/number}","contents_url":"https://api.github.com/repos/honeycombio/beeline-go/contents/{+path}","compare_url":"https://api.github.com/repos/honeycombio/beeline-go/compare/{base}...{head}","merges_url":"https://api.github.com/repos/honeycombio/beeline-go/merges","archive_url":"https://api.github.com/repos/honeycombio/beeline-go/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/honeycombio/beeline-go/downloads","issues_url":"https://api.github.com/repos/honeycombio/beeline-go/issues{/number}","pulls_url":"https://api.github.com/repos/honeycombio/beeline-go/pulls{/number}","milestones_url":"https://api.github.com/repos/honeycombio/beeline-go/milestones{/number}","notifications_url":"https://api.github.com/repos/honeycombio/beeline-go/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/honeycombio/beeline-go/labels{/name}","releases_url":"https://api.github.com/repos/honeycombio/beeline-go/releases{/id}","deployments_url":"https://api.github.com/repos/honeycombio/beeline-go/deployments","created_at":"2018-03-07T22:30:37Z","updated_at":"2018-09-02T00:29:29Z","pushed_at":"2018-08-30T23:28:39Z","git_url":"git://github.com/honeycombio/beeline-go.git","ssh_url":"git@github.com:honeycombio/beeline-go.git","clone_url":"https://github.com/honeycombio/beeline-go.git","svn_url":"https://github.com/honeycombio/beeline-go","homepage":"https://honeycomb.io","size":214,"stargazers_count":9,"watchers_count":9,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":4,"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":6,"open_issues":4,"watchers":9,"default_branch":"master"}},"base":{"label":"honeycombio:master","ref":"master","sha":"017dcb7798d7da343b19314e8e3a7998bcf6ae02","user":{"login":"honeycombio","id":15988027,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1OTg4MDI3","avatar_url":"https://avatars1.githubusercontent.com/u/15988027?v=4","gravatar_id":"","url":"https://api.github.com/users/honeycombio","html_url":"https://github.com/honeycombio","followers_url":"https://api.github.com/users/honeycombio/followers","following_url":"https://api.github.com/users/honeycombio/following{/other_user}","gists_url":"https://api.github.com/users/honeycombio/gists{/gist_id}","starred_url":"https://api.github.com/users/honeycombio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/honeycombio/subscriptions","organizations_url":"https://api.github.com/users/honeycombio/orgs","repos_url":"https://api.github.com/users/honeycombio/repos","events_url":"https://api.github.com/users/honeycombio/events{/privacy}","received_events_url":"https://api.github.com/users/honeycombio/received_events","type":"Organization","site_admin":false},"repo":{"id":124302425,"node_id":"MDEwOlJlcG9zaXRvcnkxMjQzMDI0MjU=","name":"beeline-go","full_name":"honeycombio/beeline-go","owner":{"login":"honeycombio","id":15988027,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1OTg4MDI3","avatar_url":"https://avatars1.githubusercontent.com/u/15988027?v=4","gravatar_id":"","url":"https://api.github.com/users/honeycombio","html_url":"https://github.com/honeycombio","followers_url":"https://api.github.com/users/honeycombio/followers","following_url":"https://api.github.com/users/honeycombio/following{/other_user}","gists_url":"https://api.github.com/users/honeycombio/gists{/gist_id}","starred_url":"https://api.github.com/users/honeycombio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/honeycombio/subscriptions","organizations_url":"https://api.github.com/users/honeycombio/orgs","repos_url":"https://api.github.com/users/honeycombio/repos","events_url":"https://api.github.com/users/honeycombio/events{/privacy}","received_events_url":"https://api.github.com/users/honeycombio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/honeycombio/beeline-go","description":"Easy instrumentation for golang apps with Honeycomb","fork":false,"url":"https://api.github.com/repos/honeycombio/beeline-go","forks_url":"https://api.github.com/repos/honeycombio/beeline-go/forks","keys_url":"https://api.github.com/repos/honeycombio/beeline-go/keys{/key_id}","collaborators_url":"https://api.github.com/repos/honeycombio/beeline-go/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/honeycombio/beeline-go/teams","hooks_url":"https://api.github.com/repos/honeycombio/beeline-go/hooks","issue_events_url":"https://api.github.com/repos/honeycombio/beeline-go/issues/events{/number}","events_url":"https://api.github.com/repos/honeycombio/beeline-go/events","assignees_url":"https://api.github.com/repos/honeycombio/beeline-go/assignees{/user}","branches_url":"https://api.github.com/repos/honeycombio/beeline-go/branches{/branch}","tags_url":"https://api.github.com/repos/honeycombio/beeline-go/tags","blobs_url":"https://api.github.com/repos/honeycombio/beeline-go/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/honeycombio/beeline-go/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/honeycombio/beeline-go/git/refs{/sha}","trees_url":"https://api.github.com/repos/honeycombio/beeline-go/git/trees{/sha}","statuses_url":"https://api.github.com/repos/honeycombio/beeline-go/statuses/{sha}","languages_url":"https://api.github.com/repos/honeycombio/beeline-go/languages","stargazers_url":"https://api.github.com/repos/honeycombio/beeline-go/stargazers","contributors_url":"https://api.github.com/repos/honeycombio/beeline-go/contributors","subscribers_url":"https://api.github.com/repos/honeycombio/beeline-go/subscribers","subscription_url":"https://api.github.com/repos/honeycombio/beeline-go/subscription","commits_url":"https://api.github.com/repos/honeycombio/beeline-go/commits{/sha}","git_commits_url":"https://api.github.com/repos/honeycombio/beeline-go/git/commits{/sha}","comments_url":"https://api.github.com/repos/honeycombio/beeline-go/comments{/number}","issue_comment_url":"https://api.github.com/repos/honeycombio/beeline-go/issues/comments{/number}","contents_url":"https://api.github.com/repos/honeycombio/beeline-go/contents/{+path}","compare_url":"https://api.github.com/repos/honeycombio/beeline-go/compare/{base}...{head}","merges_url":"https://api.github.com/repos/honeycombio/beeline-go/merges","archive_url":"https://api.github.com/repos/honeycombio/beeline-go/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/honeycombio/beeline-go/downloads","issues_url":"https://api.github.com/repos/honeycombio/beeline-go/issues{/number}","pulls_url":"https://api.github.com/repos/honeycombio/beeline-go/pulls{/number}","milestones_url":"https://api.github.com/repos/honeycombio/beeline-go/milestones{/number}","notifications_url":"https://api.github.com/repos/honeycombio/beeline-go/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/honeycombio/beeline-go/labels{/name}","releases_url":"https://api.github.com/repos/honeycombio/beeline-go/releases{/id}","deployments_url":"https://api.github.com/repos/honeycombio/beeline-go/deployments","created_at":"2018-03-07T22:30:37Z","updated_at":"2018-09-02T00:29:29Z","pushed_at":"2018-08-30T23:28:39Z","git_url":"git://github.com/honeycombio/beeline-go.git","ssh_url":"git@github.com:honeycombio/beeline-go.git","clone_url":"https://github.com/honeycombio/beeline-go.git","svn_url":"https://github.com/honeycombio/beeline-go","homepage":"https://honeycomb.io","size":214,"stargazers_count":9,"watchers_count":9,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":4,"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":6,"open_issues":4,"watchers":9,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17"},"html":{"href":"https://github.com/honeycombio/beeline-go/pull/17"},"issue":{"href":"https://api.github.com/repos/honeycombio/beeline-go/issues/17"},"comments":{"href":"https://api.github.com/repos/honeycombio/beeline-go/issues/17/comments"},"review_comments":{"href":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17/comments"},"review_comment":{"href":"https://api.github.com/repos/honeycombio/beeline-go/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/honeycombio/beeline-go/pulls/17/commits"},"statuses":{"href":"https://api.github.com/repos/honeycombio/beeline-go/statuses/47041f3ba89fb3142ae1180d8136afbb78b752b2"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"maplebed"}}