Edited at

RDS上の各テーブルの成長をDatadogで見える化してみたよ

More than 3 years have passed since last update.


目的

日々、成長していく(= データ量が増えていく)RDSを見守るために、見える化したい!

そのためにDatadogにメトリクスを送ってグラフ化してみました!


想定する対象の方

以下のような方が読んでも分かるようなものを目指してます


  • Datadogのアカウントは持ってるよ(持ってるだけだよ)

  • Datadogのアカウントは持ってないけど雰囲気だけ知りたいよ

※ アカウント作成に関してはDevelopers.IOさんの記事が詳しいです

Amazon LinuxをDatadogで監視してみた


そもそも Datadog って?

非常に柔軟なモニタリングサービスで、Saasの形で提供されています。

グラフがとても綺麗にできます。

tagというものが有り、それを使うと多次元に解析できたりもします。

一言で言うと、ホントにすごい奴です!


情報源

Datadog本家

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

コードはこんな感じ↓


rds_tables.rb

#! /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の解説

※ ちなみにDogStatsDを使用するためにはDatadog Agentのセットアップが必要みたいです。

Datadog Agent 入門


rds_tables2.rb

#! /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を参照するように変更

画面上部のTemplate Variableを変更してやると、その値に応じてグラフが変更するようになります

いいですね!!

他のメトリクスも同じように設定して、しばらく放置すると↓のような感じになります。

是非、みなさまも面白そうなメトリクスを追加&グラフ化して楽しんでみてください!

※ 下の画像は今回作成したグラフの他にTop Listというグラフも表示させてます。