clear_skies 0.4.1 → 0.5.4

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
  SHA1:
3
- metadata.gz: 71658311ffdc9ed619d871de1c83e0536f973af9
4
- data.tar.gz: a25bb06314702201194df39f39eb07456753aff6
3
+ metadata.gz: 4663b9f343938c385dbea126a760ead8b1680241
4
+ data.tar.gz: 83704537b0a74a203504639974d8c77ff36df7fe
5
5
  SHA512:
6
- metadata.gz: ef27ddde07cc95c78d34dec964bf3251ee129d91081f7a0d2d0d1775b8a774f54a106c66dd6541dcffe69741812942ced6d56d93cd7e55dea62129f3b92eeb83
7
- data.tar.gz: 129defa2139170c0a31133dedc835712ef912c3055070d2c2dfcd182b97760f09ae250329d1cff6677f020f317cbb08b7aa466bd6d4b81f4fd03e6844e0dab60
6
+ metadata.gz: 37c48599ec83e12fafca817bb478ffa10f34034a7c51e97516949c085edd8e6ac2d2f6c7db6555555881e1ee88dfe383d53b508adf47e235f4cbbec810e8e6ed
7
+ data.tar.gz: dcf63b1909ad72ed5e4c595b6ed9f490e61449f9f6edbd715d394d1ccbad79153846a18a4192a0e9e9995040ca8c8e09f8bc28597d2119134270e2cca3b696fa
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- clear_skies (0.4.1)
4
+ clear_skies (0.5.4)
5
5
  awesome_print
6
6
  aws-sdk
7
7
  elasticsearch
@@ -74,7 +74,7 @@ GEM
74
74
  multipart-post (>= 1.2, < 3)
75
75
  globalid (0.4.0)
76
76
  activesupport (>= 4.2.0)
77
- greek_fire (0.4.1)
77
+ greek_fire (0.5.0)
78
78
  rails (>= 4.2.0)
79
79
  i18n (0.8.6)
80
80
  jmespath (1.3.1)
@@ -87,7 +87,7 @@ GEM
87
87
  mime-types-data (~> 3.2015)
88
88
  mime-types-data (3.2016.0521)
89
89
  mini_portile2 (2.2.0)
90
- minitest (5.10.2)
90
+ minitest (5.10.3)
91
91
  multi_json (1.12.1)
92
92
  multipart-post (2.0.0)
93
93
  nio4r (2.1.0)
@@ -13,6 +13,7 @@ require "clear_skies/aws/cloud_watch/billing"
13
13
  require "clear_skies/aws/cloud_watch/rds_gauge"
14
14
  require "clear_skies/aws/cloud_watch/elb_gauge"
15
15
  require "clear_skies/aws/cloud_watch/elastic_beanstalk_gauge"
16
+ require "clear_skies/aws/cloud_watch/redshift_gauge"
16
17
  require "clear_skies/aws/cloud_watch/request_counter"
17
18
  require "clear_skies/redis/report"
18
19
  require "clear_skies/elasticsearch/report"
@@ -10,6 +10,10 @@ module ClearSkies
10
10
  def self.cloudwatch_client
11
11
  @client ||= Aws::CloudWatch::Client.new(region: "us-east-1")
12
12
  end
13
+
14
+ def metrics
15
+ Rails.cache.fetch(self.to_s, expires_in: 1.hour) { super }
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -5,8 +5,8 @@ module ClearSkies
5
5
  def self.beanstalk_client
6
6
  @beanstalk_client ||= ::Aws::ElasticBeanstalk::Client.new
7
7
  end
8
- def initialize(metric_name, dimension, statistics, description: nil, &block)
9
- super("AWS/ElasticBeanstalk", metric_name, dimension, statistics, description: description, &block)
8
+ def initialize(metric_name, dimension, statistics, description: nil, aws_parameters:nil, &block)
9
+ super("AWS/ElasticBeanstalk", metric_name, dimension, statistics, description: description, aws_parameters: aws_parameters, &block)
10
10
  end
11
11
 
12
12
  def application_name(environment_name)
@@ -6,8 +6,8 @@ module ClearSkies
6
6
  def self.elb_client
7
7
  @elb_client ||= Aws::ElasticLoadBalancing::Client.new
8
8
  end
9
- def initialize(metric_name, dimension, statistics, description: nil, &block)
10
- super("AWS/ELB", metric_name, dimension, statistics, description: description, &block)
9
+ def initialize(metric_name, dimension, statistics, description: nil, aws_parameters:nil, &block)
10
+ super("AWS/ELB", metric_name, dimension, statistics, description: description, aws_parameters: aws_parameters, &block)
11
11
  end
12
12
 
13
13
  def tags(load_balancer_name)
@@ -46,10 +46,14 @@ module ClearSkies
46
46
 
47
47
  next unless @block.call(labels) if @block
48
48
 
49
+ start_time = Time.now.advance(@aws_parameters[:start_time] || {minutes: -6})
50
+ end_time = Time.now.advance(@aws_parameters[:end_time] || {minutes: -5})
51
+ period = @aws_parameters[:period] || end_time - start_time
52
+
49
53
  stats = metric.get_statistics(
50
- start_time: Time.now.advance(@aws_parameters[:start_time] || {minutes: -6}),
51
- end_time: Time.now.advance(@aws_parameters[:end_time] || {minutes: -5}),
52
- period: @aws_parameters[:period] || 1,
54
+ start_time: start_time,
55
+ end_time: end_time,
56
+ period: period,
53
57
  statistics: @statistics,
54
58
  extended_statistics: @extended_statistics,
55
59
  dimensions: metric.dimensions
@@ -3,8 +3,8 @@ module ClearSkies
3
3
 
4
4
  module CloudWatch
5
5
  class RDSGauge < ClearSkies::AWS::CloudWatch::Gauge
6
- def initialize(metric_name, dimension, statistics, description: nil, &block)
7
- super("AWS/RDS", metric_name, dimension, statistics, description: description, &block)
6
+ def initialize(metric_name, dimension, statistics, description: nil, aws_parameters:nil, &block)
7
+ super("AWS/RDS", metric_name, dimension, statistics, description: description, aws_parameters: aws_parameters, &block)
8
8
  end
9
9
 
10
10
  def tags(db)
@@ -0,0 +1,40 @@
1
+ module ClearSkies
2
+ module AWS
3
+ module CloudWatch
4
+ class RedshiftGauge < ClearSkies::AWS::CloudWatch::Gauge
5
+ def initialize(metric_name, dimension, statistics, description: nil, aws_parameters:nil, &block)
6
+ super("AWS/Redshift", metric_name, dimension, statistics, description: description, aws_parameters: aws_parameters, &block)
7
+ end
8
+
9
+ def extra_labels(cluster_id)
10
+ labels = {}
11
+
12
+ cluster = Aws::Redshift::Client.new.describe_clusters({
13
+ cluster_identifier: cluster_id
14
+ }).clusters[0]
15
+
16
+ vpc_id = cluster.vpc_id
17
+ labels["vpc_id"] = vpc_id if vpc_id.present?
18
+
19
+ cluster.tags.each do |tag|
20
+ labels[tag.key.downcase] = tag.value
21
+ end
22
+ labels
23
+ rescue Aws::Redshift::Errors::ClusterNotFound
24
+ return labels
25
+ end
26
+
27
+ def labels_from_metric(metric)
28
+ labels = super(metric)
29
+
30
+ if labels.has_key?("cluster_identifier")
31
+ labels.merge!(Rails.cache.fetch("#{labels["cluster_identifier"]}_extra_labels_", expires_in: 1.hour, race_condition_ttl: 60.seconds) do
32
+ extra_labels(labels["cluster_identifier"])
33
+ end)
34
+ end
35
+ labels
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,4 +1,5 @@
1
1
  require 'elasticsearch'
2
+ require 'uri'
2
3
 
3
4
  module ClearSkies
4
5
  module Elasticsearch
@@ -12,65 +13,157 @@ module ClearSkies
12
13
  @reports ||= []
13
14
  end
14
15
 
15
- attr_reader :url, :extra_labels, :metrics
16
+
17
+ def self.flatten_hash(hash, prefix="elasticsearch")
18
+ ret = HashWithIndifferentAccess.new
19
+ hash.each do |k, value|
20
+ name = "#{prefix}_#{k}"
21
+ if value.is_a?(Hash)
22
+ ret.merge!(flatten_hash(value, name))
23
+ elsif(value.is_a?(Numeric))
24
+ ret[name] = value
25
+ end
26
+ end
27
+ return ret
28
+ end
29
+
30
+ attr_reader :url, :extra_labels
16
31
  def initialize(url, extra_labels)
17
32
  @url = url
18
- @extra_labels = extra_labels
19
- GreekFire::Measure.before_metrics { refresh }
33
+
34
+ @extra_labels = {host: URI(url).host}.merge extra_labels
20
35
  end
21
36
 
22
- def elasticsearch_metrics(client, index)
23
- metrics = OpenStruct.new
24
- metrics.index = index
25
- stats = client.indices.stats["indices"][index]["total"]
26
- metrics.docs_count = stats["docs"]["count"]
27
- metrics.docs_deleted = stats["docs"]["deleted"]
28
- metrics
37
+ def metrics
38
+ client = ::Elasticsearch::Client.new(hosts: url)
39
+ stats = client.cluster.stats
40
+ ClearSkies::Elasticsearch::Report.flatten_hash(stats)
29
41
  end
30
42
 
31
- def refresh
43
+ def indicies
32
44
  client = ::Elasticsearch::Client.new(hosts: @url)
33
- aliases = client.indices.get_aliases
45
+ client.indices.get_aliases
46
+ end
34
47
 
35
- @metrics = aliases.map do |index, _aliases|
36
- elasticsearch_metrics(client, index)
48
+ def report_indicies
49
+ indicies.map do |index|
50
+ ReportIndex.new(self, index)
37
51
  end
38
52
  end
39
53
 
40
- end
54
+ def nodes
55
+ client = ::Elasticsearch::Client.new(hosts: @url)
56
+ client.nodes.stats["nodes"]
57
+ end
41
58
 
42
- class Measure < GreekFire::Measure
43
- def initialize(name, &block)
44
- super(name) do |label|
45
- block.call(label.delete(:metric))
59
+ def report_nodes
60
+ nodes.map do |node_name, node_props|
61
+ ReportNode.new(self, node_name, node_props)
46
62
  end
47
63
  end
64
+ end
48
65
 
66
+ class ReportIndex
67
+ attr_reader :report, :index
49
68
 
50
- def labels
51
- ClearSkies::Elasticsearch::Report.reports.map do |report|
52
- report.metrics.map do |metric|
53
- report.extra_labels.merge({index: metric.index, metric: metric })
54
- end
55
- end.flatten
69
+ def initialize(report, index)
70
+ @report = report
71
+ @index = index
72
+ @extra_labels = { index: index_alias }
73
+ end
74
+
75
+ def index_alias
76
+ @index[1]["aliases"].keys&.first || @index[0]
77
+ end
78
+
79
+ def index_name
80
+ @index[0]
81
+ end
82
+
83
+ def extra_labels
84
+ @report.extra_labels.merge(@extra_labels)
85
+ end
86
+
87
+
88
+ def metrics
89
+ client = ::Elasticsearch::Client.new(hosts: report.url)
90
+ stats = client.indices.stats["indices"][index_name]["total"]
91
+ ClearSkies::Elasticsearch::Report.flatten_hash(stats)
56
92
  end
57
93
  end
58
94
 
59
- class Gauge < ClearSkies::Elasticsearch::Measure
60
- def to_partial_path
61
- GreekFire::Gauge._to_partial_path
95
+ class ReportNode
96
+ attr_reader :report, :extra_labels
97
+
98
+ def initialize(report, node_name, node_props)
99
+ @report = report
100
+ @node_props = node_props
101
+ @extra_labels = { node_name: node_name }
102
+ end
103
+
104
+ def extra_labels
105
+ @report.extra_labels.merge(@extra_labels)
106
+ end
107
+
108
+ def metrics
109
+ ClearSkies::Elasticsearch::Report.flatten_hash(@node_props, "elasticsearch_node")
62
110
  end
111
+
63
112
  end
64
- class Counter < ClearSkies::Elasticsearch::Measure
65
- def to_partial_path
66
- GreekFire::Counter._to_partial_path
113
+
114
+
115
+ class MeasureSet < GreekFire::MeasureSet
116
+ def items
117
+ metrics = []
118
+
119
+ ### Cluster Metrics ##
120
+ labels = ClearSkies::Elasticsearch::Report.reports.map do | report|
121
+ GreekFire::SmartLabel.new(report.metrics, report.extra_labels)
122
+ end
123
+
124
+ metric_names = labels.map {|i| i.value.keys}.flatten.uniq
125
+
126
+ metric_names.each do |metric|
127
+ metrics << GreekFire::Gauge.new(metric, labels: labels) do |label|
128
+ label.value[metric]
129
+ end
130
+ end
131
+
132
+ ### Index Metrics
133
+ labels = ClearSkies::Elasticsearch::Report.reports.map do | report|
134
+ report.report_indicies.map do |report_index|
135
+ GreekFire::SmartLabel.new(report_index.metrics, report_index.extra_labels)
136
+ end
137
+ end.flatten
138
+
139
+ metric_names = labels.map {|i| i.value.keys}.flatten.uniq
140
+
141
+ metric_names.each do |metric|
142
+ metrics << GreekFire::Gauge.new(metric, labels: labels) do |label|
143
+ label.value[metric]
144
+ end
145
+ end
146
+
147
+ ### Node Metrics
148
+ labels = ClearSkies::Elasticsearch::Report.reports.map do | report|
149
+ report.report_nodes.map do |report_node|
150
+ GreekFire::SmartLabel.new(report_node.metrics, report_node.extra_labels)
151
+ end
152
+ end.flatten
153
+
154
+ metric_names = labels.map {|i| i.value.keys}.flatten.uniq
155
+
156
+ metric_names.each do |metric|
157
+ metrics << GreekFire::Gauge.new(metric, labels: labels) do |label|
158
+ label.value[metric]
159
+ end
160
+ end
161
+
162
+ metrics
67
163
  end
68
164
  end
165
+
69
166
  end
70
167
  end
71
168
 
72
- # GreekFire::Metric.register(ClearSkies::Elasticsearch::Gauge.new("elasticsearch_docs_count") { |metrics| metrics.docs_count })
73
- # GreekFire::Metric.register(ClearSkies::Elasticsearch::Gauge.new("elasticsearch_docs_deleted") { |metrics| metrics.docs_deleted })
74
-
75
-
76
- #For a <DIM>, grab N metrics.
169
+ GreekFire::Metric.register ClearSkies::Elasticsearch::MeasureSet.new
@@ -29,16 +29,17 @@ module ClearSkies
29
29
  ReportDimension.new(self, dimension)
30
30
  end
31
31
  end
32
-
33
- def items
34
- report_dimensions.map
35
- end
36
32
  end
37
33
 
38
34
  class MeasureSet < GreekFire::MeasureSet
39
35
  def items
40
- report_dimensions = ClearSkies::Redis::Report.reports.map(&:report_dimensions).flatten
41
- return [] unless report_dimensions.length > 0
36
+ labels = ClearSkies::Redis::Report.reports.map do | report|
37
+ report.report_dimensions.map do |report_dimension|
38
+ GreekFire::SmartLabel.new(report_dimension.metrics, report_dimension.extra_labels)
39
+ end
40
+ end.flatten
41
+
42
+ return [] unless labels.length > 0
42
43
 
43
44
  [
44
45
  "keys",
@@ -52,7 +53,9 @@ module ClearSkies
52
53
  "rdb_last_bgsave_time_sec",
53
54
  "total_commands_processed"
54
55
  ].map do |metric_name|
55
- ClearSkies::Redis::Gauge.new(report_dimensions, "redis", metric_name)
56
+ GreekFire::Gauge.new("redis_#{metric_name}", labels: labels) do |label|
57
+ label.value[metric_name.to_sym]
58
+ end
56
59
  end
57
60
  end
58
61
  end
@@ -63,53 +66,31 @@ module ClearSkies
63
66
  def initialize(report, dimension)
64
67
  @report = report
65
68
  @dimension = dimension
69
+ @extra_labels = { db: dimension }
70
+ end
71
+
72
+ def extra_labels
73
+ @report.extra_labels.merge(@extra_labels)
66
74
  end
67
75
 
68
76
  def metrics
69
77
  redis = ::Redis.new(host: report.host, port: report.port, db: @dimension)
70
78
  redis_info = redis.info
71
79
 
72
- metrics = OpenStruct.new
73
- metrics.keys = redis.dbsize
74
- metrics.last_save = Time.now.to_i - redis.lastsave
75
- metrics.uptime = redis_info["uptime_in_seconds"].to_f
76
- metrics.connected_clients = redis_info["connected_clients"].to_i
77
- metrics.blocked_clients = redis_info["blocked_clients"].to_i
78
- metrics.used_memory = redis_info["used_memory"].to_f
79
- metrics.mem_fragmentation_ratio = redis_info["mem_fragmentation_ratio"].to_f
80
- metrics.rdb_changes_since_last_save = redis_info["rdb_changes_since_last_save"].to_f
81
- metrics.rdb_last_bgsave_time_szec = redis_info["rdb_last_bgsave_time_sec"].to_f
82
- metrics.total_commands_processed = redis_info["total_commands_processed"].to_f
80
+ metrics = HashWithIndifferentAccess.new
81
+ metrics[:keys ]= redis.dbsize
82
+ metrics[:last_save ]= Time.now.to_i - redis.lastsave
83
+ metrics[:uptime ]= redis_info["uptime_in_seconds"].to_f
84
+ metrics[:connected_clients ]= redis_info["connected_clients"].to_i
85
+ metrics[:blocked_clients ]= redis_info["blocked_clients"].to_i
86
+ metrics[:used_memory ]= redis_info["used_memory"].to_f
87
+ metrics[:mem_fragmentation_ratio ]= redis_info["mem_fragmentation_ratio"].to_f
88
+ metrics[:rdb_changes_since_last_save ]= redis_info["rdb_changes_since_last_save"].to_f
89
+ metrics[:rdb_last_bgsave_time_szec ]= redis_info["rdb_last_bgsave_time_sec"].to_f
90
+ metrics[:total_commands_processed ]= redis_info["total_commands_processed"].to_f
83
91
  metrics
84
92
  end
85
93
  end
86
-
87
- class Measure < GreekFire::Measure
88
- def initialize(report_dimensions, prefix, name)
89
- @report_dimensions = report_dimensions
90
- super("#{prefix}_#{name}") do |label|
91
- label.delete(:metric).metrics.to_h[name.to_sym]
92
- end
93
- end
94
-
95
-
96
- def labels
97
- @report_dimensions.map do |report_dimension|
98
- report_dimension.report.extra_labels.merge({metric: report_dimension })
99
- end
100
- end
101
- end
102
-
103
- class Gauge < ClearSkies::Redis::Measure
104
- def to_partial_path
105
- GreekFire::Gauge._to_partial_path
106
- end
107
- end
108
- class Counter < ClearSkies::Redis::Measure
109
- def to_partial_path
110
- GreekFire::Counter._to_partial_path
111
- end
112
- end
113
94
  end
114
95
  end
115
96
 
@@ -1,3 +1,3 @@
1
1
  module ClearSkies
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clear_skies
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Constantine
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-17 00:00:00.000000000 Z
11
+ date: 2017-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: puma
@@ -150,6 +150,7 @@ files:
150
150
  - lib/clear_skies/aws/cloud_watch/elb_gauge.rb
151
151
  - lib/clear_skies/aws/cloud_watch/gauge.rb
152
152
  - lib/clear_skies/aws/cloud_watch/rds_gauge.rb
153
+ - lib/clear_skies/aws/cloud_watch/redshift_gauge.rb
153
154
  - lib/clear_skies/aws/cloud_watch/request_counter.rb
154
155
  - lib/clear_skies/aws/reservation_utilization.rb
155
156
  - lib/clear_skies/elasticsearch/report.rb