# JChargePointProtocol 监控与运维手册
**本文档中引用的文件**
- [log4j2.xml](file://jcpp-app-bootstrap/src/main/resources/log4j2.xml)
- [log4j2.xml](file://jcpp-protocol-bootstrap/src/main/resources/log4j2.xml)
- [DefaultStatsFactory.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultStatsFactory.java)
- [DefaultCounter.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultCounter.java)
- [StatsTimer.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/StatsTimer.java)
- [MessagesStats.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/MessagesStats.java)
- [DefaultMessagesStats.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultMessagesStats.java)
- [KafkaConsumerStatsService.java](file://jcpp-infrastructure-queue/src/main/java/sanbing/jcpp/infrastructure/queue/kafka/KafkaConsumerStatsService.java)
- [SystemUtil.java](file://jcpp-infrastructure-util/src/main/java/sanbing/jcpp/infrastructure/util/SystemUtil.java)
- [app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml)
- [protocol-service.yml](file://jcpp-protocol-bootstrap/src/main/resources/protocol-service.yml)
- [docker-compose.kafka.yml](file://docker/docker-compose.kafka.yml)
## 目录
1. [概述](#概述)
2. [日志管理系统](#日志管理系统)
3. [性能监控体系](#性能监控体系)
4. [消息队列监控](#消息队列监控)
5. [系统资源监控](#系统资源监控)
6. [故障排查指南](#故障排查指南)
7. [运维最佳实践](#运维最佳实践)
8. [监控集成方案](#监控集成方案)
## 概述
JChargePointProtocol是一个高性能的充电站协议处理平台,采用微服务架构设计,支持多种充电设备协议的接入和处理。本手册详细介绍了系统的监控与运维机制,帮助运维人员有效监控系统状态、及时发现和解决问题。
## 日志管理系统
### Log4j2配置详解
系统采用Log4j2作为日志框架,提供了灵活的日志配置和强大的日志管理能力。
#### 配置结构分析
```mermaid
graph TD
A["Log4j2配置"] --> B["属性配置"]
A --> C["Appender配置"]
A --> D["Logger配置"]
B --> B1["LOG_DIR - 日志目录"]
B --> B2["LOG_PATTERN - 输出格式"]
C --> C1["Console - 控制台输出"]
C --> C2["RollingFile - 文件轮转"]
D --> D1["Root Logger"]
D --> D2["Async Logger"]
D --> D3["业务模块Logger"]
```
**图表来源**
- [log4j2.xml](file://jcpp-app-bootstrap/src/main/resources/log4j2.xml#L1-L72)
- [log4j2.xml](file://jcpp-protocol-bootstrap/src/main/resources/log4j2.xml#L1-L66)
#### 日志级别配置
系统支持多层级的日志级别配置:
| Logger名称 | 默认级别 | 环境变量 | 用途 |
|-----------------------|-------|---------------------|---------|
| Root Logger | INFO | - | 全局基础日志 |
| sanbing.jcpp | INFO | - | 核心框架日志 |
| sanbing.jcpp.app | TRACE | APP_LOG_LEVEL | 应用层详细日志 |
| sanbing.jcpp.protocol | TRACE | PROTOCOLS_LOG_LEVEL | 协议处理日志 |
#### 输出格式配置
日志输出格式包含以下关键信息:
- 时间戳:精确到毫秒
- TraceId:分布式追踪标识
- 线程名:便于问题定位
- 日志级别:ERROR、WARN、INFO、DEBUG
- 类名:类的简短名称
- 日志消息:实际日志内容
- 异常堆栈:完整异常信息
#### 日志轮转策略
系统采用复合轮转策略:
```mermaid
flowchart TD
A["日志文件"] --> B{"文件大小检查"}
B --> |超过1GB| C["触发SizeBasedTriggeringPolicy"]
B --> |时间检查| D{"时间轮转检查"}
D --> |超过24小时| E["触发TimeBasedTriggeringPolicy"]
C --> F["执行文件轮转"]
E --> F
F --> G["删除超过10GB历史日志"]
G --> H["保留最新日志文件"]
```
**图表来源**
- [log4j2.xml](file://jcpp-app-bootstrap/src/main/resources/log4j2.xml#L25-L45)
**章节来源**
- [log4j2.xml](file://jcpp-app-bootstrap/src/main/resources/log4j2.xml#L1-L72)
- [log4j2.xml](file://jcpp-protocol-bootstrap/src/main/resources/log4j2.xml#L1-L66)
## 性能监控体系
### StatsFactory核心架构
系统通过StatsFactory提供统一的性能指标收集机制,支持多种监控指标类型。
```mermaid
classDiagram
class StatsFactory {
<>
+createStatsCounter(key, statsName, tags) StatsCounter
+createDefaultCounter(key, tags) DefaultCounter
+createMessagesStats(key, tags) MessagesStats
+createTimer(key, tags) Timer
+createGauge(key, number, tags) T
}
class DefaultStatsFactory {
-MeterRegistry meterRegistry
-Boolean metricsEnabled
-Double[] timerPercentiles
+createStatsCounter() StatsCounter
+createDefaultCounter() DefaultCounter
+createMessagesStats() MessagesStats
+createTimer() Timer
+createGauge() T
}
class StatsCounter {
-AtomicInteger counter
-Counter micrometerCounter
+increment() void
+add(delta) void
+get() int
+clear() void
}
class MessagesStats {
<>
+incrementTotal() void
+incrementSuccessful() void
+incrementFailed() void
+getTotal() int
+getSuccessful() int
+getFailed() int
+reset() void
}
class StatsTimer {
-String name
-Timer timer
-int count
-long totalTime
+record(timeMs) void
+getAvg() double
+reset() void
}
StatsFactory <|-- DefaultStatsFactory
DefaultStatsFactory --> StatsCounter
DefaultStatsFactory --> MessagesStats
DefaultStatsFactory --> StatsTimer
MessagesStats <|-- DefaultMessagesStats
```
**图表来源**
- [DefaultStatsFactory.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultStatsFactory.java#L1-L127)
- [DefaultCounter.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultCounter.java#L1-L40)
- [MessagesStats.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/MessagesStats.java#L1-L36)
- [StatsTimer.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/StatsTimer.java#L1-L47)
### 关键性能指标
#### API请求监控
系统通过StatsTimer跟踪API请求的延迟性能:
| 指标名称 | 计算方式 | 用途 |
|--------|------------------------------|----------|
| 平均响应时间 | totalTime / count | 评估系统响应性能 |
| 请求总数 | 累计计数 | 监控系统负载 |
| 成功率 | successfulCount / totalCount | 评估系统稳定性 |
#### QPS监控
通过DefaultCounter实现每秒查询率统计:
```mermaid
sequenceDiagram
participant Client as 客户端
participant Controller as 控制器
participant StatsFactory as 统计工厂
participant Counter as 计数器
Client->>Controller : 发送请求
Controller->>StatsFactory : 创建计数器
StatsFactory->>Counter : increment()
Counter->>Counter : 原子递增
Controller->>Controller : 处理业务逻辑
Controller-->>Client : 返回响应
```
**图表来源**
- [DefaultCounter.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultCounter.java#L20-L35)
#### 缓存命中率监控
系统通过缓存访问统计计算命中率:
| 指标 | 计算公式 | 监控意义 |
|-------|-----------------------------------|--------|
| 命中率 | hitCount / (hitCount + missCount) | 缓存效率评估 |
| 命中次数 | hitCounter.get() | 缓存有效性 |
| 未命中次数 | missCounter.get() | 缓存优化方向 |
**章节来源**
- [DefaultStatsFactory.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultStatsFactory.java#L1-L127)
- [DefaultCounter.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultCounter.java#L1-L40)
- [StatsTimer.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/StatsTimer.java#L1-L47)
- [MessagesStats.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/MessagesStats.java#L1-L36)
- [DefaultMessagesStats.java](file://jcpp-infrastructure-stats/src/main/java/sanbing/jcpp/infrastructure/stats/DefaultMessagesStats.java#L1-L57)
## 消息队列监控
### Kafka消费者统计
系统提供详细的Kafka消费者组监控功能,实时跟踪消息处理状态。
```mermaid
flowchart TD
A["KafkaConsumerStatsService"] --> B["消费者组注册"]
B --> C["定时统计任务"]
C --> D["获取消费者偏移量"]
D --> E["获取主题末尾偏移量"]
E --> F["计算消息滞后量"]
F --> G{"存在滞后消息?"}
G --> |是| H["记录滞后统计"]
G --> |否| I["跳过统计"]
H --> J["输出日志"]
I --> K["等待下次调度"]
J --> K
```
**图表来源**
- [KafkaConsumerStatsService.java](file://jcpp-infrastructure-queue/src/main/java/sanbing/jcpp/infrastructure/queue/kafka/KafkaConsumerStatsService.java#L40-L100)
#### 消息滞后监控指标
| 指标名称 | 含义 | 监控阈值建议 |
|--------|-------------|-----------|
| 消费者组ID | Kafka消费者组标识 | 实时监控 |
| 主题名称 | 消息主题 | 按业务划分 |
| 分区编号 | Kafka分区标识 | 单分区监控 |
| 已消费偏移量 | 当前消费位置 | 跟踪消费进度 |
| 末尾偏移量 | 主题最新消息位置 | 监控消息增长 |
| 消息滞后量 | 未消费消息数量 | 超过1000需关注 |
#### 消费者组健康检查
系统自动监控消费者组的健康状态:
```mermaid
sequenceDiagram
participant Scheduler as 统计调度器
participant AdminClient as Kafka管理客户端
participant Consumer as Kafka消费者
participant Logger as 日志系统
Scheduler->>AdminClient : 获取消费者组偏移量
AdminClient-->>Scheduler : 返回偏移量信息
Scheduler->>Consumer : 获取主题末尾偏移量
Consumer-->>Scheduler : 返回末尾偏移量
Scheduler->>Scheduler : 计算消息滞后量
alt 存在滞后消息
Scheduler->>Logger : 记录滞后统计
else 正常状态
Scheduler->>Scheduler : 跳过记录
end
```
**图表来源**
- [KafkaConsumerStatsService.java](file://jcpp-infrastructure-queue/src/main/java/sanbing/jcpp/infrastructure/queue/kafka/KafkaConsumerStatsService.java#L60-L90)
**章节来源**
- [KafkaConsumerStatsService.java](file://jcpp-infrastructure-queue/src/main/java/sanbing/jcpp/infrastructure/queue/kafka/KafkaConsumerStatsService.java#L1-L161)
## 系统资源监控
### 系统指标采集
系统通过SystemUtil类提供底层系统资源监控能力。
```mermaid
classDiagram
class SystemUtil {
-HardwareAbstractionLayer HARDWARE
+getMemoryUsage() Optional~Integer~
+getTotalMemory() Optional~Long~
+getCpuUsage() Optional~Integer~
+getCpuCount() Optional~Integer~
+getDiscSpaceUsage() Optional~Integer~
+getTotalDiscSpace() Optional~Long~
-toPercent(used, total) int
}
class ServiceInfoProvider {
<>
+getServiceInfo() ServiceInfo
+generateNewServiceInfoWithCurrentSystemInfo() ServiceInfo
+isMonolith() boolean
}
class DefaultServiceInfoProvider {
-String serviceId
-String serviceType
-ServiceInfo serviceInfo
-String hostAddress
-int restPort
-int grpcPort
+getServiceInfo() ServiceInfo
+generateNewServiceInfoWithCurrentSystemInfo() ServiceInfo
}
ServiceInfoProvider <|-- DefaultServiceInfoProvider
DefaultServiceInfoProvider --> SystemUtil
```
**图表来源**
- [SystemUtil.java](file://jcpp-infrastructure-util/src/main/java/sanbing/jcpp/infrastructure/util/SystemUtil.java#L1-L98)
- [DefaultServiceInfoProvider.java](file://jcpp-infrastructure-queue/src/main/java/sanbing/jcpp/infrastructure/queue/discovery/DefaultServiceInfoProvider.java#L84-L112)
### 资源监控指标
#### CPU监控
| 指标 | 获取方式 | 监控意义 |
|--------|----------------------------------------------------|--------|
| CPU使用率 | HARDWARE.getProcessor().getSystemCpuLoad() | 系统负载评估 |
| CPU核心数 | HARDWARE.getProcessor().getLogicalProcessorCount() | 并发能力参考 |
#### 内存监控
| 指标 | 获取方式 | 监控意义 |
|-------|-----------------------------------|--------|
| 内存使用率 | (total - available) / total * 100 | 内存压力评估 |
| 总内存容量 | HARDWARE.getMemory().getTotal() | 内存资源配置 |
#### 磁盘监控
| 指标 | 获取方式 | 监控意义 |
|-------|--------------------------------------|--------|
| 磁盘使用率 | (total - usable) / total * 100 | 磁盘空间压力 |
| 总磁盘容量 | Files.getFileStore().getTotalSpace() | 存储资源规划 |
**章节来源**
- [SystemUtil.java](file://jcpp-infrastructure-util/src/main/java/sanbing/jcpp/infrastructure/util/SystemUtil.java#L1-L98)
## 故障排查指南
### 常见故障场景
#### 服务无法启动
**症状表现**:
- 应用启动失败
- 端口绑定错误
- 依赖服务不可用
**排查步骤**:
```mermaid
flowchart TD
A["服务启动失败"] --> B{"检查端口占用"}
B --> |端口被占用| C["修改端口配置"]
B --> |端口正常| D{"检查依赖服务"}
D --> |数据库不可用| E["检查数据库连接"]
D --> |Redis不可用| F["检查Redis连接"]
D --> |Kafka不可用| G["检查Kafka集群"]
D --> |依赖正常| H["检查配置文件"]
C --> I["重启服务"]
E --> I
F --> I
G --> I
H --> I
```
**诊断命令**:
```bash
# 检查端口占用
netstat -tlnp | grep :8080
# 检查进程状态
ps aux | grep jcpp
# 查看启动日志
tail -f logs/jcpp-app.log
```
#### 消息积压问题
**症状表现**:
- Kafka消费者滞后增加
- 消息处理延迟
- 系统响应变慢
**排查流程**:
```mermaid
sequenceDiagram
participant Admin as 管理员
participant Monitor as 监控系统
participant Kafka as Kafka集群
participant Consumer as 消费者组
Admin->>Monitor : 触发积压检查
Monitor->>Kafka : 查询消费者偏移量
Kafka-->>Monitor : 返回偏移量信息
Monitor->>Kafka : 查询主题末尾偏移量
Kafka-->>Monitor : 返回末尾偏移量
Monitor->>Monitor : 计算滞后量
alt 滞后量过大
Monitor->>Admin : 发送告警通知
Admin->>Consumer : 检查消费者处理能力
Consumer-->>Admin : 返回处理状态
else 滞后量正常
Monitor->>Admin : 记录正常状态
end
```
**解决措施**:
1. 增加消费者实例数量
2. 优化消息处理逻辑
3. 调整批处理大小
4. 检查消费者组重新平衡
#### 高延迟问题
**症状表现**:
- API响应时间增加
- 用户体验下降
- 系统吞吐量降低
**分析方法**:
| 排查维度 | 检查项目 | 解决方案 |
|------|--------|---------|
| 应用层 | GC日志分析 | 调整JVM参数 |
| 数据库层 | 慢SQL分析 | 添加索引优化 |
| 网络层 | 连接池配置 | 增加连接数 |
| 缓存层 | 缓存命中率 | 优化缓存策略 |
**章节来源**
- [app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml#L1-L432)
- [protocol-service.yml](file://jcpp-protocol-bootstrap/src/main/resources/protocol-service.yml#L1-L35)
## 运维最佳实践
### 日常维护任务
#### 数据库备份策略
```mermaid
flowchart TD
A["数据库备份"] --> B["全量备份"]
A --> C["增量备份"]
B --> D["每周日执行"]
C --> E["每日凌晨执行"]
D --> F["保留4周"]
E --> G["保留7天"]
F --> H["归档存储"]
G --> H
H --> I["异地备份"]
I --> J["定期验证"]
```
#### 系统健康检查清单
| 检查项目 | 检查频率 | 关注指标 | 告警阈值 |
|--------|------|-----------|---------|
| 服务可用性 | 实时 | 响应时间 | >1000ms |
| CPU使用率 | 5分钟 | 平均值 | >80% |
| 内存使用率 | 5分钟 | 平均值 | >85% |
| 磁盘使用率 | 1小时 | 占用比例 | >90% |
| 错误率 | 实时 | 错误数量/总请求数 | >5% |
#### 配置管理规范
1. **环境隔离**:开发、测试、生产环境配置严格分离
2. **版本控制**:所有配置文件纳入版本控制系统
3. **变更审批**:重大配置变更需经过审批流程
4. **回滚准备**:每次配置变更都应准备回滚方案
### 性能优化建议
#### JVM调优参数
```yaml
# 生产环境推荐配置
JAVA_OPTS: >
-Xms2g -Xmx4g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/
-Djava.awt.headless=true
```
#### 数据库连接池优化
| 参数 | 推荐值 | 说明 |
|-------------------|--------|--------|
| maximumPoolSize | 64 | 最大连接数 |
| minimumIdle | 10 | 最小空闲连接 |
| connectionTimeout | 30000 | 连接超时时间 |
| idleTimeout | 600000 | 空闲连接超时 |
**章节来源**
- [app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml#L1-L432)
## 监控集成方案
### Prometheus集成
系统内置Prometheus指标导出功能,支持与主流监控系统集成。
#### 指标暴露配置
```yaml
management:
endpoints:
web:
exposure:
include: 'prometheus,health'
endpoint:
health:
show-details: always
```
#### 关键监控指标
| 指标名称 | 类型 | 说明 |
|------------------------------------|-----------|-----------|
| jcpp_api_requests_total | Counter | API请求总数 |
| jcpp_api_requests_duration_seconds | Histogram | API请求耗时分布 |
| jcpp_cache_hit_rate | Gauge | 缓存命中率 |
| jcpp_queue_lag | Gauge | 消息队列滞后量 |
| jcpp_system_cpu_usage | Gauge | CPU使用率 |
| jcpp_system_memory_usage | Gauge | 内存使用率 |
### Grafana仪表板
#### 系统概览面板
```mermaid
graph LR
A["Grafana仪表板"] --> B["系统资源监控"]
A --> C["应用性能监控"]
A --> D["业务指标监控"]
B --> B1["CPU使用率"]
B --> B2["内存使用率"]
B --> B3["磁盘空间"]
C --> C1["API响应时间"]
C --> C2["错误率"]
C --> C3["QPS"]
D --> D1["充电订单量"]
D --> D2["设备在线率"]
D --> D3["支付成功率"]
```
#### 告警规则配置
```yaml
groups:
- name: jcpp-alerts
rules:
- alert: HighCpuUsage
expr: jcpp_system_cpu_usage > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU使用率过高"
- alert: HighMemoryUsage
expr: jcpp_system_memory_usage > 85
for: 3m
labels:
severity: critical
annotations:
summary: "内存使用率过高"
```
### Docker监控
#### 容器化部署监控
```mermaid
graph TD
A["Docker Compose"] --> B["应用容器"]
A --> C["Kafka集群"]
A --> D["监控组件"]
B --> B1["JCPP应用"]
B --> B2["协议处理服务"]
C --> C1["Kafka Broker"]
C --> C2["Zookeeper"]
D --> D1["Prometheus"]
D --> D2["Grafana"]
D --> D3["Kafka Exporter"]
```
**图表来源**
- [docker-compose.kafka.yml](file://docker/docker-compose.kafka.yml#L1-L67)
**章节来源**
- [app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml#L80-L85)
- [protocol-service.yml](file://jcpp-protocol-bootstrap/src/main/resources/protocol-service.yml#L25-L30)
- [docker-compose.kafka.yml](file://docker/docker-compose.kafka.yml#L1-L67)