{"action":"created","comment":{"url":"https://api.github.com/repos/istio/mixer/pulls/comments/126816470","pull_request_review_id":49333645,"id":126816470,"diff_hunk":"@@ -0,0 +1,197 @@\n+// Copyright 2017 Istio 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+package serviceControl\n+\n+import (\n+\t\"errors\"\n+\t\"fmt\"\n+\t\"time\"\n+\n+\t\"github.com/pborman/uuid\"\n+\tservicecontrol \"google.golang.org/api/servicecontrol/v1\"\n+\n+\t\"istio.io/mixer/adapter/serviceControl/config\"\n+\t\"istio.io/mixer/pkg/adapter\"\n+)\n+\n+type (\n+\tbuilder struct {\n+\t\tadapter.DefaultBuilder\n+\n+\t\tclient\n+\t}\n+\n+\taspect struct {\n+\t\tserviceName string\n+\t\tservice     *servicecontrol.Service\n+\t\tlogger      adapter.Logger\n+\t}\n+)\n+\n+var (\n+\tname = \"serviceControl\"\n+)\n+\n+// Register records the builders exposed by this adapter.\n+func Register(r adapter.Registrar) {\n+\tr.RegisterMetricsBuilder(\n+\t\t&builder{adapter.NewDefaultBuilder(\n+\t\t\tname,\n+\t\t\t\"Push metrics to GCP service controller\",\n+\t\t\tnew(config.Params),\n+\t\t), new(clientImpl)})\n+\n+\tr.RegisterApplicationLogsBuilder(\n+\t\t&builder{adapter.NewDefaultBuilder(\n+\t\t\tname,\n+\t\t\t\"Writes log entries to GCP service controller\",\n+\t\t\tnew(config.Params),\n+\t\t), new(clientImpl)})\n+}\n+\n+func (*builder) ValidateConfig(c adapter.Config) (ce *adapter.ConfigErrors) {\n+\treturn nil\n+}\n+\n+func (b *builder) NewMetricsAspect(env adapter.Env, cfg adapter.Config, metrics map[string]*adapter.MetricDefinition) (adapter.MetricsAspect, error) {\n+\treturn b.newAspect(env, cfg)\n+}\n+\n+func (b *builder) NewApplicationLogsAspect(env adapter.Env, cfg adapter.Config) (adapter.ApplicationLogsAspect, error) {\n+\treturn b.newAspect(env, cfg)\n+}\n+\n+func (*builder) NewAccessLogsAspect(env adapter.Env, cfg adapter.Config) (adapter.AccessLogsAspect, error) {\n+\treturn nil, errors.New(\"access logs are not supported\")\n+}\n+\n+func (b *builder) newAspect(env adapter.Env, cfg adapter.Config) (*aspect, error) {\n+\tparams := cfg.(*config.Params)\n+\tss, err := b.client.create(env.Logger())\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\treturn &aspect{params.ServiceName, ss, env.Logger()}, nil\n+}\n+\n+func (a *aspect) Record(values []adapter.Value) error {\n+\trq := a.record(values, time.Now(), fmt.Sprintf(\"mixer-metric-report-id-%d\", uuid.New()))\n+\trp, err := a.service.Services.Report(a.serviceName, rq).Do()\n+\n+\tif a.logger.VerbosityLevel(4) {\n+\t\ta.logger.Infof(\"service control metric report operation id %s\\nmetrics %v\\nresponse %v\",\n+\t\t\trq.Operations[0].OperationId, values, rp)\n+\t}\n+\treturn err\n+}\n+\n+func (a *aspect) record(values []adapter.Value, now time.Time, operationID string) *servicecontrol.ReportRequest {\n+\tvar vs []*servicecontrol.MetricValueSet\n+\tfor _, v := range values {\n+\t\t// TODO Only support request count.\n+\t\tif v.Definition.Name != \"request_count\" {\n+\t\t\ta.logger.Warningf(\"service control metric got unsupported metric name: %s\\n\", v.Definition.Name)\n+\t\t\tcontinue\n+\t\t}\n+\t\tvar mv servicecontrol.MetricValue\n+\t\tmv.Labels, _ = translate(v.Labels)\n+\t\tmv.StartTime = v.StartTime.Format(time.RFC3339Nano)\n+\t\tmv.EndTime = v.EndTime.Format(time.RFC3339Nano)\n+\t\ti, _ := v.Int64()\n+\t\tmv.Int64Value = &i\n+\n+\t\tms := &servicecontrol.MetricValueSet{\n+\t\t\tMetricName:   \"serviceruntime.googleapis.com/api/producer/request_count\",\n+\t\t\tMetricValues: []*servicecontrol.MetricValue{&mv},\n+\t\t}\n+\t\tvs = append(vs, ms)\n+\t}\n+\n+\top := &servicecontrol.Operation{\n+\t\tOperationId:     operationID,\n+\t\tOperationName:   \"reportMetrics\",\n+\t\tStartTime:       now.Format(time.RFC3339Nano),\n+\t\tEndTime:         now.Format(time.RFC3339Nano),\n+\t\tMetricValueSets: vs,\n+\t\tLabels: map[string]string{\n+\t\t\t\"cloud.googleapis.com/location\": \"global\",\n+\t\t},\n+\t}\n+\treturn &servicecontrol.ReportRequest{\n+\t\tOperations: []*servicecontrol.Operation{op},\n+\t}\n+}\n+\n+// translate mixer label key to GCP label, and find the api method. TODO Need general redesign.\n+// Current implementation is just adding a prefix / which does not work for some labels.\n+// Need to support api_method\n+// \"serviceruntime.googleapis.com/api_method\": method,\n+func translate(labels map[string]interface{}) (map[string]string, string) {\n+\tml := make(map[string]string)\n+\tvar method string\n+\tfor k, v := range labels {\n+\t\tnk := fmt.Sprintf(\"/%s\", k)\n+\t\tml[nk] = fmt.Sprintf(\"%v\", v)\n+\t\tif k == \"request.method\" {\n+\t\t\tmethod = ml[nk]\n+\t\t}\n+\t}\n+\treturn ml, method\n+}\n+\n+//TODO Add supports to struct payload.\n+func (a *aspect) log(entries []adapter.LogEntry, now time.Time, operationID string) *servicecontrol.ReportRequest {\n+\tvar ls []*servicecontrol.LogEntry\n+\tfor _, e := range entries {\n+\t\tl := &servicecontrol.LogEntry{\n+\t\t\tName:        e.LogName,\n+\t\t\tSeverity:    e.Severity.String(),\n+\t\t\tTextPayload: e.TextPayload,\n+\t\t\tTimestamp:   e.Timestamp,\n+\t\t}\n+\t\tls = append(ls, l)\n+\t}\n+\n+\top := &servicecontrol.Operation{\n+\t\tOperationId:   operationID,\n+\t\tOperationName: \"reportLogs\",\n+\t\tStartTime:     now.Format(time.RFC3339Nano),\n+\t\tEndTime:       now.Format(time.RFC3339Nano),","path":"adapter/serviceControl/serviceController.go","position":171,"original_position":171,"commit_id":"dbcd36c1263643e02e93787a62b17d2c76721609","original_commit_id":"dbcd36c1263643e02e93787a62b17d2c76721609","user":{"login":"douglas-reid","id":21148125,"avatar_url":"https://avatars0.githubusercontent.com/u/21148125?v=3","gravatar_id":"","url":"https://api.github.com/users/douglas-reid","html_url":"https://github.com/douglas-reid","followers_url":"https://api.github.com/users/douglas-reid/followers","following_url":"https://api.github.com/users/douglas-reid/following{/other_user}","gists_url":"https://api.github.com/users/douglas-reid/gists{/gist_id}","starred_url":"https://api.github.com/users/douglas-reid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/douglas-reid/subscriptions","organizations_url":"https://api.github.com/users/douglas-reid/orgs","repos_url":"https://api.github.com/users/douglas-reid/repos","events_url":"https://api.github.com/users/douglas-reid/events{/privacy}","received_events_url":"https://api.github.com/users/douglas-reid/received_events","type":"User","site_admin":false},"body":"let's only format `now` once.","created_at":"2017-07-11T21:45:28Z","updated_at":"2017-07-11T21:50:36Z","html_url":"https://github.com/istio/mixer/pull/890#discussion_r126816470","pull_request_url":"https://api.github.com/repos/istio/mixer/pulls/890","_links":{"self":{"href":"https://api.github.com/repos/istio/mixer/pulls/comments/126816470"},"html":{"href":"https://github.com/istio/mixer/pull/890#discussion_r126816470"},"pull_request":{"href":"https://api.github.com/repos/istio/mixer/pulls/890"}}},"pull_request":{"url":"https://api.github.com/repos/istio/mixer/pulls/890","id":130000040,"html_url":"https://github.com/istio/mixer/pull/890","diff_url":"https://github.com/istio/mixer/pull/890.diff","patch_url":"https://github.com/istio/mixer/pull/890.patch","issue_url":"https://api.github.com/repos/istio/mixer/issues/890","number":890,"state":"open","locked":false,"title":"Initial load of GCP service control adapter","user":{"login":"xiaolanz","id":28876302,"avatar_url":"https://avatars2.githubusercontent.com/u/28876302?v=3","gravatar_id":"","url":"https://api.github.com/users/xiaolanz","html_url":"https://github.com/xiaolanz","followers_url":"https://api.github.com/users/xiaolanz/followers","following_url":"https://api.github.com/users/xiaolanz/following{/other_user}","gists_url":"https://api.github.com/users/xiaolanz/gists{/gist_id}","starred_url":"https://api.github.com/users/xiaolanz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xiaolanz/subscriptions","organizations_url":"https://api.github.com/users/xiaolanz/orgs","repos_url":"https://api.github.com/users/xiaolanz/repos","events_url":"https://api.github.com/users/xiaolanz/events{/privacy}","received_events_url":"https://api.github.com/users/xiaolanz/received_events","type":"User","site_admin":false},"body":"Adding a GCP service control adapter with report functionality #842 \r\n\r\n<!-- Reviewable:start -->\r\n---\r\nThis change is [<img src=\"https://reviewable.io/review_button.svg\" height=\"34\" align=\"absmiddle\" alt=\"Reviewable\"/>](https://reviewable.io/reviews/istio/mixer/890)\r\n<!-- Reviewable:end -->\r\n","created_at":"2017-07-11T20:37:50Z","updated_at":"2017-07-11T21:50:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"49b765cacaa70b24d553b51541fdc3dd644421d8","assignee":null,"assignees":[],"requested_reviewers":[{"login":"ZackButcher","id":1923135,"avatar_url":"https://avatars1.githubusercontent.com/u/1923135?v=3","gravatar_id":"","url":"https://api.github.com/users/ZackButcher","html_url":"https://github.com/ZackButcher","followers_url":"https://api.github.com/users/ZackButcher/followers","following_url":"https://api.github.com/users/ZackButcher/following{/other_user}","gists_url":"https://api.github.com/users/ZackButcher/gists{/gist_id}","starred_url":"https://api.github.com/users/ZackButcher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ZackButcher/subscriptions","organizations_url":"https://api.github.com/users/ZackButcher/orgs","repos_url":"https://api.github.com/users/ZackButcher/repos","events_url":"https://api.github.com/users/ZackButcher/events{/privacy}","received_events_url":"https://api.github.com/users/ZackButcher/received_events","type":"User","site_admin":false},{"login":"geeknoid","id":22780957,"avatar_url":"https://avatars0.githubusercontent.com/u/22780957?v=3","gravatar_id":"","url":"https://api.github.com/users/geeknoid","html_url":"https://github.com/geeknoid","followers_url":"https://api.github.com/users/geeknoid/followers","following_url":"https://api.github.com/users/geeknoid/following{/other_user}","gists_url":"https://api.github.com/users/geeknoid/gists{/gist_id}","starred_url":"https://api.github.com/users/geeknoid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geeknoid/subscriptions","organizations_url":"https://api.github.com/users/geeknoid/orgs","repos_url":"https://api.github.com/users/geeknoid/repos","events_url":"https://api.github.com/users/geeknoid/events{/privacy}","received_events_url":"https://api.github.com/users/geeknoid/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/istio/mixer/milestones/2","html_url":"https://github.com/istio/mixer/milestone/2","labels_url":"https://api.github.com/repos/istio/mixer/milestones/2/labels","id":2383600,"number":2,"title":"Istio 0.2","description":"","creator":{"login":"jasminejaksic","id":23645863,"avatar_url":"https://avatars0.githubusercontent.com/u/23645863?v=3","gravatar_id":"","url":"https://api.github.com/users/jasminejaksic","html_url":"https://github.com/jasminejaksic","followers_url":"https://api.github.com/users/jasminejaksic/followers","following_url":"https://api.github.com/users/jasminejaksic/following{/other_user}","gists_url":"https://api.github.com/users/jasminejaksic/gists{/gist_id}","starred_url":"https://api.github.com/users/jasminejaksic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jasminejaksic/subscriptions","organizations_url":"https://api.github.com/users/jasminejaksic/orgs","repos_url":"https://api.github.com/users/jasminejaksic/repos","events_url":"https://api.github.com/users/jasminejaksic/events{/privacy}","received_events_url":"https://api.github.com/users/jasminejaksic/received_events","type":"User","site_admin":false},"open_issues":110,"closed_issues":23,"state":"open","created_at":"2017-03-13T23:07:30Z","updated_at":"2017-07-11T20:38:14Z","due_on":"2017-08-31T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/istio/mixer/pulls/890/commits","review_comments_url":"https://api.github.com/repos/istio/mixer/pulls/890/comments","review_comment_url":"https://api.github.com/repos/istio/mixer/pulls/comments{/number}","comments_url":"https://api.github.com/repos/istio/mixer/issues/890/comments","statuses_url":"https://api.github.com/repos/istio/mixer/statuses/dbcd36c1263643e02e93787a62b17d2c76721609","head":{"label":"xiaolanz:sc","ref":"sc","sha":"dbcd36c1263643e02e93787a62b17d2c76721609","user":{"login":"xiaolanz","id":28876302,"avatar_url":"https://avatars2.githubusercontent.com/u/28876302?v=3","gravatar_id":"","url":"https://api.github.com/users/xiaolanz","html_url":"https://github.com/xiaolanz","followers_url":"https://api.github.com/users/xiaolanz/followers","following_url":"https://api.github.com/users/xiaolanz/following{/other_user}","gists_url":"https://api.github.com/users/xiaolanz/gists{/gist_id}","starred_url":"https://api.github.com/users/xiaolanz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xiaolanz/subscriptions","organizations_url":"https://api.github.com/users/xiaolanz/orgs","repos_url":"https://api.github.com/users/xiaolanz/repos","events_url":"https://api.github.com/users/xiaolanz/events{/privacy}","received_events_url":"https://api.github.com/users/xiaolanz/received_events","type":"User","site_admin":false},"repo":{"id":92311171,"name":"mixer","full_name":"xiaolanz/mixer","owner":{"login":"xiaolanz","id":28876302,"avatar_url":"https://avatars2.githubusercontent.com/u/28876302?v=3","gravatar_id":"","url":"https://api.github.com/users/xiaolanz","html_url":"https://github.com/xiaolanz","followers_url":"https://api.github.com/users/xiaolanz/followers","following_url":"https://api.github.com/users/xiaolanz/following{/other_user}","gists_url":"https://api.github.com/users/xiaolanz/gists{/gist_id}","starred_url":"https://api.github.com/users/xiaolanz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xiaolanz/subscriptions","organizations_url":"https://api.github.com/users/xiaolanz/orgs","repos_url":"https://api.github.com/users/xiaolanz/repos","events_url":"https://api.github.com/users/xiaolanz/events{/privacy}","received_events_url":"https://api.github.com/users/xiaolanz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/xiaolanz/mixer","description":"Istio's Mixer and its adapters","fork":true,"url":"https://api.github.com/repos/xiaolanz/mixer","forks_url":"https://api.github.com/repos/xiaolanz/mixer/forks","keys_url":"https://api.github.com/repos/xiaolanz/mixer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xiaolanz/mixer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xiaolanz/mixer/teams","hooks_url":"https://api.github.com/repos/xiaolanz/mixer/hooks","issue_events_url":"https://api.github.com/repos/xiaolanz/mixer/issues/events{/number}","events_url":"https://api.github.com/repos/xiaolanz/mixer/events","assignees_url":"https://api.github.com/repos/xiaolanz/mixer/assignees{/user}","branches_url":"https://api.github.com/repos/xiaolanz/mixer/branches{/branch}","tags_url":"https://api.github.com/repos/xiaolanz/mixer/tags","blobs_url":"https://api.github.com/repos/xiaolanz/mixer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xiaolanz/mixer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xiaolanz/mixer/git/refs{/sha}","trees_url":"https://api.github.com/repos/xiaolanz/mixer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xiaolanz/mixer/statuses/{sha}","languages_url":"https://api.github.com/repos/xiaolanz/mixer/languages","stargazers_url":"https://api.github.com/repos/xiaolanz/mixer/stargazers","contributors_url":"https://api.github.com/repos/xiaolanz/mixer/contributors","subscribers_url":"https://api.github.com/repos/xiaolanz/mixer/subscribers","subscription_url":"https://api.github.com/repos/xiaolanz/mixer/subscription","commits_url":"https://api.github.com/repos/xiaolanz/mixer/commits{/sha}","git_commits_url":"https://api.github.com/repos/xiaolanz/mixer/git/commits{/sha}","comments_url":"https://api.github.com/repos/xiaolanz/mixer/comments{/number}","issue_comment_url":"https://api.github.com/repos/xiaolanz/mixer/issues/comments{/number}","contents_url":"https://api.github.com/repos/xiaolanz/mixer/contents/{+path}","compare_url":"https://api.github.com/repos/xiaolanz/mixer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xiaolanz/mixer/merges","archive_url":"https://api.github.com/repos/xiaolanz/mixer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xiaolanz/mixer/downloads","issues_url":"https://api.github.com/repos/xiaolanz/mixer/issues{/number}","pulls_url":"https://api.github.com/repos/xiaolanz/mixer/pulls{/number}","milestones_url":"https://api.github.com/repos/xiaolanz/mixer/milestones{/number}","notifications_url":"https://api.github.com/repos/xiaolanz/mixer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xiaolanz/mixer/labels{/name}","releases_url":"https://api.github.com/repos/xiaolanz/mixer/releases{/id}","deployments_url":"https://api.github.com/repos/xiaolanz/mixer/deployments","created_at":"2017-05-24T16:02:50Z","updated_at":"2017-05-24T16:02:52Z","pushed_at":"2017-07-11T20:29:44Z","git_url":"git://github.com/xiaolanz/mixer.git","ssh_url":"git@github.com:xiaolanz/mixer.git","clone_url":"https://github.com/xiaolanz/mixer.git","svn_url":"https://github.com/xiaolanz/mixer","homepage":"","size":13868,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"client"}},"base":{"label":"istio:master","ref":"master","sha":"4f3bb0f8cfb21fc9aea4350c84282aafc0d494f3","user":{"login":"istio","id":23534644,"avatar_url":"https://avatars2.githubusercontent.com/u/23534644?v=3","gravatar_id":"","url":"https://api.github.com/users/istio","html_url":"https://github.com/istio","followers_url":"https://api.github.com/users/istio/followers","following_url":"https://api.github.com/users/istio/following{/other_user}","gists_url":"https://api.github.com/users/istio/gists{/gist_id}","starred_url":"https://api.github.com/users/istio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/istio/subscriptions","organizations_url":"https://api.github.com/users/istio/orgs","repos_url":"https://api.github.com/users/istio/repos","events_url":"https://api.github.com/users/istio/events{/privacy}","received_events_url":"https://api.github.com/users/istio/received_events","type":"Organization","site_admin":false},"repo":{"id":74177509,"name":"mixer","full_name":"istio/mixer","owner":{"login":"istio","id":23534644,"avatar_url":"https://avatars2.githubusercontent.com/u/23534644?v=3","gravatar_id":"","url":"https://api.github.com/users/istio","html_url":"https://github.com/istio","followers_url":"https://api.github.com/users/istio/followers","following_url":"https://api.github.com/users/istio/following{/other_user}","gists_url":"https://api.github.com/users/istio/gists{/gist_id}","starred_url":"https://api.github.com/users/istio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/istio/subscriptions","organizations_url":"https://api.github.com/users/istio/orgs","repos_url":"https://api.github.com/users/istio/repos","events_url":"https://api.github.com/users/istio/events{/privacy}","received_events_url":"https://api.github.com/users/istio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/istio/mixer","description":"Istio's Mixer and its adapters","fork":false,"url":"https://api.github.com/repos/istio/mixer","forks_url":"https://api.github.com/repos/istio/mixer/forks","keys_url":"https://api.github.com/repos/istio/mixer/keys{/key_id}","collaborators_url":"https://api.github.com/repos/istio/mixer/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/istio/mixer/teams","hooks_url":"https://api.github.com/repos/istio/mixer/hooks","issue_events_url":"https://api.github.com/repos/istio/mixer/issues/events{/number}","events_url":"https://api.github.com/repos/istio/mixer/events","assignees_url":"https://api.github.com/repos/istio/mixer/assignees{/user}","branches_url":"https://api.github.com/repos/istio/mixer/branches{/branch}","tags_url":"https://api.github.com/repos/istio/mixer/tags","blobs_url":"https://api.github.com/repos/istio/mixer/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/istio/mixer/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/istio/mixer/git/refs{/sha}","trees_url":"https://api.github.com/repos/istio/mixer/git/trees{/sha}","statuses_url":"https://api.github.com/repos/istio/mixer/statuses/{sha}","languages_url":"https://api.github.com/repos/istio/mixer/languages","stargazers_url":"https://api.github.com/repos/istio/mixer/stargazers","contributors_url":"https://api.github.com/repos/istio/mixer/contributors","subscribers_url":"https://api.github.com/repos/istio/mixer/subscribers","subscription_url":"https://api.github.com/repos/istio/mixer/subscription","commits_url":"https://api.github.com/repos/istio/mixer/commits{/sha}","git_commits_url":"https://api.github.com/repos/istio/mixer/git/commits{/sha}","comments_url":"https://api.github.com/repos/istio/mixer/comments{/number}","issue_comment_url":"https://api.github.com/repos/istio/mixer/issues/comments{/number}","contents_url":"https://api.github.com/repos/istio/mixer/contents/{+path}","compare_url":"https://api.github.com/repos/istio/mixer/compare/{base}...{head}","merges_url":"https://api.github.com/repos/istio/mixer/merges","archive_url":"https://api.github.com/repos/istio/mixer/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/istio/mixer/downloads","issues_url":"https://api.github.com/repos/istio/mixer/issues{/number}","pulls_url":"https://api.github.com/repos/istio/mixer/pulls{/number}","milestones_url":"https://api.github.com/repos/istio/mixer/milestones{/number}","notifications_url":"https://api.github.com/repos/istio/mixer/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/istio/mixer/labels{/name}","releases_url":"https://api.github.com/repos/istio/mixer/releases{/id}","deployments_url":"https://api.github.com/repos/istio/mixer/deployments","created_at":"2016-11-19T00:40:17Z","updated_at":"2017-06-22T16:47:25Z","pushed_at":"2017-07-11T20:55:21Z","git_url":"git://github.com/istio/mixer.git","ssh_url":"git@github.com:istio/mixer.git","clone_url":"https://github.com/istio/mixer.git","svn_url":"https://github.com/istio/mixer","homepage":"","size":15068,"stargazers_count":46,"watchers_count":46,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":50,"mirror_url":null,"open_issues_count":121,"forks":50,"open_issues":121,"watchers":46,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/istio/mixer/pulls/890"},"html":{"href":"https://github.com/istio/mixer/pull/890"},"issue":{"href":"https://api.github.com/repos/istio/mixer/issues/890"},"comments":{"href":"https://api.github.com/repos/istio/mixer/issues/890/comments"},"review_comments":{"href":"https://api.github.com/repos/istio/mixer/pulls/890/comments"},"review_comment":{"href":"https://api.github.com/repos/istio/mixer/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/istio/mixer/pulls/890/commits"},"statuses":{"href":"https://api.github.com/repos/istio/mixer/statuses/dbcd36c1263643e02e93787a62b17d2c76721609"}}}}
{"actor":{"display_login":"douglas-reid"}}