newrelic_f5_plugin 1.0.0 → 1.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.
data/CHANGES CHANGED
@@ -1,3 +1,10 @@
1
+ * 1.0.1
2
+ - Added Virtual Server statistics:
3
+ - Requests per second
4
+ - Current Connections
5
+ - Connections per second
6
+ - Throughput (In/Out)
7
+
1
8
  * 1.0.0
2
9
  - Updated version for release!
3
10
 
data/Gemfile CHANGED
@@ -2,11 +2,11 @@ source 'https://rubygems.org'
2
2
 
3
3
  # This gemfile is used in the context of development on this plugin agent.
4
4
 
5
- gem 'newrelic_plugin', :git => 'git@github.com:newrelic-platform/newrelic_plugin.git', :branch => 'release'
6
- gem "snmp"
7
- gem "rake", ">0.9.2"
5
+ gem 'newrelic_plugin', '>= 0.2.11'
6
+ gem 'snmp'
7
+ gem 'rake', '>0.9.2'
8
8
  gem 'test-unit'
9
- gem "shoulda"
10
- gem "mocha"
11
- gem "rdoc", ">2.4.2"
9
+ gem 'shoulda'
10
+ gem 'mocha'
11
+ gem 'rdoc', '>2.4.2'
12
12
 
@@ -30,24 +30,29 @@ A *read-only* SNMP community is required for each device to be monitored. Curren
30
30
  SNMP verison 2c is supported.
31
31
 
32
32
 
33
- == Instructions for running the F5 plugin agent
33
+ == Installation and Running
34
34
 
35
- 1. Install the +newrelic_plugin+ gem.
36
- 2. Install this gem.
37
- 3. Create an installation directory (like /opt/newrelic/f5 ).
38
- 4. In the installation directory, execute
35
+ 1. Install this gem from RubyGems:
36
+
37
+ gem install newrelic_f5_plugin
38
+
39
+ 2. Create an installation directory (like /opt/newrelic/f5 ).
40
+ 3. In the installation directory, execute
39
41
 
40
42
  f5_monitor install -l LICENSE_KEY
41
43
 
42
44
  using the license key from your New Relic account.
43
- 5. Edit the +config/newrelic_plugin.yml+ file generated in step 4. Setup name/hostname/port/snmp_community for each F5 you wish to monitor.
44
- 6. Execute
45
+ 4. Edit the +config/newrelic_plugin.yml+ file generated in step 4. Setup name/hostname/port/snmp_community for each F5 you wish to monitor.
46
+ 5. Execute
45
47
 
46
48
  f5_monitor run
47
49
 
48
50
  == Developer Instructions
49
51
 
50
52
  1. Fork/Clone the repository
51
- 2. Install bundler and do +bundle install+
52
- 3. Do <b><tt>rake -T</tt></b> to see rake options, including tests.
53
+ 2. Install bundler and run:
54
+
55
+ bundle install
56
+
57
+ 3. Run <b><tt>rake -T</tt></b> to see rake options, including tests.
53
58
 
@@ -1,8 +1,9 @@
1
1
  require 'rubygems'
2
2
  require 'newrelic_f5_plugin/nodes'
3
+ require 'newrelic_f5_plugin/virtuals'
3
4
  require 'newrelic_f5_plugin/agent'
4
5
 
5
6
  module NewRelic::F5Plugin
6
- VERSION = '1.0.0'
7
+ VERSION = '1.0.1'
7
8
  end
8
9
 
@@ -28,7 +28,7 @@ module NewRelic::F5Plugin
28
28
  # Build: 1.3.6.1.4.1.3375.2.1.4.3.0
29
29
  class Agent < NewRelic::Plugin::Agent::Base
30
30
  agent_guid 'com.newrelic.f5'
31
- agent_version '1.0.0'
31
+ agent_version '1.0.1' # FIXME This should come from NewRelic::F5Plugin VERSION constant
32
32
  agent_config_options :hostname, :port, :snmp_community
33
33
  agent_human_labels('F5') { "#{hostname}" }
34
34
 
@@ -60,6 +60,37 @@ module NewRelic::F5Plugin
60
60
  report_metric m, node_status[m][:label], node_status[m][:count]
61
61
  }
62
62
 
63
+ #
64
+ # Collect virtual server statistics
65
+ #
66
+ vs = NewRelic::F5Plugin::Virtuals.new snmp
67
+ virtual_requests = vs.get_requests
68
+ virtual_requests.each_key { |m|
69
+ report_counter_metric m, "req/sec", virtual_requests[m]
70
+ }
71
+
72
+ virtual_conns_current = vs.get_conns_current
73
+ virtual_conns_current.each_key { |m|
74
+ report_metric m, "conns", virtual_conns_current[m]
75
+ }
76
+
77
+ virtual_conns_total = vs.get_conns_total
78
+ virtual_conns_total.each_key { |m|
79
+ report_counter_metric m, "conn/sec", virtual_conns_total[m]
80
+ }
81
+
82
+ virtual_throughput_in = vs.get_throughput_in
83
+ virtual_throughput_in.each_key { |m|
84
+ report_counter_metric m, "bits/sec", virtual_throughput_in[m]
85
+ }
86
+
87
+ virtual_throughput_out = vs.get_throughput_out
88
+ virtual_throughput_out.each_key { |m|
89
+ report_counter_metric m, "bits/sec", virtual_throughput_out[m]
90
+ }
91
+
92
+
93
+
63
94
  snmp.close
64
95
  rescue => e
65
96
  $stderr.puts "#{e}: #{e.backtrace.join("\n ")}"
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'newrelic_plugin'
6
+ require 'snmp'
7
+
8
+
9
+ module NewRelic
10
+ module F5Plugin
11
+
12
+ class Virtuals
13
+ attr_accessor :vs_names, :snmp_manager
14
+
15
+ OID_LTM_VIRTUAL_SERVERS = "1.3.6.1.4.1.3375.2.2.10"
16
+
17
+ OID_LTM_VIRTUAL_SERV_STAT = "#{OID_LTM_VIRTUAL_SERVERS}.2"
18
+ OID_LTM_VIRTUAL_SERV_ENTRY = "#{OID_LTM_VIRTUAL_SERV_STAT}.3.1"
19
+ OID_LTM_VIRTUAL_SERV_STAT_NAME = "#{OID_LTM_VIRTUAL_SERV_ENTRY}.1"
20
+ OID_LTM_VIRTUAL_SERV_STAT_CLIENT_BYTES_IN = "#{OID_LTM_VIRTUAL_SERV_ENTRY}.7"
21
+ OID_LTM_VIRTUAL_SERV_STAT_CLIENT_BYTES_OUT = "#{OID_LTM_VIRTUAL_SERV_ENTRY}.9"
22
+ OID_LTM_VIRTUAL_SERV_STAT_CLIENT_TOT_CONNS = "#{OID_LTM_VIRTUAL_SERV_ENTRY}.11"
23
+ OID_LTM_VIRTUAL_SERV_STAT_CLIENT_CUR_CONNS = "#{OID_LTM_VIRTUAL_SERV_ENTRY}.12"
24
+ OID_LTM_VIRTUAL_SERV_STAT_TOT_REQUESTS = "#{OID_LTM_VIRTUAL_SERV_ENTRY}.27"
25
+
26
+
27
+
28
+ #
29
+ # Init
30
+ #
31
+ def initialize(snmp = nil)
32
+ @vs_names = [ ]
33
+
34
+ if snmp
35
+ @snmp_manager = snmp
36
+ else
37
+ @snmp_manager = nil
38
+ end
39
+ end
40
+
41
+
42
+
43
+ #
44
+ # Get the list of Virtual Server names
45
+ #
46
+ def get_names(snmp = nil)
47
+ snmp = snmp_manager unless snmp
48
+
49
+ if snmp
50
+ @vs_names.clear
51
+
52
+ snmp.walk([OID_LTM_VIRTUAL_SERV_STAT_NAME]) do |row|
53
+ row.each do |vb|
54
+ @vs_names.push(vb.value)
55
+ end
56
+ end
57
+
58
+ return @vs_names
59
+ end
60
+ end
61
+
62
+
63
+
64
+ #
65
+ # Gather VS Total Requests
66
+ #
67
+ def get_requests(snmp = nil)
68
+ metrics = { }
69
+ index = 0
70
+ snmp = snmp_manager unless snmp
71
+
72
+ if snmp
73
+ get_names(snmp) if @vs_names.empty?
74
+
75
+ snmp.walk([OID_LTM_VIRTUAL_SERV_STAT_TOT_REQUESTS]) do |row|
76
+ row.each do |vb|
77
+ metrics["Virtual Servers/Requests/#{@vs_names[index]}"] = vb.value.to_i
78
+ index += 1
79
+ end
80
+ end
81
+
82
+ return metrics
83
+ end
84
+ end
85
+
86
+
87
+
88
+ #
89
+ # Gather VS Connection count
90
+ #
91
+ def get_conns_current(snmp = nil)
92
+ metrics = { }
93
+ index = 0
94
+ snmp = snmp_manager unless snmp
95
+
96
+ if snmp
97
+ get_names(snmp) if @vs_names.empty?
98
+
99
+ snmp.walk([OID_LTM_VIRTUAL_SERV_STAT_CLIENT_CUR_CONNS]) do |row|
100
+ row.each do |vb|
101
+ metrics["Virtual Servers/Current Connections/#{@vs_names[index]}"] = vb.value.to_i
102
+ index += 1
103
+ end
104
+ end
105
+
106
+ return metrics
107
+ end
108
+ end
109
+
110
+
111
+
112
+ #
113
+ # Gather VS Connection rate
114
+ #
115
+ def get_conns_total(snmp = nil)
116
+ metrics = { }
117
+ index = 0
118
+ snmp = snmp_manager unless snmp
119
+
120
+ if snmp
121
+ get_names(snmp) if @vs_names.empty?
122
+
123
+ snmp.walk([OID_LTM_VIRTUAL_SERV_STAT_CLIENT_TOT_CONNS]) do |row|
124
+ row.each do |vb|
125
+ metrics["Virtual Servers/Connection Rate/#{@vs_names[index]}"] = vb.value.to_i
126
+ index += 1
127
+ end
128
+ end
129
+
130
+ return metrics
131
+ end
132
+ end
133
+
134
+
135
+
136
+ #
137
+ # Gather VS Throughput Inbound (returns in bits)
138
+ #
139
+ def get_throughput_in(snmp = nil)
140
+ metrics = { }
141
+ index = 0
142
+ snmp = snmp_manager unless snmp
143
+
144
+ if snmp
145
+ get_names(snmp) if @vs_names.empty?
146
+
147
+ snmp.walk([OID_LTM_VIRTUAL_SERV_STAT_CLIENT_BYTES_IN]) do |row|
148
+ row.each do |vb|
149
+ metrics["Virtual Servers/Throughput/In/#{@vs_names[index]}"] = (vb.value.to_f * 8)
150
+ index += 1
151
+ end
152
+ end
153
+
154
+ return metrics
155
+ end
156
+ end
157
+
158
+
159
+
160
+ #
161
+ # Gather VS Throughput Inbound (returns in bits)
162
+ #
163
+ def get_throughput_out(snmp = nil)
164
+ metrics = { }
165
+ index = 0
166
+ snmp = snmp_manager unless snmp
167
+
168
+ if snmp
169
+ get_names(snmp) if @vs_names.empty?
170
+
171
+ snmp.walk([OID_LTM_VIRTUAL_SERV_STAT_CLIENT_BYTES_OUT]) do |row|
172
+ row.each do |vb|
173
+ metrics["Virtual Servers/Throughput/Out/#{@vs_names[index]}"] = (vb.value.to_f * 8)
174
+ index += 1
175
+ end
176
+ end
177
+
178
+ return metrics
179
+ end
180
+ end
181
+
182
+
183
+
184
+ end
185
+ end
186
+ end
187
+
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'newrelic_f5_plugin'
16
- s.version = '1.0.0'
17
- s.date = '2013-06-18'
16
+ s.version = '1.0.1'
17
+ s.date = '2013-06-21'
18
18
  s.rubyforge_project = 'newrelic_f5_plugin'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
@@ -76,6 +76,7 @@ to find out how to install and run the plugin agent.
76
76
  lib/newrelic_f5_plugin.rb
77
77
  lib/newrelic_f5_plugin/agent.rb
78
78
  lib/newrelic_f5_plugin/nodes.rb
79
+ lib/newrelic_f5_plugin/virtuals.rb
79
80
  newrelic_f5_plugin.gemspec
80
81
  test/f5_monitor_test.rb
81
82
  test/plugin_test.rb
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newrelic_f5_plugin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-18 00:00:00.000000000 Z
12
+ date: 2013-06-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: newrelic_plugin
@@ -67,6 +67,7 @@ files:
67
67
  - lib/newrelic_f5_plugin.rb
68
68
  - lib/newrelic_f5_plugin/agent.rb
69
69
  - lib/newrelic_f5_plugin/nodes.rb
70
+ - lib/newrelic_f5_plugin/virtuals.rb
70
71
  - newrelic_f5_plugin.gemspec
71
72
  - test/f5_monitor_test.rb
72
73
  - test/plugin_test.rb