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

More than 3 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>"

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

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