2014-12-01 2 views
-2

Я извлекаю данные из vcenter и печатаю значения для каждого узла exs. Проблема в том, что по какой-то причине я печатаю несколько значений дважды. Мне нужно, чтобы убедиться, что я печатать одни и те же значения только один раз:как вы печатаете значения одни

Вот пример результатов установлено:

name => web01 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-648 summary.quickStats.overallCpuUsage => 3149 summary.quickStats.overallMemoryUsage => 87051 

name => web02 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-658 summary.quickStats.overallCpuUsage => 4909 summary.quickStats.overallMemoryUsage => 144503 

name => web03 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-664 summary.quickStats.overallCpuUsage => 2659 summary.quickStats.overallMemoryUsage => 123063 

name => web04 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-670 summary.quickStats.overallCpuUsage => 1445 summary.quickStats.overallMemoryUsage => 111676 

name => web05 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-856 summary.quickStats.overallCpuUsage => 983 summary.quickStats.overallMemoryUsage => 116179 

name => web05 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-856 summary.quickStats.overallCpuUsage => 983 summary.quickStats.overallMemoryUsage => 116179 

name => web06 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-858 summary.quickStats.overallCpuUsage => 1073 summary.quickStats.overallMemoryUsage => 141572 

name => web06 summary.hardware.cpuMhz => 2194 summary.hardware.memorySize => 274707304448 summary.hardware.numCpuCores => 16 summary.host => host-858 summary.quickStats.overallCpuUsage => 1073 summary.quickStats.overallMemoryUsage => 141572 

Я обновить код, как это:

for item in results: 
     props = dict((p.Name, p.Val) for p in item.PropSet) 
     name = props['name'] 
     tt=int(time.time()) 

     Ballooned_Memory = props.get('summary.quickStats.balloonedMemory') 
     if Ballooned_Memory is not None: 
       Metric="vSphereGuest.ballooned_memory" 
       print Metric,tt,Ballooned_Memory,"vSphereGuest="+name.replace('"', ''),"source=vSphereGuest","dc=dc1" 

     Cpu_Demand = props.get('summary.quickStats.overallCpuDemand') 
     if Cpu_Demand is not None: 
       Metric="vSphereGuest.Cpu_Demand" 
       print Metric,tt,Cpu_Demand,"vSphereGuest="+name.replace('"', ''),"source=vSphereGuest","dc=dc1" 

It проходит через каждый набор результатов и выводит значения. Кажется, остался один вопрос. Если набор результатов включает в себя дубликаты (он исходит из такого источника), я дважды распечатываю тот же набор данных. Как я могу изменить это, так что я печатаю только один, независимо от того, сколько из того же набора результатов поступает из источника?

+4

пожалуйста исправить отступы –

+0

Ваш ключ '' r.name' + p.Name'? –

+0

@ Micheled'Amico, я обновил оригинальный пост. – user1471980

ответ

1

Основываясь на многочисленных комментариях и обновлениях, проблема становится немного яснее. Обновлено еще раз, по-прежнему больше новых данных:

class Seen(set): 
    def seen(self, x): 
     answer = x in self 
     self.add(x) 
     return answer 

previously = Seen() 
for item in results: 
    props = dict((p.Name, p.Val) for p in item.PropSet) 
    name = props['name'] 
    if previously.seen(name): 
     continue 
    Total_Space = props.get('summary.capacity') 
    if Total_Space is not None: 
     Metric="vSphereDatastore.space_total" 
     print Metric,int(time.time()),Total_Space,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1" 
    Free_Space = props.get('summary.freeSpace') 
    if Free_Space is not None: 
     Metric="vSphereDatastore.space_free" 
     print Metric,int(time.time()),Free_Space,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1" 

Проблема с исходным кодом является то, что вы дважды итерация, а не хороший эффект. Это немного облегчает процесс, создав временный словарь со всеми комбинациями ключевых значений, найденными в item.PropSet. Если item.PropSet поддерживает индексирование (item.PropSet['name']) или получение (item.PropSet.get('name')), то создание props является излишним, и вы можете заменить item.PropSet на props. Если нет, держите props. В любом случае у вас теперь есть прямой доступ к каждой паре ключ-значение в наборе свойств.

Реквизит будет выглядеть примерно так (для 'web-03'):

{'config.hardware.memoryMB': '4096', 
'config.hardware.numCPU': '2', 
'name': 'web-03', 
'summary.quickStats.balloonedMemory': '0', 
'summary.quickStats.hostMemoryUsage': '4140', 
'summary.quickStats.overallCpuDemand': '1777', 
'summary.quickStats.overallCpuUsage': '1031', 
'summary.quickStats.staticCpuEntitlement': '1099', 
'summary.quickStats.swappedMemory': '0', 
'summary.runtime.host': 'host-648'} 

У вас еще есть серьезные проблемы, в том ни ключей собственности вы ищете ('summary.capacity' и 'summary.freeSpace') появляются в item.PropSet, основываясь на результатах, о которых вы указали для for p in item.PropSet: print p.Name, "=>", p.Val, print "\n".

Но как только вы это осознаете, есть и другие улучшения, которые вы можете сделать, например. путем абстрагирования некоторых из вашего повторяющегося кода. Например .:

def print_metric(metric, value, datastore, source="vSphereDatastore", dc='dc1'): 
    print metric, int(time.time()), value,"datastore="+datastore,"source="+source,"dc="+dc 

previously = Seen() 
for item in results: 
    props = dict((p.Name, p.Val) for p in item.PropSet) 
    name = props['name'] 
    if previously.seen(name): 
     continue 
    Total_Space = props.get('summary.capacity') 
    if Total_Space is not None: 
     print_metric("vSphereDatastore.space_total", Total_Space, name) 
    Free_Space = props.get('summary.freeSpace') 
    if Free_Space is not None: 
     print_metric("vSphereDatastore.space_free", Free_Space, name) 

Или еще запасной:

def print_metric(metric, value, datastore, source="vSphereDatastore", dc='dc1'): 
    if value is None: 
     return 
    print metric, int(time.time()), value,"datastore="+datastore,"source="+source,"dc="+dc 

previously = Seen() 
for item in results: 
    props = dict((p.Name, p.Val) for p in item.PropSet) 
    name = props['name'] 
    if previously.seen(name): 
     continue 
    print_metric("vSphereDatastore.space_total", props.get('summary.capacity'), name) 
    print_metric("vSphereDatastore.space_free", props.get('summary.freeSpace'), name) 
+0

Эта строка дает недействительный синтаксис: props = {p.Name: p.Val for p в item.PropSet} ^^^ SyntaxError: недействительный синтаксис – user1471980

+0

@Jonathon Eunice, я получаю недействительный синтаксис на этой строке «props = {p. Имя: p.Val для p в item.PropSet} " – user1471980

+0

Это понимание словаря. Какую версию Python вы используете? 2.6 или ранее? Попробуйте 'dict ((p.Name, p.Val) для p в item.PropSet)' в качестве обратной совместимой альтернативы. –

1

Попробуйте использовать set(), чтобы заботиться о том, что вы уже напечатал:

cache = set() 
for item in results: 
    for r in item.PropSet: 
     if r.Name == "name": 
      for p in item.PropSet: 
       try: 
        v = p.Val 
       except AttributeError: 
        #We don't care the property without val attribute 
        continue 
       if not v in cache: 
        cache.add(v) 
        if p.Name=="summary.capacity": 
         Total_Space=v 
         Metric="vSphereDatastore.space_total" 
         print Metric,int(time.time()),v,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1" 

        if p.Name=="summary.freeSpace": 
         Free_Space=v 
         Metric="vSphereDatastore.space_free" 
         print Metric,int(time.time()),v,"datastore="+name,"source="+"vSphereDatastore","dc="+"dc1" 
+0

Где именно находится пользователь?В строке 5 он не будет жаловаться на использование перед назначением? –

+0

@JonathanEunice, но, может быть, это реальное решение .... Я удалю свой ответ, потому что это просто ВА реальная проблема! –

+0

@JonathanEunice Я должен подождать завтра ... Я уже использовал 5 удалений за день :) –

0

Вы, кажется, итерация item.PropSet в вложенной моде, сначала r затем p. Попробуйте вместо этого:

+0

Я не думаю, что это сработает. Мне нужно сделать это для каждого сервера в наборе результатов – user1471980

+0

имя также находится в propset, мне нужно получить имя и результаты печати для каждого имени. name - имя сервера. Вот где это становится немного сложнее. – user1471980

+0

@ user1471980 Я не понимаю ваше возражение. Вы повторяете «item.PropSet» дважды. Это не изменяется во время вашей итерации. Внешняя петля дисфункциональна. Это как часы, которые остановились. Это по-прежнему право дважды в день. –

Смежные вопросы