基本概念
在 jvmguard 中,事务是指需要测量耗时的方法调用。jvmguard 记录调用的耗时,并构建一个标识该调用的事务名称。
事务命名对 jvmguard UI 中呈现的内容有重要影响:
- 它帮助理解是什么触发了该事务。
- 它将具有相同事务名称的所有调用归为一组,从而决定测量的粒度。
- 它可以作为过滤掉不相关操作的基础。
jvmguard 无法知道哪些方法调用对分析有意义,因此配置事务是为应用程序搭建监控的重要环节。定义事务的方式是选择 关注的方法,可以直接在 jvmguard UI 中选择,也可以在代码中使用注解。
例如,可能需要测量某个服务方法的调用。默认情况下,事务名称是类名和方法名,但也可以由命名元素组合而成,例如 某个方法参数的值,或对实例调用 getter 的结果。这样就可以按对分析有意义的数据对调用进行分组。
如果某些被拦截的调用没有意义,可以根据它们将关联的名称丢弃事务。如果生成了过多不同的事务名称,jvmguard 会限制不同名称的数量上限,并向收件箱发送一条消息,说明如何解决这种情况。
根据记录的事务,jvmguard 构建调用树和热点,展示时间实际花费在哪里。
事务关联有策略。策略决定:
- 事务可接受的耗时
- 检测和处理错误的方式
对于策略中被违反的每个条件,都可以在 jvmguard UI 中单独查看事务详情。例如,可以单独检查慢事务或出错的事务, 而不是与同名的其他正常事务累积在一起。
jvmguard 通过插桩方法从受监控的应用程序获取信息。为了保持低开销,只有属于事务定义的方法才会被插桩。当某个 策略违规需要更深入的分析时,可以配置一个触发器,对违规的 VM 进行分析捕获。
jvmguard 中另一种基本的数据源是对标量值(如堆大小或线程数)的周期性采样。每条遥测 都可以绘制成随时间变化的图表。在 jvmguard 中,遥测常以 sparkline 的形式显示,不带坐标轴刻度,末尾附带当前值。
jvmguard 内置了许多标准遥测,从 JVM 的知名子系统收集数据。此外,由
MBean 暴露的整数值也可以被 jvmguard 监控。在编程层面,
可以使用 @Telemetry 注解在具有数值返回值的静态方法上定义
自定义遥测。
对于不同的遥测,可能有不同的期望。例如,堆使用量通常围绕一条基线上下波动,而持续上升则是应用程序中存在缺陷 的迹象。
又或者,活动线程数应低于根据机器容量得出的某个上限。
为了检测异常状况,可以定义带有可选下界和可选上界的阈值。阈值违规按单个 VM 或 按 VM 组计数。它们不关联任何操作。有时,单个阈值违规可能不需要采取任何措施,只有在一连串此类状况出现时才 需要处理。
事务和遥测都可能导致异常状况:事务策略可以识别出慢事务,遥测阈值也可能被违反。
为了对这些状况采取行动,需要使用触发器。触发器不在单个 VM 级别上工作,而是处理 VM 组中递归包含的所有 VM。组层级中的每个 VM 组都有自己独立的触发器。
例如,可以为所有 VM 定义一个触发器,当已连接 VM 的数量低于 20 时触发。在同一个 VM 层级中,可能还有一个只包含 数据库 VM 的组。在该组中,可能需要一个单独的触发器,当已连接的数据库 VM 数量低于 3 时触发。
触发器触发时会执行一个操作列表。操作可以进行分析捕获,例如 JFR 记录、堆转储或线程转储,也可以通过电子邮件、 Webhook、收件箱消息或事件日志条目发送通知。