Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
12
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@toku345

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

目的

日々、成長していく(= データ量が増えていく)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

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
12
Help us understand the problem. What are the problem?