見出し画像

TWSNMPとGrafanaの連携(2)

TWSNMPのポーリング結果やAI分析の結果をGrafanaのダッシュボードに表示する話の続きです。前回

でInfluxdbとGrafanaをDocker環境で動かしてInfuxdbへGO言語のテストプログラムからデータを送信しました。今回は、このテストプログラムの内容をTWSNMPに組み込んでいきます。

連携に必要な設定項目

Influxdbへ接続するためのパラメータは、ドキュメントのページが見つからないので

のソースコードから調べました。

// HTTPConfig is the config data needed to create an HTTP Client.
type HTTPConfig struct {
	// Addr should be of the form "http://host:port"
	// or "http://[ipv6-host%zone]:port".
	Addr string

	// Username is the influxdb username, optional.
	Username string

	// Password is the influxdb password, optional.
	Password string

	// UserAgent is the http User Agent, defaults to "InfluxDBClient".
	UserAgent string

	// Timeout for influxdb writes, defaults to no timeout.
	Timeout time.Duration

	// InsecureSkipVerify gets passed to the http client, if true, it will
	// skip https certificate verification. Defaults to false.
	InsecureSkipVerify bool

	// TLSConfig allows the user to set their own TLS config for the HTTP
	// Client. If set, this option overrides InsecureSkipVerify.
	TLSConfig *tls.Config

	// Proxy configures the Proxy function on the HTTP client.
	Proxy func(req *http.Request) (*url.URL, error)

	// WriteEncoding specifies the encoding of write request
	WriteEncoding ContentEncoding
}

必要なのは、

Addr
接続先のInfluxdbのURL(http://host:port)
Username
influxdbにログインする時のユーザー名
Password
influxdbにログインする時のパスワード

です。データベースの名前や送信するデータに関する設定も必要です。データベースをTWSNMPから初期化できれば便利です。というわけで連携のための設定画面のようにしました。

画像1

ポーリングの結果は、ログに保存している場合だけ送信するか、全て送信するかを選べるようにしました。

Influxdbへ送信するデータの内容

Influxdbへ送信するデータには、

①データの種類を表す名前(name)
②データの発生元を識別するタグ(tags)
③測定データ(fields)
④タイムスタンプ(t)

が必要です。データを登録する関数で、

func NewPoint(
	name string,
	tags map[string]string,
	fields map[string]interface{},
	t ...time.Time,

のようになっています。
実際にGrafanaではnameのデータシリーズからtagsの値でフィルターしてfiledsの値を表示します。TWSNMPのポーリング結果を、これらのデータに割り当てる必要があります。ポーリング結果のデータは、

画像2

のように割当ました。

①nameはポーリングの名前
②tagsはポーリングのID、ノード名、ノードID、マップ名
③filedsは数値データ
④tは、ポーリングを実施した日時

組み込んだコードは、

	// Create a point and add to batch
	tags := map[string]string{
		"map":       mapConf.MapName,
		"node":      n.Name,
		"nodeID":    n.ID,
		"pollingID": p.ID,
	}
	fields := map[string]interface{}{
		"numVal": p.LastVal,
	}

	pt, err := client.NewPoint(p.Name, tags, fields, time.Unix(0, p.LastTime))

のようにしました。

いつものように心配なこと

Influxdbへ接続してデータを送る部分はできたのですが長年の経験から心配なことを見つけてしまいます。今回は、

・Influxdbへ接続できないとどうなるか?
・httpsで接続する時にサーバーの証明書が信用できない時どうなるか?

の2つです。1つ目が発生すると送信できないポーリングデータが溜まっていってポーリングの処理が沢山起動されたままになりメモリ不足でプログラムが終了します。2つ目は単に接続できないだけでデータは送信されません。
この2つの問題を解決するために接続パラメータのTimeoutとInsecureSkipVerifyを設定しました。

	conf := client.HTTPConfig{
		Addr:               influxdbConf.URL,
		Timeout:            time.Second * 5,
		InsecureSkipVerify: true,
	}

これで安心なはずです。

ここまでで、データをInfluxdbへ送信できるようになったので次回は、いよいよGrafanaのダッシュボードにデータを表示してみます。

つづく

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。