Added kafka store

Andrew Kane committed Jun 21, 2016
commit 31809aa50dc542afa2c0e5e9ba1eeb85873217b9
Showing 5 changed files with 82 additions and 0 deletions
README.md +17 -0
@@ @@ -27,6 +27,7 @@ Ahoy supports a number of data stores out of the box. You can start with one of
- [PostgreSQL, MySQL, or SQLite](#postgresql-mysql-or-sqlite)
- [MongoDB](#mongodb)
+ - [Kafka](#kafka-master) [master]
- [Fluentd](#fluentd)
- [RabbitMQ](#rabbitmq)
- [Amazon Kinesis Firehose](#amazon-kinesis-firehose)
@@ @@ -48,6 +49,22 @@ rake db:migrate
rails generate ahoy:stores:mongoid
```
+ ### Kafka [master]
+
+ Add [ruby-kafka](https://github.com/zendesk/ruby-kafka) to your Gemfile.
+
+ ```ruby
+ gem 'ruby-kafka'
+ ```
+
+ And run:
+
+ ```sh
+ rails generate ahoy:stores:kafka
+ ```
+
+ Use `ENV["KAFKA_URL"]` to configure.
+
### Fluentd
Add [fluent-logger](https://github.com/fluent/fluent-logger-ruby) to your Gemfile.
ahoy.rb b/lib/ahoy.rb +1 -0
@@ @@ -24,6 +24,7 @@ require "ahoy/stores/active_record_token_store"
require "ahoy/stores/log_store"
require "ahoy/stores/fluentd_store"
require "ahoy/stores/mongoid_store"
+ require "ahoy/stores/kafka_store"
require "ahoy/stores/kinesis_firehose_store"
require "ahoy/stores/bunny_store"
require "ahoy/engine"
ahoy/stores/kafka_store.rb b/lib/ahoy/stores/kafka_store.rb +40 -0
@@ @@ -0,0 +1,40 @@
+ module Ahoy
+ module Stores
+ class KafkaStore < LogStore
+ def log_visit(data)
+ post(visits_topic, data)
+ end
+
+ def log_event(data)
+ post(events_topic, data)
+ end
+
+ def client
+ @client ||= begin
+ client = Kafka.new(
+ seed_brokers: ENV["KAFKA_URL"],
+ logger: Rails.logger
+ )
+ at_exit { client.shutdown }
+ client
+ end
+ end
+
+ def producer
+ @producer ||= client.async_producer(delivery_interval: 3)
+ end
+
+ def post(topic, data)
+ producer.produce(data.to_json, topic: topic)
+ end
+
+ def visits_topic
+ "ahoy_visits"
+ end
+
+ def events_topic
+ "ahoy_events"
+ end
+ end
+ end
+ end
generators/ahoy/stores/kafka_generator.rb b/lib/generators/ahoy/stores/kafka_generator.rb +15 -0
@@ @@ -0,0 +1,15 @@
+ require "rails/generators"
+
+ module Ahoy
+ module Stores
+ module Generators
+ class KafkaGenerator < Rails::Generators::Base
+ source_root File.expand_path("../templates", __FILE__)
+
+ def create_initializer
+ template "kafka_initializer.rb", "config/initializers/ahoy.rb"
+ end
+ end
+ end
+ end
+ end
generators/ahoy/stores/templates/kafka_initializer.rb b/lib/generators/ahoy/stores/templates/kafka_initializer.rb +9 -0
@@ @@ -0,0 +1,9 @@
+ class Ahoy::Store < Ahoy::Stores::KafkaStore
+ def visits_topic
+ "ahoy_visits"
+ end
+
+ def events_topic
+ "ahoy_events"
+ end
+ end