feat(monitoring): 接入 Loki + Promtail 日志采集,Grafana 可直接搜索容器日志
This commit is contained in:
1 parent
5d139783c9
commit
fc9e429187
4 files changed
+135
No files matched your search
@@ -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:
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
Reference in new issue
Block a user