* [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