flipp-ruby-kafka-temp-fork 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +97 -0
  3. data/.dockerignore +2 -0
  4. data/.gitignore +41 -0
  5. data/.gitmodules +0 -0
  6. data/.rspec +1 -0
  7. data/.rubocop.yml +56 -0
  8. data/.ruby-gemset +1 -0
  9. data/.ruby-version +1 -0
  10. data/CHANGELOG.md +466 -0
  11. data/Dockerfile +21 -0
  12. data/Gemfile +6 -0
  13. data/Gemfile.lock +207 -0
  14. data/Guardfile +22 -0
  15. data/README.md +102 -0
  16. data/Rakefile +13 -0
  17. data/bin/flipp_ruby_kafka +4 -0
  18. data/deploy/artifactory.sh +8 -0
  19. data/deploy/config.json +4 -0
  20. data/docker-compose.yml +89 -0
  21. data/docs/UPGRADE_1.0.md +39 -0
  22. data/flipp-ruby-kafka.gemspec +34 -0
  23. data/kafkateria/factories/my_schema.rb +16 -0
  24. data/kafkateria/factories/my_schema_with_id.rb +16 -0
  25. data/lib/flipp_ruby_kafka.rb +73 -0
  26. data/lib/flipp_ruby_kafka/flipp_datadog_metrics.rb +15 -0
  27. data/lib/flipp_ruby_kafka/test_helpers.rb +59 -0
  28. data/lib/flipp_ruby_kafka/utils/platform_schema_validation.rb +77 -0
  29. data/lib/flipp_ruby_kafka/utils/platform_topic_validation.rb +41 -0
  30. data/lib/flipp_ruby_kafka/version.rb +5 -0
  31. data/lib/generators/flipp_ruby_kafka/schema_validation/schema_validation_generator.rb +23 -0
  32. data/lib/generators/flipp_ruby_kafka/topic_validation/topic_validation_generator.rb +22 -0
  33. data/spec/flipp_ruby_kafka_spec.rb +8 -0
  34. data/spec/integration/send_kafka_spec.rb +63 -0
  35. data/spec/phobos.yml +73 -0
  36. data/spec/schemas/com/my-namespace/MySchema-key.avsc +13 -0
  37. data/spec/schemas/com/my-namespace/MySchema.avsc +18 -0
  38. data/spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc +33 -0
  39. data/spec/schemas/com/my-namespace/MySchemaWithId.avsc +28 -0
  40. data/spec/spec_helper.rb +39 -0
  41. data/spec/utils/platform_schema_validation_spec.rb +54 -0
  42. data/spec/utils/platform_topic_validation_spec.rb +50 -0
  43. metadata +262 -0
data/Dockerfile ADDED
@@ -0,0 +1,21 @@
1
+ FROM 421990735784.dkr.ecr.us-east-1.amazonaws.com/flipp/ruby-base:2.5-stretch
2
+
3
+ RUN apt-get install -yq libpq-dev net-tools mysql-client wait-for-it
4
+ ENV DOCKERIZE_VERSION v0.6.1
5
+ RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
6
+ && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
7
+ && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
8
+
9
+ WORKDIR /opt/flipp_ruby_kafka
10
+ COPY flipp-ruby-kafka.gemspec /opt/flipp_ruby_kafka/flipp-ruby-kafka.gemspec
11
+ COPY lib/flipp_ruby_kafka/version.rb /opt/flipp_ruby_kafka/lib/flipp_ruby_kafka/version.rb
12
+ COPY Gemfile /opt/flipp_ruby_kafka/Gemfile
13
+ COPY Gemfile.lock /opt/flipp_ruby_kafka/Gemfile.lock
14
+
15
+ RUN bundle install
16
+
17
+ ADD . .
18
+
19
+ ENTRYPOINT ["bundle", "exec"]
20
+
21
+ CMD ["bundle", "exec", "rspec"]
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://flipplib.jfrog.io/flipplib/api/gems/flipp-gems/'
4
+
5
+ # Specify your gem's dependencies in boilerplate.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,207 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ flipp-ruby-kafka-temp-fork (0.0.1)
5
+ ddtrace (>= 0.11)
6
+ deimos-temp-fork (>= 0.0.2)
7
+ flipp-ruby-dogstatsd (~> 1.0)
8
+ railties (>= 3)
9
+
10
+ GEM
11
+ remote: https://flipplib.jfrog.io/flipplib/api/gems/flipp-gems/
12
+ specs:
13
+ actionpack (6.1.4)
14
+ actionview (= 6.1.4)
15
+ activesupport (= 6.1.4)
16
+ rack (~> 2.0, >= 2.0.9)
17
+ rack-test (>= 0.6.3)
18
+ rails-dom-testing (~> 2.0)
19
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
20
+ actionview (6.1.4)
21
+ activesupport (= 6.1.4)
22
+ builder (~> 3.1)
23
+ erubi (~> 1.4)
24
+ rails-dom-testing (~> 2.0)
25
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
26
+ activesupport (6.1.4)
27
+ concurrent-ruby (~> 1.0, >= 1.0.2)
28
+ i18n (>= 1.6, < 2)
29
+ minitest (>= 5.1)
30
+ tzinfo (~> 2.0)
31
+ zeitwerk (~> 2.3)
32
+ ast (2.4.2)
33
+ avro (1.9.2)
34
+ multi_json
35
+ avro_turf (0.11.0)
36
+ avro (>= 1.7.7, < 1.10)
37
+ excon (~> 0.45)
38
+ builder (3.2.4)
39
+ coderay (1.1.3)
40
+ concurrent-ruby (1.1.9)
41
+ concurrent-ruby-ext (1.1.9)
42
+ concurrent-ruby (= 1.1.9)
43
+ crass (1.0.6)
44
+ ddtrace (0.52.0)
45
+ ffi (~> 1.0)
46
+ msgpack
47
+ deimos-temp-fork (0.0.2)
48
+ avro_turf (~> 0.11)
49
+ fig_tree (~> 0.0.2)
50
+ phobos_temp_fork
51
+ sigurd (~> 0.0.1)
52
+ diff-lcs (1.4.4)
53
+ dogstatsd-ruby (3.0.0)
54
+ erubi (1.10.0)
55
+ excon (0.85.0)
56
+ exponential-backoff (0.0.4)
57
+ ffi (1.15.3)
58
+ fig_tree (0.0.2)
59
+ activesupport (>= 3.0.0)
60
+ flipp-ruby-dogstatsd (1.0.8)
61
+ activesupport (>= 3.0)
62
+ dogstatsd-ruby (~> 3.0.0)
63
+ flipp_ruby_style (0.1.4)
64
+ rubocop (~> 0.76)
65
+ rubocop-performance (~> 1.5)
66
+ rubocop-rails (~> 2.3)
67
+ rubocop-rspec (~> 1.27)
68
+ thor
69
+ formatador (0.3.0)
70
+ guard (2.18.0)
71
+ formatador (>= 0.2.4)
72
+ listen (>= 2.7, < 4.0)
73
+ lumberjack (>= 1.0.12, < 2.0)
74
+ nenv (~> 0.1)
75
+ notiffany (~> 0.0)
76
+ pry (>= 0.13.0)
77
+ shellany (~> 0.0)
78
+ thor (>= 0.18.1)
79
+ guard-compat (1.2.1)
80
+ guard-rspec (4.7.3)
81
+ guard (~> 2.1)
82
+ guard-compat (~> 1.1)
83
+ rspec (>= 2.99.0, < 4.0)
84
+ guard-rubocop (1.4.0)
85
+ guard (~> 2.0)
86
+ rubocop (< 2.0)
87
+ i18n (1.8.10)
88
+ concurrent-ruby (~> 1.0)
89
+ listen (3.6.0)
90
+ rb-fsevent (~> 0.10, >= 0.10.3)
91
+ rb-inotify (~> 0.9, >= 0.9.10)
92
+ little-plugger (1.1.4)
93
+ logging (2.3.0)
94
+ little-plugger (~> 1.1)
95
+ multi_json (~> 1.14)
96
+ loofah (2.12.0)
97
+ crass (~> 1.0.2)
98
+ nokogiri (>= 1.5.9)
99
+ lumberjack (1.2.8)
100
+ method_source (1.0.0)
101
+ minitest (5.14.4)
102
+ msgpack (1.4.2)
103
+ multi_json (1.15.0)
104
+ nenv (0.3.0)
105
+ nokogiri (1.12.3-x86_64-darwin)
106
+ racc (~> 1.4)
107
+ notiffany (0.1.3)
108
+ nenv (~> 0.1)
109
+ shellany (~> 0.0)
110
+ parallel (1.20.1)
111
+ parser (3.0.2.0)
112
+ ast (~> 2.4.1)
113
+ phobos_temp_fork (0.0.1)
114
+ activesupport (>= 3.0.0)
115
+ concurrent-ruby (>= 1.0.2)
116
+ concurrent-ruby-ext (>= 1.0.2)
117
+ exponential-backoff
118
+ logging
119
+ thor
120
+ pry (0.14.1)
121
+ coderay (~> 1.1)
122
+ method_source (~> 1.0)
123
+ racc (1.5.2)
124
+ rack (2.2.3)
125
+ rack-test (1.1.0)
126
+ rack (>= 1.0, < 3)
127
+ rails-dom-testing (2.0.3)
128
+ activesupport (>= 4.2.0)
129
+ nokogiri (>= 1.6)
130
+ rails-html-sanitizer (1.3.0)
131
+ loofah (~> 2.3)
132
+ railties (6.1.4)
133
+ actionpack (= 6.1.4)
134
+ activesupport (= 6.1.4)
135
+ method_source
136
+ rake (>= 0.13)
137
+ thor (~> 1.0)
138
+ rainbow (3.0.0)
139
+ rake (13.0.6)
140
+ rb-fsevent (0.11.0)
141
+ rb-inotify (0.10.1)
142
+ ffi (~> 1.0)
143
+ regexp_parser (2.1.1)
144
+ rexml (3.2.5)
145
+ rspec (3.10.0)
146
+ rspec-core (~> 3.10.0)
147
+ rspec-expectations (~> 3.10.0)
148
+ rspec-mocks (~> 3.10.0)
149
+ rspec-core (3.10.1)
150
+ rspec-support (~> 3.10.0)
151
+ rspec-expectations (3.10.1)
152
+ diff-lcs (>= 1.2.0, < 2.0)
153
+ rspec-support (~> 3.10.0)
154
+ rspec-mocks (3.10.2)
155
+ diff-lcs (>= 1.2.0, < 2.0)
156
+ rspec-support (~> 3.10.0)
157
+ rspec-support (3.10.2)
158
+ rspec_junit_formatter (0.4.1)
159
+ rspec-core (>= 2, < 4, != 2.12.0)
160
+ rubocop (0.93.1)
161
+ parallel (~> 1.10)
162
+ parser (>= 2.7.1.5)
163
+ rainbow (>= 2.2.2, < 4.0)
164
+ regexp_parser (>= 1.8)
165
+ rexml
166
+ rubocop-ast (>= 0.6.0)
167
+ ruby-progressbar (~> 1.7)
168
+ unicode-display_width (>= 1.4.0, < 2.0)
169
+ rubocop-ast (1.10.0)
170
+ parser (>= 3.0.1.1)
171
+ rubocop-performance (1.10.2)
172
+ rubocop (>= 0.90.0, < 2.0)
173
+ rubocop-ast (>= 0.4.0)
174
+ rubocop-rails (2.9.1)
175
+ activesupport (>= 4.2.0)
176
+ rack (>= 1.1)
177
+ rubocop (>= 0.90.0, < 2.0)
178
+ rubocop-rspec (1.44.1)
179
+ rubocop (~> 0.87)
180
+ rubocop-ast (>= 0.7.1)
181
+ ruby-progressbar (1.11.0)
182
+ shellany (0.0.1)
183
+ sigurd (0.0.3)
184
+ concurrent-ruby (~> 1)
185
+ exponential-backoff
186
+ thor (1.1.0)
187
+ tzinfo (2.0.4)
188
+ concurrent-ruby (~> 1.0)
189
+ unicode-display_width (1.7.0)
190
+ zeitwerk (2.4.2)
191
+
192
+ PLATFORMS
193
+ x86_64-darwin-20
194
+
195
+ DEPENDENCIES
196
+ flipp-ruby-kafka-temp-fork!
197
+ flipp_ruby_style
198
+ guard (~> 2)
199
+ guard-rspec (~> 4)
200
+ guard-rubocop (~> 1)
201
+ rspec (~> 3)
202
+ rspec_junit_formatter (~> 0.3)
203
+ rubocop (~> 0.58)
204
+ rubocop-rspec (~> 1.27)
205
+
206
+ BUNDLED WITH
207
+ 2.2.3
data/Guardfile ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # A sample Guardfile
4
+ # More info at https://github.com/guard/guard#readme
5
+
6
+ guard :rspec do
7
+ watch(%r{^spec/.+_spec\.rb$})
8
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
9
+ watch('spec/spec_helper.rb') { 'spec' }
10
+
11
+ # Rails example
12
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
13
+ watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
14
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
15
+ watch(%r{^spec/support/(.+)\.rb$}) { 'spec' }
16
+ watch('config/routes.rb') { 'spec/routing' }
17
+ end
18
+
19
+ guard :rubocop do
20
+ watch(/.+\.rb$/)
21
+ watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
22
+ end
data/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # FlippRubyKafka
2
+
3
+ Flipp's best practices for using Kafka producers and consumers.
4
+ Built on top of Deimos, and also integrates
5
+ DataDog metrics and APM.
6
+
7
+ See the Deimos gem for most configuration and usage.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+ ```ruby
13
+ gem 'flipp-ruby-kafka', require: 'flipp_ruby_kafka'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install flipp-ruby-kafka
23
+
24
+ ## Versioning
25
+
26
+ We use semver for this gem. Any change in previous behavior is denoted
27
+ with a bump in the minor version (0.4 -> 0.5). Patch versions are for
28
+ bugfixes or new functionality which does not affect existing code. You
29
+ should be locking your Gemfile to the minor version:
30
+
31
+ ```ruby
32
+ gem 'flipp-ruby-kafka', '~> 0.4', require: 'flipp_ruby_kafka'
33
+ ```
34
+
35
+ ## Configuration
36
+
37
+ FlippRubyKafka comes with configuration out of the box for the Flipp
38
+ Microservice Platform. Your application configuration should look something
39
+ like this (in e.g. `config/initializers/flipp_ruby_kafka.rb`):
40
+
41
+ ```ruby
42
+ FlippRubyKafka.configure do
43
+ producers.schema_namespace 'com.flipp.my_app'
44
+ # For integration testing - see below
45
+ kafkateria_url ENV['KAFKATERIA_URL']
46
+ end
47
+ FlippRubyKafka.configure_datadog
48
+ ```
49
+
50
+ FlippRubyKafka also changes the default for a number of settings to make
51
+ your configuration smaller in the 80% case. The following are the setting
52
+ defaults:
53
+
54
+ Config name|Default
55
+ -----------|-------
56
+ logger|Clone of Rails logger
57
+ schema.backend|`:avro_validation` for development, `:avro_schema_registry` otherwise
58
+ schema.path|`"#{Rails.root}/app/schemas"`
59
+ schema.registry_url|`ENV['KAFKA_SCHEMA_REGISTRY'] \|\| 'http://localhost:8081'`
60
+ consumers.report_lag|true for staging/production, false for development/test
61
+ consumers.fatal_error|true if ActiveRecord connection is not active
62
+ kafka.seed_brokers|`ENV['KAFKA_SSL_BROKERS'] \|\| 'localhost:9092'`
63
+ kafka.ssl.enabled|true for staging/production, false for development/test
64
+ kafka.ssl.ca_cert|'/var/certs/kafka-broker-ca-public-cert'
65
+ kafka.ssl.client_cert|'/var/certs/kafka-client-public-key'
66
+ kafka.ssl.client_cert_key|'/var/certs/kafka-client-private-key-decrypted'
67
+ kafka.ssl.verify_hostname|false
68
+ kafkaeria_url|'http://localhost:3000'
69
+
70
+ ## Running consumers
71
+
72
+ FlippRubyKafka aliases `rake deimos:start` to `rake phobos:start`
73
+ to support legacy applications.
74
+
75
+ ## Testing
76
+
77
+ FlippRubyKafka has helper methods for sending API requests to
78
+ [Kafkateria](https://github.com/wishabi/kafkateria):
79
+
80
+ ```ruby
81
+
82
+ kafkateria_delete_topic('my-topic')
83
+
84
+ kafkateria_produce_messages(
85
+ topic: 'my-topic',
86
+ num_messages: 5,
87
+ traits: %i(indexed),
88
+ values: { merchant_id: 1 }
89
+ )
90
+ ```
91
+
92
+ Make sure to set `config.kafkateria_url` when configuring FlippRubyKafka
93
+ to enable this.
94
+
95
+ ## Additional Tools
96
+
97
+ FlippRubyKafka provides generators to hook into the platform build's features. These generate JSON config files to be used by the build script:
98
+
99
+ * `rails g flipp_ruby_kafka:schema_validation` will generate a `schema_validation.json`
100
+ * `rails g flipp_ruby_kafka:topic_validation` will generate a `topic_validation.json`
101
+
102
+ You can run both scripts in your build step - as long as the files are persisted to your workspace, you can use them in your deploy or in your separate validation steps.
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ begin
5
+ require 'rspec/core/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+ task(default: :spec)
9
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
10
+ # no rspec available
11
+ end
12
+
13
+ import('./lib/tasks/phobos.rake')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'flipp_ruby_kafka'
@@ -0,0 +1,8 @@
1
+ cd ./deploy
2
+
3
+ #download latest deploy script
4
+ aws s3 cp "s3://flipp-platform-production/deploy/library-builder/library-builder-deploy.sh" library-builder-deploy.sh
5
+ chmod +x library-builder-deploy.sh
6
+
7
+ #Execute the deployment Scripts
8
+ ./library-builder-deploy.sh
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "ruby",
3
+ "publishType": "artifactory"
4
+ }
@@ -0,0 +1,89 @@
1
+ version: '3.6'
2
+ services:
3
+ mysql:
4
+ image: mysql:5.7
5
+ expose:
6
+ - 3306
7
+ environment:
8
+ - MYSQL_ALLOW_EMPTY_PASSWORD=yes
9
+ - MYSQL_DATABASE=test
10
+ - TZ=America/Toronto
11
+
12
+ postgres:
13
+ image: postgres:11.1
14
+ expose:
15
+ - 5432
16
+ environment:
17
+ POSTGRES_PASSWORD: root
18
+
19
+ test:
20
+ volumes:
21
+ - .:/var/app
22
+ depends_on:
23
+ - kafka-broker
24
+ - mysql
25
+ - postgres
26
+ - kafkateria
27
+ build: .
28
+ environment:
29
+ - "DEFAULT_TIMEOUT=${DEFAULT_TIMEOUT}"
30
+ - MYSQL_HOST=mysql
31
+ - PG_HOST=postgres
32
+ - KAFKATERIA_URL=http://kafkateria:3000
33
+ - SCHEMA_REGISTRY=http://schema-registry:8081
34
+ - KAFKA_SEED_BROKER=kafka-broker:9092
35
+ command: dockerize -wait tcp://mysql:3306 -wait tcp://postgres:5432 -timeout 1m rspec
36
+
37
+ zookeeper:
38
+ image: wurstmeister/zookeeper:latest
39
+ ports:
40
+ - 2181:2181
41
+
42
+ schema-registry:
43
+ image: confluentinc/cp-schema-registry
44
+ hostname: schema-registry
45
+ depends_on:
46
+ - zookeeper
47
+ - kafka-broker
48
+ ports:
49
+ - "8081:8081"
50
+ environment:
51
+ SCHEMA_REGISTRY_HOST_NAME: schema-registry
52
+ SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'zookeeper:2181'
53
+
54
+ kafka-broker:
55
+ image: confluentinc/cp-enterprise-kafka
56
+ hostname: kafka-broker
57
+ depends_on:
58
+ - zookeeper
59
+ ports:
60
+ - "9092:9092"
61
+ environment:
62
+ KAFKA_BROKER_ID: 1
63
+ KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
64
+ KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka-broker:9092'
65
+ KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter
66
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
67
+ KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
68
+ CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: kafka-broker:9092
69
+ CONFLUENT_METRICS_REPORTER_ZOOKEEPER_CONNECT: zookeeper:2181
70
+ CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
71
+ CONFLUENT_METRICS_ENABLE: 'true'
72
+ CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous'
73
+
74
+ kafkateria:
75
+ image: 421990735784.dkr.ecr.us-east-1.amazonaws.com/flipp/kafkateria:latest
76
+ hostname: kafkateria
77
+ ports:
78
+ - "3000:3000"
79
+ environment:
80
+ SCHEMA_REGISTRY: 'http://schema-registry:8081'
81
+ KAFKA_SEED_BROKER: 'kafka-broker:9092'
82
+ depends_on:
83
+ - kafka-broker
84
+ - schema-registry
85
+ volumes:
86
+ - ./kafkateria/factories:/var/app/external/factories
87
+ - ./spec/schemas:/var/app/external/schemas
88
+ command:
89
+ rails s -p3000