DatadogのLambda Integrationで気象データを送ってアラートを飛ばす

(2018-02-05)

最近朝が寒くて布団から出るのがつらい。雨や雪が降っていたら尚更のこと、それならそれで現状を把握する必要がある。 そこで、無料から使える気象API OpenWeatherMapのデータをdatadogに送って、特に寒い日や雨雪が降るような朝にはアラートを飛ばすことにした。

インスタンスが立っていたらDataDog AgentのDogStatsD経由で送ることができ、 そうでなければ通常はAPIを呼ぶことになるんだけど、Lambdaでは、AWS Integrationを設定すると有効になるLambda Integrationによって MONITORING|unix_epoch_timestamp|value|metric_type|my.metric.name|#tag1:value,tag2のフォーマットでconsole.logするだけでメトリクスが送られるようになっている。

const axios = require('axios');

const CITY = 'Shibuya';
const API_KEY = '*****';
const WEATHER_API = `http://api.openweathermap.org/data/2.5/weather?q=${CITY}&units=metric&appid=${API_KEY}`;

const METRIC_COUNTER = 'counter';
const METRIC_GAUGE = 'gauge';

const monitor = (metricName, metricType, value, tags) => {
  const unixEpochTimestamp = Math.floor(new Date().getTime());
  console.log(`MONITORING|${unixEpochTimestamp}|${value}|${metricType}|${metricName}|#${tags.join(',')}`);
};

exports.handler = async (event, context, callback) => {
  const data = (await axios.get(WEATHER_API)).data
  const namePrefix = 'livinginfo.weather'
  monitor(`${namePrefix}.temperature`, METRIC_GAUGE, data.main.temp, [])
  monitor(`${namePrefix}.rain`, METRIC_GAUGE, data.rain ? data.rain["3h"] : 0, []);
  monitor(`${namePrefix}.snow`, METRIC_GAUGE, data.snow ? data.snow["3h"] : 0, []);
  callback(null, 'done');
};

送られた。 あとは0度を下回ったときのThreshold Alertや、前日比で下がったときのChange Alertなどを設定すれば良さそうだ。

グラフ