# 运维监控系统
## 🎯 学习目标
通过本章学习,您将能够:
- 理解现代运维监控的核心理念和体系架构
- 掌握Prometheus、Grafana等监控工具的使用
- 学会为Chat-Room项目设计全面的监控方案
- 实现智能告警和自动化运维机制
## 📊 监控体系架构
### 监控技术栈
```mermaid
graph TB
subgraph "监控技术栈"
A[数据收集层
Data Collection] --> A1[Prometheus
指标收集]
A --> A2[Fluentd/ELK
日志收集]
A --> A3[Jaeger
链路追踪]
A --> A4[Node Exporter
系统指标]
B[数据存储层
Data Storage] --> B1[Prometheus TSDB
时序数据库]
B --> B2[Elasticsearch
日志存储]
B --> B3[InfluxDB
高性能存储]
C[数据处理层
Data Processing] --> C1[AlertManager
告警管理]
C --> C2[Grafana
可视化]
C --> C3[Kibana
日志分析]
D[应用层
Application Layer] --> D1[仪表板
Dashboards]
D --> D2[告警通知
Notifications]
D --> D3[报告生成
Reports]
end
A --> B
B --> C
C --> D
style A fill:#e8f5e8
style D fill:#f8d7da
```
### 监控数据流
```mermaid
sequenceDiagram
participant App as Chat-Room应用
participant Prom as Prometheus
participant Alert as AlertManager
participant Grafana as Grafana
participant Ops as 运维人员
Note over App,Ops: 监控数据流程
App->>Prom: 暴露指标端点
Prom->>Prom: 定期拉取指标
Prom->>Prom: 存储时序数据
alt 触发告警条件
Prom->>Alert: 发送告警
Alert->>Alert: 处理告警规则
Alert->>Ops: 发送通知
end
Grafana->>Prom: 查询指标数据
Prom->>Grafana: 返回数据
Grafana->>Ops: 显示仪表板
Note over App,Ops: 实时监控循环
```
## 🔧 监控系统实现
### Prometheus配置
```yaml
# monitoring/prometheus.yml - Prometheus配置
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: 'chatroom-cluster'
environment: 'production'
rule_files:
- "alert_rules.yml"
- "recording_rules.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
scrape_configs:
# Chat-Room应用指标
- job_name: 'chatroom-server'
static_configs:
- targets: ['chatroom-server:8000']
metrics_path: '/metrics'
scrape_interval: 10s
scrape_timeout: 5s
# 系统指标
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
# Kubernetes指标
- job_name: 'kubernetes-apiservers'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
# PostgreSQL指标
- job_name: 'postgres-exporter'
static_configs:
- targets: ['postgres-exporter:9187']
# Redis指标
- job_name: 'redis-exporter'
static_configs:
- targets: ['redis-exporter:9121']
# Nginx指标
- job_name: 'nginx-exporter'
static_configs:
- targets: ['nginx-exporter:9113']
```
```yaml
# monitoring/alert_rules.yml - 告警规则
groups:
- name: chatroom.rules
rules:
# 应用级别告警
- alert: ChatRoomHighErrorRate
expr: rate(chatroom_http_requests_total{status=~"5.."}[5m]) > 0.1
for: 2m
labels:
severity: critical
service: chatroom
annotations:
summary: "Chat-Room服务错误率过高"
description: "Chat-Room服务在过去5分钟内错误率超过10%,当前值: {{ $value }}"
- alert: ChatRoomHighResponseTime
expr: histogram_quantile(0.95, rate(chatroom_http_request_duration_seconds_bucket[5m])) > 2
for: 5m
labels:
severity: warning
service: chatroom
annotations:
summary: "Chat-Room响应时间过长"
description: "Chat-Room 95%分位响应时间超过2秒,当前值: {{ $value }}秒"
- alert: ChatRoomHighConcurrentConnections
expr: chatroom_websocket_connections_active > 1000
for: 1m
labels:
severity: warning
service: chatroom
annotations:
summary: "Chat-Room并发连接数过高"
description: "当前WebSocket连接数: {{ $value }},超过阈值1000"
# 系统级别告警
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "服务器CPU使用率过高"
description: "实例 {{ $labels.instance }} CPU使用率超过80%,当前值: {{ $value }}%"
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 5m
labels:
severity: critical
annotations:
summary: "服务器内存使用率过高"
description: "实例 {{ $labels.instance }} 内存使用率超过85%,当前值: {{ $value }}%"
- alert: DiskSpaceUsage
expr: (node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足"
description: "实例 {{ $labels.instance }} 磁盘使用率超过90%,当前值: {{ $value }}%"
# 数据库告警
- alert: PostgreSQLDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
service: postgresql
annotations:
summary: "PostgreSQL数据库不可用"
description: "PostgreSQL实例 {{ $labels.instance }} 无法连接"
- alert: PostgreSQLHighConnections
expr: pg_stat_database_numbackends / pg_settings_max_connections * 100 > 80
for: 5m
labels:
severity: warning
service: postgresql
annotations:
summary: "PostgreSQL连接数过高"
description: "PostgreSQL连接使用率超过80%,当前值: {{ $value }}%"
# Redis告警
- alert: RedisDown
expr: redis_up == 0
for: 1m
labels:
severity: critical
service: redis
annotations:
summary: "Redis服务不可用"
description: "Redis实例 {{ $labels.instance }} 无法连接"
- alert: RedisHighMemoryUsage
expr: redis_memory_used_bytes / redis_memory_max_bytes * 100 > 90
for: 5m
labels:
severity: warning
service: redis
annotations:
summary: "Redis内存使用率过高"
description: "Redis内存使用率超过90%,当前值: {{ $value }}%"
```
### AlertManager配置
```yaml
# monitoring/alertmanager.yml - AlertManager配置
global:
smtp_smarthost: 'smtp.gmail.com:587'
smtp_from: 'alerts@chatroom.example.com'
smtp_auth_username: 'alerts@chatroom.example.com'
smtp_auth_password: 'your-app-password'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'default-receiver'
routes:
- match:
severity: critical
receiver: 'critical-alerts'
group_wait: 5s
repeat_interval: 30m
- match:
service: chatroom
receiver: 'chatroom-team'
- match:
service: postgresql
receiver: 'database-team'
receivers:
- name: 'default-receiver'
email_configs:
- to: 'ops@chatroom.example.com'
subject: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}'
body: |
{{ range .Alerts }}
告警: {{ .Annotations.summary }}
描述: {{ .Annotations.description }}
标签: {{ range .Labels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}
时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
- name: 'critical-alerts'
email_configs:
- to: 'critical@chatroom.example.com'
subject: '🚨 [CRITICAL] {{ .GroupLabels.alertname }}'
body: |
严重告警触发!
{{ range .Alerts }}
告警: {{ .Annotations.summary }}
描述: {{ .Annotations.description }}
严重程度: {{ .Labels.severity }}
服务: {{ .Labels.service }}
时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
channel: '#critical-alerts'
title: '🚨 Critical Alert: {{ .GroupLabels.alertname }}'
text: |
{{ range .Alerts }}
*Alert:* {{ .Annotations.summary }}
*Description:* {{ .Annotations.description }}
*Severity:* {{ .Labels.severity }}
*Service:* {{ .Labels.service }}
{{ end }}
- name: 'chatroom-team'
email_configs:
- to: 'chatroom-dev@example.com'
subject: '[Chat-Room] {{ .GroupLabels.alertname }}'
webhook_configs:
- url: 'http://chatroom-webhook:8080/alerts'
send_resolved: true
- name: 'database-team'
email_configs:
- to: 'dba@example.com'
subject: '[Database] {{ .GroupLabels.alertname }}'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
```
### Grafana仪表板配置
```python
# monitoring/grafana_dashboard.py - Grafana仪表板生成器
import json
from typing import Dict, List, Any
class GrafanaDashboardGenerator:
"""
Grafana仪表板生成器
功能:
1. 自动生成Chat-Room监控仪表板
2. 创建系统资源监控面板
3. 生成业务指标可视化
4. 配置告警和通知
"""
def __init__(self):
self.dashboard_template = {
"dashboard": {
"id": None,
"title": "Chat-Room监控仪表板",
"tags": ["chatroom", "monitoring"],
"timezone": "browser",
"refresh": "30s",
"time": {
"from": "now-1h",
"to": "now"
},
"panels": []
}
}
def create_chatroom_dashboard(self) -> Dict[str, Any]:
"""创建Chat-Room主仪表板"""
dashboard = self.dashboard_template.copy()
# 添加面板
panels = [
self._create_overview_panel(),
self._create_performance_panel(),
self._create_websocket_panel(),
self._create_database_panel(),
self._create_system_panel(),
self._create_error_panel()
]
dashboard["dashboard"]["panels"] = panels
return dashboard
def _create_overview_panel(self) -> Dict[str, Any]:
"""创建概览面板"""
return {
"id": 1,
"title": "服务概览",
"type": "stat",
"gridPos": {"h": 8, "w": 24, "x": 0, "y": 0},
"targets": [
{
"expr": "up{job='chatroom-server'}",
"legendFormat": "服务状态",
"refId": "A"
},
{
"expr": "chatroom_websocket_connections_active",
"legendFormat": "活跃连接",
"refId": "B"
},
{
"expr": "rate(chatroom_messages_total[5m]) * 60",
"legendFormat": "每分钟消息数",
"refId": "C"
},
{
"expr": "chatroom_users_online",
"legendFormat": "在线用户",
"refId": "D"
}
],
"fieldConfig": {
"defaults": {
"color": {"mode": "palette-classic"},
"custom": {
"displayMode": "list",
"orientation": "horizontal"
},
"mappings": [],
"thresholds": {
"steps": [
{"color": "green", "value": None},
{"color": "red", "value": 0}
]
}
}
}
}
def _create_performance_panel(self) -> Dict[str, Any]:
"""创建性能面板"""
return {
"id": 2,
"title": "性能指标",
"type": "timeseries",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 8},
"targets": [
{
"expr": "histogram_quantile(0.95, rate(chatroom_http_request_duration_seconds_bucket[5m]))",
"legendFormat": "95%响应时间",
"refId": "A"
},
{
"expr": "histogram_quantile(0.50, rate(chatroom_http_request_duration_seconds_bucket[5m]))",
"legendFormat": "50%响应时间",
"refId": "B"
},
{
"expr": "rate(chatroom_http_requests_total[5m])",
"legendFormat": "请求速率",
"refId": "C"
}
],
"fieldConfig": {
"defaults": {
"color": {"mode": "palette-classic"},
"custom": {
"drawStyle": "line",
"lineInterpolation": "linear",
"barAlignment": 0,
"lineWidth": 1,
"fillOpacity": 10,
"gradientMode": "none",
"spanNulls": False,
"insertNulls": False,
"showPoints": "never",
"pointSize": 5
},
"unit": "s"
}
}
}
def _create_websocket_panel(self) -> Dict[str, Any]:
"""创建WebSocket面板"""
return {
"id": 3,
"title": "WebSocket连接",
"type": "timeseries",
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 8},
"targets": [
{
"expr": "chatroom_websocket_connections_active",
"legendFormat": "活跃连接",
"refId": "A"
},
{
"expr": "rate(chatroom_websocket_connections_total[5m]) * 60",
"legendFormat": "每分钟新连接",
"refId": "B"
},
{
"expr": "rate(chatroom_websocket_disconnections_total[5m]) * 60",
"legendFormat": "每分钟断开连接",
"refId": "C"
}
]
}
def _create_database_panel(self) -> Dict[str, Any]:
"""创建数据库面板"""
return {
"id": 4,
"title": "数据库性能",
"type": "timeseries",
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 16},
"targets": [
{
"expr": "pg_stat_database_numbackends",
"legendFormat": "数据库连接数",
"refId": "A"
},
{
"expr": "rate(pg_stat_database_xact_commit[5m])",
"legendFormat": "事务提交率",
"refId": "B"
},
{
"expr": "pg_stat_database_tup_inserted + pg_stat_database_tup_updated + pg_stat_database_tup_deleted",
"legendFormat": "数据变更操作",
"refId": "C"
}
]
}
def _create_system_panel(self) -> Dict[str, Any]:
"""创建系统资源面板"""
return {
"id": 5,
"title": "系统资源",
"type": "timeseries",
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 16},
"targets": [
{
"expr": "100 - (avg by(instance) (irate(node_cpu_seconds_total{mode='idle'}[5m])) * 100)",
"legendFormat": "CPU使用率",
"refId": "A"
},
{
"expr": "(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100",
"legendFormat": "内存使用率",
"refId": "B"
},
{
"expr": "(node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100",
"legendFormat": "磁盘使用率",
"refId": "C"
}
]
}
def _create_error_panel(self) -> Dict[str, Any]:
"""创建错误监控面板"""
return {
"id": 6,
"title": "错误监控",
"type": "timeseries",
"gridPos": {"h": 8, "w": 24, "x": 0, "y": 24},
"targets": [
{
"expr": "rate(chatroom_http_requests_total{status=~'4..'}[5m])",
"legendFormat": "4xx错误率",
"refId": "A"
},
{
"expr": "rate(chatroom_http_requests_total{status=~'5..'}[5m])",
"legendFormat": "5xx错误率",
"refId": "B"
},
{
"expr": "rate(chatroom_exceptions_total[5m])",
"legendFormat": "异常率",
"refId": "C"
}
]
}
def export_dashboard(self, filename: str = "chatroom-dashboard.json"):
"""导出仪表板配置"""
dashboard = self.create_chatroom_dashboard()
with open(filename, 'w', encoding='utf-8') as f:
json.dump(dashboard, f, indent=2, ensure_ascii=False)
print(f"仪表板配置已导出到: {filename}")
# 使用示例
def demo_monitoring_operations():
"""运维监控演示"""
print("=== Chat-Room运维监控演示 ===")
# 生成Grafana仪表板
generator = GrafanaDashboardGenerator()
dashboard = generator.create_chatroom_dashboard()
print("1. Grafana仪表板配置:")
print(f" - 面板数量: {len(dashboard['dashboard']['panels'])}")
print(" - 监控指标: 服务状态、性能、WebSocket、数据库、系统资源、错误")
print("\n2. Prometheus监控指标:")
metrics = [
"chatroom_http_requests_total",
"chatroom_http_request_duration_seconds",
"chatroom_websocket_connections_active",
"chatroom_messages_total",
"chatroom_users_online",
"chatroom_exceptions_total"
]
for metric in metrics:
print(f" - {metric}")
print("\n3. 告警规则:")
alerts = [
"ChatRoomHighErrorRate - 错误率过高",
"ChatRoomHighResponseTime - 响应时间过长",
"ChatRoomHighConcurrentConnections - 并发连接过多",
"HighCPUUsage - CPU使用率过高",
"HighMemoryUsage - 内存使用率过高",
"PostgreSQLDown - 数据库不可用"
]
for alert in alerts:
print(f" - {alert}")
print("\n4. 通知渠道:")
print(" - 邮件通知: 发送到运维团队")
print(" - Slack通知: 严重告警推送")
print(" - Webhook通知: 集成到Chat-Room系统")
print("\n5. 监控最佳实践:")
print(" - 四个黄金信号: 延迟、流量、错误、饱和度")
print(" - SLI/SLO定义: 可用性99.9%,响应时间<2s")
print(" - 分层监控: 基础设施、应用、业务")
print(" - 智能告警: 避免告警疲劳")
if __name__ == "__main__":
demo_monitoring_operations()
```
## 🎯 实践练习
### 练习1:智能告警系统
```python
class IntelligentAlertingSystem:
"""
智能告警系统练习
要求:
1. 实现基于机器学习的异常检测
2. 支持告警聚合和去重
3. 实现告警升级和自动恢复
4. 添加告警疲劳防护机制
"""
def detect_anomalies(self, metrics: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""检测异常"""
# TODO: 实现异常检测
pass
def aggregate_alerts(self, alerts: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""聚合告警"""
# TODO: 实现告警聚合
pass
```
### 练习2:自动化运维系统
```python
class AutomatedOperationsSystem:
"""
自动化运维系统练习
要求:
1. 实现自动扩缩容机制
2. 支持故障自动恢复
3. 实现配置自动更新
4. 添加运维操作审计
"""
def auto_scale_services(self, metrics: Dict[str, Any]) -> Dict[str, Any]:
"""自动扩缩容"""
# TODO: 实现自动扩缩容
pass
def auto_recovery(self, failure_info: Dict[str, Any]) -> bool:
"""自动故障恢复"""
# TODO: 实现自动恢复
pass
```
## ✅ 学习检查
完成本章学习后,请确认您能够:
- [ ] 理解现代运维监控的体系架构
- [ ] 配置Prometheus和Grafana监控系统
- [ ] 设计告警规则和通知机制
- [ ] 创建监控仪表板和可视化
- [ ] 实现智能告警和自动化运维
- [ ] 完成实践练习
## 📚 总结
恭喜您完成了Chat-Room学习文档v02的全部内容!您已经掌握了:
### 🎓 核心技能
- **现代Python开发**: 异步编程、类型提示、最佳实践
- **网络编程**: Socket编程、WebSocket、协议设计
- **数据库设计**: 关系型数据库、查询优化、数据迁移
- **AI集成**: GLM-4-Flash API、上下文管理、智能助手
- **用户界面**: TUI设计、Textual框架、现代终端应用
- **系统架构**: 微服务、模块化设计、可扩展架构
- **测试质量**: 单元测试、集成测试、TDD、覆盖率分析
- **部署运维**: 容器化、Kubernetes、CI/CD、监控告警
### 🚀 项目成果
通过学习本文档,您已经具备了构建企业级Chat-Room应用的完整技能栈,包括:
- 高性能的实时通信系统
- 现代化的用户界面和体验
- 完整的AI集成和智能功能
- 企业级的部署和运维方案
### 🌟 下一步建议
1. **实践项目**: 基于文档内容构建完整的Chat-Room应用
2. **技能深化**: 选择感兴趣的领域进行深入学习
3. **社区贡献**: 参与开源项目,分享学习经验
4. **持续学习**: 关注技术发展,保持技能更新
---
## 📖 导航
⬅️ **上一节:** [Performance Optimization](performance-optimization.md)
➡️ **下一节:** [Containerization Deployment](containerization-deployment.md)
📚 **返回:** [第16章:优化部署](README.md)
🏠 **主页:** [学习路径总览](../README.md)
**感谢您的学习!祝您在技术道路上不断进步!** 🎉