o
    ³Á b³5  ã                   @   s<  d Z ddlmZmZmZmZ ddlmZmZ ddl	Z	ddl	m
Z
mZmZmZmZ e	 e	j d¡¡Zdej_dej_eej_eeegej_eej_eegej_eej_eegej_eej_eeeeeegej_eej_eeegej_eej_eegej_eej_egej_eej_dej_eej_egej_eej_egej_eej _eeeeeegej _eej!_eeegej!_eej"_eeegej"_eej#_eegej#_eej$_eegej$_eej%_eegej%_eej&_eeƒgej&_eej'_dej'_eej(_eeeegej(_eej)_eeeeegej)_G dd„ de*ƒZ+G d	d
„ d
e,ƒZ-dS )aŒ  Wrapper module for libpcp_import - Performace Co-Pilot Log Import API
#
# Copyright (C) 2012-2021 Red Hat.
#
# This file is part of the "pcp" module, the python interfaces for the
# Performance Co-Pilot toolkit.
#
# 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.
#

# Example use of this module for creating a PCP archive:

        import math
        import time
        import pmapi
        from pcp import pmi

        # Create a new archive
        log = pmi.pmiLogImport("loadtest")
        log.pmiSetHostname("www.abc.com")
        log.pmiSetTimezone("EST-10")

        # Add a metric with an instance domain
        domain = 60  # Linux kernel
        pmid = log.pmiID(domain, 2, 0)
        indom = log.pmiInDom(domain, 2)
        units = log.pmiUnits(0, 0, 0, 0, 0, 0)
        log.pmiAddMetric("kernel.all.load", pmid, pmapi.PM_TYPE_FLOAT,
                         indom, pmapi.PM_SEM_INSTANT, units)
        log.pmiAddInstance(indom, "1 minute", 1)
        log.pmiAddInstance(indom, "5 minute", 5)
        log.pmiAddInstance(indom, "15 minute", 15)

        # Create a record with a timestamp
        log.pmiPutValue("kernel.all.load", "1 minute", "%f" % 0.01)
        log.pmiPutValue("kernel.all.load", "5 minute", "%f" % 0.05)
        log.pmiPutValue("kernel.all.load", "15 minute", "%f" % 0.15)
        timetuple = math.modf(time.time())
        useconds = int(timetuple[0] * 1000000)
        seconds = int(timetuple[1])
        log.pmiWrite(seconds, useconds)
        del log
é    )ÚpmIDÚpmInDomÚpmUnitsÚpmResult)ÚpmiErrSymDictÚPMI_MAXERRMSGLENN)ÚcastÚc_intÚc_uintÚc_char_pÚPOINTERÚ
pcp_importc                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚpmiErrz4
    Encapsulation for PMI interface error code
    c                    sD   t t| ƒj|Ž  t|ƒ| _|rt|d tƒr|d | _d S d| _d S )Nr   )Úsuperr   Ú__init__ÚlistÚargsÚ
isinstanceÚintÚcode)Úselfr   ©Ú	__class__© ú)/usr/lib/python3/dist-packages/pcp/pmi.pyr   ‹   s
   

zpmiErr.__init__c                 C   sP   zt | j }t t¡}t | j|t¡}W n ty!   d }}Y nw d||f S )NÚ z%s %s)r   r   ÚctypesÚcreate_string_bufferr   ÚLIBPCP_IMPORTÚpmiErrStr_rÚKeyError)r   Úerror_symbolÚerror_stringr   r   r   Ú__str__“   s   


ÿÿzpmiErr.__str__c                 C   ó   | j S )N)r   ©r   r   r   r   Úerrno   s   zpmiErr.errno)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r&   Ú__classcell__r   r   r   r   r   ‡   s
    
r   c                   @   sò   e Zd ZdZdd„ Zdd„ ZeedddƒZeedddƒZd0dd	„Z	d
d„ Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zed,d-„ ƒZd.d/„ ZdS )1ÚpmiLogImportzqDefines a PCP Log Import archive context
       This is used to create a PCP archive from an external source
    c                 C   r$   )z Property for archive path )Ú_pathr%   r   r   r   Ú	read_path¯   ó   zpmiLogImport.read_pathc                 C   r$   )z! Property for log import context )Ú_ctxr%   r   r   r   Úread_ctx²   r/   zpmiLogImport.read_ctxNr   c                 C   sD   t |tƒs
| d¡}|| _t t|ƒ|¡| _| jdk r t| jƒ‚d S )Núutf-8r   )	r   ÚbytesÚencoder-   r   ÚpmiStartr   r0   r   )r   ÚpathÚinheritr   r   r   r   ¿   s   



ÿzpmiLogImport.__init__c                 C   s"   t rt  | j¡ t  ¡  d| _d S )Néÿÿÿÿ)r   ÚpmiUseContextr0   ÚpmiEndr%   r   r   r   Ú__del__Ç   s   
zpmiLogImport.__del__c                 C   óR   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}t  t|ƒ¡}|dk r't|ƒ‚|S )z8PMI - set the source host name for a Log Import archive r   r2   )	r   r9   r0   r   r   r3   r4   ÚpmiSetHostnamer   )r   ÚhostnameÚstatusr   r   r   r=   Ð   s   

zpmiLogImport.pmiSetHostnamec                 C   r<   )z?PMI - set the source timezone for a Log Import archive
        r   r2   )	r   r9   r0   r   r   r3   r4   ÚpmiSetTimezoner   )r   Útimezoner?   r   r   r   r@   Ü   s   

zpmiLogImport.pmiSetTimezonec                 C   s   t  | ||¡S ©z7PMI - construct a pmID data structure (helper routine) )r   ÚpmiID)ÚdomainÚclusterÚitemr   r   r   rC   é   s   zpmiLogImport.pmiIDc                 C   ó   t  | |¡S rB   )r   Ú
pmiCluster)rD   rE   r   r   r   rH   î   ó   zpmiLogImport.pmiClusterc                 C   rG   )z:PMI - construct a pmInDom data structure (helper routine) )r   ÚpmiInDom)rD   Úserialr   r   r   rJ   ó   rI   zpmiLogImport.pmiInDomc                 C   s   t  | |||||¡S )z;PMI - construct a pmiUnits data structure (helper routine) )r   ÚpmiUnits)Ú	dim_spaceÚdim_timeÚ	dim_countÚscale_spaceÚ
scale_timeÚscale_countr   r   r   rL   ø   s   
ÿzpmiLogImport.pmiUnitsc                 C   s\   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}t  t|ƒ|||||¡}|dk r,t|ƒ‚|S )z:PMI - add a new metric definition to a Log Import context r   r2   )	r   r9   r0   r   r   r3   r4   ÚpmiAddMetricr   )r   ÚnameÚpmidÚtypedÚindomÚsemÚunitsr?   r   r   r   rS      s   



ÿzpmiLogImport.pmiAddMetricc                 C   sV   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}t  |t|ƒ|¡}|dk r)t|ƒ‚|S )z@PMI - add element to an instance domain in a Log Import context r   r2   )	r   r9   r0   r   r   r3   r4   ÚpmiAddInstancer   )r   rW   ÚinstanceÚinstidr?   r   r   r   rZ     s   

zpmiLogImport.pmiAddInstancec                 C   s–   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}d}|dur,t|tƒs(| d¡}t|ƒ}t|tƒs6| d¡}t  t|ƒ|t|ƒ¡}|dk rIt|ƒ‚|S )z-PMI - add a value for a metric-instance pair r   r2   N)	r   r9   r0   r   r   r3   r4   r   ÚpmiPutValue)r   rT   ÚinstÚvaluer?   r[   r   r   r   r]     s$   






ÿzpmiLogImport.pmiPutValuec                 C   s|   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}d}|dur,t|tƒs(| d¡}t|ƒ}t  t|ƒ|¡}|dk r<t|ƒ‚|S )z1PMI - define a handle for a metric-instance pair r   r2   N)	r   r9   r0   r   r   r3   r4   r   ÚpmiGetHandle)r   rT   r^   r?   r[   r   r   r   r`   .  s   



zpmiLogImport.pmiGetHandlec                 C   sT   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}t  |t|ƒ¡}|dk r(t|ƒ‚|S )z:PMI - add a value for a metric-instance pair via a handle r   r2   )	r   r9   r0   r   r   r3   r4   ÚpmiPutValueHandler   )r   Úhandler_   r?   r   r   r   ra   ?  s   

zpmiLogImport.pmiPutValueHandlec                 C   s<   t  | j¡}|dk rt|ƒ‚t  ||¡}|dk rt|ƒ‚|S )z)PMI - flush data to a Log Import archive r   )r   r9   r0   r   ÚpmiWrite)r   ÚsecÚusecr?   r   r   r   rc   K  s   zpmiLogImport.pmiWritec                 C   s8   t  | j¡}|dk rt|ƒ‚t  ¡ }|dk rt|ƒ‚|S )z4PMI - write a <mark> record to a Log Import archive r   )r   r9   r0   r   Ú
pmiPutMark©r   r?   r   r   r   rf   U  s   zpmiLogImport.pmiPutMarkc                 C   sD   t  | j¡}|dk rt|ƒ‚t  t|ttƒƒ¡}|dk r t|ƒ‚|S )z0PMI - add a data record to a Log Import archive r   )r   r9   r0   r   ÚpmiPutResultr   r   r   )r   Úresultr?   r   r   r   Ú
put_result_  s   zpmiLogImport.put_resultc                 C   sX   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}t  |||t|ƒ¡}|dk r*t|ƒ‚|S )z0PMI - add a text record to a Log Import archive r   r2   )	r   r9   r0   r   r   r3   r4   Ú
pmiPutTextr   )r   ÚtypÚclsÚidentÚcontentr?   r   r   r   rk   i  s   

zpmiLogImport.pmiPutTextc                 C   sr   t  | j¡}|dk rt|ƒ‚t|tƒs| d¡}t|tƒs"| d¡}t  |||t|ƒt|ƒ¡}|dk r7t|ƒ‚|S )z1PMI - add a label record to a Log Import archive r   r2   )	r   r9   r0   r   r   r3   r4   ÚpmiPutLabelr   )r   rl   rn   r^   rT   ro   r?   r   r   r   rp   u  s   



zpmiLogImport.pmiPutLabelc                   C   s   t  ¡  dS )z8PMI - dump the current Log Import contexts (diagnostic) N)r   ÚpmiDumpr   r   r   r   rq   „  rI   zpmiLogImport.pmiDumpc                 C   s>   t  | j¡}|dk rt|ƒ‚t  ¡ }d| _|dk rt|ƒ‚|S )z<PMI - close current context and finish a Log Import archive r   r8   )r   r9   r0   r   r:   rg   r   r   r   r:   ‰  s   zpmiLogImport.pmiEnd)r   )r'   r(   r)   r*   r.   r1   Úpropertyr6   Úctxr   r;   r=   r@   ÚstaticmethodrC   rH   rJ   rL   rS   rZ   r]   r`   ra   rc   rf   rj   rk   rp   rq   r:   r   r   r   r   r,   §   s>    
	







r,   ).r*   Ú	pcp.pmapir   r   r   r   Úcpmir   r   r   r   r	   r
   r   r   ÚCDLLÚutilÚfind_libraryr   rq   ÚrestypeÚargtypesrC   rH   rJ   rL   r   r5   r9   r:   r=   r@   rS   rZ   r]   r`   ra   rc   rh   rf   rk   rp   Ú	Exceptionr   Úobjectr,   r   r   r   r   Ú<module>   sj    4þ


ÿ 