OpenTelemetry Collectorでログファイルの更新を取り込む

Hi, この記事は OpenTelemetry Advent Calendar 2022、1日目の記事です!

OpenTelemetryコミュニティでは様々なテレメトリデータの取り扱いについて議論されており、ログの扱いについても例外ではありません。 最新状況は公式ブログでのロードマップ情報に譲るとして、 OpenTelemetry Collectorのレシーバーを眺めていると、File Log Receiverというものがあるらしいので、ちょっと動かしてみました。

otel collector config

設定はシンプルに、ファイルの更新を検知して、外部に送る感じにします。

  1. レシーバーとして/var/log/myservice/ ディレクトリにあるjsonファイルをすべてtailする指定をします。
  2. わかりやすさのため、 deployment.environment=hello-otel-log となる属性を追加します。
  3. それを splunk_hec エクスポーターを使って外部(Splunk Log Observer)に送ります。
receivers:
  filelog/myservice:
    include: [ /var/log/myservice/*.json ]
    operators:
      - type: json_parser
        timestamp:
          parse_from: attributes.time
          layout: '%Y-%m-%d %H:%M:%S'

exporters:
  splunk_hec:
    token: "${SPLUNK_HEC_TOKEN}"
    endpoint: "${SPLUNK_HEC_URL}"
    source: "otel"
    sourcetype: "otel"

processors:
  batch:
  resource/environment:
    attributes:
    - key: deployment.environment
      action: insert
      value: hello-otel-log

service:
  pipelines:
    logs:
      receivers: [filelog/myservice]
      processors: [batch, resource/environment]
      exporters: [splunk_hec]

ログを出してみる

シンプルに、echoコマンドでログを出してみます。こんな感じ:

echo '{"time": "2022-12-01 12:34:57", "message": "otel log!"}' >> /var/log/myservice/hoge.json 

すると、otel collectorのログにはファイルを見始めた旨のログが吐かれています

info        fileconsumer/file.go:161        Started watching file from end. To read preexisting logs, configure the argument 'start_at' to 'beginning'        {"kind": "receiver", "name": "filelog/myservice", "pipeline": "logs", "component": "fileconsumer", "path": "/var/log/myservice/hoge.json"}

そして、Splunk Log Observerを開くと、いい感じにログが取り込まれている様子がわかります。

ログが取り込まれている様子

もちろん、Splunk以外にも、ログに対応したエクスポーターであれば何でも動きます。 公式ドキュメントのレジストリや、 GitHubリポジトリ https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter を眺めてみてください!

この記事は OpenTelemetry Advent Calendar 2022、1日目の記事でした。明日は @ymotongpooです!