{"action":"created","comment":{"url":"https://api.github.com/repos/apache/flume/pulls/comments/87476974","pull_request_review_id":8082120,"id":87476974,"diff_hunk":"@@ -0,0 +1,408 @@\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one\n+ * or more contributor license agreements.  See the NOTICE file\n+ * distributed with this work for additional information\n+ * regarding copyright ownership.  The ASF licenses this file\n+ * to you under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance\n+ * with the License.  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,\n+ * software distributed under the License is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+ * KIND, either express or implied.  See the License for the\n+ * specific language governing permissions and limitations\n+ * under the License.\n+ */\n+package org.apache.flume.sink.http;\n+\n+import com.google.common.collect.ImmutableMap;\n+import org.apache.flume.Channel;\n+import org.apache.flume.Context;\n+import org.apache.flume.Event;\n+import org.apache.flume.EventDeliveryException;\n+import org.apache.flume.Transaction;\n+import org.apache.flume.conf.Configurable;\n+import org.apache.flume.instrumentation.SinkCounter;\n+import org.apache.flume.sink.AbstractSink;\n+import org.apache.log4j.Logger;\n+\n+import java.io.IOException;\n+import java.io.OutputStream;\n+import java.net.HttpURLConnection;\n+import java.net.MalformedURLException;\n+import java.net.URL;\n+import java.util.HashMap;\n+import java.util.Map;\n+\n+/**\n+ * Implementation of an HTTP sink. Events are POSTed to an HTTP / HTTPS\n+ * endpoint. The error handling behaviour is configurable, and can respond\n+ * differently depending on the response status returned by the endpoint.\n+ *\n+ * Rollback of the Flume transaction, and backoff can be specified globally,\n+ * then overridden for ranges (or individual) status codes.\n+ */\n+public class HttpSink extends AbstractSink implements Configurable {\n+\n+  /** Class logger. */\n+  private static final Logger LOG = Logger.getLogger(HttpSink.class);\n+\n+  /** Lowest valid HTTP status code. */\n+  private static final int HTTP_STATUS_CONTINUE = 100;\n+\n+  /** Default setting for the connection timeout when calling endpoint. */\n+  private static final int DEFAULT_CONNECT_TIMEOUT = 5000;\n+\n+  /** Default setting for the request timeout when calling endpoint. */\n+  private static final int DEFAULT_REQUEST_TIMEOUT = 5000;\n+\n+  /** Default setting for the HTTP content type header. */\n+  private static final String DEFAULT_CONTENT_TYPE = \"text/plain\";\n+\n+  /** Default setting for the HTTP accept header. */\n+  private static final String DEFAULT_ACCEPT_HEADER = \"text/plain\";\n+\n+  /** Endpoint URL to POST events to. */\n+  private URL endpointUrl;\n+\n+  /** Counter used to monitor event throughput. */\n+  private SinkCounter sinkCounter;\n+\n+  /** Actual connection timeout value in use. */\n+  private int connectTimeout = DEFAULT_CONNECT_TIMEOUT;\n+\n+  /** Actual request timeout value in use. */\n+  private int requestTimeout = DEFAULT_REQUEST_TIMEOUT;\n+\n+  /** Actual content type header value in use. */\n+  private String contentTypeHeader = DEFAULT_CONTENT_TYPE;\n+\n+  /** Actual accept header value in use. */\n+  private String acceptHeader = DEFAULT_ACCEPT_HEADER;\n+\n+  /** Backoff value to use if a specific override is not defined. */\n+  private boolean defaultBackoff;\n+\n+  /** Rollback value to use if a specific override is not defined. */\n+  private boolean defaultRollback;\n+\n+  /** Increment metrics value to use if a specific override is not defined. */\n+  private boolean defaultIncrementMetrics;\n+\n+  /**\n+   * Holds all overrides for backoff. The key is a string of the format \"500\" or\n+   * \"5XX\", and the value is the backoff value to use for the individual code,\n+   * or code range.\n+   */\n+  private HashMap<String, Boolean> backoffOverrides = new HashMap<>();\n+\n+  /**\n+   * Holds all overrides for rollback. The key is a string of the format \"500\"\n+   * or \"5XX\", and the value is the rollback value to use for the individual\n+   * code, or code range.\n+   */\n+  private HashMap<String, Boolean> rollbackOverrides = new HashMap<>();\n+\n+  /**\n+   * Holds all overrides for increment metrics. The key is a string of the\n+   * format \"500\" or \"5XX\", and the value is the increment metrics value to use\n+   * for the individual code, or code range.\n+   */\n+  private HashMap<String, Boolean> incrementMetricsOverrides = new HashMap<>();\n+\n+  /** Used to create HTTP connections to the endpoint. */\n+  private ConnectionBuilder connectionBuilder;\n+\n+  @Override\n+  public final void configure(final Context context) {\n+    String configuredEndpoint = context.getString(\"endpoint\", \"\");\n+    LOG.info(\"Read endpoint URL from configuration : \" + configuredEndpoint);\n+\n+    try {\n+      endpointUrl = new URL(configuredEndpoint);\n+    } catch (MalformedURLException e) {\n+      throw new IllegalArgumentException(\"Endpoint URL invalid\", e);\n+    }\n+\n+    connectTimeout = context.getInteger(\"connectTimeout\",\n+        DEFAULT_CONNECT_TIMEOUT);\n+\n+    if (connectTimeout <= 0) {\n+      throw new IllegalArgumentException(\n+          \"Connect timeout must be a non-zero and positive\");\n+    }\n+    LOG.info(\"Using connect timeout : \" + connectTimeout);\n+\n+    requestTimeout = context.getInteger(\"requestTimeout\",\n+        DEFAULT_REQUEST_TIMEOUT);\n+\n+    if (requestTimeout <= 0) {\n+      throw new IllegalArgumentException(\n+          \"Request timeout must be a non-zero and positive\");\n+    }\n+    LOG.info(\"Using request timeout : \" + requestTimeout);\n+\n+    acceptHeader = context.getString(\"acceptHeader\", DEFAULT_ACCEPT_HEADER);\n+    LOG.info(\"Using Accept header value : \" + acceptHeader);\n+\n+    contentTypeHeader = context.getString(\"contentTypeHeader\",\n+        DEFAULT_CONTENT_TYPE);\n+    LOG.info(\"Using Content-Type header value : \" + contentTypeHeader);\n+\n+    defaultBackoff = context.getBoolean(\"defaultBackoff\", true);\n+    LOG.info(\"Channel backoff by default is \" + defaultBackoff);\n+\n+    defaultRollback = context.getBoolean(\"defaultRollback\", true);\n+    LOG.info(\"Transaction rollback by default is \" + defaultRollback);\n+\n+    defaultIncrementMetrics = context.getBoolean(\"defaultIncrementMetrics\",\n+        false);\n+    LOG.info(\"Incrementing metrics by default is \" + defaultIncrementMetrics);\n+\n+    parseConfigOverrides(\"backoff\", context, backoffOverrides);\n+    parseConfigOverrides(\"rollback\", context, rollbackOverrides);\n+    parseConfigOverrides(\"incrementMetrics\", context,\n+        incrementMetricsOverrides);\n+\n+    if (this.sinkCounter == null) {\n+      this.sinkCounter = new SinkCounter(this.getName());\n+    }\n+\n+    connectionBuilder = new ConnectionBuilder();\n+  }\n+\n+  @Override\n+  public final void start() {\n+    LOG.info(\"Starting HttpSink\");\n+    sinkCounter.start();\n+  }\n+\n+  @Override\n+  public final void stop() {\n+    LOG.info(\"Stopping HttpSink\");\n+    sinkCounter.stop();\n+  }\n+\n+  @Override\n+  public final Status process() throws EventDeliveryException {\n+    Status status = null;\n+    OutputStream outputStream = null;\n+\n+    Channel ch = getChannel();\n+    Transaction txn = ch.getTransaction();\n+    txn.begin();\n+\n+    try {\n+      Event event = ch.take();\n+\n+      byte[] eventBody = null;\n+      if (event != null) {\n+        eventBody = event.getBody();\n+      }\n+\n+      if (eventBody != null && eventBody.length > 0) {\n+        sinkCounter.incrementEventDrainAttemptCount();\n+        LOG.debug(\"Sending request : \" + new String(event.getBody()));\n+\n+        try {\n+          HttpURLConnection connection = connectionBuilder.getConnection();\n+\n+          outputStream = connection.getOutputStream();\n+          outputStream.write(eventBody);\n+          outputStream.flush();\n+          outputStream.close();\n+\n+          int httpStatusCode = connection.getResponseCode();\n+          LOG.debug(\"Got status code : \" + httpStatusCode);\n+\n+          connection.getInputStream().close();","path":"flume-ng-sinks/flume-http-sink/src/main/java/org/apache/flume/sink/http/HttpSink.java","position":221,"original_position":221,"commit_id":"f5b4d9a3d3d500cfded3f5a74944307e3fe82e05","original_commit_id":"f5b4d9a3d3d500cfded3f5a74944307e3fe82e05","user":{"login":"meou","id":1761525,"avatar_url":"https://avatars.githubusercontent.com/u/1761525?v=3","gravatar_id":"","url":"https://api.github.com/users/meou","html_url":"https://github.com/meou","followers_url":"https://api.github.com/users/meou/followers","following_url":"https://api.github.com/users/meou/following{/other_user}","gists_url":"https://api.github.com/users/meou/gists{/gist_id}","starred_url":"https://api.github.com/users/meou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meou/subscriptions","organizations_url":"https://api.github.com/users/meou/orgs","repos_url":"https://api.github.com/users/meou/repos","events_url":"https://api.github.com/users/meou/events{/privacy}","received_events_url":"https://api.github.com/users/meou/received_events","type":"User","site_admin":false},"body":"Just my 0.02, rather than create then close HttpURLConnection every time, could we try to re-use HttpURLConnection if the previous one is still good (or even keep it alive on purpose)?","created_at":"2016-11-10T20:17:38Z","updated_at":"2016-11-10T20:17:38Z","html_url":"https://github.com/apache/flume/pull/84#discussion_r87476974","pull_request_url":"https://api.github.com/repos/apache/flume/pulls/84","_links":{"self":{"href":"https://api.github.com/repos/apache/flume/pulls/comments/87476974"},"html":{"href":"https://github.com/apache/flume/pull/84#discussion_r87476974"},"pull_request":{"href":"https://api.github.com/repos/apache/flume/pulls/84"}}},"pull_request":{"url":"https://api.github.com/repos/apache/flume/pulls/84","id":92635879,"html_url":"https://github.com/apache/flume/pull/84","diff_url":"https://github.com/apache/flume/pull/84.diff","patch_url":"https://github.com/apache/flume/pull/84.patch","issue_url":"https://api.github.com/repos/apache/flume/issues/84","number":84,"state":"open","locked":false,"title":"Integrates an HTTP sink","user":{"login":"benwheeler","id":1751901,"avatar_url":"https://avatars.githubusercontent.com/u/1751901?v=3","gravatar_id":"","url":"https://api.github.com/users/benwheeler","html_url":"https://github.com/benwheeler","followers_url":"https://api.github.com/users/benwheeler/followers","following_url":"https://api.github.com/users/benwheeler/following{/other_user}","gists_url":"https://api.github.com/users/benwheeler/gists{/gist_id}","starred_url":"https://api.github.com/users/benwheeler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/benwheeler/subscriptions","organizations_url":"https://api.github.com/users/benwheeler/orgs","repos_url":"https://api.github.com/users/benwheeler/repos","events_url":"https://api.github.com/users/benwheeler/events{/privacy}","received_events_url":"https://api.github.com/users/benwheeler/received_events","type":"User","site_admin":false},"body":"Initial PR to implement an HTTP sink. Supports configurable backoff & retry for different HTTP status codes, and instrumentation.","created_at":"2016-11-07T18:17:21Z","updated_at":"2016-11-10T20:21:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9bcafe1f1c49287190d22f487c79c04c560dae21","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/flume/pulls/84/commits","review_comments_url":"https://api.github.com/repos/apache/flume/pulls/84/comments","review_comment_url":"https://api.github.com/repos/apache/flume/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/flume/issues/84/comments","statuses_url":"https://api.github.com/repos/apache/flume/statuses/f5b4d9a3d3d500cfded3f5a74944307e3fe82e05","head":{"label":"benwheeler:trunk","ref":"trunk","sha":"f5b4d9a3d3d500cfded3f5a74944307e3fe82e05","user":{"login":"benwheeler","id":1751901,"avatar_url":"https://avatars.githubusercontent.com/u/1751901?v=3","gravatar_id":"","url":"https://api.github.com/users/benwheeler","html_url":"https://github.com/benwheeler","followers_url":"https://api.github.com/users/benwheeler/followers","following_url":"https://api.github.com/users/benwheeler/following{/other_user}","gists_url":"https://api.github.com/users/benwheeler/gists{/gist_id}","starred_url":"https://api.github.com/users/benwheeler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/benwheeler/subscriptions","organizations_url":"https://api.github.com/users/benwheeler/orgs","repos_url":"https://api.github.com/users/benwheeler/repos","events_url":"https://api.github.com/users/benwheeler/events{/privacy}","received_events_url":"https://api.github.com/users/benwheeler/received_events","type":"User","site_admin":false},"repo":{"id":73073379,"name":"flume","full_name":"benwheeler/flume","owner":{"login":"benwheeler","id":1751901,"avatar_url":"https://avatars.githubusercontent.com/u/1751901?v=3","gravatar_id":"","url":"https://api.github.com/users/benwheeler","html_url":"https://github.com/benwheeler","followers_url":"https://api.github.com/users/benwheeler/followers","following_url":"https://api.github.com/users/benwheeler/following{/other_user}","gists_url":"https://api.github.com/users/benwheeler/gists{/gist_id}","starred_url":"https://api.github.com/users/benwheeler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/benwheeler/subscriptions","organizations_url":"https://api.github.com/users/benwheeler/orgs","repos_url":"https://api.github.com/users/benwheeler/repos","events_url":"https://api.github.com/users/benwheeler/events{/privacy}","received_events_url":"https://api.github.com/users/benwheeler/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/benwheeler/flume","description":"Mirror of Apache Flume","fork":true,"url":"https://api.github.com/repos/benwheeler/flume","forks_url":"https://api.github.com/repos/benwheeler/flume/forks","keys_url":"https://api.github.com/repos/benwheeler/flume/keys{/key_id}","collaborators_url":"https://api.github.com/repos/benwheeler/flume/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/benwheeler/flume/teams","hooks_url":"https://api.github.com/repos/benwheeler/flume/hooks","issue_events_url":"https://api.github.com/repos/benwheeler/flume/issues/events{/number}","events_url":"https://api.github.com/repos/benwheeler/flume/events","assignees_url":"https://api.github.com/repos/benwheeler/flume/assignees{/user}","branches_url":"https://api.github.com/repos/benwheeler/flume/branches{/branch}","tags_url":"https://api.github.com/repos/benwheeler/flume/tags","blobs_url":"https://api.github.com/repos/benwheeler/flume/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/benwheeler/flume/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/benwheeler/flume/git/refs{/sha}","trees_url":"https://api.github.com/repos/benwheeler/flume/git/trees{/sha}","statuses_url":"https://api.github.com/repos/benwheeler/flume/statuses/{sha}","languages_url":"https://api.github.com/repos/benwheeler/flume/languages","stargazers_url":"https://api.github.com/repos/benwheeler/flume/stargazers","contributors_url":"https://api.github.com/repos/benwheeler/flume/contributors","subscribers_url":"https://api.github.com/repos/benwheeler/flume/subscribers","subscription_url":"https://api.github.com/repos/benwheeler/flume/subscription","commits_url":"https://api.github.com/repos/benwheeler/flume/commits{/sha}","git_commits_url":"https://api.github.com/repos/benwheeler/flume/git/commits{/sha}","comments_url":"https://api.github.com/repos/benwheeler/flume/comments{/number}","issue_comment_url":"https://api.github.com/repos/benwheeler/flume/issues/comments{/number}","contents_url":"https://api.github.com/repos/benwheeler/flume/contents/{+path}","compare_url":"https://api.github.com/repos/benwheeler/flume/compare/{base}...{head}","merges_url":"https://api.github.com/repos/benwheeler/flume/merges","archive_url":"https://api.github.com/repos/benwheeler/flume/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/benwheeler/flume/downloads","issues_url":"https://api.github.com/repos/benwheeler/flume/issues{/number}","pulls_url":"https://api.github.com/repos/benwheeler/flume/pulls{/number}","milestones_url":"https://api.github.com/repos/benwheeler/flume/milestones{/number}","notifications_url":"https://api.github.com/repos/benwheeler/flume/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/benwheeler/flume/labels{/name}","releases_url":"https://api.github.com/repos/benwheeler/flume/releases{/id}","deployments_url":"https://api.github.com/repos/benwheeler/flume/deployments","created_at":"2016-11-07T11:50:49Z","updated_at":"2016-11-07T11:50:53Z","pushed_at":"2016-11-10T09:45:12Z","git_url":"git://github.com/benwheeler/flume.git","ssh_url":"git@github.com:benwheeler/flume.git","clone_url":"https://github.com/benwheeler/flume.git","svn_url":"https://github.com/benwheeler/flume","homepage":"","size":41971,"stargazers_count":0,"watchers_count":0,"language":"Java","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":"trunk"}},"base":{"label":"apache:trunk","ref":"trunk","sha":"f581f6ed0e820da370c4a83a4ff7b05278d09fc3","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":2198510,"name":"flume","full_name":"apache/flume","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/flume","description":"Mirror of Apache Flume","fork":false,"url":"https://api.github.com/repos/apache/flume","forks_url":"https://api.github.com/repos/apache/flume/forks","keys_url":"https://api.github.com/repos/apache/flume/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/flume/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/flume/teams","hooks_url":"https://api.github.com/repos/apache/flume/hooks","issue_events_url":"https://api.github.com/repos/apache/flume/issues/events{/number}","events_url":"https://api.github.com/repos/apache/flume/events","assignees_url":"https://api.github.com/repos/apache/flume/assignees{/user}","branches_url":"https://api.github.com/repos/apache/flume/branches{/branch}","tags_url":"https://api.github.com/repos/apache/flume/tags","blobs_url":"https://api.github.com/repos/apache/flume/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/flume/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/flume/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/flume/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/flume/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/flume/languages","stargazers_url":"https://api.github.com/repos/apache/flume/stargazers","contributors_url":"https://api.github.com/repos/apache/flume/contributors","subscribers_url":"https://api.github.com/repos/apache/flume/subscribers","subscription_url":"https://api.github.com/repos/apache/flume/subscription","commits_url":"https://api.github.com/repos/apache/flume/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/flume/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/flume/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/flume/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/flume/contents/{+path}","compare_url":"https://api.github.com/repos/apache/flume/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/flume/merges","archive_url":"https://api.github.com/repos/apache/flume/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/flume/downloads","issues_url":"https://api.github.com/repos/apache/flume/issues{/number}","pulls_url":"https://api.github.com/repos/apache/flume/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/flume/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/flume/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/flume/labels{/name}","releases_url":"https://api.github.com/repos/apache/flume/releases{/id}","deployments_url":"https://api.github.com/repos/apache/flume/deployments","created_at":"2011-08-12T18:20:14Z","updated_at":"2016-11-09T17:06:12Z","pushed_at":"2016-11-10T09:45:13Z","git_url":"git://github.com/apache/flume.git","ssh_url":"git@github.com:apache/flume.git","clone_url":"https://github.com/apache/flume.git","svn_url":"https://github.com/apache/flume","homepage":"","size":43367,"stargazers_count":772,"watchers_count":772,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":676,"mirror_url":"git://git.apache.org/flume.git","open_issues_count":35,"forks":676,"open_issues":35,"watchers":772,"default_branch":"trunk"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/flume/pulls/84"},"html":{"href":"https://github.com/apache/flume/pull/84"},"issue":{"href":"https://api.github.com/repos/apache/flume/issues/84"},"comments":{"href":"https://api.github.com/repos/apache/flume/issues/84/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/flume/pulls/84/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/flume/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/flume/pulls/84/commits"},"statuses":{"href":"https://api.github.com/repos/apache/flume/statuses/f5b4d9a3d3d500cfded3f5a74944307e3fe82e05"}}}}
{"actor":{"display_login":"meou"}}