DynamoDBのCapacityUnitsの実際の使用量を割合で出力する
この記事の続き備忘録です。割合で出力したはいいものの、特にその後有効利用していなかったので、ちょっとした処理を加えて監視アプリっぽくしてみました。
ゴール
- 閾値を設定できる様にする
- 閾値をある一定回数連続でオーバーしたら処理を行える様にする
閾値を設定できる様にする
以下のソースを元に編集していきます。
閾値は環境変数で設定
閾値は環境変数で設定してLambda関数毎に変更が容易にします。
serverless.ymlをこんな感じで更新します。
serverless.yml
functions:
run:
handler: handler.run
environment:
THRESHOLD_VALUE: 0.5
THRESHOLD_TIME: 5
デフォルトでは5回連続で0.5(50%)の閾値を超えた場合に処理を行う様に設定しておきます。これでいつでも閾値利用することができる様になりました。
閾値をある一定回数連続でオーバーしたら処理を行える様にする
もともと取得したメトリクスから、Datapointsを整列して出していただけのoutput_metricsとは別に、連続して閾値を超えたかどうかの判定を行うメソッドを作成します。
処理はoutput_metricsと途中まで一緒ですが、ただ結果を出力しているところで閾値を連続で超えたかどうか判定しています。
def is_over_time(target_metric, provisioned_cap):
is_over_time_num = 0
result = False
sort_datapoints = sorted(target_metric['Datapoints'], key=lambda x: x['Timestamp'])
for data in sort_datapoints:
if float(round(data['Average']) / provisioned_cap) > float(LIMIT_VAL):
is_over_time_num += 1
else:
is_over_time_num = 0
if is_over_time_num >= int(LIMIT_NUM):
result = True
return result
これで閾値を超えた回数が設定した回数(デフォルト5回)をに達したらエラーとして判定できるようになりました。
問題ない場合はこんな感じでFalse
を返してくれます。
ProvisionedReadCapacityUnits: 3
ConsumedReadCapacityUnits result:
2018-04-17 11:35:00+00:00 0.5 0.17
2018-04-17 11:40:00+00:00 1.11 0.37
2018-04-17 11:45:00+00:00 2.0 0.67
2018-04-17 11:50:00+00:00 1.97 0.66
over: False
ProvisionedWriteCapacityUnits: 3
ConsumedWriteCapacityUnits result:
2018-04-17 11:35:00+00:00 1.0 0.33
2018-04-17 11:40:00+00:00 1.0 0.33
2018-04-17 11:45:00+00:00 1.0 0.33
2018-04-17 11:50:00+00:00 1.0 0.33
over: False
問題がある場合はoverがTrue
となって表示されます。しばらくデータの読み書きを行なっていたところ、読み込みが設定回数をオーバーしたため、読み込み側だけoverがTrue
になりました。
ProvisionedReadCapacityUnits: 3
ConsumedReadCapacityUnits result:
2018-04-17 11:35:00+00:00 0.5 0.17
2018-04-17 11:40:00+00:00 1.11 0.37
2018-04-17 11:45:00+00:00 2.0 0.67
2018-04-17 11:50:00+00:00 1.94 0.65
2018-04-17 11:55:00+00:00 1.98 0.66
2018-04-17 12:00:00+00:00 1.95 0.65
2018-04-17 12:05:00+00:00 1.98 0.66
2018-04-17 12:10:00+00:00 1.96 0.65
over: True
ProvisionedWriteCapacityUnits: 3
ConsumedWriteCapacityUnits result:
2018-04-17 11:35:00+00:00 1.0 0.33
2018-04-17 11:40:00+00:00 1.0 0.33
2018-04-17 11:45:00+00:00 1.0 0.33
2018-04-17 11:50:00+00:00 1.0 0.33
2018-04-17 11:55:00+00:00 1.0 0.33
2018-04-17 12:00:00+00:00 1.0 0.33
2018-04-17 12:05:00+00:00 1.0 0.33
2018-04-17 12:10:00+00:00 1.0 0.33
over: False
ここまでの成果物
まとめ
誰か使った人がいたら、フィードバックもらえると助かります。(まだ作っただけ)