yet-another-cloudwatch-exporter と CloudWatch, Prometheus の間の関係を調べたので備忘録として
yet-another-cloudwatch-exporter の概要
prometheus-community/yet-another-cloudwatch-exporter は CloudWatch メトリクスを取得する Exporter です
(以下、yet-another-cloudwatch-exporter を YACE と略記します)
弊社では当時の他の選択肢よりも API コールを少なくしてコストを削減できるため導入した経緯があります
しかしながら、Prometheus から YACE を参照する場合には時間に関するオプションに注意する必要があります
なお YACE は Auto-discovery なメトリクス (discovery: で指定した job ) で GetMetricData API を使用します
この記事では上記の GetMetricData API を使ったデータ取得を前提としています
config
YACE では以下のように config を設定しメトリクスを取得します1
apiVersion: v1alpha1
sts-region: eu-west-1
discovery:
exportedTagsOnMetrics:
kafka:
- Name
jobs:
- type: kafka
regions:
- eu-west-1
searchTags:
- key: env
value: dev
metrics:
- name: BytesOutPerSec
statistics:
- Average
period: 600
length: 600
時間に関するオプションは以下です
-
period: メトリクスの取得期間 -
length: 要求する時間長
なお delay を指定すると要求する終了時刻を過去にずらし、集計後の正確な値を取得できるとされています2
length, delay を変数とみなして実際に実行される get-metric-data CLI を書くと以下のようになります
aws cloudwatch get-metric-data \
-- start-time $(date -u -d "$end_time - ${length} seconds" +"%Y-%m-%dT%H:%M:%SZ") \
-- end-time $(date -u -d "$now - ${delay} seconds" +"%Y-%m-%dT%H:%M:%SZ")
また、コマンドでの時間に関するオプションは以下です
-
-scraping-interval: YACE がメトリクスを取得する API コールをする間隔
このオプションのデフォルトが 300s であり、他の設定値と揃えれば整合性に悩む必要はないですがコストが増加する場合があります
今回は -scraping-interval が period より長いときにどのような不都合があるか確認しておきます
実際の取得タイムライン
以下のような job を想定します
jobs:
- type: AWS/ApplicationELB
metrics:
- name: RequestCount
statistics:
- Sum
period: 60
length: 600
以上の設定を interval 60s でスクレイプする Prometheus と併せてタイムラインに表示すると下図のようになります
各ツール上でのデータ
YACE では delay の時間よりも過去のデータポイントをメトリクスとして保持します
(addCloudwatchTimestamp は今回考慮しない)
下図では実際に取得する CloudWatch メトリクスを仮に2分前としています
YACE の interval が 5m の場合、問い合わせに対しては同じ値を5分間返し続けます
Prometheus の interval が 1m だと同じ値を5回取得することになります
統計が Average のメトリクスでは大きな問題になりませんが、統計が Sum 等のメトリクスでは精度が著しく落ちる場合があります
じゃあどうするか
確かに -scraping-interval 60 とすれば 理想的には 欠損がなく、正確に近いデータを期待できます
一方で、CloudWatch の API コールの費用が無視できない額になる可能性があります
メトリクスの利用目的 (Alertmanager, Grafana etc.) に応じて時間に関する設定値を調整するとよいでしょう
今回は時間に関する設定値を統一しない場合の挙動を整理しました
免責事項
- この記事の内容は個人の見解であり、所属する組織の意見を代表するものではありません。
