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 |