Skip to content

Commit 1b54a20

Browse files
committed
单独拎出来放到独立仓库
0 parents  commit 1b54a20

19 files changed

+1184
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.idea
2+
uploads

README.md

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
## 项目
2+
解析 nmon 导出数据,以图表的形式进行展示,同时支持导出 Excel 文件。
3+
4+
## 使用
5+
### 源码编译
6+
将代码下载到本地后,执行 `go build -o nmon-parser main.go`,然后运行 `nmon-parser web --port=8081`,在浏览器打开地址:http://localhost:2233
7+
8+
### 或则直接下载编译好的可执行文件
9+
Linux 系统:`nmon-parser web --port=8081`
10+
Windows 系统:`nmon-parser.exe web --port=8081`

core/chart.go

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package core
2+
3+
import (
4+
"github.com/go-echarts/go-echarts/v2/charts"
5+
"github.com/go-echarts/go-echarts/v2/opts"
6+
"github.com/go-echarts/go-echarts/v2/render"
7+
"github.com/go-echarts/go-echarts/v2/types"
8+
)
9+
10+
func LineChart(srcFile string, category Category) (chart render.ChartSnippet, err error) {
11+
line := charts.NewLine()
12+
line.SetGlobalOptions(
13+
charts.WithInitializationOpts(opts.Initialization{Theme: types.ThemeWesteros, Width: "1800px", Height: "800px"}),
14+
charts.WithTitleOpts(
15+
opts.Title{
16+
Title: category.UniqueID,
17+
Subtitle: "Line chart",
18+
Bottom: "0",
19+
}),
20+
charts.WithDataZoomOpts(opts.DataZoom{}),
21+
charts.WithToolboxOpts(
22+
opts.Toolbox{
23+
Show: opts.Bool(true),
24+
Orient: "horizontal",
25+
Feature: &opts.ToolBoxFeature{
26+
SaveAsImage: &opts.ToolBoxFeatureSaveAsImage{Show: opts.Bool(true), Title: "Save"},
27+
},
28+
},
29+
),
30+
)
31+
32+
var categoryData CategoryData
33+
34+
categoryData, err = GetCategoryData(srcFile, category)
35+
if err != nil {
36+
return
37+
}
38+
39+
// X 轴为时间轴
40+
line.SetXAxis(categoryData.TimeSeries)
41+
42+
selectedLegend := make(map[string]bool)
43+
for i, flag := range category.Metrics {
44+
lineData := make([]opts.LineData, 0, len(categoryData.MetricLinesData))
45+
for _, metricLineData := range categoryData.MetricLinesData {
46+
// fixme: 当出现采集行数据数量小于指标数时,该如何处理?直接丢弃本行吗?还是补0?
47+
if len(metricLineData) < len(category.Metrics) {
48+
metricLineData = append(metricLineData, make([]float64, len(category.Metrics)-len(metricLineData))...)
49+
}
50+
51+
lineData = append(lineData, opts.LineData{Value: metricLineData[i]})
52+
}
53+
line.AddSeries(flag, lineData)
54+
selectedLegend[flag] = i == 0
55+
}
56+
57+
line.SetSeriesOptions(charts.WithLineChartOpts(opts.LineChart{Smooth: opts.Bool(true)}))
58+
line.SetGlobalOptions(charts.WithLegendOpts(opts.Legend{Selected: selectedLegend}))
59+
60+
chart = line.RenderSnippet()
61+
return
62+
}

core/export.go

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package core
2+
3+
import (
4+
"fmt"
5+
"github.com/leiyang23/nmon-parser/util"
6+
"github.com/xuri/excelize/v2"
7+
"log/slog"
8+
"runtime/debug"
9+
"sort"
10+
)
11+
12+
func AddToExcel(excelFile string, categories map[string]Category, data map[string]*CategoryData) (err error) {
13+
14+
f, err := excelize.OpenFile(excelFile)
15+
if err != nil {
16+
f = excelize.NewFile()
17+
}
18+
defer util.Close(f)
19+
20+
// 对 sheet 名称进行排序
21+
catList := make([]string, 0)
22+
for category := range data {
23+
catList = append(catList, category)
24+
}
25+
sort.Strings(catList)
26+
27+
// 事先创建好需要的 sheet,方便下一步使用 写入流 写入大规模数据
28+
for _, category := range catList {
29+
_, err = f.NewSheet(category)
30+
}
31+
32+
var sw *excelize.StreamWriter
33+
for _, category := range catList {
34+
categoryData := data[category]
35+
36+
sw, err = f.NewStreamWriter(category)
37+
if err != nil {
38+
slog.Error(err.Error())
39+
return
40+
}
41+
42+
header := make([]interface{}, 0)
43+
header = append(header, "time")
44+
for _, i := range categories[category].Metrics {
45+
header = append(header, i)
46+
}
47+
err = sw.SetRow("A1", header)
48+
if err != nil {
49+
return
50+
}
51+
52+
for i, row := range categoryData.MetricLinesData {
53+
rowData := make([]interface{}, 0, len(header))
54+
rowData = append(rowData, categoryData.TimeSeries[i])
55+
for _, j := range row {
56+
rowData = append(rowData, j)
57+
}
58+
err = sw.SetRow(fmt.Sprintf("A%d", i+2), rowData)
59+
if err != nil {
60+
return
61+
}
62+
}
63+
64+
// 写入磁盘
65+
err = sw.Flush()
66+
if err != nil {
67+
return err
68+
}
69+
}
70+
71+
f.SetActiveSheet(0)
72+
_ = f.DeleteSheet("Sheet1")
73+
return f.SaveAs(excelFile)
74+
}
75+
76+
func AddAAAToExcel(excelFile string, data []AAA) (err error) {
77+
f, err := excelize.OpenFile(excelFile)
78+
if err != nil {
79+
f = excelize.NewFile()
80+
}
81+
defer util.Close(f)
82+
83+
_, err = f.NewSheet("AAA")
84+
if err != nil {
85+
return
86+
}
87+
88+
for i, row := range data {
89+
err = f.SetSheetRow("AAA", fmt.Sprintf("A%d", i+1), &[]string{row.Item1, row.Item2})
90+
if err != nil {
91+
return
92+
}
93+
}
94+
95+
return f.SaveAs(excelFile)
96+
}
97+
98+
func AddBBBPToExcel(excelFile string, data []BBBP) (err error) {
99+
f, err := excelize.OpenFile(excelFile)
100+
if err != nil {
101+
f = excelize.NewFile()
102+
}
103+
defer util.Close(f)
104+
105+
_, err = f.NewSheet("BBBP")
106+
if err != nil {
107+
slog.Error(err.Error())
108+
return
109+
}
110+
111+
for i, row := range data {
112+
err = f.SetSheetRow("BBBP", fmt.Sprintf("A%d", i+1), &[]string{row.Cmd, row.Output})
113+
if err != nil {
114+
return
115+
}
116+
}
117+
118+
debug.FreeOSMemory()
119+
120+
return f.SaveAs(excelFile)
121+
}

core/export_test.go

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package core
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestExcel(t *testing.T) {
8+
categories, err := GetAllCategory(file1)
9+
if err != nil {
10+
t.Fatal(err)
11+
}
12+
13+
data, err := GetCategoryAllData(file1)
14+
15+
if err != nil {
16+
t.Fatal(err)
17+
}
18+
19+
err = AddToExcel("nmon.xlsx", categories, data)
20+
if err != nil {
21+
t.Fatal(err)
22+
}
23+
}
24+
25+
func TestExcel2(t *testing.T) {
26+
BBBPData, err := GetBBBP(file1)
27+
if err != nil {
28+
t.Fatal(err)
29+
}
30+
err = AddBBBPToExcel("kk.xlsx", BBBPData)
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
}

0 commit comments

Comments
 (0)