Skip to content

Neo4j 内置监控API

Neo4j提供了多种内置监控API,用于实时监控数据库的运行状态、性能指标和资源使用率。这些API包括REST API、JMX接口和内置的监控端点,方便管理员集成到各种监控系统中。

HTTP监控端点

Neo4j提供了多个HTTP监控端点,用于获取数据库的各种状态信息:

端点描述访问方式
/monitoring/metrics获取所有可用的监控指标GET
/db/{databaseName}/monitoring/metrics获取特定数据库的监控指标GET
/db/{databaseName}/monitoring/metrics/{metricName}获取特定数据库的特定指标GET
/status获取数据库服务状态GET
/db/{databaseName}/status获取特定数据库的状态GET
/info获取数据库版本和配置信息GET

Bolt协议监控

通过Bolt协议,客户端可以使用特定的Cypher命令获取监控信息:

  • SHOW DATABASES:显示所有数据库的状态
  • SHOW DATABASE {databaseName}:显示特定数据库的详细信息
  • SHOW CLUSTER MEMBERS:显示集群成员信息
  • SHOW TRANSACTIONS:显示当前活跃的事务

REST API 监控

1. 基础配置

默认情况下,Neo4j的监控API是启用的。可以通过以下配置进行调整:

txt
# 启用或禁用监控API
dbms.metrics.enabled=true

# 启用或禁用HTTP监控端点
dbms.metrics.http.enabled=true

# 设置监控API的访问路径
dbms.metrics.http.endpoint=/monitoring/metrics

# 配置监控指标的导出频率(秒)
dbms.metrics.polling_interval=30

2. 获取所有监控指标

请求示例:

bash
curl -u neo4j:password http://localhost:7474/monitoring/metrics

响应示例:

json
{
  "neo4j.transaction.begin": {
    "count": 12345,
    "description": "Number of transactions started",
    "unit": "count"
  },
  "neo4j.cypher.query": {
    "count": 67890,
    "description": "Number of Cypher queries executed",
    "unit": "count"
  },
  "neo4j.jvm.memory.heap.used": {
    "value": 536870912,
    "description": "Heap memory used",
    "unit": "bytes"
  }
}

3. 获取特定指标

请求示例:

bash
curl -u neo4j:password http://localhost:7474/monitoring/metrics/neo4j.jvm.memory.heap.used

响应示例:

json
{
  "value": 536870912,
  "description": "Heap memory used",
  "unit": "bytes"
}

4. 筛选特定类型的指标

Neo4j的监控指标可以通过前缀进行筛选,常见的指标前缀包括:

前缀描述
neo4j.cypherCypher查询相关指标
neo4j.transaction事务相关指标
neo4j.jvmJVM相关指标
neo4j.pagecache页缓存相关指标
neo4j.cluster集群相关指标
neo4j.storage存储相关指标
neo4j.dbms数据库管理系统相关指标

请求示例:

bash
curl -u neo4j:password http://localhost:7474/monitoring/metrics | grep "neo4j.cypher"

JMX 监控接口

Neo4j提供了丰富的JMX MBean,用于监控数据库的各个方面。这些MBean可以通过JConsole、VisualVM等JMX客户端访问。

主要JMX MBean

MBean描述
org.neo4j:instance=kernel#0,name=QueryLogger查询日志相关指标
org.neo4j:instance=kernel#0,name=TransactionCount事务计数指标
org.neo4j:instance=kernel#0,name=PageCache页缓存相关指标
org.neo4j:instance=kernel#0,name=MemoryPool内存池相关指标
org.neo4j:instance=kernel#0,name=Cluster集群相关指标
org.neo4j:instance=kernel#0,name=Database数据库相关指标
org.neo4j:instance=kernel#0,name=Store存储相关指标

3. 启用JMX

默认情况下,Neo4j的JMX是启用的。可以通过以下配置进行调整:

txt
# 启用或禁用JMX
dbms.jmx.enabled=true

# 配置JMX远程访问
dbms.jmx.remote.enabled=true

# 配置JMX远程访问端口
dbms.jmx.remote.port=3637

# 配置JMX远程访问认证
dbms.jmx.remote.authenticate=true

# 配置JMX远程访问SSL
dbms.jmx.remote.ssl=false

4. 使用JConsole访问JMX

  1. 启动JConsole:
bash
jconsole
  1. 连接到Neo4j的JMX端口:

    • 服务URL:service:jmx:rmi:///jndi/rmi://localhost:3637/jmxrmi
    • 用户名:neo4j
    • 密码:数据库密码
  2. 浏览各个MBean,查看监控指标

内置监控命令

1. Cypher监控命令

显示数据库状态

cypher
SHOW DATABASES

输出示例:

nameaddressrolerequestedStatuscurrentStatuserrordefaulthomeconstituents
neo4jlocalhost:7687LEADERonlineonline-TRUETRUE-
systemlocalhost:7687LEADERonlineonline-FALSEFALSE-

显示特定数据库的详细信息

cypher
SHOW DATABASE neo4j

显示集群成员信息

cypher
SHOW CLUSTER MEMBERS

输出示例:

addressstaterolegroupsdatabase
localhost:7687AVAILABLECORE[]neo4j
localhost:7688AVAILABLECORE[]neo4j
localhost:7689AVAILABLECORE[]neo4j
localhost:7690AVAILABLEREAD_REPLICA[]neo4j

显示当前活跃的事务

cypher
SHOW TRANSACTIONS

2. neo4j-admin监控命令

检查数据库健康状态

bash
neo4j-admin database health --database=neo4j

输出示例:

Database health for 'neo4j':
- Status: ONLINE
- Store ID: neo4j-1234567890abcdef
- Log sequence number: 12345678
- Last transaction committed: 2026-01-15T10:00:00Z

显示数据库统计信息

bash
neo4j-admin database stats --database=neo4j

输出示例:

Node counts:
- Total nodes: 1000000
- Labels: 5

Relationship counts:
- Total relationships: 5000000
- Relationship types: 10

Property counts:
- Total properties: 20000000

Index counts:
- Total indexes: 8
- Unique constraints: 3

监控指标分类

1. 事务相关指标

指标名称描述单位
neo4j.transaction.begin事务开始次数count
neo4j.transaction.commit事务提交次数count
neo4j.transaction.rollback事务回滚次数count
neo4j.transaction.active当前活跃事务数count
neo4j.transaction.duration事务平均持续时间ms

2. Cypher查询相关指标

指标名称描述单位
neo4j.cypher.queryCypher查询执行次数count
neo4j.cypher.query.durationCypher查询平均执行时间ms
neo4j.cypher.update更新查询执行次数count
neo4j.cypher.readonly只读查询执行次数count
neo4j.cypher.planning查询计划生成时间ms
neo4j.cypher.execution查询执行时间ms

3. 存储相关指标

指标名称描述单位
neo4j.storage.size存储文件总大小bytes
neo4j.storage.node.count节点数量count
neo4j.storage.relationship.count关系数量count
neo4j.storage.property.count属性数量count
neo4j.storage.page.cache.hit_ratio页缓存命中率ratio
neo4j.storage.page.cache.miss_ratio页缓存未命中率ratio

4. JVM相关指标

指标名称描述单位
neo4j.jvm.memory.heap.used堆内存使用量bytes
neo4j.jvm.memory.heap.max堆内存最大值bytes
neo4j.jvm.memory.nonheap.used非堆内存使用量bytes
neo4j.jvm.memory.nonheap.max非堆内存最大值bytes
neo4j.jvm.threads.active活跃线程数count
neo4j.jvm.threads.peak峰值线程数count
neo4j.jvm.gc.pauseGC暂停时间ms
neo4j.jvm.gc.collectionsGC收集次数count

5. 集群相关指标

指标名称描述单位
neo4j.cluster.members集群成员数量count
neo4j.cluster.core.members核心成员数量count
neo4j.cluster.read.replicas只读副本数量count
neo4j.cluster.raft.leader当前Raft领导者boolean
neo4j.cluster.raft.term当前Raft任期count
neo4j.cluster.raft.replication_delay复制延迟ms

最佳实践

1. 监控策略建议

  • 全面监控:监控所有关键指标,包括事务、查询、存储、JVM和集群指标
  • 合理设置告警阈值:根据业务需求和数据库规模设置合适的告警阈值
  • 定期分析历史数据:保存监控数据,定期分析趋势,预测潜在问题
  • 集成到统一监控系统:将Neo4j的监控指标集成到Prometheus、Grafana等统一监控系统
  • 设置多级告警:根据指标严重程度设置不同级别的告警(警告、严重、紧急)

2. 常见监控指标告警阈值

指标名称告警阈值告警级别
neo4j.jvm.memory.heap.used> 80% 堆内存警告
neo4j.jvm.memory.heap.used> 90% 堆内存严重
neo4j.storage.page.cache.miss_ratio> 5%警告
neo4j.transaction.active> 100警告
neo4j.transaction.duration> 1000ms警告
neo4j.cypher.query.duration> 500ms警告
neo4j.cluster.raft.replication_delay> 1000ms警告

3. 安全配置

  • 启用认证:为监控API和JMX配置认证
  • 限制访问IP:通过防火墙或Neo4j配置限制监控API的访问IP
  • 使用SSL/TLS:为监控API启用SSL/TLS加密
  • 定期更换密码:定期更换监控API和JMX的访问密码
  • 最小权限原则:为监控用户分配最小必要的权限

4. 性能优化

  • 调整监控频率:根据实际需求调整监控指标的导出频率,避免对数据库性能造成影响
  • 选择性监控:只监控必要的指标,减少监控数据量
  • 使用异步监控:使用异步方式获取监控数据,减少对数据库主线程的影响
  • 合理设置JMX连接数:限制JMX客户端连接数,避免资源耗尽

常见问题(FAQ)

Q1: 如何启用Neo4j的监控API?

A1: 通过修改neo4j.conf文件,设置以下配置:

txt
dbms.metrics.enabled=true
dbms.metrics.http.enabled=true

Q2: 如何获取Neo4j的特定监控指标?

A2: 使用HTTP GET请求访问特定的监控端点:

bash
curl -u neo4j:password http://localhost:7474/monitoring/metrics/{metricName}

Q3: 如何使用JConsole连接Neo4j的JMX?

A3: 启动JConsole,使用以下服务URL连接:

service:jmx:rmi:///jndi/rmi://localhost:3637/jmxrmi

Q4: 如何查看当前活跃的事务?

A4: 使用Cypher命令:

cypher
SHOW TRANSACTIONS

Q5: 如何检查数据库健康状态?

A5: 使用neo4j-admin命令:

bash
neo4j-admin database health --database=neo4j

Q6: 如何监控Cypher查询性能?

A6: 监控以下指标:

  • neo4j.cypher.query.duration:查询平均执行时间
  • neo4j.cypher.planning:查询计划生成时间
  • neo4j.cypher.execution:查询执行时间

Q7: 如何监控集群复制延迟?

A7: 监控指标:

  • neo4j.cluster.raft.replication_delay:复制延迟

Q8: 如何集成Neo4j监控到Prometheus?

A8: 使用Neo4j的Prometheus导出器,或者配置Prometheus直接抓取Neo4j的监控API端点。

Q9: 如何调整监控指标的导出频率?

A9: 通过修改neo4j.conf文件中的以下配置:

txt
dbms.metrics.polling_interval=30

Q10: 如何禁用特定的监控指标?

A10: 通过修改neo4j.conf文件,使用以下格式禁用特定指标:

txt
dbms.metrics.enabled{metric-name}=false

例如,禁用事务相关指标:

txt
dbms.metrics.enabled{transaction}=false