diff --git a/serialization_data_server/Gemfile b/serialization_data_server/Gemfile index d0bd09fa..5e465da3 100644 --- a/serialization_data_server/Gemfile +++ b/serialization_data_server/Gemfile @@ -6,6 +6,7 @@ gem "thin" gem "sinatra" gem "redis" gem "rake" +gem "sys-filesystem" gem 'vcap_common', '>= 1.0.8', :require => ['vcap/common', 'vcap/component'] gem 'vcap_logging', '>=0.1.3', :require => ['vcap/logging'] diff --git a/serialization_data_server/Gemfile.lock b/serialization_data_server/Gemfile.lock index abe5edaf..0bb60667 100644 --- a/serialization_data_server/Gemfile.lock +++ b/serialization_data_server/Gemfile.lock @@ -7,6 +7,7 @@ GEM daemons (1.1.5) diff-lcs (1.1.3) eventmachine (0.12.11.cloudfoundry.3) + ffi (1.0.11) json_pure (1.6.5) multi_json (1.0.4) nats (0.4.22.beta.8) @@ -41,6 +42,8 @@ GEM rack (~> 1.3, >= 1.3.4) rack-protection (~> 1.1, >= 1.1.2) tilt (~> 1.3, >= 1.3.3) + sys-filesystem (1.0.0) + ffi (= 1.0.11) thin (1.3.1) daemons (>= 1.0.9) eventmachine (>= 0.12.6) @@ -70,6 +73,7 @@ DEPENDENCIES simplecov simplecov-rcov sinatra + sys-filesystem thin uuidtools vcap_common (>= 1.0.8) diff --git a/serialization_data_server/lib/server.rb b/serialization_data_server/lib/server.rb index 5a5e920e..11f8c29b 100644 --- a/serialization_data_server/lib/server.rb +++ b/serialization_data_server/lib/server.rb @@ -1,8 +1,13 @@ # Copyright (c) 2009-2011 VMware, Inc. +require "eventmachine" +require "vcap/common" +require "vcap/component" require "sinatra" require "nats/client" require "redis" require "json" +require "sys/filesystem" +include Sys $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..', 'mysql') @@ -40,8 +45,26 @@ def initialize(opts) end end @nats = NATS.connect(:uri => opts[:mbus]) { + VCAP::Component.register( + :nats => @nats, + :type => "SerializationDataServer", + :index => opts[:index] || 0, + :config => opts + ) + on_connect_nats } + + z_interval = opts[:z_interval] || 30 + EM.add_periodic_timer(z_interval) do + EM.defer { update_varz } + end if @nats + + # Defer 5 seconds to give service a change to wake up + EM.add_timer(5) do + EM.defer { update_varz } + end if @nats + Kernel.at_exit do if EM.reactor_running? send_deactivation_notice(false) @@ -65,6 +88,30 @@ def on_connect_nats() @redis = connect_redis end + def varz_details() + varz = {} + # check NFS disk free space + free_space = 0 + begin + stats = Filesystem.stat("#{@base_dir}") + avail_blocks = stats.blocks_available + total_blocks = stats.blocks + free_space = format("%.2f", avail_blocks.to_f / total_blocks.to_f * 100) + rescue => e + @logger.error("Failed to get filesystem info of #{@base_dir}: #{e}") + end + varz[:nfs_free_space] = free_space + + varz + end + + def update_varz() + varz = varz_details + varz.each { |k, v| + VCAP::Component.varz[k] = v + } + end + def connect_redis() redis_config = %w(host port password).inject({}){|res, o| res[o.to_sym] = @opts[:redis][o]; res} Redis.new(redis_config) diff --git a/serialization_data_server/vendor/cache/ffi-1.0.11.gem b/serialization_data_server/vendor/cache/ffi-1.0.11.gem new file mode 100644 index 00000000..e43bed56 Binary files /dev/null and b/serialization_data_server/vendor/cache/ffi-1.0.11.gem differ diff --git a/serialization_data_server/vendor/cache/sys-filesystem-1.0.0.gem b/serialization_data_server/vendor/cache/sys-filesystem-1.0.0.gem new file mode 100644 index 00000000..ce0ad892 Binary files /dev/null and b/serialization_data_server/vendor/cache/sys-filesystem-1.0.0.gem differ