在独立 Docker 容器中监控 Neo4j 实例

在 Docker 容器中运行的 Neo4j 实例可以通过两种方式由 NOM 代理监控

  • NOM 代理可以作为 Neo4j 容器中的附加(守护)进程运行

  • NOM 代理可以在 Docker 主机上运行以外部监控 Neo4j 容器

运行与容器进程生命周期无关的附加进程不是容器化应用程序的最佳实践。

容器内监控

以下步骤描述了在 Neo4j 容器中作为附加(守护)进程运行 NOM 代理以监控实例

  • 运行 Neo4j Docker 容器。

  • 安装 NOM 代理以使 agent 命令可用于运行。

    • 捆绑

      • NOM 代理二进制文件捆绑在 Neo4j 软件包中,并位于 Neo4j 安装目录的 products 文件夹中。

      • 可以将其从软件包中提取并安装到系统二进制文件目录中以访问 agent 命令。

        tar -xzf $NEO4J_HOME/products/neo4j-ops-manager-agent-<NOM_VERSION>-linux-amd64.tar.gz --strip-components 1 && mv bin/agent-<NOM_VERSION>-linux-amd64 /bin/agent
    • 挂载

      • NOM 代理二进制文件可以作为卷挂载到容器中,并安装到系统二进制文件目录中以访问 agent 命令。

        docker run -e NEO4J_ACCEPT_LICENSE_AGREEMENT=yes -v <path/to/agent/binary>:/agent/bin neo4j/neo4j:latest --name <neo4j container name>

        等待容器准备就绪,然后运行

        docker exec -it <neo4j container name> -- /bin/sh -c "mv /agent/bin/agent-*-linux-amd64 /bin/agent"
    • 下载

      • NOM 代理包可以直接下载到 Neo4j 容器中,然后提取并安装。

        wget -O /tmp/neo4j-ops-manager-agent-<NOM_VERSION>-linux-amd64.tar.gz https://dist.neo4j.org/ops-manager/<NOM_VERSION>/neo4j-ops-manager-agent-<NOM_VERSION>-linux-amd64.tar.gz
        tar -xzf /tmp/neo4j-ops-manager-agent-*-linux-amd64.tar.gz --strip-components 1 && mv bin/agent-*-linux-amd64 /bin/agent
  • 运行 NOM 代理,这涉及使用适当的代理配置执行代理二进制文件。

    • 代理配置可以作为在 docker exec 命令期间设置的环境变量或作为容器启动命令的一部分提供。

    • 在控制台模式下运行代理

      docker exec -dit <neo4j container name> -- /bin/sh 'CONFIG_AGENT_NAME="test_local" \
          CONFIG_AGENT_DESCRIPTION="local self-registered agent" \
          CONFIG_SERVER_GRPC_ADDRESS="server:9090" \
          CONFIG_SERVER_HTTP_ADDRESS="https://server:8080" \
          CONFIG_TOKEN_URL=https://server:8080/api/login \
          CONFIG_TOKEN_CLIENT_ID=rj34hg6456ghrhjthet45hg6 \
          CONFIG_TOKEN_CLIENT_SECRET=5h346jhrjkthkjthjerhtkrt \
          CONFIG_TLS_TRUSTED_CERTS=/path/to/trusted/certs/pem/file \
          CONFIG_LOG_FILE=/path/to/nom-agent/log.txt \
          CONFIG_LOG_LEVEL="debug" \
          CONFIG_INSTANCE_1_NAME="test_local" \
          CONFIG_INSTANCE_1_BOLT_URI="bolt://localhost:7687" \
          CONFIG_INSTANCE_1_BOLT_USERNAME="neo4j" \
          CONFIG_INSTANCE_1_BOLT_PASSWORD="passw0rd" \
          CONFIG_INSTANCE_1_QUERY_LOG_PORT="9500" \
          CONFIG_INSTANCE_1_LOG_CONFIG_PATH="/var/lib/neo4j/conf/server-logs.xml" \
          CONFIG_INSTANCE_1_QUERY_LOG_MIN_DURATION="100" \
          agent console -s'

使用自定义入口点启动带有 NOM 代理的 Neo4j 容器

通过运行入口点脚本 /startup/docker-entrypoint.sh 并使用命令 neo4j 启动 Neo4j 容器。为了在容器启动时运行 NOM 代理,需要使用自定义入口点脚本覆盖此入口点,如所示

  • 在控制台模式下

    entrypoint.sh
    #!/bin/bash -eu
    
    /startup/docker-entrypoint.sh neo4j &
    CONFIG_AGENT_NAME="test_local" \
    CONFIG_AGENT_DESCRIPTION="local self-registered agent" \
    CONFIG_SERVER_GRPC_ADDRESS="server:9090" \
    CONFIG_SERVER_HTTP_ADDRESS="https://server:8080" \
    CONFIG_TOKEN_URL=https://server:8080/api/login \
    CONFIG_TOKEN_CLIENT_ID=rj34hg6456ghrhjthet45hg6 \
    CONFIG_TOKEN_CLIENT_SECRET=5h346jhrjkthkjthjerhtkrt \
    CONFIG_TLS_TRUSTED_CERTS=/path/to/trusted/certs/pem/file \
    CONFIG_LOG_FILE=/path/to/nom-agent/log.txt \
    CONFIG_LOG_LEVEL="debug" \
    CONFIG_INSTANCE_1_NAME="test_local" \
    CONFIG_INSTANCE_1_BOLT_URI="bolt://localhost:7687" \
    CONFIG_INSTANCE_1_BOLT_USERNAME="neo4j" \
    CONFIG_INSTANCE_1_BOLT_PASSWORD="passw0rd" \
    CONFIG_INSTANCE_1_QUERY_LOG_PORT="9500" \
    CONFIG_INSTANCE_1_LOG_CONFIG_PATH="/var/lib/neo4j/conf/server-logs.xml" \
    CONFIG_INSTANCE_1_QUERY_LOG_MIN_DURATION="100" \
    agent console -s
     docker run --entrypoint /custom/entrypoint.sh -e NEO4J_ACCEPT_LICENSE_AGREEMENT=yes -v <path/to/custom/entrypoint>:/custom $NEO4J_IMAGE
  • 在服务模式下

    entrypoint.sh
    #!/bin/bash -eu
    
    /startup/docker-entrypoint.sh neo4j &
    agent service install
    cat > neo4j-ops-manager-agent.service <<EOF
    [Service]
    Environment="CONFIG_SERVER_GRPC_ADDRESS=<server grpc address>"
    Environment="CONFIG_SERVER_HTTP_ADDRESS=<server http address>"
    Environment="CONFIG_TOKEN_URL=<server http login url>"
    Environment="CONFIG_TOKEN_CLIENT_ID=<client id>"
    Environment="CONFIG_TOKEN_CLIENT_SECRET=<client secret>"
    Environment="CONFIG_TLS_TRUSTED_CERTS=</path/to/trusted/certs/pem/file>"
    Environment="CONFIG_LOG_FILE=</path/to/nom-agent/log.txt>"
    Environment="CONFIG_INSTANCE_1_NAME=<instance name>"
    Environment="CONFIG_INSTANCE_1_BOLT_URI=<bolt uri of the local instance>"
    Environment="CONFIG_INSTANCE_1_BOLT_USERNAME=<local instance user name>"
    Environment="CONFIG_INSTANCE_1_BOLT_PASSWORD=<local instance password>"
    Environment="CONFIG_INSTANCE_1_QUERY_LOG_PORT=<an available port>"
    Environment="CONFIG_INSTANCE_1_LOG_CONFIG_PATH=<path to server-logs.xml>"
    EOF
    systemctl start neo4j-ops-manager-agent.service
     docker run --entrypoint /custom/entrypoint.sh -e NEO4J_ACCEPT_LICENSE_AGREEMENT=yes -v <path/to/custom/entrypoint>:/custom $NEO4J_IMAGE

外部监控

NOM 代理可以在 Docker 主机上的控制台或服务模式下运行。可以将其配置为访问 Neo4j 容器资源。将以下其他配置应用于 Neo4j 容器运行配置以使外部 NOM 代理能够正确监控实例

docker run --entrypoint /custom/entrypoint.sh -e NEO4J_ACCEPT_LICENSE_AGREEMENT=yes \
           -v <path/to/custom/entrypoint>:/custom \
           -v </path/to/local/neo4j/home>:/var/lib/neo4j \ (1)
           -p "8884:2004" \ (2)
           -p "9500:9500" \ (3)
       neo4j/neo4j:latest
1 需要将 Neo4j 主目录挂载回 Docker 主机以启用对代理的访问。
2 需要通过端口映射公开 Neo4j Prometheus 端点端口 (2004)。
3 需要映射查询日志端口 (9500) 以便日志追加器转发查询日志。