Java服务器监控案例如何对接

wen java案例 35

本文目录导读:

Java服务器监控案例如何对接

  1. 监控方案概览
  2. Prometheus + Grafana 对接方案(推荐)
  3. Prometheus 配置
  4. Grafana 仪表盘配置
  5. 告警规则配置
  6. Spring Boot Actuator 健康检查
  7. 日志监控集成
  8. 实战部署脚本
  9. 性能优化建议

我来详细介绍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服务器的全方位监控,包括性能、可用性、资源使用等维度,可根据实际需求灵活调整监控指标和告警阈值。

抱歉,评论功能暂时关闭!