{"action":"created","comment":{"url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/comments/232704979","pull_request_review_id":173959509,"id":232704979,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMjcwNDk3OQ==","diff_hunk":"@@ -0,0 +1,276 @@\n+package clusterinfo\n+\n+import (\n+\t\"context\"\n+\t\"encoding/json\"\n+\t\"errors\"\n+\t\"fmt\"\n+\t\"net/http\"\n+\t\"net/url\"\n+\t\"path\"\n+\t\"time\"\n+\n+\t\"github.com/go-kit/kit/log\"\n+\t\"github.com/go-kit/kit/log/level\"\n+\t\"github.com/prometheus/client_golang/prometheus\"\n+)\n+\n+const (\n+\tnamespace = \"elasticsearch\"\n+\tsubsystem = \"custerinfo\"\n+)\n+\n+var (\n+\t// ErrConsumerAlreadyRegistered is returned if a consumer is already registered\n+\tErrConsumerAlreadyRegistered = errors.New(\"consumer already registered\")\n+\t// ErrInitialCallTimeout is returned if the initial clusterinfo call timed out\n+\tErrInitialCallTimeout = errors.New(\"initial cluster info call timed out\")\n+\tinitialTimeout        = 10 * time.Second\n+)\n+\n+type consumer interface {\n+\t// ClusterLabelUpdates returns a pointer to channel for cluster label updates\n+\tClusterLabelUpdates() *chan *Response\n+\t// String implements the stringer interface\n+\tString() string\n+}\n+\n+// Retriever periodically gets the cluster info from the / endpoint end\n+// sends it to all registered consumer channels\n+type Retriever struct {\n+\tconsumerChannels      map[string]*chan *Response\n+\tlogger                log.Logger\n+\tclient                *http.Client\n+\turl                   *url.URL\n+\tinterval              time.Duration\n+\tsync                  chan struct{}\n+\tversionMetric         *prometheus.GaugeVec\n+\tup                    *prometheus.GaugeVec\n+\tlastUpstreamSuccessTs *prometheus.GaugeVec\n+\tlastUpstreamErrorTs   *prometheus.GaugeVec\n+}\n+\n+// New creates a new Retriever\n+func New(logger log.Logger, client *http.Client, u *url.URL, interval time.Duration) *Retriever {\n+\treturn &Retriever{\n+\t\tconsumerChannels: make(map[string]*chan *Response),\n+\t\tlogger:           logger,\n+\t\tclient:           client,\n+\t\turl:              u,\n+\t\tinterval:         interval,\n+\t\tsync:             make(chan struct{}, 1),\n+\t\tversionMetric: prometheus.NewGaugeVec(\n+\t\t\tprometheus.GaugeOpts{\n+\t\t\t\tName: prometheus.BuildFQName(namespace, subsystem, \"version_info\"),\n+\t\t\t\tHelp: \"Constant metric with ES version information as labels\",\n+\t\t\t},\n+\t\t\t[]string{\n+\t\t\t\t\"cluster\",\n+\t\t\t\t\"cluster_uuid\",\n+\t\t\t\t\"build_date\",\n+\t\t\t\t\"build_hash\",\n+\t\t\t\t\"version\",\n+\t\t\t\t\"lucene_version\",\n+\t\t\t},\n+\t\t),\n+\t\tup: prometheus.NewGaugeVec(\n+\t\t\tprometheus.GaugeOpts{\n+\t\t\t\tName: prometheus.BuildFQName(namespace, subsystem, \"up\"),\n+\t\t\t\tHelp: \"Up metric for the cluster info collector\",\n+\t\t\t},\n+\t\t\t[]string{\"url\"},\n+\t\t),\n+\t\tlastUpstreamSuccessTs: prometheus.NewGaugeVec(\n+\t\t\tprometheus.GaugeOpts{\n+\t\t\t\tName: prometheus.BuildFQName(namespace, subsystem, \"last_retrieval_success_ts\"),\n+\t\t\t\tHelp: \"Timestamp of the last successful cluster info retrieval\",\n+\t\t\t},\n+\t\t\t[]string{\"url\"},\n+\t\t),\n+\t\tlastUpstreamErrorTs: prometheus.NewGaugeVec(\n+\t\t\tprometheus.GaugeOpts{\n+\t\t\t\tName: prometheus.BuildFQName(namespace, subsystem, \"last_retrieval_failure_ts\"),\n+\t\t\t\tHelp: \"Timestamp of the last failed cluster info retrieval\",\n+\t\t\t},\n+\t\t\t[]string{\"url\"},\n+\t\t),\n+\t}\n+}\n+\n+// Describe implements the prometheus.Collector interface\n+func (r *Retriever) Describe(ch chan<- *prometheus.Desc) {\n+\tr.versionMetric.Describe(ch)\n+\tr.up.Describe(ch)\n+\tr.lastUpstreamSuccessTs.Describe(ch)\n+\tr.lastUpstreamErrorTs.Describe(ch)\n+}\n+\n+// Collect implements the prometheus.Collector interface\n+func (r *Retriever) Collect(ch chan<- prometheus.Metric) {\n+\tr.versionMetric.Collect(ch)\n+\tr.up.Collect(ch)\n+\tr.lastUpstreamSuccessTs.Collect(ch)\n+\tr.lastUpstreamErrorTs.Collect(ch)\n+}\n+\n+func (r *Retriever) updateMetrics(res *Response) {\n+\tlevel.Debug(r.logger).Log(\"msg\", \"updating cluster info metrics\")\n+\t// scrape failed, response is nil\n+\tif res == nil {\n+\t\tr.up.WithLabelValues(r.url.String()).Set(0.0)\n+\t\tr.lastUpstreamErrorTs.WithLabelValues(r.url.String()).Set(float64(time.Now().Unix()))\n+\t\treturn\n+\t}\n+\tr.up.WithLabelValues(r.url.String()).Set(1.0)\n+\tr.versionMetric.WithLabelValues(\n+\t\tres.ClusterName,\n+\t\tres.ClusterUUID,\n+\t\tres.Version.BuildDate.String(),\n+\t\tres.Version.BuildHash,\n+\t\tres.Version.Number.String(),\n+\t\tres.Version.LuceneVersion.String(),\n+\t)\n+\tr.lastUpstreamSuccessTs.WithLabelValues(r.url.String()).Set(float64(time.Now().Unix()))\n+}\n+\n+// Update triggers an external cluster info label update\n+func (r *Retriever) Update() {\n+\tr.sync <- struct{}{}\n+}\n+\n+// RegisterConsumer registers a consumer for cluster info updates\n+func (r *Retriever) RegisterConsumer(c consumer) error {\n+\tif _, registered := r.consumerChannels[c.String()]; registered {\n+\t\treturn ErrConsumerAlreadyRegistered\n+\t}\n+\tr.consumerChannels[c.String()] = c.ClusterLabelUpdates()\n+\treturn nil\n+}\n+\n+// Run starts the update loop and periodically queries the / endpoint\n+// The update loop is terminated upon ctx cancellation. The call blocks until the first\n+// call to the cluster info endpoint was successful\n+func (r *Retriever) Run(ctx context.Context) error {\n+\tstartupComplete := make(chan struct{})\n+\t// start update routine\n+\tgo func(ctx context.Context) {\n+\t\tfor {\n+\t\t\tselect {\n+\t\t\tcase <-ctx.Done():\n+\t\t\t\t_ = level.Info(r.logger).Log(\n+\t\t\t\t\t\"msg\", \"context cancelled, exiting cluster info update loop\",\n+\t\t\t\t\t\"err\", ctx.Err(),\n+\t\t\t\t)\n+\t\t\t\treturn\n+\t\t\tcase <-r.sync:\n+\t\t\t\t_ = level.Info(r.logger).Log(\n+\t\t\t\t\t\"msg\", \"providing consumers with updated cluster info label\",\n+\t\t\t\t)\n+\t\t\t\tres, err := r.fetchAndDecodeClusterInfo()\n+\t\t\t\tif err != nil {\n+\t\t\t\t\t_ = level.Error(r.logger).Log(\n+\t\t\t\t\t\t\"msg\", \"failed to retrieve cluster info from ES\",\n+\t\t\t\t\t\t\"err\", err,\n+\t\t\t\t\t)\n+\t\t\t\t\tr.updateMetrics(nil)\n+\t\t\t\t\tcontinue\n+\t\t\t\t}\n+\t\t\t\tr.updateMetrics(res)\n+\t\t\t\tfor name, consumerCh := range r.consumerChannels {\n+\t\t\t\t\t_ = level.Debug(r.logger).Log(\n+\t\t\t\t\t\t\"msg\", \"sending update\",\n+\t\t\t\t\t\t\"consumer\", name,\n+\t\t\t\t\t\t\"res\", fmt.Sprintf(\"%+v\", res),\n+\t\t\t\t\t)\n+\t\t\t\t\t*consumerCh <- res\n+\t\t\t\t}\n+\t\t\t\t// close startupComplete if not already closed\n+\t\t\t\tselect {\n+\t\t\t\tcase <-startupComplete:\n+\t\t\t\tdefault:\n+\t\t\t\t\tclose(startupComplete)\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t}(ctx)\n+\t// trigger initial cluster info call\n+\t_ = level.Info(r.logger).Log(\n+\t\t\"msg\", \"triggering initial cluster info call\",\n+\t)\n+\tr.sync <- struct{}{}\n+\n+\t// start a ticker routine\n+\tgo func(ctx context.Context) {\n+\t\tif r.interval <= 0 {\n+\t\t\t_ = level.Info(r.logger).Log(\n+\t\t\t\t\"msg\", \"no periodic cluster info label update requested\",\n+\t\t\t)\n+\t\t\treturn\n+\t\t}\n+\t\tticker := time.NewTicker(r.interval)\n+\t\tfor {\n+\t\t\tselect {\n+\t\t\tcase <-ctx.Done():\n+\t\t\t\t_ = level.Info(r.logger).Log(\n+\t\t\t\t\t\"msg\", \"context cancelled, exiting cluster info trigger loop\",\n+\t\t\t\t\t\"err\", ctx.Err(),\n+\t\t\t\t)\n+\t\t\t\treturn\n+\t\t\tcase <-ticker.C:\n+\t\t\t\t_ = level.Debug(r.logger).Log(\n+\t\t\t\t\t\"msg\", \"triggering periodic update\",\n+\t\t\t\t)\n+\t\t\t\tr.sync <- struct{}{}\n+\t\t\t}\n+\t\t}\n+\t}(ctx)\n+\n+\t// block until the first retrieval was successful\n+\tselect {\n+\tcase <-startupComplete:\n+\t\t// first sync has been successful\n+\t\tlevel.Debug(r.logger).Log(\"msg\", \"initial clusterinfo sync succeeded\")\n+\t\treturn nil\n+\tcase <-time.After(initialTimeout):\n+\t\t// initial call timed out\n+\t\treturn ErrInitialCallTimeout\n+\tcase <-ctx.Done():\n+\t\t// context cancelled\n+\t\treturn nil\n+\t}\n+}\n+\n+func (r *Retriever) fetchAndDecodeClusterInfo() (*Response, error) {\n+\tvar response *Response\n+\tu := *r.url\n+\tu.Path = path.Join(r.url.Path, \"/\")\n+\n+\tres, err := r.client.Get(u.String())\n+\tif err != nil {\n+\t\t_ = level.Error(r.logger).Log(\n+\t\t\t\"msg\", \"failed to get cluster info\",\n+\t\t\t\"err\", err,\n+\t\t)\n+\t\treturn nil, err\n+\t}\n+\n+\tdefer func() {","path":"pkg/clusterinfo/clusterinfo.go","position":257,"original_position":257,"commit_id":"8f035e33eaa038a3e8149b4a6843997d4d2b8eb8","original_commit_id":"d373cc093be547a2325aede56df11e73c4181faa","user":{"login":"zwopir","id":6094838,"node_id":"MDQ6VXNlcjYwOTQ4Mzg=","avatar_url":"https://avatars1.githubusercontent.com/u/6094838?v=4","gravatar_id":"","url":"https://api.github.com/users/zwopir","html_url":"https://github.com/zwopir","followers_url":"https://api.github.com/users/zwopir/followers","following_url":"https://api.github.com/users/zwopir/following{/other_user}","gists_url":"https://api.github.com/users/zwopir/gists{/gist_id}","starred_url":"https://api.github.com/users/zwopir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zwopir/subscriptions","organizations_url":"https://api.github.com/users/zwopir/orgs","repos_url":"https://api.github.com/users/zwopir/repos","events_url":"https://api.github.com/users/zwopir/events{/privacy}","received_events_url":"https://api.github.com/users/zwopir/received_events","type":"User","site_admin":false},"body":"yes, I totally agree. This clumsy construction is a victim of the newly introduced errcheck, which I consider as useful most of the time. I already had quite some \"sh*t, errcheck and logging don't like each other\", so I'm consider ditching errcheck again. Thoughts are welcome...","created_at":"2018-11-12T15:37:56Z","updated_at":"2018-11-12T15:37:56Z","html_url":"https://github.com/justwatchcom/elasticsearch_exporter/pull/176#discussion_r232704979","pull_request_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/comments/232704979"},"html":{"href":"https://github.com/justwatchcom/elasticsearch_exporter/pull/176#discussion_r232704979"},"pull_request":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176"}},"in_reply_to_id":232702796},"pull_request":{"url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176","id":209326392,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5MzI2Mzky","html_url":"https://github.com/justwatchcom/elasticsearch_exporter/pull/176","diff_url":"https://github.com/justwatchcom/elasticsearch_exporter/pull/176.diff","patch_url":"https://github.com/justwatchcom/elasticsearch_exporter/pull/176.patch","issue_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/176","number":176,"state":"open","locked":false,"title":"add cluster label retriever","user":{"login":"zwopir","id":6094838,"node_id":"MDQ6VXNlcjYwOTQ4Mzg=","avatar_url":"https://avatars1.githubusercontent.com/u/6094838?v=4","gravatar_id":"","url":"https://api.github.com/users/zwopir","html_url":"https://github.com/zwopir","followers_url":"https://api.github.com/users/zwopir/followers","following_url":"https://api.github.com/users/zwopir/following{/other_user}","gists_url":"https://api.github.com/users/zwopir/gists{/gist_id}","starred_url":"https://api.github.com/users/zwopir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zwopir/subscriptions","organizations_url":"https://api.github.com/users/zwopir/orgs","repos_url":"https://api.github.com/users/zwopir/repos","events_url":"https://api.github.com/users/zwopir/events{/privacy}","received_events_url":"https://api.github.com/users/zwopir/received_events","type":"User","site_admin":false},"body":"this is a work in progress PR to add common labels to all collectors. Not ready to merge, feedback welcome.","created_at":"2018-08-18T19:14:59Z","updated_at":"2018-11-12T15:37:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1636db8f7f6d1358fa7439208e3ef246862b500a","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176/commits","review_comments_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176/comments","review_comment_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/comments{/number}","comments_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/176/comments","statuses_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/statuses/8f035e33eaa038a3e8149b4a6843997d4d2b8eb8","head":{"label":"justwatchcom:feature/common_label_retriever","ref":"feature/common_label_retriever","sha":"8f035e33eaa038a3e8149b4a6843997d4d2b8eb8","user":{"login":"justwatchcom","id":10371543,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMzcxNTQz","avatar_url":"https://avatars2.githubusercontent.com/u/10371543?v=4","gravatar_id":"","url":"https://api.github.com/users/justwatchcom","html_url":"https://github.com/justwatchcom","followers_url":"https://api.github.com/users/justwatchcom/followers","following_url":"https://api.github.com/users/justwatchcom/following{/other_user}","gists_url":"https://api.github.com/users/justwatchcom/gists{/gist_id}","starred_url":"https://api.github.com/users/justwatchcom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justwatchcom/subscriptions","organizations_url":"https://api.github.com/users/justwatchcom/orgs","repos_url":"https://api.github.com/users/justwatchcom/repos","events_url":"https://api.github.com/users/justwatchcom/events{/privacy}","received_events_url":"https://api.github.com/users/justwatchcom/received_events","type":"Organization","site_admin":false},"repo":{"id":33446875,"node_id":"MDEwOlJlcG9zaXRvcnkzMzQ0Njg3NQ==","name":"elasticsearch_exporter","full_name":"justwatchcom/elasticsearch_exporter","private":false,"owner":{"login":"justwatchcom","id":10371543,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMzcxNTQz","avatar_url":"https://avatars2.githubusercontent.com/u/10371543?v=4","gravatar_id":"","url":"https://api.github.com/users/justwatchcom","html_url":"https://github.com/justwatchcom","followers_url":"https://api.github.com/users/justwatchcom/followers","following_url":"https://api.github.com/users/justwatchcom/following{/other_user}","gists_url":"https://api.github.com/users/justwatchcom/gists{/gist_id}","starred_url":"https://api.github.com/users/justwatchcom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justwatchcom/subscriptions","organizations_url":"https://api.github.com/users/justwatchcom/orgs","repos_url":"https://api.github.com/users/justwatchcom/repos","events_url":"https://api.github.com/users/justwatchcom/events{/privacy}","received_events_url":"https://api.github.com/users/justwatchcom/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/justwatchcom/elasticsearch_exporter","description":"Elasticsearch stats exporter for Prometheus","fork":false,"url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter","forks_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/forks","keys_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/teams","hooks_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/hooks","issue_events_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/events{/number}","events_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/events","assignees_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/assignees{/user}","branches_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/branches{/branch}","tags_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/tags","blobs_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/refs{/sha}","trees_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/statuses/{sha}","languages_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/languages","stargazers_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/stargazers","contributors_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/contributors","subscribers_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/subscribers","subscription_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/subscription","commits_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/commits{/sha}","git_commits_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/commits{/sha}","comments_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/comments{/number}","issue_comment_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/comments{/number}","contents_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/contents/{+path}","compare_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/merges","archive_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/downloads","issues_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues{/number}","pulls_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls{/number}","milestones_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/milestones{/number}","notifications_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/labels{/name}","releases_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/releases{/id}","deployments_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/deployments","created_at":"2015-04-05T16:21:18Z","updated_at":"2018-11-10T10:12:34Z","pushed_at":"2018-11-12T15:32:09Z","git_url":"git://github.com/justwatchcom/elasticsearch_exporter.git","ssh_url":"git@github.com:justwatchcom/elasticsearch_exporter.git","clone_url":"https://github.com/justwatchcom/elasticsearch_exporter.git","svn_url":"https://github.com/justwatchcom/elasticsearch_exporter","homepage":null,"size":537,"stargazers_count":413,"watchers_count":413,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":200,"mirror_url":null,"archived":false,"open_issues_count":9,"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":200,"open_issues":9,"watchers":413,"default_branch":"master"}},"base":{"label":"justwatchcom:master","ref":"master","sha":"aea932377a0225d31a13986022f93711873dc44e","user":{"login":"justwatchcom","id":10371543,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMzcxNTQz","avatar_url":"https://avatars2.githubusercontent.com/u/10371543?v=4","gravatar_id":"","url":"https://api.github.com/users/justwatchcom","html_url":"https://github.com/justwatchcom","followers_url":"https://api.github.com/users/justwatchcom/followers","following_url":"https://api.github.com/users/justwatchcom/following{/other_user}","gists_url":"https://api.github.com/users/justwatchcom/gists{/gist_id}","starred_url":"https://api.github.com/users/justwatchcom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justwatchcom/subscriptions","organizations_url":"https://api.github.com/users/justwatchcom/orgs","repos_url":"https://api.github.com/users/justwatchcom/repos","events_url":"https://api.github.com/users/justwatchcom/events{/privacy}","received_events_url":"https://api.github.com/users/justwatchcom/received_events","type":"Organization","site_admin":false},"repo":{"id":33446875,"node_id":"MDEwOlJlcG9zaXRvcnkzMzQ0Njg3NQ==","name":"elasticsearch_exporter","full_name":"justwatchcom/elasticsearch_exporter","private":false,"owner":{"login":"justwatchcom","id":10371543,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwMzcxNTQz","avatar_url":"https://avatars2.githubusercontent.com/u/10371543?v=4","gravatar_id":"","url":"https://api.github.com/users/justwatchcom","html_url":"https://github.com/justwatchcom","followers_url":"https://api.github.com/users/justwatchcom/followers","following_url":"https://api.github.com/users/justwatchcom/following{/other_user}","gists_url":"https://api.github.com/users/justwatchcom/gists{/gist_id}","starred_url":"https://api.github.com/users/justwatchcom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justwatchcom/subscriptions","organizations_url":"https://api.github.com/users/justwatchcom/orgs","repos_url":"https://api.github.com/users/justwatchcom/repos","events_url":"https://api.github.com/users/justwatchcom/events{/privacy}","received_events_url":"https://api.github.com/users/justwatchcom/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/justwatchcom/elasticsearch_exporter","description":"Elasticsearch stats exporter for Prometheus","fork":false,"url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter","forks_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/forks","keys_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/teams","hooks_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/hooks","issue_events_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/events{/number}","events_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/events","assignees_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/assignees{/user}","branches_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/branches{/branch}","tags_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/tags","blobs_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/refs{/sha}","trees_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/statuses/{sha}","languages_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/languages","stargazers_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/stargazers","contributors_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/contributors","subscribers_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/subscribers","subscription_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/subscription","commits_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/commits{/sha}","git_commits_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/git/commits{/sha}","comments_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/comments{/number}","issue_comment_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/comments{/number}","contents_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/contents/{+path}","compare_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/merges","archive_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/downloads","issues_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues{/number}","pulls_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls{/number}","milestones_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/milestones{/number}","notifications_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/labels{/name}","releases_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/releases{/id}","deployments_url":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/deployments","created_at":"2015-04-05T16:21:18Z","updated_at":"2018-11-10T10:12:34Z","pushed_at":"2018-11-12T15:32:09Z","git_url":"git://github.com/justwatchcom/elasticsearch_exporter.git","ssh_url":"git@github.com:justwatchcom/elasticsearch_exporter.git","clone_url":"https://github.com/justwatchcom/elasticsearch_exporter.git","svn_url":"https://github.com/justwatchcom/elasticsearch_exporter","homepage":null,"size":537,"stargazers_count":413,"watchers_count":413,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":200,"mirror_url":null,"archived":false,"open_issues_count":9,"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":200,"open_issues":9,"watchers":413,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176"},"html":{"href":"https://github.com/justwatchcom/elasticsearch_exporter/pull/176"},"issue":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/176"},"comments":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/issues/176/comments"},"review_comments":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176/comments"},"review_comment":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/pulls/176/commits"},"statuses":{"href":"https://api.github.com/repos/justwatchcom/elasticsearch_exporter/statuses/8f035e33eaa038a3e8149b4a6843997d4d2b8eb8"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"zwopir"}}