17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2016-03-16

目的

日々、成長していく(= データ量が増えていく)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] を選択
1.png

[Graph]欄にメトリクス名を指定して、グラフを任意の数(今回は1つ)選択し、新しくダッシュボードを作成
2.png

3.png

ダッシュボードの修正

前の手順でグラフは出来たのですが、もう一手間かけるともっと使い勝手の良いものになります!

ダッシュボードを開いて
4.png

Template Variableを設定
5.png

最初に設定したグラフから新しく設定したTemplate Variableを参照するように変更
6.png

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

いいですね!!

他のメトリクスも同じように設定して、しばらく放置すると ↓ のような感じになります。
是非、みなさまも面白そうなメトリクスを追加&グラフ化して楽しんでみてください!

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

17
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?