时序数据库架构
时序数据库架构
时序数据特点
时序数据按时间顺序产生,具有写多读少、追加写入、时间范围查询等特点。
metric_name,tag1=value1,tag2=value2 field1=value1,field2=value2 timestamp
cpu_usage,host=server1,region=us-east user=85.2,system=14.8 1700000000000
InfluxDB架构
InfluxDB采用TSM引擎,通过时间分区和压缩算法高效存储时序数据。
@Service
public class InfluxMetricsService {
@Autowired
private InfluxDB influxDB;
public void writeMetric(String measurement, Map<String, String> tags,
Map<String, Object> fields) {
Point point = Point.measurement(measurement)
.tag(tags)
.fields(fields)
.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
.build();
influxDB.write(Point.measurement("cpu_usage")
.tag("host", "server1")
.field("user", 85.2)
.field("system", 14.8)
.build());
}
public List<Map<String, Object>> query(String flux) {
QueryApi queryApi = influxDB.getQueryApi();
return queryApi.query(flux).stream()
.flatMap(table -> table.getRecords().stream())
.map(record -> Map.of(
"time", record.getTime(),
"value", record.getValue())
.collect(Collectors.toList());
}
}
@Configuration
public class InfluxDBConfig {
@Bean
public InfluxDB influxDB() {
InfluxDB influxDB = InfluxDBFactory.connect(
"http://localhost:8086", "admin", "password");
influxDB.setDatabase("metrics");
influxDB.enableGzip();
return influxDB;
}
}
Prometheus架构
Pull模式采集指标数据,通过PromQL查询和AlertManager告警。
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:
- 'alert_rules.yml'
// Spring Boot暴露Prometheus指标
@RestController
public class MetricsController {
private final Counter requestCounter = Counter.builder("http_requests_total")
.tag("method", "GET")
.register(Metrics.globalRegistry);
private final Timer timer = Timer.builder("http_request_duration")
.publishPercentiles(0.5, 0.95, 0.99)
.register(Metrics.globalRegistry);
@GetMapping("/api/data")
public ResponseEntity<Data> getData() {
return timer.record(() -> {
requestCounter.increment();
return ResponseEntity.ok(dataService.getData());
});
}
}
告警规则
# alert_rules.yml
groups:
- name: high_cpu
rules:
- alert: HighCpuUsage
expr: cpu_usage_percent > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is above 80% for 5 minutes"