def html(self): now_ms = timestamp.now_ms() # Note my use of nested tables. I suck at HTML. contents = ["<table border=1 cellpadding=4><tr><td><table>"] def add(key, val): contents.append( "<tr><td><i>%s</i></td><td>%s</td></tr>" % (key, val)) def add_since_ms(key, ts_ms): add(key, "%s (%s ago)" % ( timestamp.get_pretty_ms(ts_ms), timestamp.get_human_readable_duration_ms(now_ms-ts_ms))) add("start time", timestamp.get_pretty_ms(self.start_timestamp_ms)) duration_ms = self.last_timestamp_ms - self.start_timestamp_ms add("duration", timestamp.get_human_readable_duration_ms(duration_ms)) if self.num_frames: add("frames", "%d / %.2fM" % (self.num_frames, float(self.size_frames) / (1 << 20))) subtable = ["<table cellpadding=2>"] vbr = 0 for key, num in sorted(self.freq_frame_kbps.items()): perc = 100.0 * num / self.num_frames vbr += float(key * num) / self.num_frames subtable.append( "<tr><td>%d kbps</td><td>%.1f%%</td><td>%d</td></tr>" % (key, perc, num)) subtable.append("</table>") add("frame distribution", "".join(subtable)) add("average bit rate", "%.2f kbps" % vbr) since_last_ms = now_ms - self.last_frame_timestamp_ms add_since_ms("last frame", self.last_frame_timestamp_ms) frame_span_ms = (self.last_frame_timestamp_ms - self.first_frame_timestamp_ms) add("frame deficit", "%.1fms" % (frame_span_ms - self.duration_frames_ms)) if self.num_blocks: add("junk blocks", "%d / %db" % ( self.num_blocks, self.size_blocks)) add_since_ms("last junk", self.last_block_timestamp_ms) if self.errors: error_list = [ "%s - %s / %s / %s" % ( timestamp.get_pretty_ms(err.start_timestamp_ms), err.error_type, err.error_code, err.error_text) for err in reversed(self.errors)] add("errors", "<br>".join(error_list)) contents.append("</table></td></tr></table>") return "\n".join(contents)
def build_sysinfo_page(): contents = ["<html><head><title>System Information</title></head><body>"] contents.append("<h1>System Information</h1>") contents.append("The current time is %s" % timestamp.get_pretty()) def add(key, val): contents.append("<tr><td><i>%s</i></td><td>%s</td></tr>" % (key, val)) contents.append("<h2>Process</h2>") contents.append("<table>") add("command line", " ".join(sys.argv)) start_ms = timestamp.process_start_time_ms() age_ms = timestamp.process_age_ms() add("started at", timestamp.get_pretty_ms(start_ms)) add("running for", timestamp.get_human_readable_duration(age_ms / 1000.0)) add("process pid", os.getpid()) gc_counts = gc.get_count() add("live objects", "%d (%s)" % (sum(gc_counts), " / ".join(str(x) for x in gc_counts))) add("live threads", threading.activeCount()) cpu_s, sys_cpu_s = os.times()[:2] cpu_percent = 100 * (1000 * cpu_s) / age_ms sys_cpu_percent = 100 * (1000 * sys_cpu_s) / age_ms add("cpu utilization", "%.2f%%" % cpu_percent) add("system cpu", "%.2f%%" % sys_cpu_percent) add("Python version", sys.version) contents.append("</table>") contents.append("<h2>Machine</h2>") contents.append("<table>") add("hostname", socket.gethostname()) add("uname", " / ".join(os.uname())) add("load average", " / ".join(str(x) for x in os.getloadavg())) add("uptime", timestamp.get_human_readable_duration(os.times()[-1])) contents.append("</table>") contents.append("</body></html>") return "\n".join(contents)
def add_since_ms(key, ts_ms): add( key, "%s (%s ago)" % (timestamp.get_pretty_ms(ts_ms), timestamp.get_human_readable_duration_ms(now_ms - ts_ms)))
def html(self): now_ms = timestamp.now_ms() # Note my use of nested tables. I suck at HTML. contents = ["<table border=1 cellpadding=4><tr><td><table>"] def add(key, val): contents.append("<tr><td><i>%s</i></td><td>%s</td></tr>" % (key, val)) def add_since_ms(key, ts_ms): add( key, "%s (%s ago)" % (timestamp.get_pretty_ms(ts_ms), timestamp.get_human_readable_duration_ms(now_ms - ts_ms))) add("start time", timestamp.get_pretty_ms(self.start_timestamp_ms)) duration_ms = self.last_timestamp_ms - self.start_timestamp_ms add("duration", timestamp.get_human_readable_duration_ms(duration_ms)) if self.num_frames: add( "frames", "%d / %.2fM" % (self.num_frames, float(self.size_frames) / (1 << 20))) subtable = ["<table cellpadding=2>"] vbr = 0 for key, num in sorted(self.freq_frame_kbps.items()): perc = 100.0 * num / self.num_frames vbr += float(key * num) / self.num_frames subtable.append( "<tr><td>%d kbps</td><td>%.1f%%</td><td>%d</td></tr>" % (key, perc, num)) subtable.append("</table>") add("frame distribution", "".join(subtable)) add("average bit rate", "%.2f kbps" % vbr) since_last_ms = now_ms - self.last_frame_timestamp_ms add_since_ms("last frame", self.last_frame_timestamp_ms) frame_span_ms = (self.last_frame_timestamp_ms - self.first_frame_timestamp_ms) add("frame deficit", "%.1fms" % (frame_span_ms - self.duration_frames_ms)) if self.num_blocks: add("junk blocks", "%d / %db" % (self.num_blocks, self.size_blocks)) add_since_ms("last junk", self.last_block_timestamp_ms) if self.errors: error_list = [ "%s - %s / %s / %s" % (timestamp.get_pretty_ms(err.start_timestamp_ms), err.error_type, err.error_code, err.error_text) for err in reversed(self.errors) ] add("errors", "<br>".join(error_list)) contents.append("</table></td></tr></table>") return "\n".join(contents)
def add_since_ms(key, ts_ms): add(key, "%s (%s ago)" % ( timestamp.get_pretty_ms(ts_ms), timestamp.get_human_readable_duration_ms(now_ms-ts_ms)))