PrometheusでCloudWatchメトリックを取得したときのコスト問題
久しぶりの投稿です。
CloudWatch用のPrometheus Exporterとして Officialなcloudwatch_exporter や golang実装のcloudwatch_exporter がありますが、それとは別の yet-another-cloudwatch-exporter について書こうかと思います。
弊社でも当初はgolang版でRDSやAuroraのメトリックを取得していたらCloudWatchの料金が高額になってしまいました。。。
Amazon CloudWatch の料金
CloudWatch APIの課金体系はAPIリクエスト数によるものなので、AWS RDSのメトリック全部(25個ぐらい)を5分おきに取得した場合、1つのInstanceで月額2USD程度なので微々たるものです。
が、台数が増えたりCloudFrontなども取得するようにした場合にメトリックの数だけ課金が増えていきます(この時点で気づけばよかった・・・)。
案の定、翌月に請求額でビビった次第です。
CloudWatchでメトリックを取得するAPIには GetMetricStatistics と GetMetricData があり、GetMetricStatisticsは1度に1つのメトリックしか取得できませんが、GetMetricDataは1度に最大500コのメトリックを取得できます。
で、前述の cloudwatch_exporter は GetMetricStatistics を使用しているため、取得するメトリック・対象Instanceが増えるとCloudWatch API数も増えていきます(当然ですが・・・)。
yes-another-cloudwatch-exporterについて
前述が長くなりましたが、そこで弊社では yet-another-cloudwatch-exporter(後述YACE) へ置き換えることでコストを削減させています。
ivx/yet-another-cloudwatch-exporter
Improving the Prometheus exporter for Amazon CloudWatch
####YACEの良い点
-
GetMetricData で複数のメトリックを1度のAPIコールで取得してくれる
-
exporter内でDimensionを取得してGetMetricDataを実行してくれるので設定ファイルがシンプル
discovery:
exportedTagsOnMetrics:
ec2:
- Name
ebs:
- VolumeId
jobs:
- type: es
regions:
- eu-west-1
searchTags:
- Key: type
Value: ^(easteregg|k8s)$
metrics:
- name: FreeStorageSpace
statistics:
- Sum
period: 600
length: 60
-
Prometheusからのscrapeによりメトリックを取得するのではなくProxyとして動作するため、Prometheus側で30秒おきとしても直近に取得(デフォルトでは5分おきにYACEがメトリックを取得する)したものを返す
-
クロスアカウントに対応しており、1つのNamespaceに対して複数のアカウント分の設定ができる
jobs:
- type: ecs-svc
regions:
- eu-north-1
roleArns:
- "arn:aws:iam::111111111111:role/prometheus" # newspaper
- "arn:aws:iam:2222222222222:role/prometheus" # radio
- "arn:aws:iam:3333333333333:role/prometheus" # television
metrics:
- name: MemoryReservation
statistics:
- Average
- Minimum
- Maximum
period: 600
length: 600
YACEのおかげでAPI数が大幅に減らすことができ、コストも半分以下にまで下げることができました。
おわりに
現時点ではNamespaceに制限があるため、すべてのサービスのメトリックが取得できないようです。
また、GetMetricDataを使用しているのは Auto-discovery のJobだけで Static のJobではGetMetricStatisticsが使用されるので注意が必要です。
CloudWatchのコスト増・APIスロットリングでお悩みの場合に選択肢の1つとしてアリかと思います。