こんにちは。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 は以下のとおり設定されています。
そのため、ログが
host
hostname
syslog.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で執筆されました)