外观
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.used | JVM 堆内存使用量 | 字节 | < 80% 堆内存总量 |
jvm.memory.heap.committed | JVM 堆内存提交量 | 字节 | <= 堆内存总量 |
jvm.memory.heap.max | JVM 堆内存最大值 | 字节 | 配置值 |
jvm.memory.nonheap.used | JVM 非堆内存使用量 | 字节 | 视应用情况而定 |
jvm.gc.pause.total | GC 总暂停时间 | 毫秒 | 越低越好 |
jvm.gc.pause.count | GC 暂停次数 | 计数 | 越低越好 |
jvm.threads.count | JVM 线程总数 | 计数 | 视业务负载而定 |
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
:six2. 使用 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=36374. 使用 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: 15sGrafana 面板:
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) - 使用
PROFILE或EXPLAIN命令分析查询执行计划 - 检查是否缺少索引
- 优化查询结构,减少复杂度
- 检查硬件资源(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 集成的步骤:
- 在
neo4j.conf中启用 Prometheus 集成:txtdbms.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'] - 重启 Neo4j 和 Prometheus
- 在 Prometheus 控制台验证指标是否正常采集
Q9: 如何监控 Neo4j 磁盘使用情况?
A9: 监控 Neo4j 磁盘使用情况的方法:
- 使用操作系统命令(如
df -h)监控数据目录大小 - 使用 Neo4j 指标
neo4j.counts.nodes、neo4j.counts.relationships、neo4j.counts.properties监控数据量增长 - 使用监控工具监控数据目录大小
- 配置告警,当磁盘使用率超过阈值时触发告警
Q10: 如何优化 Neo4j 性能?
A10: 优化 Neo4j 性能的方法:
- 配置合适的内存分配(堆内存和页缓存)
- 使用合适的索引
- 优化查询结构,减少复杂度
- 合理设置事务边界
- 配置合适的并发度
- 定期维护数据库(如重建索引、压缩存储)
- 监控指标,及时发现和解决性能瓶颈
