Решил поиграться с графитом. Цель была- понять, можно ли механизмом активаторов собирать и слать данные во внешнюю систему в больших объемах. Все выродилось в два pyRule:
- 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 октября).
Да, код-ревью устраивать не надо,это черновик.
1 Comment
Unknown User (mikevlz) AUTHOR
В общем, скорость стала приемлимой , когда RedduceRule переписал таким образом: