act数据可视化:执行历史与统计数据的图表展示
痛点:本地GitHub Actions调试的"盲区"
你是否曾经在使用GitHub Actions时遇到过这样的困境?每次修改workflow文件后,都需要反复commit、push、等待CI/CD流水线执行,才能看到结果。这种"试错-等待-再试错"的循环不仅耗时,还严重影响了开发效率。
更令人头疼的是,当workflow执行失败时,你只能看到最终的错误日志,却无法直观地了解:
- 整个workflow的执行流程是怎样的?
- 各个job之间的依赖关系如何?
- 执行时间分布和性能瓶颈在哪里?
- 历史执行记录和成功率统计如何?
act(GitHub Actions本地运行器)的出现解决了第一个问题,但数据可视化仍然是许多开发者的痛点。本文将为你揭示如何通过act的数据可视化功能,彻底告别本地调试的"盲区"。
act可视化功能全景图
act提供了多种可视化方式来帮助你理解和分析workflow执行情况:
1. 工作流图形化展示(Graph Mode)
使用--graph或-g参数,act可以将workflow的job依赖关系以ASCII艺术的形式直观展示:
act --graph
这将生成类似下面的可视化输出:
╭─────────────╮ ╭─────────────╮ ╭─────────────╮
│ build │ │ test │ │ deploy │
╰─────────────╯ ╰─────────────╯ ╰─────────────╯
↓ ↓ ↓
2. 执行时间线可视化
虽然act本身不直接提供时间线图表,但可以通过日志时间戳结合外部工具实现:
act -v 2>&1 | grep "time=" | awk '{print $1, $2, $5}'
3. 自定义数据收集框架
通过扩展act的日志输出,可以构建完整的数据可视化流水线:
实战:构建act执行数据可视化系统
步骤1:启用详细日志记录
首先,我们需要获取详细的执行数据。使用verbose模式运行act:
act -v --json > act_execution.json
这将生成包含完整执行信息的JSON格式日志。
步骤2:数据解析与存储
创建一个Python脚本来解析act的执行数据:
import json
import sqlite3
from datetime import datetime
def parse_act_logs(log_file):
with open(log_file, 'r') as f:
logs = [json.loads(line) for line in f if line.strip()]
# 连接到SQLite数据库
conn = sqlite3.connect('act_stats.db')
cursor = conn.cursor()
# 创建统计表
cursor.execute('''
CREATE TABLE IF NOT EXISTS execution_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
workflow_name TEXT,
job_name TEXT,
status TEXT,
start_time TIMESTAMP,
end_time TIMESTAMP,
duration INTEGER,
exit_code INTEGER
)
''')
# 解析并存储数据
for log in logs:
if 'msg' in log and 'job' in log['msg']:
job_data = parse_job_log(log)
cursor.execute('''
INSERT INTO execution_stats
(workflow_name, job_name, status, start_time, end_time, duration, exit_code)
VALUES (?, ?, ?, ?, ?, ?, ?)
''', job_data)
conn.commit()
conn.close()
def parse_job_log(log_entry):
# 解析具体的job日志信息
# 返回(workflow_name, job_name, status, start_time, end_time, duration, exit_code)
pass
步骤3:生成可视化图表
使用Python的Matplotlib和Seaborn库创建丰富的可视化图表:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from datetime import datetime
def generate_visualizations():
# 从数据库读取数据
conn = sqlite3.connect('act_stats.db')
df = pd.read_sql_query('SELECT * FROM execution_stats', conn)
conn.close()
# 设置图表样式
sns.set_style("whitegrid")
plt.figure(figsize=(15, 10))
# 1. 执行时间分布图
plt.subplot(2, 2, 1)
sns.histplot(df['duration'], kde=True)
plt.title('执行时间分布')
plt.xlabel('持续时间(秒)')
plt.ylabel('频次')
# 2. 成功率统计
plt.subplot(2, 2, 2)
status_counts = df['status'].value_counts()
plt.pie(status_counts.values, labels=status_counts.index, autopct='%1.1f%%')
plt.title('执行状态分布')
# 3. 各job平均执行时间
plt.subplot(2, 2, 3)
job_avg_time = df.groupby('job_name')['duration'].mean().sort_values()
job_avg_time.plot(kind='barh')
plt.title('各Job平均执行时间')
plt.xlabel('平均时间(秒)')
# 4. 时间趋势分析
plt.subplot(2, 2, 4)
df['date'] = pd.to_datetime(df['start_time']).dt.date
daily_stats = df.groupby('date').agg({
'duration': 'mean',
'id': 'count'
}).rename(columns={'id': 'execution_count'})
ax = daily_stats['duration'].plot(secondary_y=True, color='r', marker='o')
daily_stats['execution_count'].plot(kind='bar', ax=plt.gca(), alpha=0.3)
plt.title('每日执行统计')
plt.tight_layout()
plt.savefig('act_visualization.png', dpi=300, bbox_inches='tight')
步骤4:构建交互式Web仪表板
使用Streamlit创建实时监控仪表板:
import streamlit as st
import plotly.express as px
import pandas as pd
def create_dashboard():
st.title('act执行数据可视化仪表板')
# 连接到数据库
conn = sqlite3.connect('act_stats.db')
df = pd.read_sql_query('SELECT * FROM execution_stats', conn)
conn.close()
# 侧边栏过滤器
st.sidebar.header('过滤器')
selected_workflow = st.sidebar.selectbox('选择Workflow', df['workflow_name'].unique())
filtered_df = df[df['workflow_name'] == selected_workflow]
# 关键指标
col1, col2, col3 = st.columns(3)
with col1:
st.metric("总执行次数", len(filtered_df))
with col2:
success_rate = (filtered_df['status'] == 'success').mean() * 100
st.metric("成功率", f"{success_rate:.1f}%")
with col3:
avg_duration = filtered_df['duration'].mean()
st.metric("平均耗时", f"{avg_duration:.1f}秒")
# 时间序列图表
st.subheader('执行时间趋势')
time_chart = px.line(filtered_df, x='start_time', y='duration',
color='job_name', title='各Job执行时间变化')
st.plotly_chart(time_chart)
# 状态分布
st.subheader('执行状态分布')
status_chart = px.pie(filtered_df, names='status', title='成功/失败分布')
st.plotly_chart(status_chart)
高级功能:实时监控与告警
实时执行监控
通过结合act的watch模式,可以实现实时监控:
act -w --json | python realtime_monitor.py
性能瓶颈分析
识别workflow中的性能瓶颈:
def analyze_bottlenecks(df):
# 找出执行时间最长的job
slowest_jobs = df.nlargest(5, 'duration')[['job_name', 'duration']]
# 分析时间波动
time_variability = df.groupby('job_name')['duration'].std().sort_values(ascending=False)
# 识别异常值
Q1 = df['duration'].quantile(0.25)
Q3 = df['duration'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[df['duration'] > (Q3 + 1.5 * IQR)]
return slowest_jobs, time_variability, outliers
自动化告警系统
设置阈值告警:
def setup_alerts(df, thresholds):
alerts = []
# 失败率告警
failure_rate = (df['status'] == 'failure').mean()
if failure_rate > thresholds.get('failure_rate', 0.1):
alerts.append(f"失败率过高: {failure_rate:.1%}")
# 执行时间告警
avg_duration = df['duration'].mean()
if avg_duration > thresholds.get('max_avg_duration', 300):
alerts.append(f"平均执行时间过长: {avg_duration:.1f}秒")
# 发送告警(邮件、Slack等)
if alerts:
send_alert("\n".join(alerts))
return alerts
最佳实践与优化建议
1. 数据收集优化
# 使用tee命令同时输出到文件和屏幕
act -v --json 2>&1 | tee -a act_logs/$(date +%Y%m%d_%H%M%S).log
2. 数据库优化
-- 创建索引加速查询
CREATE INDEX idx_job_name ON execution_stats(job_name);
CREATE INDEX idx_start_time ON execution_stats(start_time);
CREATE INDEX idx_status ON execution_stats(status);
-- 定期清理旧数据
DELETE FROM execution_stats
WHERE start_time < datetime('now', '-30 days');
3. 可视化性能优化
对于大规模数据,考虑使用以下优化策略:
- 数据采样:对历史数据进行分析时使用采样
- 预聚合:预先计算常用统计指标
- 缓存机制:对图表数据进行缓存
- 分页加载:大数据集时分页显示
总结与展望
通过本文介绍的方法,你可以构建一个完整的act执行数据可视化系统,实现:
- ✅ 实时监控:实时查看workflow执行状态
- ✅ 历史分析:分析长期执行趋势和模式
- ✅ 性能优化:识别和解决性能瓶颈
- ✅ 告警通知:及时发现问题并通知相关人员
- ✅ 团队协作:共享执行数据和洞察
未来还可以进一步扩展:
- 集成更多数据源(GitHub API、Docker指标等)
- 实现预测性分析(执行时间预测、失败预测)
- 构建更丰富的交互式仪表板
- 开发插件系统支持自定义可视化
现在就开始使用act的数据可视化功能,让你的本地GitHub Actions调试变得更加高效和直观吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



