package com.gigya.flume; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.TimeZone; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.FastDateFormat; import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.conf.ComponentConfiguration; import org.apache.flume.sink.elasticsearch.AbstractElasticSearchIndexRequestBuilderFactory; import org.apache.flume.sink.elasticsearch.DocumentIdBuilder; import org.apache.flume.sink.elasticsearch.ElasticSearchEventSerializer; import org.apache.flume.sink.elasticsearch.ElasticSearchIndexRequestBuilderFactory; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.common.Base64; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.BytesStream; /** * An extended serializer for flume events into the same format LogStash uses</p> * This adds some more features on top of the default ES serializer that is part of * the Flume distribution.</p> * * For more details on added features: * @see https://github.com/gigya/flume-ng-elasticsearch-ser-ex * * @note This builder will not work when using the REST client of the ES sink * of Flume 1.5.X. The REST client does not use a builder. * * * @author Rotem Hermon * */ public class ExtendedElasticSearchIndexRequestBuilderFactory extends AbstractElasticSearchIndexRequestBuilderFactory { private ElasticSearchEventSerializer serializer = new ExtendedElasticSearchLogStashEventSerializer(); private DocumentIdBuilder docIdBuilder = (DocumentIdBuilder)serializer; public ExtendedElasticSearchIndexRequestBuilderFactory() { super(FastDateFormat.getInstance("yyyy.MM.dd", TimeZone.getTimeZone("Etc/UTC"))); } public ExtendedElasticSearchIndexRequestBuilderFactory(FastDateFormat fd) { super(fd); } public ExtendedElasticSearchIndexRequestBuilderFactory(ElasticSearchEventSerializer serializer) { super(FastDateFormat.getInstance("yyyy.MM.dd", TimeZone.getTimeZone("Etc/UTC"))); this.serializer = serializer; } public ExtendedElasticSearchIndexRequestBuilderFactory(ElasticSearchEventSerializer serializer, FastDateFormat fd) { super(fd); this.serializer = serializer; } @Override public void configure(Context context) { serializer.configure(context); } @Override public void configure(ComponentConfiguration config) { serializer.configure(config); } @Override protected void prepareIndexRequest(IndexRequestBuilder indexRequest, String indexName, String indexType, Event event) throws IOException { BytesStream contentBuilder = serializer.getContentBuilder(event); BytesReference contentBytes = contentBuilder.bytes(); indexRequest.setIndex(indexName).setType(indexType).setSource(contentBytes); String hashId = docIdBuilder.getDocumentId(contentBytes); if (null != hashId && !hashId.isEmpty()) indexRequest.setId(hashId.toString()); } }