ó
    ioøgÿA  ã                   ód  • S r SSKJrJr  SSKJrJr  SSKrSSKJrJ	r	  SSKJ
r
JrJrJrJrJrJr  \R"                  " \R$                  R'                  S5      5      r " S S	\5      r " S
 S\5      r " S S\5      r\\R0                  l        \\
\
\	" \5      \
\	" \5      \
/\R0                  l        S\R6                  l        \\/\R6                  l        \	" \5      \R8                  l        \\\/\R8                  l        S\R:                  l        \\	" \5      \/\R:                  l        S\R<                  l        \\	" \5      \	" \5      /\R<                  l        S\R>                  l        \\	" \5      \/\R>                  l        S\R@                  l        \\	" \5      \	" \5      /\R@                  l        S\RB                  l        \\	" \5      \\
/\RB                  l        S\RD                  l        \\\\/\RD                  l        S\RF                  l        \\\/\RF                  l        S\RH                  l        \\\\/\RH                  l        S\RJ                  l        \\\\\/\RJ                  l        S\RL                  l        \\\\/\RL                  l        \	" \5      \RN                  l        \\	" \5      \\/\RN                  l        S\RP                  l        \\	" \5      /\RP                  l        S\RR                  l        \\\\\/\RR                  l         " S S\*5      r+g)a²
  Wrapper module for libpcp_mmv - PCP Memory Mapped Values library
#
# Copyright (C) 2013-2016,2019 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 instrumenting a python application:

        from pcp import mmv, pmapi
        import cpmapi as pcpapi
        import cmmv as mmvapi

        instances = [
                mmv.mmv_instance(0, "Anvils"),
                mmv.mmv_instance(1, "Rockets"),
                mmv.mmv_instance(2, "Giant_Rubber_Bands")
        ]
        ACME_PRODUCTS_INDOM = 61
        indoms = [
                mmv.mmv_indom(
                    serial = ACME_PRODUCTS_INDOM,
                    shorttext = "Acme products",
                    helptext = "Most popular products produced by the Acme Corporation")
        ]
        indoms[0].set_instances(instances)

        metrics = [
                mmv.mmv_metric(
                    name = "products.count",
                    item = 7,
                    typeof = mmvapi.MMV_TYPE_U64,
                    semantics = mmvapi.MMV_SEM_COUNTER,
                    dimension = pmapi.pmUnits(0,0,1,0,0,pcpapi.PM_COUNT_ONE),
                    indom = ACME_PRODUCTS_INDOM,
                    shorttext = "Acme factory product throughput",
                    helptext =
        "Monotonic increasing counter of products produced in the Acme Corporation
" +
        "factory since starting the Acme production application.  Quality guaranteed."),

                mmv.mmv_metric(
                    name = "products.time",
                    item = 8,
                    typeof = mmvapi.MMV_TYPE_U64,
                    semantics = mmvapi.MMV_SEM_COUNTER,
                    dimension = pmapi.pmUnits(0,1,0,0,pcpapi.PM_TIME_USEC,0),
                    indom = ACME_PRODUCTS_INDOM,
                    shorttext = "Machine time spent producing Acme products")
        ]

        values = mmv.MemoryMappedValues("acme")
        values.add_indoms(indoms)
        values.add_metrics(metrics)

        values.start()
        anvils = values.lookup_mapping("products.count", "Anvils")
        values.set(anvils, 41)
        values.inc(anvils)
        values.stop()
é    )ÚpmUnitsÚpmAtomValue)ÚMMV_NAMEMAXÚMMV_INDOM_NULLN)Ú	StructureÚPOINTER)Úc_intÚc_uintÚc_longÚc_charÚc_char_pÚc_doubleÚc_void_pÚpcp_mmvc                   ó4   • \ rS rSrSrS\4S\\-  4/rS r	Sr
g)Úmmv_instanceé\   zKMaps internal to external instance identifiers, within an
instance domain.
ÚinternalÚexternalc                 ó”   • [         R                  " U 5        [        U[        5      (       d  UR	                  S5      nX l        Xl        g ©Núutf-8)r   Ú__init__Ú
isinstanceÚbytesÚencoder   r   )ÚselfÚinstÚnames      Ú)/usr/lib/python3/dist-packages/pcp/mmv.pyr   Úmmv_instance.__init__c   s5   € Ü×Ò˜4Ô Ü˜$¤×&Ñ&Ø—;‘;˜wÓ'ˆDØŒØ�ó    )r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r	   r   r   Ú_fields_r   Ú__static_attributes__© r"   r    r   r   \   s*   † ñð ˜UÐ#Ø˜V kÑ1Ð2ð4€Hõr"   r   c                   óV   • \ rS rSrSrS\4S\4S\" \5      4S\4S\4/r	SS jr
S	 rS
rg)Ú	mmv_indoméj   z½Represents an instance domain (for set valued metrics)
Instance domains have associated instances - integer/string pairs.
Defines complete indom metadata (instances, count, text and so on)
ÚserialÚcountÚ	instancesÚ	shorttextÚhelptextc                 óø   • [         R                  " U 5        Ub&  [        U[        5      (       d  UR	                  S5      nUb&  [        U[        5      (       d  UR	                  S5      nX l        X0l        Xl        g r   )r   r   r   r   r   r1   r2   r.   )r   r.   r1   r2   s       r    r   Úmmv_indom.__init__u   sa   € Ü×Ò˜4Ô ØÑ¬
°8¼U×(CÑ(CØ—‘ wÓ/ˆHØÑ ¬°I¼u×)EÑ)EØ!×(Ñ(¨Ó1ˆIØ"ŒØ ŒØ�r"   c                 óì   • [        U5      U l        [        U R                  -  " 5       n[        U R                  5       H-  nX   R                  X#   l        X   R
                  X#   l        M/     X l        g)z6Update the instances and counts fields for this indom N)Úlenr/   r   Úranger   r   r0   )r   r0   Úinstance_arrayÚis       r    Úset_instancesÚmmv_indom.set_instances   s^   € ä˜“^ˆŒ
Ü&¨¯©Ò3Ó6ˆÜ�t—z‘zÖ"ˆAØ)2©×)>Ñ)>ˆNÑÔ&Ø)2©×)>Ñ)>ˆNÑÖ&ñ #ð (�r"   )r/   r2   r0   r.   r1   N)Ú r<   )r#   r$   r%   r&   r'   r
   r   r   r   r(   r   r:   r)   r*   r"   r    r,   r,   j   sG   † ñð ˜6Ð"Ø˜&Ð!Ø™g lÓ3Ð4Ø˜hÐ'Ø˜XÐ&ð	(€Hôõ(r"   r,   c            	       ób   • \ rS rSrSrS\\-  4S\4S\4S\4S\4S\	4S	\
4S
\
4/r\SS4S jrSrg)Ú
mmv_metricéˆ   z~Represents an individual metric to be exported by pmdammv
Defines complete metric metadata (type, semantics, units and so on)
r   ÚitemÚtypeofÚ	semanticsÚ	dimensionÚindomr1   r2   r<   c	                 ót  • [         R                  " U 5        [        U[        5      (       d  UR	                  S5      nXl        Ub&  [        U[        5      (       d  UR	                  S5      nX€l        Ub&  [        U[        5      (       d  UR	                  S5      nXpl        X@l        X0l	        X`l
        X l        g r   )r   r   r   r   r   r   r2   r1   rB   rA   rD   r@   )	r   r   r@   rA   rB   rC   rD   r1   r2   s	            r    r   Úmmv_metric.__init__•   s�   € Ü×Ò˜4Ô Ü˜$¤×&Ñ&Ø—;‘;˜wÓ'ˆDØŒ	ØÑ¬
°8¼U×(CÑ(CØ—‘ wÓ/ˆHØ ŒØÑ ¬°I¼u×)EÑ)EØ!×(Ñ(¨Ó1ˆIØ"ŒØ"ŒØŒØŒ
Ø�	r"   )r2   rD   r@   r   rB   r1   rA   N)r#   r$   r%   r&   r'   r   r   r	   r   r
   r   r(   r   r   r)   r*   r"   r    r>   r>   ˆ   sf   † ñð ˜ +Ñ-Ð.Ø˜�Ø˜5Ð!Ø˜eÐ$Ø˜gÐ&Ø˜&Ð!Ø˜hÐ'Ø˜XÐ&ð(€Hð HVÐacÐnp÷ r"   r>   c                   ó¦   • \ rS rSrSrSS jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)ÚMemoryMappedValueséæ   z¦Defines a set of PCP Memory Mapped Value (MMV) metrics

Creates PCP metrics from an instrumented python script
via pmdammv (Performance Metrics Domain Agent for MMV)
c                 óž   • [        U[        5      (       d  UR                  S5      nXl        X0l        X l        / U l        / U l        S U l        g r   )	r   r   r   Ú_nameÚ_clusterÚ_flagsÚ_metricsÚ_indomsÚ_handle)r   r   ÚflagsÚclusters       r    r   ÚMemoryMappedValues.__init__í   sA   € Ü˜$¤×&Ñ&Ø—;‘;˜wÓ'ˆDØŒ
ØŒØŒØˆŒØˆŒØˆ�r"   c           	      ó´  • [        U R                  5      nUS:”  a  [        U-  " 5       OSn[        U5       H  nU R                  U   X#'   M     [        U R                  5      nUS:”  a  [
        U-  " 5       OSn[        U5       H  nU R                  U   XS'   M     [        R                  U R                  U R                  U R                  X!XT5      U l        g)ztInitialise the underlying library with metrics/instances.
On completion of this call, we're all visible to pmdammv.
r   N)r6   rN   r>   r7   rO   r,   Ú
LIBPCP_MMVÚmmv_stats_initrK   rL   rM   rP   )r   Úcount_metricsÚmetricsr9   Úcount_indomsÚindomss         r    ÚstartÚMemoryMappedValues.start÷   sµ   € ô ˜DŸM™MÓ*ˆØ4AÀAÓ4E”: Ò-Ô0È4ˆÜ�}Ö%ˆAØŸ™ qÑ)ˆG‹Jñ &ä˜4Ÿ<™<Ó(ˆØ1=ÀÓ1A”)˜lÒ*Ô-ÀtˆÜ�|Ö$ˆAØŸ™ Q™ˆF‹Iñ %ä!×0Ñ0°·±¸T¿]¹]Ø15·±Ø18Ø17óGˆ�r"   c                 ó€   • U R                   b*  [        R                  U R                  U R                   5        SU l         g)zsShut down the underlying library with metrics/instances.
This closes the mmap file preventing any further updates.
N)rP   rU   Úmmv_stats_stoprK   ©r   s    r    ÚstopÚMemoryMappedValues.stop  s-   € ð �<‰<Ñ#Ü×%Ñ% d§j¡j°$·,±,Ô?Øˆ�r"   c                 óD   • U R                  5         U R                  5         g)z9Cleanly stop-if-running and restart MMV export services. N)r`   r[   r_   s    r    ÚrestartÚMemoryMappedValues.restart  s   € à�	‰	ŒØ�
‰
�r"   c                 ó    • U R                   c  gg)z+Property flagging an active memory mapping r   é   )rP   r_   s    r    ÚstartedÚMemoryMappedValues.started  s   € à�<‰<ÑØØr"   c                 ó\   • Xl         U R                  5       (       a  U R                  5         gg)z:Make a list of instance domains visible to the MMV export N)rO   rg   rc   )r   rZ   s     r    Ú
add_indomsÚMemoryMappedValues.add_indoms  s    € àŒØ�<‰<�>‰>Ø�L‰L�Nð r"   c                 óp   • U R                   R                  U5        U R                  U R                   5        g)z=Make an additional instance domain visible to the MMV export N)rO   Úappendrj   )r   rD   s     r    Ú	add_indomÚMemoryMappedValues.add_indom!  s$   € à�‰×Ñ˜EÔ"Ø�‰˜Ÿ™Õ%r"   c                 ó\   • Xl         U R                  5       (       a  U R                  5         gg)z1Make a list of metrics visible to the MMV export N)rN   rg   rc   )r   rX   s     r    Úadd_metricsÚMemoryMappedValues.add_metrics&  s    € àŒØ�<‰<�>‰>Ø�L‰L�Nð r"   c                 óp   • U R                   R                  U5        U R                  U R                   5        g)z4Make an additional metric visible to the MMV export N)rN   rm   rq   )r   Úmetrics     r    Ú
add_metricÚMemoryMappedValues.add_metric,  s&   € à�‰×Ñ˜VÔ$Ø×Ñ˜Ÿ™Õ'r"   c                 óæ   • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  X5      $ )a£  Find the memory mapping for a given metric name and instance

This handle can be used to directly manipulate metric values
by other interfaces in this module.  This is the *preferred*
technique for manipulating MMV values.  It is more efficient
and the alternative (name/inst lookups) is made available as
a convenience only for situations where performance will not
be affected by repeated (linear) name/inst lookups.
r   )r   r   r   rU   Úmmv_lookup_value_descrP   ©r   r   r   s      r    Úlookup_mappingÚ!MemoryMappedValues.lookup_mapping2  s[   € ð Ñ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDØÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDÜ×/Ñ/°·±¸dÓIÐIr"   c                 óD   • [         R                  U R                  X5        g)z-Increment the mapped metric by a given value N©rU   Úmmv_inc_valuerP   ©r   ÚmappingÚvalues      r    ÚaddÚMemoryMappedValues.addB  ó   € ä× Ñ  §¡¨wÕ>r"   c                 óF   • [         R                  U R                  US5        g)z#Increment the mapped metric by one rf   Nr}   ©r   r€   s     r    ÚincÚMemoryMappedValues.incF  s   € ä× Ñ  §¡¨w¸Õ:r"   c                 óD   • [         R                  U R                  X5        g)z'Set the mapped metric to a given value N)rU   Úmmv_set_valuerP   r   s      r    ÚsetÚMemoryMappedValues.setJ  r„   r"   c                 óª   • Ub&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  X[        U5      5        g)z.Set the string mapped metric to a given value Nr   )r   r   r   rU   Úmmv_set_stringrP   r6   r   s      r    Ú
set_stringÚMemoryMappedValues.set_stringN  s<   € àÑ¤Z°´u×%=Ñ%=Ø—L‘L Ó)ˆEÜ×!Ñ! $§,¡,°ÄÀEÃ
ÕKr"   c                 óF   • [         R                  U R                  USS5      $ )zoStart a timed interval for the mapped metric
The opaque handle (mapping) returned is passed to interval_end().
r   )rU   Úmmv_stats_interval_startrP   r†   s     r    Úinterval_startÚ!MemoryMappedValues.interval_startT  s   € ô ×2Ñ2°4·<±<ÀÈ!ÈQÓOÐOr"   c                 óB   • [         R                  U R                  U5      $ )z@End a timed interval, the metrics time is increased by interval )rU   Úmmv_stats_interval_endrP   r†   s     r    Úinterval_endÚMemoryMappedValues.interval_endZ  s   € ä×0Ñ0°·±¸wÓGÐGr"   c                 óê   • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  XU5        g)z8Lookup the named metric[instance] and add a value to it Nr   )r   r   r   rU   Úmmv_stats_addrP   ©r   r   r   r�   s       r    Ú
lookup_addÚMemoryMappedValues.lookup_add_  óX   € àÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDØÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDÜ× Ñ  §¡¨t¸5ÕAr"   c                 óè   • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  X5        g)z4Lookup the named metric[instance] and add one to it Nr   )r   r   r   rU   Úmmv_stats_incrP   ry   s      r    Ú
lookup_incÚMemoryMappedValues.lookup_incg  sV   € àÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDØÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDÜ× Ñ  §¡¨tÕ:r"   c                 óê   • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  XU5        g)z4Lookup the named metric[instance] and set its value Nr   )r   r   r   rU   Úmmv_stats_setrP   r›   s       r    Ú
lookup_setÚMemoryMappedValues.lookup_seto  rž   r"   c                 óè   • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  SX5      $ )zpLookup the named metric[instance] and start an interval
The opaque handle returned is passed to interval_end().
Nr   )r   r   r   rU   r’   rP   ry   s      r    Úlookup_interval_startÚ(MemoryMappedValues.lookup_interval_startw  sd   € ð Ñ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDØÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDÜ×2Ñ2°4·<±<Ø37¸óEð 	Er"   c           	      óJ  • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        U[        5      (       d  UR                  S5      n[        R	                  U R
                  XU[        U5      5        g)z;Lookup the named metric[instance] and set its string value Nr   )r   r   r   rU   Úmmv_stats_set_strlenrP   r6   )r   r   r   Úss       r    Úlookup_set_stringÚ$MemoryMappedValues.lookup_set_string‚  sy   € àÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDØÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDÜ˜!œU×#Ñ#Ø—‘˜Ó!ˆAÜ×'Ñ'¨¯©°dÀ!ÄSÈÃVÕLr"   c                 óê   • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  XX45        g)zäLookup the named metric[instance] and set its value if found
If instance is not found, fallback to using a second instance
One example use is: add value to bucketN else use a catch-all
                    bucket such as "other"
Nr   )r   r   r   rU   Úmmv_stats_add_fallbackrP   )r   r   r   Úfallr�   s        r    Úlookup_add_fallbackÚ&MemoryMappedValues.lookup_add_fallbackŒ  sZ   € ð Ñ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDØÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDÜ×)Ñ)¨$¯,©,¸ÀDÕPr"   c                 óê   • Ub&  [        U[        5      (       d  UR                  S5      nUb&  [        U[        5      (       d  UR                  S5      n[        R	                  U R
                  XU5        g)z¿Lookup the named metric[instance] and increment its value if found
If instance is not found, fallback to using a second instance
One sample use is: inc value of BucketA, else inc a catch-all
Nr   )r   r   r   rU   Úmmv_stats_inc_fallbackrP   )r   r   r   Úfallbacks       r    Úlookup_inc_fallbackÚ&MemoryMappedValues.lookup_inc_fallback˜  sZ   € ð
 Ñ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDØÑ¤J¨t´U×$;Ñ$;Ø—;‘;˜wÓ'ˆDÜ×)Ñ)¨$¯,©,¸ÀHÕMr"   )rL   rM   rP   rO   rN   rK   N)r   é*   )r#   r$   r%   r&   r'   r   r[   r`   rc   rg   rj   rn   rq   ru   rz   r‚   r‡   r‹   r�   r“   r—   rœ   r¡   r¥   r¨   r­   r²   r·   r)   r*   r"   r    rH   rH   æ   s…   † ñôòGò"òò
òò&ò
ò(òJò ?ò;ò?òLòPòHò
Bò;òBò	EòMò
Qõ	Nr"   rH   ),r'   Ú	pcp.pmapir   r   Úcmmvr   r   Úctypesr   r   r	   r
   r   r   r   r   r   ÚCDLLÚutilÚfind_libraryrU   r   r,   r>   rV   ÚrestypeÚargtypesr^   rx   r~   Úmmv_inc_atomvaluerŠ   Úmmv_set_atomvaluerŽ   rš   r    r¤   r°   rµ   r’   r–   r«   ÚobjectrH   r*   r"   r    Ú<module>rÅ      s  ðñE÷N +ß ,ã ß %ß N× NÑ Nð �[Š[˜Ÿ™×1Ñ1°)Ó<Ó=€
ô�9ô ô(�	ô (ô<�ô ð@ %-€
× Ñ Ô !àˆe�UÙˆJÓ˜¡¨	Ó 2°Eð&;€
× Ñ Ô "ð %)€
× Ñ Ô !Ø&.°Ð%9€
× Ñ Ô "á+2°;Ó+?€
×  Ñ  Ô (Ø-5°xÀÐ,J€
×  Ñ  Ô )à#'€
× Ñ Ô  Ø%-©w°{Ó/CÀXÐ$N€
× Ñ Ô !à'+€
× Ñ Ô $Ø)1±7¸;Ó3GÉÐQ\ÓI]Ð(^€
× Ñ Ô %à#'€
× Ñ Ô  Ø%-©w°{Ó/CÀXÐ$N€
× Ñ Ô !à'+€
× Ñ Ô $Ø)1±7¸;Ó3GÉÐQ\ÓI]Ð(^€
× Ñ Ô %à$(€
× Ñ Ô !à‰g�kÓ" H¨eð&5€
× Ñ Ô "ð $(€
× Ñ Ô  Ø%-¨x¸À8Ð$L€
× Ñ Ô !à#'€
× Ñ Ô  Ø%-¨x¸Ð$B€
× Ñ Ô !à#'€
× Ñ Ô  Ø%-¨x¸À8Ð$L€
× Ñ Ô !à,0€
× !Ñ !Ô )àˆh˜ (¨Hð.6€
× !Ñ !Ô *ð -1€
× !Ñ !Ô )àˆh˜ (ð.,€
× !Ñ !Ô *ñ /6°kÓ.B€
× #Ñ #Ô +à‰g�kÓ" H¨hð08€
× #Ñ #Ô ,ð -1€
× !Ñ !Ô )Ø.6¹ÀÓ8LÐ-M€
× !Ñ !Ô *à*.€
× Ñ Ô 'àˆh˜ (¨Fð,4€
× Ñ Ô (ô{N˜õ {Nr"   