Skip to content

Commit c084337

Browse files
Read modules versions on process specified by listening port (#47)
* collector: collect process info by pid given * explorer: change to fit the new collector output structure * explorer: use correct host alias as key
1 parent 8cd6245 commit c084337

File tree

7 files changed

+263
-123
lines changed

7 files changed

+263
-123
lines changed

collector/collector.go

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,22 @@ import (
1919
"fmt"
2020
"log"
2121
"runtime"
22+
"strings"
2223
"time"
2324

2425
"github.com/AstroProfundis/sysinfo"
2526
)
2627

2728
type Meta struct {
28-
Timestamp time.Time `json:"timestamp"`
29-
SiVer string `json:"sysinfo_ver"`
30-
GitBranch string `json:"git_branch"`
31-
GitCommit string `json:"git_commit"`
32-
BuildTime string `json:"utc_build_time"`
33-
GoVersion string `json:"go_version"`
34-
TiDBVer TiDBMeta `json:"tidb"`
35-
TiKVVer TiKVMeta `json:"tikv"`
36-
PDVer PDMeta `json:"pd"`
29+
Timestamp time.Time `json:"timestamp"`
30+
SiVer string `json:"sysinfo_ver"`
31+
GitBranch string `json:"git_branch"`
32+
GitCommit string `json:"git_commit"`
33+
BuildTime string `json:"utc_build_time"`
34+
GoVersion string `json:"go_version"`
35+
TiDBVer []TiDBMeta `json:"tidb"`
36+
TiKVVer []TiKVMeta `json:"tikv"`
37+
PDVer []PDMeta `json:"pd"`
3738
}
3839

3940
type Metrics struct {
@@ -73,24 +74,35 @@ func main() {
7374
}
7475

7576
func (metric *Metrics) getMetrics(opts options) {
76-
metric.Meta.getMeta()
77+
var pidList []string
78+
if len(opts.Pid) > 0 {
79+
pidList = strings.Split(opts.Pid, ",")
80+
}
81+
82+
metric.Meta.getMeta(pidList)
7783
if opts.Proc {
78-
metric.ProcStats = GetProcStats(opts.Pid)
84+
metric.ProcStats = GetProcessStats(pidList)
7985
} else {
8086
metric.SysInfo.GetSysInfo()
8187
metric.NTP.getNTPInfo()
8288
metric.Partitions = GetPartitionStats()
8389
}
8490
}
8591

86-
func (meta *Meta) getMeta() {
92+
func (meta *Meta) getMeta(pidList []string) {
8793
meta.Timestamp = time.Now()
8894
meta.SiVer = sysinfo.Version
8995
meta.GitBranch = InsightGitBranch
9096
meta.GitCommit = InsightGitCommit
9197
meta.BuildTime = InsightBuildTime
9298
meta.GoVersion = fmt.Sprintf("%s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH)
93-
meta.TiDBVer = getTiDBVersion()
94-
meta.TiKVVer = getTiKVVersion()
95-
meta.PDVer = getPDVersion()
99+
if len(pidList) > 0 {
100+
meta.TiDBVer = getTiDBVersionByPIDList(pidList)
101+
meta.TiKVVer = getTiKVVersionByPIDList(pidList)
102+
meta.PDVer = getPDVersionByPIDList(pidList)
103+
} else {
104+
meta.TiDBVer = getTiDBVersionByName()
105+
meta.TiKVVer = getTiKVVersionByName()
106+
meta.PDVer = getPDVersionByName()
107+
}
96108
}

collector/pd.go

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
1-
// tidb-insight project pd.go
1+
// pd-insight project pd.go
22
package main
33

44
import (
55
"bytes"
66
"log"
77
"os/exec"
8+
"strconv"
89
"strings"
10+
11+
"github.com/shirou/gopsutil/process"
912
)
1013

1114
// PDMeta is the metadata struct of a PD server
1215
type PDMeta struct {
16+
Pid int32 `json:"pid,omitempty"`
1317
ReleaseVer string `json:"release_version,omitempty"`
1418
GitCommit string `json:"git_commit,omitempty"`
1519
GitBranch string `json:"git_branch,omitempty"`
1620
BuildTime string `json:"utc_build_time,omitempty"`
1721
}
1822

19-
func getPDVersion() PDMeta {
23+
func getPDVersion(proc *process.Process) PDMeta {
2024
var pdVer PDMeta
21-
pdProc, err := getProcessesByName("pd-server")
22-
if err != nil {
23-
log.Fatal(err)
24-
}
25-
if pdProc == nil {
26-
return pdVer
27-
}
28-
file, err := pdProc.Exe()
25+
pdVer.Pid = proc.Pid
26+
file, err := proc.Exe()
2927
if err != nil {
3028
log.Fatal(err)
3129
}
@@ -60,3 +58,42 @@ func getPDVersion() PDMeta {
6058

6159
return pdVer
6260
}
61+
62+
func getPDVersionByName() []PDMeta {
63+
var pdMeta = make([]PDMeta, 0)
64+
procList, err := getProcessesByName("pd-server")
65+
if err != nil {
66+
log.Fatal(err)
67+
}
68+
if len(procList) < 1 {
69+
return pdMeta
70+
}
71+
72+
for _, proc := range procList {
73+
pdMeta = append(pdMeta, getPDVersion(proc))
74+
}
75+
return pdMeta
76+
}
77+
78+
func getPDVersionByPIDList(pidList []string) []PDMeta {
79+
pdMeta := make([]PDMeta, 0)
80+
for _, pidStr := range pidList {
81+
pidNum, err := strconv.Atoi(pidStr)
82+
if err != nil {
83+
log.Fatal(err)
84+
}
85+
proc, err := getProcessByPID(pidNum)
86+
if err != nil {
87+
log.Fatal(err)
88+
}
89+
if proc == nil {
90+
continue
91+
}
92+
procName, _ := proc.Name()
93+
if !strings.Contains(procName, "pd-server") {
94+
continue
95+
}
96+
pdMeta = append(pdMeta, getPDVersion(proc))
97+
}
98+
return pdMeta
99+
}

collector/process.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@ type RlimitUsage struct {
3030
Used uint64 `json:"used"`
3131
}
3232

33-
func GetProcStats(pidList string) []ProcessStat {
34-
if len(pidList) > 0 {
33+
func GetProcessStats(pidList []string) []ProcessStat {
34+
if pidList != nil {
3535
return getProcStatsByPIDList(pidList)
3636
}
3737
return getProcStatsByName()
3838
}
3939

40-
func getProcStatsByPIDList(pidList string) []ProcessStat {
40+
func getProcStatsByPIDList(pidList []string) []ProcessStat {
4141
stats := make([]ProcessStat, 0)
42-
for _, pidStr := range strings.Split(pidList, ",") {
42+
for _, pidStr := range pidList {
4343
pidNum, err := strconv.Atoi(pidStr)
4444
if err != nil {
4545
log.Fatal(err)
@@ -49,7 +49,7 @@ func getProcStatsByPIDList(pidList string) []ProcessStat {
4949
log.Fatal(err)
5050
}
5151
if proc == nil {
52-
return stats
52+
continue
5353
}
5454
var stat ProcessStat
5555
stat.getProcessStat(proc)
@@ -62,16 +62,18 @@ func getProcStatsByName() []ProcessStat {
6262
tiServers := []string{"pd-server", "tikv-server", "tidb-server"}
6363
stats := make([]ProcessStat, 0)
6464
for _, procName := range tiServers {
65-
proc, err := getProcessesByName(procName)
65+
procList, err := getProcessesByName(procName)
6666
if err != nil {
6767
log.Fatal(err)
6868
}
69-
if proc == nil {
69+
if len(procList) < 1 {
7070
continue
7171
}
72-
var stat ProcessStat
73-
stat.getProcessStat(proc)
74-
stats = append(stats, stat)
72+
for _, proc := range procList {
73+
var stat ProcessStat
74+
stat.getProcessStat(proc)
75+
stats = append(stats, stat)
76+
}
7577
}
7678
return stats
7779
}
@@ -177,18 +179,20 @@ func getProcessByPID(pid int) (*process.Process, error) {
177179
return nil, err
178180
}
179181

180-
func getProcessesByName(searchName string) (*process.Process, error) {
182+
func getProcessesByName(searchName string) ([]*process.Process, error) {
181183
procList, err := process.Processes()
182184
if err != nil || len(procList) < 1 {
183185
return nil, err
184186
}
187+
188+
procResult := make([]*process.Process, 0)
185189
for _, proc := range procList {
186190
// skip when process no longer exist
187191
procName, _ := proc.Name()
188-
// TODO: return multiple processes that match the search
192+
// return multiple processes that match the search
189193
if strings.Contains(procName, searchName) {
190-
return proc, err
194+
procResult = append(procResult, proc)
191195
}
192196
}
193-
return nil, err
197+
return procResult, err
194198
}

collector/tidb.go

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,26 @@ import (
55
"bytes"
66
"log"
77
"os/exec"
8+
"strconv"
89
"strings"
10+
11+
"github.com/shirou/gopsutil/process"
912
)
1013

11-
// TiDBMeta is the metadata struct of a TiDB server
14+
// TiDBMeta is the metadata struct of TiDB server
1215
type TiDBMeta struct {
16+
Pid int32 `json:"pid,omitempty"`
1317
ReleaseVer string `json:"release_version,omitempty"`
1418
GitCommit string `json:"git_commit,omitempty"`
1519
GitBranch string `json:"git_branch,omitempty"`
1620
BuildTime string `json:"utc_build_time,omitempty"`
1721
GoVersion string `json:"go_version,omitempty"`
1822
}
1923

20-
func getTiDBVersion() TiDBMeta {
24+
func getTiDBVersion(proc *process.Process) TiDBMeta {
2125
var tidbVer TiDBMeta
22-
tidbProc, err := getProcessesByName("tidb-server")
23-
if err != nil {
24-
log.Fatal(err)
25-
}
26-
if tidbProc == nil {
27-
return tidbVer
28-
}
29-
file, err := tidbProc.Exe()
26+
tidbVer.Pid = proc.Pid
27+
file, err := proc.Exe()
3028
if err != nil {
3129
log.Fatal(err)
3230
}
@@ -61,6 +59,44 @@ func getTiDBVersion() TiDBMeta {
6159
continue
6260
}
6361
}
64-
6562
return tidbVer
6663
}
64+
65+
func getTiDBVersionByName() []TiDBMeta {
66+
var tidbMeta = make([]TiDBMeta, 0)
67+
procList, err := getProcessesByName("tidb-server")
68+
if err != nil {
69+
log.Fatal(err)
70+
}
71+
if len(procList) < 1 {
72+
return tidbMeta
73+
}
74+
75+
for _, proc := range procList {
76+
tidbMeta = append(tidbMeta, getTiDBVersion(proc))
77+
}
78+
return tidbMeta
79+
}
80+
81+
func getTiDBVersionByPIDList(pidList []string) []TiDBMeta {
82+
tidbMeta := make([]TiDBMeta, 0)
83+
for _, pidStr := range pidList {
84+
pidNum, err := strconv.Atoi(pidStr)
85+
if err != nil {
86+
log.Fatal(err)
87+
}
88+
proc, err := getProcessByPID(pidNum)
89+
if err != nil {
90+
log.Fatal(err)
91+
}
92+
if proc == nil {
93+
continue
94+
}
95+
procName, _ := proc.Name()
96+
if !strings.Contains(procName, "tidb-server") {
97+
continue
98+
}
99+
tidbMeta = append(tidbMeta, getTiDBVersion(proc))
100+
}
101+
return tidbMeta
102+
}

0 commit comments

Comments
 (0)