feat(monitoring): 接入 Loki + Promtail 日志采集,Grafana 可直接搜索容器日志

This commit is contained in:
Zhou Weidong authored and trae-solo-agent committed 2026-10-28 10:38:41 +08:00
1 parent 5d139783c9
commit fc9e429187
4 files changed
+135

No files matched your search

+32
View File
@@ -197,9 +197,40 @@ services:
GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin}
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?Grafana 管理员密码必填,见 .env.example} GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?Grafana 管理员密码必填,见 .env.example}
GF_USERS_ALLOW_SIGN_UP: "false" GF_USERS_ALLOW_SIGN_UP: "false"
# 新用户默认界面语言:简体中文
GF_USERS_LANGUAGE: "zh-Hans"
TZ: Asia/Shanghai TZ: Asia/Shanghai
depends_on: depends_on:
- prometheus - prometheus
- loki
# ─────────── 日志(Loki + Promtail)───────────
# Loki:日志存储与查询引擎;Promtail:采集容器 stdout/stderr 推给 Loki。
# Grafana 里通过 Loki 数据源可直接搜索/过滤各容器的请求日志。
loki:
image: grafana/loki:latest
container_name: fruitshorts-loki
restart: unless-stopped
command: -config.file=/etc/loki/local-config.yaml
volumes:
- ./loki-config.yml:/etc/loki/local-config.yaml:ro
- loki-data:/loki
expose:
- "3100"
# 镜像为 distroless(无 shell/wget),无法在容器内做 HTTP 探活;
# 靠 restart: unless-stopped 自动拉起,Grafana 数据源状态可反映可用性。
promtail:
image: grafana/promtail:latest
container_name: fruitshorts-promtail
restart: unless-stopped
command: -config.file=/etc/promtail/config.yml
volumes:
- ./promtail-config.yml:/etc/promtail/config.yml:ro
# 读取容器日志需要 Docker socket
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- loki
# 黑盒探活:从外部探测接口可用性与耗时 # 黑盒探活:从外部探测接口可用性与耗时
blackbox: blackbox:
@@ -227,3 +258,4 @@ volumes:
redis-data: redis-data:
prometheus-data: prometheus-data:
grafana-data: grafana-data:
loki-data:
+14
View File
@@ -0,0 +1,14 @@
# Author: fruit.com.cn
# Grafana 数据源:Loki 日志
apiVersion: 1
datasources:
- name: Loki
uid: loki
type: loki
access: proxy
url: http://loki:3100
isDefault: false
editable: false
jsonData:
maxLines: 1000
+55
View File
@@ -0,0 +1,55 @@
# Author: fruit.com.cn
# Loki 单机配置:文件系统存储,7 天保留,供 Grafana 查询容器日志。
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
instance_addr: 127.0.0.1
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
query_range:
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
# 7 天保留,避免磁盘无限增长
limits_config:
retention_period: 168h
max_query_series: 1000
# 允许采集历史日志(容器启动时的旧日志也能入库),靠 retention_period 控制总量
reject_old_samples: false
ingestion_rate_mb: 20
ingestion_burst_size_mb: 40
per_stream_rate_limit: 10MB
per_stream_rate_limit_burst: 40MB
compactor:
working_directory: /loki/compactor
compaction_interval: 10m
retention_enabled: true
retention_delete_delay: 2h
retention_delete_worker_count: 150
delete_request_store: filesystem
+34
View File
@@ -0,0 +1,34 @@
# Author: fruit.com.cn
# Promtail:通过 Docker 服务发现自动采集所有容器的 stdout/stderr 日志,推送到 Loki。
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
batchwait: 1s
batchsize: 1048576
scrape_configs:
- job_name: docker-containers
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
# 容器名(去掉开头的 /)
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: container
# 日志流:stdout / stderr
- source_labels: ['__meta_docker_container_log_stream']
target_label: stream
# 容器 ID 前 12 位
- source_labels: ['__meta_docker_container_id']
target_label: container_id
regex: '(.{12}).*'
# 镜像名
- source_labels: ['__meta_docker_container_image']
target_label: image