本文目录导读:

- 监控方案概览
- Prometheus + Grafana 对接方案(推荐)
- Prometheus 配置
- Grafana 仪表盘配置
- 告警规则配置
- Spring Boot Actuator 健康检查
- 日志监控集成
- 实战部署脚本
- 性能优化建议
我来详细介绍Java服务器监控的对接方法,包括多种主流方案和具体实现步骤。
监控方案概览
主流监控工具选择
- Prometheus + Grafana:最流行的开源方案
- JMX (Java Management Extensions):Java原生监控
- Spring Boot Actuator:Spring应用专用
- Zabbix:企业级监控
- Pinpoint/SkyWalking:APM类监控
Prometheus + Grafana 对接方案(推荐)
1 基础配置
<!-- pom.xml 依赖 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2 application.yml 配置
management:
endpoints:
web:
exposure:
include: health,info,prometheus,metrics
base-path: /actuator
metrics:
tags:
application: ${spring.application.name}
export:
prometheus:
enabled: true
step: 1m
descriptions: true
3 自定义监控指标
@Component
public class CustomMetrics {
@Autowired
private MeterRegistry meterRegistry;
// 计数器
private Counter requestCounter;
// 计时器
private Timer requestTimer;
// 仪表
private Gauge activeUsersGauge;
@PostConstruct
public void init() {
requestCounter = Counter.builder("api.requests.total")
.description("Total API requests")
.tag("service", "user-service")
.register(meterRegistry);
requestTimer = Timer.builder("api.requests.duration")
.description("API request duration")
.register(meterRegistry);
activeUsersGauge = Gauge.builder("users.active")
.description("Active users count")
.register(meterRegistry);
}
// 使用示例
public void recordRequest() {
requestCounter.increment();
}
public void recordRequestDuration(Runnable action) {
requestTimer.record(action);
}
}
4 JVM监控配置
@Configuration
public class JvmMetricsConfig {
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config()
.commonTags("application", "myapp");
}
@Bean
public JvmGcMetrics jvmGcMetrics() {
return new JvmGcMetrics();
}
@Bean
public JvmHeapMemoryMetrics jvmHeapMemoryMetrics() {
return new JvmHeapMemoryMetrics();
}
@Bean
public JvmThreadMetrics jvmThreadMetrics() {
return new JvmThreadMetrics();
}
}
Prometheus 配置
1 prometheus.yml
scrape_configs:
- job_name: 'java-apps'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080', '192.168.1.100:8080']
labels:
group: 'production'
- job_name: 'jvm-metrics'
metrics_path: '/metrics'
static_configs:
- targets: ['localhost:12345'] # JMX Exporter端口
2 JMX Exporter配置
# 启动参数添加
java -javaagent:jmx_prometheus_javaagent-0.16.1.jar=12345:config.yaml \
-jar your-application.jar
config.yaml:
---
startDelaySeconds: 0
ssl: false
rules:
- pattern: "java.lang:type=Memory"
name: jvm_memory_usage
- pattern: "java.lang:type=Threading"
name: jvm_threads
Grafana 仪表盘配置
1 数据源配置
{
"datasources": [
{
"name": "Prometheus",
"type": "prometheus",
"url": "http://prometheus:9090",
"access": "proxy",
"isDefault": true
}
]
}
2 关键监控面板
// CPU使用率
rate(process_cpu_usage{application="$app"}[5m])
// 内存使用
jvm_memory_used_bytes{area="heap", application="$app"}
// GC次数
rate(jvm_gc_pause_seconds_count{application="$app"}[5m])
// 线程数
jvm_threads_live_threads{application="$app"}
// 请求QPS
rate(http_server_requests_seconds_count{application="$app"}[1m])
// 错误率
rate(http_server_requests_seconds_count{status=~"5..", application="$app"}[5m]) /
rate(http_server_requests_seconds_count{application="$app"}[5m])
告警规则配置
1 Prometheus告警规则
groups:
- name: java-alerts
rules:
- alert: HighCPUUsage
expr: process_cpu_usage > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
- alert: OutOfMemory
expr: jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} > 0.9
for: 2m
labels:
severity: critical
- alert: HighGCFrequency
expr: rate(jvm_gc_pause_seconds_count[5m]) > 10
for: 5m
labels:
severity: warning
Spring Boot Actuator 健康检查
1 自定义健康指标
@Component
public class DatabaseHealthIndicator implements HealthIndicator {
@Autowired
private DataSource dataSource;
@Override
public Health health() {
try (Connection conn = dataSource.getConnection()) {
if (conn.isValid(1000)) {
return Health.up()
.withDetail("database", "MySQL")
.withDetail("version", conn.getMetaData().getDatabaseProductVersion())
.build();
}
return Health.down()
.withDetail("error", "Database connection failed")
.build();
} catch (SQLException e) {
return Health.down(e).build();
}
}
}
2 集成外部监控系统
@Component
public class MetricsPushGateway {
@Value("${pushgateway.url}")
private String pushgatewayUrl;
@Scheduled(fixedRate = 60000)
public void pushMetrics() {
Collecter collector = new Collecter();
// 收集自定义指标
collector.addMetric("custom_metric", 100);
// 推送到PushGateway
PushGateway pg = new PushGateway(pushgatewayUrl);
pg.pushAdd(collector, "custom_job");
}
}
日志监控集成
1 Logback配置
<configuration>
<appender name="METRICS" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="JSON"/>
</root>
</configuration>
实战部署脚本
1 Docker Compose部署
version: '3.8'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
java-app:
build: .
ports:
- "8080:8080"
environment:
- JAVA_OPTS=-javaagent:/app/jmx_exporter.jar=12345:/app/config.yaml
性能优化建议
1 采样策略
- 核心指标:5s采样间隔
- 业务指标:30s-1min采样间隔
- JVM指标:15s采样间隔
2 数据存储
- 短期数据(<7天):Prometheus本地存储
- 长期数据:Thanos/Cortex
- 高基数指标:使用Histogram
3 关键监控指标
CPU: usage, load average
2. 内存: heap, non-heap, metaspace
3. GC: young/old GC frequency, pause time
4. 线程: active, blocked, waiting
5. 连接池: active, idle, pending
6. 请求: QPS, P99 latency, error rate
这套方案可以实现对Java服务器的全方位监控,包括性能、可用性、资源使用等维度,可根据实际需求灵活调整监控指标和告警阈值。