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

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] を選択
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

classi
学校の先生・生徒・保護者向けのB2B2Cの学習支援Webサービス「Classi(クラッシー)」 を開発・運営している会社です。
https://classi.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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした