# Web Performance Monitor
[](https://badge.fury.io/py/web-performance-monitor)
[](https://pypi.org/project/web-performance-monitor/)
[](https://opensource.org/licenses/MIT)
基于pyinstrument的Flask应用性能监控和告警工具,提供零入侵的性能监控解决方案。
## ✨ 功能特性
- 🚀 **零入侵监控**: 通过中间件和装饰器模式实现无侵入性集成
- ⚡ **性能优先**: 监控工具本身的性能开销控制在5%以内
- 🔧 **灵活配置**: 支持环境变量、配置文件和代码配置三种方式
- 📊 **详细报告**: 基于pyinstrument生成详细的HTML性能分析报告
- 🔔 **多种通知**: 支持本地文件和Mattermost通知方式
- 🛡️ **容错机制**: 所有监控和通知错误都不影响原应用正常运行
- 📈 **智能告警**: 基于时间窗口的重复告警去重机制
- 🔍 **参数追踪**: 自动提取和记录请求参数,支持敏感信息脱敏
- 🏷️ **追踪支持**: 支持TraceID、SpanID等分布式追踪标识
## 🚀 快速开始
### 安装
```bash
# 基础安装
pip install web-performance-monitor
# 包含Mattermost支持
pip install web-performance-monitor[mattermost]
# 开发环境安装
pip install web-performance-monitor[dev]
```
### 5分钟快速接入
#### 1. Flask中间件模式(推荐)
最简单的接入方式,自动监控所有HTTP请求:
```python
from flask import Flask
from web_performance_monitor import PerformanceMonitor, Config
app = Flask(__name__)
# 基础配置
config = Config(
threshold_seconds=1.0, # 响应时间阈值
enable_local_file=True, # 启用本地文件通知
local_output_dir="/tmp/reports", # 输出目录
)
monitor = PerformanceMonitor(config)
# 零入侵集成 - 只需要这一行代码!
app.wsgi_app = monitor.create_middleware()(app.wsgi_app)
@app.route('/api/users')
def get_users():
# 业务逻辑 - 会被自动监控
return {"users": []}
if __name__ == '__main__':
app.run()
```
#### 2. 装饰器模式
监控特定的关键函数:
```python
from web_performance_monitor import PerformanceMonitor, Config
config = Config(threshold_seconds=0.5)
monitor = PerformanceMonitor(config)
@monitor.create_decorator()
def slow_database_query(user_id):
# 关键业务逻辑 - 独立监控
return database.query_user_data(user_id)
@monitor.create_decorator()
def complex_calculation(data):
# 复杂计算逻辑
return process_complex_data(data)
```
#### 3. 环境变量配置
生产环境推荐使用环境变量配置:
```bash
# 基础配置
export WPM_THRESHOLD_SECONDS=2.0
export WPM_ALERT_WINDOW_DAYS=7
export WPM_ENABLE_LOCAL_FILE=true
export WPM_LOCAL_OUTPUT_DIR=/var/log/performance
# Mattermost通知配置
export WPM_ENABLE_MATTERMOST=true
export WPM_MATTERMOST_SERVER_URL=https://mattermost.example.com
export WPM_MATTERMOST_TOKEN=your-bot-token
export WPM_MATTERMOST_CHANNEL_ID=your-channel-id
```
```python
from web_performance_monitor import Config, PerformanceMonitor
# 从环境变量自动加载配置
config = Config.from_env()
monitor = PerformanceMonitor(config)
# 应用到Flask应用
app.wsgi_app = monitor.create_middleware()(app.wsgi_app)
```
## 📋 详细接入指南
### Flask应用接入
#### 方式1: 应用工厂模式
```python
from flask import Flask
from web_performance_monitor import PerformanceMonitor, Config
def create_app():
app = Flask(__name__)
# 配置监控
config = Config(
threshold_seconds=1.0,
enable_local_file=True,
local_output_dir="/var/log/performance"
)
monitor = PerformanceMonitor(config)
app.wsgi_app = monitor.create_middleware()(app.wsgi_app)
return app
app = create_app()
```
#### 方式2: 蓝图应用
```python
from flask import Flask, Blueprint
from web_performance_monitor import PerformanceMonitor, Config
# 创建蓝图
api_bp = Blueprint('api', __name__, url_prefix='/api')
@api_bp.route('/users')
def get_users():
return {"users": []}
# 主应用
app = Flask(__name__)
app.register_blueprint(api_bp)
# 应用监控(会监控所有蓝图的路由)
config = Config.from_env()
monitor = PerformanceMonitor(config)
app.wsgi_app = monitor.create_middleware()(app.wsgi_app)
```
#### 方式3: 条件监控
```python
import os
from flask import Flask
from web_performance_monitor import PerformanceMonitor, Config
app = Flask(__name__)
# 只在生产环境启用监控
if os.getenv('FLASK_ENV') == 'production':
config = Config(
threshold_seconds=2.0, # 生产环境阈值更高
enable_mattermost=True,
mattermost_server_url=os.getenv('MATTERMOST_URL'),
mattermost_token=os.getenv('MATTERMOST_TOKEN'),
mattermost_channel_id=os.getenv('MATTERMOST_CHANNEL')
)
monitor = PerformanceMonitor(config)
app.wsgi_app = monitor.create_middleware()(app.wsgi_app)
```
### 函数监控接入
#### 数据库操作监控
```python
from web_performance_monitor import PerformanceMonitor, Config
config = Config(threshold_seconds=0.5)
monitor = PerformanceMonitor(config)
@monitor.create_decorator()
def query_user_data(user_id):
"""监控数据库查询性能"""
return db.session.query(User).filter_by(id=user_id).first()
@monitor.create_decorator()
def bulk_insert_data(data_list):
"""监控批量插入性能"""
return db.session.bulk_insert_mappings(DataModel, data_list)
```
#### 外部API调用监控
```python
import requests
from web_performance_monitor import PerformanceMonitor, Config
config = Config(threshold_seconds=3.0) # API调用阈值设置更高
monitor = PerformanceMonitor(config)
@monitor.create_decorator()
def call_external_api(endpoint, data):
"""监控外部API调用"""
response = requests.post(f"https://api.example.com/{endpoint}", json=data)
return response.json()
@monitor.create_decorator()
def fetch_user_profile(user_id):
"""监控用户资料获取"""
return call_external_api(f"users/{user_id}", {})
```
#### 计算密集型任务监控
```python
@monitor.create_decorator()
def calculate_risk_score(data):
"""监控风险评分计算"""
# 复杂的计算逻辑
return complex_algorithm(data)
@monitor.create_decorator()
def generate_report(report_type, filters):
"""监控报告生成"""
return report_generator.create_report(report_type, filters)
```
## ⚙️ 配置选项
### 完整配置表
| 配置项 | 环境变量 | 默认值 | 说明 |
|--------|----------|--------|------|
| threshold_seconds | WPM_THRESHOLD_SECONDS | 1.0 | 响应时间阈值(秒) |
| alert_window_days | WPM_ALERT_WINDOW_DAYS | 10 | 重复告警时间窗口(天) |
| max_performance_overhead | WPM_MAX_PERFORMANCE_OVERHEAD | 0.05 | 最大性能开销(5%) |
| enable_local_file | WPM_ENABLE_LOCAL_FILE | true | 启用本地文件通知 |
| local_output_dir | WPM_LOCAL_OUTPUT_DIR | /tmp | 本地文件输出目录 |
| enable_mattermost | WPM_ENABLE_MATTERMOST | false | 启用Mattermost通知 |
| mattermost_server_url | WPM_MATTERMOST_SERVER_URL | - | Mattermost服务器URL |
| mattermost_token | WPM_MATTERMOST_TOKEN | - | Mattermost访问令牌 |
| mattermost_channel_id | WPM_MATTERMOST_CHANNEL_ID | - | Mattermost频道ID |
| url_blacklist | WPM_URL_BLACKLIST | [] | URL黑名单(逗号分隔,支持正则) |
| enable_url_blacklist | WPM_ENABLE_URL_BLACKLIST | true | 启用URL黑名单功能 |
| log_level | WPM_LOG_LEVEL | INFO | 日志级别 |
### 配置示例
#### 开发环境配置
```python
config = Config(
threshold_seconds=0.5, # 开发环境阈值较低
alert_window_days=1, # 短时间窗口
enable_local_file=True,
local_output_dir="./dev_reports",
enable_mattermost=False, # 开发环境不发送通知
log_level="DEBUG"
)
```
#### 测试环境配置
```python
config = Config(
threshold_seconds=1.0,
alert_window_days=3,
enable_local_file=True,
local_output_dir="/var/log/test_performance",
enable_mattermost=True,
mattermost_server_url="https://test-mattermost.company.com",
mattermost_token=os.getenv('TEST_MATTERMOST_TOKEN'),
mattermost_channel_id="test-alerts",
log_level="INFO"
)
```
#### 生产环境配置
```python
config = Config(
threshold_seconds=2.0, # 生产环境阈值较高
alert_window_days=7, # 较长的去重窗口
max_performance_overhead=0.03, # 更严格的性能要求
enable_local_file=True,
local_output_dir="/var/log/performance",
enable_mattermost=True,
mattermost_server_url=os.getenv('MATTERMOST_URL'),
mattermost_token=os.getenv('MATTERMOST_TOKEN'),
mattermost_channel_id="production-alerts",
log_level="WARNING"
)
```
## � UR功L黑名单功能
### 永久屏蔽无法优化的接口
在实际生产环境中,某些业务接口由于历史原因或复杂性无法快速优化,可以使用URL黑名单功能永久屏蔽告警。
#### 基本配置
```python
from web_performance_monitor import Config, PerformanceMonitor
config = Config(
threshold_seconds=1.0,
url_blacklist=[
'/api/legacy/.*', # 遗留API(正则匹配)
'/health', # 健康检查(精确匹配)
'.*\\.(jpg|png|gif)$', # 图片资源(正则匹配)
'/api/slow-report/.*' # 已知慢接口
],
enable_url_blacklist=True
)
monitor = PerformanceMonitor(config)
```
#### 环境变量配置
```bash
# 多个URL用逗号分隔,支持正则表达式
export WPM_URL_BLACKLIST="/api/legacy/.*,/health,/metrics,.*\\.(css|js)$"
export WPM_ENABLE_URL_BLACKLIST="true"
```
#### 动态管理黑名单
```python
# 添加黑名单规则
config.add_blacklist_url('/api/temp/.*')
# 移除黑名单规则
config.remove_blacklist_url('/api/temp/.*')
# 检查URL是否被屏蔽
is_blocked = config.is_url_blacklisted('/api/legacy/old-function')
```
#### 常用黑名单模式
```python
# 生产环境推荐配置
url_blacklist = [
# 遗留系统接口
'/api/legacy/.*',
'/api/v1/old/.*',
# 系统监控接口
'/health',
'/metrics',
'/status',
'/ping',
# 静态资源
'.*\\.(jpg|png|gif|ico|svg)$',
'.*\\.(css|js|woff|ttf|eot)$',
# 管理员接口(已知较慢)
'/admin/.*',
'/management/.*',
# 报告和导出接口(业务需要,已知较慢)
'/api/reports/generate/.*',
'/api/export/.*',
'/api/download/.*',
# 第三方回调接口
'/webhook/.*',
'/callback/.*',
# 调试和开发接口
'/debug/.*',
'/dev/.*'
]
```
#### 黑名单匹配逻辑
- 支持**正则表达式**匹配,提供强大的模式匹配能力
- 同时检查**完整URL**和**端点路径**
- 匹配成功的请求会跳过告警,但仍会被监控统计
- 自动验证正则表达式有效性,无效模式会被忽略
## 🔧 高级功能
### 监控统计信息
```python
# 获取监控统计
stats = monitor.get_stats()
print(f"总请求数: {stats['total_requests']}")
print(f"慢请求数: {stats['slow_requests']}")
print(f"慢请求率: {stats['slow_request_rate']:.1f}%")
print(f"告警发送数: {stats['alerts_sent']}")
# 获取性能开销统计
overhead_stats = stats.get('overhead_stats', {})
print(f"平均开销: {overhead_stats.get('average_overhead', 0):.2%}")
```
### 测试告警系统
```python
# 测试告警配置是否正常
test_results = monitor.test_alert_system()
if test_results['success']:
print("✅ 告警系统配置正常")
for notifier, result in test_results['notifier_results'].items():
print(f" {notifier}: {'✅' if result else '❌'}")
else:
print(f"❌ 告警系统配置错误: {test_results['error']}")
```
### 重置监控数据
```python
# 重置所有统计数据
monitor.reset_stats()
print("监控统计已重置")
```
### 动态配置更新
```python
# 运行时更新配置
monitor.update_config(
threshold_seconds=3.0,
enable_mattermost=False
)
```
## 📊 告警报告说明
### HTML报告内容
生成的HTML报告包含以下信息:
- **基本信息**: 请求URL、方法、状态码、响应时间
- **请求参数**: JSON参数、查询参数、表单数据(敏感信息自动脱敏)
- **请求头信息**: User-Agent、Accept、TraceID等追踪信息
- **性能分析**: 基于pyinstrument的详细性能分析图表
- **调用栈**: 函数调用层次和耗时分布
- **系统信息**: 服务器时间、Python版本等环境信息
### 敏感信息保护
系统自动识别并脱敏以下敏感信息:
- 密码字段(password、passwd、pwd等)
- 令牌字段(token、auth、authorization等)
- 密钥字段(key、secret、credential等)
## 🎯 最佳实践
### 1. 阈值设置建议
```python
# 不同环境的推荐阈值
THRESHOLDS = {
'development': 0.5, # 开发环境:快速发现问题
'testing': 1.0, # 测试环境:模拟真实场景
'staging': 1.5, # 预发布环境:接近生产环境
'production': 2.0, # 生产环境:避免误报
}
config = Config(
threshold_seconds=THRESHOLDS.get(os.getenv('ENV', 'development'), 1.0)
)
```
### 2. 监控范围控制
```python
# 只监控关键API
@app.route('/api/critical-operation')
def critical_operation():
# 这个端点会被监控
return process_critical_data()
# 排除健康检查等高频端点
@app.route('/health')
def health_check():
# 可以通过路径过滤排除此类端点
return {"status": "ok"}
```
### 3. 生产环境部署
```python
import os
from web_performance_monitor import Config, PerformanceMonitor
# 生产环境配置
config = Config(
threshold_seconds=float(os.getenv('WPM_THRESHOLD', '2.0')),
alert_window_days=int(os.getenv('WPM_WINDOW_DAYS', '7')),
enable_local_file=True,
local_output_dir=os.getenv('WPM_LOG_DIR', '/var/log/performance'),
enable_mattermost=os.getenv('WPM_ENABLE_MATTERMOST', 'false').lower() == 'true',
mattermost_server_url=os.getenv('MATTERMOST_URL'),
mattermost_token=os.getenv('MATTERMOST_TOKEN'),
mattermost_channel_id=os.getenv('MATTERMOST_CHANNEL'),
log_level=os.getenv('WPM_LOG_LEVEL', 'WARNING')
)
monitor = PerformanceMonitor(config)
```
### 4. 日志管理
```bash
# 设置日志轮转(推荐使用logrotate)
# /etc/logrotate.d/web-performance-monitor
/var/log/performance/*.html {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
}
```
## 🔍 故障排除
### 常见问题
#### 1. Mattermost连接失败
```python
# 检查配置
config = Config.from_env()
monitor = PerformanceMonitor(config)
# 测试连接
test_results = monitor.test_alert_system()
if not test_results['success']:
print(f"连接失败: {test_results['error']}")
# 常见解决方案:
# - 确保server_url包含完整协议 (https://)
# - 验证token和channel_id的正确性
# - 检查网络连接和防火墙设置
```
#### 2. 性能开销过高
```python
# 检查性能开销
stats = monitor.get_stats()
overhead = stats.get('overhead_stats', {}).get('average_overhead', 0)
if overhead > 0.05: # 超过5%
print(f"⚠️ 性能开销过高: {overhead:.2%}")
# 建议:提高阈值或减少监控频率
monitor.update_config(threshold_seconds=3.0)
```
#### 3. 告警文件过多
```bash
# 清理旧的告警文件
find /var/log/performance -name "*.html" -mtime +30 -delete
# 或者在配置中设置更长的告警窗口
export WPM_ALERT_WINDOW_DAYS=30
```
## 📚 示例项目
查看 `examples/` 目录获取更多示例:
- `quick_start.py` - 5分钟快速开始
- `flask_middleware_example.py` - Flask中间件完整示例
- `decorator_example.py` - 装饰器使用示例
- `production_example.py` - 生产环境配置示例
- `advanced_usage.py` - 高级功能使用示例
## 🤝 贡献
欢迎提交Issue和Pull Request!
### 开发环境设置
```bash
# 克隆项目
git clone https://github.com/your-repo/web-performance-monitor.git
cd web-performance-monitor
# 安装开发依赖
pip install -e ".[dev]"
# 运行测试
pytest
# 代码格式化
black web_performance_monitor/ tests/
isort web_performance_monitor/ tests/
# 类型检查
mypy web_performance_monitor/
```
### 构建和发布
```bash
# 使用Makefile
make clean build test
# 或使用脚本
python scripts/build_and_test.py
python scripts/release.py 1.0.1 --test # 发布到测试PyPI
```
## 📄 许可证
MIT License - 详见 [LICENSE](LICENSE) 文件
## 🔗 相关链接
- [PyPI包](https://pypi.org/project/web-performance-monitor/)
- [问题反馈](https://github.com/your-repo/web-performance-monitor/issues)
- [更新日志](CHANGELOG.md)
- [pyinstrument文档](https://pyinstrument.readthedocs.io/)
Raw data
{
"_id": null,
"home_page": "https://github.com/example/web-performance-monitor",
"name": "web-performance-monitor",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "Jahan <ambition_xu@163.com>",
"keywords": "flask, performance, monitoring, profiling, alerts, pyinstrument",
"author": "Jahan",
"author_email": "Jahan <ambition_xu@163.com>",
"download_url": "https://files.pythonhosted.org/packages/b2/4d/7bbed01884d49ff5c1a78f22674f533fe19012debb5e856b25c9a8ccabdc/web_performance_monitor-1.1.5.tar.gz",
"platform": null,
"description": "# Web Performance Monitor\r\n\r\n[](https://badge.fury.io/py/web-performance-monitor)\r\n[](https://pypi.org/project/web-performance-monitor/)\r\n[](https://opensource.org/licenses/MIT)\r\n\r\n\u57fa\u4e8epyinstrument\u7684Flask\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u548c\u544a\u8b66\u5de5\u5177\uff0c\u63d0\u4f9b\u96f6\u5165\u4fb5\u7684\u6027\u80fd\u76d1\u63a7\u89e3\u51b3\u65b9\u6848\u3002\r\n\r\n## \u2728 \u529f\u80fd\u7279\u6027\r\n\r\n- \ud83d\ude80 **\u96f6\u5165\u4fb5\u76d1\u63a7**: \u901a\u8fc7\u4e2d\u95f4\u4ef6\u548c\u88c5\u9970\u5668\u6a21\u5f0f\u5b9e\u73b0\u65e0\u4fb5\u5165\u6027\u96c6\u6210\r\n- \u26a1 **\u6027\u80fd\u4f18\u5148**: \u76d1\u63a7\u5de5\u5177\u672c\u8eab\u7684\u6027\u80fd\u5f00\u9500\u63a7\u5236\u57285%\u4ee5\u5185\r\n- \ud83d\udd27 **\u7075\u6d3b\u914d\u7f6e**: \u652f\u6301\u73af\u5883\u53d8\u91cf\u3001\u914d\u7f6e\u6587\u4ef6\u548c\u4ee3\u7801\u914d\u7f6e\u4e09\u79cd\u65b9\u5f0f\r\n- \ud83d\udcca **\u8be6\u7ec6\u62a5\u544a**: \u57fa\u4e8epyinstrument\u751f\u6210\u8be6\u7ec6\u7684HTML\u6027\u80fd\u5206\u6790\u62a5\u544a\r\n- \ud83d\udd14 **\u591a\u79cd\u901a\u77e5**: \u652f\u6301\u672c\u5730\u6587\u4ef6\u548cMattermost\u901a\u77e5\u65b9\u5f0f\r\n- \ud83d\udee1\ufe0f **\u5bb9\u9519\u673a\u5236**: \u6240\u6709\u76d1\u63a7\u548c\u901a\u77e5\u9519\u8bef\u90fd\u4e0d\u5f71\u54cd\u539f\u5e94\u7528\u6b63\u5e38\u8fd0\u884c\r\n- \ud83d\udcc8 **\u667a\u80fd\u544a\u8b66**: \u57fa\u4e8e\u65f6\u95f4\u7a97\u53e3\u7684\u91cd\u590d\u544a\u8b66\u53bb\u91cd\u673a\u5236\r\n- \ud83d\udd0d **\u53c2\u6570\u8ffd\u8e2a**: \u81ea\u52a8\u63d0\u53d6\u548c\u8bb0\u5f55\u8bf7\u6c42\u53c2\u6570\uff0c\u652f\u6301\u654f\u611f\u4fe1\u606f\u8131\u654f\r\n- \ud83c\udff7\ufe0f **\u8ffd\u8e2a\u652f\u6301**: \u652f\u6301TraceID\u3001SpanID\u7b49\u5206\u5e03\u5f0f\u8ffd\u8e2a\u6807\u8bc6\r\n\r\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\r\n\r\n### \u5b89\u88c5\r\n\r\n```bash\r\n# \u57fa\u7840\u5b89\u88c5\r\npip install web-performance-monitor\r\n\r\n# \u5305\u542bMattermost\u652f\u6301\r\npip install web-performance-monitor[mattermost]\r\n\r\n# \u5f00\u53d1\u73af\u5883\u5b89\u88c5\r\npip install web-performance-monitor[dev]\r\n```\r\n\r\n### 5\u5206\u949f\u5feb\u901f\u63a5\u5165\r\n\r\n#### 1. Flask\u4e2d\u95f4\u4ef6\u6a21\u5f0f\uff08\u63a8\u8350\uff09\r\n\r\n\u6700\u7b80\u5355\u7684\u63a5\u5165\u65b9\u5f0f\uff0c\u81ea\u52a8\u76d1\u63a7\u6240\u6709HTTP\u8bf7\u6c42\uff1a\r\n\r\n```python\r\nfrom flask import Flask\r\nfrom web_performance_monitor import PerformanceMonitor, Config\r\n\r\napp = Flask(__name__)\r\n\r\n# \u57fa\u7840\u914d\u7f6e\r\nconfig = Config(\r\n threshold_seconds=1.0, # \u54cd\u5e94\u65f6\u95f4\u9608\u503c\r\n enable_local_file=True, # \u542f\u7528\u672c\u5730\u6587\u4ef6\u901a\u77e5\r\n local_output_dir=\"/tmp/reports\", # \u8f93\u51fa\u76ee\u5f55\r\n)\r\n\r\nmonitor = PerformanceMonitor(config)\r\n\r\n# \u96f6\u5165\u4fb5\u96c6\u6210 - \u53ea\u9700\u8981\u8fd9\u4e00\u884c\u4ee3\u7801\uff01\r\napp.wsgi_app = monitor.create_middleware()(app.wsgi_app)\r\n\r\n@app.route('/api/users')\r\ndef get_users():\r\n # \u4e1a\u52a1\u903b\u8f91 - \u4f1a\u88ab\u81ea\u52a8\u76d1\u63a7\r\n return {\"users\": []}\r\n\r\nif __name__ == '__main__':\r\n app.run()\r\n```\r\n\r\n#### 2. \u88c5\u9970\u5668\u6a21\u5f0f\r\n\r\n\u76d1\u63a7\u7279\u5b9a\u7684\u5173\u952e\u51fd\u6570\uff1a\r\n\r\n```python\r\nfrom web_performance_monitor import PerformanceMonitor, Config\r\n\r\nconfig = Config(threshold_seconds=0.5)\r\nmonitor = PerformanceMonitor(config)\r\n\r\n@monitor.create_decorator()\r\ndef slow_database_query(user_id):\r\n # \u5173\u952e\u4e1a\u52a1\u903b\u8f91 - \u72ec\u7acb\u76d1\u63a7\r\n return database.query_user_data(user_id)\r\n\r\n@monitor.create_decorator()\r\ndef complex_calculation(data):\r\n # \u590d\u6742\u8ba1\u7b97\u903b\u8f91\r\n return process_complex_data(data)\r\n```\r\n\r\n#### 3. \u73af\u5883\u53d8\u91cf\u914d\u7f6e\r\n\r\n\u751f\u4ea7\u73af\u5883\u63a8\u8350\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u914d\u7f6e\uff1a\r\n\r\n```bash\r\n# \u57fa\u7840\u914d\u7f6e\r\nexport WPM_THRESHOLD_SECONDS=2.0\r\nexport WPM_ALERT_WINDOW_DAYS=7\r\nexport WPM_ENABLE_LOCAL_FILE=true\r\nexport WPM_LOCAL_OUTPUT_DIR=/var/log/performance\r\n\r\n# Mattermost\u901a\u77e5\u914d\u7f6e\r\nexport WPM_ENABLE_MATTERMOST=true\r\nexport WPM_MATTERMOST_SERVER_URL=https://mattermost.example.com\r\nexport WPM_MATTERMOST_TOKEN=your-bot-token\r\nexport WPM_MATTERMOST_CHANNEL_ID=your-channel-id\r\n```\r\n\r\n```python\r\nfrom web_performance_monitor import Config, PerformanceMonitor\r\n\r\n# \u4ece\u73af\u5883\u53d8\u91cf\u81ea\u52a8\u52a0\u8f7d\u914d\u7f6e\r\nconfig = Config.from_env()\r\nmonitor = PerformanceMonitor(config)\r\n\r\n# \u5e94\u7528\u5230Flask\u5e94\u7528\r\napp.wsgi_app = monitor.create_middleware()(app.wsgi_app)\r\n```\r\n\r\n## \ud83d\udccb \u8be6\u7ec6\u63a5\u5165\u6307\u5357\r\n\r\n### Flask\u5e94\u7528\u63a5\u5165\r\n\r\n#### \u65b9\u5f0f1: \u5e94\u7528\u5de5\u5382\u6a21\u5f0f\r\n\r\n```python\r\nfrom flask import Flask\r\nfrom web_performance_monitor import PerformanceMonitor, Config\r\n\r\ndef create_app():\r\n app = Flask(__name__)\r\n \r\n # \u914d\u7f6e\u76d1\u63a7\r\n config = Config(\r\n threshold_seconds=1.0,\r\n enable_local_file=True,\r\n local_output_dir=\"/var/log/performance\"\r\n )\r\n \r\n monitor = PerformanceMonitor(config)\r\n app.wsgi_app = monitor.create_middleware()(app.wsgi_app)\r\n \r\n return app\r\n\r\napp = create_app()\r\n```\r\n\r\n#### \u65b9\u5f0f2: \u84dd\u56fe\u5e94\u7528\r\n\r\n```python\r\nfrom flask import Flask, Blueprint\r\nfrom web_performance_monitor import PerformanceMonitor, Config\r\n\r\n# \u521b\u5efa\u84dd\u56fe\r\napi_bp = Blueprint('api', __name__, url_prefix='/api')\r\n\r\n@api_bp.route('/users')\r\ndef get_users():\r\n return {\"users\": []}\r\n\r\n# \u4e3b\u5e94\u7528\r\napp = Flask(__name__)\r\napp.register_blueprint(api_bp)\r\n\r\n# \u5e94\u7528\u76d1\u63a7\uff08\u4f1a\u76d1\u63a7\u6240\u6709\u84dd\u56fe\u7684\u8def\u7531\uff09\r\nconfig = Config.from_env()\r\nmonitor = PerformanceMonitor(config)\r\napp.wsgi_app = monitor.create_middleware()(app.wsgi_app)\r\n```\r\n\r\n#### \u65b9\u5f0f3: \u6761\u4ef6\u76d1\u63a7\r\n\r\n```python\r\nimport os\r\nfrom flask import Flask\r\nfrom web_performance_monitor import PerformanceMonitor, Config\r\n\r\napp = Flask(__name__)\r\n\r\n# \u53ea\u5728\u751f\u4ea7\u73af\u5883\u542f\u7528\u76d1\u63a7\r\nif os.getenv('FLASK_ENV') == 'production':\r\n config = Config(\r\n threshold_seconds=2.0, # \u751f\u4ea7\u73af\u5883\u9608\u503c\u66f4\u9ad8\r\n enable_mattermost=True,\r\n mattermost_server_url=os.getenv('MATTERMOST_URL'),\r\n mattermost_token=os.getenv('MATTERMOST_TOKEN'),\r\n mattermost_channel_id=os.getenv('MATTERMOST_CHANNEL')\r\n )\r\n monitor = PerformanceMonitor(config)\r\n app.wsgi_app = monitor.create_middleware()(app.wsgi_app)\r\n```\r\n\r\n### \u51fd\u6570\u76d1\u63a7\u63a5\u5165\r\n\r\n#### \u6570\u636e\u5e93\u64cd\u4f5c\u76d1\u63a7\r\n\r\n```python\r\nfrom web_performance_monitor import PerformanceMonitor, Config\r\n\r\nconfig = Config(threshold_seconds=0.5)\r\nmonitor = PerformanceMonitor(config)\r\n\r\n@monitor.create_decorator()\r\ndef query_user_data(user_id):\r\n \"\"\"\u76d1\u63a7\u6570\u636e\u5e93\u67e5\u8be2\u6027\u80fd\"\"\"\r\n return db.session.query(User).filter_by(id=user_id).first()\r\n\r\n@monitor.create_decorator()\r\ndef bulk_insert_data(data_list):\r\n \"\"\"\u76d1\u63a7\u6279\u91cf\u63d2\u5165\u6027\u80fd\"\"\"\r\n return db.session.bulk_insert_mappings(DataModel, data_list)\r\n```\r\n\r\n#### \u5916\u90e8API\u8c03\u7528\u76d1\u63a7\r\n\r\n```python\r\nimport requests\r\nfrom web_performance_monitor import PerformanceMonitor, Config\r\n\r\nconfig = Config(threshold_seconds=3.0) # API\u8c03\u7528\u9608\u503c\u8bbe\u7f6e\u66f4\u9ad8\r\nmonitor = PerformanceMonitor(config)\r\n\r\n@monitor.create_decorator()\r\ndef call_external_api(endpoint, data):\r\n \"\"\"\u76d1\u63a7\u5916\u90e8API\u8c03\u7528\"\"\"\r\n response = requests.post(f\"https://api.example.com/{endpoint}\", json=data)\r\n return response.json()\r\n\r\n@monitor.create_decorator()\r\ndef fetch_user_profile(user_id):\r\n \"\"\"\u76d1\u63a7\u7528\u6237\u8d44\u6599\u83b7\u53d6\"\"\"\r\n return call_external_api(f\"users/{user_id}\", {})\r\n```\r\n\r\n#### \u8ba1\u7b97\u5bc6\u96c6\u578b\u4efb\u52a1\u76d1\u63a7\r\n\r\n```python\r\n@monitor.create_decorator()\r\ndef calculate_risk_score(data):\r\n \"\"\"\u76d1\u63a7\u98ce\u9669\u8bc4\u5206\u8ba1\u7b97\"\"\"\r\n # \u590d\u6742\u7684\u8ba1\u7b97\u903b\u8f91\r\n return complex_algorithm(data)\r\n\r\n@monitor.create_decorator()\r\ndef generate_report(report_type, filters):\r\n \"\"\"\u76d1\u63a7\u62a5\u544a\u751f\u6210\"\"\"\r\n return report_generator.create_report(report_type, filters)\r\n```\r\n\r\n## \u2699\ufe0f \u914d\u7f6e\u9009\u9879\r\n\r\n### \u5b8c\u6574\u914d\u7f6e\u8868\r\n\r\n| \u914d\u7f6e\u9879 | \u73af\u5883\u53d8\u91cf | \u9ed8\u8ba4\u503c | \u8bf4\u660e |\r\n|--------|----------|--------|------|\r\n| threshold_seconds | WPM_THRESHOLD_SECONDS | 1.0 | \u54cd\u5e94\u65f6\u95f4\u9608\u503c\uff08\u79d2\uff09 |\r\n| alert_window_days | WPM_ALERT_WINDOW_DAYS | 10 | \u91cd\u590d\u544a\u8b66\u65f6\u95f4\u7a97\u53e3\uff08\u5929\uff09 |\r\n| max_performance_overhead | WPM_MAX_PERFORMANCE_OVERHEAD | 0.05 | \u6700\u5927\u6027\u80fd\u5f00\u9500\uff085%\uff09 |\r\n| enable_local_file | WPM_ENABLE_LOCAL_FILE | true | \u542f\u7528\u672c\u5730\u6587\u4ef6\u901a\u77e5 |\r\n| local_output_dir | WPM_LOCAL_OUTPUT_DIR | /tmp | \u672c\u5730\u6587\u4ef6\u8f93\u51fa\u76ee\u5f55 |\r\n| enable_mattermost | WPM_ENABLE_MATTERMOST | false | \u542f\u7528Mattermost\u901a\u77e5 |\r\n| mattermost_server_url | WPM_MATTERMOST_SERVER_URL | - | Mattermost\u670d\u52a1\u5668URL |\r\n| mattermost_token | WPM_MATTERMOST_TOKEN | - | Mattermost\u8bbf\u95ee\u4ee4\u724c |\r\n| mattermost_channel_id | WPM_MATTERMOST_CHANNEL_ID | - | Mattermost\u9891\u9053ID |\r\n| url_blacklist | WPM_URL_BLACKLIST | [] | URL\u9ed1\u540d\u5355\uff08\u9017\u53f7\u5206\u9694\uff0c\u652f\u6301\u6b63\u5219\uff09 |\r\n| enable_url_blacklist | WPM_ENABLE_URL_BLACKLIST | true | \u542f\u7528URL\u9ed1\u540d\u5355\u529f\u80fd |\r\n| log_level | WPM_LOG_LEVEL | INFO | \u65e5\u5fd7\u7ea7\u522b |\r\n\r\n### \u914d\u7f6e\u793a\u4f8b\r\n\r\n#### \u5f00\u53d1\u73af\u5883\u914d\u7f6e\r\n\r\n```python\r\nconfig = Config(\r\n threshold_seconds=0.5, # \u5f00\u53d1\u73af\u5883\u9608\u503c\u8f83\u4f4e\r\n alert_window_days=1, # \u77ed\u65f6\u95f4\u7a97\u53e3\r\n enable_local_file=True,\r\n local_output_dir=\"./dev_reports\",\r\n enable_mattermost=False, # \u5f00\u53d1\u73af\u5883\u4e0d\u53d1\u9001\u901a\u77e5\r\n log_level=\"DEBUG\"\r\n)\r\n```\r\n\r\n#### \u6d4b\u8bd5\u73af\u5883\u914d\u7f6e\r\n\r\n```python\r\nconfig = Config(\r\n threshold_seconds=1.0,\r\n alert_window_days=3,\r\n enable_local_file=True,\r\n local_output_dir=\"/var/log/test_performance\",\r\n enable_mattermost=True,\r\n mattermost_server_url=\"https://test-mattermost.company.com\",\r\n mattermost_token=os.getenv('TEST_MATTERMOST_TOKEN'),\r\n mattermost_channel_id=\"test-alerts\",\r\n log_level=\"INFO\"\r\n)\r\n```\r\n\r\n#### \u751f\u4ea7\u73af\u5883\u914d\u7f6e\r\n\r\n```python\r\nconfig = Config(\r\n threshold_seconds=2.0, # \u751f\u4ea7\u73af\u5883\u9608\u503c\u8f83\u9ad8\r\n alert_window_days=7, # \u8f83\u957f\u7684\u53bb\u91cd\u7a97\u53e3\r\n max_performance_overhead=0.03, # \u66f4\u4e25\u683c\u7684\u6027\u80fd\u8981\u6c42\r\n enable_local_file=True,\r\n local_output_dir=\"/var/log/performance\",\r\n enable_mattermost=True,\r\n mattermost_server_url=os.getenv('MATTERMOST_URL'),\r\n mattermost_token=os.getenv('MATTERMOST_TOKEN'),\r\n mattermost_channel_id=\"production-alerts\",\r\n log_level=\"WARNING\"\r\n)\r\n```\r\n\r\n## \ufffd UR\u529fL\u9ed1\u540d\u5355\u529f\u80fd\r\n\r\n### \u6c38\u4e45\u5c4f\u853d\u65e0\u6cd5\u4f18\u5316\u7684\u63a5\u53e3\r\n\r\n\u5728\u5b9e\u9645\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u67d0\u4e9b\u4e1a\u52a1\u63a5\u53e3\u7531\u4e8e\u5386\u53f2\u539f\u56e0\u6216\u590d\u6742\u6027\u65e0\u6cd5\u5feb\u901f\u4f18\u5316\uff0c\u53ef\u4ee5\u4f7f\u7528URL\u9ed1\u540d\u5355\u529f\u80fd\u6c38\u4e45\u5c4f\u853d\u544a\u8b66\u3002\r\n\r\n#### \u57fa\u672c\u914d\u7f6e\r\n\r\n```python\r\nfrom web_performance_monitor import Config, PerformanceMonitor\r\n\r\nconfig = Config(\r\n threshold_seconds=1.0,\r\n url_blacklist=[\r\n '/api/legacy/.*', # \u9057\u7559API\uff08\u6b63\u5219\u5339\u914d\uff09\r\n '/health', # \u5065\u5eb7\u68c0\u67e5\uff08\u7cbe\u786e\u5339\u914d\uff09\r\n '.*\\\\.(jpg|png|gif)$', # \u56fe\u7247\u8d44\u6e90\uff08\u6b63\u5219\u5339\u914d\uff09\r\n '/api/slow-report/.*' # \u5df2\u77e5\u6162\u63a5\u53e3\r\n ],\r\n enable_url_blacklist=True\r\n)\r\n\r\nmonitor = PerformanceMonitor(config)\r\n```\r\n\r\n#### \u73af\u5883\u53d8\u91cf\u914d\u7f6e\r\n\r\n```bash\r\n# \u591a\u4e2aURL\u7528\u9017\u53f7\u5206\u9694\uff0c\u652f\u6301\u6b63\u5219\u8868\u8fbe\u5f0f\r\nexport WPM_URL_BLACKLIST=\"/api/legacy/.*,/health,/metrics,.*\\\\.(css|js)$\"\r\nexport WPM_ENABLE_URL_BLACKLIST=\"true\"\r\n```\r\n\r\n#### \u52a8\u6001\u7ba1\u7406\u9ed1\u540d\u5355\r\n\r\n```python\r\n# \u6dfb\u52a0\u9ed1\u540d\u5355\u89c4\u5219\r\nconfig.add_blacklist_url('/api/temp/.*')\r\n\r\n# \u79fb\u9664\u9ed1\u540d\u5355\u89c4\u5219\r\nconfig.remove_blacklist_url('/api/temp/.*')\r\n\r\n# \u68c0\u67e5URL\u662f\u5426\u88ab\u5c4f\u853d\r\nis_blocked = config.is_url_blacklisted('/api/legacy/old-function')\r\n```\r\n\r\n#### \u5e38\u7528\u9ed1\u540d\u5355\u6a21\u5f0f\r\n\r\n```python\r\n# \u751f\u4ea7\u73af\u5883\u63a8\u8350\u914d\u7f6e\r\nurl_blacklist = [\r\n # \u9057\u7559\u7cfb\u7edf\u63a5\u53e3\r\n '/api/legacy/.*',\r\n '/api/v1/old/.*',\r\n \r\n # \u7cfb\u7edf\u76d1\u63a7\u63a5\u53e3\r\n '/health',\r\n '/metrics',\r\n '/status',\r\n '/ping',\r\n \r\n # \u9759\u6001\u8d44\u6e90\r\n '.*\\\\.(jpg|png|gif|ico|svg)$',\r\n '.*\\\\.(css|js|woff|ttf|eot)$',\r\n \r\n # \u7ba1\u7406\u5458\u63a5\u53e3\uff08\u5df2\u77e5\u8f83\u6162\uff09\r\n '/admin/.*',\r\n '/management/.*',\r\n \r\n # \u62a5\u544a\u548c\u5bfc\u51fa\u63a5\u53e3\uff08\u4e1a\u52a1\u9700\u8981\uff0c\u5df2\u77e5\u8f83\u6162\uff09\r\n '/api/reports/generate/.*',\r\n '/api/export/.*',\r\n '/api/download/.*',\r\n \r\n # \u7b2c\u4e09\u65b9\u56de\u8c03\u63a5\u53e3\r\n '/webhook/.*',\r\n '/callback/.*',\r\n \r\n # \u8c03\u8bd5\u548c\u5f00\u53d1\u63a5\u53e3\r\n '/debug/.*',\r\n '/dev/.*'\r\n]\r\n```\r\n\r\n#### \u9ed1\u540d\u5355\u5339\u914d\u903b\u8f91\r\n\r\n- \u652f\u6301**\u6b63\u5219\u8868\u8fbe\u5f0f**\u5339\u914d\uff0c\u63d0\u4f9b\u5f3a\u5927\u7684\u6a21\u5f0f\u5339\u914d\u80fd\u529b\r\n- \u540c\u65f6\u68c0\u67e5**\u5b8c\u6574URL**\u548c**\u7aef\u70b9\u8def\u5f84**\r\n- \u5339\u914d\u6210\u529f\u7684\u8bf7\u6c42\u4f1a\u8df3\u8fc7\u544a\u8b66\uff0c\u4f46\u4ecd\u4f1a\u88ab\u76d1\u63a7\u7edf\u8ba1\r\n- \u81ea\u52a8\u9a8c\u8bc1\u6b63\u5219\u8868\u8fbe\u5f0f\u6709\u6548\u6027\uff0c\u65e0\u6548\u6a21\u5f0f\u4f1a\u88ab\u5ffd\u7565\r\n\r\n## \ud83d\udd27 \u9ad8\u7ea7\u529f\u80fd\r\n\r\n### \u76d1\u63a7\u7edf\u8ba1\u4fe1\u606f\r\n\r\n```python\r\n# \u83b7\u53d6\u76d1\u63a7\u7edf\u8ba1\r\nstats = monitor.get_stats()\r\nprint(f\"\u603b\u8bf7\u6c42\u6570: {stats['total_requests']}\")\r\nprint(f\"\u6162\u8bf7\u6c42\u6570: {stats['slow_requests']}\")\r\nprint(f\"\u6162\u8bf7\u6c42\u7387: {stats['slow_request_rate']:.1f}%\")\r\nprint(f\"\u544a\u8b66\u53d1\u9001\u6570: {stats['alerts_sent']}\")\r\n\r\n# \u83b7\u53d6\u6027\u80fd\u5f00\u9500\u7edf\u8ba1\r\noverhead_stats = stats.get('overhead_stats', {})\r\nprint(f\"\u5e73\u5747\u5f00\u9500: {overhead_stats.get('average_overhead', 0):.2%}\")\r\n```\r\n\r\n### \u6d4b\u8bd5\u544a\u8b66\u7cfb\u7edf\r\n\r\n```python\r\n# \u6d4b\u8bd5\u544a\u8b66\u914d\u7f6e\u662f\u5426\u6b63\u5e38\r\ntest_results = monitor.test_alert_system()\r\nif test_results['success']:\r\n print(\"\u2705 \u544a\u8b66\u7cfb\u7edf\u914d\u7f6e\u6b63\u5e38\")\r\n for notifier, result in test_results['notifier_results'].items():\r\n print(f\" {notifier}: {'\u2705' if result else '\u274c'}\")\r\nelse:\r\n print(f\"\u274c \u544a\u8b66\u7cfb\u7edf\u914d\u7f6e\u9519\u8bef: {test_results['error']}\")\r\n```\r\n\r\n### \u91cd\u7f6e\u76d1\u63a7\u6570\u636e\r\n\r\n```python\r\n# \u91cd\u7f6e\u6240\u6709\u7edf\u8ba1\u6570\u636e\r\nmonitor.reset_stats()\r\nprint(\"\u76d1\u63a7\u7edf\u8ba1\u5df2\u91cd\u7f6e\")\r\n```\r\n\r\n### \u52a8\u6001\u914d\u7f6e\u66f4\u65b0\r\n\r\n```python\r\n# \u8fd0\u884c\u65f6\u66f4\u65b0\u914d\u7f6e\r\nmonitor.update_config(\r\n threshold_seconds=3.0,\r\n enable_mattermost=False\r\n)\r\n```\r\n\r\n## \ud83d\udcca \u544a\u8b66\u62a5\u544a\u8bf4\u660e\r\n\r\n### HTML\u62a5\u544a\u5185\u5bb9\r\n\r\n\u751f\u6210\u7684HTML\u62a5\u544a\u5305\u542b\u4ee5\u4e0b\u4fe1\u606f\uff1a\r\n\r\n- **\u57fa\u672c\u4fe1\u606f**: \u8bf7\u6c42URL\u3001\u65b9\u6cd5\u3001\u72b6\u6001\u7801\u3001\u54cd\u5e94\u65f6\u95f4\r\n- **\u8bf7\u6c42\u53c2\u6570**: JSON\u53c2\u6570\u3001\u67e5\u8be2\u53c2\u6570\u3001\u8868\u5355\u6570\u636e\uff08\u654f\u611f\u4fe1\u606f\u81ea\u52a8\u8131\u654f\uff09\r\n- **\u8bf7\u6c42\u5934\u4fe1\u606f**: User-Agent\u3001Accept\u3001TraceID\u7b49\u8ffd\u8e2a\u4fe1\u606f\r\n- **\u6027\u80fd\u5206\u6790**: \u57fa\u4e8epyinstrument\u7684\u8be6\u7ec6\u6027\u80fd\u5206\u6790\u56fe\u8868\r\n- **\u8c03\u7528\u6808**: \u51fd\u6570\u8c03\u7528\u5c42\u6b21\u548c\u8017\u65f6\u5206\u5e03\r\n- **\u7cfb\u7edf\u4fe1\u606f**: \u670d\u52a1\u5668\u65f6\u95f4\u3001Python\u7248\u672c\u7b49\u73af\u5883\u4fe1\u606f\r\n\r\n### \u654f\u611f\u4fe1\u606f\u4fdd\u62a4\r\n\r\n\u7cfb\u7edf\u81ea\u52a8\u8bc6\u522b\u5e76\u8131\u654f\u4ee5\u4e0b\u654f\u611f\u4fe1\u606f\uff1a\r\n- \u5bc6\u7801\u5b57\u6bb5\uff08password\u3001passwd\u3001pwd\u7b49\uff09\r\n- \u4ee4\u724c\u5b57\u6bb5\uff08token\u3001auth\u3001authorization\u7b49\uff09\r\n- \u5bc6\u94a5\u5b57\u6bb5\uff08key\u3001secret\u3001credential\u7b49\uff09\r\n\r\n## \ud83c\udfaf \u6700\u4f73\u5b9e\u8df5\r\n\r\n### 1. \u9608\u503c\u8bbe\u7f6e\u5efa\u8bae\r\n\r\n```python\r\n# \u4e0d\u540c\u73af\u5883\u7684\u63a8\u8350\u9608\u503c\r\nTHRESHOLDS = {\r\n 'development': 0.5, # \u5f00\u53d1\u73af\u5883\uff1a\u5feb\u901f\u53d1\u73b0\u95ee\u9898\r\n 'testing': 1.0, # \u6d4b\u8bd5\u73af\u5883\uff1a\u6a21\u62df\u771f\u5b9e\u573a\u666f\r\n 'staging': 1.5, # \u9884\u53d1\u5e03\u73af\u5883\uff1a\u63a5\u8fd1\u751f\u4ea7\u73af\u5883\r\n 'production': 2.0, # \u751f\u4ea7\u73af\u5883\uff1a\u907f\u514d\u8bef\u62a5\r\n}\r\n\r\nconfig = Config(\r\n threshold_seconds=THRESHOLDS.get(os.getenv('ENV', 'development'), 1.0)\r\n)\r\n```\r\n\r\n### 2. \u76d1\u63a7\u8303\u56f4\u63a7\u5236\r\n\r\n```python\r\n# \u53ea\u76d1\u63a7\u5173\u952eAPI\r\n@app.route('/api/critical-operation')\r\ndef critical_operation():\r\n # \u8fd9\u4e2a\u7aef\u70b9\u4f1a\u88ab\u76d1\u63a7\r\n return process_critical_data()\r\n\r\n# \u6392\u9664\u5065\u5eb7\u68c0\u67e5\u7b49\u9ad8\u9891\u7aef\u70b9\r\n@app.route('/health')\r\ndef health_check():\r\n # \u53ef\u4ee5\u901a\u8fc7\u8def\u5f84\u8fc7\u6ee4\u6392\u9664\u6b64\u7c7b\u7aef\u70b9\r\n return {\"status\": \"ok\"}\r\n```\r\n\r\n### 3. \u751f\u4ea7\u73af\u5883\u90e8\u7f72\r\n\r\n```python\r\nimport os\r\nfrom web_performance_monitor import Config, PerformanceMonitor\r\n\r\n# \u751f\u4ea7\u73af\u5883\u914d\u7f6e\r\nconfig = Config(\r\n threshold_seconds=float(os.getenv('WPM_THRESHOLD', '2.0')),\r\n alert_window_days=int(os.getenv('WPM_WINDOW_DAYS', '7')),\r\n enable_local_file=True,\r\n local_output_dir=os.getenv('WPM_LOG_DIR', '/var/log/performance'),\r\n enable_mattermost=os.getenv('WPM_ENABLE_MATTERMOST', 'false').lower() == 'true',\r\n mattermost_server_url=os.getenv('MATTERMOST_URL'),\r\n mattermost_token=os.getenv('MATTERMOST_TOKEN'),\r\n mattermost_channel_id=os.getenv('MATTERMOST_CHANNEL'),\r\n log_level=os.getenv('WPM_LOG_LEVEL', 'WARNING')\r\n)\r\n\r\nmonitor = PerformanceMonitor(config)\r\n```\r\n\r\n### 4. \u65e5\u5fd7\u7ba1\u7406\r\n\r\n```bash\r\n# \u8bbe\u7f6e\u65e5\u5fd7\u8f6e\u8f6c\uff08\u63a8\u8350\u4f7f\u7528logrotate\uff09\r\n# /etc/logrotate.d/web-performance-monitor\r\n/var/log/performance/*.html {\r\n daily\r\n missingok\r\n rotate 30\r\n compress\r\n delaycompress\r\n notifempty\r\n create 644 www-data www-data\r\n}\r\n```\r\n\r\n## \ud83d\udd0d \u6545\u969c\u6392\u9664\r\n\r\n### \u5e38\u89c1\u95ee\u9898\r\n\r\n#### 1. Mattermost\u8fde\u63a5\u5931\u8d25\r\n\r\n```python\r\n# \u68c0\u67e5\u914d\u7f6e\r\nconfig = Config.from_env()\r\nmonitor = PerformanceMonitor(config)\r\n\r\n# \u6d4b\u8bd5\u8fde\u63a5\r\ntest_results = monitor.test_alert_system()\r\nif not test_results['success']:\r\n print(f\"\u8fde\u63a5\u5931\u8d25: {test_results['error']}\")\r\n \r\n# \u5e38\u89c1\u89e3\u51b3\u65b9\u6848\uff1a\r\n# - \u786e\u4fddserver_url\u5305\u542b\u5b8c\u6574\u534f\u8bae (https://)\r\n# - \u9a8c\u8bc1token\u548cchannel_id\u7684\u6b63\u786e\u6027\r\n# - \u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\u548c\u9632\u706b\u5899\u8bbe\u7f6e\r\n```\r\n\r\n#### 2. \u6027\u80fd\u5f00\u9500\u8fc7\u9ad8\r\n\r\n```python\r\n# \u68c0\u67e5\u6027\u80fd\u5f00\u9500\r\nstats = monitor.get_stats()\r\noverhead = stats.get('overhead_stats', {}).get('average_overhead', 0)\r\n\r\nif overhead > 0.05: # \u8d85\u8fc75%\r\n print(f\"\u26a0\ufe0f \u6027\u80fd\u5f00\u9500\u8fc7\u9ad8: {overhead:.2%}\")\r\n # \u5efa\u8bae\uff1a\u63d0\u9ad8\u9608\u503c\u6216\u51cf\u5c11\u76d1\u63a7\u9891\u7387\r\n monitor.update_config(threshold_seconds=3.0)\r\n```\r\n\r\n#### 3. \u544a\u8b66\u6587\u4ef6\u8fc7\u591a\r\n\r\n```bash\r\n# \u6e05\u7406\u65e7\u7684\u544a\u8b66\u6587\u4ef6\r\nfind /var/log/performance -name \"*.html\" -mtime +30 -delete\r\n\r\n# \u6216\u8005\u5728\u914d\u7f6e\u4e2d\u8bbe\u7f6e\u66f4\u957f\u7684\u544a\u8b66\u7a97\u53e3\r\nexport WPM_ALERT_WINDOW_DAYS=30\r\n```\r\n\r\n## \ud83d\udcda \u793a\u4f8b\u9879\u76ee\r\n\r\n\u67e5\u770b `examples/` \u76ee\u5f55\u83b7\u53d6\u66f4\u591a\u793a\u4f8b\uff1a\r\n\r\n- `quick_start.py` - 5\u5206\u949f\u5feb\u901f\u5f00\u59cb\r\n- `flask_middleware_example.py` - Flask\u4e2d\u95f4\u4ef6\u5b8c\u6574\u793a\u4f8b\r\n- `decorator_example.py` - \u88c5\u9970\u5668\u4f7f\u7528\u793a\u4f8b\r\n- `production_example.py` - \u751f\u4ea7\u73af\u5883\u914d\u7f6e\u793a\u4f8b\r\n- `advanced_usage.py` - \u9ad8\u7ea7\u529f\u80fd\u4f7f\u7528\u793a\u4f8b\r\n\r\n## \ud83e\udd1d \u8d21\u732e\r\n\r\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01\r\n\r\n### \u5f00\u53d1\u73af\u5883\u8bbe\u7f6e\r\n\r\n```bash\r\n# \u514b\u9686\u9879\u76ee\r\ngit clone https://github.com/your-repo/web-performance-monitor.git\r\ncd web-performance-monitor\r\n\r\n# \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\r\npip install -e \".[dev]\"\r\n\r\n# \u8fd0\u884c\u6d4b\u8bd5\r\npytest\r\n\r\n# \u4ee3\u7801\u683c\u5f0f\u5316\r\nblack web_performance_monitor/ tests/\r\nisort web_performance_monitor/ tests/\r\n\r\n# \u7c7b\u578b\u68c0\u67e5\r\nmypy web_performance_monitor/\r\n```\r\n\r\n### \u6784\u5efa\u548c\u53d1\u5e03\r\n\r\n```bash\r\n# \u4f7f\u7528Makefile\r\nmake clean build test\r\n\r\n# \u6216\u4f7f\u7528\u811a\u672c\r\npython scripts/build_and_test.py\r\npython scripts/release.py 1.0.1 --test # \u53d1\u5e03\u5230\u6d4b\u8bd5PyPI\r\n```\r\n\r\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\r\n\r\nMIT License - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\r\n\r\n## \ud83d\udd17 \u76f8\u5173\u94fe\u63a5\r\n\r\n- [PyPI\u5305](https://pypi.org/project/web-performance-monitor/)\r\n- [\u95ee\u9898\u53cd\u9988](https://github.com/your-repo/web-performance-monitor/issues)\r\n- [\u66f4\u65b0\u65e5\u5fd7](CHANGELOG.md)\r\n- [pyinstrument\u6587\u6863](https://pyinstrument.readthedocs.io/)\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u57fa\u4e8epyinstrument\u7684Flask\u5e94\u7528\u6027\u80fd\u76d1\u63a7\u548c\u544a\u8b66\u5de5\u5177",
"version": "1.1.5",
"project_urls": {
"Bug Tracker": "https://github.com/example/web-performance-monitor/issues",
"Changelog": "https://github.com/example/web-performance-monitor/blob/main/CHANGELOG.md",
"Documentation": "https://github.com/example/web-performance-monitor#readme",
"Homepage": "https://github.com/example/web-performance-monitor",
"Repository": "https://github.com/example/web-performance-monitor.git"
},
"split_keywords": [
"flask",
" performance",
" monitoring",
" profiling",
" alerts",
" pyinstrument"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7409e1a0a32d271db4fa04520381d318b3ba01580db0336a1ee1c676d809e7b8",
"md5": "1a5869bf6d400231f06485ee7f311d42",
"sha256": "f73e2d0277d8385eb277978bdd38407e5bca32420868b9b658835118be17bce8"
},
"downloads": -1,
"filename": "web_performance_monitor-1.1.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1a5869bf6d400231f06485ee7f311d42",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 50821,
"upload_time": "2025-09-12T19:13:55",
"upload_time_iso_8601": "2025-09-12T19:13:55.631019Z",
"url": "https://files.pythonhosted.org/packages/74/09/e1a0a32d271db4fa04520381d318b3ba01580db0336a1ee1c676d809e7b8/web_performance_monitor-1.1.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b24d7bbed01884d49ff5c1a78f22674f533fe19012debb5e856b25c9a8ccabdc",
"md5": "9b5a2244ed362e4c661e11f177ec91af",
"sha256": "98cf82980f689df194cd48e5ebfdbc93c496c2fda210234979378e577bb4d4b2"
},
"downloads": -1,
"filename": "web_performance_monitor-1.1.5.tar.gz",
"has_sig": false,
"md5_digest": "9b5a2244ed362e4c661e11f177ec91af",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 50545,
"upload_time": "2025-09-12T19:13:57",
"upload_time_iso_8601": "2025-09-12T19:13:57.135735Z",
"url": "https://files.pythonhosted.org/packages/b2/4d/7bbed01884d49ff5c1a78f22674f533fe19012debb5e856b25c9a8ccabdc/web_performance_monitor-1.1.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-12 19:13:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "example",
"github_project": "web-performance-monitor",
"github_not_found": true,
"lcname": "web-performance-monitor"
}