-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjmxConn.go
103 lines (90 loc) · 2.78 KB
/
jmxConn.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Poeplesoft Metric Capture via JMX
package psoftjmx
import (
"bytes"
"errors"
"fmt"
"github.com/UMN-PeopleSoft/nailgo"
"net"
"strconv"
"strings"
)
var (
jmxClass = "edu.umn.pssa.jmxquery.JMXQuery"
)
// defined the connection info to a JMX/rmi server
type JMXConnection struct {
NGAddress string
ConnectURL string
UserID string
Password string
}
// Initiates the JMX Command throught the NailGun Client call
func (jmxConn *JMXConnection) RunJMXCommand(domainName string, attrList []string) (rawResponse string, err error) {
rawResponse = ""
ngBuf := new(bytes.Buffer)
ngBufErr := new(bytes.Buffer)
ngConn := &nailgo.NailgunConnection{}
ngConn.Conn, err = jmxConn.GetNGConn()
if err != nil {
return rawResponse, err
}
ngConn.Output = ngBuf
ngConn.Outerr = ngBufErr
srvlog.Debug("JMX Conn: RunJMXCommand: " + fmt.Sprintf("%#v", ngConn))
ngCmdArgs := []string{}
ngCmdArgs = append(ngCmdArgs, "-url")
ngCmdArgs = append(ngCmdArgs, jmxConn.ConnectURL)
ngCmdArgs = append(ngCmdArgs, "-q")
ngCmdArgs = append(ngCmdArgs, strings.Join(attrList, ";"))
ngCmdArgs = append(ngCmdArgs, "-u")
ngCmdArgs = append(ngCmdArgs, jmxConn.UserID)
ngCmdArgs = append(ngCmdArgs, "-p")
ngCmdArgs = append(ngCmdArgs, jmxConn.Password)
srvlog.Debug("JMX Conn: ngConn.SendCommand: " + fmt.Sprintf("%#v", ngCmdArgs))
exitCode, err := ngConn.SendCommand(jmxClass, ngCmdArgs)
if exitCode != 0 {
srvlog.Error("JMX ngConn.SendCommand error for " + domainName + ": " + strconv.Itoa(exitCode) + ": response: " + ngBuf.String())
if exitCode == 899 {
return "", fmt.Errorf("Invalid user/password to access JMX target %s", domainName)
} else {
return "", fmt.Errorf("Unable to connect to JMX target %s, exitCode: %d response: %s", domainName, exitCode, ngBuf.String())
}
}
srvlog.Debug("JMX Conn: ngConn.SendCommand: Completed sendcommand for " + domainName)
rawResponse = ngBuf.String()
return rawResponse, nil
}
func (jmxConn *JMXConnection) getNailGunStats() (rawResponse string, err error) {
rawResponse = ""
ngBuf := new(bytes.Buffer)
ngConn := &nailgo.NailgunConnection{}
ngConn.Conn, err = jmxConn.GetNGConn()
if err != nil {
return rawResponse, err
}
ngConn.Output = ngBuf
exitCode, err2 := ngConn.SendCommand("ng-stats", []string{})
if err2 != nil {
return rawResponse, err2
}
if exitCode != 0 {
return rawResponse, errors.New("Unable to get Nailgun Stats")
}
rawResponse = ngBuf.String()
return rawResponse, nil
}
func (jmxConn *JMXConnection) GetNGConn() (net.Conn, error) {
var err error
var conn net.Conn
if strings.HasPrefix(jmxConn.NGAddress, "local:") {
socketFile := strings.Split(jmxConn.NGAddress, ":")[1]
conn, err = net.Dial("unix", socketFile)
} else {
conn, err = net.Dial("tcp", jmxConn.NGAddress)
}
if err != nil {
return nil, err
}
return conn, nil
}