summaryrefslogtreecommitdiff
path: root/src/perl/LogImport/LogImport.pm
diff options
context:
space:
mode:
Diffstat (limited to 'src/perl/LogImport/LogImport.pm')
-rw-r--r--src/perl/LogImport/LogImport.pm190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/perl/LogImport/LogImport.pm b/src/perl/LogImport/LogImport.pm
new file mode 100644
index 0000000..92eaba3
--- /dev/null
+++ b/src/perl/LogImport/LogImport.pm
@@ -0,0 +1,190 @@
+package PCP::LogImport;
+
+use strict;
+use warnings;
+
+require Exporter;
+require DynaLoader;
+
+our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+@ISA = qw( Exporter DynaLoader );
+@EXPORT = qw(
+ pmiStart pmiUseContext pmiEnd pmiSetHostname pmiSetTimezone
+ pmiAddMetric pmiAddInstance pmiPutValue pmiGetHandle pmiPutValueHandle
+ pmiWrite
+ pmiDump pmiErrStr pmiUnits pmiID pmiInDom
+ pmid_build pmInDom_build
+ pmiBatchPutValue pmiBatchPutValueHandle pmiBatchWrite pmiBatchEnd
+ PM_ID_NULL PM_INDOM_NULL PM_IN_NULL
+ PM_SPACE_BYTE PM_SPACE_KBYTE PM_SPACE_MBYTE PM_SPACE_GBYTE PM_SPACE_TBYTE
+ PM_TIME_NSEC PM_TIME_USEC PM_TIME_MSEC PM_TIME_SEC PM_TIME_MIN PM_TIME_HOUR
+ PM_COUNT_ONE
+ PM_TYPE_NOSUPPORT PM_TYPE_32 PM_TYPE_U32 PM_TYPE_64 PM_TYPE_U64
+ PM_TYPE_FLOAT PM_TYPE_DOUBLE PM_TYPE_STRING
+ PM_SEM_COUNTER PM_SEM_INSTANT PM_SEM_DISCRETE
+ PMI_DOMAIN
+);
+%EXPORT_TAGS = qw();
+@EXPORT_OK = qw();
+
+# set the version for version checking
+$VERSION = '1.02';
+
+# metric identification
+sub PM_ID_NULL { 0xffffffff; }
+sub PM_INDOM_NULL { 0xffffffff; }
+sub PM_IN_NULL { 0xffffffff; }
+
+# units - space scale
+sub PM_SPACE_BYTE { 0; } # bytes
+sub PM_SPACE_KBYTE { 1; } # kilobytes
+sub PM_SPACE_MBYTE { 2; } # megabytes
+sub PM_SPACE_GBYTE { 3; } # gigabytes
+sub PM_SPACE_TBYTE { 4; } # terabytes
+
+# units - time scale
+sub PM_TIME_NSEC { 0; } # nanoseconds
+sub PM_TIME_USEC { 1; } # microseconds
+sub PM_TIME_MSEC { 2; } # milliseconds
+sub PM_TIME_SEC { 3; } # seconds
+sub PM_TIME_MIN { 4; } # minutes
+sub PM_TIME_HOUR { 5; } # hours
+
+# units - count scale (for metrics such as count events, syscalls,
+# interrupts, etc - these are simply powers of ten and not enumerated here
+# (e.g. 6 for 10^6, or -3 for 10^-3).
+sub PM_COUNT_ONE { 0; } # 1
+
+# data type of metric values
+sub PM_TYPE_NOSUPPORT { 0xffffffff; } # not implemented in this version
+sub PM_TYPE_32 { 0; } # 32-bit signed integer
+sub PM_TYPE_U32 { 1; } # 32-bit unsigned integer
+sub PM_TYPE_64 { 2; } # 64-bit signed integer
+sub PM_TYPE_U64 { 3; } # 64-bit unsigned integer
+sub PM_TYPE_FLOAT { 4; } # 32-bit floating point
+sub PM_TYPE_DOUBLE { 5; } # 64-bit floating point
+sub PM_TYPE_STRING { 6; } # array of characters
+
+# semantics/interpretation of metric values
+sub PM_SEM_COUNTER { 1; } # cumulative counter (monotonic increasing)
+sub PM_SEM_INSTANT { 3; } # instantaneous value, continuous domain
+sub PM_SEM_DISCRETE { 4; } # instantaneous value, discrete domain
+
+# reserved domain (see $PCP_VAR_DIR/pmns/stdpmid)
+sub PMI_DOMAIN { 245; }
+
+# error codes
+sub PMI_ERR_DUPMETRICNAME { -20001; }
+sub PMI_ERR_DUPMETRICID { -20002; } # Metric pmID already defined
+sub PMI_ERR_DUPINSTNAME { -20003; } # External instance name already defined
+sub PMI_ERR_DUPINSTID { -20004; } # Internal instance identifer already defined
+sub PMI_ERR_INSTNOTNULL { -20005; } # Non-null instance expected for a singular metric
+sub PMI_ERR_INSTNULL { -20006; } # Null instance not allowed for a non-singular metric
+sub PMI_ERR_BADHANDLE { -20007; } # Illegal handle
+sub PMI_ERR_DUPVALUE { -20008; } # Value already assigned for singular metric
+sub PMI_ERR_BADTYPE { -20009; } # Illegal metric type
+sub PMI_ERR_BADSEM { -20010; } # Illegal metric semantics
+sub PMI_ERR_NODATA { -20011; } # No data to output
+sub PMI_ERR_BADMETRICNAME { -20012; } # Illegal metric name
+sub PMI_ERR_BADTIMESTAMP { -20013; } # Illegal result timestamp
+
+# Batch operations
+our %pmi_batch = ();
+
+sub pmiBatchPutValue($$$) {
+ my ($name, $instance, $value) = @_;
+ push @{$pmi_batch{'b'}}, [ $name, $instance, $value ];
+ return 0;
+}
+
+sub pmiBatchPutValueHandle($$) {
+ my ($handle, $value) = @_;
+ push @{$pmi_batch{'b'}}, [ $handle, $value ];
+ return 0;
+}
+
+sub pmiBatchWrite($$) {
+ my ($sec, $usec) = @_;
+ push @{$pmi_batch{"$sec.$usec"}}, @{delete $pmi_batch{'b'}};
+ return 0;
+}
+
+sub pmiBatchEnd() {
+ my ($arr, $r);
+ my $ts = -1;
+ # Iterate over the sorted hash and call pmiPutValue/pmiWrite accordingly
+ delete $pmi_batch{'b'};
+ for my $k (map { $_->[0] }
+ sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }
+ map { [$_, /(\d+)\.(\d+)/] }
+ keys %pmi_batch) {
+ $arr = $pmi_batch{$k};
+ $ts = $k if $ts eq -1;
+ if ($k > $ts) {
+ $r = pmiWrite(split(/\./, $ts));
+ return $r if ($r != 0);
+ $ts = $k;
+ }
+ for my $v (@$arr) {
+ if (defined($v->[2])) {
+ $r = pmiPutValue($v->[0], $v->[1], $v->[2]);
+ } else {
+ $r = pmiPutValueHandle($v->[0], $v->[1]);
+ }
+ return $r if ($r != 0);
+ }
+ }
+ $r = pmiWrite(split(/\./, $ts));
+ return $r if ($r != 0);
+ %pmi_batch = ();
+ return 0;
+}
+
+bootstrap PCP::LogImport $VERSION;
+
+1; # don't forget to return a true value from the file
+
+__END__
+
+=head1 NAME
+
+PCP::LogImport - Perl module for importing performance data to create a Performance Co-Pilot archive
+
+=head1 SYNOPSIS
+
+ use PCP::LogImport;
+
+=head1 DESCRIPTION
+
+The PCP::LogImport module contains the language bindings for building
+Perl applications that import performance data from a file or real-time
+source and create a Performance Co-Pilot (PCP) archive suitable for use
+with the PCP tools.
+
+The routines in this module provide wrappers around the libpcp_import
+library.
+
+=head1 SEE ALSO
+
+pmiAddInstance(3), pmiAddMetric(3), pmiEnd(3), pmiErrStr(3),
+pmiGetHandle(3), pmiPutResult(3), pmiPutValue(3), pmiPutValueHandle(3),
+pmiStart(3), pmiSetHostname(3), pmiSetTimezone(3), pmiUnits(3),
+pmiUseContext(3) and pmiWrite(3).
+
+The PCP mailing list pcp@mail.performancecopilot.org can be used for
+questions about this module.
+
+Further details can be found at http://www.performancecopilot.org
+
+=head1 AUTHOR
+
+Ken McDonell, E<lt>kenj@internode.on.netE<gt>
+
+Copyright (C) 2010 by Ken McDonell.
+
+This library is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License, version 2 (see
+the "COPYING" file in the PCP source tree for further details).
+
+=cut