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

MackerelでRDSの情報をサービスメトリクスを使って取得する

More than 5 years have passed since last update.

Mackerelでは、RDSの情報を取得するためのプラグインが提供されていますが、それを使うとサーバメトリクスとして実行しているサーバに紐付いて情報が表示されます。
それになんかすごく違和感を感じたので、サービスメトリクスとしてAWSのAPIを叩いてデータを取得するスクリプトを作りました。

個人的に工夫した点は以下のとおり:
* CloudwatchのAPIも使って、残りだけじゃなくてディスクサイズも見れるように
* やっぱパーセントでも見たいなーと思って、パーセントのデータも送信
* RDS複数あったら面倒なので引数でRDSのidentity?を指定
* 無料枠で引っかかるの嫌なのでデータ容量関連だけ送る
位です。コレをいじれば全部のデータもMackerelで見れるようになります。
※エラーハンドリングをしていないのはご愛嬌ということで…。

get_rds_data.rb
#!/usr/bin/env ruby

require 'aws-sdk'
require 'mackerel/client'

ACCESS_KEY = ''   # AWS ACCESS KEY
SECRET_KEY = ''   # AWS SECRET KEY
RDS_REGION = ''   # RDS Region(ex:ap-northeast-1)
MACKEREL_KEY = '' # Mackerel API KEY

base_url = "https://mackerel.io/api/v0/services/"
rds_name = ARVG[0]
service_name = "RDS"
end_time = Time.now
start_time = end_time - 300

# RDS
rds = Aws::RDS::Client.new(
  region: RDS_REGION,
  access_key_id: ACCESS_KEY,
  secret_access_key: SECRET_KEY
)

resp = rds.describe_db_instances(
  db_instance_identifier: rds_name
)
total = resp[:db_instances][0][:allocated_storage] * 1024 * 1024 * 1024

# CloudWatch
cw = Aws::CloudWatch::Client.new(
  region: RDS_REGION,
  access_key_id: ACCESS_KEY,
  secret_access_key: SECRET_KEY
)
free = cw.get_metric_statistics(
  namespace: 'AWS/RDS',
  metric_name: 'FreeStorageSpace',
  statistics: ['Minimum'],
  dimensions:  [
    { name: "DBInstanceIdentifier", value: rds_name }
  ],
  period: 60,
  start_time: start_time,
  end_time: end_time
)[:datapoints][0][:minimum].to_i

used = total - free
free_p = sprintf("%.4f", free/total.to_f).to_f*100
used_p = sprintf("%.2f", 100-free_p.to_f)

# Create metrics data
metrics =  [
  {'name' => "#{rds_name}.Disk.Used", 'time' => end_time.to_i, 'value' => used },
  {'name' => "#{rds_name}.Disk.Free", 'time' => end_time.to_i, 'value' => free },
  {'name' => "#{rds_name}.DiskPercent.Used", 'time' =>end_time.to_i, 'value' => used_p.to_f },
  {'name' => "#{rds_name}.DiskPercent.Free", 'time' =>end_time.to_i, 'value' => free_p.to_f }
]

# send to Mackerel
@mackerel = Mackerel::Client.new(:mackerel_api_key => MACKEREL_KEY)
ret = @mackerel.post_service_metrics(service_name, metrics)

というファイルを適当に置いて、

mackerel-agent.conf
[plugin.metrics.rds]
command = "/path/to/ruby /path/to/get_rds_data.rb <RDS_NAME>"

と設定ファイルに書けば、サービスメトリクスとして管理画面から見れるようになります。

公式プラグインもサービスメトリクスで送信できるといいな!

sagehash
セプテーニ・オリジナルという会社でインフラエンジニアみたいな仕事をしています。 といっても雑用係みたいなもんですが。
http://labs.septeni.co.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