我有一个包含多个节点的 Docker Swarm 环境,其中一个称为
gateway
。在所有节点上安装了 Docker Plugin grafana/loki-docker-driver:2.9.1
,而不是使用 Promtail。我使用 Portainer 监控模板来部署堆栈,其中包括 Grafana 9.5.2
。为了简单起见,该堆栈将是 stack A
。另外,我还有 stack B
和 Loki 2.9.1
和 mingrammer/flog
作为日志生成器来检查一切是否正常。因此,堆栈 A 和堆栈 B 使用相同的 net
docker 网络。约束是相同的,因此两个堆栈都是同一个节点gateway
:
- node.role == manager
- node.labels.monitoring == true
version: '3.8'
x-logging: &logging
logging:
driver: loki
options:
loki-url: "http://host.docker.internal:3100/loki/api/v1/push"
services:
loki:
image: grafana/loki:2.9.1
<<: *logging
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints:
- node.role == manager
- node.labels.monitoring == true
ports:
- target: 3100
published: 3100
protocol: tcp
mode: ingress
volumes:
- loki-data:/loki
configs:
- source: loki_config
target: /etc/loki/local-config.yaml
command: -config.file=/etc/loki/local-config.yaml
networks:
- net
log-generator:
image: mingrammer/flog
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints:
- node.role == manager
- node.labels.monitoring == true
command:
- --loop
- --format=json
- --number=10 # number of log lines to generate per second
- --delay=100ms # delay between log lines
- --output=/var/log/generated-logs.txt
- --overwrite
- --type=log
volumes:
- loki-data:/var/log/
networks:
- net
volumes:
loki-data:
networks:
net:
name: monitoring_net
external: true
configs:
loki_config:
external: true
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
frontend:
address: 0.0.0.0
schema_config:
configs:
- from: 2020-10-24
store: boltdb
object_store: filesystem
schema: v11
index:
prefix: index_
period: 48h
storage_config:
boltdb:
directory: /loki/index
filesystem:
directory: /loki/chunks
version: "3.8"
services:
grafana:
image: portainer/template-swarm-monitoring:grafana-9.5.2
ports:
- target: 3000
published: 3000
protocol: tcp
mode: ingress
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints:
- node.role == manager
- node.labels.monitoring == true
volumes:
- type: volume
source: grafana-data
target: /var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=${GRAFANA_USER}
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
- GF_USERS_ALLOW_SIGN_UP=false
networks:
- net
...
volumes:
grafana-data:
prometheus-data:
networks:
net:
driver: overlay
configs:
prometheus_conf:
external:
name: prometheus_config
在 Grafana UI 中我尝试添加新连接: 之前一直在说:
无法从Loki获取标签(调用资源失败),请检查服务器日志以获取更多详细信息
然后我意识到,该地址是错误的,并将其设置为
http://loki:3100
,现在它说:
数据源已连接,但未收到标签。验证 Loki 和 Promtail 是否配置正确。
Grafana 对此请求的日志:
logger=context userId=1 orgId=1 uname=admin t=2023-09-27T09:46:06.21413999Z level=error msg="Datasource has already been updated by someone else. Please reload and try again" error="trying to update old version of datasource" remote_addr=10.0.0.2 traceID=
logger=context userId=1 orgId=1 uname=admin t=2023-09-27T09:46:06.21431287Z level=info msg="Request Completed" method=PUT path=/api/datasources/uid/a4c05563-ea62-4f76-b2a7-b6f964314b88 status=409 remote_addr=10.0.0.2 time_ms=1 duration=1.141585ms size=107 referer=http://<dns>:3000/connections/your-connections/datasources/edit/a4c05563-ea62-4f76-b2a7-b6f964314b88 handler=/api/datasources/uid/:uid
logger=context userId=1 orgId=1 uname=admin t=2023-09-27T09:53:33.342223169Z level=info msg="Request Completed" method=GET path=/api/live/ws status=-1 remote_addr=10.0.0.2 time_ms=0 duration=746.46µs size=0 referer= handler=/api/live/ws
Loki 此时没有显示任何可以引用发送请求的日志,仅显示“保存检查点 wal”。
我完全不知道这里出了什么问题。我连续在这里呆了大约4天,你能提供解决方案或想法来克服它吗?
所以,可能存在几个问题:
这意味着 docker-loki-driver 无法获取任何信息传递给 Loki。所以,在这种情况下只需更改线路
- --output=/var/log/generated-logs.txt
到
- --output=/dev/stdout
因此,它根本找不到任何名称为
loki
的主机(或在任何 docker 网络或其别名内)。
此外,如果您将其部署在 Linux 上,
http://host.docker.internal:3100/loki/api/v1/push
行是错误的,因为它只是 Windows 和 Mac 特定的功能,如果是 Linux 系列,您应该手动添加它,例如正如这里提到的:https://stackoverflow.com/a/67158212/7502538。
因此,作为解决方法,您可以使用静态 IP 地址(手动添加到主机文件)来管理它:
loki-url: http://172.0.0.15:3100/loki/api/v1/push
或者简单地部署任何代理服务器(例如 nginx)并设置重定向。最后(它适用于我的项目)设置类似:
loki-url: http://loki-example-dns.com/loki/api/v1/push
这意味着 docker-loki-driver 应该能够像平常一样在主机网络中查找 Loki 服务(例如使用
ping
命令)。
对于此配置,让它可供公众访问是完全可以的。但是,如果出现问题,请确保您没有启用任何类型的身份验证/授权,或者使用正确的凭据继续进行。我在这个项目期间遇到了它,而且它们
Basic Auth
是由nginx处理的。
在 Grafana
Data Sources
如果你想添加 Loki 并且它们保持在同一个 docker 网络中(就问题而言处于群模式),并且只有在这种情况下你可以使用别名:
http://loki:3100/
几个链接帮助我解决了这个问题:
最后这个命令对于分析日志非常有帮助:
sudo journalctl -u docker.service -f