- 学習目的でfluentd検証環境をローカルにDocker を使用して作成した。備忘録としてメモしておく。
コード
- FastAPI製テスト用APIへのアクセスログをfluentdで収集する。
構成
project - app - api - main.py
|_ Dockerfile
|_ requirements.txt
- fluentd - config - fluent.conf
|_ tmp
- docker-compose.yml
docker-compose.yml
- テスト用APIコンテナとfluentdコンテナの起動設定
version: "3.5"
networks:
container-link:
name: docker.internal
services:
app:
container_name: "app"
build: ./app
volumes:
- ./app/api:/usr/src/server
logging:
# ログ出力先にfluentdを指定
driver: "fluentd"
options:
# fluentdサーバの宛先
fluentd-address: "localhost:24220"
# ログに付与するタグ
tag: "docker.{{.Name}}"
ports:
- "8000:8000"
networks:
- container-link
fluentd:
image: fluent/fluentd:latest
container_name: "fluentd"
ports:
- "24220:24220"
- "24220:24220/udp"
environment:
- 'FLUENTD_CONF=fluent.conf'
volumes:
- ./fluentd/tmp:/fluentd/log
- ./fluentd/config:/fluentd/etc
networks:
- container-link
fluentdコンテナ
fluent.conf
- fluentd設定ファイル
-
<source>
:ログの待ち受け先を指定。今回の場合は24220番ポートを指定。 -
<match>
:ログの出力先を指定。今回の場合は標準出力(コンテナログ)を指定。
<source>
@type forward
port 24220
</source>
<match docker.**>
@type stdout
</match>
テスト用APIコンテナ
Dockerfile
- Python3.8イメージを基に依存ライブラリインストールとFastAPIアプリ起動用設定を記述
FROM python:3.8
WORKDIR /usr/src/server
ADD requirements.txt .
RUN pip install -r requirements.txt
# uvicornのオプションに--reloadを付与し、
# main.pyの編集と同時に変更内容を反映させる。
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]
requirements.txt
- 依存ライブラリ設定
fastapi
uvicorn
main.py
- パスパラメータに指定したユーザーIDをそのまま返却するテスト用API
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/v1/users/{user_id}")
def users(user_id):
user = {
"user_id":user_id
}
return user
if __name__ == "__main__":
uvicorn.run(app, port=8000, loop="asyncio")
動作確認
起動
docker-compose up
リクエスト・レスポンス
GET /v1/users/12345 HTTP/1.1
Host: localhost:8000
{
"user_id": "12345"
}
ログ出力
fluentd | 2022-04-17 03:45:44.000000000 +0000 docker.app: {"container_id":"90f01401bb27c886a9fedc956978af3fd2775cde97176371feccc7da13eaa737","container_name":"/app","source":"stdout","log":"INFO: 172.21.0.1:59200 - \"GET /v1/users/12345 HTTP/1.1\" 200 OK"}