3412 lines
134 KiB
Diff
3412 lines
134 KiB
Diff
diff -Naurp pcp-3.10.2.orig/configure pcp-3.10.2/configure
|
||
--- pcp-3.10.2.orig/configure 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/configure 2015-02-23 21:24:36.653658342 +1100
|
||
@@ -798,6 +798,7 @@ qmake
|
||
enable_qt
|
||
qt_release
|
||
QMAKE
|
||
+pcp_python_prog
|
||
enable_python3
|
||
enable_python
|
||
PYTHON3
|
||
@@ -6229,6 +6230,14 @@ done
|
||
fi
|
||
|
||
|
||
+if test "$enable_python3" = "true"
|
||
+then
|
||
+ pcp_python_prog=$PYTHON3
|
||
+else
|
||
+ pcp_python_prog=$PYTHON
|
||
+fi
|
||
+
|
||
+
|
||
qmake=$QMAKE
|
||
enable_qt=false
|
||
qt_release=release
|
||
diff -Naurp pcp-3.10.2.orig/configure.ac pcp-3.10.2/configure.ac
|
||
--- pcp-3.10.2.orig/configure.ac 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/configure.ac 2015-02-23 21:24:36.655658340 +1100
|
||
@@ -534,6 +534,15 @@ AS_IF([test "x$do_python3" != "xno"], [
|
||
])
|
||
AC_SUBST(enable_python3)
|
||
|
||
+dnl choose the prefered python executable (py2 -> py3 transtion)
|
||
+if test "$enable_python3" = "true"
|
||
+then
|
||
+ pcp_python_prog=$PYTHON3
|
||
+else
|
||
+ pcp_python_prog=$PYTHON
|
||
+fi
|
||
+AC_SUBST(pcp_python_prog)
|
||
+
|
||
qmake=$QMAKE
|
||
enable_qt=false
|
||
qt_release=release
|
||
diff -Naurp pcp-3.10.2.orig/man/man1/pmatop.1 pcp-3.10.2/man/man1/pmatop.1
|
||
--- pcp-3.10.2.orig/man/man1/pmatop.1 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/man/man1/pmatop.1 2015-02-23 21:21:18.198838491 +1100
|
||
@@ -1,45 +1,50 @@
|
||
+'\"macro stdmacro
|
||
+.\"
|
||
+.\" Copyright (c) 2014-2015 Red Hat.
|
||
+.\"
|
||
+.\" This program is free software; you can redistribute it and/or modify it
|
||
+.\" under the terms of the GNU General Public License as published by the
|
||
+.\" Free Software Foundation; either version 2 of the License, or (at your
|
||
+.\" option) any later version.
|
||
+.\"
|
||
+.\" This program is distributed in the hope that it will be useful, but
|
||
+.\" WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||
+.\" or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||
+.\" for more details.
|
||
+.\"
|
||
.TH PMATOP 1 "PCP" "Performance Co-Pilot"
|
||
.SH NAME
|
||
-.B pmatop
|
||
-\- System & Process Monitor
|
||
+\f3pmatop\f1 \- System and Process Monitor
|
||
.SH SYNOPSIS
|
||
Interactive usage:
|
||
.P
|
||
.B pmatop
|
||
-[\-g|\-m] [\-L linelen] [\-h host]
|
||
-[
|
||
-.I interval
|
||
-[
|
||
-.I samples
|
||
-]]
|
||
+[\-g|\-m] [\-L \f2linelen\f1] [\-h \f2host\f1 | \-a \f2archive\f1]
|
||
+[\f2interval\f1 [\f2samples\f1]]
|
||
.P
|
||
-Writing and reading raw logfiles:
|
||
+Writing and reading PCP archive folios:
|
||
.P
|
||
-.B pmatop
|
||
-\-w
|
||
-.I rawfile
|
||
-[
|
||
-.I interval
|
||
-[
|
||
-.I samples
|
||
-]]
|
||
+.BR pmatop
|
||
+\-w \f2rawfile\f1 [\f2interval\f1 [\f2samples\f1]]
|
||
.br
|
||
.B pmatop
|
||
-\-r [
|
||
-.I rawfile
|
||
-] [\-g|\-m] [\-L linelen] [\-h host]
|
||
+\-r [\f2rawfile\f1] [\-g|\-m] [\-L \f2linelen\f1]
|
||
.SH DESCRIPTION
|
||
The program
|
||
-.I pmatop
|
||
+.B pmatop
|
||
is an interactive monitor to view the load on a Linux system.
|
||
It shows the occupation of the most critical hardware resources
|
||
(from a performance point of view) on system level, i.e. cpu, memory, disk
|
||
and network. By default metrics from the local host are
|
||
displayed, but a different host may be specified with the
|
||
-.I [-h host]
|
||
-option. It is modeled after
|
||
+.IR \-h/\-\-host
|
||
+option, or from a PCP archive using the
|
||
+.IR \-a/\-\-archive
|
||
+option.
|
||
+.PP
|
||
+It is modeled on
|
||
.BR atop (1)
|
||
-and provides a showcase for the variety of data available via
|
||
+and provides a showcase for the variety of data available from
|
||
.BR pmcd (1).
|
||
.br
|
||
.PP
|
||
@@ -57,33 +62,33 @@ The intervals are repeated till the numb
|
||
in interactive mode.
|
||
.PP
|
||
When
|
||
-.I pmatop
|
||
+.B pmatop
|
||
is started, it checks whether the standard output channel is connected to a
|
||
screen, or to a file/pipe. In the first case it produces screen control
|
||
codes (via the ncurses library) and behaves interactively; in the second case
|
||
it produces flat ASCII-output.
|
||
.PP
|
||
In interactive mode, the output of
|
||
-.I pmatop
|
||
+.B pmatop
|
||
scales dynamically to the current dimensions of the screen/window.
|
||
.PP
|
||
Furthermore in interactive mode the output of
|
||
-.I pmatop
|
||
+.B pmatop
|
||
can be controlled by pressing particular keys.
|
||
However it is also possible to specify such key as
|
||
-.B flag
|
||
+.I flag
|
||
on the command line. In that case
|
||
-.I pmatop
|
||
+.B pmatop
|
||
switches to the indicated mode on beforehand; this mode can
|
||
be modified again interactively. Specifying such key as flag is especially
|
||
useful when running
|
||
-.I pmatop
|
||
+.B pmatop
|
||
with output to a pipe or file (non-interactively).
|
||
These flags are the same as the keys that can be pressed in interactive
|
||
mode (see section INTERACTIVE COMMANDS).
|
||
.SH OUTPUT FORMAT
|
||
The output of
|
||
-.I pmatop
|
||
+.B pmatop
|
||
consists of system level and process level information. The system
|
||
level information consists of the following output lines:
|
||
.PP
|
||
@@ -146,7 +151,7 @@ The remaining lines are one line per pro
|
||
described below.
|
||
.SH INTERACTIVE COMMANDS
|
||
When running
|
||
-.I pmatop
|
||
+.B pmatop
|
||
interactively (no output redirection), keys can be pressed to control the
|
||
output.
|
||
.PP
|
||
@@ -191,16 +196,16 @@ Request for help information (also the k
|
||
.B z
|
||
The pause key can be used to freeze the current situation in order to
|
||
investigate the output on the screen. While
|
||
-.I pmatop
|
||
+.B pmatop
|
||
is paused, the keys described above can be pressed to show other
|
||
information about the current list of processes.
|
||
Whenever the pause key is pressed again,
|
||
-pmatop will continue with a next sample.
|
||
+.B pmatop
|
||
+will continue with a next sample.
|
||
.PP
|
||
.SH "SEE ALSO"
|
||
.BR PCPIntro (1),
|
||
-.BR collectl (1),
|
||
-.BR perl (1),
|
||
+.BR atop (1),
|
||
.BR python (1),
|
||
.BR pmlogger (1),
|
||
.BR pmcd (1),
|
||
@@ -209,4 +214,3 @@ pmatop will continue with a next sample.
|
||
.BR PMAPI (3),
|
||
and
|
||
.BR pcp.conf (5).
|
||
-
|
||
diff -Naurp pcp-3.10.2.orig/qa/553 pcp-3.10.2/qa/553
|
||
--- pcp-3.10.2.orig/qa/553 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/553 2015-02-23 21:24:36.655658340 +1100
|
||
@@ -10,6 +10,7 @@ echo "QA output created by $seq"
|
||
|
||
. ./common.python
|
||
|
||
+python_path=`which $python`
|
||
pmda_path="$PCP_PMDAS_DIR/gluster"
|
||
pmda_script="$pmda_path/pmdagluster.python"
|
||
test -f "$pmda_script" || _notrun "pmdagluster not supported"
|
||
@@ -27,6 +28,9 @@ _filter()
|
||
-e "s;$PCP_PMDAS_DIR;\$PCP_PMDAS_DIR;" \
|
||
-e '/pmResult/s/ .* numpmid/ ... numpmid/' \
|
||
-e '/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/s/[^ ]*/TIMESTAMP/' \
|
||
+ -e "s;$python_path;\$PCP_PYTHON_PROG;" \
|
||
+ -e "s;$python;python;" \
|
||
+ #end
|
||
|
||
test -f gluster.log && cat gluster.log >> $seq.full
|
||
}
|
||
@@ -49,13 +53,13 @@ PCP_PYTHON_PMNS=root $python "$pmda_scri
|
||
|
||
echo "== Testing volume instance domain" | tee -a $seq.full
|
||
$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe $python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
instance $domain.0
|
||
End-of-File
|
||
|
||
echo "== Testing volume information metrics" | tee -a $seq.full
|
||
$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe $python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
getdesc on
|
||
desc gluster.volume.dist.count
|
||
desc gluster.volume.stripe.count
|
||
@@ -68,7 +72,7 @@ End-of-File
|
||
echo "== Testing volume control metric store" | tee -a $seq.full
|
||
$sudo rm -f $tmp.start $tmp.stop
|
||
$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe $python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
getdesc on
|
||
desc gluster.volume.profile
|
||
fetch gluster.volume.profile
|
||
@@ -81,13 +85,13 @@ $sudo rm -f $tmp.start $tmp.stop
|
||
|
||
echo "== Testing brick instance domain" | tee -a $seq.full
|
||
$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe $python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
instance $domain.1
|
||
End-of-File
|
||
|
||
echo "== Testing brick throughput metrics" | tee -a $seq.full
|
||
$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe $python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
getdesc on
|
||
desc gluster.brick.read_bytes
|
||
fetch gluster.brick.read_bytes
|
||
@@ -97,7 +101,7 @@ End-of-File
|
||
|
||
echo "== Testing brick file operation latency metrics" | tee -a $seq.full
|
||
$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe $python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
getdesc on
|
||
desc gluster.brick.latency.getxattr.avg
|
||
desc gluster.brick.latency.getxattr.min
|
||
diff -Naurp pcp-3.10.2.orig/qa/553.out pcp-3.10.2/qa/553.out
|
||
--- pcp-3.10.2.orig/qa/553.out 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/553.out 2015-02-23 21:24:36.656658340 +1100
|
||
@@ -1,14 +1,14 @@
|
||
QA output created by 553
|
||
== Testing volume instance domain
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
dbpmda> instance 118.0
|
||
pmInDom: 118.0
|
||
[ 0] inst: 0 name: "gv0"
|
||
dbpmda>
|
||
== Testing volume information metrics
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
dbpmda> getdesc on
|
||
dbpmda> desc gluster.volume.dist.count
|
||
PMID: 118.2.1
|
||
@@ -39,8 +39,8 @@ pmResult ... numpmid: 1
|
||
inst [0 or ???] value 3
|
||
dbpmda>
|
||
== Testing volume control metric store
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
dbpmda> getdesc on
|
||
dbpmda> desc gluster.volume.profile
|
||
PMID: 118.2.0
|
||
@@ -67,15 +67,15 @@ dbpmda>
|
||
start gv0 - test 553
|
||
stop gv0 - test 553
|
||
== Testing brick instance domain
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
dbpmda> instance 118.1
|
||
pmInDom: 118.1
|
||
[ 0] inst: 0 name: "smash.scott.net.au:/export/brick1/glusterdev1"
|
||
dbpmda>
|
||
== Testing brick throughput metrics
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
dbpmda> getdesc on
|
||
dbpmda> desc gluster.brick.read_bytes
|
||
PMID: 118.0.0
|
||
@@ -97,8 +97,8 @@ pmResult ... numpmid: 1
|
||
inst [0 or ???] value 24
|
||
dbpmda>
|
||
== Testing brick file operation latency metrics
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/gluster/pmdagluster.python
|
||
dbpmda> getdesc on
|
||
dbpmda> desc gluster.brick.latency.getxattr.avg
|
||
PMID: 118.1.74
|
||
diff -Naurp pcp-3.10.2.orig/qa/718 pcp-3.10.2/qa/718
|
||
--- pcp-3.10.2.orig/qa/718 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/718 2015-02-23 21:24:36.656658340 +1100
|
||
@@ -2,35 +2,40 @@
|
||
# PCP QA Test No. 718
|
||
# Exercise dbpmda use with the Python implementation of pmdasimple.
|
||
#
|
||
-# Copyright (c) 2013 Red Hat.
|
||
+# Copyright (c) 2013,2015 Red Hat.
|
||
#
|
||
|
||
seq=`basename $0`
|
||
echo "QA output created by $seq"
|
||
|
||
. ./common.python
|
||
+
|
||
$python -c "from pcp import pmda" >/dev/null 2>&1
|
||
[ $? -eq 0 ] || _notrun "python pcp pmda module not installed"
|
||
test -f "$PCP_PMDAS_DIR/simple/pmdasimple.python"
|
||
[ $? -eq 0 ] || _notrun "python simple pmda not yet installed"
|
||
|
||
+python_path=`which $python`
|
||
trap "rm -f $tmp.*; exit" 0 1 2 3 15
|
||
|
||
_filter()
|
||
{
|
||
sed \
|
||
-e "s;$PCP_PMDAS_DIR;\$PCP_PMDAS_DIR;" \
|
||
+ -e "s;$python_path;\$PCP_PYTHON_PROG;" \
|
||
+ -e "s;$python;python;" \
|
||
| _filter_dumpresult
|
||
}
|
||
|
||
domain=253
|
||
+
|
||
# ensure help text exists
|
||
cd "$PCP_PMDAS_DIR/simple"
|
||
$sudo ./Install </dev/null >/dev/null 2>&1
|
||
|
||
# real QA test starts here
|
||
$sudo dbpmda -n root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe $python pmdasimple.python
|
||
+open pipe $python_path pmdasimple.python
|
||
getdesc on
|
||
desc simple.numfetch
|
||
fetch simple.numfetch
|
||
diff -Naurp pcp-3.10.2.orig/qa/718.out pcp-3.10.2/qa/718.out
|
||
--- pcp-3.10.2.orig/qa/718.out 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/718.out 2015-02-23 21:24:36.656658340 +1100
|
||
@@ -1,6 +1,6 @@
|
||
QA output created by 718
|
||
-dbpmda> open pipe /usr/bin/python pmdasimple.python
|
||
-Start python PMDA: /usr/bin/python pmdasimple.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG pmdasimple.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG pmdasimple.python
|
||
dbpmda> getdesc on
|
||
dbpmda> desc simple.numfetch
|
||
PMID: 253.0.0
|
||
diff -Naurp pcp-3.10.2.orig/qa/722 pcp-3.10.2/qa/722
|
||
--- pcp-3.10.2.orig/qa/722 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/722 2015-02-23 21:21:18.199838490 +1100
|
||
@@ -2,7 +2,7 @@
|
||
# PCP QA Test No. 722
|
||
# Exercise the python pmatop implementation
|
||
#
|
||
-# Copyright (c) 2013-2014 Red Hat.
|
||
+# Copyright (c) 2013-2015 Red Hat.
|
||
#
|
||
|
||
seq=`basename $0`
|
||
@@ -68,18 +68,44 @@ if [ $? -ne 0 ]; then
|
||
fi
|
||
|
||
# real QA test starts here
|
||
-$PMATOP -r $here/src/pmatop-log.folio -m 1 1 2>&1 | tee -a $tmp.out | redact_header | remove_extra_whitespace
|
||
-$PMATOP -r $here/src/pmatop-log.folio -g 1 1 2>&1 | tee -a $tmp.out | redact_header | remove_extra_whitespace
|
||
+rm -f test.pmatop $tmp.folio $tmp.direct
|
||
|
||
-rm -f test.pmatop
|
||
+# verify mkaf(1) archive folios
|
||
+echo "generic metrics mode" >> $tmp.folio
|
||
+$PMATOP -r $here/src/pmatop-log.folio -m 1 1 2>&1 | tee -a $tmp.folio | redact_header | remove_extra_whitespace
|
||
+echo "memory metrics mode" >> $tmp.folio
|
||
+$PMATOP -r $here/src/pmatop-log.folio -g 1 1 2>&1 | tee -a $tmp.folio | redact_header | remove_extra_whitespace
|
||
+cat $tmp.folio >> $here/seq.full
|
||
+echo "== Archive folio testing complete"
|
||
+
|
||
+# verify pmlogger archive logs
|
||
+echo "generic metrics mode" >> $tmp.direct
|
||
+$PMATOP -a $here/src/pmatop-log -m 1 1 2>&1 | tee -a $tmp.direct | redact_header | remove_extra_whitespace
|
||
+echo "memory metrics mode" >> $tmp.direct
|
||
+$PMATOP -a $here/src/pmatop-log -g 1 1 2>&1 | tee -a $tmp.direct | redact_header | remove_extra_whitespace
|
||
+cat $tmp.direct >> $here/seq.full
|
||
+echo "== Direct archive testing complete"
|
||
+
|
||
+echo "== Comparing direct to folio output"
|
||
+diff $tmp.folio $tmp.direct
|
||
+if [ $? -eq 0 ]; then
|
||
+ echo " Output compares exactly - good"
|
||
+else
|
||
+ echo " Folio differs to direct access - bad"
|
||
+fi
|
||
+echo "== Output comparisons all completed"
|
||
+
|
||
+# verify creating archive folios
|
||
$PMATOP -w test.pmatop 0.2 10
|
||
if pmafm test.pmatop check | grep -q OK
|
||
-then echo pmatop log creation OK | tee -a $tmp.out 2>&1
|
||
-else echo pmatop log creation FAILED | tee -a $tmp.out 2>&1; fi
|
||
+then echo pmatop log creation OK | tee -a $tmp.write 2>&1
|
||
+else echo pmatop log creation FAILED | tee -a $tmp.write 2>&1; fi
|
||
+cat $tmp.write >> $here/seq.full
|
||
+echo "== Live writer testing complete"
|
||
|
||
-cat $tmp.out >>$here/$seq.full
|
||
+# finished, clean up
|
||
+eval `pmafm test.pmatop remove`
|
||
|
||
# success, all done
|
||
-eval `pmafm test.pmatop remove`
|
||
status=0
|
||
exit
|
||
diff -Naurp pcp-3.10.2.orig/qa/722.out pcp-3.10.2/qa/722.out
|
||
--- pcp-3.10.2.orig/qa/722.out 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/722.out 2015-02-23 21:21:18.200838489 +1100
|
||
@@ -447,4 +447,458 @@ PID SYSCPU USRCPU VGROW RGROW RUID THR S
|
||
9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
9 9s 9s 9K 9 root 9 -- - S 9% ssh-agent
|
||
+== Archive folio testing complete
|
||
+ATOP - Day Month 9 9:9:9 9 9:9:9 elapsed
|
||
+PRC | sys 9h9m | user 9d | #proc 9 | #zombie 9
|
||
+CPU | sys 9% | user 9% | irq 9% | idle 9% | wait 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+CPL | avg9 .9 | avg9 .9 | avg9 .9 | csw 9 | intr 9 |
|
||
+MEM | tot 9G | free 9M | cache 9G | buff 9M | slab 9G |
|
||
+SWP | tot 9G | free 9G | | vmcom 9G | vmlim 9G |
|
||
+PAG | scan 9 | steal 9 | stall 9 | swin 9 | swout 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+DSK | sda | busy 9% | read 9 | write 9 | avio 9 ms |
|
||
+NET | transport | tcpi 9M | tcpo 9M | udpi 9M | udpo 9M |
|
||
+NET | network | ipi 9M | ipo 9M | ipfrw 9M | deliv 9M |
|
||
+NET | lo | pcki 9M | pcko 9M | si 9 Kbps | so 9 Kpbs |
|
||
+NET | em9 | pcki 9M | pcko 9M | si 9 Kbps | so 9 Kpbs |
|
||
+NET | wlan9 | pcki 9M | pcko 9M | si 9 Kbps | so 9 Kpbs |
|
||
+PID VDATA VSTACK VGROW RGROW VSIZE RSIZE MEM CMD
|
||
+9 9G 9K 9G 9M 9G 9M 9% firefox
|
||
+9 9M 9K 9G 9M 9G 9M 9% plugin-containe
|
||
+9 9K 9K 9M 9K 9M 9K 9% Xorg
|
||
+9 9G 9K 9G 9M 9G 9M 9% gnome-shell
|
||
+9 9G 9K 9G 9M 9G 9M 9% thunderbird
|
||
+9 9M 9K 9M 9K 9M 9K 9% ibus-daemon
|
||
+9 9M 9K 9M 9K 9M 9K 9% pulseaudio
|
||
+9 9K 9K 9M 9K 9M 9K 9% ibus-x9
|
||
+9 9M 9K 9M 9M 9M 9M 9% emacs
|
||
+9 9M 9K 9M 9K 9M 9K 9% xchat
|
||
+9 9M 9K 9M 9K 9M 9K 9% polkitd
|
||
+9 9M 9K 9M 9K 9M 9K 9% vino-server
|
||
+9 9M 9K 9M 9K 9M 9K 9% gnome-terminal
|
||
+9 9M 9K 9G 9K 9G 9K 9% gnome-settings-
|
||
+9 9K 9K 9K 9K 9K 9K 9% dbus-daemon
|
||
+9 9 9 9 9 9 9 9% irq/9-iwlwifi
|
||
+9 9M 9K 9M 9K 9M 9K 9% NetworkManager
|
||
+9 9K 9K 9M 9K 9M 9K 9% ibus-engine-sim
|
||
+9 9 9 9 9 9 9 9% rcu_sched
|
||
+9 9K 9K 9K 9K 9K 9K 9% cups-polld
|
||
+9 9M 9K 9M 9K 9M 9K 9% ibus-ui-gtk9
|
||
+9 9K 9K 9M 9K 9M 9K 9% cupsd
|
||
+9 9M 9K 9M 9K 9M 9K 9% nm-applet
|
||
+9 9K 9K 9K 9K 9K 9K 9% irqbalance
|
||
+9 9M 9K 9M 9K 9M 9K 9% upowerd
|
||
+9 9M 9K 9M 9K 9M 9K 9% udisksd
|
||
+9 9M 9K 9M 9K 9M 9K 9% SpiderOakBlue
|
||
+9 9M 9K 9M 9K 9M 9K 9% SpiderOakBlue
|
||
+9 9M 9K 9M 9K 9M 9K 9% mission-control
|
||
+9 9M 9K 9M 9K 9M 9K 9% evince
|
||
+9 9M 9K 9M 9K 9M 9K 9% gnome-screensav
|
||
+9 9K 9K 9K 9K 9K 9K 9% systemd-journal
|
||
+9 9K 9K 9K 9K 9K 9K 9% acpid
|
||
+9 9M 9K 9M 9K 9M 9K 9% gnome-session
|
||
+9 9 9 9 9 9 9 9% khugepaged
|
||
+9 9K 9K 9K 9K 9K 9K 9% wpa_supplicant
|
||
+9 9K 9K 9K 9 9K 9 9% gpm
|
||
+9 9 9 9 9 9 9 9% flush-9:9
|
||
+9 9M 9K 9M 9K 9M 9K 9% deja-dup-monito
|
||
+9 9M 9K 9M 9K 9M 9K 9% evolution-calen
|
||
+9 9M 9K 9M 9K 9M 9K 9% evolution-addre
|
||
+9 9 9 9 9 9 9 9% jbd9/dm-9-9
|
||
+9 9 9 9 9 9 9 9% ksoftirqd/9
|
||
+9 9M 9K 9M 9K 9M 9K 9% tracker-miner-f
|
||
+9 9K 9K 9K 9K 9K 9K 9% systemd-logind
|
||
+9 9K 9K 9M 9K 9M 9K 9% crond
|
||
+9 9 9 9 9 9 9 9% kswapd9
|
||
+9 9K 9K 9K 9K 9K 9K 9% systemd
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9M 9K 9M 9K 9M 9K 9% rtkit-daemon
|
||
+9 9 9 9 9 9 9 9% ksoftirqd/9
|
||
+9 9 9 9 9 9 9 9% ksoftirqd/9
|
||
+9 9 9 9 9 9 9 9% flush-9:9
|
||
+9 9 9 9 9 9 9 9% jbd9/dm-9-9
|
||
+9 9K 9K 9M 9K 9M 9K 9% bash
|
||
+9 9 9 9 9 9 9 9% ksoftirqd/9
|
||
+9 9K 9K 9K 9K 9K 9K 9% pmie
|
||
+9 9M 9K 9M 9K 9M 9K 9% gvfs-udisks9-vo
|
||
+9 9M 9K 9M 9K 9M 9K 9% accounts-daemon
|
||
+9 9M 9K 9M 9K 9M 9K 9% gdm-session-wor
|
||
+9 9M 9K 9M 9K 9M 9K 9% rsyslogd
|
||
+9 9M 9K 9M 9K 9M 9K 9% gnote
|
||
+9 9K 9K 9K 9K 9K 9K 9% dbus-daemon
|
||
+9 9 9 9 9 9 9 9% migration/9
|
||
+9 9K 9K 9K 9K 9K 9K 9% pmdaproc
|
||
+9 9K 9K 9M 9K 9M 9K 9% bash
|
||
+9 9 9 9 9 9 9 9% migration/9
|
||
+9 9K 9K 9K 9K 9K 9K 9% auditd
|
||
+9 9K 9K 9M 9K 9M 9K 9% bash
|
||
+9 9K 9K 9M 9K 9M 9K 9% abrt-watch-log
|
||
+9 9M 9K 9M 9K 9M 9K 9% evolution-alarm
|
||
+9 9K 9K 9K 9K 9K 9K 9% dhclient
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9 9 9 9 9 9 9% watchdog/9
|
||
+9 9M 9K 9M 9K 9M 9K 9% gnome-shell-cal
|
||
+9 9 9 9 9 9 9 9% watchdog/9
|
||
+9 9K 9K 9M 9K 9M 9K 9% abrt-applet
|
||
+9 9 9 9 9 9 9 9% watchdog/9
|
||
+9 9 9 9 9 9 9 9% watchdog/9
|
||
+9 9 9 9 9 9 9 9% migration/9
|
||
+9 9K 9K 9M 9K 9M 9K 9% modem-manager
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9K 9K 9M 9K 9M 9K 9% gdm-binary
|
||
+9 9M 9K 9M 9K 9M 9K 9% colord
|
||
+9 9 9 9 9 9 9 9% migration/9
|
||
+9 9K 9K 9K 9K 9K 9K 9% avahi-daemon
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9M 9K 9M 9K 9M 9K 9% tracker-store
|
||
+9 9K 9K 9K 9K 9K 9K 9% rpcbind
|
||
+9 9K 9K 9K 9K 9K 9K 9% chronyd
|
||
+9 9K 9K 9M 9K 9M 9K 9% pmcd
|
||
+9 9 9 9 9 9 9 9% kauditd
|
||
+9 9K 9K 9K 9K 9K 9K 9% dhclient
|
||
+9 9K 9K 9K 9K 9K 9K 9% udevd
|
||
+9 9K 9K 9M 9K 9M 9K 9% bash
|
||
+9 9 9 9 9 9 9 9% kworker/u:9
|
||
+9 9 9 9 9 9 9 9% kthreadd
|
||
+9 9M 9K 9M 9K 9M 9K 9% gnome-keyring-d
|
||
+9 9K 9K 9M 9K 9M 9K 9% bash
|
||
+9 9 9 9 9 9 9 9% jbd9/dm-9-9
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9M 9K 9M 9K 9M 9K 9% gsd-printer
|
||
+9 9K 9K 9K 9K 9K 9K 9% smartd
|
||
+9 9K 9K 9M 9K 9M 9K 9% gvfsd
|
||
+9 9M 9K 9M 9K 9M 9K 9% colord-sane
|
||
+9 9K 9K 9M 9K 9M 9K 9% gvfsd-trash
|
||
+9 9K 9K 9M 9K 9M 9K 9% pmatop.py
|
||
+9 9K 9K 9M 9K 9M 9K 9% abrtd
|
||
+9 9M 9K 9M 9K 9M 9K 9% dconf-service
|
||
+9 9 9 9 9 9 9 9% kworker/u:9
|
||
+9 9 9 9 9 9 9 9% bdi-default
|
||
+9 9 9 9 9 9 9 9% kworker/u:9
|
||
+9 9 9 9 9 9 9 9% khubd
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9K 9K 9K 9K 9K 9K 9% atd
|
||
+9 9K 9K 9M 9K 9M 9K 9% gvfsd-metadata
|
||
+9 9K 9K 9K 9K 9K 9K 9% udevd
|
||
+9 9K 9K 9K 9K 9K 9K 9% bluetoothd
|
||
+9 9M 9K 9M 9K 9M 9K 9% imsettings-daem
|
||
+9 9K 9K 9M 9K 9M 9K 9% abrt-watch-log
|
||
+9 9K 9K 9K 9K 9K 9K 9% rpc.statd
|
||
+9 9K 9K 9K 9K 9K 9K 9% pmlogger
|
||
+9 9 9 9 9 9 9 9% fsnotify_mark
|
||
+9 9K 9K 9M 9K 9M 9K 9% gdm-simple-slav
|
||
+9 9K 9K 9M 9K 9M 9K 9% gvfs-gphoto9-vo
|
||
+9 9 9 9 9 9 9 9% kdevtmpfs
|
||
+9 9K 9K 9M 9K 9M 9K 9% ibus-dconf
|
||
+9 9M 9K 9M 9K 9M 9K 9% gvfsd-http
|
||
+9 9K 9K 9K 9K 9K 9K 9% pmlogger
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9K 9K 9K 9K 9K 9K 9% sshd
|
||
+9 9K 9K 9M 9K 9M 9K 9% gconfd-9
|
||
+9 9M 9K 9M 9K 9M 9K 9% goa-daemon
|
||
+9 9K 9K 9M 9K 9M 9K 9% ibus-engine-pin
|
||
+9 9M 9K 9M 9K 9M 9K 9% evinced
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9 9 9 9 9 9 9% rcu_bh
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9 9 9 9 9 9 9% kworker/9:9H
|
||
+9 9 9 9 9 9 9 9% khelper
|
||
+9 9 9 9 9 9 9 9% netns
|
||
+9 9 9 9 9 9 9 9% kintegrityd
|
||
+9 9 9 9 9 9 9 9% kblockd
|
||
+9 9 9 9 9 9 9 9% ata_sff
|
||
+9 9 9 9 9 9 9 9% md
|
||
+9 9 9 9 9 9 9 9% ksmd
|
||
+9 9 9 9 9 9 9 9% crypto
|
||
+9 9 9 9 9 9 9 9% kthrotld
|
||
+9 9 9 9 9 9 9 9% scsi_eh_9
|
||
+9 9 9 9 9 9 9 9% scsi_eh_9
|
||
+9 9 9 9 9 9 9 9% scsi_eh_9
|
||
+9 9 9 9 9 9 9 9% scsi_eh_9
|
||
+9 9 9 9 9 9 9 9% scsi_eh_9
|
||
+9 9 9 9 9 9 9 9% scsi_eh_9
|
||
+9 9 9 9 9 9 9 9% kpsmoused
|
||
+9 9 9 9 9 9 9 9% deferwq
|
||
+9 9 9 9 9 9 9 9% kdmflush
|
||
+9 9 9 9 9 9 9 9% kdmflush
|
||
+9 9K 9K 9M 9K 9M 9K 9% gvfsd-burn
|
||
+9 9 9 9 9 9 9 9% ext9-dio-unwrit
|
||
+9 9 9 9 9 9 9 9% kvm-irqfd-clean
|
||
+9 9 9 9 9 9 9 9% ktpacpid
|
||
+9 9 9 9 9 9 9 9% hd-audio9
|
||
+9 9 9 9 9 9 9 9% cfg9
|
||
+9 9 9 9 9 9 9 9% kdmflush
|
||
+9 9 9 9 9 9 9 9% kdmflush
|
||
+9 9 9 9 9 9 9 9% kdmflush
|
||
+9 9 9 9 9 9 9 9% iwlwifi
|
||
+9 9 9 9 9 9 9 9% jbd9/dm-9-9
|
||
+9 9 9 9 9 9 9 9% ext9-dio-unwrit
|
||
+9 9 9 9 9 9 9 9% ext9-dio-unwrit
|
||
+9 9 9 9 9 9 9 9% ext9-dio-unwrit
|
||
+9 9K 9K 9K 9K 9K 9K 9% avahi-daemon
|
||
+9 9K 9K 9K 9 9K 9 9% system-setup-ke
|
||
+9 9K 9K 9K 9K 9K 9K 9% mcelog
|
||
+9 9 9 9 9 9 9 9% krfcommd
|
||
+9 9 9 9 9 9 9 9% rpciod
|
||
+9 9K 9K 9K 9K 9K 9K 9% dbus-launch
|
||
+9 9M 9K 9M 9K 9M 9K 9% gvfs-fuse-daemo
|
||
+9 9K 9K 9M 9K 9M 9K 9% gvfs-afc-volume
|
||
+9 9M 9K 9M 9K 9M 9K 9% at-spi-bus-laun
|
||
+9 9K 9K 9K 9K 9K 9K 9% gnome-pty-helpe
|
||
+9 9K 9K 9K 9K 9K 9K 9% emacsclient
|
||
+9 9K 9K 9M 9K 9M 9K 9% tools.sh
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9 9 9 9 9 9 9% kworker/u:9H
|
||
+9 9K 9K 9K 9K 9K 9K 9% emacsclient
|
||
+9 9K 9K 9K 9K 9K 9K 9% emacsclient
|
||
+9 9 9 9 9 9 9 9% irq/9-mei
|
||
+9 9 9 9 9 9 9 9% hci9
|
||
+9 9 9 9 9 9 9 9% hci9
|
||
+9 9 9 9 9 9 9 9% kworker/u:9H
|
||
+9 9K 9K 9K 9K 9K 9K 9% udevd
|
||
+9 9K 9K 9K 9K 9K 9K 9% pmdaxfs
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9 9 9 9 9 9 9% kworker/9:9
|
||
+9 9K 9K 9K 9K 9K 9K 9% ssh-agent
|
||
+ATOP - Day Month 9 9:9:9 9 9:9:9 elapsed
|
||
+PRC | sys 9h9m | user 9d | #proc 9 | #zombie 9
|
||
+CPU | sys 9% | user 9% | irq 9% | idle 9% | wait 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+cpu | sys 9% | user 9% | irq 9% | idle 9% | cpu9 9% |
|
||
+CPL | avg9 .9 | avg9 .9 | avg9 .9 | csw 9 | intr 9 |
|
||
+MEM | tot 9G | free 9M | cache 9G | buff 9M | slab 9G |
|
||
+SWP | tot 9G | free 9G | | vmcom 9G | vmlim 9G |
|
||
+PAG | scan 9 | steal 9 | stall 9 | swin 9 | swout 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+LVM | x | | read 9 | write 9 |
|
||
+DSK | sda | busy 9% | read 9 | write 9 | avio 9 ms |
|
||
+NET | transport | tcpi 9M | tcpo 9M | udpi 9M | udpo 9M |
|
||
+NET | network | ipi 9M | ipo 9M | ipfrw 9M | deliv 9M |
|
||
+NET | lo | pcki 9M | pcko 9M | si 9 Kbps | so 9 Kpbs |
|
||
+NET | em9 | pcki 9M | pcko 9M | si 9 Kbps | so 9 Kpbs |
|
||
+NET | wlan9 | pcki 9M | pcko 9M | si 9 Kbps | so 9 Kpbs |
|
||
+PID SYSCPU USRCPU VGROW RGROW RUID THR ST EXC S CPU CMD
|
||
+9 9h9m 9h9m 9K 9K scox 9 -- - S 9% firefox
|
||
+9 9h9m 9h9m 9K 9K scox 9 -- - S 9% plugin-containe
|
||
+9 9h9m 9h9m 9K 9K root 9 -- - S 9% Xorg
|
||
+9 9m9s 9h9m 9K 9K scox 9 -- - S 9% gnome-shell
|
||
+9 9m9s 9h9m 9K 9K scox 9 -- - S 9% thunderbird
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% ibus-daemon
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% pulseaudio
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% ibus-x9
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% emacs
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% xchat
|
||
+9 9m9s 9m9s 9K 9K root 9 -- - S 9% polkitd
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% vino-server
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% gnome-terminal
|
||
+9 9m9s 9m9s 9K 9K scox 9 -- - S 9% gnome-settings-
|
||
+9 9m9s 9m9s 9K 9K dbus 9 -- - S 9% dbus-daemon
|
||
+9 9m9s 9s 9 9 root 9 -- - S 9% irq/9-iwlwifi
|
||
+9 9s 9m9s 9K 9K root 9 -- - S 9% NetworkManager
|
||
+9 9s 9m9s 9K 9K scox 9 -- - S 9% ibus-engine-sim
|
||
+9 9m9s 9s 9 9 root 9 -- - S 9% rcu_sched
|
||
+9 9m9s 9m9s 9K 9K lp 9 -- - S 9% cups-polld
|
||
+9 9s 9m9s 9K 9K scox 9 -- - S 9% ibus-ui-gtk9
|
||
+9 9s 9m9s 9K 9K root 9 -- - S 9% cupsd
|
||
+9 9s 9m9s 9K 9K scox 9 -- - S 9% nm-applet
|
||
+9 9m9s 9s 9K 9 root 9 -- - S 9% irqbalance
|
||
+9 9s 9m9s 9K 9K root 9 -- - S 9% upowerd
|
||
+9 9s 9m9s 9K 9K root 9 -- - S 9% udisksd
|
||
+9 9s 9m9s 9K 9K scox 9 -- - S 9% SpiderOakBlue
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% SpiderOakBlue
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% mission-control
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% evince
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gnome-screensav
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% systemd-journal
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% acpid
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gnome-session
|
||
+9 9s 9s 9 9 root 9 -- - S 9% khugepaged
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% wpa_supplicant
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% gpm
|
||
+9 9s 9s 9 9 root 9 -- - S 9% flush-9:9
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% deja-dup-monito
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% evolution-calen
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% evolution-addre
|
||
+9 9s 9s 9 9 root 9 -- - D 9% jbd9/dm-9-9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ksoftirqd/9
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% tracker-miner-f
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% systemd-logind
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% crond
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kswapd9
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% systemd
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9K 9 rtkit 9 -- - S 9% rtkit-daemon
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ksoftirqd/9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ksoftirqd/9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% flush-9:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% jbd9/dm-9-9
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% bash
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ksoftirqd/9
|
||
+9 9s 9s 9K 9K pcp 9 -- - S 9% pmie
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gvfs-udisks9-vo
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% accounts-daemon
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% gdm-session-wor
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% rsyslogd
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gnote
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% dbus-daemon
|
||
+9 9s 9s 9 9 root 9 -- - S 9% migration/9
|
||
+9 9s 9s 9K 9K root 9 -- - R 9% pmdaproc
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% bash
|
||
+9 9s 9s 9 9 root 9 -- - S 9% migration/9
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% auditd
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% bash
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% abrt-watch-log
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% evolution-alarm
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% dhclient
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% watchdog/9
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gnome-shell-cal
|
||
+9 9s 9s 9 9 root 9 -- - S 9% watchdog/9
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% abrt-applet
|
||
+9 9s 9s 9 9 root 9 -- - S 9% watchdog/9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% watchdog/9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% migration/9
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% modem-manager
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% gdm-binary
|
||
+9 9s 9s 9K 9K colord 9 -- - S 9% colord
|
||
+9 9s 9s 9 9 root 9 -- - S 9% migration/9
|
||
+9 9s 9s 9K 9 avahi 9 -- - S 9% avahi-daemon
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% tracker-store
|
||
+9 9s 9s 9K 9 rpc 9 -- - S 9% rpcbind
|
||
+9 9s 9s 9K 9 chrony 9 -- - S 9% chronyd
|
||
+9 9s 9s 9K 9K pcp 9 -- - S 9% pmcd
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kauditd
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% dhclient
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% udevd
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% bash
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/u:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kthreadd
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gnome-keyring-d
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% bash
|
||
+9 9s 9s 9 9 root 9 -- - S 9% jbd9/dm-9-9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gsd-printer
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% smartd
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% gvfsd
|
||
+9 9s 9s 9K 9 colord 9 -- - S 9% colord-sane
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gvfsd-trash
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% pmatop.py
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% abrtd
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% dconf-service
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/u:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% bdi-default
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/u:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% khubd
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% atd
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gvfsd-metadata
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% udevd
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% bluetoothd
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% imsettings-daem
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% abrt-watch-log
|
||
+9 9s 9s 9K 9 rpcuse 9 -- - S 9% rpc.statd
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% pmlogger
|
||
+9 9s 9s 9 9 root 9 -- - S 9% fsnotify_mark
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% gdm-simple-slav
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% gvfs-gphoto9-vo
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kdevtmpfs
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% ibus-dconf
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% gvfsd-http
|
||
+9 9s 9s 9K 9K pcp 9 -- - S 9% pmlogger
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% sshd
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% gconfd-9
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% goa-daemon
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% ibus-engine-pin
|
||
+9 9s 9s 9K 9K scox 9 -- - S 9% evinced
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9 9 root 9 -- - S 9% rcu_bh
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9H
|
||
+9 9s 9s 9 9 root 9 -- - S 9% khelper
|
||
+9 9s 9s 9 9 root 9 -- - S 9% netns
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kintegrityd
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kblockd
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ata_sff
|
||
+9 9s 9s 9 9 root 9 -- - S 9% md
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ksmd
|
||
+9 9s 9s 9 9 root 9 -- - S 9% crypto
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kthrotld
|
||
+9 9s 9s 9 9 root 9 -- - S 9% scsi_eh_9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% scsi_eh_9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% scsi_eh_9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% scsi_eh_9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% scsi_eh_9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% scsi_eh_9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kpsmoused
|
||
+9 9s 9s 9 9 root 9 -- - S 9% deferwq
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kdmflush
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kdmflush
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% gvfsd-burn
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ext9-dio-unwrit
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kvm-irqfd-clean
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ktpacpid
|
||
+9 9s 9s 9 9 root 9 -- - S 9% hd-audio9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% cfg9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kdmflush
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kdmflush
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kdmflush
|
||
+9 9s 9s 9 9 root 9 -- - S 9% iwlwifi
|
||
+9 9s 9s 9 9 root 9 -- - S 9% jbd9/dm-9-9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ext9-dio-unwrit
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ext9-dio-unwrit
|
||
+9 9s 9s 9 9 root 9 -- - S 9% ext9-dio-unwrit
|
||
+9 9s 9s 9K 9 avahi 9 -- - S 9% avahi-daemon
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% system-setup-ke
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% mcelog
|
||
+9 9s 9s 9 9 root 9 -- - S 9% krfcommd
|
||
+9 9s 9s 9 9 root 9 -- - S 9% rpciod
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% dbus-launch
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% gvfs-fuse-daemo
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% gvfs-afc-volume
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% at-spi-bus-laun
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% gnome-pty-helpe
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% emacsclient
|
||
+9 9s 9s 9K 9 scox 9 -- - S 9% tools.sh
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/u:9H
|
||
+9 9s 9s 9K 9 scox 9 -- - T 9% emacsclient
|
||
+9 9s 9s 9K 9 scox 9 -- - T 9% emacsclient
|
||
+9 9s 9s 9 9 root 9 -- - S 9% irq/9-mei
|
||
+9 9s 9s 9 9 root 9 -- - S 9% hci9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% hci9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/u:9H
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% udevd
|
||
+9 9s 9s 9K 9K root 9 -- - S 9% pmdaxfs
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9 9 root 9 -- - S 9% kworker/9:9
|
||
+9 9s 9s 9K 9 root 9 -- - S 9% ssh-agent
|
||
+== Direct archive testing complete
|
||
+== Comparing direct to folio output
|
||
+ Output compares exactly - good
|
||
+== Output comparisons all completed
|
||
pmatop log creation OK
|
||
+== Live writer testing complete
|
||
diff -Naurp pcp-3.10.2.orig/qa/729 pcp-3.10.2/qa/729
|
||
--- pcp-3.10.2.orig/qa/729 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/729 2015-02-23 21:24:36.657658339 +1100
|
||
@@ -24,7 +24,7 @@ fname = 'src/bug_v2'
|
||
context = pcp.pmapi.pmContext(c_api.PM_CONTEXT_ARCHIVE, fname)
|
||
pmids = context.pmLookupName(['proc.nprocs'])
|
||
descs = context.pmLookupDescs(pmids[0])
|
||
-print '%s%s' % (descs[0].contents.units, 'Completed safely')
|
||
+print('%s%s' % (descs[0].contents.units, 'Completed safely'))
|
||
EOF
|
||
|
||
cat > $tmp.parse << EOF
|
||
@@ -32,8 +32,8 @@ import pcp.pmapi
|
||
context = pcp.pmapi.pmContext(target='local:')
|
||
try:
|
||
print(context.pmParseInterval(''))
|
||
-except pcp.pmapi.pmErr, error:
|
||
- print 'Completed safely'
|
||
+except pcp.pmapi.pmErr as error:
|
||
+ print('Completed safely')
|
||
EOF
|
||
|
||
# real QA test starts here
|
||
diff -Naurp pcp-3.10.2.orig/qa/754 pcp-3.10.2/qa/754
|
||
--- pcp-3.10.2.orig/qa/754 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/qa/754 2015-02-23 21:24:36.657658339 +1100
|
||
@@ -2,7 +2,7 @@
|
||
# PCP QA Test No. 754
|
||
# Exercise the Unbound PMDA.
|
||
#
|
||
-# Copyright (c) 2014 Red Hat.
|
||
+# Copyright (c) 2014-2015 Red Hat.
|
||
#
|
||
|
||
seq=`basename $0`
|
||
@@ -10,6 +10,7 @@ echo "QA output created by $seq"
|
||
|
||
. ./common.python
|
||
|
||
+python_path=`which $python`
|
||
pmda_path="$PCP_PMDAS_DIR/unbound"
|
||
pmda_script="$pmda_path/pmdaunbound.python"
|
||
test -f "$pmda_script" || _notrun "pmdaunbound not supported"
|
||
@@ -31,12 +32,12 @@ _filter()
|
||
{
|
||
tee -a $seq.full | \
|
||
sed \
|
||
- -e "s;$python;\$PYTHON;" \
|
||
-e "s;$PCP_PMDAS_DIR;\$PCP_PMDAS_DIR;" \
|
||
-e '/pmResult/s/ .* numpmid/ ... numpmid/' \
|
||
-e '/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/s/[^ ]*/TIMESTAMP/' \
|
||
-
|
||
- test -f unbound.log && cat unbound.log >> $seq.full
|
||
+ -e "s;$python_path;\$PCP_PYTHON_PROG;" \
|
||
+ -e "s;$python;python;" \
|
||
+ #end
|
||
}
|
||
|
||
_filter_result()
|
||
@@ -46,7 +47,7 @@ _filter_result()
|
||
|
||
domain=132
|
||
test="$here/unbound"
|
||
-$sudo rm -f /tmp/unbound-qa.txt # from test.sh
|
||
+$sudo rm -f unbound.log /tmp/unbound-qa.txt # the latter from test.sh
|
||
export UNBOUND_STATS="$here/unbound/test.sh"
|
||
|
||
# real QA test starts here
|
||
@@ -54,7 +55,7 @@ PCP_PYTHON_PMNS=root $python "$pmda_scri
|
||
|
||
echo "== Testing unbound metric values" | tee -a $seq.full
|
||
cat > $tmp.fetch <<End-of-File
|
||
-open pipe $python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
getdesc on
|
||
End-of-File
|
||
cat $here/unbound/metrics.list | \
|
||
@@ -62,7 +63,8 @@ while read metric
|
||
do
|
||
echo fetch $metric >> $tmp.fetch
|
||
done
|
||
-$sudo dbpmda -n $tmp.root -ie < $tmp.fetch 2>&1 | _filter
|
||
+dbpmda -n $tmp.root -ie < $tmp.fetch 2>&1 | _filter
|
||
+test -f unbound.log && cat unbound.log >> $seq.full
|
||
|
||
status=0
|
||
exit
|
||
diff -Naurp pcp-3.10.2.orig/qa/754.out pcp-3.10.2/qa/754.out
|
||
--- pcp-3.10.2.orig/qa/754.out 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/qa/754.out 2015-02-23 21:24:36.658658338 +1100
|
||
@@ -1,7 +1,7 @@
|
||
QA output created by 754
|
||
== Testing unbound metric values
|
||
-dbpmda> open pipe $PYTHON $PCP_PMDAS_DIR/unbound/pmdaunbound.python
|
||
-Start python PMDA: $PYTHON $PCP_PMDAS_DIR/unbound/pmdaunbound.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/unbound/pmdaunbound.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/unbound/pmdaunbound.python
|
||
dbpmda> getdesc on
|
||
dbpmda> fetch unbound.histogram.262144_000000_to_524288_000000
|
||
PMID(s): 132.0.139
|
||
diff -Naurp pcp-3.10.2.orig/qa/972 pcp-3.10.2/qa/972
|
||
--- pcp-3.10.2.orig/qa/972 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/972 2015-02-23 21:24:36.658658338 +1100
|
||
@@ -2,28 +2,20 @@
|
||
# PCP QA Test No. 972
|
||
# Exercise the zswap compressed swap PMDA using dbpmda.
|
||
#
|
||
-# Copyright (c) 2014 Red Hat.
|
||
+# Copyright (c) 2014-2015 Red Hat.
|
||
#
|
||
|
||
seq=`basename $0`
|
||
echo "QA output created by $seq"
|
||
|
||
-# get standard environment, filters and checks
|
||
-. ./common.product
|
||
-. ./common.filter
|
||
-. ./common.check
|
||
+. ./common.python
|
||
|
||
+python_path=`which $python`
|
||
pmda_path="$PCP_PMDAS_DIR/zswap"
|
||
pmda_script="$pmda_path/pmdazswap.python"
|
||
test -f "$pmda_script" || _notrun "pmdazswap not supported"
|
||
-python -c "from pcp import pmda" >/dev/null 2>&1
|
||
+$python -c "from pcp import pmda" >/dev/null 2>&1
|
||
[ $? -eq 0 ] || _notrun "python pcp pmda module not installed"
|
||
-case `python -V 2>&1 | sed -e 's/Python //'`
|
||
-in
|
||
- 0.*.*|1.*.*|2.0.*|2.1.*|2.3.*|2.4.*)
|
||
- _notrun "need python 2.5 or later"
|
||
- ;;
|
||
-esac
|
||
|
||
status=1 # failure is the default!
|
||
$sudo rm -rf $tmp.* $seq.full
|
||
@@ -34,10 +26,12 @@ _filter()
|
||
tee -a $seq.full | \
|
||
sed \
|
||
-e "s;$PCP_PMDAS_DIR;\$PCP_PMDAS_DIR;" \
|
||
+ -e "s;$PCP_PMDAS_DIR;\$PCP_PMDAS_DIR;" \
|
||
-e '/pmResult/s/ .* numpmid/ ... numpmid/' \
|
||
-e '/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/s/[^ ]*/TIMESTAMP/' \
|
||
-
|
||
- test -f zswap.log && cat zswap.log >> $seq.full
|
||
+ -e "s;$python_path;\$PCP_PYTHON_PROG;" \
|
||
+ -e "s;$python;python;" \
|
||
+ #end
|
||
}
|
||
|
||
_setup_zswap_values()
|
||
@@ -54,6 +48,8 @@ _setup_zswap_values()
|
||
echo 2 > reject_reclaim_fail
|
||
echo 89123 > stored_pages
|
||
echo 12435 > written_back_pages
|
||
+
|
||
+ cd $here
|
||
}
|
||
|
||
domain=125
|
||
@@ -62,11 +58,11 @@ export ZSWAP_STATS_PATH="$tmp.zswap"
|
||
|
||
# real QA test starts here
|
||
_setup_zswap_values
|
||
-PCP_PYTHON_PMNS=root python "$pmda_script" > $tmp.root
|
||
+PCP_PYTHON_PMNS=root $python "$pmda_script" > $tmp.root
|
||
|
||
echo "== Testing zswap metrics" | tee -a $seq.full
|
||
-$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe /usr/bin/python $pmda_script
|
||
+dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
+open pipe $python_path $pmda_script
|
||
getdesc on
|
||
desc zswap.pool_limit_hit
|
||
desc zswap.reject_reclaim_fail
|
||
@@ -87,6 +83,7 @@ fetch zswap.duplicate_entry
|
||
fetch zswap.pool_pages
|
||
fetch zswap.stored_pages
|
||
End-of-File
|
||
+test -f zswap.log && cat zswap.log >> $seq.full
|
||
|
||
status=0
|
||
exit
|
||
diff -Naurp pcp-3.10.2.orig/qa/972.out pcp-3.10.2/qa/972.out
|
||
--- pcp-3.10.2.orig/qa/972.out 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/972.out 2015-02-23 21:24:36.658658338 +1100
|
||
@@ -1,7 +1,7 @@
|
||
QA output created by 972
|
||
== Testing zswap metrics
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/zswap/pmdazswap.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/zswap/pmdazswap.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/zswap/pmdazswap.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/zswap/pmdazswap.python
|
||
dbpmda> getdesc on
|
||
dbpmda> desc zswap.pool_limit_hit
|
||
PMID: 125.0.0
|
||
diff -Naurp pcp-3.10.2.orig/qa/985 pcp-3.10.2/qa/985
|
||
--- pcp-3.10.2.orig/qa/985 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/985 2015-02-23 21:24:36.659658337 +1100
|
||
@@ -2,28 +2,20 @@
|
||
# PCP QA Test No. 985
|
||
# Exercise the dmcache PMDA using dbpmda.
|
||
#
|
||
-# Copyright (c) 2014 Red Hat.
|
||
+# Copyright (c) 2014-2015 Red Hat.
|
||
#
|
||
|
||
seq=`basename $0`
|
||
echo "QA output created by $seq"
|
||
|
||
-# get standard environment, filters and checks
|
||
-. ./common.product
|
||
-. ./common.filter
|
||
-. ./common.check
|
||
+. ./common.python
|
||
|
||
+python_path=`which $python`
|
||
pmda_path="$PCP_PMDAS_DIR/dmcache"
|
||
pmda_script="$pmda_path/pmdadmcache.python"
|
||
test -f "$pmda_script" || _notrun "pmdadmcache not supported"
|
||
-python -c "from pcp import pmda" >/dev/null 2>&1
|
||
+$python -c "from pcp import pmda" >/dev/null 2>&1
|
||
[ $? -eq 0 ] || _notrun "python pcp pmda module not installed"
|
||
-case `python -V 2>&1 | sed -e 's/Python //'`
|
||
-in
|
||
- 0.*.*|1.*.*|2.0.*|2.1.*|2.3.*|2.4.*)
|
||
- _notrun "need python 2.5 or later"
|
||
- ;;
|
||
-esac
|
||
|
||
status=1 # failure is the default!
|
||
$sudo rm -rf $tmp.* $seq.full
|
||
@@ -36,7 +28,9 @@ _filter()
|
||
-e "s;$PCP_PMDAS_DIR;\$PCP_PMDAS_DIR;" \
|
||
-e '/pmResult/s/ .* numpmid/ ... numpmid/' \
|
||
-e '/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/s/[^ ]*/TIMESTAMP/' \
|
||
-
|
||
+ -e "s;$python_path;\$PCP_PYTHON_PROG;" \
|
||
+ -e "s;$python;python;" \
|
||
+ #end
|
||
test -f dmcache.log && cat dmcache.log >> $seq.full
|
||
}
|
||
|
||
@@ -53,11 +47,11 @@ export DM_STATUS=$tmp.dmcache.sh
|
||
|
||
# real QA test starts here
|
||
echo "== Finding dmcache metrics" | tee -a $seq.full
|
||
-PCP_PYTHON_PMNS=root python "$pmda_script" 2>/dev/null > $tmp.root
|
||
+PCP_PYTHON_PMNS=root $python "$pmda_script" 2>/dev/null > $tmp.root
|
||
|
||
echo "== Testing dmcache metrics" | tee -a $seq.full
|
||
$sudo dbpmda -n $tmp.root -ie <<End-of-File 2>&1 | _filter
|
||
-open pipe /usr/bin/python $pmda_script
|
||
+open pipe $python_path $pmda_script
|
||
getdesc on
|
||
instance $domain.0
|
||
desc dmcache.size
|
||
diff -Naurp pcp-3.10.2.orig/qa/985.out pcp-3.10.2/qa/985.out
|
||
--- pcp-3.10.2.orig/qa/985.out 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/985.out 2015-02-23 21:24:36.659658337 +1100
|
||
@@ -1,8 +1,8 @@
|
||
QA output created by 985
|
||
== Finding dmcache metrics
|
||
== Testing dmcache metrics
|
||
-dbpmda> open pipe /usr/bin/python $PCP_PMDAS_DIR/dmcache/pmdadmcache.python
|
||
-Start python PMDA: /usr/bin/python $PCP_PMDAS_DIR/dmcache/pmdadmcache.python
|
||
+dbpmda> open pipe $PCP_PYTHON_PROG $PCP_PMDAS_DIR/dmcache/pmdadmcache.python
|
||
+Start python PMDA: $PCP_PYTHON_PROG $PCP_PMDAS_DIR/dmcache/pmdadmcache.python
|
||
dbpmda> getdesc on
|
||
dbpmda> instance 129.0
|
||
pmInDom: 129.0
|
||
diff -Naurp pcp-3.10.2.orig/qa/986 pcp-3.10.2/qa/986
|
||
--- pcp-3.10.2.orig/qa/986 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/986 2015-02-23 21:24:36.659658337 +1100
|
||
@@ -2,24 +2,21 @@
|
||
# PCP QA Test No. 986
|
||
# Exercise the dmcache PMDA using the running kernel.
|
||
#
|
||
-# Copyright (c) 2014 Red Hat.
|
||
+# Copyright (c) 2014-2015 Red Hat.
|
||
#
|
||
|
||
seq=`basename $0`
|
||
echo "QA output created by $seq"
|
||
|
||
-# get standard environment, filters and checks
|
||
-. ./common.product
|
||
-. ./common.filter
|
||
-. ./common.check
|
||
+. ./common.python
|
||
|
||
status=1 # failure is the default!
|
||
$sudo rm -f $tmp.* $seq.full
|
||
|
||
which dmsetup >/dev/null 2>&1
|
||
test $? -eq 0 || _notrun "Device Mapper 'dmsetup' binary not found"
|
||
-python -c 'from pcp import pmda' 2>/dev/null
|
||
-test $? -eq 0 || _notrun 'Python pcp pmda module is not installed'
|
||
+$python -c 'from pcp import pmda' 2>/dev/null
|
||
+test $? -eq 0 || _notrun "$python pcp pmda module is not installed"
|
||
|
||
_filter_dmcache()
|
||
{
|
||
diff -Naurp pcp-3.10.2.orig/qa/common.python pcp-3.10.2/qa/common.python
|
||
--- pcp-3.10.2.orig/qa/common.python 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/common.python 2015-02-23 21:24:36.660658336 +1100
|
||
@@ -8,8 +8,8 @@
|
||
. ./common.filter
|
||
. ./common.check
|
||
|
||
-# allow alternate versions of python to be used
|
||
-python=${PYTHON:-/usr/bin/python}
|
||
+python=${PCP_PYTHON_PROG:-python}
|
||
+eval $python -c exit 2>/dev/null || _notrun "$python unavailable"
|
||
|
||
# verify output from unittest indicates successful testing
|
||
_check_unittest()
|
||
diff -Naurp pcp-3.10.2.orig/qa/pmdas/memory_python/pmdamemory_python.python pcp-3.10.2/qa/pmdas/memory_python/pmdamemory_python.python
|
||
--- pcp-3.10.2.orig/qa/pmdas/memory_python/pmdamemory_python.python 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/pmdas/memory_python/pmdamemory_python.python 2015-02-23 21:24:36.660658336 +1100
|
||
@@ -42,7 +42,7 @@ class MemoryPMDA(PMDA):
|
||
# At this point if all goes well, the PMDA internal
|
||
# _metric_names dictionary will contain the metric we just
|
||
# added. If not, memory has become corrupted.
|
||
- if not self._metric_names.has_key(self.metric_pmid):
|
||
+ if not self.metric_pmid in self._metric_names:
|
||
self.memory_valid = 0
|
||
msg = '_metric_names has no matching pmid'
|
||
self.log(msg)
|
||
@@ -66,14 +66,14 @@ class MemoryPMDA(PMDA):
|
||
self.memory_valid = 1
|
||
self.metric_name = name + '.memory_valid'
|
||
self.metric_pmid = self.pmid(0, 0)
|
||
- self.metric_obj = pmdaMetric(self.metric_pmid, c_api.PM_TYPE_64,
|
||
+ self.metric_obj = pmdaMetric(self.metric_pmid, c_api.PM_TYPE_64,
|
||
c_api.PM_INDOM_NULL, c_api.PM_SEM_COUNTER,
|
||
pmUnits(0, 0, 0, 0, 0, 0))
|
||
self.metric_oneline = "test metric"
|
||
self.add_metric(self.metric_name, self.metric_obj, self.metric_oneline)
|
||
|
||
# Make sure the PMDA's internal dictionary is in a good state.
|
||
- if not self._metric_names.has_key(self.metric_pmid):
|
||
+ if not self.metric_pmid in self._metric_names:
|
||
self.memory_valid = 0
|
||
msg = '_metric_names has no matching pmid'
|
||
self.log(msg)
|
||
diff -Naurp pcp-3.10.2.orig/qa/pmdas/slow_python/pmdaslow_python.python pcp-3.10.2/qa/pmdas/slow_python/pmdaslow_python.python
|
||
--- pcp-3.10.2.orig/qa/pmdas/slow_python/pmdaslow_python.python 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/pmdas/slow_python/pmdaslow_python.python 2015-02-23 21:24:36.660658336 +1100
|
||
@@ -32,33 +32,33 @@ class SlowPMDA(PMDA):
|
||
'''
|
||
|
||
def slow_fetch_callback(self, cluster, item, inst):
|
||
- global fetch_delay
|
||
+ global fetch_delay
|
||
|
||
- if int(fetch_delay) < 0:
|
||
- time.sleep(-1*int(fetch_delay))
|
||
+ if int(fetch_delay) < 0:
|
||
+ time.sleep(-1*int(fetch_delay))
|
||
|
||
- if int(fetch_delay) > 0:
|
||
- time.sleep(int(fetch_delay))
|
||
+ if int(fetch_delay) > 0:
|
||
+ time.sleep(int(fetch_delay))
|
||
|
||
if cluster == 0 and item == 0:
|
||
return [13, 1]
|
||
return [c_api.PM_ERR_PMID, 0]
|
||
|
||
def __init__(self, name, domain):
|
||
- global start_delay
|
||
+ global start_delay
|
||
|
||
PMDA.__init__(self, name, domain)
|
||
|
||
self.configfile = PCP.pmGetConfig('PCP_PMDAS_DIR')
|
||
self.configfile += '/' + name + '/' + name + '.conf'
|
||
|
||
- if int(start_delay) > 0:
|
||
- self.connect_pmcd()
|
||
+ if int(start_delay) > 0:
|
||
+ self.connect_pmcd()
|
||
|
||
- if int(start_delay) < 0:
|
||
- time.sleep(-1*int(start_delay))
|
||
- if int(start_delay) > 0:
|
||
- time.sleep(int(start_delay))
|
||
+ if int(start_delay) < 0:
|
||
+ time.sleep(-1*int(start_delay))
|
||
+ if int(start_delay) > 0:
|
||
+ time.sleep(int(start_delay))
|
||
|
||
self.add_metric(name + '.thirteen', pmdaMetric(self.pmid(0, 0),
|
||
c_api.PM_TYPE_32, c_api.PM_INDOM_NULL, c_api.PM_SEM_INSTANT,
|
||
diff -Naurp pcp-3.10.2.orig/qa/src/test_pcp.python pcp-3.10.2/qa/src/test_pcp.python
|
||
--- pcp-3.10.2.orig/qa/src/test_pcp.python 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/qa/src/test_pcp.python 2015-02-23 21:24:36.661658335 +1100
|
||
@@ -30,7 +30,7 @@ def dump_seq(name_p, seq_p):
|
||
|
||
def dump_array_ptrs(name_p, arr_p):
|
||
print(name_p)
|
||
- for i in xrange(len(arr_p)):
|
||
+ for i in range(len(arr_p)):
|
||
if (i > 0):
|
||
print(" ", arr_p[i].contents)
|
||
else:
|
||
@@ -38,7 +38,7 @@ def dump_array_ptrs(name_p, arr_p):
|
||
|
||
def dump_array(name_p, arr_p):
|
||
print(name_p)
|
||
- for i in xrange(len(arr_p)):
|
||
+ for i in range(len(arr_p)):
|
||
if (i > 0):
|
||
print(" ", hex(arr_p[i]))
|
||
else:
|
||
@@ -72,8 +72,9 @@ def test_pcp(self):
|
||
source = 'localhost'
|
||
try:
|
||
(rsltp, errmsg) = ctx.pmParseMetricSpec("kernel.all.load", 0, source)
|
||
- print("pmParseMetricSpec:", rsltp.contents.source)
|
||
- self.assertTrue(rsltp.contents.source == source)
|
||
+ result = rsltp.contents.source.decode()
|
||
+ print("pmParseMetricSpec:", result)
|
||
+ self.assertTrue(result == source)
|
||
except pmapi.pmErr as error:
|
||
print("pmParseMetricSpec error: ", error)
|
||
|
||
@@ -124,7 +125,7 @@ def test_pcp(self):
|
||
api.PM_TYPE_STRING)
|
||
machine_vp = atom.vp
|
||
self.assertTrue(machine_u32 != machine_vp)
|
||
- self.assertTrue(type(atom.cp) == type(''))
|
||
+ self.assertTrue(type(atom.cp) == type('') or type(atom.cp) == type(b''))
|
||
|
||
# pmGetChildren
|
||
if not self.archive_type:
|
||
@@ -179,16 +180,27 @@ def test_pcp(self):
|
||
dump_array("pmLookupName", self.metric_ids)
|
||
self.assertTrue(len(self.metric_ids) == 4)
|
||
|
||
- for i in xrange(len(metrics)):
|
||
+ for i in range(len(metrics)):
|
||
# pmNameAll
|
||
+ # one of the returned names should be the same as metrics[i]
|
||
nameall = ctx.pmNameAll(self.metric_ids[i])
|
||
- print("pmNameAll:", nameall[0])
|
||
- self.assertTrue(nameall[0] == metrics[i])
|
||
+ match = 0
|
||
+ for j in range(len(nameall)):
|
||
+ print("pmNameAll:", nameall[j])
|
||
+ if (nameall[j] == metrics[i]):
|
||
+ match = 1
|
||
+ self.assertTrue(match)
|
||
|
||
# pmNameID
|
||
+ # result will be one of the names from pmNameAll and we've
|
||
+ # already established that one of these is the same as metrics[i]
|
||
name = ctx.pmNameID(self.metric_ids[i])
|
||
- print("pmNameID:", name)
|
||
- self.assertTrue(name == metrics[i])
|
||
+ print("pmNameID:", name);
|
||
+ match = 0
|
||
+ for j in range(len(nameall)):
|
||
+ if (nameall[j] == name):
|
||
+ match = 1
|
||
+ self.assertTrue(match)
|
||
|
||
# pmLookupDesc
|
||
descs = ctx.pmLookupDescs(self.metric_ids[i])
|
||
@@ -317,7 +329,7 @@ def test_pcp(self):
|
||
(units,mult) = ctx.pmParseUnitsStr(5) # type-checking non-string
|
||
print("pmParseUnitsStr:", units, mult)
|
||
self.assertTrue(False)
|
||
- except AssertionError as error:
|
||
+ except pmapi.pmErr as error:
|
||
print("pmParseUnitsStr: ", error)
|
||
self.assertTrue(True)
|
||
|
||
@@ -346,10 +358,10 @@ def test_pcp(self):
|
||
print("pmStore: ", error)
|
||
self.assertTrue(True)
|
||
|
||
- for i in xrange(results.contents.numpmid):
|
||
+ for i in range(results.contents.numpmid):
|
||
if (results.contents.get_pmid(i) != self.metric_ids[1]):
|
||
continue
|
||
- for val in xrange(9):
|
||
+ for val in range(9):
|
||
# sample.bin - each instance in turn
|
||
atom = ctx.pmExtractValue(results.contents.get_valfmt(i),
|
||
results.contents.get_vlist(i, val),
|
||
@@ -359,7 +371,7 @@ def test_pcp(self):
|
||
self.assertTrue(99*(val+1) <= atom.f and atom.f <= 101*(val+1))
|
||
|
||
# pmExtractValue
|
||
- for i in xrange(results.contents.numpmid):
|
||
+ for i in range(results.contents.numpmid):
|
||
if (results.contents.get_pmid(i) != self.metric_ids[3]):
|
||
continue
|
||
# mem.freemem
|
||
@@ -438,7 +450,10 @@ def test_pcp(self):
|
||
# pmPrintValue
|
||
if not self.archive_type:
|
||
print("pmPrintValue:")
|
||
- ctx.pmPrintValue(sys.__stdout__, results, descs[0], 0, 0, 8)
|
||
+ if sys.version >= '3':
|
||
+ print('Not yet implemented')
|
||
+ else:
|
||
+ ctx.pmPrintValue(sys.__stdout__, results, descs[0], 0, 0, 8)
|
||
print('')
|
||
|
||
# pmReconnectContext
|
||
diff -Naurp pcp-3.10.2.orig/qa/src/test_pmcc.python pcp-3.10.2/qa/src/test_pmcc.python
|
||
--- pcp-3.10.2.orig/qa/src/test_pmcc.python 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/qa/src/test_pmcc.python 2015-02-23 21:24:36.661658335 +1100
|
||
@@ -1,6 +1,6 @@
|
||
""" Test metric value extraction/reporting using the pcp.pmcc module """
|
||
#
|
||
-# Copyright (C) 2013-2014 Red Hat Inc.
|
||
+# Copyright (C) 2013-2015 Red Hat Inc.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -13,9 +13,14 @@
|
||
# for more details.
|
||
#
|
||
|
||
+import sys
|
||
import unittest
|
||
from pcp import pmcc, pmapi
|
||
|
||
+if sys.version >= '3':
|
||
+ import functools
|
||
+ reduce = functools.reduce
|
||
+
|
||
CPU_METRICS = [ "kernel.all.cpu.sys", "kernel.all.cpu.user",
|
||
"kernel.all.cpu.nice", "kernel.all.cpu.idle", ]
|
||
MEM_METRICS = [ "mem.physmem", "mem.freemem", ]
|
||
diff -Naurp pcp-3.10.2.orig/src/include/pcp.conf.in pcp-3.10.2/src/include/pcp.conf.in
|
||
--- pcp-3.10.2.orig/src/include/pcp.conf.in 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/include/pcp.conf.in 2015-02-23 21:24:36.662658334 +1100
|
||
@@ -1,5 +1,5 @@
|
||
#
|
||
-# Copyright (c) 2013-2014 Red Hat.
|
||
+# Copyright (c) 2013-2015 Red Hat.
|
||
# Copyright (c) 2000-2001,2003 Silicon Graphics, Inc. All Rights Reserved.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
@@ -176,6 +176,9 @@ PCP_PS_PROG=@pcp_ps_prog@
|
||
PCP_PS_HAVE_BSD=@pcp_ps_have_bsd@
|
||
PCP_PS_ALL_FLAGS=@pcp_ps_all_flags@
|
||
|
||
+# preferred python executable
|
||
+PCP_PYTHON_PROG=@pcp_python_prog@
|
||
+
|
||
# locate executables
|
||
PCP_WHICH_PROG=@which@
|
||
|
||
diff -Naurp pcp-3.10.2.orig/src/pcp/dmcache/pcp-dmcache.py pcp-3.10.2/src/pcp/dmcache/pcp-dmcache.py
|
||
--- pcp-3.10.2.orig/src/pcp/dmcache/pcp-dmcache.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pcp/dmcache/pcp-dmcache.py 2015-02-23 21:24:36.662658334 +1100
|
||
@@ -1,6 +1,6 @@
|
||
#!/usr/bin/python
|
||
#
|
||
-# Copyright (C) 2014 Red Hat.
|
||
+# Copyright (C) 2014-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -18,6 +18,9 @@
|
||
import sys
|
||
from pcp import pmapi, pmcc
|
||
|
||
+if sys.version >= '3':
|
||
+ long = int # python2 to python3 portability (no long() in python3)
|
||
+
|
||
CACHE_METRICS = ['dmcache.cache.used', 'dmcache.cache.total',
|
||
'dmcache.metadata.used', 'dmcache.metadata.total',
|
||
'dmcache.read_hits', 'dmcache.read_misses',
|
||
diff -Naurp pcp-3.10.2.orig/src/pcp/free/pcp-free.py pcp-3.10.2/src/pcp/free/pcp-free.py
|
||
--- pcp-3.10.2.orig/src/pcp/free/pcp-free.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pcp/free/pcp-free.py 2015-02-23 21:24:36.662658334 +1100
|
||
@@ -1,6 +1,6 @@
|
||
#!/usr/bin/python
|
||
#
|
||
-# Copyright (C) 2014 Red Hat.
|
||
+# Copyright (C) 2014-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -19,6 +19,9 @@ import sys
|
||
from pcp import pmapi
|
||
from cpmapi import PM_TYPE_U64, PM_CONTEXT_ARCHIVE, PM_SPACE_KBYTE
|
||
|
||
+if sys.version >= '3':
|
||
+ long = int # python2 to python3 portability (no long() in python3)
|
||
+
|
||
class Free(object):
|
||
""" Gives a short summary of kernel virtual memory information,
|
||
in a variety of formats, possibly sampling in a loop.
|
||
diff -Naurp pcp-3.10.2.orig/src/pcp/numastat/pcp-numastat.py pcp-3.10.2/src/pcp/numastat/pcp-numastat.py
|
||
--- pcp-3.10.2.orig/src/pcp/numastat/pcp-numastat.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pcp/numastat/pcp-numastat.py 2015-02-23 21:24:36.663658333 +1100
|
||
@@ -1,6 +1,6 @@
|
||
#!/usr/bin/python
|
||
#
|
||
-# Copyright (C) 2014 Red Hat.
|
||
+# Copyright (C) 2014-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -20,6 +20,9 @@ import sys
|
||
from pcp import pmapi
|
||
from cpmapi import PM_TYPE_U64
|
||
|
||
+if sys.version >= '3':
|
||
+ long = int # python2 to python3 portability (no long() in python3)
|
||
+
|
||
class NUMAStat(object):
|
||
""" Gives a short summary of per-node NUMA memory information.
|
||
|
||
@@ -103,7 +106,7 @@ class NUMAStat(object):
|
||
print("No NUMA nodes found, exiting")
|
||
sys.exit(1)
|
||
self.resize()
|
||
- maxnodes = (self.width - 16) / 16
|
||
+ maxnodes = int((self.width - 16) / 16)
|
||
if maxnodes > len(nodes): # just an initial header suffices
|
||
header = '%-16s' % ''
|
||
for node in nodes:
|
||
diff -Naurp pcp-3.10.2.orig/src/pmatop/pmatop.py pcp-3.10.2/src/pmatop/pmatop.py
|
||
--- pcp-3.10.2.orig/src/pmatop/pmatop.py 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmatop/pmatop.py 2015-02-23 21:21:18.201838488 +1100
|
||
@@ -1,9 +1,6 @@
|
||
#!/usr/bin/python
|
||
-
|
||
-#
|
||
-# pmatop.py
|
||
#
|
||
-# Copyright (C) 2013, 2014 Red Hat Inc.
|
||
+# Copyright (C) 2013-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -445,25 +442,19 @@ class _DiskPrint(_AtopPrint):
|
||
replay_archive = property(None, replay_archive_write, None, None)
|
||
|
||
def disk(self, context):
|
||
+ desc = self.ss.metric_descs[self.ss.metrics_dict['disk.partitions.read']]
|
||
try:
|
||
- (inst, iname) = context.pmGetInDom(self.ss.metric_descs[self.ss.metrics_dict['disk.partitions.read']])
|
||
+ (inst, iname) = context.pmGetInDom(desc)
|
||
except pmapi.pmErr as e:
|
||
iname = iname = "X"
|
||
|
||
-# Missing: LVM avq (average queue depth)
|
||
-
|
||
- lvms = dict(map(lambda x: (os.path.realpath("/dev/mapper/" + x)[5:], x),
|
||
- (os.listdir("/dev/mapper"))))
|
||
+ # Missing: LVM avq (average queue depth)
|
||
+ # TODO: switch to using disk.dm metrics?
|
||
|
||
for j in xrange(self.ss.get_len(self.ss.get_metric_value('disk.partitions.read'))):
|
||
- if self._replay_archive == True:
|
||
- if iname[j][:2] != "dm":
|
||
- continue
|
||
- lvm = iname[j]
|
||
- else:
|
||
- if iname[j] not in lvms:
|
||
- continue
|
||
- lvm = lvms[iname[j]]
|
||
+ if iname[j][:2] != "dm":
|
||
+ continue
|
||
+ lvm = iname[j]
|
||
partitions_read = self.ss.get_scalar_value('disk.partitions.read', j)
|
||
partitions_write = self.ss.get_scalar_value('disk.partitions.write', j)
|
||
if partitions_read == 0 and partitions_write == 0:
|
||
@@ -701,10 +692,8 @@ class _ProcPrint(_AtopPrint):
|
||
|
||
class _Options(object):
|
||
def __init__(self):
|
||
- self.input_file = ""
|
||
self.output_file = ""
|
||
self.output_type = "g"
|
||
- self.host = "local:"
|
||
self.create_archive = False
|
||
self.replay_archive = False
|
||
self.have_interval_arg = False
|
||
@@ -719,16 +708,28 @@ class _Options(object):
|
||
opts.pmSetOptionCallback(self.option_callback)
|
||
opts.pmSetOverrideCallback(self.override)
|
||
# leading - returns args that are not options with leading ^A
|
||
- opts.pmSetShortOptions("-gmw:r:L:h:V?")
|
||
- opts.pmSetLongOptionHeader("Options")
|
||
+ opts.pmSetShortOptions("-gmw:r:L:h:a:V?")
|
||
+ opts.pmSetLongOptionText("Interactive: [-g|-m] [-L linelen] [-h host | -a archive] [ interval [ samples ]]")
|
||
+ opts.pmSetLongOptionText("Write folio: pmatop -w folio [ interval [ samples ]]")
|
||
+ opts.pmSetLongOptionText("Read folio: pmatop -r folio [-g|-m] [-L linelen] [-h host]")
|
||
+ opts.pmSetLongOptionHeader("Reporting Options")
|
||
opts.pmSetLongOption("generic", 0, 'g', '', "Display generic metrics")
|
||
opts.pmSetLongOption("memory", 0, 'm', '', "Display memory metrics")
|
||
- opts.pmSetLongOption("write", 1, 'w', 'FILENAME', "Write metric data to file")
|
||
- opts.pmSetLongOption("read", 1, 'r', 'FILENAME', "Read metric data from file")
|
||
opts.pmSetLongOption("width", 1, 'L', 'WIDTH', "Width of the output")
|
||
- opts.pmSetShortUsage("[options]\nInteractive: [-g|-m] [-L linelen] [-h host] [ interval [ samples ]]\nWrite raw logfile: pmatop -w rawfile [ interval [ samples ]]\nRead raw logfile: pmatop -r [ rawfile ] [-g|-m] [-L linelen] [-h host]")
|
||
+ opts.pmSetLongOptionHeader("Folio Options")
|
||
+ opts.pmSetLongOption("write", 1, 'w', 'FILENAME', "Write metric data to PCP archive folio")
|
||
+ opts.pmSetLongOption("read", 1, 'r', 'FILENAME', "Read metric data from PCP archive folio")
|
||
+ opts.pmSetLongOptionHeader("General Options")
|
||
+ opts.pmSetLongOptionAlign()
|
||
+ opts.pmSetLongOptionArchive()
|
||
+ opts.pmSetLongOptionDebug()
|
||
opts.pmSetLongOptionHost()
|
||
+ opts.pmSetLongOptionOrigin()
|
||
+ opts.pmSetLongOptionStart()
|
||
+ opts.pmSetLongOptionFinish()
|
||
opts.pmSetLongOptionVersion()
|
||
+ opts.pmSetLongOptionTimeZone()
|
||
+ opts.pmSetLongOptionHostZone()
|
||
opts.pmSetLongOptionHelp()
|
||
return opts
|
||
|
||
@@ -738,6 +739,8 @@ class _Options(object):
|
||
# pylint: disable=R0201
|
||
if opt == 'g':
|
||
return 1
|
||
+ elif opt == "a":
|
||
+ self.replay_archive = True
|
||
elif opt == 'L':
|
||
return 1
|
||
return 0
|
||
@@ -755,12 +758,9 @@ class _Options(object):
|
||
self.create_archive = True
|
||
elif opt == "r":
|
||
self.opts.pmSetOptionArchiveFolio(optarg)
|
||
- self.input_file = optarg
|
||
self.replay_archive = True
|
||
elif opt == "L":
|
||
self.width = int(optarg)
|
||
- elif opt == 'h':
|
||
- self.host = optarg
|
||
elif opt == "":
|
||
if self.have_interval_arg == False:
|
||
self.interval_arg = optarg
|
||
@@ -796,14 +796,12 @@ def main(stdscr_p):
|
||
stdscr.width = opts.width
|
||
|
||
pmc = pmapi.pmContext.fromOptions(opts.opts, sys.argv)
|
||
+ (delta, errmsg) = pmc.pmParseInterval(str(opts.interval_arg) + " seconds")
|
||
if pmc.type == c_api.PM_CONTEXT_ARCHIVE:
|
||
- pmc.pmSetMode(c_api.PM_MODE_FORW, pmapi.timeval(0, 0), 0)
|
||
-
|
||
+ pmc.pmSetMode(c_api.PM_MODE_FORW, delta, 0)
|
||
|
||
host = pmc.pmGetContextHostName()
|
||
|
||
- (delta, errmsg) = pmc.pmParseInterval(str(opts.interval_arg) + " seconds")
|
||
-
|
||
ss.setup_metrics(pmc)
|
||
|
||
if opts.create_archive:
|
||
@@ -831,10 +829,10 @@ def main(stdscr_p):
|
||
elapsed = ss.get_metric_value('kernel.all.uptime')
|
||
while (i_samples < opts.n_samples) or (opts.n_samples == 0):
|
||
ss.get_stats(pmc)
|
||
+ stamp = pmc.pmCtime(ss.timestamp)
|
||
stdscr.move(0, 0)
|
||
stdscr.addstr('ATOP - %s %s elapsed\n\n' % (
|
||
- time.strftime("%c"),
|
||
- datetime.timedelta(0, elapsed)))
|
||
+ stamp.rstrip(), datetime.timedelta(0, elapsed)))
|
||
elapsed = delta.tv_sec
|
||
stdscr.move(2, 0)
|
||
|
||
diff -Naurp pcp-3.10.2.orig/src/pmcd/pmdaproc.sh pcp-3.10.2/src/pmcd/pmdaproc.sh
|
||
--- pcp-3.10.2.orig/src/pmcd/pmdaproc.sh 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmcd/pmdaproc.sh 2015-02-23 21:24:36.664658332 +1100
|
||
@@ -3,7 +3,7 @@
|
||
#
|
||
# Copyright (c) 1995-2001,2003 Silicon Graphics, Inc. All Rights Reserved.
|
||
# Portions Copyright (c) 2008 Aconex. All Rights Reserved.
|
||
-# Portions Copyright (c) 2013-2014 Red Hat.
|
||
+# Portions Copyright (c) 2013-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -891,17 +891,18 @@ _setup()
|
||
#
|
||
if $python_opt
|
||
then
|
||
+ python=${PCP_PYTHON_PROG:-python}
|
||
python_name="${pmda_dir}/pmda${iam}.python"
|
||
[ -f "$python_name" ] || python_name="${pmda_dir}/pmda${iam}.py"
|
||
if [ -f "$python_name" ]
|
||
then
|
||
python_pmns="${pmda_dir}/pmns.python"
|
||
python_dom="${pmda_dir}/domain.h.python"
|
||
- python -c 'from pcp import pmda' 2>/dev/null
|
||
+ $python -c 'from pcp import pmda' 2>/dev/null
|
||
if test $? -eq 0
|
||
then
|
||
- eval PCP_PYTHON_DOMAIN=1 python "$python_name" > "$python_dom"
|
||
- eval PCP_PYTHON_PMNS=1 python "$python_name" > "$python_pmns"
|
||
+ eval PCP_PYTHON_DOMAIN=1 $python "$python_name" > "$python_dom"
|
||
+ eval PCP_PYTHON_PMNS=1 $python "$python_name" > "$python_pmns"
|
||
elif $dso_opt || $daemon_opt
|
||
then
|
||
: # we have an alternative, so continue on
|
||
@@ -1080,7 +1081,7 @@ _install()
|
||
fi
|
||
elif [ "X$pmda_type" = Xpython ]
|
||
then
|
||
- python -c 'from pcp import pmda' 2>/dev/null
|
||
+ $python -c 'from pcp import pmda' 2>/dev/null
|
||
if test $? -ne 0
|
||
then
|
||
echo 'Python pcp pmda module is not installed, install it and try again'
|
||
@@ -1102,7 +1103,7 @@ _install()
|
||
args=""
|
||
elif [ "$pmda_type" = python ]
|
||
then
|
||
- type="pipe binary python $python_name $python_args"
|
||
+ type="pipe binary $python $python_name $python_args"
|
||
args=""
|
||
else
|
||
type="dso $dso_entry $dso_name"
|
||
diff -Naurp pcp-3.10.2.orig/src/pmcollectl/pmcollectl.py pcp-3.10.2/src/pmcollectl/pmcollectl.py
|
||
--- pcp-3.10.2.orig/src/pmcollectl/pmcollectl.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmcollectl/pmcollectl.py 2015-02-23 21:24:36.665658331 +1100
|
||
@@ -1,9 +1,6 @@
|
||
#!/usr/bin/python
|
||
-
|
||
-#
|
||
-# pmcollectl.py
|
||
#
|
||
-# Copyright (C) 2012-2014 Red Hat Inc.
|
||
+# Copyright (C) 2012-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -58,7 +55,7 @@ def scale(value, magnitude):
|
||
|
||
def record(context, config, duration, path, host):
|
||
if os.path.exists(path):
|
||
- print ME + "archive %s already exists\n" % path
|
||
+ print(ME + "archive %s already exists\n" % path)
|
||
sys.exit(1)
|
||
# Non-graphical application using libpcp_gui services - never want
|
||
# to see popup dialogs from pmlogger(1) here, so force the issue.
|
||
@@ -99,7 +96,7 @@ class _CollectPrint(object):
|
||
self.print_header1_detail()
|
||
elif self.verbosity == "verbose":
|
||
self.print_header1_verbose()
|
||
- sys.stdout.flush()
|
||
+ sys.stdout.flush()
|
||
def print_header2(self):
|
||
if self.verbosity == "brief":
|
||
self.print_header2_brief()
|
||
@@ -107,7 +104,7 @@ class _CollectPrint(object):
|
||
self.print_header2_detail()
|
||
elif self.verbosity == "verbose":
|
||
self.print_header2_verbose()
|
||
- sys.stdout.flush()
|
||
+ sys.stdout.flush()
|
||
def print_header1_brief(self):
|
||
True # pylint: disable-msg=W0104
|
||
def print_header2_brief(self):
|
||
@@ -149,37 +146,38 @@ class _cpuCollectPrint(_CollectPrint):
|
||
def print_header1_brief(self):
|
||
sys.stdout.write('#<--------CPU-------->')
|
||
def print_header1_detail(self):
|
||
- print '# SINGLE CPU STATISTICS'
|
||
+ print('# SINGLE CPU STATISTICS')
|
||
def print_header1_verbose(self):
|
||
- print '# CPU SUMMARY (INTR, CTXSW & PROC /sec)'
|
||
+ print('# CPU SUMMARY (INTR, CTXSW & PROC /sec)')
|
||
|
||
def print_header2_brief(self):
|
||
sys.stdout.write('#cpu sys inter ctxsw')
|
||
def print_header2_detail(self):
|
||
- print '# Cpu User Nice Sys Wait IRQ Soft Steal Idle'
|
||
+ print('# Cpu User Nice Sys Wait IRQ Soft Steal Idle')
|
||
def print_header2_verbose(self):
|
||
- print '#User Nice Sys Wait IRQ Soft Steal Idle CPUs Intr Ctxsw Proc RunQ Run Avg1 Avg5 Avg15 RunT BlkT'
|
||
+ print('#User Nice Sys Wait IRQ Soft Steal Idle CPUs Intr Ctxsw Proc RunQ Run Avg1 Avg5 Avg15 RunT BlkT')
|
||
|
||
def print_brief(self):
|
||
- print "%4d" % (100 * (self.ss.get_metric_value('kernel.all.cpu.nice') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.user') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.intr') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.sys') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.steal') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.irq.hard') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.irq.soft')) /
|
||
- ss.cpu_total),
|
||
- print "%3d" % (100 * (self.ss.get_metric_value('kernel.all.cpu.intr') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.sys') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.steal') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.irq.hard') +
|
||
- self.ss.get_metric_value('kernel.all.cpu.irq.soft')) /
|
||
- ss.cpu_total),
|
||
- print "%5d %6d" % (self.ss.get_metric_value('kernel.all.intr'),
|
||
- self.ss.get_metric_value('kernel.all.pswitch')),
|
||
+ sys.stdout.write("%4d %3d %5d %6d" % (
|
||
+ 100 * (self.ss.get_metric_value('kernel.all.cpu.nice') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.user') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.intr') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.sys') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.steal') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.irq.hard') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.irq.soft')) /
|
||
+ ss.cpu_total,
|
||
+ 100 * (self.ss.get_metric_value('kernel.all.cpu.intr') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.sys') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.steal') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.irq.hard') +
|
||
+ self.ss.get_metric_value('kernel.all.cpu.irq.soft')) /
|
||
+ ss.cpu_total,
|
||
+ self.ss.get_metric_value('kernel.all.intr'),
|
||
+ self.ss.get_metric_value('kernel.all.pswitch')))
|
||
def print_detail(self):
|
||
for k in range(self.ss.get_len(self.ss.get_metric_value('kernel.percpu.cpu.user'))):
|
||
- print " %3d %4d %4d %3d %4d %3d %4d %5d %4d" % (
|
||
+ print(" %3d %4d %4d %3d %4d %3d %4d %5d %4d" % (
|
||
k,
|
||
(100 * (self.ss.get_scalar_value('kernel.percpu.cpu.nice', k) +
|
||
self.ss.get_scalar_value('kernel.percpu.cpu.user', k) +
|
||
@@ -200,10 +198,10 @@ class _cpuCollectPrint(_CollectPrint):
|
||
self.ss.get_scalar_value('kernel.percpu.cpu.irq.hard', k),
|
||
self.ss.get_scalar_value('kernel.percpu.cpu.irq.soft', k),
|
||
self.ss.get_scalar_value('kernel.percpu.cpu.steal', k),
|
||
- self.ss.get_scalar_value('kernel.percpu.cpu.idle', k) / 10)
|
||
+ self.ss.get_scalar_value('kernel.percpu.cpu.idle', k) / 10))
|
||
def print_verbose(self):
|
||
ncpu = self.ss.get_metric_value('hinv.ncpu')
|
||
- print "%4d %6d %5d %4d %4d %5d " % (
|
||
+ print("%4d %6d %5d %4d %4d %5d %6d %6d %5d %5d %6d %5d %5d %5d %5.2f %5.2f %5.2f %4d %4d" % (
|
||
(100 * (self.ss.get_metric_value('kernel.all.cpu.nice') +
|
||
self.ss.get_metric_value('kernel.all.cpu.user') +
|
||
self.ss.get_metric_value('kernel.all.cpu.intr') +
|
||
@@ -221,16 +219,12 @@ class _cpuCollectPrint(_CollectPrint):
|
||
ss.cpu_total),
|
||
self.ss.get_metric_value('kernel.all.cpu.wait.total'),
|
||
self.ss.get_metric_value('kernel.all.cpu.irq.hard'),
|
||
- self.ss.get_metric_value('kernel.all.cpu.irq.soft')
|
||
- ),
|
||
- print "%6d %6d %5d %5d %6d" % (
|
||
+ self.ss.get_metric_value('kernel.all.cpu.irq.soft'),
|
||
self.ss.get_metric_value('kernel.all.cpu.steal'),
|
||
self.ss.get_metric_value('kernel.all.cpu.idle') / (10 * ncpu),
|
||
ncpu,
|
||
self.ss.get_metric_value('kernel.all.intr'),
|
||
- self.ss.get_metric_value('kernel.all.pswitch')
|
||
- ),
|
||
- print "%5d %5d %5d %5.2f %5.2f %5.2f %4d %4d" % (
|
||
+ self.ss.get_metric_value('kernel.all.pswitch'),
|
||
self.ss.get_metric_value('kernel.all.nprocs'),
|
||
self.ss.get_metric_value('kernel.all.runnable'),
|
||
self.ss.get_metric_value('proc.runq.runnable'),
|
||
@@ -238,7 +232,7 @@ class _cpuCollectPrint(_CollectPrint):
|
||
self.ss.get_metric_value('kernel.all.load')[1],
|
||
self.ss.get_metric_value('kernel.all.load')[2],
|
||
self.ss.get_metric_value('kernel.all.runnable'),
|
||
- self.ss.get_metric_value('proc.runq.blocked'))
|
||
+ self.ss.get_metric_value('proc.runq.blocked')))
|
||
|
||
|
||
# _interruptCollectPrint ---------------------------------------------
|
||
@@ -254,26 +248,26 @@ class _interruptCollectPrint(_CollectPri
|
||
for k in range(ndashes):
|
||
hdr += "-"
|
||
hdr += ">"
|
||
- print hdr,
|
||
+ sys.stdout.write(hdr)
|
||
def print_header1_detail(self):
|
||
- print '# INTERRUPT DETAILS'
|
||
- print '# Int ',
|
||
+ print('# INTERRUPT DETAILS')
|
||
+ sys.stdout.write('# Int ')
|
||
for k in range(self.ss.get_len(self.ss.get_metric_value('kernel.percpu.interrupts.THR'))):
|
||
- print 'Cpu%d ' % k,
|
||
- print 'Type Device(s)'
|
||
+ sys.stdout.write('Cpu%d ' % k)
|
||
+ print('Type Device(s)')
|
||
def print_header1_verbose(self):
|
||
- print '# INTERRUPT SUMMARY'
|
||
+ print('# INTERRUPT SUMMARY')
|
||
def print_header2_brief(self):
|
||
for k in range(self.ss.get_len(self.ss.get_metric_value('kernel.percpu.interrupts.THR'))):
|
||
if k == 0:
|
||
- print '#Cpu%d ' % k,
|
||
+ sys.stdout.write('#Cpu%d ' % k)
|
||
else:
|
||
- print 'Cpu%d ' % k,
|
||
+ sys.stdout.write('Cpu%d ' % k)
|
||
def print_header2_verbose(self):
|
||
- print '# ',
|
||
+ sys.stdout.write('# ')
|
||
for k in range(self.ss.get_len(self.ss.get_metric_value('kernel.percpu.interrupts.THR'))):
|
||
- print 'Cpu%d ' % k,
|
||
- print
|
||
+ sys.stdout.write('Cpu%d ' % k)
|
||
+ print('')
|
||
def print_brief(self):
|
||
int_count = []
|
||
for k in range(self.ss.get_len(self.ss.get_metric_value('kernel.percpu.interrupts.THR'))):
|
||
@@ -283,7 +277,7 @@ class _interruptCollectPrint(_CollectPri
|
||
int_count[k] += self.ss.get_scalar_value(self.ss.metrics_dict[j], k)
|
||
|
||
for k in range(self.ss.get_len(self.ss.get_metric_value('kernel.percpu.interrupts.THR'))):
|
||
- print "%4d " % (int_count[k]),
|
||
+ sys.stdout.write("%4d " % (int_count[k]))
|
||
def print_detail(self):
|
||
for j in ss.metrics:
|
||
if j[0:24] != 'kernel.percpu.interrupts':
|
||
@@ -297,16 +291,16 @@ class _interruptCollectPrint(_CollectPri
|
||
continue
|
||
if have_nonzero_value:
|
||
# pcp does not give the interrupt # so print spaces
|
||
- print "%-8s" % self.ss.metrics[j_i].split(".")[3],
|
||
+ sys.stdout.write("%-8s" % self.ss.metrics[j_i].split(".")[3])
|
||
for i in range(self.ss.get_len(self.ss.get_metric_value('kernel.percpu.interrupts.THR'))):
|
||
- print "%4d " % (self.ss.get_scalar_value(j_i, i)),
|
||
+ sys.stdout.write("%4d " % (self.ss.get_scalar_value(j_i, i)))
|
||
text = (pm.pmLookupText(self.ss.metric_pmids[j_i], c_api.PM_TEXT_ONELINE))
|
||
- print "%-18s %s" % (text[:(str.index(text, " "))],
|
||
- text[(str.index(text, " ")):])
|
||
+ print("%-18s %s" % (text[:(str.index(text, " "))],
|
||
+ text[(str.index(text, " ")):]))
|
||
def print_verbose(self):
|
||
- print " ",
|
||
+ sys.stdout.write(" ")
|
||
self.print_brief()
|
||
- print
|
||
+ print('')
|
||
|
||
|
||
# _diskCollectPrint --------------------------------------------------
|
||
@@ -316,14 +310,14 @@ class _diskCollectPrint(_CollectPrint):
|
||
def print_header1_brief(self):
|
||
sys.stdout.write('<----------Disks----------->')
|
||
def print_header1_detail(self):
|
||
- print '# DISK STATISTICS (/sec)'
|
||
+ print('# DISK STATISTICS (/sec)')
|
||
def print_header1_verbose(self):
|
||
- print '\n\n# DISK SUMMARY (/sec)'
|
||
+ print('\n\n# DISK SUMMARY (/sec)')
|
||
def print_header2_brief(self):
|
||
sys.stdout.write(' KBRead Reads KBWrit Writes')
|
||
def print_header2_detail(self):
|
||
- print '# <---------reads---------><---------writes---------><--------averages--------> Pct'
|
||
- print '#Name KBytes Merged IOs Size KBytes Merged IOs Size RWSize QLen Wait SvcTim Util'
|
||
+ print('# <---------reads---------><---------writes---------><--------averages--------> Pct')
|
||
+ print('#Name KBytes Merged IOs Size KBytes Merged IOs Size RWSize QLen Wait SvcTim Util')
|
||
def print_header2_verbose(self):
|
||
sys.stdout.write('#KBRead RMerged Reads SizeKB KBWrite WMerged Writes SizeKB\n')
|
||
def print_brief(self):
|
||
@@ -333,17 +327,17 @@ class _diskCollectPrint(_CollectPrint):
|
||
self.ss.get_metric_value('disk.all.write_bytes'),
|
||
self.ss.get_metric_value('disk.all.write')))
|
||
def print_detail(self):
|
||
- for j in xrange(len(self.ss.metric_pmids)):
|
||
+ for j in range(len(self.ss.metric_pmids)):
|
||
try:
|
||
- if self.ss.metrics[j] == 'disk.dev.read':
|
||
- (inst, iname) = pm.pmGetInDom(self.ss.metric_descs[j])
|
||
- break
|
||
- except pmapi.pmErr, e:
|
||
+ if self.ss.metrics[j] == 'disk.dev.read':
|
||
+ (inst, iname) = pm.pmGetInDom(self.ss.metric_descs[j])
|
||
+ break
|
||
+ except pmapi.pmErr as e:
|
||
iname = "X"
|
||
|
||
# metric values may be scalars or arrays depending on # of disks
|
||
- for j in xrange(len(iname)):
|
||
- print "%-10s %6d %6d %4d %4d %6d %6d %4d %4d %6d %6d %4d %6d %4d" % (
|
||
+ for j in range(len(iname)):
|
||
+ print("%-10s %6d %6d %4d %4d %6d %6d %4d %4d %6d %6d %4d %6d %4d" % (
|
||
iname[j],
|
||
self.ss.get_scalar_value('disk.dev.read_bytes', j),
|
||
self.ss.get_scalar_value('disk.dev.read_merge', j),
|
||
@@ -353,7 +347,7 @@ class _diskCollectPrint(_CollectPrint):
|
||
self.ss.get_scalar_value('disk.dev.write_merge', j),
|
||
self.ss.get_scalar_value('disk.dev.write', j),
|
||
self.ss.get_scalar_value('disk.dev.blkwrite', j),
|
||
- 0, 0, 0, 0, 0)
|
||
+ 0, 0, 0, 0, 0))
|
||
# ??? replace 0 with required fields
|
||
|
||
def print_verbose(self):
|
||
@@ -365,7 +359,7 @@ class _diskCollectPrint(_CollectPrint):
|
||
avgwrsz = self.ss.get_metric_value('disk.all.write_bytes')
|
||
avgwrsz /= self.ss.get_metric_value('disk.all.write')
|
||
|
||
- print '%6d %6d %6d %6d %7d %8d %6d %6d' % (
|
||
+ print('%6d %6d %6d %6d %7d %8d %6d %6d' % (
|
||
avgrdsz,
|
||
self.ss.get_metric_value('disk.all.read_merge'),
|
||
self.ss.get_metric_value('disk.all.read'),
|
||
@@ -373,7 +367,7 @@ class _diskCollectPrint(_CollectPrint):
|
||
avgwrsz,
|
||
self.ss.get_metric_value('disk.all.write_merge'),
|
||
self.ss.get_metric_value('disk.all.write'),
|
||
- 0)
|
||
+ 0))
|
||
|
||
|
||
# _memoryCollectPrint ------------------------------------------------
|
||
@@ -383,22 +377,22 @@ class _memoryCollectPrint(_CollectPrint)
|
||
def print_header1_brief(self):
|
||
sys.stdout.write('#<-----------Memory----------->')
|
||
def print_header1_verbose(self):
|
||
- print '# MEMORY SUMMARY'
|
||
+ print('# MEMORY SUMMARY')
|
||
def print_header2_brief(self):
|
||
- print '#Free Buff Cach Inac Slab Map'
|
||
+ print('#Free Buff Cach Inac Slab Map')
|
||
def print_header2_verbose(self):
|
||
- print '#<-------------------------------Physical Memory--------------------------------------><-----------Swap------------><-------Paging------>'
|
||
- print '# Total Used Free Buff Cached Slab Mapped Anon Commit Locked Inact Total Used Free In Out Fault MajFt In Out'
|
||
+ print('#<-------------------------------Physical Memory--------------------------------------><-----------Swap------------><-------Paging------>')
|
||
+ print('# Total Used Free Buff Cached Slab Mapped Anon Commit Locked Inact Total Used Free In Out Fault MajFt In Out')
|
||
def print_brief(self):
|
||
- print "%4dM %3dM %3dM %3dM %3dM %3dM " % (
|
||
+ sys.stdout.write("%4dM %3dM %3dM %3dM %3dM %3dM " % (
|
||
scale(self.ss.get_metric_value('mem.freemem'), 1000),
|
||
scale(self.ss.get_metric_value('mem.util.bufmem'), 1000),
|
||
scale(self.ss.get_metric_value('mem.util.cached'), 1000),
|
||
scale(self.ss.get_metric_value('mem.util.inactive'), 1000),
|
||
scale(self.ss.get_metric_value('mem.util.slab'), 1000),
|
||
- scale(self.ss.get_metric_value('mem.util.mapped'), 1000)),
|
||
+ scale(self.ss.get_metric_value('mem.util.mapped'), 1000)))
|
||
def print_verbose(self):
|
||
- print "%8dM %6dM %6dM %6dM %6dM %6dM %6dM %6dM %6dM %6dM %5dM %5dM %5dM %5dM %6d %6d %6d %6d %6d %6d " % (
|
||
+ print("%8dM %6dM %6dM %6dM %6dM %6dM %6dM %6dM %6dM %6dM %5dM %5dM %5dM %5dM %6d %6d %6d %6d %6d %6d " % (
|
||
scale(self.ss.get_metric_value('mem.physmem'), 1000),
|
||
scale(self.ss.get_metric_value('mem.util.used'), 1000),
|
||
scale(self.ss.get_metric_value('mem.freemem'), 1000),
|
||
@@ -419,7 +413,7 @@ class _memoryCollectPrint(_CollectPrint)
|
||
self.ss.get_metric_value('mem.vmstat.pgmajfault'), 1000),
|
||
scale(self.ss.get_metric_value('mem.vmstat.pgmajfault'), 1000),
|
||
scale(self.ss.get_metric_value('mem.vmstat.pgpgin'), 1000),
|
||
- scale(self.ss.get_metric_value('mem.vmstat.pgpgout'), 1000))
|
||
+ scale(self.ss.get_metric_value('mem.vmstat.pgpgout'), 1000)))
|
||
|
||
|
||
# _netCollectPrint --------------------------------------------------
|
||
@@ -429,21 +423,21 @@ class _netCollectPrint(_CollectPrint):
|
||
def print_header1_brief(self):
|
||
sys.stdout.write('<----------Network---------->')
|
||
def print_header1_detail(self):
|
||
- print '# NETWORK STATISTICS (/sec)'
|
||
+ print('# NETWORK STATISTICS (/sec)')
|
||
def print_header1_verbose(self):
|
||
- print '\n\n# NETWORK SUMMARY (/sec)'
|
||
+ print('\n\n# NETWORK SUMMARY (/sec)')
|
||
def print_header2_brief(self):
|
||
sys.stdout.write(' KBIn PktIn KBOut PktOut')
|
||
def print_header2_detail(self):
|
||
- print '#Num Name KBIn PktIn SizeIn MultI CmpI ErrsI KBOut PktOut SizeO CmpO ErrsO'
|
||
+ print('#Num Name KBIn PktIn SizeIn MultI CmpI ErrsI KBOut PktOut SizeO CmpO ErrsO')
|
||
def print_header2_verbose(self):
|
||
- print '# KBIn PktIn SizeIn MultI CmpI ErrsI KBOut PktOut SizeO CmpO ErrsO'
|
||
+ print('# KBIn PktIn SizeIn MultI CmpI ErrsI KBOut PktOut SizeO CmpO ErrsO')
|
||
def print_brief(self):
|
||
- print "%5d %6d %6d %6d" % (
|
||
+ sys.stdout.write("%5d %6d %6d %6d" % (
|
||
sum(self.ss.get_metric_value('network.interface.in.bytes')) / 1024,
|
||
sum(self.ss.get_metric_value('network.interface.in.packets')),
|
||
sum(self.ss.get_metric_value('network.interface.out.bytes')) / 1024,
|
||
- sum(self.ss.get_metric_value('network.interface.out.packets'))),
|
||
+ sum(self.ss.get_metric_value('network.interface.out.packets'))))
|
||
def average_packet_size(self, bytes, packets):
|
||
# calculate mean packet size safely (note that divisor may be zero)
|
||
result = 0
|
||
@@ -456,7 +450,7 @@ class _netCollectPrint(_CollectPrint):
|
||
# don't include loopback; TODO: pmDelProfile would be more appropriate
|
||
self.ss.get_metric_value('network.interface.in.bytes')[0] = 0
|
||
self.ss.get_metric_value('network.interface.out.bytes')[0] = 0
|
||
- print '%6d %5d %6d %6d %6d %6d %6d %6d %6d %6d %7d' % (
|
||
+ print('%6d %5d %6d %6d %6d %6d %6d %6d %6d %6d %7d' % (
|
||
sum(self.ss.get_metric_value('network.interface.in.bytes')) / 1024,
|
||
sum(self.ss.get_metric_value('network.interface.in.packets')),
|
||
self.average_packet_size('in.bytes', 'in.packets'),
|
||
@@ -467,18 +461,18 @@ class _netCollectPrint(_CollectPrint):
|
||
sum(self.ss.get_metric_value('network.interface.out.packets')),
|
||
self.average_packet_size('out.bytes', 'out.packets'),
|
||
sum(self.ss.get_metric_value('network.interface.total.mcasts')),
|
||
- sum(self.ss.get_metric_value('network.interface.out.errors')))
|
||
+ sum(self.ss.get_metric_value('network.interface.out.errors'))))
|
||
def print_detail(self):
|
||
- for j in xrange(len(self.ss.metric_pmids)):
|
||
+ for j in range(len(self.ss.metric_pmids)):
|
||
try:
|
||
- if self.ss.metrics[j] == 'network.interface.in.bytes':
|
||
- (inst, iname) = pm.pmGetInDom(self.ss.metric_descs[j])
|
||
- break
|
||
- except pmapi.pmErr, e: # pylint: disable-msg=C0103
|
||
+ if self.ss.metrics[j] == 'network.interface.in.bytes':
|
||
+ (inst, iname) = pm.pmGetInDom(self.ss.metric_descs[j])
|
||
+ break
|
||
+ except pmapi.pmErr as e: # pylint: disable-msg=C0103
|
||
iname = "X"
|
||
|
||
- for j in xrange(len(iname)):
|
||
- print '%4d %-7s %6d %5d %6d %6d %6d %6d %6d %6d %6d %6d %7d' % (
|
||
+ for j in range(len(iname)):
|
||
+ print('%4d %-7s %6d %5d %6d %6d %6d %6d %6d %6d %6d %6d %7d' % (
|
||
j, iname[j],
|
||
self.ss.get_metric_value('network.interface.in.bytes')[j] / 1024,
|
||
self.ss.get_metric_value('network.interface.in.packets')[j],
|
||
@@ -493,7 +487,7 @@ class _netCollectPrint(_CollectPrint):
|
||
self.ss.get_metric_value('network.interface.out.packets')[j]) / 1024,
|
||
self.ss.get_metric_value('network.interface.total.mcasts')[j],
|
||
self.ss.get_metric_value(
|
||
- 'network.interface.out.compressed')[j])
|
||
+ 'network.interface.out.compressed')[j]))
|
||
|
||
class _Options(object):
|
||
def __init__(self):
|
||
@@ -532,11 +526,11 @@ class _Options(object):
|
||
|
||
|
||
def override(self, opt):
|
||
- """ Override a few standard PCP options to match free(1) """
|
||
- # pylint: disable=R0201
|
||
- if opt == 's' or opt == 'i' or opt == 'h' or opt == "p":
|
||
- return 1
|
||
- return 0
|
||
+ """ Override a few standard PCP options to match free(1) """
|
||
+ # pylint: disable=R0201
|
||
+ if opt == 's' or opt == 'i' or opt == 'h' or opt == "p":
|
||
+ return 1
|
||
+ return 0
|
||
|
||
def option_callback(self, opt, optarg, index):
|
||
""" Perform setup for an individual command line option """
|
||
@@ -550,13 +544,13 @@ class _Options(object):
|
||
|
||
# pylint: disable=W0613
|
||
if opt == 's':
|
||
- for ssx in xrange(len(optarg)):
|
||
+ for ssx in range(len(optarg)):
|
||
self.subsys_arg = optarg[ssx:ssx+1]
|
||
try:
|
||
subsys.append(s_options[self.subsys_arg][0])
|
||
except KeyError:
|
||
- print sys.argv[0] + \
|
||
- ": Unimplemented subsystem -s" + self.subsys_arg
|
||
+ print(sys.argv[0] + \
|
||
+ ": Unimplemented subsystem -s" + self.subsys_arg)
|
||
sys.exit(1)
|
||
if self.subsys_arg.isupper():
|
||
self.verbosity = s_options[self.subsys_arg][1]
|
||
@@ -651,14 +645,14 @@ if __name__ == '__main__':
|
||
try:
|
||
ss.setup_metrics(pm)
|
||
ss.get_stats(pm)
|
||
- except pmapi.pmErr, e:
|
||
+ except pmapi.pmErr as e:
|
||
if opts.replay_archive:
|
||
import textwrap
|
||
- print "One of the following metrics is required " + \
|
||
+ print("One of the following metrics is required " + \
|
||
"but absent in " + input_file + "\n" + \
|
||
- textwrap.fill(str(ss.metrics))
|
||
+ textwrap.fill(str(ss.metrics)))
|
||
else:
|
||
- print "unable to setup metrics"
|
||
+ print("unable to setup metrics")
|
||
sys.exit(1)
|
||
|
||
for ssx in subsys:
|
||
@@ -670,20 +664,20 @@ if __name__ == '__main__':
|
||
if ssx == 0:
|
||
continue
|
||
ssx.print_header1()
|
||
- print
|
||
+ print('')
|
||
for ssx in subsys:
|
||
if ssx == 0:
|
||
continue
|
||
ssx.print_header2()
|
||
- print
|
||
+ print('')
|
||
|
||
try:
|
||
i_samples = 0
|
||
while (i_samples < opts.n_samples) or (opts.n_samples == 0):
|
||
pm.pmtimevalSleep(delta)
|
||
if opts.verbosity != "brief" and len(subsys) > 1:
|
||
- print "\n### RECORD %d >>> %s <<< %s ###" % \
|
||
- (i_samples+1, host, time.strftime("%a %b %d %H:%M:%S %Y"))
|
||
+ print("\n### RECORD %d >>> %s <<< %s ###" % \
|
||
+ (i_samples+1, host, time.strftime("%a %b %d %H:%M:%S %Y")))
|
||
|
||
try:
|
||
ss.get_stats(pm)
|
||
@@ -698,9 +692,9 @@ if __name__ == '__main__':
|
||
ssx.print_line()
|
||
if opts.verbosity == "brief":
|
||
print
|
||
- except pmapi.pmErr, e:
|
||
+ except pmapi.pmErr as e:
|
||
if str(e).find("PM_ERR_EOL") != -1:
|
||
- print str(e)
|
||
+ print(str(e))
|
||
break
|
||
|
||
i_samples += 1
|
||
diff -Naurp pcp-3.10.2.orig/src/pmdas/dmcache/pmdadmcache.python pcp-3.10.2/src/pmdas/dmcache/pmdadmcache.python
|
||
--- pcp-3.10.2.orig/src/pmdas/dmcache/pmdadmcache.python 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmdas/dmcache/pmdadmcache.python 2015-02-23 21:24:36.665658331 +1100
|
||
@@ -2,7 +2,7 @@
|
||
Performance Metrics Domain Agent exporting Device Mapper Cache metrics.
|
||
'''
|
||
#
|
||
-# Copyright (c) 2014 Red Hat.
|
||
+# Copyright (c) 2014-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -23,6 +23,10 @@ from cpmapi import (PM_SEM_DISCRETE, PM_
|
||
from subprocess import PIPE, Popen
|
||
from os import getenv
|
||
|
||
+import sys
|
||
+if sys.version >= '3':
|
||
+ long = int # python2 to python3 portability (no long() in python3)
|
||
+
|
||
IOMODES = { 'writeback': 1, 'writethrough': 2, 'passthrough': 3 }
|
||
|
||
class DmCacheStats(Structure):
|
||
@@ -65,18 +69,18 @@ class DmCacheStats(Structure):
|
||
|
||
self.size = long(data[2]) - long(data[1])
|
||
self.metadata_block_size = mbsize
|
||
- self.metadata_used = long(data[5]) * mbsize / 1024
|
||
- self.metadata_total = long(data[6]) * mbsize / 1024
|
||
+ self.metadata_used = long(data[5]) * int(mbsize / 1024)
|
||
+ self.metadata_total = long(data[6]) * int(mbsize / 1024)
|
||
self.cache_block_size = cbsize
|
||
- self.cache_used = long(data[8]) * cbsize / 1024
|
||
- self.cache_total = long(data[9]) * cbsize / 1024
|
||
+ self.cache_used = long(data[8]) * int(cbsize / 1024)
|
||
+ self.cache_total = long(data[9]) * int(cbsize / 1024)
|
||
self.read_hits = long(data[10])
|
||
self.read_misses = long(data[11])
|
||
self.write_hits = long(data[12])
|
||
self.write_misses = long(data[13])
|
||
self.demotions = long(data[14])
|
||
self.promotions = long(data[15])
|
||
- self.dirty = long(data[16]) * cbsize / 1024
|
||
+ self.dirty = long(data[16]) * int(cbsize / 1024)
|
||
self.iomode = IOMODES[data[18]]
|
||
|
||
def io_mode(self):
|
||
@@ -206,7 +210,7 @@ class DmCachePMDA(PMDA):
|
||
output, errors = pipe.communicate()
|
||
if errors:
|
||
self.err("refresh: %s error: %s" % (self.dmstatus, errors))
|
||
- for line in output.splitlines():
|
||
+ for line in output.decode().splitlines():
|
||
if 'No devices found' in line:
|
||
continue
|
||
name = line[:line.find(':')] # extract cache name
|
||
diff -Naurp pcp-3.10.2.orig/src/pmdas/gluster/pmdagluster.python pcp-3.10.2/src/pmdas/gluster/pmdagluster.python
|
||
--- pcp-3.10.2.orig/src/pmdas/gluster/pmdagluster.python 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmdas/gluster/pmdagluster.python 2015-02-23 21:24:36.666658330 +1100
|
||
@@ -2,7 +2,7 @@
|
||
Performance Metrics Domain Agent exporting Gluster filesystem metrics.
|
||
'''
|
||
#
|
||
-# Copyright (c) 2013-2014 Red Hat.
|
||
+# Copyright (c) 2013-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -30,6 +30,10 @@ import subprocess
|
||
|
||
import threading
|
||
|
||
+import sys
|
||
+if sys.version >= '3':
|
||
+ long = int # python2 to python3 portability (no long() in python3)
|
||
+
|
||
VOL_INFO_COMMAND = 'gluster --xml volume info'
|
||
VOL_STOP_COMMAND = 'gluster --xml volume profile %s stop'
|
||
VOL_START_COMMAND = 'gluster --xml volume profile %s start'
|
||
@@ -233,8 +237,8 @@ class GlusterPMDA(PMDA):
|
||
return [c_api.PM_ERR_INST, 0]
|
||
cache = cast(voidp, POINTER(GlusterBrick))
|
||
brick = cache.contents
|
||
- fileop = item / 4
|
||
- index = item % 4
|
||
+ fileop = int(item / 4)
|
||
+ index = int(item % 4)
|
||
if (index == 0):
|
||
return [brick.mintime[fileop], 1]
|
||
elif (index == 1):
|
||
diff -Naurp pcp-3.10.2.orig/src/pmdas/simple/pmdasimple.python pcp-3.10.2/src/pmdas/simple/pmdasimple.python
|
||
--- pcp-3.10.2.orig/src/pmdas/simple/pmdasimple.python 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmdas/simple/pmdasimple.python 2015-02-23 21:24:36.666658330 +1100
|
||
@@ -2,7 +2,7 @@
|
||
Python implementation of the "simple" Performance Metrics Domain Agent.
|
||
'''
|
||
#
|
||
-# Copyright (c) 2013 Red Hat.
|
||
+# Copyright (c) 2013,2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -206,7 +206,7 @@ class SimplePMDA(PMDA):
|
||
self.configfile = PCP.pmGetConfig('PCP_PMDAS_DIR')
|
||
self.configfile += '/' + name + '/' + name + '.conf'
|
||
|
||
- self.connect_pmcd();
|
||
+ self.connect_pmcd()
|
||
|
||
self.color_indom = self.indom(0)
|
||
self.add_indom(pmdaIndom(self.color_indom, self.colors))
|
||
diff -Naurp pcp-3.10.2.orig/src/pmdas/unbound/pmdaunbound.python pcp-3.10.2/src/pmdas/unbound/pmdaunbound.python
|
||
--- pcp-3.10.2.orig/src/pmdas/unbound/pmdaunbound.python 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmdas/unbound/pmdaunbound.python 2015-02-23 21:24:36.667658329 +1100
|
||
@@ -20,7 +20,10 @@ from pcp.pmapi import pmUnits
|
||
from pcp.pmda import PMDA, pmdaMetric, pmdaIndom
|
||
from subprocess import Popen, PIPE
|
||
from os import getenv
|
||
-import string, shlex
|
||
+import shlex
|
||
+import sys
|
||
+if sys.version >= '3':
|
||
+ long = int # python2 to python3 portability (no long() in python3)
|
||
|
||
class UnboundPMDA(PMDA):
|
||
'''
|
||
@@ -40,9 +43,9 @@ class UnboundPMDA(PMDA):
|
||
p.wait()
|
||
try:
|
||
stdout, stderr = p.communicate()
|
||
- stdoutlines = string.split(stdout.strip(), '\n')
|
||
- for line in stdoutlines:
|
||
- keyval = string.split(line, '=')
|
||
+ stdoutlines = stdout.decode().strip()
|
||
+ for line in stdoutlines.split('\n'):
|
||
+ keyval = line.split('=')
|
||
if keyval[0].startswith( 'histogram' ):
|
||
# Replace "." with "_" to avoid splitting metric name in multiple sub sections
|
||
keyval[0] = "histogram." + "_".join(str(v) for v in keyval[0].split(".")[1:])
|
||
diff -Naurp pcp-3.10.2.orig/src/pmdas/zswap/pmdazswap.python pcp-3.10.2/src/pmdas/zswap/pmdazswap.python
|
||
--- pcp-3.10.2.orig/src/pmdas/zswap/pmdazswap.python 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmdas/zswap/pmdazswap.python 2015-02-23 21:24:36.667658329 +1100
|
||
@@ -2,7 +2,7 @@
|
||
Performance Metrics Domain Agent exporting Linux compressed swap metrics.
|
||
'''
|
||
#
|
||
-# Copyright (c) 2014 Red Hat.
|
||
+# Copyright (c) 2014-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -20,6 +20,9 @@ from pcp.pmapi import pmUnits
|
||
from pcp.pmda import PMDA, pmdaMetric, pmdaIndom
|
||
from resource import getpagesize
|
||
from os import getenv, listdir
|
||
+import sys
|
||
+if sys.version >= '3':
|
||
+ long = int # python2 to python3 portability (no long() in python3)
|
||
|
||
ZSWAP_PAGESIZE = getpagesize()
|
||
ZSWAP_STATS_PATH = '/sys/kernel/debug/zswap'
|
||
diff -Naurp pcp-3.10.2.orig/src/pmiostat/pmiostat.py pcp-3.10.2/src/pmiostat/pmiostat.py
|
||
--- pcp-3.10.2.orig/src/pmiostat/pmiostat.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/pmiostat/pmiostat.py 2015-02-23 21:24:36.667658329 +1100
|
||
@@ -1,6 +1,6 @@
|
||
#!/usr/bin/python
|
||
#
|
||
-# Copyright (C) 2014 Red Hat.
|
||
+# Copyright (C) 2014-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -19,19 +19,19 @@ import sys
|
||
from pcp import pmapi, pmcc
|
||
from cpmapi import PM_TYPE_U64, PM_CONTEXT_ARCHIVE, PM_SPACE_KBYTE
|
||
|
||
-IOSTAT_SD_METRICS = [ b'disk.dev.read', b'disk.dev.read_bytes',
|
||
- b'disk.dev.write', b'disk.dev.write_bytes',
|
||
- b'disk.dev.read_merge', b'disk.dev.write_merge',
|
||
- b'disk.dev.blkread', b'disk.dev.blkwrite',
|
||
- b'disk.dev.read_rawactive', b'disk.dev.write_rawactive',
|
||
- b'disk.dev.avactive']
|
||
-
|
||
-IOSTAT_DM_METRICS = [ b'disk.dm.read', b'disk.dm.read_bytes',
|
||
- b'disk.dm.write', b'disk.dm.write_bytes',
|
||
- b'disk.dm.read_merge', b'disk.dm.write_merge',
|
||
- b'disk.dm.blkread', b'disk.dm.blkwrite',
|
||
- b'disk.dm.read_rawactive', b'disk.dm.write_rawactive',
|
||
- b'disk.dm.avactive']
|
||
+IOSTAT_SD_METRICS = [ 'disk.dev.read', 'disk.dev.read_bytes',
|
||
+ 'disk.dev.write', 'disk.dev.write_bytes',
|
||
+ 'disk.dev.read_merge', 'disk.dev.write_merge',
|
||
+ 'disk.dev.blkread', 'disk.dev.blkwrite',
|
||
+ 'disk.dev.read_rawactive', 'disk.dev.write_rawactive',
|
||
+ 'disk.dev.avactive']
|
||
+
|
||
+IOSTAT_DM_METRICS = [ 'disk.dm.read', 'disk.dm.read_bytes',
|
||
+ 'disk.dm.write', 'disk.dm.write_bytes',
|
||
+ 'disk.dm.read_merge', 'disk.dm.write_merge',
|
||
+ 'disk.dm.blkread', 'disk.dm.blkwrite',
|
||
+ 'disk.dm.read_rawactive', 'disk.dm.write_rawactive',
|
||
+ 'disk.dm.avactive']
|
||
|
||
class IostatReport(pmcc.MetricGroupPrinter):
|
||
Hcount = 0
|
||
@@ -51,45 +51,45 @@ class IostatReport(pmcc.MetricGroupPrint
|
||
|
||
def report(self, manager):
|
||
if 'dm' in IostatOptions.xflag:
|
||
- subtree = b'disk.dm'
|
||
+ subtree = 'disk.dm'
|
||
else:
|
||
- subtree = b'disk.dev'
|
||
+ subtree = 'disk.dev'
|
||
group = manager["iostat"]
|
||
|
||
- if group[subtree + b'.read_merge'].netPrevValues == None:
|
||
+ if group[subtree + '.read_merge'].netPrevValues == None:
|
||
# need two fetches to report rate converted counter metrics
|
||
return
|
||
|
||
- instlist = self.instlist(group, subtree + b'.read')
|
||
+ instlist = self.instlist(group, subtree + '.read')
|
||
dt = self.timeStampDelta(group)
|
||
timestamp = group.contextCache.pmCtime(int(group.timestamp)).rstrip()
|
||
|
||
- c_rrqm = self.curVals(group, subtree + b'.read_merge')
|
||
- p_rrqm = self.prevVals(group, subtree + b'.read_merge')
|
||
+ c_rrqm = self.curVals(group, subtree + '.read_merge')
|
||
+ p_rrqm = self.prevVals(group, subtree + '.read_merge')
|
||
|
||
- c_wrqm = self.curVals(group, subtree + b'.write_merge')
|
||
- p_wrqm = self.prevVals(group, subtree + b'.write_merge')
|
||
+ c_wrqm = self.curVals(group, subtree + '.write_merge')
|
||
+ p_wrqm = self.prevVals(group, subtree + '.write_merge')
|
||
|
||
- c_r = self.curVals(group, subtree + b'.read')
|
||
- p_r = self.prevVals(group, subtree + b'.read')
|
||
+ c_r = self.curVals(group, subtree + '.read')
|
||
+ p_r = self.prevVals(group, subtree + '.read')
|
||
|
||
- c_w = self.curVals(group, subtree + b'.write')
|
||
- p_w = self.prevVals(group, subtree + b'.write')
|
||
+ c_w = self.curVals(group, subtree + '.write')
|
||
+ p_w = self.prevVals(group, subtree + '.write')
|
||
|
||
- c_rkb = self.curVals(group, subtree + b'.read_bytes')
|
||
- p_rkb = self.prevVals(group, subtree + b'.read_bytes')
|
||
+ c_rkb = self.curVals(group, subtree + '.read_bytes')
|
||
+ p_rkb = self.prevVals(group, subtree + '.read_bytes')
|
||
|
||
- c_wkb = self.curVals(group, subtree + b'.write_bytes')
|
||
- p_wkb = self.prevVals(group, subtree + b'.write_bytes')
|
||
+ c_wkb = self.curVals(group, subtree + '.write_bytes')
|
||
+ p_wkb = self.prevVals(group, subtree + '.write_bytes')
|
||
|
||
- c_ractive = self.curVals(group, subtree + b'.read_rawactive')
|
||
- p_ractive = self.prevVals(group, subtree + b'.read_rawactive')
|
||
+ c_ractive = self.curVals(group, subtree + '.read_rawactive')
|
||
+ p_ractive = self.prevVals(group, subtree + '.read_rawactive')
|
||
|
||
- c_wactive = self.curVals(group, subtree + b'.write_rawactive')
|
||
- p_wactive = self.prevVals(group, subtree + b'.write_rawactive')
|
||
+ c_wactive = self.curVals(group, subtree + '.write_rawactive')
|
||
+ p_wactive = self.prevVals(group, subtree + '.write_rawactive')
|
||
|
||
- c_avactive = self.curVals(group, subtree + b'.avactive')
|
||
- p_avactive = self.prevVals(group, subtree + b'.avactive')
|
||
+ c_avactive = self.curVals(group, subtree + '.avactive')
|
||
+ p_avactive = self.prevVals(group, subtree + '.avactive')
|
||
|
||
# check availability
|
||
if p_rrqm == {} or p_wrqm == {} or p_r == {} or p_w == {} or p_rkb == {} \
|
||
@@ -151,7 +151,7 @@ class IostatReport(pmcc.MetricGroupPrint
|
||
if tot_active:
|
||
util = 100.0 * tot_active / dt
|
||
|
||
- device = inst.decode('utf-8') # prepare name for printing
|
||
+ device = inst # prepare name for printing
|
||
if "t" in IostatOptions.xflag:
|
||
print("%-24s %-12s %7.1f %7.1f %6.1f %6.1f %8.1f %8.1f %8.2f %8.2f %7.1f %7.1f %7.1f %5.1f" \
|
||
% (timestamp, device, rrqm, wrqm, r, w, rkb, wkb, avgrqsz, avgqsz, await, r_await, w_await, util))
|
||
diff -Naurp pcp-3.10.2.orig/src/python/pcp/mmv.py pcp-3.10.2/src/python/pcp/mmv.py
|
||
--- pcp-3.10.2.orig/src/python/pcp/mmv.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/python/pcp/mmv.py 2015-02-23 21:24:36.668658329 +1100
|
||
@@ -1,7 +1,7 @@
|
||
# pylint: disable=C0103
|
||
"""Wrapper module for libpcp_mmv - PCP Memory Mapped Values library
|
||
#
|
||
-# Copyright (C) 2013 Red Hat.
|
||
+# Copyright (C) 2013,2015 Red Hat.
|
||
#
|
||
# This file is part of the "pcp" module, the python interfaces for the
|
||
# Performance Co-Pilot toolkit.
|
||
@@ -85,6 +85,13 @@ class mmv_instance(Structure):
|
||
_fields_ = [("internal", c_int),
|
||
("external", c_char * MMV_NAMEMAX)]
|
||
|
||
+ def __init__(self, inst, name):
|
||
+ Structure.__init__(self)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ self.external = name
|
||
+ self.internal = inst
|
||
+
|
||
class mmv_indom(Structure):
|
||
""" Represents an instance domain (for set valued metrics)
|
||
Instance domains have associated instances - integer/string pairs.
|
||
@@ -96,6 +103,16 @@ class mmv_indom(Structure):
|
||
("shorttext", c_char_p),
|
||
("helptext", c_char_p)]
|
||
|
||
+ def __init__(self, serial, shorttext = '', helptext = ''):
|
||
+ Structure.__init__(self)
|
||
+ if type(helptext) != type(b''):
|
||
+ helptext = helptext.encode('utf-8')
|
||
+ if type(shorttext) != type(b''):
|
||
+ shorttext = shorttext.encode('utf-8')
|
||
+ self.shorttext = shorttext
|
||
+ self.helptext = shorttext
|
||
+ self.serial = serial
|
||
+
|
||
def set_instances(self, instances):
|
||
""" Update the instances and counts fields for this indom """
|
||
self.count = len(instances)
|
||
@@ -118,6 +135,20 @@ class mmv_metric(Structure):
|
||
("shorttext", c_char_p),
|
||
("helptext", c_char_p)]
|
||
|
||
+ def __init__(self, name, item, typeof, semantics, dimension, indom = 0, shorttext = '', helptext = ''):
|
||
+ Structure.__init__(self)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(helptext) != type(b''):
|
||
+ helptext = helptext.encode('utf-8')
|
||
+ if type(shorttext) != type(b''):
|
||
+ shorttext = shorttext.encode('utf-8')
|
||
+ self.shorttext = shorttext
|
||
+ self.helptext = shorttext
|
||
+ self.typeof = typeof
|
||
+ self.indom = indom
|
||
+ self.item = item
|
||
+
|
||
##
|
||
# PCP Memory Mapped Value Services
|
||
|
||
@@ -185,6 +216,8 @@ class MemoryMappedValues(object):
|
||
"""
|
||
|
||
def __init__(self, name, flags = 0, cluster = 42):
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
self._name = name
|
||
self._cluster = cluster # PMID cluster number (domain is MMV)
|
||
self._flags = flags # MMV_FLAGS_* flags
|
||
@@ -263,6 +296,10 @@ class MemoryMappedValues(object):
|
||
a convenience only for situations where performance will not
|
||
be affected by repeated (linear) name/inst lookups.
|
||
"""
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
return LIBPCP_MMV.mmv_lookup_value_desc(self._handle, name, inst)
|
||
|
||
def add(self, mapping, value):
|
||
@@ -279,6 +316,8 @@ class MemoryMappedValues(object):
|
||
|
||
def set_string(self, mapping, value):
|
||
""" Set the string mapped metric to a given value """
|
||
+ if type(value) != type(b''):
|
||
+ value = value.encode('utf-8')
|
||
LIBPCP_MMV.mmv_set_string(self._handle, mapping, value, len(value))
|
||
|
||
def interval_start(self, mapping):
|
||
@@ -294,25 +333,47 @@ class MemoryMappedValues(object):
|
||
|
||
def lookup_add(self, name, inst, value):
|
||
""" Lookup the named metric[instance] and add a value to it """
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
LIBPCP_MMV.mmv_stats_add(self._handle, name, inst, value)
|
||
|
||
def lookup_inc(self, name, inst):
|
||
""" Lookup the named metric[instance] and add one to it """
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
LIBPCP_MMV.mmv_stats_inc(self._handle, name, inst)
|
||
|
||
def lookup_set(self, name, inst, value):
|
||
""" Lookup the named metric[instance] and set its value """
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
LIBPCP_MMV.mmv_stats_set(self._handle, name, inst, value)
|
||
|
||
def lookup_interval_start(self, name, inst):
|
||
""" Lookup the named metric[instance] and start an interval
|
||
The opaque handle returned is passed to interval_end().
|
||
"""
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
return LIBPCP_MMV.mmv_stats_interval_start(self._handle,
|
||
None, name, inst)
|
||
|
||
def lookup_set_string(self, name, inst, s):
|
||
""" Lookup the named metric[instance] and set its string value """
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
+ if type(s) != type(b''):
|
||
+ s = s.encode('utf-8')
|
||
LIBPCP_MMV.mmv_stats_set_strlen(self._handle, name, inst, s, len(s))
|
||
|
||
def lookup_add_fallback(self, name, inst, fall, value):
|
||
@@ -321,6 +382,10 @@ class MemoryMappedValues(object):
|
||
One example use is: add value to bucketN else use a catch-all
|
||
bucket such as "other"
|
||
"""
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
LIBPCP_MMV.mmv_stats_add_fallback(self._handle, name, inst, fall, value)
|
||
|
||
def lookup_inc_fallback(self, name, inst, fallback):
|
||
@@ -328,5 +393,9 @@ class MemoryMappedValues(object):
|
||
If instance is not found, fallback to using a second instance
|
||
One sample use is: inc value of BucketA, else inc a catch-all
|
||
"""
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
LIBPCP_MMV.mmv_stats_inc_fallback(self._handle, name, inst, fallback)
|
||
|
||
diff -Naurp pcp-3.10.2.orig/src/python/pcp/pmapi.py pcp-3.10.2/src/python/pcp/pmapi.py
|
||
--- pcp-3.10.2.orig/src/python/pcp/pmapi.py 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/src/python/pcp/pmapi.py 2015-02-23 21:24:36.669658327 +1100
|
||
@@ -100,18 +100,18 @@ LIBC = CDLL(find_library("c"))
|
||
#
|
||
import sys
|
||
|
||
-if sys.version > '3':
|
||
+if sys.version >= '3':
|
||
integer_types = (int,)
|
||
long = int
|
||
else:
|
||
integer_types = (int, long,)
|
||
|
||
def pyFileToCFile(fileObj):
|
||
- if sys.version > '3':
|
||
+ if sys.version >= '3':
|
||
from os import fdopen
|
||
ctypes.pythonapi.PyObject_AsFileDescriptor.restype = ctypes.c_int
|
||
ctypes.pythonapi.PyObject_AsFileDescriptor.argtypes = [ctypes.py_object]
|
||
- return fdopen(ctypes.pythonapi.PyObject_AsFileDescriptor(pyfile), "r")
|
||
+ return fdopen(ctypes.pythonapi.PyObject_AsFileDescriptor(fileObj), "r", closefd=False)
|
||
else:
|
||
ctypes.pythonapi.PyFile_AsFile.restype = ctypes.c_void_p
|
||
ctypes.pythonapi.PyFile_AsFile.argtypes = [ctypes.py_object]
|
||
@@ -138,8 +138,8 @@ class pmErr(Exception):
|
||
errStr = create_string_buffer(c_api.PM_MAXERRMSGLEN)
|
||
errStr = LIBPCP.pmErrStr_r(self.args[0], errStr, c_api.PM_MAXERRMSGLEN)
|
||
for index in range(1, len(self.args)):
|
||
- errStr += " " + str(self.args[index])
|
||
- return errStr
|
||
+ errStr += b" " + str(self.args[index]).encode('utf-8')
|
||
+ return str(errStr.decode())
|
||
|
||
def progname(self):
|
||
return c_char_p.in_dll(LIBPCP, "pmProgname").value
|
||
@@ -177,6 +177,8 @@ class timeval(Structure):
|
||
""" Construct timeval from a string using pmParseInterval """
|
||
tvp = builder()
|
||
errmsg = c_char_p()
|
||
+ if type(interval) != type(b''):
|
||
+ interval = interval.encode('utf-8')
|
||
status = LIBPCP.pmParseInterval(interval, byref(tvp), byref(errmsg))
|
||
if status < 0:
|
||
raise pmErr(status, errmsg)
|
||
@@ -288,7 +290,8 @@ class pmUnits(Structure):
|
||
|
||
def __str__(self):
|
||
unitstr = ctypes.create_string_buffer(64)
|
||
- return str(LIBPCP.pmUnitsStr_r(self, unitstr, 64))
|
||
+ result = LIBPCP.pmUnitsStr_r(self, unitstr, 64)
|
||
+ return str(result.decode())
|
||
|
||
class pmValueBlock(Structure):
|
||
"""Value block bitfields for different compilers
|
||
@@ -454,7 +457,7 @@ class pmMetricSpec(Structure):
|
||
("ninst", c_int),
|
||
("inst", POINTER(c_char_p)) ]
|
||
def __str__(self):
|
||
- insts = map(lambda x: str(self.inst[x]), range(self.ninst))
|
||
+ insts = list(map(lambda x: str(self.inst[x]), range(self.ninst)))
|
||
fields = (addressof(self), self.isarch, self.source, insts)
|
||
return "pmMetricSpec@%#lx src=%s metric=%s insts=" % fields
|
||
|
||
@@ -464,6 +467,8 @@ class pmMetricSpec(Structure):
|
||
errmsg = c_char_p()
|
||
if type(source) != type(b''):
|
||
source = source.encode('utf-8')
|
||
+ if type(string) != type(b''):
|
||
+ string = string.encode('utf-8')
|
||
status = LIBPCP.pmParseMetricSpec(string, isarch, source,
|
||
byref(result), byref(errmsg))
|
||
if status < 0:
|
||
@@ -1094,11 +1099,13 @@ class pmContext(object):
|
||
status = LIBPCP.pmUseContext(self.ctx)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
status = LIBPCP.pmGetChildren(name, byref(offspring))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
if status > 0:
|
||
- childL = map(lambda x: str(offspring[x]), range(status))
|
||
+ childL = list(map(lambda x: str(offspring[x]), range(status)))
|
||
LIBC.free(offspring)
|
||
else:
|
||
return None
|
||
@@ -1113,13 +1120,15 @@ class pmContext(object):
|
||
status = LIBPCP.pmUseContext(self.ctx)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
status = LIBPCP.pmGetChildrenStatus(name,
|
||
byref(offspring), byref(childstat))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
if status > 0:
|
||
- childL = map(lambda x: str(offspring[x]), range(status))
|
||
- statL = map(lambda x: int(childstat[x]), range(status))
|
||
+ childL = list(map(lambda x: str(offspring[x]), range(status)))
|
||
+ statL = list(map(lambda x: int(childstat[x]), range(status)))
|
||
LIBC.free(offspring)
|
||
LIBC.free(childstat)
|
||
else:
|
||
@@ -1145,6 +1154,8 @@ class pmContext(object):
|
||
status = LIBPCP.pmUseContext(self.ctx)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
+ if type(filename) != type(b''):
|
||
+ filename = filename.encode('utf-8')
|
||
status = LIBPCP.pmLoadNameSpace(filename)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
@@ -1156,21 +1167,25 @@ class pmContext(object):
|
||
c_uint pmid [] = pmLookupName("MetricName")
|
||
c_uint pmid [] = pmLookupName(("MetricName1", "MetricName2", ...))
|
||
"""
|
||
- if type(nameA) == type(""):
|
||
+ status = LIBPCP.pmUseContext(self.ctx)
|
||
+ if status < 0:
|
||
+ raise pmErr(status)
|
||
+ if type(nameA) == type('') or type(nameA) == type(b''):
|
||
n = 1
|
||
else:
|
||
n = len(nameA)
|
||
names = (c_char_p * n)()
|
||
- if type(nameA) == type(""):
|
||
+ if type(nameA) == type(''):
|
||
+ names[0] = c_char_p(nameA.encode('utf-8'))
|
||
+ elif type(nameA) == type(b''):
|
||
names[0] = c_char_p(nameA)
|
||
else:
|
||
for i in range(len(nameA)):
|
||
- names[i] = c_char_p(nameA[i])
|
||
-
|
||
+ if type(nameA[i]) == type(b''):
|
||
+ names[i] = c_char_p(nameA[i])
|
||
+ else:
|
||
+ names[i] = c_char_p(nameA[i].encode('utf-8'))
|
||
pmidA = (c_uint * n)()
|
||
- status = LIBPCP.pmUseContext(self.ctx)
|
||
- if status < 0:
|
||
- raise pmErr(status)
|
||
LIBPCP.pmLookupName.argtypes = [c_int, (c_char_p * n), POINTER(c_uint)]
|
||
status = LIBPCP.pmLookupName(n, names, pmidA)
|
||
if status < 0:
|
||
@@ -1185,31 +1200,31 @@ class pmContext(object):
|
||
"""PMAPI - Return list of all metric names having this identical PMID
|
||
tuple names = pmNameAll(metric_id)
|
||
"""
|
||
- nameA_p = POINTER(c_char_p)()
|
||
status = LIBPCP.pmUseContext(self.ctx)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
+ nameA_p = POINTER(c_char_p)()
|
||
status = LIBPCP.pmNameAll(pmid, byref(nameA_p))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
- nameL = map(lambda x: str(nameA_p[x]), range(status))
|
||
- LIBC.free( nameA_p )
|
||
+ nameL = list(map(lambda x: str(nameA_p[x].decode()), range(status)))
|
||
+ LIBC.free(nameA_p)
|
||
return nameL
|
||
|
||
def pmNameID(self, pmid):
|
||
"""PMAPI - Return a metric name from a PMID
|
||
name = pmNameID(self.metric_id)
|
||
"""
|
||
- k = c_char_p()
|
||
+ name = c_char_p()
|
||
status = LIBPCP.pmUseContext(self.ctx)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
- status = LIBPCP.pmNameID(pmid, byref(k))
|
||
+ status = LIBPCP.pmNameID(pmid, byref(name))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
- name = k.value
|
||
- LIBC.free( k )
|
||
- return name
|
||
+ result = name.value
|
||
+ LIBC.free(name)
|
||
+ return str(result.decode())
|
||
|
||
def pmTraversePMNS(self, name, callback):
|
||
"""PMAPI - Scan namespace, depth first, run CALLBACK at each node
|
||
@@ -1219,6 +1234,8 @@ class pmContext(object):
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
cb = traverseCB_type(callback)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
status = LIBPCP.pmTraversePMNS(name, cb)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
@@ -1238,6 +1255,10 @@ class pmContext(object):
|
||
"""PMAPI - Register a derived metric name and definition
|
||
pm.pmRegisterDerived("MetricName", "MetricName Expression")
|
||
"""
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(expr) != type(b''):
|
||
+ expr = expr.encode('utf-8')
|
||
status = LIBPCP.pmRegisterDerived(name, expr)
|
||
if status != 0:
|
||
raise pmErr(status)
|
||
@@ -1245,11 +1266,13 @@ class pmContext(object):
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
|
||
- def pmLoadDerivedConfig(self, f):
|
||
+ def pmLoadDerivedConfig(self, fname):
|
||
"""PMAPI - Register derived metric names and definitions from a file
|
||
pm.pmLoadDerivedConfig("FileName")
|
||
"""
|
||
- status = LIBPCP.pmLoadDerivedConfig(f)
|
||
+ if type(fname) != type(b''):
|
||
+ fname = fname.encode('utf-8')
|
||
+ status = LIBPCP.pmLoadDerivedConfig(fname)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
status = LIBPCP.pmReconnectContext(self.ctx)
|
||
@@ -1262,7 +1285,8 @@ class pmContext(object):
|
||
definition cannot be parsed
|
||
pm.pmRegisterDerived()
|
||
"""
|
||
- return str(LIBPCP.pmDerivedErrStr())
|
||
+ result = LIBPCP.pmDerivedErrStr()
|
||
+ return str(result.decode())
|
||
|
||
##
|
||
# PMAPI Metrics Description Services
|
||
@@ -1329,9 +1353,9 @@ class pmContext(object):
|
||
status = LIBPCP.pmLookupInDomText(get_indom(pmdesc), kind, byref(buf))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
- text = str(buf.value)
|
||
+ result = buf.value
|
||
LIBC.free(buf)
|
||
- return text
|
||
+ return str(result.decode())
|
||
|
||
def pmLookupText(self, pmid, kind = c_api.PM_TEXT_ONELINE):
|
||
"""PMAPI - Lookup the description of a metric from its pmID
|
||
@@ -1366,8 +1390,8 @@ class pmContext(object):
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
if status > 0:
|
||
- nameL = map(lambda x: str(nameA_p[x]), range(status))
|
||
- instL = map(lambda x: int(instA_p[x]), range(status))
|
||
+ nameL = list(map(lambda x: str(nameA_p[x].decode()), range(status)))
|
||
+ instL = list(map(lambda x: int(instA_p[x]), range(status)))
|
||
LIBC.free(instA_p)
|
||
LIBC.free(nameA_p)
|
||
else:
|
||
@@ -1383,6 +1407,8 @@ class pmContext(object):
|
||
status = LIBPCP.pmUseContext(self.ctx)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
status = LIBPCP.pmLookupInDom(get_indom(pmdesc), name)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
@@ -1402,9 +1428,9 @@ class pmContext(object):
|
||
status = LIBPCP.pmNameInDom(get_indom(pmdesc), instval, byref(name_p))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
- outName = str(name_p.value)
|
||
+ result = name_p.value
|
||
LIBC.free(name_p)
|
||
- return outName
|
||
+ return str(result.decode())
|
||
|
||
##
|
||
# PMAPI Context Services
|
||
@@ -1537,7 +1563,8 @@ class pmContext(object):
|
||
"""
|
||
buflen = c_api.PM_LOG_MAXHOSTLEN
|
||
buffer = ctypes.create_string_buffer(buflen)
|
||
- return str(LIBPCP.pmGetContextHostName_r(self.ctx, buffer, buflen))
|
||
+ result = LIBPCP.pmGetContextHostName_r(self.ctx, buffer, buflen)
|
||
+ return str(result.decode())
|
||
|
||
##
|
||
# PMAPI Timezone Services
|
||
@@ -1555,6 +1582,8 @@ class pmContext(object):
|
||
@staticmethod
|
||
def pmNewZone(tz):
|
||
"""PMAPI - Create new zone handle and set reporting timezone """
|
||
+ if type(tz) != type(b''):
|
||
+ tz = tz.encode('utf-8')
|
||
status = LIBPCP.pmNewZone(tz)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
@@ -1575,9 +1604,9 @@ class pmContext(object):
|
||
status = LIBPCP.pmWhichZone(byref(tz_p))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
- tz = str(tz_p.value)
|
||
+ tz = tz_p.value
|
||
LIBC.free(tz_p)
|
||
- return tz
|
||
+ return str(tz.decode())
|
||
|
||
def pmLocaltime(self, seconds):
|
||
"""PMAPI - convert the date and time for a reporting timezone """
|
||
@@ -1597,7 +1626,7 @@ class pmContext(object):
|
||
result = ctypes.create_string_buffer(32)
|
||
timetp = c_long(long(seconds))
|
||
LIBPCP.pmCtime(byref(timetp), result)
|
||
- return str(result.value)
|
||
+ return str(result.value.decode())
|
||
|
||
##
|
||
# PMAPI Metrics Services
|
||
@@ -1680,8 +1709,8 @@ class pmContext(object):
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
if status > 0:
|
||
- nameL = map(lambda x: str(nameA_p[x]), range(status))
|
||
- instL = map(lambda x: int(instA_p[x]), range(status))
|
||
+ nameL = list(map(lambda x: str(nameA_p[x].decode()), range(status)))
|
||
+ instL = list(map(lambda x: int(instA_p[x]), range(status)))
|
||
LIBC.free(instA_p)
|
||
LIBC.free(nameA_p)
|
||
else:
|
||
@@ -1697,6 +1726,8 @@ class pmContext(object):
|
||
status = LIBPCP.pmUseContext(self.ctx)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
status = LIBPCP.pmLookupInDomArchive(get_indom(pmdesc), name)
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
@@ -1715,9 +1746,9 @@ class pmContext(object):
|
||
status = LIBPCP.pmNameInDomArchive(indom, inst, byref(name_p))
|
||
if status < 0:
|
||
raise pmErr(status)
|
||
- outName = str(name_p.value)
|
||
+ result = name_p.value
|
||
LIBC.free(name_p)
|
||
- return outName
|
||
+ return str(result.decode())
|
||
|
||
def pmFetchArchive(self):
|
||
"""PMAPI - Fetch measurements from the target source
|
||
@@ -1740,13 +1771,17 @@ class pmContext(object):
|
||
@staticmethod
|
||
def pmGetConfig(variable):
|
||
"""PMAPI - Return value from environment or pcp config file """
|
||
- return str(LIBPCP.pmGetConfig(variable))
|
||
+ if type(variable) != type(b''):
|
||
+ variable = variable.encode('utf-8')
|
||
+ result = LIBPCP.pmGetConfig(variable)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmErrStr(code):
|
||
"""PMAPI - Return value from environment or pcp config file """
|
||
errstr = ctypes.create_string_buffer(c_api.PM_MAXERRMSGLEN)
|
||
- return str(LIBPCP.pmErrStr_r(code, errstr, c_api.PM_MAXERRMSGLEN))
|
||
+ result = LIBPCP.pmErrStr_r(code, errstr, c_api.PM_MAXERRMSGLEN)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmExtractValue(valfmt, vlist, intype, outtype):
|
||
@@ -1799,19 +1834,22 @@ class pmContext(object):
|
||
def pmUnitsStr(units):
|
||
"""PMAPI - Convert units struct to a readable string """
|
||
unitstr = ctypes.create_string_buffer(64)
|
||
- return str(LIBPCP.pmUnitsStr_r(units, unitstr, 64))
|
||
+ result = LIBPCP.pmUnitsStr_r(units, unitstr, 64)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmNumberStr(value):
|
||
"""PMAPI - Convert double value to fixed-width string """
|
||
numstr = ctypes.create_string_buffer(8)
|
||
- return str(LIBPCP.pmNumberStr_r(value, numstr, 8))
|
||
+ result = LIBPCP.pmNumberStr_r(value, numstr, 8)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmIDStr(pmid):
|
||
"""PMAPI - Convert a pmID to a readable string """
|
||
pmidstr = ctypes.create_string_buffer(32)
|
||
- return str(LIBPCP.pmIDStr_r(pmid, pmidstr, 32))
|
||
+ result = LIBPCP.pmIDStr_r(pmid, pmidstr, 32)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmInDomStr(pmdescp):
|
||
@@ -1819,7 +1857,8 @@ class pmContext(object):
|
||
"indom" = pmGetInDom(pmDesc pmdesc)
|
||
"""
|
||
indomstr = ctypes.create_string_buffer(32)
|
||
- return str(LIBPCP.pmInDomStr_r(get_indom(pmdescp), indomstr, 32))
|
||
+ result = LIBPCP.pmInDomStr_r(get_indom(pmdescp), indomstr, 32)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmTypeStr(typed):
|
||
@@ -1827,7 +1866,8 @@ class pmContext(object):
|
||
"type" = pmTypeStr(c_api.PM_TYPE_FLOAT)
|
||
"""
|
||
typestr = ctypes.create_string_buffer(32)
|
||
- return str(LIBPCP.pmTypeStr_r(typed, typestr, 32))
|
||
+ result = LIBPCP.pmTypeStr_r(typed, typestr, 32)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmAtomStr(atom, typed):
|
||
@@ -1835,7 +1875,8 @@ class pmContext(object):
|
||
"value" = pmAtomStr(atom, c_api.PM_TYPE_U32)
|
||
"""
|
||
atomstr = ctypes.create_string_buffer(96)
|
||
- return str(LIBPCP.pmAtomStr(byref(atom), typed, atomstr, 96))
|
||
+ result = LIBPCP.pmAtomStr_r(byref(atom), typed, atomstr, 96)
|
||
+ return str(result.decode())
|
||
|
||
@staticmethod
|
||
def pmPrintValue(fileObj, result, ptype, vset_idx, vlist_idx, min_width):
|
||
@@ -1885,13 +1926,16 @@ class pmContext(object):
|
||
|
||
@staticmethod
|
||
def pmParseUnitsStr(string):
|
||
- assert isinstance(string, basestring)
|
||
+ if type(string) != type('') and type(string) != type(b''):
|
||
+ raise pmErr(c_api.PM_ERR_CONV, str(string))
|
||
+ if type(string) != type(b''):
|
||
+ string = string.encode('utf-8')
|
||
result = pmUnits()
|
||
errmsg = c_char_p()
|
||
multiplier = c_double()
|
||
status = LIBPCP.pmParseUnitsStr(string, byref(result), byref(multiplier), byref(errmsg))
|
||
if status < 0:
|
||
- text = str(errmsg.value)
|
||
+ text = str(errmsg.value.decode())
|
||
LIBC.free(errmsg)
|
||
raise pmErr(status, text)
|
||
return (result, multiplier.value)
|
||
diff -Naurp pcp-3.10.2.orig/src/python/pcp/pmcc.py pcp-3.10.2/src/python/pcp/pmcc.py
|
||
--- pcp-3.10.2.orig/src/python/pcp/pmcc.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/python/pcp/pmcc.py 2015-02-23 21:24:36.670658327 +1100
|
||
@@ -1,8 +1,6 @@
|
||
""" Convenience Classes building on the base PMAPI extension module """
|
||
#
|
||
-# pmcc.py
|
||
-#
|
||
-# Copyright (C) 2013-2014 Red Hat
|
||
+# Copyright (C) 2013-2015 Red Hat
|
||
# Copyright (C) 2009-2012 Michael T. Werner
|
||
#
|
||
# This file is part of the "pcp" module, the python interfaces for the
|
||
@@ -33,11 +31,15 @@ class MetricCore(object):
|
||
PMAPI metrics are unique by name, and MetricCores should be also
|
||
rarely, some PMAPI metrics with different names might have identical PMIDs
|
||
PMAPI metrics are unique by (name) and by (name,pmid) - _usually_ by (pmid)
|
||
- too.
|
||
+ too. Note that names here (and only here) are stored as byte strings for
|
||
+ direct PMAPI access. All dictionaries/caching strategies built using the
|
||
+ core structure use native strings (i.e., not byte strings in python3).
|
||
"""
|
||
|
||
def __init__(self, ctx, name, pmid):
|
||
self.ctx = ctx
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
self.name = name
|
||
self.pmid = pmid
|
||
self.desc = None
|
||
@@ -73,7 +75,7 @@ class Metric(object):
|
||
def _R_ctx(self):
|
||
return self._core.ctx
|
||
def _R_name(self):
|
||
- return self._core.name
|
||
+ return self._core.name.decode()
|
||
def _R_pmid(self):
|
||
return self._core.pmid
|
||
def _R_desc(self):
|
||
@@ -105,7 +107,7 @@ class Metric(object):
|
||
try:
|
||
name = instD[instval.inst]
|
||
except KeyError:
|
||
- name = b''
|
||
+ name = ''
|
||
outAtom = self.ctx.pmExtractValue(
|
||
vset.valfmt, instval, self.desc.type, self._convType)
|
||
if self._convUnits:
|
||
@@ -151,7 +153,7 @@ class Metric(object):
|
||
try:
|
||
name = instD[instval.inst]
|
||
except KeyError:
|
||
- name = b''
|
||
+ name = ''
|
||
outAtom = self.ctx.pmExtractValue(vset.valfmt,
|
||
instval, self.desc.type, PM_TYPE_DOUBLE)
|
||
poutAtom = self.ctx.pmExtractValue(pvset.valfmt,
|
||
@@ -281,7 +283,7 @@ class MetricCache(pmContext):
|
||
instmap = {}
|
||
self._mcIndomD.update({indom: instmap})
|
||
|
||
- self._mcByNameD.update({core.name: core})
|
||
+ self._mcByNameD.update({core.name.decode(): core})
|
||
self._mcByPmidD.update({core.pmid: core})
|
||
|
||
def mcGetCoresByName(self, nameL):
|
||
@@ -291,8 +293,8 @@ class MetricCache(pmContext):
|
||
errL = None
|
||
# lookup names in cache
|
||
for index, name in enumerate(nameL):
|
||
- if type(name) != type(b''):
|
||
- name = name.encode('utf-8')
|
||
+ if type(name) == type(b''):
|
||
+ name = name.decode()
|
||
# lookup metric core in cache
|
||
core = self._mcByNameD.get(name)
|
||
if not core:
|
||
@@ -306,8 +308,6 @@ class MetricCache(pmContext):
|
||
if missD:
|
||
idL, errL = self.mcFetchPmids(missD.keys())
|
||
for name, pmid in idL:
|
||
- if type(name) != type(b''):
|
||
- name = name.encode('utf-8')
|
||
if pmid == PM_ID_NULL:
|
||
# fetch failed for the given metric name
|
||
if not errL:
|
||
@@ -354,7 +354,7 @@ class MetricCache(pmContext):
|
||
print >> stderr, fail
|
||
raise SystemExit(1)
|
||
|
||
- return zip(nameA, pmidArray), errL
|
||
+ return zip(nameL, pmidArray), errL
|
||
|
||
|
||
class MetricGroup(dict):
|
||
@@ -412,6 +412,12 @@ class MetricGroup(dict):
|
||
self._altD = {}
|
||
self.mgAdd(inL)
|
||
|
||
+ def __setitem__(self, attr, value = []):
|
||
+ if attr in self:
|
||
+ raise KeyError("metric group with that key already exists")
|
||
+ else:
|
||
+ dict.__setitem__(self, attr, MetricGroup(self, inL = value))
|
||
+
|
||
##
|
||
# methods
|
||
|
||
diff -Naurp pcp-3.10.2.orig/src/python/pcp/pmda.py pcp-3.10.2/src/python/pcp/pmda.py
|
||
--- pcp-3.10.2.orig/src/python/pcp/pmda.py 2015-01-24 07:23:07.000000000 +1100
|
||
+++ pcp-3.10.2/src/python/pcp/pmda.py 2015-02-23 21:24:36.670658327 +1100
|
||
@@ -1,7 +1,7 @@
|
||
# pylint: disable=C0103
|
||
"""Wrapper module for libpcp_pmda - Performace Co-Pilot Domain Agent API
|
||
#
|
||
-# Copyright (C) 2013-2014 Red Hat.
|
||
+# Copyright (C) 2013-2015 Red Hat.
|
||
#
|
||
# This file is part of the "pcp" module, the python interfaces for the
|
||
# Performance Co-Pilot toolkit.
|
||
@@ -86,7 +86,7 @@ class pmdaInstid(Structure):
|
||
def __init__(self, instid, name):
|
||
Structure.__init__(self)
|
||
self.i_inst = instid
|
||
- self.i_name = name
|
||
+ self.i_name = name.encode('utf-8')
|
||
|
||
def __str__(self):
|
||
return "pmdaInstid@%#lx index=%d name=%s" % (addressof(self), self.i_inst, self.i_name)
|
||
@@ -117,7 +117,8 @@ class pmdaIndom(Structure):
|
||
def set_dict_instances(self, indom, insts):
|
||
LIBPCP_PMDA.pmdaCacheOp(indom, cpmda.PMDA_CACHE_INACTIVE)
|
||
for key in insts.keys():
|
||
- LIBPCP_PMDA.pmdaCacheStore(indom, cpmda.PMDA_CACHE_ADD, key, byref(insts[key]))
|
||
+ key8 = key.encode('utf-8')
|
||
+ LIBPCP_PMDA.pmdaCacheStore(indom, cpmda.PMDA_CACHE_ADD, key8, byref(insts[key]))
|
||
LIBPCP_PMDA.pmdaCacheOp(indom, cpmda.PMDA_CACHE_SAVE)
|
||
|
||
def set_instances(self, indom, insts):
|
||
@@ -271,11 +272,11 @@ class MetricDispatch(object):
|
||
name = (c_char_p)()
|
||
sts = LIBPCP_PMDA.pmdaCacheLookup(indom, instance, byref(name), None)
|
||
if (sts == cpmda.PMDA_CACHE_ACTIVE):
|
||
- return name.value
|
||
+ return str(name.value.decode())
|
||
elif (entry.it_numinst > 0 and entry.it_indom == indom):
|
||
for inst in entry.it_set:
|
||
if (inst.i_inst == instance):
|
||
- return inst.i_name
|
||
+ return str(inst.i_name.decode())
|
||
return None
|
||
|
||
|
||
diff -Naurp pcp-3.10.2.orig/src/python/pcp/pmi.py pcp-3.10.2/src/python/pcp/pmi.py
|
||
--- pcp-3.10.2.orig/src/python/pcp/pmi.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/python/pcp/pmi.py 2015-02-23 21:24:36.671658326 +1100
|
||
@@ -1,7 +1,7 @@
|
||
# pylint: disable=C0103
|
||
"""Wrapper module for libpcp_import - Performace Co-Pilot Log Import API
|
||
#
|
||
-# Copyright (C) 2012-2013 Red Hat.
|
||
+# Copyright (C) 2012-2015 Red Hat.
|
||
#
|
||
# This file is part of the "pcp" module, the python interfaces for the
|
||
# Performance Co-Pilot toolkit.
|
||
@@ -168,6 +168,8 @@ class pmiLogImport(object):
|
||
# overloads
|
||
|
||
def __init__(self, path, inherit = 0):
|
||
+ if type(path) != type(b''):
|
||
+ path = path.encode('utf-8')
|
||
self._path = path # the archive path (file name)
|
||
self._ctx = LIBPCP_IMPORT.pmiStart(c_char_p(path), inherit)
|
||
if self._ctx < 0:
|
||
@@ -187,6 +189,8 @@ class pmiLogImport(object):
|
||
status = LIBPCP_IMPORT.pmiUseContext(self._ctx)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
+ if type(hostname) != type(b''):
|
||
+ hostname = hostname.encode('utf-8')
|
||
status = LIBPCP_IMPORT.pmiSetHostname(c_char_p(hostname))
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
@@ -198,6 +202,8 @@ class pmiLogImport(object):
|
||
status = LIBPCP_IMPORT.pmiUseContext(self._ctx)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
+ if type(timezone) != type(b''):
|
||
+ timezone = timezone.encode('utf-8')
|
||
status = LIBPCP_IMPORT.pmiSetTimezone(c_char_p(timezone))
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
@@ -227,6 +233,8 @@ class pmiLogImport(object):
|
||
status = LIBPCP_IMPORT.pmiUseContext(self._ctx)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
status = LIBPCP_IMPORT.pmiAddMetric(c_char_p(name),
|
||
pmid, typed, indom, sem, units)
|
||
if status < 0:
|
||
@@ -238,6 +246,8 @@ class pmiLogImport(object):
|
||
status = LIBPCP_IMPORT.pmiUseContext(self._ctx)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
+ if type(instance) != type(b''):
|
||
+ instance = instance.encode('utf-8')
|
||
status = LIBPCP_IMPORT.pmiAddInstance(indom, c_char_p(instance), instid)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
@@ -248,6 +258,12 @@ class pmiLogImport(object):
|
||
status = LIBPCP_IMPORT.pmiUseContext(self._ctx)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
+ if type(value) != type(b''):
|
||
+ value = value.encode('utf-8')
|
||
status = LIBPCP_IMPORT.pmiPutValue(c_char_p(name),
|
||
c_char_p(inst), c_char_p(value))
|
||
if status < 0:
|
||
@@ -259,6 +275,10 @@ class pmiLogImport(object):
|
||
status = LIBPCP_IMPORT.pmiUseContext(self._ctx)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
+ if type(name) != type(b''):
|
||
+ name = name.encode('utf-8')
|
||
+ if type(inst) != type(b''):
|
||
+ inst = inst.encode('utf-8')
|
||
status = LIBPCP_IMPORT.pmiGetHandle(c_char_p(name), c_char_p(inst))
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
@@ -269,6 +289,8 @@ class pmiLogImport(object):
|
||
status = LIBPCP_IMPORT.pmiUseContext(self._ctx)
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
+ if type(value) != type(b''):
|
||
+ value = value.encode('utf-8')
|
||
status = LIBPCP_IMPORT.pmiPutValueHandle(handle, c_char_p(value))
|
||
if status < 0:
|
||
raise pmiErr(status)
|
||
diff -Naurp pcp-3.10.2.orig/src/python/pcp/pmsubsys.py pcp-3.10.2/src/python/pcp/pmsubsys.py
|
||
--- pcp-3.10.2.orig/src/python/pcp/pmsubsys.py 2015-01-21 02:18:01.000000000 +1100
|
||
+++ pcp-3.10.2/src/python/pcp/pmsubsys.py 2015-02-23 21:24:36.671658326 +1100
|
||
@@ -1,7 +1,7 @@
|
||
#
|
||
# Performance Co-Pilot subsystem classes
|
||
#
|
||
-# Copyright (C) 2013 Red Hat Inc.
|
||
+# Copyright (C) 2013-2015 Red Hat.
|
||
#
|
||
# This program is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
@@ -31,7 +31,7 @@ http://www.performancecopilot.org
|
||
|
||
import copy
|
||
import cpmapi as c_api
|
||
-from pcp.pmapi import pmErr
|
||
+from pcp.pmapi import pmErr, timeval
|
||
from ctypes import c_char_p
|
||
|
||
# python version information and compatibility
|
||
@@ -48,6 +48,7 @@ else:
|
||
class Subsystem(object):
|
||
def __init__(self):
|
||
self.metrics = []
|
||
+ self._timestamp = timeval(0, 0)
|
||
self.diff_metrics = []
|
||
self.metric_pmids = []
|
||
self.metric_descs = []
|
||
@@ -55,6 +56,11 @@ class Subsystem(object):
|
||
self.metrics_dict = {}
|
||
self.old_metric_values = []
|
||
|
||
+ def _R_timestamp(self):
|
||
+ return self._timestamp
|
||
+
|
||
+ timestamp = property(_R_timestamp, None, None, None)
|
||
+
|
||
def setup_metrics(self, pcp):
|
||
# remove any unsupported metrics
|
||
name_pattern = self.metrics[0].split(".")[0] + ".*"
|
||
@@ -162,6 +168,7 @@ class Subsystem(object):
|
||
list_type = type([])
|
||
|
||
metric_result = pcp.pmFetch(self.metric_pmids)
|
||
+ self._timestamp = metric_result.contents.timestamp
|
||
|
||
if max(self.old_metric_values) == 0:
|
||
first = True
|