增强插件系统:添加插件执行功能

- 在插件接口和基本插件实现中新增 Execute 方法,支持插件功能的动态执行。
- 更新各个插件(如日志插件、统计插件、存储插件等)以实现 Execute 方法,允许通过操作名称和参数执行特定功能。
- 在插件管理器中添加 ExecutePlugin、ExecutePluginsByType 和 ExecuteAllPlugins 方法,便于批量执行插件操作。
- 示例程序中更新插件调用方式,展示如何使用 Execute 方法进行操作。

此更新提升了插件系统的灵活性和可扩展性,便于开发者动态管理和执行插件功能。
This commit is contained in:
2025-03-14 11:31:32 +08:00
parent 0990e8c42c
commit 9f78cb483b
9 changed files with 559 additions and 7 deletions

View File

@@ -109,6 +109,115 @@ func (p *StatsPlugin) Stop(ctx context.Context) error {
return nil
}
// Execute 执行插件功能
func (p *StatsPlugin) Execute(ctx context.Context, action string, params map[string]interface{}) (interface{}, error) {
switch action {
case "incrementStat":
// 需要参数: name, value
name, ok := params["name"].(string)
if !ok {
return nil, fmt.Errorf("缺少必需参数: name")
}
// 处理整数值参数
var value int64
if floatValue, ok := params["value"].(float64); ok {
value = int64(floatValue)
} else if strValue, ok := params["value"].(string); ok {
var err error
_, err = fmt.Sscanf(strValue, "%d", &value)
if err != nil {
return nil, fmt.Errorf("参数value必须是整数: %v", err)
}
} else {
return nil, fmt.Errorf("缺少必需参数: value")
}
p.IncrementStat(name, value)
return true, nil
case "getStat":
// 需要参数: name
name, ok := params["name"].(string)
if !ok {
return nil, fmt.Errorf("缺少必需参数: name")
}
value := p.GetStat(name)
return value, nil
case "getAllStats":
// 不需要参数
return p.GetAllStats(), nil
case "recordRequest":
// 需要参数: bytesReceived, bytesSent, isError
var bytesReceived, bytesSent int64
var isError bool
// 处理bytesReceived参数
if floatValue, ok := params["bytesReceived"].(float64); ok {
bytesReceived = int64(floatValue)
} else {
return nil, fmt.Errorf("缺少必需参数: bytesReceived")
}
// 处理bytesSent参数
if floatValue, ok := params["bytesSent"].(float64); ok {
bytesSent = int64(floatValue)
} else {
return nil, fmt.Errorf("缺少必需参数: bytesSent")
}
// 处理isError参数
if value, ok := params["isError"].(bool); ok {
isError = value
}
p.RecordRequest(bytesReceived, bytesSent, isError)
return true, nil
case "resetStats":
// 不需要参数
p.mu.Lock()
p.stats = make(map[string]int64)
p.stats["requests"] = 0
p.stats["errors"] = 0
p.stats["bytes_sent"] = 0
p.stats["bytes_received"] = 0
p.startTime = time.Now()
p.mu.Unlock()
return true, nil
case "getStatsReport":
// 生成统计报告
report := p.generateStatsReport()
return report, nil
default:
return nil, fmt.Errorf("未知的操作: %s", action)
}
}
// generateStatsReport 生成统计报告
func (p *StatsPlugin) generateStatsReport() map[string]interface{} {
p.mu.RLock()
defer p.mu.RUnlock()
uptime := time.Since(p.startTime).Seconds()
report := map[string]interface{}{
"uptime_seconds": uptime,
"stats": p.stats,
}
if uptime > 0 && p.stats["requests"] > 0 {
report["requests_per_second"] = float64(p.stats["requests"]) / uptime
report["error_rate"] = float64(p.stats["errors"]) * 100 / float64(p.stats["requests"])
}
return report
}
// logStats 记录当前统计信息
func (p *StatsPlugin) logStats() {
p.mu.RLock()