求助:构建含Selenium集群、Loki与Grafana的Docker日志方案
问题:将Selenium节点日志接入Grafana(Docker Compose + Loki + Promtail)
需求:通过Docker Compose部署Selenium Hub、Chrome节点、Grafana、Loki和Promtail,实现将Selenium节点的执行日志展示在Grafana中。以下是当前配置文件,需排查问题并修复。
现有配置文件
docker-compose.yml
version: "3" services: chrome: image: seleniarm/node-chromium deploy: replicas: 1 shm_size: 4gb depends_on: - selenium-hub environment: - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 - SE_NODE_MAX_SESSIONS=3 - SE_NODE_OVERRIDE_MAX_SESSIONS=true - SE_ENABLE_TRACING=true selenium-hub: image: seleniarm/hub container_name: selenium-hub ports: - "4442:4442" - "4443:4443" - "4444:4444" environment: - SE_ENABLE_TRACING=true - GRID_MAX_SESSION=18 - GRID_BROWSER_TIMEOUT=240 - GRID_TIMEOUT=240 promtail: image: grafana/promtail:2.2.0 ports: - "9080:9080" volumes: - ./promtail-config:/etc/promtail command: -config.file=/etc/promtail/config.yml loki: image: grafana/loki:1.4.1 ports: - "3100:3100" volumes: - /MyProjectOutsideTheNodes/Config/loki:/etc/loki command: -config.file=/etc/loki/local-config.yaml grafana: image: grafana/grafana:latest ports: - "3000:3000" environment: - GF_EXPLORE_ENABLED=true - GF_LOGS_DATASOURCE=loki depends_on: - loki volumes: esdata: driver: local
Promtail配置(config.yml)
server: http_listen_port: 9080 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push # Use the service name "loki" as the URL scrape_configs: - job_name: docker-containers pipeline_stages: - docker: {} static_configs: - targets: - chrome-1 # Use the service names as targets - firefox - selenium-hub labels: job: varlogs host: $HOSTNAME __path__: /var/log/*.log
Loki配置(local-config.yaml)
auth_enabled: false server: http_listen_port: 3100 ingester: lifecycler: address: 127.0.0.1 ring: kvstore: store: inmemory replication_factor: 1 final_sleep: 0s chunk_idle_period: 5m chunk_retain_period: 30s max_transfer_retries: 0 schema_config: configs: - from: 2018-04-15 store: boltdb object_store: filesystem schema: v11 index: prefix: index_ period: 168h storage_config: boltdb: directory: /tmp/loki/index filesystem: directory: /tmp/loki/chunks limits_config: enforce_metric_name: false 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
问题排查与修复方案
1. 核心问题:Promtail无法正确抓取Selenium容器日志
当前Promtail配置用static_configs指定/var/log/*.log,但Selenium容器的日志是输出到stdout/stderr,由Docker统一管理(存储在宿主机/var/lib/docker/containers/**/*.log),而非容器内部的/var/log目录。需调整Promtail配置和挂载:
修改Promtail配置(config.yml)
替换为Docker服务发现自动抓取容器日志,只过滤Selenium相关容器:
server: http_listen_port: 9080 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: selenium-logs docker_sd_configs: - host: unix:///var/run/docker.sock refresh_interval: 10s relabel_configs: # 只保留Selenium相关容器(hub、chrome节点) - source_labels: [__meta_docker_container_name] regex: .*(selenium-hub|chrome).* action: keep # 把容器名作为标签 - source_labels: [__meta_docker_container_name] target_label: container # 把服务名作为标签 - source_labels: [__meta_docker_service_name] target_label: service pipeline_stages: - docker: {}
修改docker-compose.yml中Promtail的挂载
添加Docker socket和容器日志目录的只读挂载,让Promtail能访问Docker元数据和日志文件:
promtail: image: grafana/promtail:2.2.0 ports: - "9080:9080" volumes: - ./promtail-config:/etc/promtail - /var/run/docker.sock:/var/run/docker.sock:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro command: -config.file=/etc/promtail/config.yml
2. 版本兼容性问题:Loki与Promtail版本不匹配
Loki 1.4.1和Promtail 2.2.0版本差距过大,存在API不兼容问题,需统一版本。建议升级Loki到2.2.0(或同系列稳定版):
loki: image: grafana/loki:2.2.0 ports: - "3100:3100" volumes: - ./loki-config:/etc/loki - loki-data:/tmp/loki command: -config.file=/etc/loki/local-config.yaml
同时更新Loki的配置(适配2.2.0版本,简化配置):
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 schema_config: configs: - from: 2020-10-24 store: boltdb-shipper object_store: filesystem schema: v11 index: prefix: index_ period: 24h ruler: alertmanager_url: http://localhost:9093
3. 持久化与其他优化
- Loki的存储目录
/tmp/loki会在容器重启后丢失日志,需添加持久化卷:
在docker-compose.yml的volumes部分添加:volumes: esdata: driver: local loki-data: driver: local - 给Selenium服务添加自定义标签,方便Promtail更精准过滤(可选):
比如给chrome服务添加:
然后在Promtail的chrome: # ... 其他配置 labels: logging: "selenium"relabel_configs中添加:- source_labels: [__meta_docker_container_label_logging] regex: selenium action: keep
4. Grafana配置验证
启动所有服务后,访问http://localhost:3000(默认账号admin/admin),检查Loki数据源是否已自动配置(通过GF_LOGS_DATASOURCE=loki环境变量),若未配置则手动添加:
- 数据源类型选择Loki
- URL填写
http://loki:3100 - 保存并测试连接,然后进入Explore页面即可查询Selenium的日志。
内容的提问来源于stack exchange,提问作者vesssori
相关产品推荐
相关产品推荐

