以下の手順を実行するPythonスクリプトを作成しています。 60秒後に出てREST APIを使用してServiceNowテーブルへPython MongoDBクエリーがデータをチャンクに分割します。
クエリのMongoDBデータベース 解析し、集計結果 アップロードデータ
スクリプトの動作、しかし、データセットが大きすぎる、とRESTのトランザクション時間(接続先はServiceNowサーバーによって閉じられます)。
データをチャンクに分割し、各データチャンクに対して別々のRESTトランザクションを送信して、完全なデータセットがPOSTによって送信され、タイムアウト制限を超えないようにする必要があります。
以下のスクリプトを変更して、この目標を達成するにはどうすればよいですか?
#!/usr/bin/env python
from config import *
import os, sys
mypath = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(mypath, "api-python-client"))
from apiclient.mongo import *
from pymongo import MongoClient
import json
import requests
from bson.json_util import dumps
client = MongoClient(mongo_uri)
#Create ServiceNow URL
svcnow_url = create_svcnow_url('u_imp_cmps')
#BITSDB Nmap Collection
db = client[mongo_db]
#Aggregate - RDBMS equivalent to Alias select x as y
#Rename fields to match ServiceNow field names
computers = db['computer'].aggregate([
{"$unwind": "$hostnames"},
{"$project" : {
"_id":0,
"u_hostname": "$hostnames.name",
"u_ipv4": "$addresses.ipv4",
"u_status": "$status.state",
"u_updated_timestamp": "$last_seen"
}}
])
j = dumps({"records":computers})
#print(j)
#Set proper headers
headers = {"Content-Type":"application/json","Accept":"application/json"}
#Build HTTP Request
response = requests.post(url=svcnow_url, auth=(svcnow_user, svcnow_pwd), headers=headers ,data=j)
#Check for HTTP codes other than 200
if response.status_code != 200:
print('Status:', response.status_code, 'Headers:', response.headers, 'Response Text', response.text, 'Error Response:',response.json())
exit()
#Decode the JSON response into a dictionary and use the data
print('Status:',response.status_code,'Headers:',response.headers,'Response:',response.json())
更新:私は計画がありますが、これを正確に実装する方法がわかりません。
バッチが一杯になると1000の固定されたバッチサイズにカーソルが各- 、JSONの出力を作成し、ループの中で要求
- を介してデータを送信します。新しいバッチをつかみ、送り続けます目的地への各バッチデータセット全体が
https://docs.mongodb.com/v3.0/reference/method/cursor.batchSize/
に到達するまで、基本的に私は、私はバッチとloopInのを作成することによってこの問題を解決することができると思いますg毎回新しいAPI呼び出しを使用してバッチを実行します。これが良い計画であり、解決策を実装する方法があれば、そこにいる誰かが何か考えを持っているかどうか、私に知らせてください。ありがとう。
誰もが、少なくとも上の任意の提案を持っています始めること?私は立ち往生している。ありがとうございました。 – pengz