search
LoginSignup
4

More than 5 years have passed since last update.

posted at

updated at

[blackbird-dynamodb] Monitoring AWS DynamoDB

このプラグインではDynamoDBの各種Metricを取得します。

What metric does it get?

各TableにおけるMetricsと各APIにおけるResponse timeが取得できます。

Table Metrics

まずは各TableのMetricsから。下表のStatisticsはどんな計算式で取得するか(Sumで単位時間あたりの合計値、Avgで単位時間あたりの平均のような)を示しています。

Metric Name Statistics Detail
UserErrors Sum Clientのエラー
SystemErros Sum AWS側のエラー(ほとんどないでしょう、と思いたいですね)
ThrottleRequests Sum Provisioned Capacity Unitsの上限に達してしまってThrottledなRequestの数
ReadThrottleEvents Sum Provisioned Capacity Unitsの上限に達したRead系リクエスト
WriteThrottleEvents Sum Provisioned Capacity Unitsの上限に達したWrite系リクエスト
ProvisionedReadCapacityUnits Maximum Tableに指定されているProvisionedReadCapacityUnitsの数
ProvisionedWriteCapacityUnits Maximum Tableに指定されているProvisionedWriteCapacityUnitsの数
ConsumedReadCapacityUnits Maximum 消費したReadCapacityUnitsの数の単位時間あたりの最大値
ConsumedReadCapacityUnits Average 消費したReadCapacityUnitsの数の単位時間あたりの平均値
ConsumedWriteCapacityUnits Maximum 消費したWriteCapacityUnitsの数の単位時間あたりの最大値
ConsumedWriteCapacityUnits Average 消費したWriteCapacityUnitsの数の単位時間あたりの平均値

about UserErrors

UserErrorsとざっくり言われても感じだと思うんですが、SDK側でDynamoDB呼び出してるところのエラーです。具体的には4XX系のStatusCodeが返ってきたときですね。

  • 認証エラー
  • パラメータ足りてない(Hash KeyもしくはRange QueryでRange Keyの指定がないとか)
  • Provisioned Throghputが足りてない

about Each CapacityUnits

DynamoDBは後ろ側で複数のshardを持った分散DBです。しかし設定するCapacityUnitsはTable全体に対して割り当てられます。shardはCapacityUnitsの大きさに比例して分割、スケールアウトしていくので問題ないと思いがちです。実際スケールアウトとか負荷とか気にしなくていいのはすばらしいところだと思います。

しかし、CapacityUnitsはTableに対して割り当てるので、各shardはその値をshardの数で割り算したものになっちゃいます。ConsumedReadCapacityUnitsが全然上限に達してないのに、LimitExceededExceptionが出てるんですが!!!!ってことが起こりうる可能性があるってことです。

これは(まぁドキュメンテーションちゃんと読めば結構しっかり書いてあるんですが、、、)hash keyの分散があまくてvalueがかたよってhot shardができてしまっているせいです。一度起こってしまうと直すのは結構大変だと思うので、、、ここはできれば設計段階でうまくやりたいですね。

Each Operation Metrics

APIが成功した時のResponseTimeとrange query発行時に返ってきたItemの数が取得できます。たとえばScan APIとか Query APIがあまりにも多くのItemを返しているなら要注意です。(どちらかと言えば先にELBのLatencyとかが悪くなってってそっちで気づきそうですが)

ResponseTimeに関しては以下のものがあり、

  • PutItem
  • DeleteItem
  • UpdateItem
  • GetItem
  • BatchGetItem
  • BatchWriteItem
  • Scan
  • Query

取得したItem数には

  • Scan
  • Query

があります。いずれの値もすべてMaximumとAverageを取得するようにしてあります。

How to Install

すいません!まだpipとRPMを用意してないのでなる早で対応しますね。

Configuration

オプションとしては以下のものがあります。

Key Name Default Require Detail
region_name us-east-1 No AWSのリージョン名です
aws_access_key_id - Yes AWS Acces Key ID
aws_secret_access_key - Yes AWS Secret Access Key
table_name - Yes DynamoDBのTable名です
hostname - Yes Zabbix上のHostnameです(先に作っておくことをオヌヌメ)
module - Yes どのpluginを使用するかなので、ここはdynamodbで固定です
ignore_metrics - No 取得したくないMetricがあればカンマ区切りでかいてくださいまし
ignore_operations - No 取得したくないOperationのMetricがあればカンマ区切りでかいてくださいまし

about ignore_XXXXX parameter

ignore_metricsは取得したくない値がある場合(CloudWatchも一ヶ月の無料枠を越えてAPI Callするとお金かかっちゃうので)、ignore_metrics = UserErrors,ConsumedWriteCapacityUnitsみたいな感じでカンマ区切りでかいてくださいまし。

ignore_operationsも同様で、俺はBatchWriteとScan APIは使ってねえからって方はignore_operations = BatchWriteItem,Scan感じで書いていただけると!

Example

コンフィグファイルのサンプルです

# セクション名はなんでもおkなんですが、内部的には生成されるThreadの名前になるので、他とかぶらない方がいいかもですね。Debug LogにはThread Nameでるということもあって、僕はDynamoDBのTable名にしています。
[ANYTHING_OK]

# AWS Information
region_name = ap-northeast-1
aws_access_key_id = XXXXXXXXXX
aws_secret_access_key = YYYYYYYYYY

# DynamoDBのTable名を記入くだしあ
table_name = YOUR_DYNAMODB_TABLE_NAME

# Zabbix上のHostnameです。zabbix上の制約もあってなかなかこういうサーバに紐付かないのってどうしようか悩むんですが、Table名と同じHostnameを作成して使ってます。
hostname = HOSTNAME_ON_ZBX_SERVER

# dynamodb固定です。
module = dynamodb

こんな感じですかね!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4