Docker Desktop 部署 mysql-exporter 监控(Prometheus,mysql-exporter)时遇到的一些问题
作者:mmseoamin日期:2024-01-18

Docker Desktop 部署 mysql-exporter 监控(Prometheus,mysql-exporter)时遇到的一些问题

本次使用 Prometheus 系列的监控组件,只部署了 mysql 相关组件:mysql, mysqld-exporter, Prometheus。

Docker 使用的是 Docker Desktop。

文章目录

  • Docker Desktop 部署 mysql-exporter 监控(Prometheus,mysql-exporter)时遇到的一些问题
    • 1. 前序
    • 2. 问题
      • 2.1. mysqld-exporter
        • 2.1.1. 启动失败
        • 2.1.2. 拒绝连接
        • 2.2. Prometheus 启动失败

          1. 前序

          最开始部署时,docker-compose.yml 文件为:

          version: '3.2'
          networks:
            mysql-exporter-test:
              driver: bridge
          services:
            mysql:
              image: mysql
              container_name: mysql-test
              volumes:
                - ./docker-volumes/mysql/db_data:/var/lib/mysql
                - ./docker-volumes/mysql/config/init:/docker-entrypoint-initdb.d/
              command: [
                '--character-set-server=utf8mb4',
                '--collation-server=utf8mb4_unicode_ci',
                '--default-time-zone=+8:00'
              ]
              environment:
                MYSQL_ROOT_PASSWORD: root
                MYSQL_USER: exporter
                MYSQL_PASSWORD: Prometheus
              ports:
                - 3306:3306
              networks:
                - mysql-exporter-test
            mysqld-exporter:
              image: prom/mysqld-exporter
              container_name: exporter-test
              ports:
                - 9104:9104
              environment:
                - DATA_SOURCE_NAME=exporter:Prometheus@(mysql-test:3306)/
              depends_on:
                - mysql
              networks:
                - mysql-exporter-test
            prometheus:
              image: prom/prometheus:latest
              container_name: prometheus
              volumes:
                - ./docker-volumes/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
                - ./docker-volumes/prometheus/data/prometheus_data:/prometheus
              environment:
                - TZ=Asia/Shanghai
              ports:
                - 9090:9090
              networks:
                - mysql-exporter-test
          

          docker 部署 mysql 在这里就不细说,这里的配置只是我随便写的,只需要保证 mysql 能正常启动就行。

          2. 问题

          注意:这里使用自定义 network:mysql-exporter-test,在不指定名称(name,dirver 同级路径)下,使用 docker-compose up -d 启动,所创建的 network 的名称是:

          [docker-compose 容器的名称]_mysql-exporter-test
          

          这里最好是指定 name 属性。

          2.1. mysqld-exporter

          我这里使用的 mysqld-exporter 版本为:

          "RepoDigests": [
                      "prom/mysqld-exporter@sha256:6b693c6c003bf51ffc2305f3d1a35d16da678bf421bfccca48ecc6077073634e"
          ]
          
          2.1.1. 启动失败

          mysqld-exporter 启动失败,提示信息为:

          ts=2023-08-31T09:30:55.551Z caller=mysqld_exporter.go:220 level=info msg="Starting mysqld_exporter" version="(version=0.15.0, branch=HEAD, revision=6ca2a42f97f3403c7788ff4f374430aa267a6b6b)"
          ts=2023-08-31T09:30:55.551Z caller=mysqld_exporter.go:221 level=info msg="Build context" build_context="(go=go1.20.5, platform=linux/amd64, user=root@c4fca471a5b1, date=20230624-04:09:04, tags=netgo)"
          ts=2023-08-31T09:30:55.551Z caller=config.go:150 level=error msg="failed to validate config" section=client err="no user specified in section or parent"
          ts=2023-08-31T09:30:55.551Z caller=mysqld_exporter.go:225 level=info msg="Error parsing host config" file=.my.cnf err="no configuration found"
          

          file=.my.cnf err="no configuration found":无法找到配置文件 .my.conf。

          后续添加文件映射:

          mysqld-exporter:
            image: prom/mysqld-exporter
            container_name: exporter-test
            ports:
              - 9104:9104
            environment:
              - DATA_SOURCE_NAME=exporter:Prometheus@(mysql-test:3306)/
              volumes:
                - ./docker-volumes/mysql-exporter/.my.cnf:/.my.cnf
            depends_on:
              - mysql1
            networks:
              - mysql-exporter-test
          

          注意:这里在挂载到容器目录时,此版本的 .my.conf 文件是在根目录位置。否则还是会启动失败。

          配置内容:

          [client]
          # 这里使用的容器名称。所有容器都指定在同一 network 中,docker 允许处在同一网络环境的容器使用容器名称项目访问。另外,容器启动时会随机分配 IP,所以这里使用容器名称最合适。当然也可以容器启动时,指定的 IP
          host=mysql-test
          port=3306
          # mysql 用户名
          user=exporter
          # mysql 用户密码
          password=Prometheus
          
          2.1.2. 拒绝连接

          经过上述处理后,成功启动。但是在访问 mysqld-export 时,提示 mysql 拒绝连接:

          ts=2023-08-31T09:44:38.807Z caller=exporter.go:152 level=error msg="Error pinging mysqld" err="dial tcp 172.25.0.3:3306: connect: connection refused"
          

          这是因为指定的mysql用户没有远程相应的权限,需要在 mysql 中配置:

          grant process, replication client, select on *.* to '[用户名]'@'%'; 
          

          至此,mysqld-exporter 启动问题解决。

          2.2. Prometheus 启动失败

          使用最开始的 docker-compose 配置启动 Prometheus 时,会直接启动失败。错误日志:

          ts=2023-08-31T09:50:30.796Z caller=main.go:541 level=info msg="No time or size retention was set so using the default time retention" duration=15d
          ts=2023-08-31T09:50:30.796Z caller=main.go:585 level=info msg="Starting Prometheus Server" mode=server version="(version=2.46.0, branch=HEAD, revision=cbb69e51423565ec40f46e74f4ff2dbb3b7fb4f0)"
          ts=2023-08-31T09:50:30.796Z caller=main.go:590 level=info build_context="(go=go1.20.6, platform=linux/amd64, user=root@42454fc0f41e, date=20230725-12:31:24, tags=netgo,builtinassets,stringlabels)"
          ts=2023-08-31T09:50:30.796Z caller=main.go:591 level=info host_details="(Linux 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 d1e01fc1a243 localdomain)"
          ts=2023-08-31T09:50:30.796Z caller=main.go:592 level=info fd_limits="(soft=1048576, hard=1048576)"
          ts=2023-08-31T09:50:30.796Z caller=main.go:593 level=info vm_limits="(soft=unlimited, hard=unlimited)"
          ts=2023-08-31T09:50:30.798Z caller=query_logger.go:93 level=error component=activeQueryTracker msg="Error opening query log file" file=/prometheus/queries.active err="open /prometheus/queries.active: permission denied"
          panic: Unable to create mmap-ed active query log
          goroutine 1 [running]:
          github.com/prometheus/prometheus/promql.NewActiveQueryTracker({0x7ffe0fc01ef1, 0xb}, 0x14, {0x3e97c00, 0xc00051d630})
          /app/promql/query_logger.go:123 +0x42d
          main.main()
          /app/cmd/prometheus/main.go:647 +0x74d3
          

          第 13 行提示无权限打开文件 /prometheus/queries.active。

          经过搜索,说是在挂在目录时,Prometheus 容器没有对应的权限,可以配置 root 权限来解决这个问题:

          prometheus:
            image: prom/prometheus:latest
            container_name: prometheus
            user: root
            volumes:
              - ./docker-volumes/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
              - ./docker-volumes/prometheus/data/prometheus_data:/prometheus
            environment:
              - TZ=Asia/Shanghai
            ports:
              - 9090:9090
            networks:
              - mysql-exporter-test
          

          配置后,Prometheus 容器正常启动。