{"action":"created","comment":{"url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/comments/64115418","id":64115418,"diff_hunk":"@@ -0,0 +1,339 @@\n+module LogStash; module Outputs; class ElasticSearch; class HttpClient;\n+  class Pool\n+    class NoConnectionAvailableError < Error; end\n+    class HostUnreachableError < Error;\n+      attr_reader :original_error, :url\n+\n+      def initialize(original_error, url)\n+        @original_error = original_error\n+        @url = url\n+      end\n+\n+      def message\n+        \"[#{original_error.class}] #{original_error.message}\"\n+      end\n+    end\n+\n+    attr_reader :logger, :adapter, :sniffing, :sniffer_delay, :resurrect_delay, :auth, :healthcheck_path\n+\n+    DEFAULT_OPTIONS = {\n+      :healthcheck_path => '/'.freeze,\n+      :scheme => 'http',\n+      :resurrect_delay => 5,\n+      :auth => nil, # Can be set to {:user => 'user', :password => 'pass'}\n+      :sniffing => false,\n+      :sniffer_delay => 10,\n+    }.freeze\n+\n+    def initialize(logger, adapter, initial_urls=[], options={})\n+      @logger = logger\n+      @adapter = adapter\n+\n+      DEFAULT_OPTIONS.merge(options).tap do |merged|\n+        @healthcheck_path = merged[:healthcheck_path]\n+        @scheme = merged[:scheme]\n+        @resurrect_delay = merged[:resurrect_delay]\n+        @auth = merged[:auth]\n+        @sniffing = merged[:sniffing]\n+        @sniffer_delay = merged[:sniffer_delay]\n+      end\n+\n+      # Override the scheme if one is explicitly set in urls\n+      if initial_urls.any? {|u| u.scheme == 'https'} && @scheme == 'http'\n+        raise ArgumentError, \"HTTP was set as scheme, but an HTTPS URL was passed in!\"\n+      end\n+\n+      # Used for all concurrent operations in this class\n+      @state_mutex = Mutex.new\n+\n+      # Holds metadata about all URLs\n+      @url_info = {}\n+      @stopping = false\n+\n+      update_urls(initial_urls)\n+      start_resurrectionist\n+      start_sniffer if @sniffing\n+    end\n+\n+    def close\n+      @state_mutex.synchronize { @stopping = true }\n+\n+      logger.debug  \"Stopping sniffer\"\n+      stop_sniffer\n+\n+      logger.debug  \"Stopping resurrectionist\"\n+      stop_resurrectionist\n+\n+      logger.debug  \"Waiting for in use manticore connections\"\n+      wait_for_in_use_connections\n+\n+      logger.debug(\"Closing adapter #{@adapter}\")\n+      @adapter.close\n+    end\n+\n+    def wait_for_in_use_connections\n+      until in_use_connections.empty?\n+        logger.info \"Blocked on shutdown to in use connections #{@state_mutex.synchronize {@url_info}}\"\n+        sleep 1\n+      end\n+    end\n+\n+    def in_use_connections\n+      @state_mutex.synchronize { @url_info.values.select {|v| v[:in_use] > 0 } }\n+    end\n+\n+    def alive_urls_count\n+      @state_mutex.synchronize { @url_info.values.select {|v| !v[:dead] }.count }\n+    end\n+\n+    def url_info\n+      @state_mutex.synchronize { @url_info }\n+    end\n+\n+    def urls\n+      url_info.keys\n+    end\n+\n+    def until_stopped(task_name, delay)\n+      last_done = Time.now\n+      until @state_mutex.synchronize { @stopping }\n+        begin\n+          now = Time.now\n+          if (now - last_done) >= delay\n+            last_done = now\n+            yield\n+          end\n+          sleep 1\n+        rescue => e\n+          logger.warn(\n+            \"Error while performing #{task_name}\",\n+            :error_message => e.message,\n+            :class => e.class.name,\n+            :backtrace => e.backtrace\n+            )\n+        end\n+      end\n+    end\n+\n+    def start_sniffer\n+      @sniffer = Thread.new do\n+        until_stopped(\"sniffing\", sniffer_delay) { sniff! }\n+      end\n+    end\n+\n+    # Sniffs the cluster then updates the internal URLs\n+    def sniff!\n+      update_urls(check_sniff)\n+    end\n+\n+    ES1_SNIFF_RE_URL  = /\\[([^\\/]*)?\\/?([^:]*):([0-9]+)\\]/\n+    ES2_SNIFF_RE_URL  = /([^\\/]*)?\\/?([^:]*):([0-9]+)/\n+    # Sniffs and returns the results. Does not update internal URLs!\n+    def check_sniff\n+      resp = perform_request('GET', '_nodes')","path":"lib/logstash/outputs/elasticsearch/http_client/pool.rb","position":null,"original_position":133,"commit_id":"85ad40f5a7b719ba3448906aaaed439fbb80c317","original_commit_id":"c4a63f13a33badba14f4b499bae045fb773fe782","user":{"login":"andrewvc","id":131427,"avatar_url":"https://avatars.githubusercontent.com/u/131427?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewvc","html_url":"https://github.com/andrewvc","followers_url":"https://api.github.com/users/andrewvc/followers","following_url":"https://api.github.com/users/andrewvc/following{/other_user}","gists_url":"https://api.github.com/users/andrewvc/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewvc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewvc/subscriptions","organizations_url":"https://api.github.com/users/andrewvc/orgs","repos_url":"https://api.github.com/users/andrewvc/repos","events_url":"https://api.github.com/users/andrewvc/events{/privacy}","received_events_url":"https://api.github.com/users/andrewvc/received_events","type":"User","site_admin":false},"body":"Good call. It is now fixed :)","created_at":"2016-05-20T22:21:41Z","updated_at":"2016-05-20T22:21:41Z","html_url":"https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/390#discussion_r64115418","pull_request_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390","_links":{"self":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/comments/64115418"},"html":{"href":"https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/390#discussion_r64115418"},"pull_request":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390"}}},"pull_request":{"url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390","id":62453179,"html_url":"https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/390","diff_url":"https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/390.diff","patch_url":"https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/390.patch","issue_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/issues/390","number":390,"state":"open","locked":false,"title":"Threadsafety + Exponential Backoff","user":{"login":"andrewvc","id":131427,"avatar_url":"https://avatars.githubusercontent.com/u/131427?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewvc","html_url":"https://github.com/andrewvc","followers_url":"https://api.github.com/users/andrewvc/followers","following_url":"https://api.github.com/users/andrewvc/following{/other_user}","gists_url":"https://api.github.com/users/andrewvc/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewvc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewvc/subscriptions","organizations_url":"https://api.github.com/users/andrewvc/orgs","repos_url":"https://api.github.com/users/andrewvc/repos","events_url":"https://api.github.com/users/andrewvc/events{/privacy}","received_events_url":"https://api.github.com/users/andrewvc/received_events","type":"User","site_admin":false},"body":"Fixes \r\nhttps://github.com/logstash-plugins/logstash-output-elasticsearch/issues/377\r\nRequires elasticsearch-ruby from this branch: https://github.com/elastic/elasticsearch-ruby/pull/296\r\n\r\nThis moves the sniffer to the new one in the elasticsearch_ruby client and adds two new options for connection pooling and one for health checking. The new concept of health checks may break existing clusters where '/' is blocked for security. I'm not sure what the best approach here is since we do want a way to check if a cluster is up without interrupting regular execution flow.\r\n\r\nThe new `pool_max` and `max_per_route` options set max # of concurrent connections + the maximum concurrent connections to a given backend. The default values of 50 and 30 should be fine given that the new connection selector strategy tries to evenly spread connections across backends.\r\n\r\nThis also adds exponential backoff to connection retries with a ceiling of `retry_max_interval` which is the most time to wait between retries, and `retry_initial_interval` which is the initial amount of time to wait. `retry_initial_interval` will be increased exponentially between retries until a request succeeds.","created_at":"2016-03-10T20:46:51Z","updated_at":"2016-05-20T22:21:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fb583ff7c0e372e2e9991b5c597e5d950aeaa561","assignee":{"login":"jsvd","id":31809,"avatar_url":"https://avatars.githubusercontent.com/u/31809?v=3","gravatar_id":"","url":"https://api.github.com/users/jsvd","html_url":"https://github.com/jsvd","followers_url":"https://api.github.com/users/jsvd/followers","following_url":"https://api.github.com/users/jsvd/following{/other_user}","gists_url":"https://api.github.com/users/jsvd/gists{/gist_id}","starred_url":"https://api.github.com/users/jsvd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsvd/subscriptions","organizations_url":"https://api.github.com/users/jsvd/orgs","repos_url":"https://api.github.com/users/jsvd/repos","events_url":"https://api.github.com/users/jsvd/events{/privacy}","received_events_url":"https://api.github.com/users/jsvd/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390/commits","review_comments_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390/comments","review_comment_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/comments{/number}","comments_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/issues/390/comments","statuses_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/statuses/85ad40f5a7b719ba3448906aaaed439fbb80c317","head":{"label":"andrewvc:exponential-threadsafe","ref":"exponential-threadsafe","sha":"85ad40f5a7b719ba3448906aaaed439fbb80c317","user":{"login":"andrewvc","id":131427,"avatar_url":"https://avatars.githubusercontent.com/u/131427?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewvc","html_url":"https://github.com/andrewvc","followers_url":"https://api.github.com/users/andrewvc/followers","following_url":"https://api.github.com/users/andrewvc/following{/other_user}","gists_url":"https://api.github.com/users/andrewvc/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewvc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewvc/subscriptions","organizations_url":"https://api.github.com/users/andrewvc/orgs","repos_url":"https://api.github.com/users/andrewvc/repos","events_url":"https://api.github.com/users/andrewvc/events{/privacy}","received_events_url":"https://api.github.com/users/andrewvc/received_events","type":"User","site_admin":false},"repo":{"id":37491407,"name":"logstash-output-elasticsearch","full_name":"andrewvc/logstash-output-elasticsearch","owner":{"login":"andrewvc","id":131427,"avatar_url":"https://avatars.githubusercontent.com/u/131427?v=3","gravatar_id":"","url":"https://api.github.com/users/andrewvc","html_url":"https://github.com/andrewvc","followers_url":"https://api.github.com/users/andrewvc/followers","following_url":"https://api.github.com/users/andrewvc/following{/other_user}","gists_url":"https://api.github.com/users/andrewvc/gists{/gist_id}","starred_url":"https://api.github.com/users/andrewvc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andrewvc/subscriptions","organizations_url":"https://api.github.com/users/andrewvc/orgs","repos_url":"https://api.github.com/users/andrewvc/repos","events_url":"https://api.github.com/users/andrewvc/events{/privacy}","received_events_url":"https://api.github.com/users/andrewvc/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/andrewvc/logstash-output-elasticsearch","description":null,"fork":true,"url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch","forks_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/forks","keys_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/teams","hooks_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/hooks","issue_events_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/issues/events{/number}","events_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/events","assignees_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/assignees{/user}","branches_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/branches{/branch}","tags_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/tags","blobs_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/git/refs{/sha}","trees_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/statuses/{sha}","languages_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/languages","stargazers_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/stargazers","contributors_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/contributors","subscribers_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/subscribers","subscription_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/subscription","commits_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/commits{/sha}","git_commits_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/git/commits{/sha}","comments_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/comments{/number}","issue_comment_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/issues/comments{/number}","contents_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/contents/{+path}","compare_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/merges","archive_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/downloads","issues_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/issues{/number}","pulls_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/pulls{/number}","milestones_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/milestones{/number}","notifications_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/labels{/name}","releases_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/releases{/id}","deployments_url":"https://api.github.com/repos/andrewvc/logstash-output-elasticsearch/deployments","created_at":"2015-06-15T21:07:46Z","updated_at":"2015-06-15T21:07:46Z","pushed_at":"2016-05-20T22:19:58Z","git_url":"git://github.com/andrewvc/logstash-output-elasticsearch.git","ssh_url":"git@github.com:andrewvc/logstash-output-elasticsearch.git","clone_url":"https://github.com/andrewvc/logstash-output-elasticsearch.git","svn_url":"https://github.com/andrewvc/logstash-output-elasticsearch","homepage":null,"size":32608,"stargazers_count":0,"watchers_count":0,"language":"Ruby","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":"logstash-plugins:master","ref":"master","sha":"28b348dcc6bd2e9284290f07bc33a6fb1ee015bc","user":{"login":"logstash-plugins","id":8961934,"avatar_url":"https://avatars.githubusercontent.com/u/8961934?v=3","gravatar_id":"","url":"https://api.github.com/users/logstash-plugins","html_url":"https://github.com/logstash-plugins","followers_url":"https://api.github.com/users/logstash-plugins/followers","following_url":"https://api.github.com/users/logstash-plugins/following{/other_user}","gists_url":"https://api.github.com/users/logstash-plugins/gists{/gist_id}","starred_url":"https://api.github.com/users/logstash-plugins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/logstash-plugins/subscriptions","organizations_url":"https://api.github.com/users/logstash-plugins/orgs","repos_url":"https://api.github.com/users/logstash-plugins/repos","events_url":"https://api.github.com/users/logstash-plugins/events{/privacy}","received_events_url":"https://api.github.com/users/logstash-plugins/received_events","type":"Organization","site_admin":false},"repo":{"id":25476601,"name":"logstash-output-elasticsearch","full_name":"logstash-plugins/logstash-output-elasticsearch","owner":{"login":"logstash-plugins","id":8961934,"avatar_url":"https://avatars.githubusercontent.com/u/8961934?v=3","gravatar_id":"","url":"https://api.github.com/users/logstash-plugins","html_url":"https://github.com/logstash-plugins","followers_url":"https://api.github.com/users/logstash-plugins/followers","following_url":"https://api.github.com/users/logstash-plugins/following{/other_user}","gists_url":"https://api.github.com/users/logstash-plugins/gists{/gist_id}","starred_url":"https://api.github.com/users/logstash-plugins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/logstash-plugins/subscriptions","organizations_url":"https://api.github.com/users/logstash-plugins/orgs","repos_url":"https://api.github.com/users/logstash-plugins/repos","events_url":"https://api.github.com/users/logstash-plugins/events{/privacy}","received_events_url":"https://api.github.com/users/logstash-plugins/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/logstash-plugins/logstash-output-elasticsearch","description":"","fork":false,"url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch","forks_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/forks","keys_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/teams","hooks_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/hooks","issue_events_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/issues/events{/number}","events_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/events","assignees_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/assignees{/user}","branches_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/branches{/branch}","tags_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/tags","blobs_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/git/refs{/sha}","trees_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/statuses/{sha}","languages_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/languages","stargazers_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/stargazers","contributors_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/contributors","subscribers_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/subscribers","subscription_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/subscription","commits_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/commits{/sha}","git_commits_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/git/commits{/sha}","comments_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/comments{/number}","issue_comment_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/issues/comments{/number}","contents_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/contents/{+path}","compare_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/merges","archive_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/downloads","issues_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/issues{/number}","pulls_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls{/number}","milestones_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/milestones{/number}","notifications_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/labels{/name}","releases_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/releases{/id}","deployments_url":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/deployments","created_at":"2014-10-20T16:56:37Z","updated_at":"2016-05-16T05:58:57Z","pushed_at":"2016-05-20T22:19:58Z","git_url":"git://github.com/logstash-plugins/logstash-output-elasticsearch.git","ssh_url":"git@github.com:logstash-plugins/logstash-output-elasticsearch.git","clone_url":"https://github.com/logstash-plugins/logstash-output-elasticsearch.git","svn_url":"https://github.com/logstash-plugins/logstash-output-elasticsearch","homepage":"https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html","size":60634,"stargazers_count":52,"watchers_count":52,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":100,"mirror_url":null,"open_issues_count":104,"forks":100,"open_issues":104,"watchers":52,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390"},"html":{"href":"https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/390"},"issue":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/issues/390"},"comments":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/issues/390/comments"},"review_comments":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390/comments"},"review_comment":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/pulls/390/commits"},"statuses":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-elasticsearch/statuses/85ad40f5a7b719ba3448906aaaed439fbb80c317"}}}}
{"actor":{"display_login":"andrewvc"}}