この記事について
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.name や container.nameなどのリソース属性がインデックス付けされ、一致条件でログ検索できるようになる。
参考情報
(送信側) Fluentd logging driver の説明
(受信側) fluentforwardreceiver の説明
Transform Processorの使用方法(JSONログ項目をリソース属性に変換)
