<p>基于大量的评论和更新,问题变得更加清晰了。再次更新,获取更多新数据:</p>
<pre><code>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"
</code></pre>
<p>原始代码的问题是,您正在进行双重迭代,效果不佳。这将通过创建一个临时字典,其中包含在<code>item.PropSet</code>中找到的所有键值组合,稍微清理这个过程。如果<code>item.PropSet</code>支持索引(<code>item.PropSet['name']</code>)或获取(<code>item.PropSet.get('name')</code>),那么创建<code>props</code>是多余的,可以用<code>item.PropSet</code>代替<code>props</code>。如果没有,请保持<code>props</code>。无论哪种方式,您现在都可以直接访问属性集中的每个键值对。你知道吗</p>
<p>道具看起来像这样(对于<code>'web-03'</code>):</p>
<pre><code>{'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'}
</code></pre>
<p>您仍然有一个严重的问题,根据您为<code>for p in item.PropSet: print p.Name, "=>", p.Val, print "\n"</code>报告的结果,您要查找的属性键(<code>'summary.capacity'</code>和<code>'summary.freeSpace'</code>)中的<em>都没有出现在<code>item.PropSet</code>。你知道吗</p>
<p>但是一旦你发现了这一点,你还可以做其他的改进,例如,通过抽象出一些重复的代码。例如:</p>
<pre><code>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)
</code></pre>
<p>或者更多的备用:</p>
<pre><code>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)
</code></pre>