0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Grafana+Opentelemetry-Collectorでdockerログをキャプチャする方法

Last updated at Posted at 2025-11-25

この記事について

Docker Desktopのログと同じような使い勝手で
Dockerのログをキャプチャしたい場合がある(とくに、ログがjson形式の場合)

今回は、Grafana+Opentelemetry-Collectorの組み合わせでdockerログをキャプチャする方法を示す

前提

WSL2+docker環境がセットアップされている前提とする。セットアップ手順は下記参照。

今回利用するdocker

Opentelemetry-Collector(k8s)でログをキャプチャし、LGTMスタックにログを保存・表示する。

ただし、Docker=>Opentelemetry-Collectorの経路ではotlpプロトコルを利用できないので、
代わりにfluentforwardプロトコルを利用する。

dockerの定義

先に監視サービス用composeを起動し、その後にアプリcomposeを起動すること。

監視サービス用compose

compose.yml
services:
  receiver:
    image:  otel/opentelemetry-collector-k8s:0.140.1
    command: ["--config=/etc/otel/config.yaml"]
    restart: always
    tty: true
    configs:
      - source: collector
        target: /etc/otel/config.yaml
    ports:
      - "24224:24224"
  lgtm:
    image: grafana/otel-lgtm:latest
    container_name: lgtm
    restart: always
    tty: true
    ports:
      - "4317:4317"
      - "4318:4318"
      - "3000:3000"

configs:
  fluent:
    file: ./fluent-bit.yaml
collector.yaml
receivers:
  fluentforward:
    endpoint: 0.0.0.0:24224
processors:
  batch:
  transform:
    error_mode: ignore
    log_statements:
      - set(resource.attributes["container.name"], log.attributes["container_name"])
      - set(resource.attributes["service.name"], "otelcol-docker")
exporters:
  otlp:
    endpoint: http://lgtm:4317
    tls:
      insecure: true
  debug:
    verbosity: detailed

service:
  pipelines:
    logs:
      receivers: [fluentforward]
      processors: [transform, batch]
      exporters: [debug, otlp]
fluent-bitの場合、Opentelemetry-Collectorを下記に読みかえる(クリックして展開)
compose.yaml
  fluentbit:
    image: fluent/fluent-bit:4.2
    command: ["-c", "/fluent-bit/etc/fluent-bit.yaml"]
  restart: always
  tty: true
  configs:
    - source: fluent
      target: /fluent-bit/etc/fluent-bit.yaml
  ports:
    - "24224:24224"
configs:
  fluent:
    file: ./fluent-bit.yaml
fluent-bit.yaml
service:
    log_level: info

parsers:
  - name: docker
    format: json
    time_key: time
    time_format: "%Y-%m-%dT%H:%M:%S.%L"
    time_keep: true

pipeline:
  inputs:
    - name: forward
      listen: 0.0.0.0
      port: 24224
      buffer_chunk_size: 1M
      buffer_max_size: 6M
      processors:
        logs:
          - name: opentelemetry_envelope
          - name: content_modifier
            context: otel_resource_attributes
            action: insert
            key: "service.name"
            value: "fluent-bit-docker"

  outputs:
    - name : stdout
      match: '*'

    - name: opentelemetry
      match: "*"
      host: lgtm
      port: 4318
      metrics_uri: /v1/metrics
      logs_uri: /v1/logs
      traces_uri: /v1/traces
      log_response_payload: true
      tls: off
      #tls.verify: off
      logs_body_key: $message
      #logs_body_key: log
      #logs_span_id_message_key: span_id
      #logs_trace_id_message_key: trace_id
      logs_severity_text_message_key: level
      #logs_severity_number_message_key: lognumservice:
    log_level: info

parsers:
  - name: docker
    format: json
    time_key: time
    time_format: "%Y-%m-%dT%H:%M:%S.%L"
    time_keep: true

pipeline:
  inputs:
    - name: forward
      listen: 0.0.0.0
      port: 24224
      buffer_chunk_size: 1M
      buffer_max_size: 6M
      processors:
        logs:
          - name: opentelemetry_envelope
          - name: content_modifier
            context: otel_resource_attributes
            action: insert
            key: "service.name"
            value: "fluent-bit-docker"

  outputs:
    - name : stdout
      match: '*'

    - name: opentelemetry
      match: "*"
      host: lgtm
      port: 4318
      metrics_uri: /v1/metrics
      logs_uri: /v1/logs
      traces_uri: /v1/traces
      log_response_payload: true
      tls: off
      #tls.verify: off
      logs_body_key: $message
      #logs_body_key: log
      #logs_span_id_message_key: span_id
      #logs_trace_id_message_key: trace_id
      logs_severity_text_message_key: level
      #logs_severity_number_message_key: lognum

アプリ用compose

compose.yml
  services:
    echo:
      # 実際に利用するアプリに読み替えてください。
      image: hashicorp/http-echo
      command: ["-listen=:8080", "-text=hello world"]
      ports:
      - "8080:8080"
      # ★ログの監視用設定
      logging:
        driver: "fluentd"
        options:
          fluentd-address: localhost:24224

実行

docker-compose up -d

表示例

service.namecontainer.nameなどのリソース属性がインデックス付けされ、一致条件でログ検索できるようになる。

image.png

参考情報

(送信側) Fluentd logging driver の説明

(受信側) fluentforwardreceiver の説明

Transform Processorの使用方法(JSONログ項目をリソース属性に変換)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?