銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

AWS RDS の CloudWatch Metrics を C# で NewRelic Plugin で表示する (2)

前回の記事で、New Relic のAPIをC#で直接叩いてPluginを作成する方法を紹介しました。その時は、Perfmon をやると書いていましたが、AWSのCloudWatchでRDSのMetricsを表示する方が先にできたので、そちらを紹介したいと思います。

なお、すでに公開されている NewRelic Plugin にRDSのメトリクスを表示するRuby製のPluginがあります。これを使えば同様のことはできるのですが、すこし Component の単位をこちらで編集したかったので、自作することにしました。

まず、このPluginを使ったときの表示ですが、このように複数のRDSインスタンスの同じパラメーター(ここではCPU)を同じグラフに表示することができます。

f:id:tanaka733:20130921202837p:plain

New Relicに送信するデータ構造は、Components > Metrics という親子関係を持ていますが、上に添付したようなグラフはComponents単位で描画できます(Componentsの違うMetricsは同じグラフに描けない模様)。そこで、同じグラフにしたいRDSインスタンスを1まとめにして、1つのコンポーネント、異なるMetricsとして送信することにしました。 Metricsの名前は、 Component/RDS/[RDSインスタンス名]/[CloudWatchのMetric名] という構造にします。これで、例えば先ほどのCPUのグラフであれば、 グラフの描画ターゲットを Component/RDS/*/CPUUtilization[Percent] とすれば複数のRDSインスタンスを1つのグラフで描くことができます。

それでは実際に取得して送信するコードです。Rx-Main, AWSSDK (2.0 beta), JSON.NET をNugetから参照に入れてください。 また、AWSのAccessKeyとSecretKeyをAppConfigなどに設定しておいてください(もしくはコンストラクタの引数で直接指定)。NewRelicの LicenseKey と guidも自分のものを入力してください。

Mainメソッドで直接実行します。基本的には、Rxで60秒起きに CloudWatch に 対象のRDSインスタンス×Metricsだけデータを問い合わせて(1回のAPI問い合わせで1つしか取得できない)、その結果を NewRelic に送信するJSONにして、送信しています。 対象のRDSInstanceは、RDSのAPIを叩いてproduction という文字列がDB識別文字列に含まれるRDSインスタンス一覧にしています。この辺は固定リストにしてもいいでしょう。 また、対象のMetricsはMetricList というフィールドで宣言しています。

RDSインスタンス×MetricsをSelectMany で1つのシーケンスにして、CloudWatchのAPIへ問い合わせています。このとき1分間隔で直近1つのデータを取得するように、2分前から1分前までの期間で1分起きのデータを指定しています。APIから返ってくるデータと必要なデータを組み合わせた DataPointWrapper というクラスを定義して後続のシーケンスに渡します。

あとは、前回のサンプル と同様にNewRelic APIへ送信しています。

あとはコンソールアプリとして実行すれば、NewRelicの画面にguid の最後のピリオドの後ろの文字列でプラグインが表示されます。その後、Chartで表示するMetricsを Component/RDS/*/CPUUtilization[Percent] みたいに指定すると、最初に紹介したグラフが表示されます。

これで基本的にはできあがりです。例外処理や、起動し続けるための仕組みなどが必要ですが、データ取得と送信はできました。