opstat-master 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4cf77a8d238ca849725328c7688ca572748289e4d390726db0bce00210c74ffc
4
+ data.tar.gz: f1f3d1e624f127621bc790496757290a8b94591503ffe9a0c1d75ce6b3c014c8
5
+ SHA512:
6
+ metadata.gz: aff05eab2eab8ca8e223410af0ab91bf54e407ee88f6bdf11e1fad02bee5ed903b0c4835ae159abd989da3a413cc0e3eb0d59a63c65175546325baf075c50f1a
7
+ data.tar.gz: d782f03e71d3a5e1d96286a2a1f68302312ccccd49131394dab3c298cef560aeb57de8e74a151ca52bc91300a3cf01e6d3dc42eb41d3698fb30f59aee30c4171
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ opstat-master*.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in opstat.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Krzysztof Tomczyk
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
File without changes
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Opstat
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'opstat'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install opstat
18
+
19
+ ## Usage
20
+
21
+ TODO: i Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'daemons'
3
+ require 'opstat-master'
4
+
5
+ Daemons.run_proc(
6
+ 'opstatd_master', # name of daemon
7
+ # :dir_mode => :normal
8
+ :dir => '/var/run', # directory where pid file will be stored
9
+ :backtrace => true,
10
+ # :monitor => true,
11
+ :log_dir => '/var/log',
12
+ :log_output => true
13
+ ) do
14
+
15
+ Opstat::Master.main_loop
16
+ end
@@ -0,0 +1,21 @@
1
+ #!/sbin/runscript
2
+ # Copyright 1999-2013 Gentoo Foundation
3
+ # Distributed under the terms of the GNU General Public License v2
4
+ # $Header: $
5
+
6
+ depend() {
7
+ need net
8
+ }
9
+
10
+ #TODO - parameters - log file, config file, etc.
11
+ start() {
12
+ ebegin Starting opstat master
13
+ opstatd_master.rb start
14
+ eend $?
15
+ }
16
+
17
+ stop() {
18
+ ebegin Stoping opstat master
19
+ opstatd_master.rb stop
20
+ eend $?
21
+ }
@@ -0,0 +1,28 @@
1
+ module Opstat
2
+ module Common
3
+ def self.camelize(term)
4
+ string = term.to_s
5
+ string = string.sub(/^[a-z\d]*/) { $&.capitalize }
6
+ string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
7
+ end
8
+
9
+ def self.constantize(class_name)
10
+ names = class_name.split('::')
11
+ names.shift if names.empty? || names.first.empty?
12
+
13
+ constant = Object
14
+ names.each do |n|
15
+ name = Opstat::Common.camelize(n)
16
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
17
+ end
18
+ constant
19
+ end
20
+
21
+ def constantize(camel_cased_word)
22
+ Opstat::Common.constantize(camel_cased_word)
23
+ end
24
+
25
+ end
26
+ end
27
+
28
+ #TODO load only if run on main server
@@ -0,0 +1,28 @@
1
+ client:
2
+ send_data_interval: 10
3
+
4
+ mq:
5
+ queue_name: opstat
6
+ queue_address: 10.5.0.10
7
+
8
+ plugins:
9
+ cpu:
10
+ interval: 3
11
+ load:
12
+ interval: 5
13
+ # meminfo:
14
+ # interval: 4
15
+ # diskstats:
16
+ # interval: 5
17
+ # vmstat:
18
+ # interval: 3
19
+ connectionusage:
20
+ interval: 3
21
+ # facter:
22
+ # interval: 21600
23
+ oracle_tablespaces_sizes:
24
+ interval: 3600
25
+ su_user: oracle
26
+ db_user: db_user
27
+ db_password: db_password
28
+
@@ -0,0 +1,74 @@
1
+ module Opstat
2
+ # A pretty sucky config class, ripe for refactoring/improving
3
+ class Config
4
+ include Singleton
5
+
6
+ def initialize
7
+ @configured = false
8
+ @config = ''
9
+ @config_file = ''
10
+ #TODO set defaults
11
+ end
12
+
13
+ def load_config(config_file)
14
+ #set_config_defaults(configfile)
15
+ @config_file = config_file
16
+ @config = YAML.load_file(config_file)
17
+ self.set_defaults
18
+ end
19
+
20
+ def set_defaults
21
+ @config['client']['send_data_interval'] ||= 30
22
+ @config['client']['log_level'] ||= "WARN"
23
+ end
24
+
25
+ def get_mongo_config_file_path
26
+ "#{File.dirname(@config_file)}/mongoid.yml"
27
+ end
28
+
29
+ def get_influx_config
30
+ get('influxdb')
31
+ end
32
+
33
+ def get_mq_config
34
+ get('mq')
35
+ end
36
+
37
+ def get(key)
38
+ @config[key]
39
+ end
40
+
41
+ def init_config(options)
42
+ load_config(options[:config_file])
43
+ set_defaults
44
+ @config[:config_file] = options[:config_file]
45
+ end
46
+
47
+ end
48
+ end
49
+ options = {}
50
+ optparse = OptionParser.new do|opts|
51
+ # Set a banner, displayed at the top
52
+ # of the help screen.
53
+ opts.banner = "Usage: command [options]"
54
+
55
+ options[:verbose] = false
56
+ opts.on( '-v', '--verbose', 'Output more information' ) do
57
+ options[:verbose] = true
58
+ end
59
+
60
+ #TODO required options
61
+ opts.on( '-c', '--config-file String', :required, "Config file path" ) do|l|
62
+ options[:config_file] = l
63
+ end
64
+ options[:config_file] ||= '/etc/opstat/opstat.yml'
65
+
66
+ opts.on( '-h', '--help', 'Display this screen' ) do
67
+ puts opts
68
+ exit
69
+ end
70
+ end
71
+ optparse.parse!
72
+
73
+ Opstat::Config.instance.init_config(options)
74
+
@@ -0,0 +1,16 @@
1
+ module Opstat
2
+ module DB
3
+ class Influx
4
+ include Singleton
5
+ def initialize
6
+ @config = Opstat::Config.instance.get_influx_config
7
+ @influxdb = InfluxDB::Client.new @config
8
+ @influxdb = InfluxDB::Client.new @config['database'], username: @config['username'], password: @config['password'], time_precision: @config['time_precision']
9
+ end
10
+
11
+ def write_point(name, measurement)
12
+ @influxdb.write_point(name, measurement)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ require 'mongoid'
2
+ mongo_config_file = Opstat::Config.instance.get_mongo_config_file_path
3
+ Mongoid.load!(mongo_config_file)
@@ -0,0 +1,20 @@
1
+ require 'log4r'
2
+
3
+ module Opstat
4
+ module Logging
5
+ def oplogger
6
+ return @oplogger if @oplogger
7
+ @oplogger = Log4r::Logger.new self.class.to_s
8
+ @oplogger.level = @oplogger.levels.index(log_level)
9
+ outputter = Log4r::Outputter.stdout
10
+ outputter.formatter = Log4r::PatternFormatter.new(:pattern => "%l - %C - %m")
11
+ @oplogger.outputters << outputter
12
+ @oplogger
13
+ end
14
+ def log_level
15
+ @log_level ||= Opstat::Config.instance.get('client')['log_level']
16
+ @log_level
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #TODO don't allow ip_addres of loopback
4
+
5
+ module TaskServer
6
+ extend Opstat::Logging
7
+ def self.save(queue_data)
8
+ oplogger.debug queue_data
9
+
10
+ hostname = queue_data["hostname"]
11
+ ip = queue_data['ip_address']
12
+ client_version = queue_data['version']
13
+ send_data_interval = queue_data['send_data_interval']
14
+
15
+ queue_data["collected_data"].each do |data|
16
+ host = Host.find_or_create_by(hostname: hostname, ip_address: ip)
17
+ plugin = Plugin.find_or_create_by(type: data['plugin'], host_id: host.id)
18
+ host['send_data_interval'] = send_data_interval
19
+ plugin['interval'] = data['interval']
20
+ plugin_dead_ratio = 2
21
+ unless plugin['interval'].nil?
22
+ if plugin['interval'] > host['send_data_interval']
23
+ plugin_is_alive_interval = data['interval'] * plugin_dead_ratio
24
+ else
25
+ plugin_is_alive_interval = host['send_data_interval'] * plugin_dead_ratio
26
+ end
27
+ plugin['is_alive_time'] = Time.now + plugin_is_alive_interval
28
+ end
29
+
30
+ plugin.save
31
+
32
+ ##TODO reconsider if it is really needed
33
+ #client_host.touch
34
+ ##TODO reconsider if it is really needed
35
+ # client_host_plugin.touch
36
+ Opstat::Parsers::Master.instance.parse_and_save(:host => host, :plugin_data => data, :plugin => plugin)
37
+ end
38
+ end
39
+ end
40
+
41
+ #TODO EM AMQP reconnect
42
+ ##TODO - AMQP config data from /etc
43
+ module Opstat
44
+ module Master
45
+ extend Opstat::Logging
46
+ def self.main_loop
47
+ mq_config = Opstat::Config.instance.get_mq_config
48
+ Opstat::Parsers::Master.instance.load_parsers
49
+ oplogger.info 'START'
50
+ EventMachine::run do
51
+ AMQP.start(mq_config) do |connection|
52
+ oplogger.info "Connecting to AMQP broker. Running #{AMQP::VERSION} version of the gem..."
53
+
54
+ channel = AMQP::Channel.new(connection,:auto_recovery => true)
55
+ ampqqueue = channel.queue(mq_config['queue_name'],:auto_delete => false, :durable => true)
56
+ connection.on_tcp_connection_loss do |conn, settings|
57
+ oplogger.error "[network failure] Trying to reconnect..."
58
+ conn.reconnect(false, 2)
59
+ end
60
+
61
+ ampqqueue.subscribe(:ack => true) do |metadata,payload|
62
+ TaskServer::save(JSON.parse(payload))
63
+ metadata.ack
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,29 @@
1
+ require "opstat-master/version"
2
+ # Try to load rubygems. Hey rubygems, I hate you.
3
+ begin
4
+ require 'rubygems'
5
+ rescue LoadError
6
+ end
7
+ require 'yaml'
8
+ require 'log4r'
9
+ require 'eventmachine'
10
+ require 'opstat-master/db/mongo.rb'
11
+ require 'amqp'
12
+ require 'json'
13
+ require 'singleton'
14
+ require 'opstat-master/config.rb'
15
+ require 'opstat-master/common.rb'
16
+ require 'opstat-master/logging.rb'
17
+ require 'opstat-master/parsers.rb'
18
+
19
+ require 'opstat-master/master.rb'
20
+ # see the bottom of the file for further inclusions
21
+
22
+ #------------------------------------------------------------
23
+ # the top-level module
24
+ #
25
+ # all this really does is dictate how the whole system behaves, through
26
+ # preferences for things like debugging
27
+ #
28
+ # it's also a place to find top-level commands like 'debug'
29
+
@@ -0,0 +1,72 @@
1
+ module Opstat
2
+ module Parsers
3
+ class Master
4
+ include Opstat::Logging
5
+ include Singleton
6
+ def initialize
7
+ @parsers = {}
8
+ end
9
+ def load_parsers
10
+ @parsers = Opstat::Plugins.load_parsers(oplogger)
11
+ end
12
+
13
+ def parse_and_save(params)
14
+ plugin = params[:plugin]
15
+ host = params[:host]
16
+ data = params[:plugin_data]['data']
17
+ time = Time.parse(params[:plugin_data]['timestamp'])
18
+ oplogger.info "Saving parsed data collected on #{time} from #{host.id}(plugin:#{plugin[:type]} #{host[:hostname]}) "
19
+ begin
20
+ reports = @parsers[plugin[:type]].parse_data(data: data, time: time)
21
+ #TODO save errors to db
22
+ rescue Exception => e
23
+ oplogger.error "current params #{params}"
24
+ raise e
25
+ end
26
+ if reports.nil? or reports.empty?
27
+ oplogger.warn "no report data parsed - empty report for #{plugin.type}?"
28
+ return
29
+ end
30
+ reports.each do |report|
31
+ default_tags = { :host_id => host.id, :plugin_id => plugin.id, :hostname => host[:hostname] }
32
+ report_data = report.select{|k,v| not k.to_s.starts_with?('OPSTAT_TAG_')}
33
+ report_tags = report.select{|k,v| k.to_s.starts_with?('OPSTAT_TAG_')}
34
+ report_tags ||= {}
35
+ measurement_tags = report_tags.merge(default_tags)
36
+ measurement = { :values => report_data, :timestamp => time.to_i, :tags => measurement_tags, :name => plugin.type }
37
+ Opstat::DB::Influx.instance.write_point(plugin.type, measurement)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ class Report
45
+ include Mongoid::Document
46
+ include Mongoid::Attributes::Dynamic
47
+ store_in collection: "opstat.reports"
48
+ end
49
+
50
+ class User
51
+ include Mongoid::Document
52
+ include Mongoid::Attributes::Dynamic
53
+ include Mongoid::Timestamps
54
+ store_in collection: "opstat.users"
55
+ end
56
+
57
+ class Host
58
+ include Mongoid::Document
59
+ include Mongoid::Attributes::Dynamic
60
+ include Mongoid::Timestamps
61
+ store_in collection: "opstat.hosts"
62
+ has_many :plugins
63
+ end
64
+
65
+ class Plugin
66
+ include Mongoid::Document
67
+ include Mongoid::Attributes::Dynamic
68
+ include Mongoid::Timestamps
69
+ store_in collection: "opstat.plugins"
70
+ belongs_to :host
71
+ end
72
+
@@ -0,0 +1,32 @@
1
+ begin
2
+ require 'rubygems'
3
+ rescue LoadError
4
+ end
5
+ require 'yaml'
6
+ require 'log4r'
7
+ require 'opstat-plugins'
8
+ require 'eventmachine'
9
+ require 'amqp'
10
+ require 'json'
11
+ require 'singleton'
12
+ require 'influxdb'
13
+
14
+ require 'activemodel-serializers-xml'
15
+ require 'opstat-master/config.rb'
16
+ require 'opstat-master/common.rb'
17
+ require 'opstat-master/db/mongo.rb'
18
+ require 'opstat-master/db/influx.rb'
19
+ require 'opstat-master/logging.rb'
20
+ require 'opstat-master/parsers.rb'
21
+
22
+ require 'opstat-master/master.rb'
23
+ # see the bottom of the file for further inclusions
24
+
25
+ #------------------------------------------------------------
26
+ # the top-level module
27
+ #
28
+ # all this really does is dictate how the whole system behaves, through
29
+ # preferences for things like debugging
30
+ #
31
+ # it's also a place to find top-level commands like 'debug'
32
+
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require '../version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "opstat-master"
8
+ spec.version = Opstat::VERSION
9
+ spec.authors = ["Krzysztof Tomczyk"]
10
+ spec.email = ["office@optilabs.eu"]
11
+ spec.description = %q{Systems monitoring tool}
12
+ spec.summary = %q{Systems monitoring tool that works}
13
+ spec.homepage = "http://www.optilabs.eu/opstat"
14
+ spec.license = "GPL-3.0"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "opstat-plugins", Opstat::VERSION
22
+ spec.add_dependency "eventmachine"
23
+ spec.add_dependency "activemodel-serializers-xml"
24
+ spec.add_dependency "json"
25
+ spec.add_dependency "amqp"
26
+ spec.add_dependency "daemons"
27
+ spec.add_dependency "bson_ext"
28
+ spec.add_dependency "xml-simple"
29
+ spec.add_dependency "xmlhasher"
30
+ spec.add_dependency "log4r"
31
+ spec.add_dependency "influxdb"
32
+ spec.add_dependency "mongoid", "~> 6"
33
+ end
metadata ADDED
@@ -0,0 +1,231 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opstat-master
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.8
5
+ platform: ruby
6
+ authors:
7
+ - Krzysztof Tomczyk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-09-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: opstat-plugins
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.3.8
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.3.8
27
+ - !ruby/object:Gem::Dependency
28
+ name: eventmachine
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activemodel-serializers-xml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: amqp
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: daemons
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bson_ext
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: xml-simple
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: xmlhasher
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: log4r
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: influxdb
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: mongoid
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '6'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '6'
181
+ description: Systems monitoring tool
182
+ email:
183
+ - office@optilabs.eu
184
+ executables:
185
+ - opstatd_master.rb
186
+ extensions: []
187
+ extra_rdoc_files: []
188
+ files:
189
+ - ".gitignore"
190
+ - Gemfile
191
+ - LICENSE.txt
192
+ - README
193
+ - README.md
194
+ - Rakefile
195
+ - bin/opstatd_master.rb
196
+ - init.d/opstatd_master
197
+ - lib/opstat-master.rb
198
+ - lib/opstat-master/common.rb
199
+ - lib/opstat-master/config.rb
200
+ - lib/opstat-master/config/opstat.yml
201
+ - lib/opstat-master/db/influx.rb
202
+ - lib/opstat-master/db/mongo.rb
203
+ - lib/opstat-master/logging.rb
204
+ - lib/opstat-master/master.rb
205
+ - lib/opstat-master/opstat-master.rb
206
+ - lib/opstat-master/parsers.rb
207
+ - opstat-master.gemspec
208
+ homepage: http://www.optilabs.eu/opstat
209
+ licenses:
210
+ - GPL-3.0
211
+ metadata: {}
212
+ post_install_message:
213
+ rdoc_options: []
214
+ require_paths:
215
+ - lib
216
+ required_ruby_version: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ required_rubygems_version: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ requirements: []
227
+ rubygems_version: 3.2.33
228
+ signing_key:
229
+ specification_version: 4
230
+ summary: Systems monitoring tool that works
231
+ test_files: []