Septeni Engineer's Blog

セプテーニエンジニアが綴る技術ブログ

無料枠で引っかかるの嫌なのでデータ容量関連だけ送る

こんばんわ!
まさかのベトナムからの投稿と相成りました、さげはしです。
こちらは今日は30度に迫ろうかという気温(と高い湿気)でアツアツです!

今回は弊社でも利用しているMackerelを使った監視のお話をば。

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

  • CloudwatchのAPIも使って、残りだけじゃなくてディスクサイズも見れるように
  • やっぱパーセントでも見たいなーと思って、パーセントのデータも送信
  • RDS複数あったら面倒なので引数でRDSのidentity?を指定
  • 無料枠で引っかかるの嫌なのでデータ容量関連だけ送る

位です。コレをいじれば全部のデータもMackerelで見れるようになります。
※エラーハンドリングとかなかったり、内容が拙いのはご愛嬌ということで…。

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

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)


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

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


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

※本文はhttp://qiita.com/sagehash/items/68fa4877a5037811e25cからの転載です。