Skip to end of metadata
Go to start of metadata

Решил поиграться с графитом. Цель была- понять, можно ли механизмом активаторов собирать и слать данные во внешнюю систему в больших объемах. Все выродилось в два pyRule:

  1. IReduceTask, именно он собранные данные шлет наружу - в графит по простому текстовому протоколу. Мне кажется, проблема моей ДНК где-то в этом коде. Именно отсюда растут тормоза.
# -*- coding: utf-8 -*-
##----------------------------------------------------------------------
## ResultReport
##----------------------------------------------------------------------
## INTERFACE: IReduceTask
##----------------------------------------------------------------------
## DESCRIPTION:
## Display reduce task result
##----------------------------------------------------------------------
## Copyright (C) 2007-2010 The NOC Project
## See LICENSE for details
##----------------------------------------------------------------------
import pprint
##
## 
##
@pyrule
def result_report_graphite(task):
    out=""
    import time
    from noc.lib.nbsocket import *
    sf=SocketFactory()
    gp=sf.connect_tcp('graphite.host',2003,ConnectedTCPSocket)
    sf.loop()
    gp.create_socket()
    sf.loop()
    gp.handle_connect()
    sf.loop()
    for mt in task.maptask_set.all():
      if mt.script_result:
        for k,v in mt.script_result:
            t=int(time.time())
            out+="crc.%s.%s %s %s\n"%(mt.managed_object.address, k.split(".")[-1],v,t)
            gp.write("crc.%s.%s %s %s\n"%(mt.managed_object.address, k.split(".")[-1],v,t))
            sf.loop()
  #          for i in xrange(10):
   #          sf.loop()
            #gp.close(True)
#    out+=["<TR><TD>%s</TD><TD>%s</TD><TD><PRE>%s</PRE></TD></TR>"%(mt.managed_object.name,mt.status,pprint.pformat(mt.script_result))\
#        for mt in task.maptask_set.all()]
 #   out+=["</tbody>","</table>"]
    sf.shutdown()
    return out

2. IPeriodicTask - собственно, пируль, который запускает сбор данных. Просто для всех железяк опрашивается ноковским getnext ветка CRCErrors

# -*- coding: utf-8 -*-
from noc.sa.models import *
from noc.inv.models import *
from noc.ip.models import *
from noc.main.models import SystemNotification
import string


@pyrule
def SendCRCtoGraphite(timeout= None):
 #mo=managed object to get counters from
 mo=ManagedObjectSelector.objects.get(name='All-DLINK')
 t=ReduceTask.create_task(mo,"pyrule:result_report_graphite","","get_snmp_getnext",{'oid':'1.3.6.1.2.1.16.1.1.1.8'},900)
 z=t.get_result()
 SystemNotification.notify(name="sa.version_inventory", subject="Managed Object discovered", body="Discovered %s"%z)
 return True

Для одного хоста укладывался секунд в 10 вместе с отправкой всех данных в графит. Для двух тысяч наступает понимание - что-то тут не так... Если будут сочувствующие, умные и вообще неплохие люди - могу поэкспериментировать(до среды или с 5 октября).

Да, код-ревью устраивать не надо,это черновик.

  • No labels

1 Comment

  1. Unknown User (mikevlz) AUTHOR

    В общем, скорость стала приемлимой , когда RedduceRule переписал таким образом:

    # -*- coding: utf-8 -*-
    ##----------------------------------------------------------------------
    ## ResultReport
    ##----------------------------------------------------------------------
    ## INTERFACE: IReduceTask
    ##----------------------------------------------------------------------
    ## DESCRIPTION:
    ## Display reduce task result
    ##----------------------------------------------------------------------
    ## Copyright (C) 2007-2010 The NOC Project
    ## See LICENSE for details
    ##----------------------------------------------------------------------
    import pprint
    ##
    ## Returns a table of: managed object, status, pretty-printed result
    ##
    @pyrule
    def result_report_graphite(task):
        out=""
        import time
        import socket
        gp=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        gp.connect(('10.200.201.134',2003))
        for mt in task.maptask_set.all():
          if mt.script_result and mt.status == "C":
            for k,v in mt.script_result:
                if v>0:
                 out+="crc.%s.%s %s\n"%(mt.managed_object.address, k.split(".")[-1],v)
                t=int(time.time())
                gp.send("crc.%s.%s %s %s\n"%(mt.managed_object.address, k.split(".")[-1],v,t))
        gp.close()
        return out