scaltainer 0.4.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 84b843eaa45f5b54d142d99fd428d6bc1b2323442e62987b606fb6a140c179f7
4
- data.tar.gz: dc2b47fee69f2be100c023c29266c0260be36c9d28ed6ccd505e785008625b33
3
+ metadata.gz: 3537d6ea1b1cee2e5a5efce8a5c98e3727473585302d57fc816148d8ffce2a4d
4
+ data.tar.gz: 0de1927d3b4dc1a35fa755af035a495f7193b9105b8fc0a2088c2ffa2342192d
5
5
  SHA512:
6
- metadata.gz: 2b7e2393442da6423d19d7cccef17f954470fb9d3966ef357367fccaafad5dcaa95a0412aadaf3fc969cb735da1e5832a45893e9de232169f09fd83bfffcfbf3
7
- data.tar.gz: 9a033a9f9ae5d0bf876e801261949310f5699291e109e6365a0fb4fdc8c194f58a6cc879ed38c7169448174f82b0a0f743e1246e16f04b80a387ae74344ab138
6
+ metadata.gz: f63915a92b777a563f24f89aaae8045465545c0e19f5adf77741426e20aa9f1186aa56218a2bc0fc8001b07d1616e1a76014cee1eba1c5a961638c4e9531eac8
7
+ data.tar.gz: a189a04f2b4b7b04f348b6d9d7438bff6323781b63dd4f1191bbe1b3f4bf9fb47222d265279b4b349c3520d0c3a5d2a129e240800c40c3d479aaa7cbdd63c125
@@ -0,0 +1,25 @@
1
+ name: rspec-tests
2
+ description: Composite action for rspec tests
3
+ inputs:
4
+ github-token:
5
+ required: true
6
+ runs:
7
+ using: composite
8
+ steps:
9
+ - name: Install bundler
10
+ shell: bash
11
+ # The bundler version used must match the one in the repo's gemspec
12
+ run: gem install bundler:2.2.19
13
+ - name: Bundle dependencies
14
+ shell: bash
15
+ run: bundle
16
+ - name: Run rspec tests
17
+ shell: bash
18
+ env:
19
+ CI: true
20
+ run: bundle exec rspec
21
+ - name: Use coveralls
22
+ uses: coverallsapp/github-action@1.1.3
23
+ with:
24
+ github-token: ${{ inputs.github-token }}
25
+ path-to-lcov: 'coverage/lcov.info'
@@ -0,0 +1,62 @@
1
+ name: Docker
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ tags:
8
+ - v*
9
+
10
+ env:
11
+ IMAGE_NAME: hammady/scaltainer
12
+
13
+ jobs:
14
+ docker:
15
+ runs-on: ubuntu-latest
16
+ if: github.event_name == 'push'
17
+
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v2
21
+
22
+ - name: Determine target image name
23
+ id: image-name
24
+ run: |
25
+ IMAGE_ID=ghcr.io/$IMAGE_NAME
26
+
27
+ # Strip git ref prefix from version
28
+ VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
29
+
30
+ # Strip "v" prefix from tag name
31
+ [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
32
+
33
+ # Use Docker `latest` tag convention
34
+ [ "$VERSION" == "master" ] && VERSION=latest
35
+
36
+ IMAGES=
37
+ IMAGES="$IMAGE_ID:$VERSION"$'\n'$IMAGES
38
+
39
+ # debug output
40
+ echo images $IMAGES
41
+ echo ::set-output name=images::"$IMAGES"
42
+
43
+ - name: Set up QEMU
44
+ uses: docker/setup-qemu-action@v1
45
+
46
+ - name: Set up Docker Buildx
47
+ uses: docker/setup-buildx-action@v1
48
+
49
+ - name: Login to registry
50
+ uses: docker/login-action@v1
51
+ with:
52
+ registry: ghcr.io
53
+ username: ${{ github.actor }}
54
+ password: ${{ secrets.GITHUB_TOKEN }}
55
+
56
+ - name: Build and push
57
+ uses: docker/build-push-action@v2
58
+ with:
59
+ context: .
60
+ platforms: linux/amd64,linux/arm64,linux/arm/v7
61
+ push: true
62
+ tags: ${{ steps.image-name.outputs.images }}
@@ -0,0 +1,25 @@
1
+ name: Release
2
+ on:
3
+ push:
4
+ tags:
5
+ - v*
6
+ jobs:
7
+ release:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v3
11
+ - uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: '2.7'
14
+ - name: Install bundler
15
+ shell: bash
16
+ # The bundler version used must match the one in the repo's gemspec
17
+ run: gem install bundler:2.2.19
18
+ - name: Bundle dependencies
19
+ shell: bash
20
+ run: bundle
21
+ - name: Release gem
22
+ shell: bash
23
+ env:
24
+ RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
25
+ run: ./publish.sh
@@ -0,0 +1,24 @@
1
+ name: 'Test'
2
+ on:
3
+ push:
4
+ branches:
5
+ - master
6
+ tags:
7
+ - v*
8
+ pull_request:
9
+ types: [opened, reopened, edited, synchronize]
10
+ jobs:
11
+ test:
12
+ strategy:
13
+ matrix:
14
+ ruby_version: [2.6, 2.7]
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v3
18
+ - uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: '${{ matrix.ruby_version }}'
21
+ - name: Run rspec tests
22
+ uses: ./.github/actions/rspec_tests
23
+ with:
24
+ github-token: ${{ secrets.GITHUB_TOKEN }}
data/Dockerfile CHANGED
@@ -1,11 +1,16 @@
1
- FROM ruby:2.3
1
+ FROM ruby:2.7
2
2
 
3
- label maintainer="Hossam Hammady <github@hammady.net>"
3
+ LABEL maintainer="Hossam Hammady <github@hammady.net>"
4
+
5
+ ENV NEW_RELIC_LOG=stdout
6
+ ENV NEW_RELIC_AUTOSTART_DENYLISTED_CONSTANTS=Scaltainer
7
+
8
+ RUN gem install bundler --version 2.2.19
4
9
 
5
10
  WORKDIR /home
6
11
  COPY / /home/
7
12
  RUN bundle install && bundle exec rake install
8
13
 
9
- ENTRYPOINT ["scaltainer"]
14
+ ENTRYPOINT ["bundle", "exec", "scaltainer"]
10
15
 
11
16
  CMD ["-h"]
data/Gemfile.lock CHANGED
@@ -1,35 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scaltainer (0.4.0)
5
- docker-api
6
- dotenv
7
- excon (>= 0.47.0)
8
- kubeclient
9
- prometheus-client
4
+ scaltainer (0.6.0)
5
+ docker-api (~> 2.1)
6
+ dotenv (~> 2.7)
7
+ excon (~> 0.47)
8
+ kubeclient (~> 4.9)
9
+ newrelic_rpm (~> 7.1)
10
+ prometheus-client (~> 2.1)
10
11
 
11
12
  GEM
12
13
  remote: https://rubygems.org/
13
14
  specs:
14
- addressable (2.7.0)
15
- public_suffix (>= 2.0.2, < 5.0)
15
+ addressable (2.8.1)
16
+ public_suffix (>= 2.0.2, < 6.0)
16
17
  coderay (1.1.1)
17
- coveralls (0.8.21)
18
- json (>= 1.8, < 3)
19
- simplecov (~> 0.14.1)
20
- term-ansicolor (~> 1.3)
21
- thor (~> 0.19.4)
22
- tins (~> 1.6)
23
18
  diff-lcs (1.3)
24
- docile (1.1.5)
25
- docker-api (1.34.2)
19
+ docile (1.4.0)
20
+ docker-api (2.1.0)
26
21
  excon (>= 0.47.0)
27
22
  multi_json
28
23
  domain_name (0.5.20190701)
29
24
  unf (>= 0.0.5, < 1.0.0)
30
- dotenv (2.7.5)
31
- excon (0.73.0)
32
- ffi (1.12.2)
25
+ dotenv (2.7.6)
26
+ excon (0.82.0)
27
+ ffi (1.15.5)
33
28
  ffi-compiler (1.0.1)
34
29
  ffi (>= 1.0.0)
35
30
  rake
@@ -39,25 +34,29 @@ GEM
39
34
  http-form_data (~> 2.2)
40
35
  http-parser (~> 1.2.0)
41
36
  http-accept (1.7.0)
42
- http-cookie (1.0.3)
37
+ http-cookie (1.0.4)
43
38
  domain_name (~> 0.5)
44
39
  http-form_data (2.3.0)
45
- http-parser (1.2.1)
40
+ http-parser (1.2.3)
46
41
  ffi-compiler (>= 1.0, < 2.0)
47
- json (2.1.0)
48
- kubeclient (4.6.0)
42
+ json (2.6.3)
43
+ jsonpath (1.1.0)
44
+ multi_json
45
+ kubeclient (4.9.3)
49
46
  http (>= 3.0, < 5.0)
50
- recursive-open-struct (~> 1.0, >= 1.0.4)
47
+ jsonpath (~> 1.0)
48
+ recursive-open-struct (~> 1.1, >= 1.1.1)
51
49
  rest-client (~> 2.0)
52
- mime-types (3.3.1)
50
+ mime-types (3.4.1)
53
51
  mime-types-data (~> 3.2015)
54
- mime-types-data (3.2020.0425)
55
- multi_json (1.14.1)
52
+ mime-types-data (3.2022.0105)
53
+ multi_json (1.15.0)
56
54
  netrc (0.11.0)
57
- prometheus-client (2.0.0)
58
- public_suffix (4.0.4)
55
+ newrelic_rpm (7.1.0)
56
+ prometheus-client (2.1.0)
57
+ public_suffix (5.0.0)
59
58
  rake (13.0.1)
60
- recursive-open-struct (1.1.1)
59
+ recursive-open-struct (1.1.3)
61
60
  rest-client (2.1.0)
62
61
  http-accept (>= 1.7.0, < 2.0)
63
62
  http-cookie (>= 1.0.2, < 2.0)
@@ -76,29 +75,27 @@ GEM
76
75
  diff-lcs (>= 1.2.0, < 2.0)
77
76
  rspec-support (~> 3.6.0)
78
77
  rspec-support (3.6.0)
79
- simplecov (0.14.1)
80
- docile (~> 1.1.0)
78
+ simplecov (0.17.1)
79
+ docile (~> 1.1)
81
80
  json (>= 1.8, < 3)
82
81
  simplecov-html (~> 0.10.0)
83
- simplecov-html (0.10.0)
84
- term-ansicolor (1.6.0)
85
- tins (~> 1.0)
86
- thor (0.19.4)
87
- tins (1.13.2)
82
+ simplecov-html (0.10.2)
83
+ simplecov-lcov (0.7.0)
88
84
  unf (0.1.4)
89
85
  unf_ext
90
- unf_ext (0.0.7.7)
86
+ unf_ext (0.0.8.1)
91
87
 
92
88
  PLATFORMS
93
89
  ruby
94
90
 
95
91
  DEPENDENCIES
96
- bundler (~> 1.15)
92
+ bundler (~> 2.2)
97
93
  coderay (~> 1.1)
98
- coveralls (~> 0.8)
99
- rake (>= 12.3.3)
94
+ rake (~> 13.0)
100
95
  rspec (~> 3.5)
101
96
  scaltainer!
97
+ simplecov (~> 0.17)
98
+ simplecov-lcov (~> 0.7)
102
99
 
103
100
  BUNDLED WITH
104
- 1.17.3
101
+ 2.2.19
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/hammady/scaltainer.svg?branch=master)](https://travis-ci.org/hammady/scaltainer)
1
+ ![Build Status](https://github.com/hammady/scaltainer/actions/workflows/tests.yml/badge.svg)
2
2
  [![Coverage Status](https://coveralls.io/repos/github/hammady/scaltainer/badge.svg?service=github&branch=master)](https://coveralls.io/github/hammady/scaltainer?branch=master)
3
3
  [![Gem Version](https://badge.fury.io/rb/scaltainer.svg)](https://badge.fury.io/rb/scaltainer)
4
4
 
@@ -22,15 +22,15 @@ Install using rubygems:
22
22
 
23
23
  For Docker swarm:
24
24
 
25
- scaltainer -o swarm
25
+ bundle exec scaltainer -o swarm
26
26
 
27
27
  Or simply:
28
28
 
29
- scaltainer
29
+ bundle exec scaltainer
30
30
 
31
31
  For Kubernetes:
32
32
 
33
- scaltainer -o kubernetes
33
+ bundle exec scaltainer -o kubernetes
34
34
 
35
35
 
36
36
  This will do a one-time check on the running docker service replicas
@@ -38,7 +38,7 @@ or Kubernetes replication controllers, replica sets, or deployments.
38
38
  Then it sends scaling out/in commands to the cluster as appropriate.
39
39
  Configuration is read from `scaltainer.yml` by default. If you want to read from another file add `-f yourconfig.yml`:
40
40
 
41
- scaltainer -f yourconfig.yml
41
+ bundle exec scaltainer -f yourconfig.yml
42
42
 
43
43
  Note that after each run a new file is created (`yourconfig.yml.state`) which stores the state of the previous run.
44
44
  This is because there are some configuration parameters (like sensitivity) need to
@@ -46,19 +46,19 @@ remember previous runs.
46
46
  If you want to specify a different location for the state file, add the `--state-file` parameter.
47
47
  Example:
48
48
 
49
- scaltainer -f /path/to/configuration/file.yml --state-file /path/to/different/state/file.yml
49
+ bundle exec scaltainer -f /path/to/configuration/file.yml --state-file /path/to/different/state/file.yml
50
50
 
51
51
  Typically one would want to repeatedly call scaltainer every minute or so. To do this
52
52
  specify the wait time between repetitions using the `-w` parameter in seconds:
53
53
 
54
- scaltainer -w 60
54
+ bundle exec scaltainer -w 60
55
55
 
56
56
  This will repeatedly call scaltainer every 60 seconds, sleeping in-between.
57
57
 
58
58
  If you would like to monitor the changes in scaling out and in. You can install
59
59
  Prometheus and add a configuration parameter pointing to its Push Gateway:
60
60
 
61
- scaltainer -g prometheus-pushgateway.monitoring.svc.cluster.local:9091
61
+ bundle exec scaltainer -g prometheus-pushgateway.monitoring.svc.cluster.local:9091
62
62
 
63
63
  Where `prometheus-pushgateway.monitoring.svc.cluster.local:9091` is the address
64
64
  of the push gateway. For Kubernetes environments the above denotes the gateway service
@@ -73,6 +73,29 @@ configuration file.
73
73
  - `scaltainer_worker_queue_size_total`: queue sizes as reported by the worker services
74
74
  - `scaltainer_ticks_total`: iterations scaltainer has performed (if `-w` is used)
75
75
 
76
+ If you prefer to use New Relic monitoring, replace the `-g` parameter with `--enable-newrelic-reporting`.
77
+ If enabled, must set the environment variables `NEW_RELIC_LICENSE_KEY` and `NEW_RELIC_APP_NAME` (see below).
78
+ Once enabled, the below will be reported:
79
+
80
+ - `Custom/WebReplicas/service`
81
+ - `Custom/WorkerReplicas/service`
82
+ - `Custom/WebMetric/service`
83
+ - `Custom/WorkerMetric/service`
84
+ - `Custom/Scaltainer/ticks`
85
+
86
+ Where `service` is a placeholder for each service defined in `yourconfig.yml`.
87
+
88
+ Here is an example NRQL to query the metrics:
89
+
90
+ ```
91
+ FROM Metric
92
+ SELECT max(newrelic.timeslice.value)
93
+ WHERE appName = 'YOUR APP NAME'
94
+ WITH METRIC_FORMAT 'Custom/WebReplicas/{web}'
95
+ FACET web
96
+ SINCE 1 day ago TIMESERIES MAX
97
+ ```
98
+
76
99
  ## Configuration
77
100
 
78
101
  ### Environment variables
@@ -133,6 +156,10 @@ environment variables are set using `docker config` or `docker secret`.
133
156
  These files should be in the form `VARIABLE=value`.
134
157
  A typical value of this variable would be: `{/run/secrets/*,/config1,/config2}`
135
158
 
159
+ - `NEW_RELIC_LICENSE_KEY`: New Relic license key, required if `--enable_newrelic_reporting`
160
+ is used.
161
+ - `NEW_RELIC_APP_NAME`: New Relic application name, required if `--enable_newrelic_reporting`
162
+ is used.
136
163
  ### Configuration file
137
164
 
138
165
  The configuration file (determined by `-f FILE` command line parameter) should be in the following form:
@@ -186,7 +213,7 @@ A service definition for scaltainer is typically something like this:
186
213
  version: '3.3'
187
214
  services:
188
215
  scaltainer:
189
- image: rayyanqcri/scaltainer:latest
216
+ image: hammady/scaltainer:latest
190
217
  command: -f /scaltainer.yml --state-file /tmp/scaltainer-state.yml -w 60
191
218
  volumes:
192
219
  - /var/run/docker.sock:/var/run/docker.sock
@@ -255,7 +282,7 @@ Where scaltainer-kube.yaml has the following content:
255
282
  app: scaltainer
256
283
  spec:
257
284
  containers:
258
- - image: rayyanqcri/scaltainer:latest
285
+ - image: hammady/scaltainer:latest
259
286
  name: scaltainer
260
287
  args:
261
288
  - -o
data/exe/scaltainer CHANGED
@@ -3,8 +3,8 @@
3
3
  require 'scaltainer'
4
4
 
5
5
  begin
6
- configfile, statefile, logger, wait, orchestrator, pushgateway = Scaltainer::Command.parse ARGV
7
- Scaltainer::Runner.new configfile, statefile, logger, wait, orchestrator, pushgateway
6
+ configfile, statefile, logger, wait, orchestrator, pushgateway, enable_newrelic_reporting = Scaltainer::Command.parse ARGV
7
+ Scaltainer::Runner.new configfile, statefile, logger, wait, orchestrator, pushgateway, enable_newrelic_reporting
8
8
  rescue => e
9
9
  $stderr.puts e.message
10
10
  $stderr.puts e.backtrace
@@ -4,7 +4,7 @@ require "optparse"
4
4
  module Scaltainer
5
5
  class Command
6
6
  def self.parse(args)
7
- configfile, statefile, wait, orchestrator, pushgateway = 'scaltainer.yml', nil, 0, :swarm, nil
7
+ configfile, statefile, wait, orchestrator, pushgateway, enable_newrelic_reporting = 'scaltainer.yml', nil, 0, :swarm, nil, false
8
8
  OptionParser.new do |opts|
9
9
  opts.banner = "Usage: scaltainer [options]"
10
10
  opts.on("-f", "--conf-file FILE", "Specify configuration file (default: scaltainer.yml)") do |file|
@@ -22,6 +22,13 @@ module Scaltainer
22
22
  opts.on("-g", "--prometheus-push-gateway ADDRESS", "Specify prometheus push gateway address in the form of host:port") do |gw|
23
23
  pushgateway = gw
24
24
  end
25
+ opts.on("--enable-newrelic-reporting", "Enable metrics pushing to New Relic") do
26
+ newrelic_license_key = ENV['NEW_RELIC_LICENSE_KEY']
27
+ newrelic_app_name = ENV['NEW_RELIC_APP_NAME']
28
+ raise 'Must set NEW_RELIC_LICENSE_KEY environment variable if --enable-newrelic-reporting is set' if newrelic_license_key.nil? || newrelic_license_key == ""
29
+ raise 'Must set NEW_RELIC_APP_NAME environment variable if --enable-newrelic-reporting is set' if newrelic_app_name.nil? || newrelic_app_name == ""
30
+ enable_newrelic_reporting = true
31
+ end
25
32
  opts.on("-v", "--version", "Show version and exit") do
26
33
  puts Scaltainer::VERSION
27
34
  exit 0
@@ -41,10 +48,12 @@ module Scaltainer
41
48
  puts " Make sure the KUBERNETES_CONTROLLER_KIND you specify is part of the api specified using KUBERNETES_API_ENDPOINT and KUBERNETES_API_VERSION"
42
49
  puts "General options:"
43
50
  puts "- HIREFIRE_TOKEN"
44
- puts "- NEW_RELIC_API_KEY"
51
+ puts "- NEW_RELIC_API_KEY: New Relic API key for retrieving web metrics"
45
52
  puts "- RESPONSE_TIME_WINDOW: defaults to 5"
46
53
  puts "- LOG_LEVEL: defaults to INFO"
47
54
  puts "- DOCKER_SECRETS_PATH_GLOB: path glob containing env files to load"
55
+ puts "- NEW_RELIC_LICENSE_KEY: New Relic license key, required if --enable_newrelic_reporting is used"
56
+ puts "- NEW_RELIC_APP_NAME: New Relic application name, required if --enable_newrelic_reporting is used"
48
57
  exit
49
58
  end
50
59
  end.parse!
@@ -58,7 +67,7 @@ module Scaltainer
58
67
  logger = Logger.new(STDOUT)
59
68
  logger.level = %w(debug info warn error fatal unknown).find_index((ENV['LOG_LEVEL'] || '').downcase) || 1
60
69
 
61
- return configfile, statefile, logger, wait, orchestrator, pushgateway
70
+ return configfile, statefile, logger, wait, orchestrator, pushgateway, enable_newrelic_reporting
62
71
  end
63
72
 
64
73
  private
@@ -2,10 +2,11 @@ require "yaml"
2
2
  require 'socket'
3
3
  require 'prometheus/client'
4
4
  require 'prometheus/client/push'
5
+ require 'newrelic_rpm'
5
6
 
6
7
  module Scaltainer
7
8
  class Runner
8
- def initialize(configfile, statefile, logger, wait, orchestrator, pushgateway)
9
+ def initialize(configfile, statefile, logger, wait, orchestrator, pushgateway, enable_newrelic_reporting)
9
10
  @orchestrator = orchestrator
10
11
  @logger = logger
11
12
  @default_service_config = {
@@ -23,11 +24,13 @@ module Scaltainer
23
24
  service_type_web = ServiceTypeWeb.new(endpoint)
24
25
  service_type_worker = ServiceTypeWorker.new(endpoint)
25
26
  register_pushgateway(pushgateway) if pushgateway
27
+ register_newrelic if enable_newrelic_reporting
26
28
  namespace = config["namespace"] || config["stack_name"]
27
29
  loop do
28
30
  run config, state, service_type_web, service_type_worker, namespace
29
31
  save_state statefile, state
30
32
  sync_pushgateway(namespace, state) if pushgateway
33
+ sync_newrelic(state) if enable_newrelic_reporting
31
34
  sleep wait
32
35
  break if wait == 0
33
36
  end
@@ -135,8 +138,8 @@ module Scaltainer
135
138
 
136
139
  def sync_pushgateway(namespace, state)
137
140
  @logger.debug("Now syncing state #{state} in namespace #{namespace}")
138
- factor = 1
139
141
  state.each do |service, state|
142
+ factor = 1
140
143
  if state["service_type"] == 'Web'
141
144
  replicas_gauge = @web_replicas_gauge
142
145
  metrics_gauge = @web_metrics_gauge
@@ -151,10 +154,28 @@ module Scaltainer
151
154
  @ticks_counter.increment(labels: {namespace: namespace})
152
155
  begin
153
156
  @pushgateway.add(@registry)
157
+ @logger.info "Pushed metrics successfully to the configured Prometheus Push Gateway"
154
158
  rescue => e
155
159
  @logger.warn "[#{e.class}] Error pushing metrics to the configured Prometheus Push Gateway: #{e.message}"
156
160
  end
157
- @logger.info "Pushed metrics successfully to the configured Prometheus Push Gateway"
161
+ end
162
+
163
+ def register_newrelic
164
+ ::NewRelic::Agent.manual_start
165
+ end
166
+
167
+ def record_newrelic_metric(name, value)
168
+ @logger.debug("Reporting NewRelic metric: #{name} = #{value}")
169
+ ::NewRelic::Agent.record_metric(name, value.to_i)
170
+ end
171
+
172
+ def sync_newrelic(state)
173
+ @logger.debug("Now reporting state #{state} to the NewRelic agent")
174
+ ::NewRelic::Agent.increment_metric('Custom/Scaltainer/ticks')
175
+ state.each do |service, state|
176
+ record_newrelic_metric "Custom/#{state["service_type"]}Replicas/#{service}", state["replicas"]
177
+ record_newrelic_metric "Custom/#{state["service_type"]}Metric/#{service}", state["metric"]
178
+ end
158
179
  end
159
180
 
160
181
  end # class
@@ -1,3 +1,3 @@
1
1
  module Scaltainer
2
- VERSION = "0.4.0"
2
+ VERSION = "0.6.0"
3
3
  end
data/publish.sh ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+ if [ ! -z "$RUBYGEMS_API_KEY" ]; then
3
+ mkdir $HOME/.gem
4
+ creds="$HOME/.gem/credentials"
5
+ echo -e "---\n:rubygems_api_key: $RUBYGEMS_API_KEY" > $creds
6
+ chmod 0600 $creds
7
+ fi
8
+
9
+ gem build scaltainer.gemspec
10
+ gem push scaltainer*.gem
data/scaltainer.gemspec CHANGED
@@ -22,15 +22,17 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ["lib"]
24
24
 
25
- spec.add_development_dependency "bundler", "~> 1.15"
26
- spec.add_development_dependency "rake", ">= 12.3.3"
27
- spec.add_development_dependency 'rspec', '~> 3.5'
28
- spec.add_development_dependency 'coderay', '~> 1.1'
29
- spec.add_development_dependency 'coveralls', '~> 0.8'
25
+ spec.add_development_dependency "bundler", "~> 2.2"
26
+ spec.add_development_dependency "rake", "~> 13.0"
27
+ spec.add_development_dependency "rspec", "~> 3.5"
28
+ spec.add_development_dependency "coderay", "~> 1.1"
29
+ spec.add_development_dependency "simplecov", "~> 0.17"
30
+ spec.add_development_dependency "simplecov-lcov", "~> 0.7"
30
31
 
31
- spec.add_runtime_dependency 'excon', '>= 0.47.0'
32
- spec.add_runtime_dependency "docker-api"
33
- spec.add_runtime_dependency "kubeclient"
34
- spec.add_runtime_dependency "dotenv"
35
- spec.add_runtime_dependency "prometheus-client"
32
+ spec.add_runtime_dependency "excon", "~> 0.47"
33
+ spec.add_runtime_dependency "docker-api", "~> 2.1"
34
+ spec.add_runtime_dependency "kubeclient", "~> 4.9"
35
+ spec.add_runtime_dependency "dotenv", "~> 2.7"
36
+ spec.add_runtime_dependency "prometheus-client", "~> 2.1"
37
+ spec.add_runtime_dependency "newrelic_rpm", "~> 7.1"
36
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scaltainer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hossam Hammady
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-29 00:00:00.000000000 Z
11
+ date: 2023-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
19
+ version: '2.2'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.15'
26
+ version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 12.3.3
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 12.3.3
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -67,89 +67,117 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.1'
69
69
  - !ruby/object:Gem::Dependency
70
- name: coveralls
70
+ name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.8'
75
+ version: '0.17'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.8'
82
+ version: '0.17'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov-lcov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.7'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.7'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: excon
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.47.0
103
+ version: '0.47'
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 0.47.0
110
+ version: '0.47'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: docker-api
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ">="
115
+ - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '0'
117
+ version: '2.1'
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ">="
122
+ - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '0'
124
+ version: '2.1'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: kubeclient
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ">="
129
+ - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: '0'
131
+ version: '4.9'
118
132
  type: :runtime
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ">="
136
+ - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: '0'
138
+ version: '4.9'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: dotenv
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - ">="
143
+ - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: '0'
145
+ version: '2.7'
132
146
  type: :runtime
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - ">="
150
+ - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: '0'
152
+ version: '2.7'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: prometheus-client
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - ">="
157
+ - - "~>"
144
158
  - !ruby/object:Gem::Version
145
- version: '0'
159
+ version: '2.1'
146
160
  type: :runtime
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - ">="
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.1'
167
+ - !ruby/object:Gem::Dependency
168
+ name: newrelic_rpm
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '7.1'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
151
179
  - !ruby/object:Gem::Version
152
- version: '0'
180
+ version: '7.1'
153
181
  description: |-
154
182
  A ruby gem inspired by HireFire to autoscale kubernetes controllers and docker services.
155
183
  Metrics can be standard average response time, New Relic web metrics, queue size for workers, ...
@@ -161,9 +189,12 @@ extensions: []
161
189
  extra_rdoc_files: []
162
190
  files:
163
191
  - ".dockerignore"
192
+ - ".github/actions/rspec_tests/action.yml"
193
+ - ".github/workflows/docker-build-push.yml"
194
+ - ".github/workflows/rubygems-release.yml"
195
+ - ".github/workflows/tests.yml"
164
196
  - ".gitignore"
165
197
  - ".rspec"
166
- - ".travis.yml"
167
198
  - Dockerfile
168
199
  - Gemfile
169
200
  - Gemfile.lock
@@ -187,6 +218,7 @@ files:
187
218
  - lib/scaltainer/service_types/web.rb
188
219
  - lib/scaltainer/service_types/worker.rb
189
220
  - lib/scaltainer/version.rb
221
+ - publish.sh
190
222
  - scaltainer.gemspec
191
223
  homepage: https://github.com/hammady/scaltainer
192
224
  licenses:
@@ -207,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
239
  - !ruby/object:Gem::Version
208
240
  version: '0'
209
241
  requirements: []
210
- rubygems_version: 3.0.3
242
+ rubygems_version: 3.1.6
211
243
  signing_key:
212
244
  specification_version: 4
213
245
  summary: Autoscale kubernetes controllers and docker services based on application
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.1
4
- - 2.2
5
- - 2.3
6
- - 2.4
7
- cache: bundler