2017-04-25 6 views
0

私は、私が尋ねようとしていることのすべての側面を初めて知りました。既存データを上書きせずにこのデータ(JSON)をRedisに保存することについてのアドバイスはありますか?

私は、RedisでJSONデータとなるポーリングされたメトリックを正常に保存できるかどうかを判断しようとしています。

私はすでにそれをやっています。次のPythonスクリプトはデバイスをポーリングし、JSONデータを取り戻してから、(rejson-https://redislabs.com/blog/redis-as-a-json-store/)を使用してjsonデータをRedisにプッシュできます。ここで

はコードです:

# !/usr/bin/env python 
from __future__ import print_function 
from functools import wraps 
from pprint import pprint 
import time 
import sys 
import acos_client as acos 
import redis 
import json 

c = acos.Client('10.10.10.10', acos.AXAPI_21, 'username', 'password') 

data = c.slb.service_group.stats('SG_SITE1.BUSINESS.COM_443') 

# Open a connection to redis 
r = redis.StrictRedis() 

# Store the document 
r.execute_command('JSON.SET', 'data', '.', json.dumps(data)) 

# Retrieve it 
reply = json.loads(r.execute_command('JSON.GET', 'data')) 

これは引っ張られ、その後、Redisの中に格納されたデータである。

{u'service_group_stat': {u'cur_conns': 344, 
         'date': '04-25-2017', 
         u'member_stat_list': [{u'cur_conns': 66, 
               u'req_bytes': 1476212423, 
               u'req_pkts': 10449342, 
               u'resp_bytes': 33132743858, 
               u'resp_pkts': 25652317, 
               u'server': u'WWW0006', 
               u'tot_conns': 172226}, 
               {u'cur_conns': 64, 
               u'req_bytes': 1666275823, 
               u'req_pkts': 11982676, 
               u'resp_bytes': 37575461036, 
               u'resp_pkts': 29175599, 
               u'server': u'WWW0005', 
               u'tot_conns': 205244}, 
               {u'cur_conns': 89, 
               u'req_bytes': 1671222671, 
               u'req_pkts': 11940864, 
               u'resp_bytes': 37064038202, 
               u'resp_pkts': 28747313, 
               u'server': u'WWW0004', 
               u'tot_conns': 195789}, 
               {u'cur_conns': 37, 
               u'req_bytes': 94117510958, 
               u'req_pkts': 585916896, 
               u'resp_bytes': 1860691638618, 
               u'resp_pkts': 1439228725, 
               u'server': u'WWW0003', 
               u'tot_conns': 7366402}, 
               {u'cur_conns': 42, 
               u'req_bytes': 98580368121, 
               u'req_pkts': 642797814, 
               u'resp_bytes': 1934241923560, 
               u'resp_pkts': 1498242871, 
               u'server': u'WWW0002', 
               u'tot_conns': 7221995}, 
               {u'cur_conns': 46, 
               u'req_bytes': 94886760323, 
               u'req_pkts': 593577169, 
               u'resp_bytes': 1863028601218, 
               u'resp_pkts': 1441197389, 
               u'server': u'WWW0001', 
               u'tot_conns': 7260787}], 
         u'name': u'SG_SITE1.BUSINESS.COM_443', 
         u'req_bytes': 292398350319, 
         u'req_pkts': 1856664761, 
         u'resp_bytes': 5765734406492, 
         u'resp_pkts': 4462244214, 
         'time': '11:00:00', 
         u'tot_conns': 22422443}} 

私はRedisの中で、「データ」をチェックすると、私は/データを参照してくださいjsonがプッシュされました:

127.0.0.1:6379> json.get data 
"{\"service_group_stat\":{\"status\":3,\"protocol\":2,\"name\":\"SG_SITE1.BUSINESS.COM_443\",\"cur_reqs\":0,\"resp_pkts\":4472667457,\"cur_conns\":306,\"total_reqs\":0,\"total_reqs_succ\":0,\"req_pkts\":1860880754,\"req_bytes\":293088668161,\"member_stat_list\":[{\"status\":1,\"resp_bytes\":35542787582,\"cur_reqs\":0,\"resp_pkts\":27513984,\"cur_conns\":72,\"total_reqs\":0,\"server\":\"WWW0006\",\"req_pkts\":11202756,\"req_bytes\":1601613790,\"total_reqs_succ\":0,\"tot_conns\":181675,\"port\":81},{\"status\":1,\"resp_bytes\":39991941399,\"cur_reqs\":0,\"resp_pkts\":31033672,\"cur_conns\":45,\"total_reqs\":0,\"server\":\"WWW0005\",\"req_pkts\":12730038,\"req_bytes\":1788901352,\"total_reqs_succ\":0,\"tot_conns\":214379,\"port\":81},{\"status\":1,\"resp_bytes\":38939383008,\"cur_reqs\":0,\"resp_pkts\":30207188,\"cur_conns\":41,\"total_reqs\":0,\"server\":\"WWW0004\",\"req_pkts\":12545969,\"req_bytes\":1770117987,\"total_reqs_succ\":0,\"tot_conns\":203326,\"port\":81},{\"status\":1,\"resp_bytes\":1863483461334,\"cur_reqs\":0,\"resp_pkts\":1441396536,\"cur_conns\":34,\"total_reqs\":0,\"server\":\"WWW0003\",\"req_pkts\":586827719,\"req_bytes\":94258771440,\"total_reqs_succ\":0,\"tot_conns\":7378462,\"port\":81},{\"status\":1,\"resp_bytes\":1935723181356,\"cur_reqs\":0,\"resp_pkts\":1499389206,\"cur_conns\":48,\"total_reqs\":0,\"server\":\"WWW0002\",\"req_pkts\":643286283,\"req_bytes\":98658443365,\"total_reqs_succ\":0,\"tot_conns\":7228301,\"port\":81},{\"status\":1,\"resp_bytes\":1865535919223,\"cur_reqs\":0,\"resp_pkts\":1443126871,\"cur_conns\":66,\"total_reqs\":0,\"server\":\"WWW0001\",\"req_pkts\":594287989,\"req_bytes\":95010820227,\"total_reqs_succ\":0,\"tot_conns\":7271565,\"port\":81},{\"status\":0,\"resp_bytes\":0,\"cur_reqs\":0,\"resp_pkts\":0,\"cur_conns\":0,\"total_reqs\":0,\"server\":\"WWW03\",\"req_pkts\":0,\"req_bytes\":0,\"total_reqs_succ\":0,\"tot_conns\":0,\"port\":81},{\"status\":0,\"resp_bytes\":0,\"cur_reqs\":0,\"resp_pkts\":0,\"cur_conns\":0,\"total_reqs\":0,\"server\":\"WWW01\",\"req_pkts\":0,\"req_bytes\":0,\"total_reqs_succ\":0,\"tot_conns\":0,\"port\":81},{\"status\":0,\"resp_bytes\":0,\"cur_reqs\":0,\"resp_pkts\":0,\"cur_conns\":0,\"total_reqs\":0,\"server\":\"WWW02\",\"req_pkts\":0,\"req_bytes\":0,\"total_reqs_succ\":0,\"tot_conns\":0,\"port\":81}],\"time\":\"13:20:57\",\"date\":\"04-25-2017\",\"resp_bytes\":5779216673902,\"tot_conns\":22477708}}" 

これまでに表示されるように、

問題は、既存の "データ"を上書きせずに次のデータセットを適切に処理する方法がわかりません。

私は、これは、それが「データ」としてRedisのために節約するものであることを実現:

r.execute_command('JSON.SET', 'data', '.', json.dumps(data)) 

目標は、それは、日付と時刻が含まれ、このデータの複数のセットを持つことです。

"service_groups"とそれに含まれるサーバーごとに5分ごとに取得されたこれらのメトリックを1時間保存するためにこれを使用したいと考えています。

私はこれを達成するためにどのように動くかを学び理解することに非常に興味がありますか?質問へ

**追加の詳細/レスポンス**

究極の目標は、データにアクセスし、与えられた中で「SERVICE_GROUP」のための指標を示すことができるグラフ/レポートツールのいくつかの並べ替えを使用することができることです「service_group」を展開し、その「service_group」内の各メンバー/サーバーに関連付けられたメトリックを表示する機能を提供します。

答えて

2

Redis(data)のすべてのキーはデータ構造体です。データ構造体はJSONドキュメントです。 "複数のセットを保存"するには、少なくとも2つの方法があります:1)複数のキーを使用するか、または2)キーの中にJSONのネストを使用する。

レディスは、多くのキー(2^32-1が正確)を保持できます。それぞれのJSONドキュメントを別のキーの下に保存することができます。キー名は、すなわち、その名とタイムスタンプの組み合わせがそれを行うことができ、一意である必要があります。

... 
name = 'SG_SITE1.BUSINESS.COM_443' 
data = c.slb.service_group.stats(name) 
... 
keyname = '{}:{}'.format(name, data['service_group_stat']['date']) 
r.execute_command('JSON.SET', keyname, '.', json.dumps(data)) 
... 

他の方法を使用して、すなわち、一つのキー(例えばdataまたはSG_SITE1.BUSINESS.COM_443)が、その中に入れ子に複数のドキュメントを使用します例えば、文書をオブジェクトとして考えると、各キーがおそらく日付であると考えることができます。:

{'04-25-2017': 
    {u'service_group_stat': {u'cur_conns': 344, 
         'date': '04-25-2017', 
... 
    }, 
'04-24-2017': 
    {u'service_group_stat': {u'cur_conns': 344, 
         'date': '04-24-2017', 
... 

だから、基本的に、それはのようになります。

もちろん
... 
name = 'SG_SITE1.BUSINESS.COM_443' 
data = c.slb.service_group.stats(name) 
... 
path = '.["{}"]'.format(data['service_group_stat']['date']) 
r.execute_command('JSON.SET', name, path, json.dumps(data)) 
... 

、本当の問題は、あなたはそれが所定の位置にいたら、データをどうしたいんものです;)

PS電子メールの遅れに対する私の謝罪 - これは将来の世代に役立つかもしれないので、話題を議論するにははるかに良い媒体です:P

+0

私の目標は、データにアクセスできる何らかの種類のグラフ作成/レポートツールを使用できるようにすることです。指定された期間内の "service_group"のメトリックを表示します。次に、 "service_group"を展開し、その "service_group"内の各サーバーに関連付けられたメトリックを表示することができます。 – ddevalco

+0

パスは日付ではありませんか? "redis.exceptions.ResponseError:オフセット2での検索パスエラー:識別子は、文字、ドル記号、またはアンダースコアで始まるだけで、他のものはブラケット表記を使用します" – ddevalco

関連する問題