Traefik 监控零碎搭建
背景
- 前边的文章 Traefik 学习中曾经介绍了 Traefik 的应用,然而如果没有一个可视化的 Traefik 拜访状态与 Acces Log 的 Dashboard 界面的话,对于一个网关来说实际上是不残缺的,这篇文章就来介绍应用 Prometheus + Grafana + Promtail+ Loki 构建 Traefik 的监控核心
- Prometheus 是云原生时代事实上的零碎(服务)状态监测规范,通过基于 HTTP 的 pull 形式采集时序数据,能够通过服务发现或者动态配置去获取要采集的指标服务器,反对单主节点工作,反对多种可视化图表及仪表盘 –在本文中 Prometheus 用来收集 Traefik Metrics 数据
- Grafana 是一个开源的度量剖析与可视化套件。纯 Javascript 开发的前端工具,通过拜访库(如 InfluxDB、Prometheus),展现自定义报表、显示图表等。Grafana 的 UI 更加灵便,有丰盛的插件,功能强大 –在本文中 Grafana 用来展现来自 Prometheus 和 Loki 的数据
- Promtail 是一个日志收集的代理,它会将本地日志的内容发送到一个 Loki 实例,它通常部署到须要监督应用程序的每台机器 / 容器上。Promtail 次要是用来发现指标、将标签附加到日志流以及将日志推送到 Loki–本文中 Promtail 用来收集 Traefik Access Log
- Grafana Loki 是一组能够组成一个功能齐全的日志堆栈组件,与其它日志零碎不同的是,Loki 只建设日志标签的索引而不索引原始日志音讯,而是为日志数据设置一组标签,这意味着 Loki 的经营老本更低,效率也能进步几个数量级,一句话形容下 Loki 就是
like Prometheus, but for logs
– 本文中Loki
用来整合来自 Promtail 的日志数据
Traefik 配置
-
对于 Traefik 的配置,最要害的就是开启 Metrics 与 Access Log 的配置,动态配置文件
traefik.toml
如下[log] level = "WARN" format = "common" filePath = "/logs/traefik.log" [accessLog] filePath = "/logs/access.log" bufferingSize = 100 format = "json" [accessLog.fields.names] "StartUTC" = "drop" [accessLog.filters] retryAttempts = true minDuration = "10ms"
- 这里只展现日志相干的要害配置
StartUTC
的设置是为了设置日志应用的时区工夫,配合TZ
环境变量应用
-
traefik 部署的 Docker Compose 配置文件
traefik.yaml
如下:version: '3' services: reverse-proxy: image: traefik restart: always environment: - TZ=Asia/Shanghai ports: - "80:80" - "443:443" networks: - traefik volumes: - ./traefik.toml:/etc/traefik/traefik.toml - /var/run/docker.sock:/var/run/docker.sock - ./config/:/etc/traefik/config/:ro - ./acme.json:/letsencrypt/acme.json - ./logs:/logs/:rw container_name: traefik # 网关健康检查 healthcheck: test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"] interval: 3s timeout: 5s # 创立内部网卡 docker network create traefik networks: traefik: external: true
-
要害的局部是:
- 指定日志应用的时区的环境变量
TZ
- 挂载本地的日志目录
./logs
- 指定日志应用的时区的环境变量
-
监控零碎搭建
-
Prometheus 配置文件
prometheus-conf.yaml
如下:global: scrape_interval: 15s external_labels: monitor: 'codelab-monitor' scrape_configs: - job_name: 'node' scrape_interval: 5s static_configs: - targets: ['traefik:8080']
-
Loki 配置文件
loki.yaml
auth_enabled: false server: http_listen_port: 3100 ingester: wal: dir: /loki/wal lifecycler: address: 127.0.0.1 ring: kvstore: store: inmemory replication_factor: 1 final_sleep: 0s chunk_idle_period: 1h # Any chunk not receiving new logs in this time will be flushed max_chunk_age: 1h # All chunks will be flushed when they hit this age, default is 1h chunk_target_size: 1048576 # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first chunk_retain_period: 30s # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m) max_transfer_retries: 0 # Chunk transfers disabled schema_config: configs: - from: 2020-10-24 store: boltdb-shipper object_store: filesystem schema: v11 index: prefix: index_ period: 24h storage_config: boltdb_shipper: active_index_directory: /loki/boltdb-shipper-active cache_location: /loki/boltdb-shipper-cache cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space shared_store: filesystem filesystem: directory: /loki/chunks compactor: working_directory: /loki/boltdb-shipper-compactor shared_store: filesystem limits_config: reject_old_samples: true reject_old_samples_max_age: 168h chunk_store_config: max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s ruler: storage: type: local local: directory: /loki/rules rule_path: /loki/rules-temp alertmanager_url: http://localhost:9093 ring: kvstore: store: inmemory enable_api: true frontend: max_outstanding_per_tenant: 2048
-
promatil 配置文件
promtail.yaml
:server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: app static_configs: - targets: - localhost labels: job: app __path__: /var/log/*log
- 留神这里的
lables
标签中设置的job
的名字是app
,前面在 Grafana 中设置 Dashboard 时须要应用这个值
- 留神这里的
-
Docker Compose 配置文件
prometheus.yaml
如下:version: "3" services: prometheus: restart: always image: prom/prometheus:v2.28.0 container_name: prometheus volumes: - ./:/etc/prometheus/ command: - "--config.file=/etc/prometheus/prometheus-conf.yaml" - "--storage.tsdb.path=/prometheus" - "--web.console.libraries=/etc/prometheus/console_libraries" - "--web.console.templates=/etc/prometheus/consoles" - "--storage.tsdb.retention.time=720h" - "--web.enable-lifecycle" ports: - 9090:9090 grafana: image: grafana/grafana:8.1.2 container_name: grafana restart: always ports: - 3000:3000 depends_on: - prometheus - loki loki: image: grafana/loki expose: - "3100" volumes: - ./loki.yaml:/etc/loki/local-config.yaml - loki_data:/loki command: -config.file=/etc/loki/local-config.yaml promtail: image: grafana/promtail depends_on: - loki volumes: - /root/traefik/logs:/var/log - ./promtail.yaml:/etc/promtail/config.yml command: -config.file=/etc/promtail/config.yml networks: default: external: name: traefik volumes: loki_data:
Grafana 配置
- 拜访到 Grafana 后,应用 admin:admin 登录
配置数据源
- Prometheus:左侧菜单
Configuration → Data Sources
,点击 / 编辑默认 Prometheus 数据源,配置 URL 为:http://prometheus:9090
,Save & Test - Loki:左侧菜单
Configuration → Data Sources
,点击 / 编辑默认 Loki 数据源,配置 URL 为:http://loki:3100
,Save & Test - 引入两个数据源后能够在左侧面板的
Explore
中查看是否能查问到数据,以Loki
为例,抉择 Log browser,抉择日志文件,随后点击 Show Logs 应能看到收集到的日志数据
配置 Dashboard
-
在左侧面板中抉择 Create->Import 能够应用 ID 引入 Grafana Dashboard 市场中提供的反对 Traefik Metrics 的 Dashboard
- 给 Dashboard 加上星标,就能够在 Configuration->Preferences->Home Dashboard 中设置为首页 Dashboard
-
在左侧面板中 Create->Import 能够应用 ID:
13713
引入Traefik Via Loki
这个 Dashboard,用来展现 Traefik 的 Log-
这个 Dashboard 的应用须要做两个配置:
-
引入 Dashboar 后会发现没数据,此时点击右上角的⚙键,进行 Dashboard 配置,进入 Json Model,将 JSON 配置文件中的所有
{job="/var/log/traefik.log"}
替换成{job="app"}
(源于上边的 promtail 的配置),随后 Save Changes->Save Dashboard - Dashboard 的 Request Route 局部会报错显示
Panel plugin not found: grafana-piechart-panel
,此时执行命令docker exec -i grafana sh -c 'grafana-cli plugins install grafana-piechart-panel'
在容器内装置该插件,随后重启容器docker restart grafana
即可
-
-
其余
- Grafana 如果仅供本人应用,不倡议将服务裸露在公网,能够参考端口映射将服务映射到本地服务器
参考
- Traefik 2 监控零碎之 Grafana Prometheus Promtail Loki 完满联合
- 从 ELK/EFK 到 PLG – 在 EKS 中实现基于 Promtail + Loki + Grafana 容器日志解决方案
- Traefik Logs
- loki mkdir wal: permission denied
-
Are you trying to mount a directory onto a file (or vice-versa)?
- 补充:个别呈现这种谬误时,首先看看本人指定的目录是否存在问题,比方名字是否打错了这种 …
- Grafana Plugin Install over Docker
- Traefik Via Loki
- 另一种计划的参考:ElasticSearch + FileBeat + Grafana
- Datasource proxy returning “too many outstanding requests”