使用yet-another-cloudwatch-exporter,以降可削減CloudWatch的成本
当使用Prometheus获取CloudWatch指标时,会遇到成本问题。
好久不见了,我很久没有发布过内容了。
我打算写一个关于另一个名为yet-another-cloudwatch-exporter的CloudWatch的Prometheus Exporter,与官方的cloudwatch_exporter和用golang实现的cloudwatch_exporter不同。
我们公司最初使用golang版来获取RDS和Aurora的指标,但是导致CloudWatch的费用变得非常高。。。
亚马逊云监控的费用
由于云监控API的计费方式是基于API请求数量的,所以如果每隔5分钟获取AWS RDS的全部指标(大约25个),在一个实例上每月只需2美元左右,微不足道。
但是,如果增加实例数量或者获取CloudFront等其他指标,计费将随着指标数量增加而增加(如果我当初意识到这点就好了……)。
果不其然,第二个月收到的账单令人吃惊。
在CloudWatch中,有两个用于获取指标的API,分别是GetMetricStatistics和GetMetricData。其中,GetMetricStatistics一次只能获取一个指标,而GetMetricData一次最多可以获取500个指标。
因此,前面提到的cloudwatch_exporter使用的是GetMetricStatistics,因此当要获取的指标和目标实例增加时,CloudWatch API的数量也会相应增加(当然了…)。
关于yes-another-cloudwatch-exporter
我们之前说了很多,但为了节约成本,我们公司决定使用yet-another-cloudwatch-exporter(以下简称YACE)来取代之前的方案。
提升亚马逊云监控的Prometheus导出工具:ivx/yet-another-cloudwatch-exporter
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数量大幅减少,并且成本降低了一半以上。
最后
目前,由于命名空间的限制,似乎无法获取所有服务的指标。
此外,只有自动发现的作业使用GetMetricData,静态作业使用GetMetricStatistics,因此需要注意。
如果您需要解决CloudWatch成本增加或API限制的问题,可以考虑作为一个选择。