Datadogログコストを削減するためにやった４つのこと

# はじめに
皆さんロギングやモニタリングのツールとして何を使ってますか？
自社ではDatadogを活用しています。ログのみならず、AWSやGCP等から収集したインフラメトリクス、さらにはトレースデータの可視化にも利用しておりシステム運用のツールとして必要不可欠な存在となっています。
ただ一点頭を悩ませている課題として、増加するDatadogコストの最適化がありました。
この記事では、その中でも特にログ周りで取り組んだアクションについて共有できればと思います

# ログコストの課金体系について
[公式ページ](https://www.datadoghq.com/ja/pricing/?product=%E3%83%AD%E3%82%B0%E7%AE%A1%E7%90%86#products)にまとまっていますが、ログ利用に関する課金体系としては大きく2つあります。

1. ログの取り込み
Datadogへingestされる全てのログが対象となります。2024年4月時点で0.13$/GBとなります。
基本的にDatadogへ取り込まれた後でのコスト削減が不可となるため、ログ量を事前に最適化することが必要です。また、Rehydrateを利用したアーカイブログの復元においては、スキャン対象のログ量を減らすなどの工夫が必要です。

1. ログの保管、復元
Datadogへ取り込まれたログの保持に関するコストとなります。保持期間によって金額が異なりますが、いずれも100Mログイベント/月となります。
こちらのコストを抑えるには、インデックス対象のログイベント数を削減するか、保持期間を短くする等の対策が考えられます。

https://www.datadoghq.com/ja/pricing/?product=%E3%83%AD%E3%82%B0%E7%AE%A1%E7%90%86#products

# アクション1: ログ取り込み量の削減
Datadog展開初期においては、取り込み対象のログの精査を行なっておらずアプリケーションから吐き出されるログを全てDatadogへ送っていました。
この構成の場合、アプリケーションがスケールした場合線形的にログ量も増加してしまっていたため、Datadogで可視化が必要なログのみをDatadogへ送るように見直しを行いました。
自社ではログ転送のソフトウェアとしてfluentdを利用しており、application -> fluentd -> Datadogといった経路でDatadogへのログの転送を行っていました。

fluentdにて本番環境におけるdebugレベルのログ等、取り込みが不要なものはDatadogではなくS3等外部ストレージに保管し、本当に必要になった場合のみ取り出す構成へと変更しました。
![datadog_cost.drawio(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/06e01b1f-b8a3-0730-ab63-bcacb8d0d6c5.png)




# アクション2: 環境毎のログ保持期間の見直し
自社ではセキュリティガバナンスを強化するために、本番と開発環境で異なるDatadog organizationを利用していました。
その際、ログの保持期間についてはそれぞれの環境で一律15日間としていましたが、開発環境においては長期間のログの保持が不要と判断し7日間の保持期間へ変更することで保管に関するコストを削減しました。

この点については後述するログのアーカイブ化を併用することで、7日以前のログもDatadog上で復元ができるようになりました。

# アクション3: 不要なログインデックスの削除
必要最低限のログのみDatadogへ転送されていれば、ログイベント数も削減されるため、保管に関わるコストも最適化できるはずかと思います。ただし、Datadogの展開当時はfluentdの設定だけでは開発者によって設定濃度にバラツキがあり、うまくログ保管に関わるコストが最適化できていませんでした。

このような場合でもLog explorerを利用することでログメッセージパターン毎のイベント数の分析を行い、不要なログについては保管対象から除外することとしました。

Search画面Group infoから`patterns`をクリックすると、ログパターン毎のイベント発生件数を調べる事ができます。検索条件として、ログレベルやtag情報等が利用できます。これらの条件で発生頻度が多く、かつ障害調査にもあまり利用されていないログパターンをindexの除外対象として、保管コストを削減しました。

![スクリーンショット 2024-04-17 11.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/9c9b5308-0654-ce8f-6e54-3bafbd81ab24.png)

index除外設定としては、サイドパネルのLogs -> Manage Log Retentionから対象index(デフォルトではmain)の`Add an Exclusion Filter`をクリックします
![スクリーンショット 2024-04-17 12.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/636bb4b1-4651-361e-dd2a-765a8a4e90eb.png)

設定画面から除外対象のログパターンを入力します。また、どの程度の割合を除外するかのパーセンテージ指定も可能です。
![スクリーンショット 2024-04-17 12.05.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110280/b167aeae-a676-4d92-637d-850d7c5462ed.png)


# アクション4: 長期ログのアーカイブ化
保管期限を過ぎたログをDatadogへ復元したい場合Rehydrateを利用する事で可能です。
この機能を利用することで、DatadogへingestされたログをS3やGCS等の外部ストレージに長期保管ができ、必要に応じてそれらのログをDatadogへ復元する事が可能です。

このアーカイブ化されたログはインデックス除外の影響を受けないため、通常時はログの保管を行わないが、障害調査の際にだけ復元したいといったケースにも有効です。

一点ログ復元の際の注意点として、復元対象のログをqueryでフィルタする事が可能ですが、scan対象についてはフィルタが不可（対象archiveの検索対象期間全てのログが対象となってしまう）となります。

例えば単一のアーカイブに全てのシステムのログを集約してしまうと、復元時に単一システムのログが欲しい場合だけでもscanは全てのアーカイブログが対象となってしまいます。
TB単位のscanが発生した場合、復元時のコストも馬鹿にならないので、query条件を定義してログボリュームに応じた複数archiveへ分散させるような設定を行うことを推奨します。

# 削減効果とまとめ
これらの取り組みを継続的に行なった結果、実施前と比較して4-5割程度のログコストを削減することができました。しかし、一時的な対策にならない様に、ログボリュームに関する監視設定を入れる等継続的にコストを抑えられるようにしていきたいと思います。