分析 Java 业务代码,识别可监控的指标项,提供指标定义和采集建议。
**/*Service.java, **/*Controller.java, **/*Manager.java, **/*Facade.java本 skill 不预设具体业务领域的指标,而是基于 代码模式 识别指标特征,由用户根据业务定义具体指标名。
读取用户提供分析的文件
询问用户
是否需要扫描项目中的 AOP 类?(可选)
- 是:扫描项目中已有的 Aspect/Interceptor/Filter,作为补充参考
- 否:仅分析用户提供的文件
指标识别与分析
生成识别报告(统一输出格式)
方法名是识别指标的最重要线索:
方法名模式识别为指标类型建议createXxxXxx 创建CountersaveXxx / addXxxXxx 保存CounterdeleteXxx / removeXxxXxx 删除CounterupdateXxx / modifyXxxXxx 更新CountergetXxx / queryXxxXxx 查询Counter / HistogramlistXxxXxx 列表HistogramcountXxxXxx 计数Gauge
业务动作识别:
方法名模式识别为指标类型建议login / logout登录/登出Counterpay / refund支付/退款Counter + Amount Gaugeapprove / reject审批Counter (带状态标签)send / receive发送/接收Counterexecute / run执行Counter + Histogramhandle / process处理Counter + Histogramsync同步Counter + Histogramjava
// 识别: 方法名包含 create/add/save → 增量计数器
public User createUser(UserRequest request) { } → 建议指标: xxx_created_total
// 识别: 方法名包含 pay/refund → 交易类指标
public PayResult pay(PayRequest request) { } → 建议指标: xxx_pay_total + xxx_pay_amount
// 识别: 方法名包含 login → 登录类指标
public LoginResult login(String username) { } → 建议指标: login_attempts_total
// 识别: 方法名包含 get/find/query → 查询类指标
public Order getOrder(Long id) { } → 建议指标: xxx_query_total + xxx_query_duration_ms
根据参数类型推断指标:
参数特征识别为指标建议Pageable / PageRequest分页查询添加 page/size 标签List<XxxRequest>批量操作记录批量大小Date / LocalDateTime时间敏感添加时间维度标签BigDecimal / Double(金额)金额类记录金额 sum/avgLong(ID)实体操作可添加 ID 前缀标签java
// 识别: 分页参数 → 分页指标
public Page<Order> listOrders(Pageable pageable) {
// 建议添加标签: page, size
}
// 识别: 批量参数 → 批量大小指标
public void batchImport(List<ImportData> dataList) {
// 建议指标: batch_size (记录 dataList.size())
}
// 识别: 金额参数 → 金额类指标
public void charge(BigDecimal amount) {
// 建议指标: xxx_amount_total (Sum)
}
返回值特征识别为指标建议boolean / Result<T>操作结果区分 success/failedPage<T>分页结果记录 total 字段List<T>列表结果记录 sizeOptional<T>空值判断记录 hit/missResponseEntityHTTP 结果记录 status codejava
// 识别: boolean 返回 → 成功/失败分离
public boolean createXxx(XxxRequest req) {
// 建议: success_counter + failed_counter (而非 total)
}
// 识别: Result 类 → 状态标签
public Result<Order> createOrder(OrderRequest req) {
// 建议: status={success/failed} 标签
// 建议: error_code 标签
}
代码模式识别为指标建议status = XxxStatus.Y状态变更状态分布 Gaugeif (condition) { ... } else { ... }分支逻辑分支计数器switch (status)多状态各状态计数boolean flag开关当前状态 Gaugejava
// 识别: 状态赋值 → 状态分布指标
public void updateStatus(Long id, OrderStatus status) {
// 指标: 各状态订单数量 (Gauge)
// 标签: status
}
// 识别: 分支逻辑 → 分支计数
if (vipUser) {
// 会员分支
} else {
// 普通用户分支
}
// 建议: user_type 分支计数
代码模式识别为指标建议catch (Exception e)异常errors_totalthrow new XxxException业务异常biz_errors_total (带 error_code)retry / fallback重试/降级retry_count / fallback_counttimeout超时timeout_countjava
// 识别: catch 块 → 错误计数
try {
// ... business logic
} catch (BusinessException e) {
// 建议: biz_errors_total{error_code=xxx}
throw e;
} catch (Exception e) {
// 建议: system_errors_total
throw e;
}
代码模式识别为指标建议System.currentTimeMillis()手动耗时Histogram@Cacheable缓存cache_hit_ratefor 循环循环处理处理计数 + 耗时java
// 识别: 手动计时 → 耗时指标
long start = System.currentTimeMillis();
// ... logic ...
long cost = System.currentTimeMillis() - start;
// 建议: xxx_duration_ms (Histogram)
// 识别: 循环 → 批量计数
for (Item item : items) {
process(item);
}
// 建议: batch_process_total + batch_process_duration_ms
代码模式识别为指标建议restTemplate.exchange()HTTP 调用http_calls_total + durationxxxClient.call()RPC 调用rpc_calls_total + durationrepository.save()DB 操作db_calls_total + durationredisTemplate.opsForXxx()Redis 操作redis_ops_total + hit_ratejava
// 外部调用 → 独立耗时指标
Result result = remoteService.call(param);
// 建议: remote_service_call_duration_ms
// 建议: remote_service_call_total{status=success/failed}
根据方法上下文推断业务指标:
java
// 从类名推断业务领域
class OrderService { } // 订单业务 → orders_xxx
class UserService { } // 用户业务 → users_xxx
class PaymentService { } // 支付业务 → payments_xxx
// 从复合方法名推断
public int getTodayActiveUsers() {
// 指标: daily_active_users (Gauge)
}
public double calculateConversionRate() {
// 指标: conversion_rate (Computed/Ratio)
}
public BigDecimal getTotalRevenue() {
// 指标: total_revenue (Gauge)
}
当用户选择扫描项目中的 AOP 类时,作为补充参考,避免指标重复采集。
类型识别特征作用Aspect@Aspect + @Component已有切面逻辑Interceptorimplements HandlerInterceptorWeb 层拦截Filter@Component + doFilter请求过滤器
**/*Aspect.java**/*Interceptor.java**/*Filter.java如扫描到 AOP,输出补充信息:
markdown
### 补充参考:项目中已有 AOP
| AOP 类 | 切点范围 | 已有采集 |
|--------|----------|----------|
| LoggingAspect | 所有 Service | method_entry, method_exit |
| PerformanceAspect | @Monitor 注解 | method_duration_ms |
### 建议
- 已有指标可复用,无需重复定义
- 建议在现有切面中扩展 Counter 类型指标
无论是否扫描 AOP,最终输出的指标格式统一:
markdown
## {ClassName}.java 指标识别结果
### 识别的指标项
| 方法 | 识别依据 | 建议指标名 | 类型 | 建议标签 |
|------|----------|------------|------|----------|
| createXxx | 方法名 | xxx_created_total | Counter | - |
| deleteXxx | 方法名 | xxx_deleted_total | Counter | - |
| getXxxById | 方法名 | xxx_query_total | Counter | - |
| getXxxById | 方法名 | xxx_query_duration_ms | Histogram | - |
| listXxx | 方法名 | xxx_query_duration_ms | Histogram | page, size |
| createXxx | 返回 Result<T> | xxx_success_total | Counter | status=success |
| createXxx | 返回 Result<T> | xxx_failed_total | Counter | status=failed |
### 采集建议
| 指标名 | 建议采集方式 | 说明 |
|--------|--------------|------|
| xxx_created_total | 手动埋点 / 注解 | 用户自行选择 |
| xxx_query_duration_ms | AOP 切面 | 通用耗时采集 |
用户可根据项目情况选择采集方式:
方式适用场景示例手动埋点关键业务指标直接注入 Counter注解 + 通用切面需要灵活控制@Metric + Aspect复用现有 AOP项目已有切面扩展现有逻辑java
// 方式一:手动埋点
private final Counter counter = Counter.builder("xxx").register(registry);
counter.increment();
// 方式二:注解标记
@Metric("xxx_total")
public void method() { }
// 方式三:复用现有 AOP
// 在项目已有的 LoggingAspect 中添加 Counter 采集
用户根据识别的特征自定义指标名:
规则示例{业务域}_{动作}_{实体}_totalorders_create_total{业务域}_{动作}_{实体}_duration_msuser_query_duration_ms{业务域}_{状态}_currentorder_status_current{动作}_attempts_totallogin_attempts_total
基于代码特征自动推断:
代码特征建议标签返回 Result/Responsestatus=success/failed异常 catcherror_codePageable 参数page, size用户相关user_type, vip_level设备相关device_type, os_version