InfluxDBからCPU使用率の数値を取得してPythonで出力する

InfluxDBからPythonで例として現在のCPUを使っているユーザー数を取得するのにハマったのでメモ。

InfluxDBからリストで取得後にPandasでデータフレームにして取得する。

以下のようにするとうまくいった。PythonのパッケージInfluxdbとpandasが必要。

最終的にうまく行った方法

InfluxDBの中のTelegrafのCPUデータを取得してUser数の数値のみを取得する。最終的に温度・湿度・水温などを取得してE-インクに表示させたい。

from influxdb import InfluxDBClient
import pandas as pd #pandasインポート

client = InfluxDBClient('127.0.0.1', 8086,'admin', '', 'telegraf')
result = client.query('SELECT "usage_user" FROM "cpu" WHERE time >= now() - 1m limit 1 ;')

getcpu = list(result.get_points(measurement='cpu')) #cpuをリストにする
df = pd.DataFrame(getcpu) #pandasでデータフレームに変更
print df.usage_user[0]

結果は以下のように数値のみ取得できた。

$ python influxtest.py
2.2832221652108227

この数値のみ取得するのがなかなか難しかった。PHP+MySQLだったらかなり簡単にできる操作だけど・・・Pythonって面倒な言語なの?InfluxDBが特殊なDBなのかな?

Pythonパッケージ InfluxDB インストール

インストール

まずはInfluxDBにPythonから接続するためにpipでパッケージインストールする。

sudo pip install influxdb

InfluxDBからデータ取得テスト

接続のところInfluxDBClientはadminのパスワード入れなくても接続できた。Selectのみなのでエラーにならないのかな?

Selectはほぼ他のDBのクエリーと一緒の構文でクエリーを発行できた。

from influxdb import InfluxDBClient

client = InfluxDBClient('127.0.0.1', 8086, 'admin', '', 'telegraf')
result = client.query('SELECT "usage_user" FROM "cpu" WHERE time >= now() - 1m limit 1 ;')

print("Result: {0}".format(result))

結果

jsonの配列では無い?みたい。result[‘cpu’][‘usage_user’]などとしてもうまく取り出せない。

 $ python test.py
Result: ResultSet({'(u'cpu', None)': [{u'usage_user': 2.298263534221487, u'time': u'2019-01-27T19:54:56Z'}]})

これをどうにかして「2.298263534221487」のみ取り出したい。

Pythonパッケージ pandas インストール

pandasを使うとデータフレームに変更できるみたい。

pandasについてはこちらで詳しく説明されていました。

[Python] pandasの使い方まとめ - Qiita
pandasによるデータ処理メモ pandasに関する情報ページはわりと豊富なので、主にリンクのまとめです。 実行環境 実行環境は、Jupyter(IPython) Notebook を使うのが良いと思います。 Windows...

インストール

$ sudo pip install pandas

インストールがなかなか終わらなく、失敗するときもあった。

pandas使ってみる

以下のようにつくってみた。

from influxdb import InfluxDBClient
import pandas as pd #pandasインポート

client = InfluxDBClient('127.0.0.1', 8086,'admin', '', 'telegraf')
result = client.query('SELECT "usage_user" FROM "cpu" WHERE time >= now() - 1m limit 1 ;')

getcpu = list(result.get_points(measurement='cpu'))
df = pd.DataFrame(getcpu) #pandasでデータフレームに変更

print df['usage_user']

結果

以下のようになった。数値のみ欲しい場合はdf.usage_user[0]でうまく取得できた。

$ python test2.py
0    2.223926
Name: usage_user, dtype: float64

参考

influxDBからDataFrameの形にする方法
ちょっと苦戦したのでメモ。 このブログを参考にinfluxDBにBitcoinの値段のデータを入れていたんですが、 pythonで分析す
python-snippets/pandas_index.py at f6a84e140c8a24caa7ba5d3b4de92be097d6bb02 · nkmk/python-snippets
Contribute to nkmk/python-snippets development by creating an account on GitHub.

 

もっといいやり方あったら教えてくださると大喜びしますm(_ _)m

コメント

タイトルとURLをコピーしました