Java 服务监控告警落地方案
一 架构与工具选型
二 Spring Boot 快速接入示例
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
management:
endpoints.web.exposure.include: health,info,prometheus
endpoint.prometheus.enabled: true
metrics.export.prometheus.enabled: true
import io.micrometer.core.annotation.Timed;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Timed(value = "hello.request.time", description = "Time taken to return hello")
@GetMapping("/hello")
public String hello() {
return "Hello, World!";
}
}
三 告警规则与通知配置
groups:
- name: java-app
rules:
- alert: HighHeapUsage
expr: (jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"}) * 100 > 85
for: 10m
labels:
severity: critical
annotations:
summary: "High heap memory on {{ $labels.instance }}"
description: "Heap usage is {{ $value | humanizePercentage }} for >10m."
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status=~"5.."}[5m]) / rate(http_server_requests_seconds_count[5m]) > 0.01
for: 5m
labels:
severity: warning
annotations:
summary: "High 5xx error rate on {{ $labels.instance }}"
description: "Error rate is {{ $value | humanizePercentage }} over 5 minutes."
- alert: HighCpuUsage
expr: avg by(instance)(rate(container_cpu_usage_seconds_total{image!="",container!="POD"}[5m])) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage > 80% for >10m."
# prometheus.yml
rule_files:
- "rules.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# alertmanager.yml
route:
receiver: 'team-alerts'
group_by: ['alertname', 'instance']
group_wait: 10s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'team-alerts'
email_configs:
- to: 'team@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'user'
auth_password: 'pass'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
send_resolved: true
四 非 Spring 应用与 Kubernetes 部署要点
import io.prometheus.client.*;
import io.prometheus.client.hotspot.DefaultExports;
public class MetricsApp {
public static void main(String[] args) throws Exception {
CollectorRegistry registry = new CollectorRegistry();
DefaultExports.initialize();
new HTTPServer(new InetSocketAddress(1234), registry);
}
}
五 异常分级与落地建议
| 异常级别 | 触发场景 | 日志级别 | 建议告警方式 | HTTP 状态码 |
|---|---|---|---|---|
| 业务异常 | 参数校验、业务规则冲突 | WARN | 通常不告警,记录与埋点 | 400 |
| 认证授权异常 | 未登录、权限不足 | WARN | 通常不告警,审计记录 | 401/403 |
| 依赖服务异常 | 下游超时/失败、熔断 | ERROR | 即时告警(钉钉/短信) | 503 |
| 系统异常 | DB/中间件不可用、空指针 | ERROR | 紧急告警(电话/PagerDuty) | 500 |
| 未知异常 | 未捕获运行时异常 | ERROR | 紧急告警(电话/PagerDuty) | 500 |
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。