2017-07-06 2 views
1

私は監視データをエクスポートするプログラムを書いています。Pythonはいくつかのリストをエクスポートし、forループをすべて入れます

私はAPIリクエストを送信し、辞書の形でjsonとして応答を取得するPythonコードを持っています。

応答は次のようになります。

[ 
    { 
    "diskwrite": 667719532544, 
    "name": "test-hostname", 
    "maxmem": 536870912, 
    "diskread": 876677015576, 
    "mem": 496111616, 
    "id": "qemu/102", 
    "node": "node1", 
    "template": 0, 
    "cpu": 0.00947819269772254, 
    "vmid": 102, 
    "type": "qemu", 
    "maxcpu": 2, 
    "netout": 15081562546, 
    "maxdisk": 10737418240, 
    **"status": "running",** 
    "netin": 15852619497, 
    "disk": 0, 
    "uptime": 3273086 
    }, 
    { 
    "maxcpu": 8, 
    "type": "qemu", 
    "vmid": 106, 
    "cpu": 0.500598230113925, 
    "template": 0, 
    "node": "node1", 
    "id": "qemu/106", 
    "mem": 10341007360, 
    "maxmem": 10737418240, 
    "diskread": 8586078094720, 
    "name": "some.other-hostname", 
    "diskwrite": 6052378838016, 
    "uptime": 1900411, 
    "disk": 0, 
    "netin": 4899018841106, 
    **"status": "stopping",** 
    "maxdisk": 107374182400, 
    "netout": 4788420573355 
    }, 
    ... 

であるように私は、すべてのホスト名とその項目をループしたいと思います(「diskwrite」、「MEM」、「CPU」など)が、私は思いますステータスが「実行中」(「ステータス」:「実行中」)の場合にのみ、これらのアイテムを辞書に追加すると便利です。

私もこのコード行を行いますし、ホスト=の名前で、この行を作成するすべての「名前」の項目のループ必要
ram_metric.set({'type': "total"}, ram[0]) 
cpu_metric.set({'type': 'average', 'interval': '5 minutes'}, cpu[0]) 

ram_metric = Gauge("memory_usage_bytes", "Memory usage in bytes.", 
         {'host': host}) 
cpu_metric = Gauge("cpu_usage_percent", "CPU usage percent.", 
         {'host': host}) 

してください、私はどのように知りませんがそれを行う。

+0

ファイルはJSON形式ですか? – MishaVacic

+3

私は事を理解していない唯一の人ですか?私はあなたの質問が非常に悪い方法で尋ねられたのを見つけることを申し訳ありません.. –

+0

私は、ご質問、申し訳ありません再公式化! – Petar

答えて

0

私は手伝ってみることができます。

あなたが取得している応答は辞書とリストで、ステータスがそう最初に実行されている場合にのみ興味を持っている:

def get_all_vm(): 
    all_vm = get_request("/api2/json/cluster/resources?type=vm") 
    vm = all_vm['data'] 
    list = [item for item in vm if item['status'] == "running"] 
    return list 
metric = get_all_vm() 

今、あなたはすべての項目をループし、(1)で新しい値を追加することができますitem ["newkey"] = newvalueまたは(2)dictの繰り返しで既存のキーをループする

for item in metric: 
    item["justanexample"] = "test" 
    for key,value in item.items(): 
     if key == "mem": 
      ram_metric.set({'name': metric['data']['name'], 'type': 'usage'}, metric['data']['mem']) 
     elif key == "cpu": 
      cpu_metric.set({'name': metric['data']['name'], 'type': 'load'}, metric['data']['cpu']) 
... 
+0

このコード行にループを追加するには、ホストのために" name "項目' ram_metric = Gauge( "memory_usage_bytes"、 "Memory usage in bytes"、 {'host':host}) ' – Petar

+0

これを私のコードに追加しました。しかし、キー=値が "mem"の場合、キーの値は : メジャーメントの値をアンパックするにはあまりにも多くの値をエラーに出しました(期待値2): ram_metric.set({'name':メトリック['data'] ['mem']) elif key == "cpu": cpu_metric.set({'name(' name ' metric ['data'] ['cpu']) '' ' – Petar

+0

@Petar更新されたコードをもう一度チェックしてください: Python 2.7で.iteritems()を使用する Python 3を使用している場合は、.items() –

1

多分あなたの質問を正しく理解していないかもしれませんが、あなたが望むものをちょっと理解するのが少し難しいかもしれません。

すべてのホスト名のリストを取得する場合は、次の操作を実行できます。 これにリストの理解を使用できます。次のようなもの:

running_hosts = [running_host['name'] for running_host in my_list_of_dicts if running_host['status'] == "running"] 
関連する問題