RDS
CloudWatchLogs

RDS Enhanced MonitoringのメトリックをBashだけでCloudWatch Logs → Elasticsearchにログをぶん投げるスクリプト

「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)

image.png

メトリック一覧

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