CloudWatchAgentを設定をしていると、statsDとかcollectdとか名前が出てきますが、どうやらOSSの数値レポーティングツールらしいです。
prometheusを主に使っているので困ったことがなくて所見ですが、今回はstatsDを試してみました。
どんなもの?
- StatsDはプロトコルの名前、サーバとクライアントの実装がちゃんとあるぞ
- push系だぞ
- UDP使っちゃうぞ
- nodejsでできているんだぞ。
- 自身のアプリケーションに仕込んだりできるぞ
- クライアント側で使える言語は豊富だぞ
ってことらしいです。
CloudWatch Agentにはサーバ側が内包されているのでONにするだけです。(ウィザードで選択すればOK)
CloudWatchAgentでStatsDを有効にする
適当なCloudWatchAgentが動いている(動く)サーバでStatsDを有効にします。
amazon-cloudwatch-agent-config-wizard で下記らへんですね。
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
Which port do you want StatsD daemon to listen to?
default choice: [8125]
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
設定ファイルに直接追加するならこちら参考に。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-custom-metrics-statsd.html
クライアント側のコードを作る
ライブラリは豊富にあります。 https://github.com/statsd/statsd/wiki
プロダクトのプログラムの中に仕込めればいいんだけどとりあえずお試しなので、gethからblockを取得してstatsDを経由してCloudWatchに表示するってのをやってみます。
gethが入っていて、golang環境があるのでgolangで書きました。
golangはよく知らないのでテキトーです!
package main
import (
"context"
"strconv"
"log"
"github.com/ethereum/go-ethereum/ethclient"
"github.com/cactus/go-statsd-client/statsd"
)
func main() {
url := "http://localhost:8545"
client, err := ethclient.Dial(url)
if err != nil {
statsd_push("0")
log.Fatal(err)
}
header, err := client.HeaderByNumber(context.Background(), nil)
if err != nil {
statsd_push("0")
log.Fatal(err)
}
statsd_push(header.Number.String())
}
func statsd_push(bno string) {
// first create a client
// The basic client sends one stat per packet (for compatibility).
client, err := statsd.NewClient("127.0.0.1:8125", "statsD-client")
// handle any errors
if err != nil {
log.Fatal(err)
}
// make sure to clean up
defer client.Close()
i64, err := strconv.ParseInt(bno, 10, 64)
// log.Println(i64)
// Send a stat
client.Gauge("block-number", i64, 1.0)
}
client, err := statsd.NewClient("127.0.0.1:8125", "statsD-client")
localhostの8125でStatsDがたっているのでそいつにぶん投げればCloudWatchAgentが値を拾ってawsにぶん投げてくれます。
client.Gauge("block-number", i64, 1.0)
メトリクスのタイプは https://github.com/statsd/statsd/blob/master/docs/metric_types.md
定時実行する
Crontabに登録しちゃった。(ダサい)
確認する
こんな感じで出てきました。
あとはアラームを設定するなりなんなりと。
まとめ
- サーバからデータを送る方法の1つとして使えると思います。
- udpで投げっぱなしにできるので、コードの中に仕込んでおいてモニタリングとかもできちゃう。(そういうモチベらしい)
- いいとおもいます!