web-performance-monitor


Nameweb-performance-monitor JSON
Version 1.1.5 PyPI version JSON
download
home_pagehttps://github.com/example/web-performance-monitor
Summary基于pyinstrument的Flask应用性能监控和告警工具
upload_time2025-09-12 19:13:57
maintainerNone
docs_urlNone
authorJahan
requires_python>=3.7
licenseMIT
keywords flask performance monitoring profiling alerts pyinstrument
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Web Performance Monitor

[![PyPI version](https://badge.fury.io/py/web-performance-monitor.svg)](https://badge.fury.io/py/web-performance-monitor)
[![Python Support](https://img.shields.io/pypi/pyversions/web-performance-monitor.svg)](https://pypi.org/project/web-performance-monitor/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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[![PyPI version](https://badge.fury.io/py/web-performance-monitor.svg)](https://badge.fury.io/py/web-performance-monitor)\r\n[![Python Support](https://img.shields.io/pypi/pyversions/web-performance-monitor.svg)](https://pypi.org/project/web-performance-monitor/)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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"
}
        
Elapsed time: 1.04579s