├── LICENSE
├── NOTICE
├── README.md
├── pom.xml
└── src
├── main
├── assemblies
│ └── plugin.xml
├── java
│ └── org
│ │ └── elasticsearch
│ │ ├── plugin
│ │ └── river
│ │ │ └── kafka
│ │ │ └── KafkaRiverPlugin.java
│ │ └── river
│ │ └── kafka
│ │ ├── JsonMessageHandler.java
│ │ ├── JsonMessageHandlerFactory.java
│ │ ├── KafkaClient.java
│ │ ├── KafkaRiver.java
│ │ ├── KafkaRiverConfig.java
│ │ ├── KafkaRiverModule.java
│ │ ├── MessageHandler.java
│ │ ├── MessageHandlerFactory.java
│ │ ├── RawMessageHandler.java
│ │ ├── Stats.java
│ │ └── StatsReporter.java
└── resources
│ └── es-plugin.properties
└── test
├── java
└── org
│ └── elasticsearch
│ └── river
│ └── kafka
│ ├── JsonMessageHandlerFactoryTest.java
│ ├── JsonMessageHandlerTest.java
│ ├── KafkaClientTest.java
│ ├── KafkaRiverConfigTest.java
│ ├── RawMessageHandlerTest.java
│ ├── StatsReporterTest.java
│ └── StatsTest.java
└── resources
└── log4j.properties
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
--------------------------------------------------------------------------------
/NOTICE:
--------------------------------------------------------------------------------
1 | elasticsearch-river-kafka
2 |
3 | Copyright 2009-2013 Shay Banon and ElasticSearch (http://www.elasticsearch.org)
4 | Copyright 2013 Endgame, Inc. (http://www.endgame.com/)
5 |
6 | This product includes software plugin developed for
7 | ElasticSearch and Shay Banon – (http://http://www.elasticsearch.org/)
8 |
9 | Inspiration was taken from
10 | https://github.com/elasticsearch/elasticsearch-river-rabbitmq
11 |
12 | Licensed under Apache License, Version 2.0
13 |
14 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Kafka River Plugin for ElasticSearch
2 | ==================================
3 |
4 | The Kafka River plugin allows index bulk format messages into elasticsearch.
5 |
6 | 1. Download & Build Kafka
7 |
8 | See [Apacke Kafka Quick Start Guide](http://kafka.apache.org/07/quickstart.html) for instructions on how to Download and Build.
9 |
10 | If you are installing on an encyrpted Ubuntu drive you may get "File name too long" error during the build.
11 | This can be solved by building on an unencrypted file system and moving the files to your desired install point.
12 |
13 | 2. install kafka in your maven repo:
14 |
15 | mvn install:install-file -Dfile=./core/target/scala_2.8.0/kafka-0.7.2.jar -DgroupId=org.apache.kafka \
16 | -DartifactId=kafka -Dversion=0.7.2 -Dpackaging=jar
17 |
18 | 3. Build this plugin:
19 |
20 | mvn compile test package
21 | # this will create a file here: target/releases/elasticsearch-river-kafka-1.0.1-SNAPSHOT.zip
22 | PLUGIN_PATH=`pwd`/target/releases/elasticsearch-river-kafka-1.0.1-SNAPSHOT.zip
23 |
24 | 4. Install the PLUGIN
25 |
26 | cd $ELASTICSEARCH_HOME
27 | ./bin/plugin -url file:/$PLUGIN_PATH -install elasticsearch-river-kafka
28 |
29 | 5. Updating the plugin
30 |
31 | cd $ELASTICSEARCH_HOME
32 | ./bin/plugin -remove elasticsearch-river-kafka
33 | ./bin/plugin -url file:/$PLUGIN_PATH -install elasticsearch-river-kafka
34 |
35 | ##### Version Support
36 |
37 | ElasticSearch version 0.90.0
38 |
39 |
40 | Deployment
41 | ==========
42 |
43 | Creating the Kafka river is as simple as (all configuration parameters are provided, with default values):
44 |
45 | bulk_size_bytes - max size of messages to pull from Kafka each request
46 | bulk_timeout - socket timeout for Kafka
47 |
48 | curl -XPUT 'localhost:9200/_river/my_kafka_river_0/_meta' -d '{
49 | "type" : "kafka",
50 | "kafka" : {
51 | "broker_host" : "localhost",
52 | "message_handler_factory_class" : "org.elasticsearch.river.kafka.JsonMessageHandlerFactory",
53 | "zookeeper" : "localhost",
54 | "topic" : "my_topic",
55 | "partition" : "0",
56 | "broker_port" : 9092
57 | },
58 | "index" : {
59 | "bulk_size_bytes" : 10000000,
60 | "bulk_timeout" : "1000ms"
61 | },
62 | "statsd":{
63 | "prefix": "es-kafka-river",
64 | "host": "ambassador",
65 | "port": "8125"
66 | }
67 |
68 | }'
69 |
70 | Kafka offsets are stored in zookeeper.
71 |
72 | NOTE: in its current form, this River only reads from a single broker and a single partition. This will likely change in the future. In
73 | order to consume from multiple partitions and multiple brokers, multiple rivers need to be configured.
74 |
75 | curl -XPUT 'localhost:9200/_river/my_kafka_river_0/_meta' -d '{
76 | "type" : "kafka",
77 | "kafka" : {
78 | "broker_host" : "localhost",
79 | "message_handler_factory_class" : "org.elasticsearch.river.kafka.JsonMessageHandlerFactory",
80 | "zookeeper" : "localhost",
81 | "topic" : "my_topic",
82 | "partition" : "0",
83 | "broker_port" : 9092
84 | },
85 | "index" : {
86 | "bulk_size_bytes" : 10000000,
87 | "bulk_timeout" : "1000ms"
88 | },
89 | "statsd":{
90 | "prefix": "es-kafka-river",
91 | "host": "ambassador",
92 | "port": "8125"
93 | }
94 |
95 | }'
96 | curl -XPUT 'localhost:9200/_river/my_kafka_river_1/_meta' -d '{
97 | "type" : "kafka",
98 | "kafka" : {
99 | "broker_host" : "localhost",
100 | "message_handler_factory_class" : "org.elasticsearch.river.kafka.JsonMessageHandlerFactory",
101 | "zookeeper" : "localhost",
102 | "topic" : "my_topic",
103 | "partition" : "1",
104 | "broker_port" : 9092
105 | },
106 | "index" : {
107 | "bulk_size_bytes" : 10000000,
108 | "bulk_timeout" : "1000ms"
109 | },
110 | "statsd":{
111 | "prefix": "es-kafka-river",
112 | "host": "ambassador",
113 | "port": "8125"
114 | }
115 |
116 | }'
117 | curl -XPUT 'localhost:9200/_river/my_kafka_river_2/_meta' -d '{
118 | "type" : "kafka",
119 | "kafka" : {
120 | "broker_host" : "localhost",
121 | "message_handler_factory_class" : "org.elasticsearch.river.kafka.JsonMessageHandlerFactory",
122 | "zookeeper" : "localhost",
123 | "topic" : "my_topic",
124 | "partition" : "2",
125 | "broker_port" : 9092
126 | },
127 | "index" : {
128 | "bulk_size_bytes" : 10000000,
129 | "bulk_timeout" : "1000ms"
130 | },
131 | "statsd":{
132 | "prefix": "es-kafka-river",
133 | "host": "ambassador",
134 | "port": "8125"
135 | }
136 |
137 | }'
138 | curl -XPUT 'localhost:9200/_river/my_kafka_river_3/_meta' -d '{
139 | "type" : "kafka",
140 | "kafka" : {
141 | "broker_host" : "localhost",
142 | "message_handler_factory_class" : "org.elasticsearch.river.kafka.JsonMessageHandlerFactory",
143 | "zookeeper" : "localhost",
144 | "topic" : "my_topic",
145 | "partition" : "3",
146 | "broker_port" : 9092
147 | },
148 | "index" : {
149 | "bulk_size_bytes" : 10000000,
150 | "bulk_timeout" : "1000ms"
151 | },
152 | "statsd":{
153 | "prefix": "es-kafka-river",
154 | "host": "ambassador",
155 | "port": "8125"
156 | }
157 |
158 | }'
159 |
160 | The river is automatically bulking queue messages if the queue is overloaded, allowing for faster catchup with the
161 | messages streamed into the queue. The `ordered` flag allows to make sure that the messages will be indexed in the
162 | same order as they arrive in the query by blocking on the bulk request before picking up the next data to be indexed.
163 | It can also be used as a simple way to throttle indexing.
164 |
165 | If `message_handler_factory_class` is not set it will use the `JsonMessageHandlerFactory` and will expect json messages from Kafka with this format:
166 |
167 | {
168 | "index" : "example_index",
169 | "type" : "example_type",
170 | "id" : "asdkljflkasjdfasdfasdf",
171 | "source" : { ..... }
172 | }
173 |
174 | License
175 | -------
176 |
177 | elasticsearch-river-kafka
178 |
179 | Copyright 2013 [Endgame, Inc.](http://www.endgame.com/)
180 |
181 | 
182 |
183 | This product includes software plugin developed for
184 | ElasticSearch and Shay Banon – [Elasticsearch](http://www.elasticsearch.org/)
185 |
186 | Inspiration was taken from David Pilato and his ElasticSearch Rabbit MQ Plugin
187 | https://github.com/elasticsearch/elasticsearch-river-rabbitmq
188 |
189 | Licensed under the Apache License, Version 2.0 (the "License"); you may
190 | not use this file except in compliance with the License. You may obtain
191 | a copy of the License at
192 |
193 | http://www.apache.org/licenses/LICENSE-2.0
194 |
195 | Unless required by applicable law or agreed to in writing,
196 | software distributed under the License is distributed on an
197 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
198 | KIND, either express or implied. See the License for the
199 | specific language governing permissions and limitations
200 | under the License.
201 |
202 | Contributors
203 | -------------
204 |
205 | - [Jason Trost](https://github.com/jt6211/)
206 | - [Mark Conlin](https://github.com/meconlin)
207 |
208 |
209 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | elasticsearch-river-kafka
4 | 4.0.0
5 | org.elasticsearch
6 | elasticsearch-river-kafka
7 | 1.0.2-SNAPSHOT
8 | jar
9 | Kafka River for ElasticSearch
10 | 2013
11 |
12 |
13 | The Apache Software License, Version 2.0
14 | http://www.apache.org/licenses/LICENSE-2.0.txt
15 | repo
16 |
17 |
18 |
19 | 0.90.0
20 |
21 |
22 |
23 | junit
24 | junit
25 | 3.8.1
26 | test
27 |
28 |
29 | org.elasticsearch
30 | elasticsearch
31 | ${elasticsearch.version}
32 | compile
33 |
34 |
35 | org.apache.kafka
36 | kafka
37 | 0.7.2
38 |
39 |
40 | com.netflix.curator
41 | curator-framework
42 | 1.0.1
43 |
44 |
45 | com.timgroup
46 | java-statsd-client
47 | 1.0.1
48 |
49 |
50 | org.codehaus.jackson
51 | jackson-mapper-asl
52 | 1.9.3
53 |
54 |
55 | org.scala-lang
56 | scala-library
57 | 2.8.0
58 |
59 |
60 | net.sf.jopt-simple
61 | jopt-simple
62 | 3.2
63 |
64 |
65 | com.github.sgroschupf
66 | zkclient
67 | 0.1
68 |
69 |
70 | log4j
71 | log4j
72 | 1.2.16
73 | runtime
74 |
75 |
76 | javax.mail
77 | mail
78 |
79 |
80 | javax.jms
81 | jms
82 |
83 |
84 | com.sun.jdmk
85 | jmxtools
86 |
87 |
88 | com.sun.jmx
89 | jmxri
90 |
91 |
92 |
93 |
94 | org.xerial.snappy
95 | snappy-java
96 | 1.0.4.1
97 |
98 |
99 | org.apache.zookeeper
100 | zookeeper
101 | 3.3.4
102 |
103 |
104 | log4j
105 | log4j
106 |
107 |
108 | jline
109 | jline
110 |
111 |
112 |
113 |
114 | org.easymock
115 | easymock
116 | 3.0
117 | test
118 |
119 |
120 |
121 |
122 |
123 | org.apache.maven.plugins
124 | maven-compiler-plugin
125 | 2.3.2
126 |
127 | 1.7
128 | 1.7
129 |
130 |
131 |
132 | org.apache.maven.plugins
133 | maven-source-plugin
134 | 2.1.2
135 |
136 |
137 | attach-sources
138 |
139 | jar
140 |
141 |
142 |
143 |
144 |
145 | maven-assembly-plugin
146 | 2.3
147 |
148 | false
149 | ${project.build.directory}/releases/
150 |
151 | ${basedir}/src/main/assemblies/plugin.xml
152 |
153 |
154 |
155 |
156 | package
157 |
158 | single
159 |
160 |
161 |
162 |
163 |
164 | org.apache.maven.plugins
165 | maven-surefire-plugin
166 | 2.12
167 |
168 | -XX:-UseSplitVerifier
169 |
170 |
171 |
172 | org.codehaus.mojo
173 | cobertura-maven-plugin
174 | 2.5.1
175 |
176 |
177 | xml
178 |
179 |
180 |
181 |
182 | cobertura
183 |
184 | cobertura
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
--------------------------------------------------------------------------------
/src/main/assemblies/plugin.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | plugin
4 |
5 | zip
6 |
7 | false
8 |
9 |
10 | /
11 | true
12 | true
13 |
14 | org.elasticsearch:elasticsearch
15 |
16 |
17 |
18 | /
19 | true
20 | true
21 |
22 | org.apache.kafka:kafka
23 | com.netflix.curator:curator-framework
24 | org.scala-lang:scala-library
25 | org.apache.zookeeper:zookeeper
26 | net.sf.jopt-simple:jopt-simple
27 | com.github.sgroschupf:zkclient
28 | org.xerial.snappy:snappy-java
29 | org.codehaus.jackson:jackson-mapper-asl
30 | log4j:log4j
31 | com.timgroup:java-statsd-client
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/src/main/java/org/elasticsearch/plugin/river/kafka/KafkaRiverPlugin.java:
--------------------------------------------------------------------------------
1 | /* Copyright 2013 Endgame, Inc.
2 | *
3 | * Licensed under the Apache License, Version 2.0 (the "License");
4 | * you may not use this file except in compliance with the License.
5 | * You may obtain a copy of the License at
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing,
10 | * software distributed under the License is distributed on an
11 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
12 | * KIND, either express or implied. See the License for the
13 | * specific language governing permissions and limitations
14 | * under the License.
15 | */
16 | package org.elasticsearch.plugin.river.kafka;
17 |
18 | import org.elasticsearch.common.inject.Inject;
19 | import org.elasticsearch.plugins.AbstractPlugin;
20 | import org.elasticsearch.river.RiversModule;
21 | import org.elasticsearch.river.kafka.KafkaRiverModule;
22 |
23 | /**
24 | *
25 | */
26 | public class KafkaRiverPlugin extends AbstractPlugin {
27 |
28 | @Inject
29 | public KafkaRiverPlugin() {
30 | }
31 |
32 | @Override
33 | public String name() {
34 | return "river-kafka";
35 | }
36 |
37 | @Override
38 | public String description() {
39 | return "River Kafka Plugin";
40 | }
41 |
42 | public void onModule(RiversModule module) {
43 | module.registerRiver("kafka", KafkaRiverModule.class);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/main/java/org/elasticsearch/river/kafka/JsonMessageHandler.java:
--------------------------------------------------------------------------------
1 | /* Copyright 2013 Endgame, Inc.
2 | *
3 | * Licensed under the Apache License, Version 2.0 (the "License");
4 | * you may not use this file except in compliance with the License.
5 | * You may obtain a copy of the License at
6 | *
7 | * http://www.apache.org/licenses/LICENSE-2.0
8 | *
9 | * Unless required by applicable law or agreed to in writing,
10 | * software distributed under the License is distributed on an
11 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
12 | * KIND, either express or implied. See the License for the
13 | * specific language governing permissions and limitations
14 | * under the License.
15 | */
16 | package org.elasticsearch.river.kafka;
17 |
18 | import java.util.Map;
19 |
20 | import kafka.message.Message;
21 |
22 | import org.codehaus.jackson.map.ObjectMapper;
23 | import org.codehaus.jackson.map.ObjectReader;
24 | import org.codehaus.jackson.type.TypeReference;
25 | import org.elasticsearch.action.bulk.BulkRequestBuilder;
26 | import org.elasticsearch.action.index.IndexRequestBuilder;
27 | import org.elasticsearch.client.Client;
28 |
29 | /**
30 | * JsonMessageHandler
31 | *
32 | * Handle a simple json message
33 | * Uses BulkRequestBuilder to send messages in bulk
34 | *
35 | * example format
36 | * { "index" : "example_index",
37 | * "type" : "example_type",
38 | * "id" : "asdkljflkasjdfasdfasdf",
39 | * "source" : {"source_data1":"values of source_data1", "source_data2" : 99999 }
40 | * }
41 | *
42 | * index, type, and source are required
43 | * id is optional
44 | *
45 | */
46 | public class JsonMessageHandler extends MessageHandler {
47 |
48 | final ObjectReader reader = new ObjectMapper().reader(new TypeReference