From fc9e429187851698c1006d3dcae4f1ae6104c9e6 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Wed, 28 Oct 2026 10:38:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(monitoring):=20=E6=8E=A5=E5=85=A5=20Loki?= =?UTF-8?q?=20+=20Promtail=20=E6=97=A5=E5=BF=97=E9=87=87=E9=9B=86=EF=BC=8C?= =?UTF-8?q?Grafana=20=E5=8F=AF=E7=9B=B4=E6=8E=A5=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 32 +++++++++++++ grafana/provisioning/datasources/loki.yml | 14 ++++++ loki-config.yml | 55 +++++++++++++++++++++++ promtail-config.yml | 34 ++++++++++++++ 4 files changed, 135 insertions(+) create mode 100644 grafana/provisioning/datasources/loki.yml create mode 100644 loki-config.yml create mode 100644 promtail-config.yml diff --git a/docker-compose.yml b/docker-compose.yml index b10dc95..9e3d2cf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -197,9 +197,40 @@ services: GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?Grafana 管理员密码必填,见 .env.example} GF_USERS_ALLOW_SIGN_UP: "false" + # 新用户默认界面语言:简体中文 + GF_USERS_LANGUAGE: "zh-Hans" TZ: Asia/Shanghai depends_on: - 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: @@ -227,3 +258,4 @@ volumes: redis-data: prometheus-data: grafana-data: + loki-data: diff --git a/grafana/provisioning/datasources/loki.yml b/grafana/provisioning/datasources/loki.yml new file mode 100644 index 0000000..ee88374 --- /dev/null +++ b/grafana/provisioning/datasources/loki.yml @@ -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 diff --git a/loki-config.yml b/loki-config.yml new file mode 100644 index 0000000..f0afda9 --- /dev/null +++ b/loki-config.yml @@ -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 diff --git a/promtail-config.yml b/promtail-config.yml new file mode 100644 index 0000000..a21c0f1 --- /dev/null +++ b/promtail-config.yml @@ -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