最近朝が寒くて布団から出るのがつらい。雨や雪が降っていたら尚更のこと、それならそれで現状を把握する必要がある。 そこで、無料から使える気象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するだけでメトリクスが送られるようになっている。
追記 (2020-12-07): 今はDatadog Forwaderを通して送ることができる。
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などを設定すれば良さそうだ。