こんにちは。X(クロス)イノベーション本部クラウドイノベーションセンターの柴田です。
本記事ではDatadog Logsにてホストタグが継承されない問題の原因と解決方法をご紹介します。
発生した問題
Amazon EKSクラスタ&マネージド型ノードグループを構築し、その上のPodのログをDatadog Logsで収集・管理していました。
あるとき一部のログに AWS Integration 関連のタグ( region 、 availability-zone 、 autoscaling_group 、EC2インスタンスのタグなど)が付与されていないことがわかりました。
以下は期待通り先述のタグが付与されたログ(以降は正常なログと呼称)です。
{"msg":"structured log without host attribute"}

以下は期待に反して先述のタグが付与されなかったログ(以降は問題のあったログと呼称)です。
正常なログと比べてタグの件数が少ないことがわかります。
{"msg":"structured log with host attribute","host":"localhost"}

原因
先述の問題の原因は、問題のあったログの host 属性が誤って設定されたせいでした。
ログの host 属性について
Datadogの公式ドキュメント ではログの host 属性について以下のように説明しています。
メトリクスで定義された送信元ホストの名前。Datadog で一致したホストから、対応するホストタグが自動的に取得され、ログに適用されます。Agent では、この値が自動的に設定されます。
正常なログの場合
正常なログの host 属性の値はマネージド型ノードグループのEC2インスタンスのインスタンスIDです。
そのため一致したホストのホストタグがログに適用されます。


問題のあったログの場合
一方、問題のあったログの host 属性の値は localhost です。
Datadog上には localhost に一致するホストが存在しなかったため、ホストタグの継承が行われませんでした。

なぜログの host 属性の値はインスタンスIDではなく localhost だったのでしょうか?
Datadog Logsの Pipeline の Preprocessing for JSON logs は以下のとおり設定されています。
そのため、ログが
hosthostnamesyslog.hostname
のいずれかの属性を含む構造化ログの場合、その値がログの host 属性として設定されます。

問題のあったログは host 属性を含む構造化ログでした。
そのため、ログの host 属性の値がインスタンスIDから localhost へ上書きされていました。
解決方法
先述の問題はログの host 属性をDatadog上のホストと一致するように設定することで解決できます。
具体的には2つの方法が挙げられます。
- Pipeline の Preprocessing for JSON logs の Host attributes から問題となっている構造化ログの属性(
host)を削除する。 - ログから問題となっている構造化ログの属性(
host)のキーをリネームまたは削除する。
前者の方法はDatadog Organization全体に影響を及ぼすため、今回は後者の方法を採用しました。
その結果、問題のあったログに対して、期待通りAWS Integration関連のタグが付与されるようになりました。

おわりに
本記事ではDatadog Logsにてホストタグが継承されない問題の原因と解決方法をご紹介しました。
最後までお読みいただき、ありがとうございました。
私たちは一緒に働いてくれる仲間を募集しています!
クラウドアーキテクト執筆:@shibata.takao、レビュー:@yamada.y
(Shodoで執筆されました)



