You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by se...@apache.org on 2016/04/07 00:30:06 UTC

[whimsy] branch master updated: Fix monitoring to always use symbolic keys Check if public json log file has changed before copying Unit test improvement

This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch master
in repository https://git-dual.apache.org/repos/asf/whimsy.git

The following commit(s) were added to refs/heads/master by this push:
       new  c3cc337   Fix monitoring to always use symbolic keys Check if public json log file has changed before copying Unit test improvement
c3cc337 is described below

commit c3cc337b8222cc465361f3001b92b77f6d7cc146
Author: Sebb <se...@apache.org>
AuthorDate: Wed Apr 6 23:29:58 2016 +0100

    Fix monitoring to always use symbolic keys
    Check if public json log file has changed before copying
    Unit test improvement
---
 www/status/monitor.rb              | 23 ++++++++++++++++++-----
 www/status/monitors/public_json.rb | 23 +++++++++++++----------
 www/status/monitors/system.rb      | 11 ++++++-----
 www/status/monitors/unit_test.rb   | 17 ++++++++++++++---
 4 files changed, 51 insertions(+), 23 deletions(-)

diff --git a/www/status/monitor.rb b/www/status/monitor.rb
index 8be70f9..16d1ad0 100644
--- a/www/status/monitor.rb
+++ b/www/status/monitor.rb
@@ -1,8 +1,20 @@
 #
 # Overall monitor class is responsible for loading and running each
 # monitor in the `monitors` directory, collecting and normalizing the
-# results and outputting it as JSON.
+# results and outputting it as JSON for use in the GUI.
 #
+# The previous status is passed to the monitor on the next run so it can
+# determine when to take non-idempotent actions such as sending a message
+#
+# The monitors are called frequently, so the return status built up by
+# a monitor should be easily comparable with the input status. This means
+# using the same key and value formats (at least for monitors that need to
+# compare them).
+#
+# Although both string and symbolic keys can be used in hashes, the syntax
+# for symbolic keys is rather neater, so we use symbolic keys throughout.
+# This means that the JSON file is parsed into a hash using symbolic keys,
+# and any variables used as keys need to be converted to symbols.
 
 require 'json'
 require 'time'
@@ -21,8 +33,8 @@ class Monitor
       mtime = File.exist?(status_file) ? File.mtime(status_file) : Time.at(0)
       file.flock(File::LOCK_EX)
 
-      # fetch previous status
-      baseline = JSON.parse(file.read) rescue {}
+      # fetch previous status (using symbolic keys)
+      baseline = JSON.parse(file.read, {symbolize_names: true}) rescue {}
       baseline[:data] = {} unless baseline[:data].instance_of? Hash
 
       # If status was updated while waiting for the lock, use the new status
@@ -39,7 +51,7 @@ class Monitor
         threads << Thread.new do
           begin
             # invoke method to determine current status
-            previous = baseline[:data][method.to_s] || {mtime: Time.at(0)}
+            previous = baseline[:data][method.to_sym] || {mtime: Time.at(0)}
             status = Monitor.send(method, previous) || previous
 
             # convert non-hashes in proper statuses
@@ -116,7 +128,8 @@ class Monitor
       status[:level] ||= 'danger'
     end
 
-    # normalize time
+    # normalize time 
+    # If the called monitor wants to compare status hashes it should store the correct format
     if status[:mtime].instance_of? Time
       status[:mtime] = status[:mtime].gmtime.iso8601
     end
diff --git a/www/status/monitors/public_json.rb b/www/status/monitors/public_json.rb
index 9a7be03..35076c8 100644
--- a/www/status/monitors/public_json.rb
+++ b/www/status/monitors/public_json.rb
@@ -3,6 +3,7 @@
 #
 
 require 'fileutils'
+require 'time'
 
 def Monitor.public_json(previous_status)
   danger_period = 86_400 # one day
@@ -18,14 +19,14 @@ def Monitor.public_json(previous_status)
   status = {}
 
   Dir[logs].each do |log|
-    name = File.basename(log).sub('public-', '')
+    name = File.basename(log).sub('public-', '').to_sym
 
     begin
       status[name] = {
         href: "../logs/#{File.basename(log)}",
-        mtime: File.mtime(log)
+        mtime: File.mtime(log).gmtime.iso8601, # to agree with normalise
+        level: 'success' # to agree with normalise
       }
-
       contents = File.read(log, encoding: Encoding::UTF_8)
 
       # Ignore Wunderbar logging for normal messages (may occur multiple times)
@@ -81,13 +82,15 @@ def Monitor.public_json(previous_status)
       }
     end
 
-    # Save a copy of the log
-    # append the severity so can track more problems
-    lvl = status[name][:level] 
-    if lvl and lvl != 'info'
-      name = File.basename(log)
-      FileUtils.copy log, File.join(archive, name + '.' + lvl),
-        preserve: true
+    # Has there been a change since the last check?
+    if status[name] != previous_status[:data][name]
+      lvl = status[name][:level] 
+      if lvl and lvl != 'info' # was there a problem?
+        # Save a copy of the log; append the severity so can track more problems
+        name = File.basename(log)
+        # temporarily allow the date stamp to be updated so we can see if the file is copied mulitple times
+        FileUtils.copy log, File.join(archive, name + '.' + lvl) #, preserve: true
+      end
     end
   end
 
diff --git a/www/status/monitors/system.rb b/www/status/monitors/system.rb
index 34465e0..67a77ae 100644
--- a/www/status/monitors/system.rb
+++ b/www/status/monitors/system.rb
@@ -6,16 +6,17 @@
 require 'time'
 
 def Monitor.system(previous_status)
-  name='puppet'
+  name=:puppet
   status = {}
   status[name] = {
-    mtime: Time.now.gmtime.iso8601,
-    command: 'service puppet status'
+    command: 'service puppet status',
   }
   begin
     puppet = `service puppet status`.strip
-    if puppet.include? ' * agent is running'
-      status[name].merge! level: 'warning', title: puppet
+    if puppet.include? '* agent is running'
+      status[name].merge! level: 'success', data: puppet
+    else
+      status[name].merge! level: 'warning', data: puppet
     end
     rescue Exception => e
       status[name] = {
diff --git a/www/status/monitors/unit_test.rb b/www/status/monitors/unit_test.rb
index b16361d..ce36b92 100644
--- a/www/status/monitors/unit_test.rb
+++ b/www/status/monitors/unit_test.rb
@@ -6,8 +6,19 @@ require 'json'
 # the same string is used to extract the sample and call the method
 def runtest(method_name)
   status_file = File.expand_path('../../status.json', __FILE__)
-  baseline = JSON.parse(File.read(status_file)) rescue {}
+  baseline = JSON.parse(File.read(status_file),{symbolize_names: true}) rescue {}
   baseline[:data] = {} unless baseline[:data].instance_of? Hash
-  previous = baseline[:data][method_name] || {mtime: Time.at(0)}
-  puts JSON.pretty_generate(Monitor.send(method_name, previous))
+  previous = baseline[:data][method_name.to_sym] || {mtime: Time.at(0)}
+  response = Monitor.send(method_name, previous)
+  if response == previous
+    puts "No change in response"
+  elsif response[:data] and response[:data] == previous[:data]
+    # main class adds a trailer after the data
+    puts "No change in response data"
+  else
+    puts "Reponse differs:"
+    puts previous
+    puts response
+  end
+  puts JSON.pretty_generate(response)
 end

-- 
To stop receiving notification emails like this one, please contact
['"commits@whimsical.apache.org" <co...@whimsical.apache.org>'].