Grafana 无法从 Loki 检索日志(和标签)

问题描述 投票:0回答:1

我有一个包含多个节点的 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

这是堆栈B

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

这是 Loki 的配置

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

这是堆栈 A:

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 grafana docker-swarm grafana-loki portainer
1个回答
0
投票

所以,可能存在几个问题:

1. mingrammer/flog 生成日志到文件而不是 stdout

这意味着 docker-loki-driver 无法获取任何信息传递给 Loki。所以,在这种情况下只需更改线路

- --output=/var/log/generated-logs.txt

- --output=/dev/stdout

2. Docker 插件只能(!)在桥接和主机网络模式下工作

因此,它根本找不到任何名称为

loki
的主机(或在任何 docker 网络或其别名内)。

3. host.docker.internal 取决于操作系统

此外,如果您将其部署在 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
命令)。

4.访问权限错误

对于此配置,让它可供公众访问是完全可以的。但是,如果出现问题,请确保您没有启用任何类型的身份验证/授权,或者使用正确的凭据继续进行。我在这个项目期间遇到了它,而且它们

Basic Auth
是由nginx处理的。

设置 Grafana

在 Grafana

Data Sources
如果你想添加 Loki 并且它们保持在同一个 docker 网络中(就问题而言处于群模式),并且只有在这种情况下你可以使用别名:

http://loki:3100/

补充

几个链接帮助我解决了这个问题:

最后这个命令对于分析日志非常有帮助:

sudo journalctl -u docker.service -f

© www.soinside.com 2019 - 2024. All rights reserved.