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>"
と設定ファイルに書けば、サービスメトリクスとして管理画面から見れるようになります。
公式プラグインもサービスメトリクスで送信できるといいな!