public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/db/, roverlay/stats/
@ 2013-08-16 13:13 André Erdmann
  0 siblings, 0 replies; 2+ messages in thread
From: André Erdmann @ 2013-08-16 13:13 UTC (permalink / raw
  To: gentoo-commits

commit:     63f53086f703b1e7e85ebffecdbe3522beb516d4
Author:     André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Fri Aug 16 13:11:53 2013 +0000
Commit:     André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Fri Aug 16 13:11:53 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=63f53086

roverlay, stats rating: fixup

* KNOWN_UNKNOWN must not contain mixed/uppercase words
* using has_issues() instead of "not is_ok()" when generating suggestions
* search for unknown values, not keys when generating suggestions

---
 roverlay/db/rrdtool.py   |  2 +-
 roverlay/stats/rating.py | 45 +++++++++++++++++++++++++++++----------------
 2 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/roverlay/db/rrdtool.py b/roverlay/db/rrdtool.py
index bd98492..b326e7d 100644
--- a/roverlay/db/rrdtool.py
+++ b/roverlay/db/rrdtool.py
@@ -132,7 +132,7 @@ class RRDArchive ( object ):
 class RRD ( object ):
    # should be subclassed 'cause _do_create() is not implemented here
 
-   KNOWN_UNKNOWN = frozenset ({ 'U', 'UNKNOWN', '-nan', 'nan', })
+   KNOWN_UNKNOWN = frozenset ({ 'u', 'unknown', '-nan', 'nan', })
 
    RRDTOOL_CMDV_HEAD = ( 'rrdtool', )
 

diff --git a/roverlay/stats/rating.py b/roverlay/stats/rating.py
index 3f6b9e0..eb0559e 100644
--- a/roverlay/stats/rating.py
+++ b/roverlay/stats/rating.py
@@ -51,6 +51,8 @@ class StatsRating ( object ):
    STATUS_CRIT_LOW  = STATUS_CRIT | STATUS_TOO_LOW
    STATUS_CRIT_HIGH = STATUS_CRIT | STATUS_TOO_HIGH
 
+   STATUS_ISSUES    = STATUS_WARN | STATUS_ERR | STATUS_CRIT
+
    STATUS_FAIL = ( ( 2**8 ) - 1 ) ^ STATUS_OK
 
 
@@ -89,9 +91,20 @@ class NumStatsCounterRating ( StatsRating ):
    # --- end of new_fail_counter (...) ---
 
    def get_value ( self, unknown_value=0 ):
-      return self.value or unknown_value
+      v = self.value
+      return v if v is not None else unknown_value
    # --- end of get_value (...) ---
 
+   def get_value_str ( self, unknown_value="unknown" ):
+      v = self.value
+      return str ( v ) if v is not None else unknown_value
+   # --- end of get_value_str (...) ---
+
+   @property
+   def value_str ( self ):
+      return self.get_value_str()
+   # --- end of value_str (...) ---
+
    def get_rating ( self, value ):
       if value is None:
          return self.STATUS_UNDEF
@@ -134,6 +147,10 @@ class NumStatsCounterRating ( StatsRating ):
       return self.status & self.STATUS_CRIT
    # --- end of is_critical (...) ---
 
+   def has_issues ( self ):
+      return self.status & self.STATUS_ISSUES
+   # --- end of has_issues (...) ---
+
    def is_ok ( self ):
       return self.status == self.STATUS_OK
    # --- end of is_ok (...) ---
@@ -152,7 +169,9 @@ class NumStatsCounterRating ( StatsRating ):
 
    def get_item ( self, item_ok, item_warn, item_err, item_crit, item_undef ):
       status = self.status
-      if self.status & self.STATUS_CRIT:
+      if self.status & self.STATUS_UNDEF:
+         return item_undef
+      elif self.status & self.STATUS_CRIT:
          return item_crit
       elif self.status & self.STATUS_ERR:
          return item_err
@@ -326,19 +345,19 @@ class RoverlayNumStatsRating ( NumStatsRating ):
          code_format = { 'cstart': "<code>", 'cend': "</code>", }
 
 
-      if any ( value is None for value in self.values ):
+      if any ( value is None for value in self.values.values() ):
          yield (
             "database contains UNKNOWNS",
             [ "run roverlay", ]
          )
 
-      if not self.pc_repo.is_ok():
+      if self.pc_repo.has_issues():
          yield (
             "low repo package count",
             [ "check the repo config file", "drop repos without packages" ]
          )
 
-      if not self.pc_distmap.is_ok():
+      if self.pc_distmap.has_issues():
          details = [
             'run {cstart}roverlay --distmap-verify{cend} to fix '
             'the distmap'.format ( **code_format )
@@ -365,13 +384,9 @@ class RoverlayNumStatsRating ( NumStatsRating ):
                "no ebuilds created (not an issue in incremental mode)",
                None
             )
-      elif not self.pc_success.is_ok():
-         yield (
-            "only a few ebuilds created (not an issue in incremental mode)",
-            None
-         )
 
-      if self.pc_fail.get_value() > 0 or not self.pc_success.is_ok():
+
+      if self.pc_fail.get_value() > 0 or self.pc_success.has_issues():
          details = []
          if self.pc_fail_dep.get_value() > 0:
             details.append ( "write dependency rules" )
@@ -387,23 +402,21 @@ class RoverlayNumStatsRating ( NumStatsRating ):
          )
 
 
-      if not self.pc_fail_err.is_ok():
+      if self.pc_fail_err.has_issues():
          yield (
             "failures due to unknown errors",
             [ 'check the log files for python exceptions and report them', ]
          )
 
-      if not self.ec_pre.is_ok() or not self.ec_post.is_ok():
+      if self.ec_pre.has_issues() or self.ec_post.has_issues():
          yield ( "ebuild loss occurred (no suggestions available)", None )
 
-      if not self.ec_revbump.is_ok():
+      if self.ec_revbump.has_issues():
          yield (
             "unexpected ebuild revbump count (no suggestions available)",
             None
          )
 
-      # +++ UNKNOWNS
-
    # --- end of get_suggestions (...) ---
 
 # --- end of RoverlayNumStatsRating ---


^ permalink raw reply related	[flat|nested] 2+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/db/, roverlay/stats/
@ 2013-08-14 14:56 André Erdmann
  0 siblings, 0 replies; 2+ messages in thread
From: André Erdmann @ 2013-08-14 14:56 UTC (permalink / raw
  To: gentoo-commits

commit:     4d26054ebd65c210cf75c5f6257c8db9ca00560e
Author:     André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed Aug 14 14:41:12 2013 +0000
Commit:     André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed Aug 14 14:41:12 2013 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=4d26054e

fixup rrd database creation

* normalize/balance steps/rows when creating RRAs so that values can actually
  be used for updating them
* create the database file exactly once (!)
* _call_rrdtool() log command that is run
* let rrdtool control timestamps by default

---
 roverlay/db/rrdtool.py | 60 ++++++++++++++++++++++++++++++++++++++------------
 roverlay/stats/rrd.py  |  6 ++---
 2 files changed, 49 insertions(+), 17 deletions(-)

diff --git a/roverlay/db/rrdtool.py b/roverlay/db/rrdtool.py
index 76bded7..98c3bf5 100644
--- a/roverlay/db/rrdtool.py
+++ b/roverlay/db/rrdtool.py
@@ -25,7 +25,8 @@ class RRDVariable ( object ):
    DST = frozenset ({ 'GAUGE', 'COUNTER', 'DERIVE', 'ABSOLUTE', })
 
    def __init__ ( self,
-      name, val_type, val_min=None, val_max=None, heartbeat=None, step=300
+      name, val_type, val_min=None, val_max=None, heartbeat=None, step=300,
+      heartbeat_factor=2,
    ):
       if val_type not in self.DST:
          raise ValueError ( "invalid DS type: {!r}".format ( val_type ) )
@@ -34,7 +35,7 @@ class RRDVariable ( object ):
       self.val_type  = val_type
       self.val_min   = val_min
       self.val_max   = val_max
-      self.heartbeat = heartbeat or ( 2 * step )
+      self.heartbeat = heartbeat or ( heartbeat_factor * step )
    # --- end of __init__ (...) ---
 
    def get_key ( self ):
@@ -84,25 +85,49 @@ class RRDArchive ( object ):
    __str__ = get_key
 
    @classmethod
+   def _balance_cdp_rows ( cls, step, cdp_time, row_count, min_row_count=2 ):
+      my_cdp_time = cdp_time
+      my_rows     = row_count
+      my_minrows  = min_row_count - 1
+
+      while step > my_cdp_time and my_rows > my_minrows:
+         my_cdp_time  *= 2
+         my_rows     //= 2
+
+      if step <= my_cdp_time and my_rows > my_minrows:
+         return ( my_cdp_time // step, my_rows )
+      else:
+         raise Exception ( "cannot get steps/rows." )
+   # --- end of _balance_cdp_rows (...) ---
+
+   @classmethod
+   def get_new ( cls, cf, xff, step, cdp_time, row_count ):
+      steps, rows = cls._balance_cdp_rows ( step, cdp_time, row_count )
+      return cls ( cf, xff, steps, rows )
+   # --- end of get_new (...) ---
+
+
+   @classmethod
    def new_day ( cls, cf, xff, step=300 ):
-      # one CDP per hour (24 rows)
-      return cls ( cf, xff, 3600 // step, 24 )
+      # by default, one CDP per hour (24 rows)
+      return cls.get_new ( cf, xff, step, 3600, 24 )
    # --- end of new_day (...) ---
 
    @classmethod
    def new_week ( cls, cf, xff, step=300 ):
       # one CDP per 6h (28 rows)
-      return cls ( cf, xff, 21600 // step, 42 )
+      return cls.get_new ( cf, xff, step, 21600, 28 )
    # --- end of new_week (...) ---
 
    @classmethod
    def new_month ( cls, cf, xff, step=300 ):
       # one CDP per day (31 rows)
-      return cls ( cf, xff, (24*3600) // step, 31 )
+      return cls.get_new ( cf, xff, step, 86400, 31 )
    # --- end of new_month (...) ---
 
 # --- end of RRDArchive ---
 
+
 class RRD ( object ):
    # should be subclassed 'cause _do_create() is not implemented here
 
@@ -151,10 +176,15 @@ class RRD ( object ):
       )
    # --- end of _call_rrdtool_command (...) ---
 
-   def _call_rrdtool ( self, args, return_success=True, get_output=False ):
+   def _call_rrdtool ( self,
+      args, return_success=True, get_output=False, binary_stdout=False
+   ):
+      cmdv = self.RRDTOOL_CMDV_HEAD + args
+      self.logger.info ( "calling rrdtool: {!r}".format ( cmdv ) )
+
       if get_output:
          cmd_call, output = run_command_get_output (
-            self.RRDTOOL_CMDV_HEAD + args, None
+            cmdv, env=None, binary_stdout=binary_stdout
          )
          if output[1]:
             logger = self.logger.getChild ( 'rrdtool_call' )
@@ -166,8 +196,7 @@ class RRD ( object ):
 
       else:
          return run_command (
-            self.RRDTOOL_CMDV_HEAD + args, None, self.logger,
-            return_success=return_success
+            cmdv, env=None, logger=self.logger, return_success=return_success
          )
    # --- end of _call_rrdtool (...) ---
 
@@ -203,8 +232,11 @@ class RRD ( object ):
    # --- end of check_readonly (...) ---
 
    def create_if_missing ( self ):
-      if self._dbfile_exists or not os.access ( self.filepath, os.F_OK ):
-         return self.create()
+      if not self._dbfile_exists:
+         if os.access ( self.filepath, os.F_OK ):
+            self._dbfile_exists = True
+         else:
+            self.create()
    # --- end of create_if_missing (...) ---
 
    def create ( self ):
@@ -218,9 +250,9 @@ class RRD ( object ):
    # --- end of create (...) ---
 
    def add ( self, values, timestamp=None ):
-      if timestamp is False:
+      if timestamp is None:
          t = 'N'
-      elif timestamp is None:
+      elif timestamp is True:
          t = str ( self.time_now() )
       else:
          t = str ( timestamp )

diff --git a/roverlay/stats/rrd.py b/roverlay/stats/rrd.py
index 2f9cce3..ffccbe1 100644
--- a/roverlay/stats/rrd.py
+++ b/roverlay/stats/rrd.py
@@ -28,7 +28,7 @@ class StatsDB ( roverlay.db.rrdtool.RRD ):
       return self._call_rrdtool (
          (
             'create', filepath,
-            '--start', str ( self.INIT_TIME ),
+            ##'--start', str ( self.INIT_TIME ),
             '--step', str ( self.step ),
          )
          + tuple ( v.get_key() for v in self.rrd_vars )
@@ -43,14 +43,14 @@ class StatsDB ( roverlay.db.rrdtool.RRD ):
    def make_vars ( self ):
       heartbeat = 2 * self.step
       return tuple (
-         RRDVariable ( k, 'DERIVE', val_max=0, heartbeat=heartbeat )
+         RRDVariable ( k, 'DERIVE', val_min=0, heartbeat=heartbeat )
             for k in self.collector.NUMSTATS_KEYS
       )
    # --- end of make_vars (...) ---
 
    def make_rra ( self ):
       return (
-         #RRDArchive.new_day   ( 'LAST',    0.7, step=self.step ),
+         RRDArchive.new_day   ( 'LAST',    0.7, step=self.step ),
          RRDArchive.new_week  ( 'AVERAGE', 0.7, step=self.step ),
          RRDArchive.new_month ( 'AVERAGE', 0.7, step=self.step ),
       )


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-08-16 13:13 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-16 13:13 [gentoo-commits] proj/R_overlay:master commit in: roverlay/db/, roverlay/stats/ André Erdmann
  -- strict thread matches above, loose matches on Subject: below --
2013-08-14 14:56 André Erdmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox