Post GCP Billing data to Mackerel with Node.js
Node.jsのBigQueryライブラリを使ってGCPのBillingを取得してみました。
次はこのBillingの情報をMackerelにサービスメトリックとして送ってみます。
Mackerel側のインターフェースの確認
サービスメトリックは以下のデータ形式で送れば良いみたいです。
[ <metricValue>, <metricValue>, … ]
詳細はこちら。
つまり、今回の場合は以下のようなデータを送れば良いみたいです。
[ {name: "gcp.monthly_cost", time: "1234567890", value: "0.1567"} ]
Node.jsのコードを書く
以下のようなコードを用意します。
// Imports the Google Cloud client library
// Instantiates a client
var bigquery = require('@google-cloud/bigquery')({
projectId: process.env.GCP_PROJECT_ID,
keyFilename: process.env.GCP_KEY_FILE_NAME
});
// Query
var query = 'SELECT SUM(cost) AS sum_cost, LEFT (FORMAT_UTC_USEC( UTC_USEC_TO_MONTH(TIMESTAMP_TO_USEC(start_time))), 7) AS month FROM ' + process.env.TABLE_NAME + ' GROUP BY month HAVING month = LEFT (CURRENT_DATE(), 7)'
// Run query and post mackerel
bigquery.query(query, function(err, rows) {
var monthly_cost = rows[0]["sum_cost"];
var seconds = Math.floor((new Date).getTime() / 1000);
var metric_name = "gcp.monthly_cost";
// post to mackerel
var request = require('request');
var options = {
uri: "https://mackerel.io/api/v0/services/" + process.env.SERVICE_NAME + "/tsdb",
headers: {
"X-Api-Key": process.env.MACKEREL_API_KEY,
"Content-Type": "application/json",
},
json: [{
"name": metric_name,
"time": seconds,
"value": monthly_cost
}]
};
request.post(options, function(error, response, body){});
});
- APIキーやプロジェクト名などのシークレットや環境によって異なる部分は環境変数から読み込むようにした
- timeはエポックタイムである必要があるのでgetTimeで取得し、秒に直すために1000で割っている
- MackefelへのポストはrequestというHTTPクライアントライブラリを使用した
実行してみる
まず環境変数の準備。
export MACKEREL_API_KEY="XXXXXXXX"
export GCP_PROJECT_ID="プロジェクトID"
export GCP_KEY_FILE_NAME="jsonキーのpath(フルパス)"
export TABLE_NAME="Billingデータのテーブル名"
export SERVICE_NAME="Mackerelのサービス名"
実行!
node ./gcp-billing.js
投稿された!✨
感想
次はGoogle Cloud Functionsで動かしてみようと思います。(๑•̀ㅂ•́)و✧
JavaScriptよくわかってないので雰囲気で書いたけどもっとクエリ取得する部分とMackerelに投稿する部分を分けたりしたい…。コールバック関数がまだよくわかっておらず切り出せなかった。