Techtouch Developers Blog

テックタッチ株式会社の開発チームによるテックブログです

GORM v2 で Prometheus 連携する

adventCalendar-day13

この記事はテックタッチアドベントカレンダー13日目の記事です。

SREチームの taisa です。韓国ドラマにハマっていましたが、沢山みたので結構満足しました。最近は「よくおごってくれる綺麗なお姉さん」をみました。

今回は、前回の「GORM v2 触ってみた Major Features 編」で触れられなかった Prometheus 連携機能について書きます。

SRE 本を読んでいると Borgmon という Google 内部で利用されているモニタリングツールがよく出てきます。気になるものの Borgmon 自体は使えませんが、Prometheus は Borgmon をルーツとして元グーグルのエンジニアが作った OSS で、Borgmon に似た機能を持っているようです。触ってみたい気持ちが高まります。

ドキュメント

GROM v2 の Prometheus に関するドキュメントはこちらです。

gorm.io

Prometheus とは、ついては別記事を参考にしてみてください。

knowledge.sakura.ad.jp

では早速使ってみます。

Prometheus をセットアップする

ダウンロードページから Prometheus をダウンロードします。Docker でも使えるようですが、ここでは Mac 環境で実行します。

f:id:techtouch:20201213172849p:plain

デフォルトで入っている prometheus.yml を編集して GORM v2 からデータを収集する設定を追加します。scrape_configs に job_name を db1 として追加し、static_configs の targets に localhost:8080 を指定します。

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheu'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'db1' # 追加

    static_configs:
    - targets: ['localhost:8080'] # 追加

コンフィグファイルが更新できたら下記コマンドで起動します。

./prometheus --config.file=prometheus.yml

起動後に http://localhost:9090 にアクセスすると Prometheus の GUI が表示されます。

f:id:techtouch:20201212220404p:plain

これで Prometheus 側の準備は完了です。

GORM v2 の Prometheus Plugin をセットアップする

GORM v2 で GORM DB を取得したら下記のようにプラグインを設定します。ここでは MySQL を使います。DBName と HTTPServerPort には prometheus.yml で指定した db1 と 8080 の値を指定します。プラグインで指定した値だと分かるように、Prefix に gorm_status_ を指定し、VariableNames には、コネクション数をモニタリングするよう指定します。

db.Use(prometheus.New(prometheus.Config{
    DBName:          "db1", // use `DBName` as metrics label
    RefreshInterval: 15,    // Refresh metrics interval (default 15 seconds)
    //PushAddr:        "localhost:9091", // push metrics if `PushAddr` configured (push も可能なようですが今回は使わない)
    StartServer:     true,  // start http server to expose metrics
    HTTPServerPort:  8080,  // configure http server port, default port 8080 (if you have configured multiple instances, only the first `HTTPServerPort` will be used to start server)
    MetricsCollector: []prometheus.MetricsCollector {
        &prometheus.MySQL{
            Prefix: "gorm_status_",
            VariableNames: []string{"Threads_connected"},
        },
    },  // user defined metrics
}))

// 確認用にスリープする
time.Sleep(300 * time.Second)

上記プログラムを起動すると GORM が Prometheus 用のサーバーを起動するので http://localhost:8080/metrics にアクセスすると次のような画面が表示されます。GORM のログを見ると 15秒に1回 SHOW STATUS が実行されていました。Prometheus はここに出力されている値を取得します。gorm_status_Threads_connected が出力されているのも確認できます。MySQL サーバー起動時の Threads_connected の値が 1 だったので 1 増えて 2 になりました。

f:id:techtouch:20201212222415p:plain

動作確認をする

Prometheus 画面に戻り、検索ボックスに「gorm_status_Threads_connected」と入力し検索すると GORM が出力した値を取得しグラフ化できます。

f:id:techtouch:20201212223034p:plain

試しに 20 回ループしてコネクションをオープンしてみたら 21 となりしっかり更新されているのも確認できました。

f:id:techtouch:20201212223758p:plain

まとめ

簡単に GORM v2 の Prometheus プラグインを触ってみました。今回は Prometheus のデフォルト GUI で確認しましたが、Grafana でいい感じに可視化したり、使い込めば色んな監視が簡単にできそうです。細かい使い方や解説は下記記事が参考になったので確認してみてください。

tech-lab.sios.jp

次回は Kenyu による「開発組織におけるマネージャの責務を分解し、チーム運用してみる」です!