puma-cloudwatch 0.2.0 → 0.3.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: a921bab00785245aefb2570d27d05402679d20fc8a7e27d37c4d2d3f201bf487
4
- data.tar.gz: 22659775c4c299d935a76e9d1ba9f770d973d359e85f68bf0c813663157a9693
3
+ metadata.gz: 30c13a9edd19ef80be39c8595fff1bcd873fcb73142f22ddc4411b46ca422e34
4
+ data.tar.gz: 87ac141ad365b30c9b1dd9faedb7a5e796741f6cbfe9aa1aeac7cb8bd61c72cd
5
5
  SHA512:
6
- metadata.gz: 5f4dd10d03c089fb82417b6bbc883eef15042f07f58b714fc651cf3a4495a5c4afc86275bed3e480487d66c980a41487c7bb80fec12404e760ba2a5f45886f68
7
- data.tar.gz: e1b87394b4f173ccabed12fffeddac6c4296aa56117181ff1297f4ded6d3e4374c9e3dd1d1b45f4ffed1a8fc1cf0cd99c3ca1b941d1bab173d1f684c4edc13ef
6
+ metadata.gz: d735125967e0129352dd4952bec95452ae9cc7b971a56016e2970e10558c73bd12d5b8b9ca9222f998f8e423040b75c86408d5c323602b64b92006e68e8928ea
7
+ data.tar.gz: 16af951c663bb2e20585842ade8c0a9fac670ecbb818f5c0decfc35a7ae83bbc6eca01fdca709b9e93ae66cf61a4a8d51e0755578b1d87c79cf00eccf9698700
data/CHANGELOG.md CHANGED
@@ -3,7 +3,11 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/).
5
5
 
6
- ## [0.1.0]
6
+ ## [0.3.0]
7
+ - add PUMA\_CLOUDWATCH\_ENABLED env var check
8
+ - improve puma-cloudwatch plugin message
9
+
10
+ ## [0.2.0]
7
11
  - add PUMA\_CLOUDWATCH\_DEBUG flag
8
12
  - fixes for ruby 2.3
9
13
  - Update looper.rb puts
data/README.md CHANGED
@@ -1,22 +1,27 @@
1
1
  # Puma Cloudwatch Plugin
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/puma-cloudwatch.svg)](https://badge.fury.io/rb/puma-cloudwatch)
4
+
3
5
  A [puma](https://puma.io) plugin that sends puma stats to CloudWatch.
4
6
 
5
7
  ## Usage
6
8
 
7
- You should configure the `PUMA_CLOUDWATCH_DIMENSION_VALUE` env variable to include your application name.
8
- For example, if you're application is named "myapp", this would be a good value to use:
9
+ **Important**: To enable the plugin to send metrics to CloudWatch you must set the `PUMA_CLOUDWATCH_ENABLED` env variable. This allows you to send only metrics on configured servers and not unintentionally send them locally.
10
+
11
+ It also strongly encourage to sent the `PUMA_CLOUDWATCH_DIMENSION_VALUE` env variable to include your application name. For example, if your application is named "demo-web", this would be a good value to use:
9
12
 
10
- PUMA_CLOUDWATCH_DIMENSION_VALUE=myapp-puma
13
+ PUMA_CLOUDWATCH_DIMENSION_VALUE=demo-web-puma
11
14
 
12
- Then you can get metrics for your `myapp-puma` app. List of metrics:
15
+ Then you can get metrics for your `demo-web-puma` app. List of metrics:
13
16
 
14
17
  * pool_capacity: the number of requests that the server is capable of taking right now.
15
18
  * max_threads: preconfigured maximum number of worker threads.
16
19
  * running: the number of running threads (spawned threads) for any Puma worker.
17
20
  * backlog: the number of connections in that worker's "todo" set waiting for a worker thread.
18
21
 
19
- The `pool_capacity` metric is important. It shows how busy the server is getting before it reaches capacity.
22
+ The `pool_capacity` metric is important. It can be used to show how busy the server is getting before it reaches capacity. The formula is:
23
+
24
+ busy_percent = ( 1 - pool_capacity / max_threads ) * 100
20
25
 
21
26
  ### Environment Variables
22
27
 
@@ -24,17 +29,19 @@ The plugin's settings can be controlled with environmental variables:
24
29
 
25
30
  Env Var | Description | Default Value
26
31
  --- | --- | ---
27
- PUMA\_CLOUDWATCH\_NAMESPACE | CloudWatch metric namespace | WebServer
32
+ PUMA\_CLOUDWATCH\_DEBUG | When set, the plugin prints out the metrics that get sent to CloudWatch. | (unset)
28
33
  PUMA\_CLOUDWATCH\_DIMENSION\_NAME | CloudWatch metric dimension name | App
29
34
  PUMA\_CLOUDWATCH\_DIMENSION\_VALUE | CloudWatch metric dimension value | puma
35
+ PUMA\_CLOUDWATCH\_ENABLED | Enables sending of the data to CloudWatch. | (unset)
30
36
  PUMA\_CLOUDWATCH\_FREQUENCY | How often to send data to CloudWatch in seconds. | 60
31
- PUMA\_CLOUDWATCH\_NOOP | When set, the plugin prints out the metrics instead of sending them to cloudwatch. | (unset)
37
+ PUMA\_CLOUDWATCH\_NAMESPACE | CloudWatch metric namespace | WebServer
38
+ PUMA\_CLOUDWATCH\_MUTE\_START\_MESSAGE | Mutes the "puma-cloudwatch plugin" startup message | (unset)
32
39
 
33
- ### Sum and Frequency
40
+ ### Sum and Frequency Normalization
34
41
 
35
- If you leave the `PUMA_CLOUDWATCH_FREQUENCY` at its default of 60 seconds and graph out the `pool_capacity` capacity with a 1-minute period resolution, then the CloudWatch Sum statistic is useful. It shows how busy all the `myapp-puma` servers are. Particularly, the `pool_capacity` shows available capacity, and `pool_threads` shows the total threads.
42
+ If you leave the `PUMA_CLOUDWATCH_FREQUENCY` at its default of 60 seconds and graph out the `pool_capacity` capacity with a 1-minute period resolution, then the CloudWatch Sum statistic is "normalized" and useful. It shows the overall capacity total of the `demo-web-puma` servers. Particularly, the `pool_capacity` shows available capacity, and `pool_threads` shows the total threads configured.
36
43
 
37
- **Important**: If you change the CloudWatch send frequency, then Sum statistic must be normalized. For example, let's say you use `PUMA_CLOUDWATCH_FREQUENCY=30`. Then puma-cloudwatch will send data every 30s. However, if the chart is still using a 1-minute period, then the Sum statistic would "double". Capacity has not doubled, puma-cloudwatch is just sending twice as much data. To normalize the Sum, set the time period resolution to match the frequency. In this case: 30 seconds.
44
+ If you change the CloudWatch send frequency, then Sum statistic must be normalized by changing the period on the chart. For example, let's say you use `PUMA_CLOUDWATCH_FREQUENCY=30`. Then puma-cloudwatch will send data every 30s. However, if the chart is still using a 1-minute period, then the Sum statistic would "double". Capacity has not doubled, puma-cloudwatch is just sending twice as much data for that period. To normalize the Sum, set the time period resolution to match the frequency. In this case: 30 seconds.
38
45
 
39
46
  If you use the Average statistic, then you don't have to worry about normalizing. Average is inherently normalized.
40
47
 
@@ -71,4 +78,4 @@ If are you using ECS awsvpc, make sure you have the task running on private subn
71
78
 
72
79
  ## Contributing
73
80
 
74
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/puma_cloudwatch.
81
+ Bug reports and pull requests are welcome on GitHub at https://github.com/tongueroo/puma-cloudwatch
@@ -9,16 +9,27 @@ class PumaCloudwatch::Metrics
9
9
  @control_url = options[:control_url]
10
10
  @control_auth_token = options[:control_auth_token]
11
11
  @frequency = Integer(ENV['PUMA_CLOUDWATCH_FREQUENCY'] || 60)
12
+ @enabled = ENV['PUMA_CLOUDWATCH_ENABLED'] || false
12
13
  end
13
14
 
14
15
  def run
15
16
  raise StandardError, "Puma control app is not activated" if @control_url == nil
16
- puts "puma-cloudwatch plugin: Will send data every #{@frequency} seconds."
17
+ puts(message) unless ENV['PUMA_CLOUDWATCH_MUTE']
17
18
  Thread.new do
18
19
  perform
19
20
  end
20
21
  end
21
22
 
23
+ def message
24
+ message = "puma-cloudwatch plugin: Will send data every #{@frequency} seconds."
25
+ unless @enabled
26
+ to_enable = "To enable set the environment variable PUMA_CLOUDWATCH_ENABLED=1"
27
+ message = "Disabled: #{message}\n#{to_enable}"
28
+ end
29
+ message
30
+ end
31
+
32
+ private
22
33
  def perform
23
34
  loop do
24
35
  stats = Fetcher.new(@options).call
@@ -27,5 +38,9 @@ class PumaCloudwatch::Metrics
27
38
  sleep @frequency
28
39
  end
29
40
  end
41
+
42
+ def enabled?
43
+ !!@enabled
44
+ end
30
45
  end
31
46
  end
@@ -15,7 +15,8 @@ class PumaCloudwatch::Metrics
15
15
  @metrics = metrics
16
16
  @namespace = ENV['PUMA_CLOUDWATCH_NAMESPACE'] || "WebServer"
17
17
  @dimension_name = ENV['PUMA_CLOUDWATCH_DIMENSION_NAME'] || "App"
18
- @dimension_value = ENV['PUMA_CLOUDWATCH_DIMENSION_VALUE'] || "puma" # IE: myapp-puma
18
+ @dimension_value = ENV['PUMA_CLOUDWATCH_DIMENSION_VALUE'] || "puma"
19
+ @enabled = ENV['PUMA_CLOUDWATCH_ENABLED'] || false
19
20
  end
20
21
 
21
22
  def call
@@ -75,20 +76,20 @@ class PumaCloudwatch::Metrics
75
76
 
76
77
  private
77
78
  def put_metric_data(params)
78
- if noop? or ENV['PUMA_CLOUDWATCH_DEBUG']
79
+ if ENV['PUMA_CLOUDWATCH_DEBUG']
79
80
  message = "sending data to cloudwatch:"
80
- message = "NOOP: #{message}" if noop?
81
+ message = "NOOP: #{message}" unless enabled?
81
82
  puts message
82
83
  pp params
83
84
  end
84
85
 
85
- unless noop?
86
+ if enabled?
86
87
  cloudwatch.put_metric_data(params)
87
88
  end
88
89
  end
89
90
 
90
- def noop?
91
- !ENV["PUMA_CLOUDWATCH_NOOP"].nil?
91
+ def enabled?
92
+ !!@enabled
92
93
  end
93
94
 
94
95
  def cloudwatch
@@ -1,3 +1,3 @@
1
1
  module PumaCloudwatch
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puma-cloudwatch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-17 00:00:00.000000000 Z
11
+ date: 2019-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-cloudwatch