post Image
Go の expvar パッケージを使ってアプリケーションのメトリクスを公開する

expvar パッケージは手軽にメトリクスを公開するのに使えて便利なのですが、複数の値を公開するための例があまり公開されてなくて分かりにくかったので書いておきます。

expvar.Map を使う

mychat というチャットアプリを作ってると仮定して、送受信メッセージ数と、同時接続数を公開してみます。 /debug/vars を見た時に、次のような形でメトリクスを公開します。

...
mychat: {
  "conns": 42,
  "msg_recv": 10480,
  "msg_sent": 88946
},
...

メトリクスのためだけにパッケージを作っておきましょう。

src/mychat/metrics/metrics.go
package metrics

import (
    "expvar"
)

var (
    Map = expvar.NewMap("mychat") // expvar.NewXxx() は直接公開するメトリクスを作成する。

    Conns = new(expvar.Int)  // Map に入れる値などは expvar.NewInt() ではなく new(expvar.Int) で作る

    MessageRecv = new(expvar.Int)
    MessageSent = new(expvar.Int)
)

func init() {
    // init() で Map に 値を登録していく
    Map.Set("conns", Conns)
    Map.Set("msg_recv", MessageRecv)
    Map.Set("msg_sent", MessageSent)
}

値を更新する

metrics パッケージのグローバル変数として公開されている *expvar.Int 型を直接カウンタとして使います。

src/mychat/handler.go
package mychat

import (
    "log"

    "mychat/metrics"
)

// ...

func (c *conn) readloop() {
    metrics.Conns.Add(1)
    defer metrics.Conns.Add(-1)
    for {
        msg, err := c.read()
        if err != nil {
            if err != io.EOF {
                log.Error(err)
            }
            break
        }

        metrics.MessageRecv.Add(1)
        c.handleMessage(msg)
    }
}

// ...

まとめ

一番重要なのは、 expvar.NewInt(name) と new(expvar.Int) の違い (トップレベルで公開されるかどうか) です。

Go で NewXxx() という関数を見つけると new(Xxx) をしちゃいけない気がするかもしれませんが、実際には許されていて NewXxx() は汎用コンストラクタではなく特定用途向けという事が多いので、ちゃんとドキュメントを読むか、最悪ソースを読みましょう。 (一番いいのはドキュメントを読んだ上でソースコードを確認することです。)

実は今回の例は Int.Add しか使ってないので、 Map.Add を使うだけでも実現可能です。
しかしカウンタじゃなくて現在値を表す場合に Map.SetInt.Set のラッパーではなく Map.Set("rooms", len(room)) のような使い方はできません。

また、メトリクス名のリファクタリングや、 Map の入れ子構造をリファクタリングしたくなったときのことを考えると、この例のように独立したパッケージを用意して、メトリクス値ごとに変数を用意することをおすすめします。


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。