{"action":"created","comment":{"url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/comments/33477548","id":33477548,"diff_hunk":"@@ -0,0 +1,262 @@\n+# encoding: utf-8\n+require \"logstash/namespace\"\n+require \"logstash/outputs/base\"\n+require \"stud/buffer\"\n+\n+# Summary: Plugin to send logstash events to to files in HDFS via webhdfs \n+# restapi.  \n+#\n+# This plugin only has a mandatory dependency on the webhdfs gem from \n+# Kazuki Ohta and TAGOMORI Satoshi (@see: https://github.com/kzk/webhdfs).\n+# Optional dependencies are zlib and snappy gem. \n+# No jars from hadoop are needed, thus reducing configuration and compatibility\n+# problems.\n+#\n+# If you get an error like:\n+#\n+#     Max write retries reached. Exception: initialize: name or service not known {:level=>:error}\n+#\n+# make sure, that the hostname of your namenode is resolvable on the host running logstash. When creating/appending\n+# to a file, webhdfs somtime sends a 307 TEMPORARY_REDIRECT with the HOSTNAME of the machine its running on.\n+#\n+# USAGE:\n+# This is an example of logstash config:\n+#\n+# [source,ruby]\n+# ----------------------------------\n+# input {\n+#   ...\n+# }\n+# filter {\n+#   ...\n+# }\n+# output {\n+#   webhdfs {\n+#     server => \"127.0.0.1:50070\"         # (required)\n+#     path => \"/user/logstash/dt=%{+YYYY-MM-dd}/logstash-%{+HH}.log\"  # (required)\n+#     user => \"hue\"                       # (required)\n+#   }\n+# }\n+# ----------------------------------\n+#\n+# Author: Bjoern Puttmann <b.puttmann@dbap.de> - dbap GmbH, Münster, Germany.\n+\n+class LogStash::Outputs::WebHdfs < LogStash::Outputs::Base\n+  include Stud::Buffer\n+\n+  config_name \"webhdfs\"\n+  milestone 1\n+\n+  MAGIC = \"\\x82SNAPPY\\x0\".force_encoding Encoding::ASCII_8BIT\n+  DEFAULT_VERSION = 1\n+  MINIMUM_COMPATIBLE_VERSION = 1\n+\n+  # The server name for webhdfs/httpfs connections.\n+  config :host, :validate => :string, :required => true\n+\n+  # The server port for webhdfs/httpfs connections.\n+  config :port, :validate => :number, :default => 50070\n+\n+  # The Username for webhdfs.\n+  config :user, :validate => :string, :required => true\n+\n+  # The path to the file to write to. Event fields can be used here,\n+  # as well as date fields in the joda time format, e.g.:\n+  # ....\n+  #     \"/user/logstash/dt=%{+YYYY-MM-dd}/%{@source_host}-%{+HH}.log\"\n+  # ....\n+  config :path, :validate => :string, :required => true\n+\n+  # The format to use when writing events to the file. This value\n+  # supports any string and can include %{name} and other dynamic\n+  # strings.\n+  #\n+  # If this setting is omitted, the full json representation of the\n+  # event will be written as a single line.\n+  config :message_format, :validate => :string\n+\n+  # Sending data to webhdfs in x seconds intervals.\n+  config :idle_flush_time, :validate => :number, :default => 1\n+\n+  # Sending data to webhdfs if event count is above, even if store_interval_in_secs is not reached.\n+  config :flush_size, :validate => :number, :default => 500\n+\n+  # WebHdfs open timeout, default 30s.\n+  config :open_timeout, :validate => :number, :default => 30\n+\n+  # The WebHdfs read timeout, default 30s.\n+  config :read_timeout, :validate => :number, :default => 30\n+\n+  # Use httpfs mode if set to true, else webhdfs.\n+  config :use_httpfs, :validate => :boolean, :default => false\n+\n+  # Retry some known webhdfs errors. These may be caused by race conditions when appending to same file, etc.\n+  config :retry_known_errors, :validate => :boolean, :default => true\n+\n+  # How long should we wait between retries.\n+  config :retry_interval, :validate => :number, :default => 0.5\n+\n+  # How many times should we retry. If retry_times is exceeded, an error will be logged and the event will be discarded.\n+  config :retry_times, :validate => :number, :default => 5\n+\n+  # Compress output. One of ['none', 'snappy', 'gzip']\n+  config :compression, :validate => [\"none\", \"snappy\", \"gzip\"], :default => \"none\"\n+\n+  # Set snappy chunksize. Only neccessary for stream format. Defaults to 32k. Max is 65536\n+  # @see http://code.google.com/p/snappy/source/browse/trunk/framing_format.txt\n+  config :snappy_bufsize, :validate => :number, :default => 32768\n+\n+  # Set snappy format. One of \"stream\", \"file\". Set to stream to be hive compatible.\n+  config :snappy_format, :validate => [\"stream\", \"file\"], :default => \"stream\"\n+\n+  def load_module(module_name)\n+    begin\n+      require module_name\n+    rescue LoadError\n+      @logger.error(\"Module #{module_name} could not be loaded.\")\n+      raise\n+    end\n+  end\n+\n+  public\n+  def register\n+    load_module('webhdfs')\n+    if @compression == \"gzip\"\n+      load_module('zlib')\n+    elsif @compression == \"snappy\"\n+      load_module('snappy')\n+    end\n+    @files = {}\n+    @client = prepare_client(@host, @port, @user)\n+    # Test client connection.\n+    begin\n+      @client.list('/')\n+    rescue => e\n+      @logger.error(\"Webhdfs check request failed. (namenode: #{@client.host}:#{@client.port}, Exception: #{e.message})\")\n+      raise\n+    end\n+    buffer_initialize(\n+      :max_items => @flush_size,\n+      :max_interval => @idle_flush_time,\n+      :logger => @logger\n+    )\n+  end # def register\n+\n+  public\n+  def receive(event)\n+    return unless output?(event)\n+    buffer_receive(event)\n+  end # def receive\n+\n+  def prepare_client(host, port, username)\n+    client = WebHDFS::Client.new(host, port, username)\n+    client.httpfs_mode = @use_httpfs\n+    client.open_timeout = @open_timeout\n+    client.read_timeout = @read_timeout\n+    client.retry_known_errors = @retry_known_errors\n+    client.retry_interval = @retry_interval if @retry_interval\n+    client.retry_times = @retry_times if @retry_times\n+    client\n+  end\n+\n+  def flush(events=nil, teardown=false)\n+    return if not events\n+    newline = \"\\n\"\n+    output_files = Hash.new { |hash, key| hash[key] = \"\" }\n+    events.collect do |event|\n+      path = event.sprintf(@path)\n+      if @message_format\n+        event_as_string = event.sprintf(@message_format)\n+      else\n+        event_as_string = event.to_json\n+      end\n+      event_as_string += newline unless event_as_string.end_with? newline\n+      output_files[path] << event_as_string\n+    end\n+    output_files.each do |path, output|\n+      if @compression == \"gzip\"\n+        path += \".gz\"\n+        output = compress_gzip(output)\n+      elsif @compression == \"snappy\"\n+        path += \".snappy\"\n+        if @snappy_format == \"file\"\n+          output = compress_snappy_file(output)\n+        elsif\n+          output = compress_snappy_stream(output)\n+        end\n+      end\n+      write_data(path, output)\n+    end\n+  end\n+\n+  def compress_gzip(data)\n+    buffer = StringIO.new('','w')\n+    compressor = Zlib::GzipWriter.new(buffer)\n+    begin\n+      compressor.write(data)\n+    ensure\n+      compressor.close()\n+    end\n+    buffer.string\n+  end\n+\n+  def compress_snappy_file(data)\n+    # Encode data to ASCII_8BIT (binary)\n+    data= data.encode(Encoding::ASCII_8BIT, \"binary\", :undef => :replace)\n+    buffer = StringIO.new('', 'w')\n+    buffer.set_encoding(Encoding::ASCII_8BIT)\n+    compressed = Snappy.deflate(data)\n+    buffer << [compressed.size, compressed].pack(\"Na*\")\n+    buffer.string\n+  end\n+\n+  def compress_snappy_stream(data)\n+    # Encode data to ASCII_8BIT (binary)\n+    data= data.encode(Encoding::ASCII_8BIT, \"binary\", :undef => :replace)\n+    buffer = StringIO.new\n+    buffer.set_encoding(Encoding::ASCII_8BIT)\n+    chunks = data.scan(/.{1,#{@snappy_bufsize}}/m)\n+    chunks.each do |chunk|\n+      compressed = Snappy.deflate(chunk)\n+      buffer << [chunk.size, compressed.size, compressed].pack(\"NNa*\")\n+    end\n+    return buffer.string\n+  end\n+\n+  def get_snappy_header!\n+    [MAGIC, DEFAULT_VERSION, MINIMUM_COMPATIBLE_VERSION].pack(\"a8NN\")\n+  end\n+\n+  def write_data(path, data)\n+    # Retry max_retry times. This can solve problems like leases being hold by another process. Sadly this is no\n+    # KNOWN_ERROR in rubys webhdfs client.\n+    write_tries = 0\n+    begin\n+      # Try to append to already existing file, which will work most of the times.\n+      @client.append(path, data)\n+    # File does not exist, so create it.\n+    rescue WebHDFS::FileNotFoundError\n+      # Add snappy header if format is \"file\".\n+      if @compression == \"snappy\" and @snappy_format == \"file\"\n+        @client.create(path, get_snappy_header! + data)\n+      elsif\n+        @client.create(path, data)\n+      end\n+    # Handle other write errors and retry to write max. @retry_times.\n+    rescue => e\n+      if write_tries < @retry_times\n+        @logger.warn(\"webhdfs write caused an exception: #{e.message}. Maybe you should increase retry_interval or reduce number of workers. Retrying...\")\n+        sleep(@retry_interval * write_tries)","path":"lib/logstash/outputs/webhdfs.rb","position":249,"original_position":249,"commit_id":"3f5028a4da4257c70a6ab3cb7048755e6ea01ec6","original_commit_id":"3f5028a4da4257c70a6ab3cb7048755e6ea01ec6","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":"It looks like there's a rubygem for this: [retries](https://github.com/ooyala/retries)","created_at":"2015-06-29T15:43:22Z","updated_at":"2015-06-29T15:43:22Z","html_url":"https://github.com/logstash-plugins/logstash-output-webhdfs/pull/1#discussion_r33477548","pull_request_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/comments/33477548"},"html":{"href":"https://github.com/logstash-plugins/logstash-output-webhdfs/pull/1#discussion_r33477548"},"pull_request":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1","id":36413900,"html_url":"https://github.com/logstash-plugins/logstash-output-webhdfs/pull/1","diff_url":"https://github.com/logstash-plugins/logstash-output-webhdfs/pull/1.diff","patch_url":"https://github.com/logstash-plugins/logstash-output-webhdfs/pull/1.patch","issue_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/issues/1","number":1,"state":"open","locked":false,"title":"Webhdfs output plugin","user":{"login":"dstore-dbap","id":4869673,"avatar_url":"https://avatars.githubusercontent.com/u/4869673?v=3","gravatar_id":"","url":"https://api.github.com/users/dstore-dbap","html_url":"https://github.com/dstore-dbap","followers_url":"https://api.github.com/users/dstore-dbap/followers","following_url":"https://api.github.com/users/dstore-dbap/following{/other_user}","gists_url":"https://api.github.com/users/dstore-dbap/gists{/gist_id}","starred_url":"https://api.github.com/users/dstore-dbap/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dstore-dbap/subscriptions","organizations_url":"https://api.github.com/users/dstore-dbap/orgs","repos_url":"https://api.github.com/users/dstore-dbap/repos","events_url":"https://api.github.com/users/dstore-dbap/events{/privacy}","received_events_url":"https://api.github.com/users/dstore-dbap/received_events","type":"User","site_admin":false},"body":"PR as discussed in https://github.com/elastic/logstash/issues/3274.","created_at":"2015-05-28T14:42:53Z","updated_at":"2015-06-29T15:43:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9acc15e1e195132902176c12931527b360066a6b","assignee":{"login":"purbon","id":68540,"avatar_url":"https://avatars.githubusercontent.com/u/68540?v=3","gravatar_id":"","url":"https://api.github.com/users/purbon","html_url":"https://github.com/purbon","followers_url":"https://api.github.com/users/purbon/followers","following_url":"https://api.github.com/users/purbon/following{/other_user}","gists_url":"https://api.github.com/users/purbon/gists{/gist_id}","starred_url":"https://api.github.com/users/purbon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/purbon/subscriptions","organizations_url":"https://api.github.com/users/purbon/orgs","repos_url":"https://api.github.com/users/purbon/repos","events_url":"https://api.github.com/users/purbon/events{/privacy}","received_events_url":"https://api.github.com/users/purbon/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1/commits","review_comments_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1/comments","review_comment_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/issues/1/comments","statuses_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/statuses/3f5028a4da4257c70a6ab3cb7048755e6ea01ec6","head":{"label":"dstore-dbap:master","ref":"master","sha":"3f5028a4da4257c70a6ab3cb7048755e6ea01ec6","user":{"login":"dstore-dbap","id":4869673,"avatar_url":"https://avatars.githubusercontent.com/u/4869673?v=3","gravatar_id":"","url":"https://api.github.com/users/dstore-dbap","html_url":"https://github.com/dstore-dbap","followers_url":"https://api.github.com/users/dstore-dbap/followers","following_url":"https://api.github.com/users/dstore-dbap/following{/other_user}","gists_url":"https://api.github.com/users/dstore-dbap/gists{/gist_id}","starred_url":"https://api.github.com/users/dstore-dbap/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dstore-dbap/subscriptions","organizations_url":"https://api.github.com/users/dstore-dbap/orgs","repos_url":"https://api.github.com/users/dstore-dbap/repos","events_url":"https://api.github.com/users/dstore-dbap/events{/privacy}","received_events_url":"https://api.github.com/users/dstore-dbap/received_events","type":"User","site_admin":false},"repo":{"id":36442662,"name":"logstash-output-webhdfs-1","full_name":"dstore-dbap/logstash-output-webhdfs-1","owner":{"login":"dstore-dbap","id":4869673,"avatar_url":"https://avatars.githubusercontent.com/u/4869673?v=3","gravatar_id":"","url":"https://api.github.com/users/dstore-dbap","html_url":"https://github.com/dstore-dbap","followers_url":"https://api.github.com/users/dstore-dbap/followers","following_url":"https://api.github.com/users/dstore-dbap/following{/other_user}","gists_url":"https://api.github.com/users/dstore-dbap/gists{/gist_id}","starred_url":"https://api.github.com/users/dstore-dbap/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dstore-dbap/subscriptions","organizations_url":"https://api.github.com/users/dstore-dbap/orgs","repos_url":"https://api.github.com/users/dstore-dbap/repos","events_url":"https://api.github.com/users/dstore-dbap/events{/privacy}","received_events_url":"https://api.github.com/users/dstore-dbap/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dstore-dbap/logstash-output-webhdfs-1","description":"Web hdfs output for logstash","fork":true,"url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1","forks_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/forks","keys_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/teams","hooks_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/hooks","issue_events_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/issues/events{/number}","events_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/events","assignees_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/assignees{/user}","branches_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/branches{/branch}","tags_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/tags","blobs_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/statuses/{sha}","languages_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/languages","stargazers_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/stargazers","contributors_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/contributors","subscribers_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/subscribers","subscription_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/subscription","commits_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/contents/{+path}","compare_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/merges","archive_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/downloads","issues_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/issues{/number}","pulls_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/pulls{/number}","milestones_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/milestones{/number}","notifications_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/labels{/name}","releases_url":"https://api.github.com/repos/dstore-dbap/logstash-output-webhdfs-1/releases{/id}","created_at":"2015-05-28T14:08:16Z","updated_at":"2015-05-28T14:25:35Z","pushed_at":"2015-06-23T10:51:44Z","git_url":"git://github.com/dstore-dbap/logstash-output-webhdfs-1.git","ssh_url":"git@github.com:dstore-dbap/logstash-output-webhdfs-1.git","clone_url":"https://github.com/dstore-dbap/logstash-output-webhdfs-1.git","svn_url":"https://github.com/dstore-dbap/logstash-output-webhdfs-1","homepage":null,"size":111,"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":"3680c40a8e25bb1148abd5c33fe8ba52f77253ff","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":36437314,"name":"logstash-output-webhdfs","full_name":"logstash-plugins/logstash-output-webhdfs","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-webhdfs","description":"Web hdfs output for logstash","fork":false,"url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs","forks_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/forks","keys_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/teams","hooks_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/hooks","issue_events_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/issues/events{/number}","events_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/events","assignees_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/assignees{/user}","branches_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/branches{/branch}","tags_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/tags","blobs_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/git/refs{/sha}","trees_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/statuses/{sha}","languages_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/languages","stargazers_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/stargazers","contributors_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/contributors","subscribers_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/subscribers","subscription_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/subscription","commits_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/commits{/sha}","git_commits_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/git/commits{/sha}","comments_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/comments{/number}","issue_comment_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/issues/comments{/number}","contents_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/contents/{+path}","compare_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/merges","archive_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/downloads","issues_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/issues{/number}","pulls_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls{/number}","milestones_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/milestones{/number}","notifications_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/labels{/name}","releases_url":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/releases{/id}","created_at":"2015-05-28T12:37:32Z","updated_at":"2015-05-28T12:37:32Z","pushed_at":"2015-06-23T10:51:44Z","git_url":"git://github.com/logstash-plugins/logstash-output-webhdfs.git","ssh_url":"git@github.com:logstash-plugins/logstash-output-webhdfs.git","clone_url":"https://github.com/logstash-plugins/logstash-output-webhdfs.git","svn_url":"https://github.com/logstash-plugins/logstash-output-webhdfs","homepage":null,"size":220,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1"},"html":{"href":"https://github.com/logstash-plugins/logstash-output-webhdfs/pull/1"},"issue":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/issues/1"},"comments":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/logstash-plugins/logstash-output-webhdfs/statuses/3f5028a4da4257c70a6ab3cb7048755e6ea01ec6"}}}}