Skip to content

Neo4j 内置监控指标

指标类别

Neo4j 内置监控指标可以分为以下几个主要类别:

1. 数据库状态指标

这些指标反映了数据库的整体运行状态,包括数据库的启动时间、当前状态、版本信息等。

2. 查询性能指标

这些指标反映了数据库的查询性能,包括查询执行次数、查询执行时间、慢查询数量等。

3. 事务指标

这些指标反映了数据库的事务处理情况,包括事务开始、提交、回滚的数量,事务等待时间等。

4. 存储指标

这些指标反映了数据库的存储使用情况,包括节点数量、关系数量、属性数量、磁盘使用情况等。

5. 网络指标

这些指标反映了数据库的网络通信情况,包括网络连接数、网络吞吐量等。

6. JVM 指标

这些指标反映了 JVM 的运行状态,包括内存使用情况、GC 情况、线程数量等。

7. 集群指标

这些指标反映了集群的运行状态,包括集群成员状态、复制延迟、选举情况等(仅适用于集群部署)。

核心指标详解

1. 数据库状态指标

指标名称描述单位正常范围
dbms.uptime数据库运行时间毫秒持续增长
dbms.status数据库当前状态字符串online
dbms.version数据库版本字符串

2. 查询性能指标

指标名称描述单位正常范围
neo4j.query.execution.counters.started已启动的查询数量计数与业务负载相关
neo4j.query.execution.counters.ended已结束的查询数量计数与业务负载相关
neo4j.query.execution.counters.failed失败的查询数量计数0 或极少
neo4j.query.execution.counters.slow慢查询数量计数与慢查询阈值相关
neo4j.query.execution.times.mean查询平均执行时间毫秒视查询复杂度而定
neo4j.query.execution.times.max查询最大执行时间毫秒视查询复杂度而定

3. 事务指标

指标名称描述单位正常范围
neo4j.transaction.counters.started已启动的事务数量计数与业务负载相关
neo4j.transaction.counters.commited已提交的事务数量计数与业务负载相关
neo4j.transaction.counters.rollbacks已回滚的事务数量计数0 或极少
neo4j.transaction.counters.active当前活跃的事务数量计数视业务负载而定
neo4j.transaction.waiting_for_lock.time事务等待锁的时间毫秒0 或极少

4. 存储指标

指标名称描述单位正常范围
neo4j.counts.nodes节点数量计数持续增长
neo4j.counts.relationships关系数量计数持续增长
neo4j.counts.properties属性数量计数持续增长
neo4j.pagecache.hits页缓存命中次数计数越高越好
neo4j.pagecache.misses页缓存未命中次数计数越低越好
neo4j.pagecache.hit_ratio页缓存命中率比率> 0.95
neo4j.pagecache.evictions页缓存驱逐次数计数视内存配置而定

5. 网络指标

指标名称描述单位正常范围
neo4j.network.connection.count当前网络连接数计数视业务负载而定
neo4j.network.received.bytes网络接收字节数字节与业务负载相关
neo4j.network.sent.bytes网络发送字节数字节与业务负载相关

6. JVM 指标

指标名称描述单位正常范围
jvm.memory.heap.usedJVM 堆内存使用量字节< 80% 堆内存总量
jvm.memory.heap.committedJVM 堆内存提交量字节<= 堆内存总量
jvm.memory.heap.maxJVM 堆内存最大值字节配置值
jvm.memory.nonheap.usedJVM 非堆内存使用量字节视应用情况而定
jvm.gc.pause.totalGC 总暂停时间毫秒越低越好
jvm.gc.pause.countGC 暂停次数计数越低越好
jvm.threads.countJVM 线程总数计数视业务负载而定
jvm.threads.runnable可运行状态线程数计数视业务负载而定
jvm.threads.blocked阻塞状态线程数计数0 或极少

7. 集群指标(仅适用于集群部署)

指标名称描述单位正常范围
neo4j.cluster.members.count集群成员数量计数配置的集群大小
neo4j.cluster.members.online在线集群成员数量计数配置的集群大小
neo4j.cluster.leader当前领导者节点字符串
neo4j.cluster.follower.delay跟随者节点复制延迟毫秒< 100

指标获取方法

1. 使用 Neo4j Browser

在 Neo4j Browser 中,可以使用 :sysinfo 命令查看系统信息和关键指标:

cypher
:six

2. 使用 Cypher 命令

可以使用 Cypher 命令查询内置指标:

cypher
# 查询数据库运行时间
CALL dbms.queryJmx('org.neo4j:instance=kernel#0,name=Uptime') YIELD attributes RETURN attributes.uptime.value;

# 查询节点数量
CALL dbms.queryJmx('org.neo4j:instance=kernel#0,name=Counts') YIELD attributes RETURN attributes.nodes.value;

# 查询查询执行情况
CALL dbms.queryJmx('org.neo4j:instance=kernel#0,name=Query Execution') YIELD attributes RETURN attributes;

# 查询事务情况
CALL dbms.queryJmx('org.neo4j:instance=kernel#0,name=Transactions') YIELD attributes RETURN attributes;

3. 使用 JMX

可以使用 JMX 客户端(如 JConsole、VisualVM 等)连接到 Neo4j JMX 端口,查看所有监控指标。

配置 JMX 端口(在 neo4j.conf 中):

txt
dbms.jmx.enabled=true
dbms.jmx.port=3637

4. 使用 Prometheus 集成

Neo4j 支持 Prometheus 集成,可以直接将指标暴露给 Prometheus:

配置 Prometheus 集成(在 neo4j.conf 中):

txt
dbms.metrics.prometheus.enabled=true
dbms.metrics.prometheus.endpoint=0.0.0.0:2004

然后在 Prometheus 配置中添加 Neo4j 目标:

yaml
scrape_configs:
  - job_name: 'neo4j'
    static_configs:
      - targets: ['localhost:2004']

5. 使用 REST API

可以通过 REST API 获取监控指标:

bash
# 获取所有指标
curl -u username:password http://localhost:7474/db/manage/server/jmx/metrics

# 获取特定指标
curl -u username:password http://localhost:7474/db/manage/server/jmx/metrics/org.neo4j:instance=kernel\#0,name=Uptime

指标监控最佳实践

1. 选择关键指标

根据业务需求和系统特点,选择关键指标进行监控,避免监控过多无关指标。建议监控的关键指标包括:

  • 数据库状态(uptime, status)
  • 查询性能(慢查询数量, 查询执行时间)
  • 事务情况(活跃事务数, 回滚率)
  • 存储使用(页缓存命中率, 节点/关系数量)
  • JVM 状态(堆内存使用, GC 暂停时间)
  • 集群状态(成员在线数量, 复制延迟)(仅适用于集群部署)

2. 设置合理的告警阈值

根据实际情况,为关键指标设置合理的告警阈值,以便在异常情况发生时及时收到告警。

指标名称告警阈值建议告警级别
数据库状态online紧急
慢查询数量5 分钟内超过 10 个警告
事务回滚率> 1%警告
页缓存命中率< 0.9警告
JVM 堆内存使用> 85%警告
JVM GC 暂停时间> 1 秒警告
集群成员在线数量< 配置的集群大小紧急

3. 建立基线

在系统稳定运行期间,收集指标数据,建立性能基线。这样可以更好地识别异常情况,判断指标的变化是否正常。

4. 持续监控

建立持续监控机制,定期检查指标数据,及时发现异常情况。可以使用监控工具(如 Prometheus + Grafana)实现自动化监控和告警。

5. 关联分析

将不同类别的指标进行关联分析,以便更全面地了解系统状态。例如:

  • 将查询执行时间与 JVM 内存使用关联,分析是否是内存不足导致查询变慢
  • 将事务回滚率与锁等待时间关联,分析是否是锁竞争导致事务回滚
  • 将网络吞吐量与查询执行次数关联,分析网络是否成为瓶颈

指标监控工具集成

1. Prometheus + Grafana

Prometheus 配置

yaml
scrape_configs:
  - job_name: 'neo4j'
    static_configs:
      - targets: ['localhost:2004']
    scrape_interval: 15s

Grafana 面板

Neo4j 提供了官方的 Grafana 面板模板,可以从 Grafana Labs 下载。

2. ELK Stack

可以将 Neo4j 日志和指标数据发送到 ELK Stack 进行集中管理和分析:

  • 使用 Logstash 收集 Neo4j 日志和指标
  • 使用 Elasticsearch 存储数据
  • 使用 Kibana 可视化数据和设置告警

3. New Relic

Neo4j 支持与 New Relic 集成,可以使用 New Relic 监控 Neo4j 数据库:

  • 安装 New Relic Java 代理
  • 配置代理连接到 New Relic
  • 在 New Relic 控制台查看 Neo4j 指标

4. Datadog

Neo4j 支持与 Datadog 集成,可以使用 Datadog 监控 Neo4j 数据库:

  • 安装 Datadog Agent
  • 配置 Agent 收集 Neo4j 指标
  • 在 Datadog 控制台查看 Neo4j 指标

常见问题(FAQ)

Q1: 如何查看 Neo4j 内置监控指标?

A1: 可以通过以下方式查看 Neo4j 内置监控指标:

  • 使用 Neo4j Browser 的 :sysinfo 命令
  • 使用 Cypher 命令 CALL dbms.queryJmx()
  • 使用 JMX 客户端(如 JConsole、VisualVM 等)
  • 使用 Prometheus 集成
  • 使用 REST API

Q2: 哪些指标是 Neo4j 监控的关键指标?

A2: 关键指标包括:

  • 数据库状态(uptime, status)
  • 查询性能(慢查询数量, 查询执行时间)
  • 事务情况(活跃事务数, 回滚率)
  • 存储使用(页缓存命中率, 节点/关系数量)
  • JVM 状态(堆内存使用, GC 暂停时间)
  • 集群状态(仅适用于集群部署)

Q3: 如何设置 Neo4j 监控告警?

A3: 可以通过以下方式设置 Neo4j 监控告警:

  • 使用监控工具(如 Prometheus + Grafana)设置告警规则
  • 使用云服务提供商的监控服务(如 AWS CloudWatch、Azure Monitor 等)
  • 使用第三方监控工具(如 New Relic、Datadog 等)

Q4: 如何提高 Neo4j 页缓存命中率?

A4: 可以通过以下方式提高 Neo4j 页缓存命中率:

  • 增加 JVM 堆内存分配
  • 优化查询,减少不必要的数据访问
  • 增加页面缓存大小(通过配置 dbms.memory.pagecache.size
  • 使用合适的索引,减少全表扫描

Q5: 如何分析 Neo4j 慢查询?

A5: 分析 Neo4j 慢查询的方法:

  • 查看慢查询日志(配置 dbms.logs.query.threshold
  • 使用 PROFILEEXPLAIN 命令分析查询执行计划
  • 检查是否缺少索引
  • 优化查询结构,减少复杂度
  • 检查硬件资源(CPU, 内存, 磁盘 I/O)是否充足

Q6: 如何监控 Neo4j 集群状态?

A6: 监控 Neo4j 集群状态的方法:

  • 查看集群成员在线数量
  • 监控领导者节点状态
  • 查看复制延迟
  • 检查集群日志
  • 使用监控工具监控集群指标

Q7: 如何监控 Neo4j JVM 状态?

A7: 监控 Neo4j JVM 状态的方法:

  • 查看 JVM 内存使用情况
  • 监控 GC 暂停时间和频率
  • 查看线程数量和状态
  • 使用 JMX 客户端连接到 Neo4j JVM
  • 使用监控工具监控 JVM 指标

Q8: 如何配置 Neo4j Prometheus 集成?

A8: 配置 Neo4j Prometheus 集成的步骤:

  1. neo4j.conf 中启用 Prometheus 集成:
    txt
    dbms.metrics.prometheus.enabled=true
    dbms.metrics.prometheus.endpoint=0.0.0.0:2004
  2. 在 Prometheus 配置中添加 Neo4j 目标:
    yaml
    scrape_configs:
      - job_name: 'neo4j'
        static_configs:
          - targets: ['localhost:2004']
  3. 重启 Neo4j 和 Prometheus
  4. 在 Prometheus 控制台验证指标是否正常采集

Q9: 如何监控 Neo4j 磁盘使用情况?

A9: 监控 Neo4j 磁盘使用情况的方法:

  • 使用操作系统命令(如 df -h)监控数据目录大小
  • 使用 Neo4j 指标 neo4j.counts.nodesneo4j.counts.relationshipsneo4j.counts.properties 监控数据量增长
  • 使用监控工具监控数据目录大小
  • 配置告警,当磁盘使用率超过阈值时触发告警

Q10: 如何优化 Neo4j 性能?

A10: 优化 Neo4j 性能的方法:

  • 配置合适的内存分配(堆内存和页缓存)
  • 使用合适的索引
  • 优化查询结构,减少复杂度
  • 合理设置事务边界
  • 配置合适的并发度
  • 定期维护数据库(如重建索引、压缩存储)
  • 监控指标,及时发现和解决性能瓶颈