私はこれに多くの時間を費やしましたが、まだ機能していないようです。タスクは-システム統計をURLに送信する必要があり、スクリプトはそれをプルし、マシンの各CPU統計の名前付きタプルを変換してから、それらすべてを1つのPOSTリクエストでJSONとして送信することです。データが送信されたら、接続を閉じる必要があります。
「1 つの POST リクエスト」機能については、後者の関数 (senddata_to_server) をスクリプトに追加しました。それがなければ(接続の詳細は機能なしで単にそこにリストされています)、Mac / Windows / Linuxで実行すると、すべての名前付きタプルが1つずつ返され、次に「200 OK」が返され、「接続」の出力が続行されました永遠に拒否されました。実行すると、何も返さずにハングアップします。
(私は以前にこの質問をしました ( Python JSON を使用した HTTP Post リクエスト ) が、ループ内に「params」を、ループ外に接続の詳細を含める必要があります。
import psutil
import socket
import time
import sample
import json
import httplib
import urllib
serverHost = sample.host
port = sample.port
thisClient = socket.gethostname()
currentTime = int(time.time())
s = socket.socket()
s.connect((serverHost, port))
cpuStats = psutil.cpu_times_percent(percpu=True)
def loop_thru_cpus():
while True:
global cpuStats
cpuStats = "/n".join([json.dumps(stats._asdict()) for stats in cpuStats])
try:
command = 'put cpu.usr ' + str(currentTime) + " " + str(cpuStats[0]) + "host ="+thisClient+ "/n"
s.sendall(command)
command = 'put cpu.nice ' + str(currentTime) + " " + str(cpuStats[1]) + "host ="+ thisClient+ "/n"
s.sendall(command)
command = 'put cpu.sys ' + str(currentTime) + " " + str(cpuStats[2]) + "host ="+ thisClient+ "/n"
s.sendall(command)
command = 'put cpu.idle ' + str(currentTime) + " " + str(cpuStats[3]) + "host ="+ thisClient+ "/n"
s.sendall(command)
params = urllib.urlencode({'cpuStats': cpuStats, 'deviceKey': 1234, 'timeStamp': str(currentTime)})
return params
print cpuStats
except IndexError:
continue
except socket.error:
print "Connection refused"
continue
finally:
s.close()
def senddata_to_server():
x = loop_thru_cpus()
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
conn = httplib.HTTPConnection(serverHost, port)
conn.request = ("POST", "", x.params, headers)
response = conn.response()
print response.status, response. reason
print x.cpuStats
conn.close()
loop_thru_cpus()
senddata_to_server()