[Python] InfluxDB 입력 및 검색 Develop Tip

지난번 시계열정보를 살펴볼 때 시계열 DB로 InfluxDB를 살펴보았습니다.

이번에는 좀 더 구체적으로 파이썬에서 influxdb 클라이언트 모듈을 이용하여
데이터를 넣거나 쿼리해오는 것에 대해서 살펴보겠습니다.

더불어 시행착오에 대해서도 한마디...

일단 InfluxDB를 우분투나 맥 등에 설치합니다.
설치하는 방법은 이곳에 잘 나타나 있습니다.

일단 InfluxDB가 데몬으로 동작하고 있다고 하고,
터미널에서

$ influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.9.5.1
InfluxDB shell 0.9.5.1
> show databases;
name: databases
---------------
name
_internal
tstest

influx 명령으로 클라이언트 접속을 하고,

show databases 명령으로 시스템에 있는 DB 를 확인합니다.

> CREATE DATABASE foodb
와 같이 생성 및

> DROP DATABASE foodb
로 삭제도 가능합니다.

> use foodb
와 같이 해당 DB를 선택하고,

> SHOW FIELD KEYS;
name: table01
-------------
fieldKey
fld02


위와 같이 "SHOW FIELD KEYS" 명령으로 일단 설치된 것을 확인합니다.

위에서는 name 이라는 table01 이 바로 테이블 (InfluxDB에서는 Measurement 라 부름) 개념이고
fieldKey에 있는 fld02 가 바로 시계열 시리즈라 생각하시면 됩니다.

SELECT 를 할 때 시간 필드가 큰 숫자가 나오는데
이를 사람이 읽기 좋은 형태로 select 하려면,

> precision rfc3339

라고 하면 됩니다.



이제 파이썬에서 influxdb 를 이용하기 위해서 

$ sudo pip install influxdb
라고 설치를 합니다.

그리고 아래와 같이 코드를 작성해서 
입력을 하고 검색 결과를 보려고 하였습니다.

#!/usr/bin/env python
#coding=utf-8

##########################################################################################
from datetime import datetime, timedelta
import pprint
from influxdb import InfluxDBClient
from copy import deepcopy
import pytz

##########################################################################################
local_tz = pytz.timezone('Asia/Seoul') # use your local timezone name here
##########################################################################################
def utc_to_local(utc_dt):
local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
return local_tz.normalize(local_dt) # .normalize might be unnecessary

##########################################################################################
def get_ifdb(db, host='localhost', port=8086, user='root', passwd='root'):
client = InfluxDBClient(host, port, user, passwd, db)
try:
client.create_database(db)
except:
pass
return client

##########################################################################################
def my_test(ifdb):
json_body = [
]
tablename = 'table02'
fieldname = 'fld03'
point = {
"measurement": tablename,
"tags": {
"host": "server02",
"region": "us-east"
},
"fields": {
fieldname: 0
},
"time": None,
}
dt = datetime.now() - timedelta(seconds=6)
ldt = utc_to_local(dt)
print "UTC now=<%s> local now=<%s>" % (dt, ldt)
vals = [ 2.3, 1.7, 1.4, 0.7,1.9 ]
for v in vals:
np = deepcopy(point)
np['fields'][fieldname] = v
np['time'] = dt
json_body.append(np)
dt += timedelta(seconds=1)
ifdb.write_points(json_body)

result = ifdb.query('select * from %s' % tablename)
pprint.pprint(result.raw)

##########################################################################################
def do_test():
ifdb = get_ifdb(db='tstest')
my_test(ifdb)

##########################################################################################
if __name__ == '__main__':
do_test()


내용인 즉은 현재 시각을 구해 6초전부터 해서 1초에 하나씩 
값을 넣는 것입니다.

그런데 며칠 전 것은 들어가는데 현재 시각을 구해 넣으면 안 들어가길래,
한참을 찾다가 문서를 확인하니...

InfluxDB는 시계열이 UTC를 기준으로 한다는 것이 있었습니다.
그러면 이 시스템에서 현재 시각보다 더 미래는 아예 넣지 않게 되어있나 싶어

dt = datetime.now() - timedelta(seconds=6)
대신

dt = datetime.utcnow() - timedelta(seconds=6)

라고 UTC 값을 넣으니 이상없이 잘 동작하는 것이었습니다.


어느 분께는 도움이 되셨기를...

덧글

댓글 입력 영역

구글애드텍스트