plp-test/internal/utils/utils.go
2025-04-23 10:33:06 +08:00

137 lines
3.1 KiB
Go

package utils
import (
"crypto/rand"
"fmt"
"math"
"os"
"os/exec"
"strings"
"time"
"github.com/sirupsen/logrus"
)
// Logger 全局日志实例
var Logger *logrus.Logger
// InitLogger 初始化日志系统
func InitLogger(logFile string, level logrus.Level) {
Logger = logrus.New()
Logger.SetLevel(level)
// 设置日志格式
Logger.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
})
// 如果提供了日志文件,则输出到文件
if logFile != "" {
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err == nil {
Logger.SetOutput(file)
} else {
Logger.Info("无法写入日志文件,使用标准输出")
}
}
}
// GenerateRandomData 生成指定大小的随机数据
func GenerateRandomData(size int) ([]byte, error) {
data := make([]byte, size)
_, err := rand.Read(data)
if err != nil {
return nil, err
}
return data, nil
}
// BytesToMB 将字节转换为MB
func BytesToMB(bytes int) float64 {
return float64(bytes) / (1024 * 1024)
}
// MBToBytes 将MB转换为字节
func MBToBytes(mb float64) int {
return int(mb * 1024 * 1024)
}
// KBToBytes 将KB转换为字节
func KBToBytes(kb float64) int {
return int(kb * 1024)
}
// FormatDuration 格式化持续时间
func FormatDuration(d time.Duration) string {
if d < time.Minute {
return fmt.Sprintf("%.2f秒", d.Seconds())
} else if d < time.Hour {
minutes := math.Floor(d.Minutes())
seconds := d.Seconds() - minutes*60
return fmt.Sprintf("%.0f分%.2f秒", minutes, seconds)
} else {
hours := math.Floor(d.Hours())
minutes := math.Floor(d.Minutes()) - hours*60
seconds := d.Seconds() - hours*3600 - minutes*60
return fmt.Sprintf("%.0f时%.0f分%.2f秒", hours, minutes, seconds)
}
}
// CalculatePercentage 计算百分比
func CalculatePercentage(part, total float64) float64 {
if total == 0 {
return 0
}
return (part / total) * 100
}
// ExecuteCommand 执行系统命令
func ExecuteCommand(command string, args ...string) (string, error) {
cmd := exec.Command(command, args...)
output, err := cmd.CombinedOutput()
if err != nil {
return string(output), err
}
return string(output), nil
}
// IsMounted 检查指定路径是否已挂载
func IsMounted(mountPoint string) bool {
output, err := ExecuteCommand("mount")
if err != nil {
return false
}
return strings.Contains(output, mountPoint)
}
// FileExists 检查文件是否存在
func FileExists(path string) bool {
_, err := os.Stat(path)
return !os.IsNotExist(err)
}
// CreateDirIfNotExist 如果目录不存在则创建
func CreateDirIfNotExist(path string) error {
if !FileExists(path) {
return os.MkdirAll(path, 0755)
}
return nil
}
// CalculateWriteSpeed 计算写入速度
func CalculateWriteSpeed(bytesWritten int, duration time.Duration) float64 {
if duration.Seconds() == 0 {
return 0
}
return BytesToMB(bytesWritten) / duration.Seconds()
}
// CalculateIOPS 计算IOPS
func CalculateIOPS(operations int, duration time.Duration) float64 {
if duration.Seconds() == 0 {
return 0
}
return float64(operations) / duration.Seconds()
}