{"action":"created","comment":{"url":"https://api.github.com/repos/kubernetes/heapster/pulls/comments/51814648","id":51814648,"diff_hunk":"@@ -0,0 +1,342 @@\n+// Copyright 2016 Google Inc. All Rights Reserved.\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 kubelet\n+\n+import (\n+\t\"fmt\"\n+\t\"math\"\n+\t\"time\"\n+\n+\t. \"k8s.io/heapster/metrics/core\"\n+\n+\t\"github.com/golang/glog\"\n+\t\"github.com/prometheus/client_golang/prometheus\"\n+\t\"k8s.io/kubernetes/pkg/kubelet/server/stats\"\n+)\n+\n+var (\n+\tsummaryRequestLatency = prometheus.NewSummaryVec(\n+\t\tprometheus.SummaryOpts{\n+\t\t\tNamespace: \"heapster\",\n+\t\t\tSubsystem: \"kubelet_summary\",\n+\t\t\tName:      \"request_duration_microseconds\",\n+\t\t\tHelp:      \"The Kubelet summary request latencies in microseconds.\",\n+\t\t},\n+\t\t[]string{\"node\"},\n+\t)\n+)\n+\n+func init() {\n+\tprometheus.MustRegister(summaryRequestLatency)\n+}\n+\n+// Kubelet-provided metrics for pod and system container.\n+type summaryMetricsSource struct {\n+\t*kubeletMetricsSource\n+\n+\t// Whether this node requires the fall-back source.\n+\tuseFallback bool\n+}\n+\n+func NewSummaryMetricsSource(kubelet *kubeletMetricsSource) MetricsSource {\n+\treturn &summaryMetricsSource{kubelet, false}\n+}\n+\n+func (this *summaryMetricsSource) Name() string {\n+\treturn this.String()\n+}\n+\n+func (this *summaryMetricsSource) String() string {\n+\treturn fmt.Sprintf(\"kubelet_summary:%s:%d\", this.host.IP, this.host.Port)\n+}\n+\n+func (this *summaryMetricsSource) ScrapeMetrics(start, end time.Time) *DataBatch {\n+\tif this.useFallback {\n+\t\treturn this.kubeletMetricsSource.ScrapeMetrics(start, end)\n+\t}\n+\n+\tresult := &DataBatch{\n+\t\tTimestamp:  end,\n+\t\tMetricSets: map[string]*MetricSet{},\n+\t}\n+\n+\tsummary, err := func() (*stats.Summary, error) {\n+\t\tstartTime := time.Now()\n+\t\tdefer kubeletRequestLatency.WithLabelValues(this.hostname).Observe(float64(time.Since(startTime)))\n+\t\treturn this.kubeletClient.GetSummary(this.host)\n+\t}()\n+\n+\tif err != nil {\n+\t\tif IsNotFoundError(err) {\n+\t\t\tglog.Warningf(\"Summary not found, using fallback: %v\", err)\n+\t\t\tthis.useFallback = true\n+\t\t\treturn this.kubeletMetricsSource.ScrapeMetrics(start, end)\n+\t\t}\n+\t\tglog.Errorf(\"error while getting metrics summary from Kubelet: %v\", err)\n+\t\treturn result\n+\t}\n+\n+\tresult.MetricSets = this.decodeSummary(summary)\n+\n+\treturn result\n+}\n+\n+const (\n+\tRootFsKey = \"/\"\n+\tLogsKey   = \"logs\"\n+)\n+\n+// decodeSummary translates the kubelet stats.Summary API into the flattened heapster MetricSet API.\n+func (this *summaryMetricsSource) decodeSummary(summary *stats.Summary) map[string]*MetricSet {\n+\tresult := map[string]*MetricSet{}\n+\n+\tlabels := map[string]string{\n+\t\tLabelNodename.Key: this.nodename,\n+\t\tLabelHostname.Key: this.hostname,\n+\t\tLabelHostID.Key:   this.hostId,\n+\t}\n+\n+\tthis.decodeNodeStats(result, labels, &summary.Node)\n+\tfor _, pod := range summary.Pods {\n+\t\tthis.decodePodStats(result, labels, &pod)\n+\t}\n+\n+\treturn result\n+}\n+\n+// Convenience method for labels deep copy.\n+func (this *summaryMetricsSource) cloneLabels(labels map[string]string) map[string]string {\n+\tclone := make(map[string]string, len(labels))\n+\tfor k, v := range labels {\n+\t\tclone[k] = v\n+\t}\n+\treturn clone\n+}\n+\n+func (this *summaryMetricsSource) decodeNodeStats(metrics map[string]*MetricSet, labels map[string]string, node *stats.NodeStats) {\n+\tnodeMetrics := &MetricSet{\n+\t\tLabels:         this.cloneLabels(labels),\n+\t\tMetricValues:   map[string]MetricValue{},\n+\t\tLabeledMetrics: []LabeledMetric{},\n+\t}\n+\tnodeMetrics.Labels[LabelMetricSetType.Key] = MetricSetTypeNode\n+\n+\tstartTime := node.StartTime.Time\n+\tthis.decodeUptime(nodeMetrics, startTime)\n+\tthis.decodeCPUStats(nodeMetrics, node.CPU, startTime)\n+\tthis.decodeMemoryStats(nodeMetrics, node.Memory, startTime)\n+\tthis.decodeNetworkStats(nodeMetrics, node.Network, startTime)\n+\tthis.decodeFsStats(nodeMetrics, RootFsKey, node.Fs)\n+\tmetrics[NodeKey(node.NodeName)] = nodeMetrics\n+\n+\tfor _, container := range node.SystemContainers {\n+\t\tkey := NodeContainerKey(node.NodeName, container.Name)\n+\t\tcontainerMetrics := this.decodeContainerStats(labels, &container)\n+\t\tcontainerMetrics.Labels[LabelMetricSetType.Key] = MetricSetTypeSystemContainer\n+\t\tmetrics[key] = containerMetrics\n+\t}\n+}\n+\n+func (this *summaryMetricsSource) decodePodStats(metrics map[string]*MetricSet, nodeLabels map[string]string, pod *stats.PodStats) {\n+\tpodMetrics := &MetricSet{\n+\t\tLabels:         this.cloneLabels(nodeLabels),\n+\t\tMetricValues:   map[string]MetricValue{},\n+\t\tLabeledMetrics: []LabeledMetric{},\n+\t}\n+\tref := pod.PodRef\n+\tpodMetrics.Labels[LabelMetricSetType.Key] = MetricSetTypePod\n+\tpodMetrics.Labels[LabelPodId.Key] = ref.UID\n+\tpodMetrics.Labels[LabelPodName.Key] = ref.Name\n+\tpodMetrics.Labels[LabelNamespaceName.Key] = ref.Namespace\n+\t// Needed for backward compatibility\n+\tpodMetrics.Labels[LabelPodNamespace.Key] = ref.Namespace\n+\n+\tstartTime := pod.StartTime.Time\n+\tthis.decodeUptime(podMetrics, startTime)\n+\tthis.decodeNetworkStats(podMetrics, pod.Network, startTime)\n+\tfor _, vol := range pod.VolumeStats {\n+\t\tthis.decodeFsStats(podMetrics, vol.Name, &vol.FsStats)","path":"metrics/sources/kubelet/summary.go","position":null,"original_position":170,"commit_id":"adcdc69d61de38db28dfd96b2177a179d9096756","original_commit_id":"3e9c1f5f18d8bc896c3d3cfbf5f2efaf36d8cbb2","user":{"login":"timstclair","id":3272040,"avatar_url":"https://avatars.githubusercontent.com/u/3272040?v=3","gravatar_id":"","url":"https://api.github.com/users/timstclair","html_url":"https://github.com/timstclair","followers_url":"https://api.github.com/users/timstclair/followers","following_url":"https://api.github.com/users/timstclair/following{/other_user}","gists_url":"https://api.github.com/users/timstclair/gists{/gist_id}","starred_url":"https://api.github.com/users/timstclair/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timstclair/subscriptions","organizations_url":"https://api.github.com/users/timstclair/orgs","repos_url":"https://api.github.com/users/timstclair/repos","events_url":"https://api.github.com/users/timstclair/events{/privacy}","received_events_url":"https://api.github.com/users/timstclair/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2016-02-04T00:56:26Z","updated_at":"2016-02-04T00:56:26Z","html_url":"https://github.com/kubernetes/heapster/pull/927#discussion_r51814648","pull_request_url":"https://api.github.com/repos/kubernetes/heapster/pulls/927","_links":{"self":{"href":"https://api.github.com/repos/kubernetes/heapster/pulls/comments/51814648"},"html":{"href":"https://github.com/kubernetes/heapster/pull/927#discussion_r51814648"},"pull_request":{"href":"https://api.github.com/repos/kubernetes/heapster/pulls/927"}}},"pull_request":{"url":"https://api.github.com/repos/kubernetes/heapster/pulls/927","id":57931065,"html_url":"https://github.com/kubernetes/heapster/pull/927","diff_url":"https://github.com/kubernetes/heapster/pull/927.diff","patch_url":"https://github.com/kubernetes/heapster/pull/927.patch","issue_url":"https://api.github.com/repos/kubernetes/heapster/issues/927","number":927,"state":"open","locked":false,"title":"[WIP] summary metrics parsing","user":{"login":"timstclair","id":3272040,"avatar_url":"https://avatars.githubusercontent.com/u/3272040?v=3","gravatar_id":"","url":"https://api.github.com/users/timstclair","html_url":"https://github.com/timstclair","followers_url":"https://api.github.com/users/timstclair/followers","following_url":"https://api.github.com/users/timstclair/following{/other_user}","gists_url":"https://api.github.com/users/timstclair/gists{/gist_id}","starred_url":"https://api.github.com/users/timstclair/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timstclair/subscriptions","organizations_url":"https://api.github.com/users/timstclair/orgs","repos_url":"https://api.github.com/users/timstclair/repos","events_url":"https://api.github.com/users/timstclair/events{/privacy}","received_events_url":"https://api.github.com/users/timstclair/received_events","type":"User","site_admin":false},"body":"This is still a work in progress, but \"should\" be fully functional. Feel free to comment on what I have so far.\r\n\r\nRemaining work:\r\n- Testing (manual & unit)\r\n- Godeps battle (need `k8s.io/kubernetes/pkg/kubelet/server/stats/types.go`)\r\n\r\nFor: https://github.com/kubernetes/heapster/issues/907\r\n\r\n/cc @vishh @pwittrock ","created_at":"2016-02-02T02:11:26Z","updated_at":"2016-02-04T00:56:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"631a3418b106f3e8cd8e4e33a578ab4311f8e948","assignee":{"login":"mwielgus","id":11994812,"avatar_url":"https://avatars.githubusercontent.com/u/11994812?v=3","gravatar_id":"","url":"https://api.github.com/users/mwielgus","html_url":"https://github.com/mwielgus","followers_url":"https://api.github.com/users/mwielgus/followers","following_url":"https://api.github.com/users/mwielgus/following{/other_user}","gists_url":"https://api.github.com/users/mwielgus/gists{/gist_id}","starred_url":"https://api.github.com/users/mwielgus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mwielgus/subscriptions","organizations_url":"https://api.github.com/users/mwielgus/orgs","repos_url":"https://api.github.com/users/mwielgus/repos","events_url":"https://api.github.com/users/mwielgus/events{/privacy}","received_events_url":"https://api.github.com/users/mwielgus/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/kubernetes/heapster/milestones/4","html_url":"https://github.com/kubernetes/heapster/milestones/Kubernetes%201.2%20-%20simplifications","labels_url":"https://api.github.com/repos/kubernetes/heapster/milestones/4/labels","id":1308144,"number":4,"title":"Kubernetes 1.2 - simplifications","description":"The focus of Kubernetes 1.2 are simplification and stabilization efforts so the same should should be a priority for Heapster.","creator":{"login":"piosz","id":10819974,"avatar_url":"https://avatars.githubusercontent.com/u/10819974?v=3","gravatar_id":"","url":"https://api.github.com/users/piosz","html_url":"https://github.com/piosz","followers_url":"https://api.github.com/users/piosz/followers","following_url":"https://api.github.com/users/piosz/following{/other_user}","gists_url":"https://api.github.com/users/piosz/gists{/gist_id}","starred_url":"https://api.github.com/users/piosz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/piosz/subscriptions","organizations_url":"https://api.github.com/users/piosz/orgs","repos_url":"https://api.github.com/users/piosz/repos","events_url":"https://api.github.com/users/piosz/events{/privacy}","received_events_url":"https://api.github.com/users/piosz/received_events","type":"User","site_admin":false},"open_issues":14,"closed_issues":0,"state":"open","created_at":"2015-09-16T09:47:52Z","updated_at":"2016-02-03T22:01:27Z","due_on":"2015-12-30T23:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/kubernetes/heapster/pulls/927/commits","review_comments_url":"https://api.github.com/repos/kubernetes/heapster/pulls/927/comments","review_comment_url":"https://api.github.com/repos/kubernetes/heapster/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kubernetes/heapster/issues/927/comments","statuses_url":"https://api.github.com/repos/kubernetes/heapster/statuses/adcdc69d61de38db28dfd96b2177a179d9096756","head":{"label":"timstclair:summary-source","ref":"summary-source","sha":"adcdc69d61de38db28dfd96b2177a179d9096756","user":{"login":"timstclair","id":3272040,"avatar_url":"https://avatars.githubusercontent.com/u/3272040?v=3","gravatar_id":"","url":"https://api.github.com/users/timstclair","html_url":"https://github.com/timstclair","followers_url":"https://api.github.com/users/timstclair/followers","following_url":"https://api.github.com/users/timstclair/following{/other_user}","gists_url":"https://api.github.com/users/timstclair/gists{/gist_id}","starred_url":"https://api.github.com/users/timstclair/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timstclair/subscriptions","organizations_url":"https://api.github.com/users/timstclair/orgs","repos_url":"https://api.github.com/users/timstclair/repos","events_url":"https://api.github.com/users/timstclair/events{/privacy}","received_events_url":"https://api.github.com/users/timstclair/received_events","type":"User","site_admin":false},"repo":{"id":50537439,"name":"heapster","full_name":"timstclair/heapster","owner":{"login":"timstclair","id":3272040,"avatar_url":"https://avatars.githubusercontent.com/u/3272040?v=3","gravatar_id":"","url":"https://api.github.com/users/timstclair","html_url":"https://github.com/timstclair","followers_url":"https://api.github.com/users/timstclair/followers","following_url":"https://api.github.com/users/timstclair/following{/other_user}","gists_url":"https://api.github.com/users/timstclair/gists{/gist_id}","starred_url":"https://api.github.com/users/timstclair/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/timstclair/subscriptions","organizations_url":"https://api.github.com/users/timstclair/orgs","repos_url":"https://api.github.com/users/timstclair/repos","events_url":"https://api.github.com/users/timstclair/events{/privacy}","received_events_url":"https://api.github.com/users/timstclair/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/timstclair/heapster","description":"Compute Resource Usage Analysis and Monitoring of Container Clusters","fork":true,"url":"https://api.github.com/repos/timstclair/heapster","forks_url":"https://api.github.com/repos/timstclair/heapster/forks","keys_url":"https://api.github.com/repos/timstclair/heapster/keys{/key_id}","collaborators_url":"https://api.github.com/repos/timstclair/heapster/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/timstclair/heapster/teams","hooks_url":"https://api.github.com/repos/timstclair/heapster/hooks","issue_events_url":"https://api.github.com/repos/timstclair/heapster/issues/events{/number}","events_url":"https://api.github.com/repos/timstclair/heapster/events","assignees_url":"https://api.github.com/repos/timstclair/heapster/assignees{/user}","branches_url":"https://api.github.com/repos/timstclair/heapster/branches{/branch}","tags_url":"https://api.github.com/repos/timstclair/heapster/tags","blobs_url":"https://api.github.com/repos/timstclair/heapster/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/timstclair/heapster/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/timstclair/heapster/git/refs{/sha}","trees_url":"https://api.github.com/repos/timstclair/heapster/git/trees{/sha}","statuses_url":"https://api.github.com/repos/timstclair/heapster/statuses/{sha}","languages_url":"https://api.github.com/repos/timstclair/heapster/languages","stargazers_url":"https://api.github.com/repos/timstclair/heapster/stargazers","contributors_url":"https://api.github.com/repos/timstclair/heapster/contributors","subscribers_url":"https://api.github.com/repos/timstclair/heapster/subscribers","subscription_url":"https://api.github.com/repos/timstclair/heapster/subscription","commits_url":"https://api.github.com/repos/timstclair/heapster/commits{/sha}","git_commits_url":"https://api.github.com/repos/timstclair/heapster/git/commits{/sha}","comments_url":"https://api.github.com/repos/timstclair/heapster/comments{/number}","issue_comment_url":"https://api.github.com/repos/timstclair/heapster/issues/comments{/number}","contents_url":"https://api.github.com/repos/timstclair/heapster/contents/{+path}","compare_url":"https://api.github.com/repos/timstclair/heapster/compare/{base}...{head}","merges_url":"https://api.github.com/repos/timstclair/heapster/merges","archive_url":"https://api.github.com/repos/timstclair/heapster/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/timstclair/heapster/downloads","issues_url":"https://api.github.com/repos/timstclair/heapster/issues{/number}","pulls_url":"https://api.github.com/repos/timstclair/heapster/pulls{/number}","milestones_url":"https://api.github.com/repos/timstclair/heapster/milestones{/number}","notifications_url":"https://api.github.com/repos/timstclair/heapster/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/timstclair/heapster/labels{/name}","releases_url":"https://api.github.com/repos/timstclair/heapster/releases{/id}","deployments_url":"https://api.github.com/repos/timstclair/heapster/deployments","created_at":"2016-01-27T20:59:44Z","updated_at":"2016-01-27T20:59:45Z","pushed_at":"2016-02-04T00:55:49Z","git_url":"git://github.com/timstclair/heapster.git","ssh_url":"git@github.com:timstclair/heapster.git","clone_url":"https://github.com/timstclair/heapster.git","svn_url":"https://github.com/timstclair/heapster","homepage":"","size":23765,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"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":"master"}},"base":{"label":"kubernetes:heapster-scalability","ref":"heapster-scalability","sha":"8749afbc5b222206af4d62757357c297a8ca587e","user":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"repo":{"id":23272510,"name":"heapster","full_name":"kubernetes/heapster","owner":{"login":"kubernetes","id":13629408,"avatar_url":"https://avatars.githubusercontent.com/u/13629408?v=3","gravatar_id":"","url":"https://api.github.com/users/kubernetes","html_url":"https://github.com/kubernetes","followers_url":"https://api.github.com/users/kubernetes/followers","following_url":"https://api.github.com/users/kubernetes/following{/other_user}","gists_url":"https://api.github.com/users/kubernetes/gists{/gist_id}","starred_url":"https://api.github.com/users/kubernetes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kubernetes/subscriptions","organizations_url":"https://api.github.com/users/kubernetes/orgs","repos_url":"https://api.github.com/users/kubernetes/repos","events_url":"https://api.github.com/users/kubernetes/events{/privacy}","received_events_url":"https://api.github.com/users/kubernetes/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kubernetes/heapster","description":"Compute Resource Usage Analysis and Monitoring of Container Clusters","fork":false,"url":"https://api.github.com/repos/kubernetes/heapster","forks_url":"https://api.github.com/repos/kubernetes/heapster/forks","keys_url":"https://api.github.com/repos/kubernetes/heapster/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kubernetes/heapster/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kubernetes/heapster/teams","hooks_url":"https://api.github.com/repos/kubernetes/heapster/hooks","issue_events_url":"https://api.github.com/repos/kubernetes/heapster/issues/events{/number}","events_url":"https://api.github.com/repos/kubernetes/heapster/events","assignees_url":"https://api.github.com/repos/kubernetes/heapster/assignees{/user}","branches_url":"https://api.github.com/repos/kubernetes/heapster/branches{/branch}","tags_url":"https://api.github.com/repos/kubernetes/heapster/tags","blobs_url":"https://api.github.com/repos/kubernetes/heapster/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kubernetes/heapster/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kubernetes/heapster/git/refs{/sha}","trees_url":"https://api.github.com/repos/kubernetes/heapster/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kubernetes/heapster/statuses/{sha}","languages_url":"https://api.github.com/repos/kubernetes/heapster/languages","stargazers_url":"https://api.github.com/repos/kubernetes/heapster/stargazers","contributors_url":"https://api.github.com/repos/kubernetes/heapster/contributors","subscribers_url":"https://api.github.com/repos/kubernetes/heapster/subscribers","subscription_url":"https://api.github.com/repos/kubernetes/heapster/subscription","commits_url":"https://api.github.com/repos/kubernetes/heapster/commits{/sha}","git_commits_url":"https://api.github.com/repos/kubernetes/heapster/git/commits{/sha}","comments_url":"https://api.github.com/repos/kubernetes/heapster/comments{/number}","issue_comment_url":"https://api.github.com/repos/kubernetes/heapster/issues/comments{/number}","contents_url":"https://api.github.com/repos/kubernetes/heapster/contents/{+path}","compare_url":"https://api.github.com/repos/kubernetes/heapster/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kubernetes/heapster/merges","archive_url":"https://api.github.com/repos/kubernetes/heapster/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kubernetes/heapster/downloads","issues_url":"https://api.github.com/repos/kubernetes/heapster/issues{/number}","pulls_url":"https://api.github.com/repos/kubernetes/heapster/pulls{/number}","milestones_url":"https://api.github.com/repos/kubernetes/heapster/milestones{/number}","notifications_url":"https://api.github.com/repos/kubernetes/heapster/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kubernetes/heapster/labels{/name}","releases_url":"https://api.github.com/repos/kubernetes/heapster/releases{/id}","deployments_url":"https://api.github.com/repos/kubernetes/heapster/deployments","created_at":"2014-08-24T03:50:18Z","updated_at":"2016-02-03T19:35:41Z","pushed_at":"2016-02-04T00:55:49Z","git_url":"git://github.com/kubernetes/heapster.git","ssh_url":"git@github.com:kubernetes/heapster.git","clone_url":"https://github.com/kubernetes/heapster.git","svn_url":"https://github.com/kubernetes/heapster","homepage":"","size":24573,"stargazers_count":552,"watchers_count":552,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":168,"mirror_url":null,"open_issues_count":168,"forks":168,"open_issues":168,"watchers":552,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kubernetes/heapster/pulls/927"},"html":{"href":"https://github.com/kubernetes/heapster/pull/927"},"issue":{"href":"https://api.github.com/repos/kubernetes/heapster/issues/927"},"comments":{"href":"https://api.github.com/repos/kubernetes/heapster/issues/927/comments"},"review_comments":{"href":"https://api.github.com/repos/kubernetes/heapster/pulls/927/comments"},"review_comment":{"href":"https://api.github.com/repos/kubernetes/heapster/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kubernetes/heapster/pulls/927/commits"},"statuses":{"href":"https://api.github.com/repos/kubernetes/heapster/statuses/adcdc69d61de38db28dfd96b2177a179d9096756"}}}}