Help us understand the problem. What is going on with this article?

CloudWatchAgentのStatsDを試してみる

More than 1 year has passed since last update.

CloudWatchAgentを設定をしていると、statsDとかcollectdとか名前が出てきますが、どうやらOSSの数値レポーティングツールらしいです。

prometheusを主に使っているので困ったことがなくて所見ですが、今回はstatsDを試してみました。

どんなもの?

https://github.com/statsd/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に登録しちゃった。(ダサい)

確認する

image.png

こんな感じで出てきました。
あとはアラームを設定するなりなんなりと。

まとめ

  • サーバからデータを送る方法の1つとして使えると思います。
  • udpで投げっぱなしにできるので、コードの中に仕込んでおいてモニタリングとかもできちゃう。(そういうモチベらしい)
  • いいとおもいます!
murata-tomohide
https://ceres-inc.jp/ でソフトウェアエンジニアやってます。 間違いや変なところがあればツッコミ大歓迎。 「暗号通貨読書会/勉強会」の運営もやってます。 https://cryptocurrency.connpass.com/
ceres
「インターネットマーケティングを通じて豊かな世界を実現する」をミッションとし、国内最大級のスマートフォン向けポイントサイトの「モッピー」や「お財布.com」などを開発・運営しています。
https://ceres-inc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away