目的
日々、成長していく(= データ量が増えていく)RDS を見守るために、見える化したい!
そのために Datadog にメトリクスを送ってグラフ化してみました!
想定する対象の方
以下のような方が読んでも分かるようなものを目指してます
- Datadog のアカウントは持ってるよ(持ってるだけだよ)
- Datadog のアカウントは持ってないけど雰囲気だけ知りたいよ
※ アカウント作成に関しては Developers.IO さんの記事が詳しいです
→ Amazon Linux を Datadog で監視してみた
そもそも Datadog って?
非常に柔軟なモニタリングサービスで、Saas の形で提供されています。
グラフがとても綺麗にできます。
tag
というものが有り、それを使うと多次元に解析できたりもします。
一言で言うと、ホントにすごい奴です!
情報源
Datadog についてもちょっと深掘りしたい方は、
私のココロの師匠 @akiray03 さんのはじめての datadog
Datadog tag
のすごさ、多次元に解析については、
@jhotta さんのDatadog の本当の魅力とはを参照ください。
見える化のために
メトリクス(= 監視したい情報)の送信
手段その1(REST API 経由)
最初はメトリクス送信にREST API
を使用してみました。
Datadog API Reference
DATADOG_KEY
, DATADOG_APP_KEY
はコチラから → https://app.datadoghq.com/account/settings#api
コードはこんな感じ ↓
#! /usr/bin/env ruby
require 'dogapi'
DATADOG_KEY = 'XXXXXXXXXX'
DATADOG_APP_KEY = 'XXXXXXXXXX'
def emit_datadog(metric, v, tags)
dog = Dogapi::Client.new(DATADOG_KEY, DATADOG_APP_KEY)
dog.emit_point(metric, v, host: 'my.host', tags: tags)
end
SQL = 'SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH FROM information_schema.tables WHERE TABLE_SCHEMA="myapp";'
records = `mysql -uwho -ppassword -h hogehoge.ap-northeast-1.rds.amazonaws.com my_database -BN -e '#{SQL}'`
records.split("\n").each do |record|
table_name, table_rows, data_length, index_length = record.split("\t")
emit_datadog 'myapp.mysql.table_rows', table_rows.to_i, ['mysql', "table_name:#{table_name}", 'table_rows'] # テーブル行数
emit_datadog 'myapp.mysql.data_length', data_length.to_i, ['mysql', "table_name:#{table_name}", 'data_length'] # テーブルサイズ
emit_datadog 'myapp.mysql.index_length', index_length.to_i, ['mysql', "table_name:#{table_name}", 'index_length'] # インデックスサイズ
end
ただ上記コードには問題がありました 😥
各テーブル × メトリクス毎に送信する必要があるため、
約 300 テーブル × 3 メトリクス = 約 900 回 https 通信が発生し、9 分位かかってました。。。
リアルタイム性に欠けるため、とても監視につかえるようなしろものではありませんでした。
手段その2(DogStatsD 経由)
そこで、DogStatsD 経由で送信するように変更してみました。
DogStatsD を使うと
メトリクスをUDPを使って受信し、集計した後、グラフ化表示のために定期的にDatadog側に送信
できるようになり、
約 300 テーブルある情報を1分間隔で送信しても特にトラブルが起きなくなりました!
※ ちなみに DogStatsD を使用するためにはDatadog Agent
のセットアップが必要みたいです。
Datadog Agent 入門
#! /usr/bin/env ruby
require 'statsd'
statsd = Statsd.new('localhost')
SQL = 'SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH FROM information_schema.tables WHERE TABLE_SCHEMA="myapp";'
records = `mysql -uwho -ppassword -h hogehoge.ap-northeast-1.rds.amazonaws.com my_database -BN -e '#{SQL}'`
statsd.batch do |s|
records.split("\n").each do |record|
table_name, table_rows, data_length, index_length = record.split("\t")
s.gauge 'myapp.mysql.table_rows', table_rows.to_i, tags: ['mysql', "table_name:#{table_name}", 'table_rows'] # テーブル行数
s.gauge 'myapp.mysql.data_length', data_length.to_i, tags: ['mysql', "table_name:#{table_name}", 'data_length'] # テーブルサイズ
s.gauge 'myapp.mysql.index_length', index_length.to_i, tags: ['mysql', "table_name:#{table_name}", 'index_length'] # インデックスサイズ
end
end
グラフ化
お次は集めたメトリクスのグラフ化!
グラフの準備
まずは、集めたメトリクスのうち、どのメトリクスを使ってグラフを描画するかを指定します。
サイドメニューの [Metrics] -> [Explorer] を選択
[Graph]欄にメトリクス名を指定して、グラフを任意の数(今回は1つ)選択し、新しくダッシュボードを作成
ダッシュボードの修正
前の手順でグラフは出来たのですが、もう一手間かけるともっと使い勝手の良いものになります!
最初に設定したグラフから新しく設定したTemplate Variable
を参照するように変更
画面上部のTemplate Variable
を変更してやると、その値に応じてグラフが変更するようになります
いいですね!!
他のメトリクスも同じように設定して、しばらく放置すると ↓ のような感じになります。
是非、みなさまも面白そうなメトリクスを追加&グラフ化して楽しんでみてください!