Skip to content

Commit

Permalink
Merge pull request locustio#12 from edx/jeskew/ci_robustness_fixes
Browse files Browse the repository at this point in the history
Confidence interval robustness fixes.
  • Loading branch information
cpennington committed Aug 27, 2015
2 parents eabaea0 + b597c24 commit 9d62326
Showing 1 changed file with 32 additions and 26 deletions.
58 changes: 32 additions & 26 deletions locust/stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -550,19 +550,19 @@ def percentile(self, include_empty=True):


class StatsError(object):
def __init__(self, method, name, error, occurences=0):
def __init__(self, method, name, error, occurrences=0):
self.method = method
self.name = name
self.error = error
self.occurences = occurences
self.occurrences = occurrences

@classmethod
def create_key(cls, method, name, error):
key = "%s.%s.%r" % (method, name, error)
return hashlib.md5(key).hexdigest()

def occured(self):
self.occurences += 1
self.occurrences += 1

def to_name(self):
return "%s %s: %r" % (self.method,
Expand All @@ -573,7 +573,7 @@ def to_dict(self):
"method": self.method,
"name": self.name,
"error": repr(self.error),
"occurences": self.occurences
"occurrences": self.occurrences
}

@classmethod
Expand All @@ -582,7 +582,7 @@ def from_dict(cls, data):
data["method"],
data["name"],
data["error"],
data["occurences"]
data["occurrences"]
)


Expand Down Expand Up @@ -634,7 +634,7 @@ def on_slave_report(client_id, data, **kwargs):
if error_key not in global_stats.errors:
global_stats.errors[error_key] = StatsError.from_dict(error)
else:
global_stats.errors[error_key].occurences += error["occurences"]
global_stats.errors[error_key].occurrences += error["occurrences"]

events.request_success += on_request_success
events.request_failure += on_request_failure
Expand All @@ -655,20 +655,24 @@ def print_percentile_stats(stats):
new_col_name = "{0} (+/-)".format(
stats.percentile_column_name(percentile)
)
data.append_col([
# We add 1e-9 to value, to prevent a division by zero error
"{0} (+{1:.2%}/-{2:.2%})".format(
value,
float('nan') if value == 0 else float(upper),
float('nan') if value == 0 else float(lower),
)
for (value, upper, lower)
in zip(
data[stats.percentile_column_name(percentile)],
data[stats.confidence_interval_column_name(percentile)[1]],
data[stats.confidence_interval_column_name(percentile)[0]],
)
], header=new_col_name)
try:
data.append_col([
# We add 1e-9 to value, to prevent a division by zero error
"{0} (+{1:.2%}/-{2:.2%})".format(
value,
float('nan') if value == 0 or upper == 'N/A' else float(upper),
float('nan') if value == 0 or lower == 'N/A' else float(lower),
)
for (value, upper, lower)
in zip(
data[stats.percentile_column_name(percentile)],
data[stats.confidence_interval_column_name(percentile)[1]],
data[stats.confidence_interval_column_name(percentile)[0]],
)
], header=new_col_name)
except IndexError:
# Attempted to insert an empty column.
continue

del data[stats.percentile_column_name(percentile)]
del data[stats.confidence_interval_column_name(percentile)[0]]
Expand All @@ -677,20 +681,22 @@ def print_percentile_stats(stats):
# Move the 100% to the end
values = data['100%']
del data['100%']
data.append_col(values, header='100%')
if len(values):
data.append_col(values, header='100%')

console_logger.info("Percentage of the requests completed within given times")
console_logger.info(tabulate(data.dict, headers="keys"))
console_logger.info("")
if len(data.dict):
console_logger.info("Percentage of the requests completed within given times")
console_logger.info(tabulate(data.dict, headers="keys"))
console_logger.info("")

def print_error_report():
if not len(global_stats.errors):
return
console_logger.info("Error report")
console_logger.info(" %-18s %-100s" % ("# occurences", "Error"))
console_logger.info(" %-18s %-100s" % ("# occurrences", "Error"))
console_logger.info("-" * (80 + STATS_NAME_WIDTH))
for error in global_stats.errors.itervalues():
console_logger.info(" %-18i %-100s" % (error.occurences, error.to_name()))
console_logger.info(" %-18i %-100s" % (error.occurrences, error.to_name()))
console_logger.info("-" * (80 + STATS_NAME_WIDTH))
console_logger.info("")

Expand Down

0 comments on commit 9d62326

Please sign in to comment.