CloudWatch Logs Insights のクエリメモ

blog.hatappi.me

1ヶ月前くらいに CloudWatch Container Insights をいれて k8s 内の pod のメトリクスを収集していたのですが、ダッシュボードを作成していなかったので作成してました。

ダッシュボードの作成に必要そうな Service に対する CPU 使用率とかメモリ使用率は集計されていて特に何もしなくてもグラフにできる。
ただ pod 単位でどれくらいメモリ使ってるとかを見たい時は自分でログから探す必要がある。

そんな時に使えるのが CloudWatch Logs Insights
これを使うと Amazon CloudWatch Logs のログデータをインタラクティブに検索できるので便利っぽい

ただクエリの書き方とかに馴染みがなかったのでメモ程度にこの記事を書いていこうと思います。

クエリの構文はこちら

まずはじめに

インサイトの画面を開くと↓のような画面が開きますが、まずはロググループを選択します。

f:id:hatappi1225:20190824223147p:plain

おそらく /aws/containerinsights/{クラスター名}/performance とかで作成されています。

いろんなクエリ

指定されたサービスにいくつのpodが起動しているか

fields @timestamp, service_number_of_running_pods
| filter Type = "ClusterService"
| filter Namespace = "hoge_ns"
| filter Service = "hoge_serv"

こんな感じで時系列で起動数を見ることができる。

f:id:hatappi1225:20190824223936p:plain

ただこれだとちょっとわかりにくいので視覚的にみたくなると思います。
そんな時は次のようなクエリにすることでグラフにして見ることができます。

fields @timestamp, service_number_of_running_pods
| filter Type = "ClusterService"
| filter Namespace = "hoge_ns"
| filter Service = "hoge_serv"
| stats avg(service_number_of_running_pods) by bin(5m)

これで 5分ごとデータを区切ってそれらの平均をとったものを見ることができる

指定されたNamespace配下のpodのメモリ使用量をみてみる

fields @timestamp, kubernetes.pod_name, pod_memory_usage
| filter Type = "Pod"
| filter Namespace = "hoge_ns"

単位はバイトかな?

例えばこのクエリを見るとやりたくなるのが、 pod 単位でグルーピングしてさきほどのように視覚的なグラフを見たいとします。

fields @timestamp, kubernetes.pod_name, pod_memory_usage
| filter Type = "Pod"
| filter Namespace = "hoge_ns"
| stats avg(pod_memory_usage) by bin(5m), kubernetes.pod_name

こんな感じのクエリを考えると思うのですがこれはログとしては正しく 5分区切りかつ pod でグルーピングしたものを集計したものを出してくれる。

ただ。。。。。。
視覚的には出すことができない。
ドキュメントのよくある間違いにも書いてある。

docs.aws.amazon.com