Amazon SQSのメッセージの古さをAmazon CloudWatchで監視出来るようになりました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

メッセージキュー好きの皆様、こんにちは。

2016/08/31からAmazonのメッセージングサービス Simple Queue Service(SQS)において、削除されていない最も古いメッセージの古さを Amazon CloudWatch のメトリクスで監視出来るようになりました。

ApproximateAgeOfOldestMessage の意味

今回の追加された CloudWatch の SQS 向けメトリクス ApproximateAgeOfOldestMessage は、Amazon SQS キューにある削除されていない最も古いメッセージのおおよそ(Approximate)の古さを秒で表したものです。

メトリクス ApproximateAgeOfOldestMessage が 0 に近い場合、キューイングされたメッセージがほぼリアルタイムで処理されていることを意味します。

このメトリクスがある程度の大きさである場合、メッセージが溜まっていて、リアルタイムでは処理しきれていないことを意味します。

このメトリクスが漸増する場合、コンシューマーの処理が止まっている、あるいは、コンシューマーの処理が追いついていないといったことが考えられます。

Amazon Kinesis Streams とのアナロジー

リアルタイムストリーミングサービスの Amazon Kinesis には GetRecords.IteratorAgeMilliseconds というメトリクスが存在し、SQS の ApproximateAgeOfOldestMessage と同等の意味を持ちます。

使ってみる

利用に当たって

このCloudWatchメトリクスを利用するにあたって、特別な設定は不要です。 ただし、SQS キューから少なくとも一度はメッセージを取得しないと、CloudWatch 画面にこのメトリクスが登録されないようです。

CloudWatchのメトリクス一覧

SQS向けメトリクス一覧に「ApproximateAgeOfOldestMessage」が追加されているのがわかります。

aws-sqs-cloudwatch-metrics-list

メトリクスの推移

SQS キューにメッセージを出し入れすると、「ApproximateAgeOfOldestMessage」は次の様なグラフになりました。

aws-sqs-cloudwatch-app-age-graph

Y軸の単位は秒です。たとえば、600とあれば、600秒=10分です。

アラーム通知

ApproximateAgeOfOldestMessageはCloudWatch の1メトリクスのため、アラームとの相性も良いです。

ApproximateAgeOfOldestMessage向けのアラーム例です。

aws-sqs-cloudwatch-alarm-settings

Namespace : AWS/SQS, Metric Name: ApproximateAgeOfOldMessageを選択します。

5分間(Period)の最大値(Statistic)が3回連続(Consecutive Periods)で600以上になると、イベントを発火するように設定しています。

アラートをEC2 AuroscalingやECSと連携させれば、コンシューマーにより多くのメッセージを処理させることもできますね。

AWS CLI から操作

AWS CLI からは、いつもの様に get-metric-statistics API を使います。

$ aws cloudwatch get-metric-statistics \
  --metric-name  ApproximateAgeOfOldestMessage \
  --start-time 2016-09-06T18:00:00 \
  --end-time 2016-09-06T18:30:00 \
  --period 60 \
  --namespace AWS/SQS \
  --statistics Maximum \
  --dimensions Name=QueueName,Value=test-age
{
    "Datapoints": [
        {
            "Timestamp": "2016-09-06T18:20:00Z",
            "Maximum": 310.0,
            "Unit": "Seconds"
        },
        {
            "Timestamp": "2016-09-06T18:15:00Z",
            "Maximum": 449.0,
            "Unit": "Seconds"
        },
        {
            "Timestamp": "2016-09-06T18:10:00Z",
            "Maximum": 152.0,
            "Unit": "Seconds"
        },
        {
            "Timestamp": "2016-09-06T18:05:00Z",
            "Maximum": 0.0,
            "Unit": "Seconds"
        },
        {
            "Timestamp": "2016-09-06T18:25:00Z",
            "Maximum": 0.0,
            "Unit": "Seconds"
        }
    ],
    "Label": "ApproximateAgeOfOldestMessage"
}

まとめ

SQS のCloudWatchに追加された、地味だけと便利なメトリクスApproximateAgeOfOldestMessageについて紹介しました。 これまでは、メッセージ数などを基準にしたアクションしか取れませんでしたが、今後は、未処理状態のメッセージの古さを基準にしたアクションも取れるようになりました。

今までなかったのが不思議な位、応用範囲が広いメトリクスです。

ぜひ、ご活用下さい。

参考