「RDSのEnhanced Monitoring入れたけど、常時メトリックをESに書き込むのもなー。なんか問題あったときだけでいいんだよねー」というときがあると思います。というかありました。
通常なら、CloudWatch Logs -> Lambda -> ESSという手法をとるのですが、Lambda準備するのめんどくさい、ESSで必要なときだけESSインスタンス作って見たいという時向けのスクリプトです。
自分のPCからCloudWatch Logsのメトリクスデータとってきて、curlでESSに投げるという簡単なものです。
bulk APIを使っておらず、1件1件叩いています。
$ aws logs get-log-events --log-group-name RDSOSMetrics --log-stream-name [db-AAAAA...] --start-time [unix time mills] --end-time [unix time mills] \
| jq '.events[].message|fromjson' -c \
| while read line; do curl -s -XPOST https://[ESS Endpoint]/metrics/aurora -d "${line}" > /dev/null; done
INDEX名(metrics)・TYPE名(aurora)は適当につけてるので、必要であれば変更してください。
Tips
割りと自分用
Q. jqじゃなくてawscliのqueryは?
A. --output text
でタブ区切りになるので、while read効かなくなる
Q. for文は?
A. 残念ながら途中で空白が入った文字列が入ってきてしまうので、そこでJSONが切られます(エラー
Q. xargsは?
A. ダブルクォート消されるのでダメ(こんな感じになります)
$ aws logs get-log-events --log-group-name RDSOSMetrics --log-stream-name db-1234567890ABCDEFGHIJKLMNOP --limit 1 | jq '.events[].message|fromjson' -c | xargs echo
{engine:Aurora,instanceID:hoge,instanceResourceID:db-1234567890ABCDEFGHIJKLMNOP,timestamp:2017-08-14T08:04:48Z,version:1, ...
Q. Kibanaに入れた後どうするの?
A. Timelionで可視化しましょう。
例:
.es(index=metrics, timefield=timestamp, metric=avg:diskIO.readIOsPS)
メトリック一覧
cpuUtilization
guest
idle
irq
nice
steal
system
total
user
wait
diskIO
diskQueueDepth
readIOsPS
readLatency
readThroughput
writeIOsPS
writeLatency
writeThroughput
fileSys
maxFiles
mountPoint
name
total
used
usedFilePercent
usedFiles
usedPercent
memory
active
buffers
cached
dirty
free
hugePagesFree
hugePagesRsvd
hugePagesSize
hugePagesSurp
hugePagesTotal
inactive
mapped
pageTables
slab
total
loadAverageMinute
fifteen
five
one
network
interface
rx
tx
numVCPUs
swap
cached
free
total
tasks
blocked
running
sleeping
stopped
total
zombie