見出し画像

シン・TWSNMP開発日誌:ポーリングログの保存方法をbboltのバケットを階層化して改善

今朝は5時半から開発開始です。
土曜日に頂いたTWSNMP FCのフィードバックの対応は完了しました。
TRAP受信のポーリングには復帰状態を発生させないようにしました。
稼働率のログは、

の設定でOFFにできるようにしました。

ポーリングログの確認ボタンの問題は、初回の表示期間を7日から1日に変更するのと、ボタンを押した後、処理中がわかるようにしました。

ポーリングログの保存方法について良いアイデアを思いついたので、今開発中のシン・TWSNMPに組み込んで試してみました。
今まで、bboltの1つのバケットに、全てのポーリングのログを入れていましたがバケットを階層化してポーリング毎に保存するようにしました。ポーリングログの読みだしや、削除にかかる時間がかなり短くできたようです。
特にポーリングを削除した時は、バケットごと削除すればよいので画期的です。既に古い方法で保存されたログを新しい方法で保存する処理も作ってみました。

func convertPollingLog() error {
	log.Println("start convertPollingLog")
	if db == nil {
		return fmt.Errorf("no db")
	}
	st := time.Now()
	return db.Batch(func(tx *bbolt.Tx) error {
		b := tx.Bucket([]byte("pollingLogs"))
		if b == nil {
			return fmt.Errorf("bucket pollingLogs not found")
		}
		count := 0
		b.ForEach(func(k, v []byte) error {
			var e PollingLogEnt
			err := json.Unmarshal(v, &e)
			if err != nil {
				log.Printf("load polling log err=%v", err)
				return nil
			}
			if bs, err := b.CreateBucketIfNotExists([]byte(e.PollingID)); err == nil {
				bs.Put(k, v)
				count++
			}
			b.Delete(k)
			return nil
		})
		log.Printf("convertPollingLog count=%d dur=%v", count, time.Since(st))
		return nil
	})
}

思ったより簡単に動作して、4万件ぐらいのログだと1秒程度で変換できました。
シン・TWSNMPは、はじめから新しい方式にするので、変換処理は組み込まないことにしますが、TWSNMP FCで対応するのは、変換処理の組み込みが必要です。どうするか、悩みどころです。

明日に続く

いいなと思ったら応援しよう!

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