Splunk模块化输入更新参数

时间:2016-04-29 09:12:19

标签: python splunk

有没有办法用Splunks Python SDK更新模块化输入脚本的输入参数?

def stream_events(self, inputs, ew):
    twitter = OAuth1Session(api_key, api_secret, access_token, access_token_secret)

    for input_name, input_item in inputs.inputs.iteritems():
        hashtag = input_item["hashtag"]
        since_id = input_item["since_id"]

        if since_id == "0":
            url = "https://api.twitter.com/1.1/search/tweets.json?q=%%23%s" % hashtag
        else:
            url = "https://api.twitter.com/1.1/search/tweets.json?since_id=%s&q=%%23%s" % (since_id, hashtag)

        r = twitter.get(url)

        output = json.loads(r.content)
        if len(output["statuses"]) != 0:

            for tweet in output["statuses"]:
                print_xml_stream(input_name, json.dumps(tweet), tweet["created_at"])

我将since_id参数设置为0,然后我第一次调用Twitter API。获得结果后,我想使用Twitter搜索元数据(since_id)中的max_id字段更新output["search_metadata"]["max_id"]参数

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

在这种情况下,使用检查点存储since_id您的最佳选择。这是你的代码应该是粗略的差异。我已经为文件IO部分留下了TODO。对于GitHub提交的JavaScript和& amp;在C#SDK中,我们在检查点文件中每行存储1个提交sha。对于您的情况,您只需要在文件中存储since_id。请注意,输入的每个实例都应该拥有自己的检查点文件(即:每个输入都映射到一个主题标签,因此对于每个要进行索引的主题标签,您应该有1个检查点文件)。

diff --git a/program.py b/program.py
index 95f69de..defb535 100644
--- a/program.py
+++ b/program.py
@@ -1,14 +1,17 @@
 def stream_events(self, inputs, ew):
     twitter = OAuth1Session(api_key, api_secret, access_token, access_token_secret)

+    checkpoint_dir = inputs.metadata['checkpoint_dir']
+
     for input_name, input_item in inputs.inputs.iteritems():
         hashtag = input_item["hashtag"]
         since_id = input_item["since_id"]

-        if since_id == "0":
-            url = "https://api.twitter.com/1.1/search/tweets.json?q=%%23%s" % hashtag
-        else:
-            url = "https://api.twitter.com/1.1/search/tweets.json?since_id=%s&q=%%23%s" % (since_id, hashtag)
+        checkpoint_file_path = os.path.join(checkpoint_dir, hashtag + ".txt")
+
+        since_id = "" # TODO: read from the file
+        
+        url = "https://api.twitter.com/1.1/search/tweets.json?since_id=%s&q=%%23%s" % (since_id, hashtag)

         r = twitter.get(url)

@@ -16,4 +19,6 @@ def stream_events(self, inputs, ew):
         if len(output["statuses"]) != 0:

             for tweet in output["statuses"]:
-                print_xml_stream(input_name, json.dumps(tweet), tweet["created_at"])
\ No newline at end of file
+                print_xml_stream(input_name, json.dumps(tweet), tweet["created_at"])
+
+        # TODO: on success, update the contents of the checkpoint file
\ No newline at end of file