112 lines
5.0 KiB
Markdown
112 lines
5.0 KiB
Markdown
# hsperfdata
|
|
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fxin053%2Fhsperfdata?ref=badge_shield)
|
|
|
|
|
|
This is a golang parser for the newest V2 java HotSpot virtual machine performance data, support all platform theoretically.
|
|
|
|
## What's this?
|
|
|
|
It is a log directory created by JVM while running your code. By default it is created inside the tmp folder of the operating system that you are using! This directory is a part of Java Performance counter. And the file in this directory is named by the pid number of java process.
|
|
|
|
You can disable creating this directory by using `-XX:-UsePerfData` or `-XX:+PerfDisableSharedMem` which is not recommended.
|
|
|
|
## Used as a library
|
|
|
|
You can just read the `cli.go` file at the root directory to figure out how to use.
|
|
|
|
|
|
```go
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/xin053/hsperfdata"
|
|
)
|
|
|
|
// first, you should get the file path string of the hsperfdata file that you want to parser.
|
|
// there are several function to get the path, include PerfDataPath(pid string), PerfDataPaths(pids []string), UserPerfDataPaths(user string), CurrentUserPerfDataPaths(), AllPerfDataPaths(), DataPathsByProcessName(processName string)
|
|
// the source code is easy to read through, you can just read the hsperfdata.go to figure out how to use them.
|
|
|
|
entryMap, err := hsperfdata.ReadPerfData(filePath, true)
|
|
if err != nil {
|
|
log.Fatal("open fail", err)
|
|
}
|
|
|
|
for _, key := range keys {
|
|
fmt.Printf("%s=%v\n", key, entryMap[key])
|
|
}
|
|
```
|
|
|
|
## Used as a command
|
|
|
|
### build yourself
|
|
|
|
```shell
|
|
export GOPATH=`pwd`
|
|
go get -d github.com/xin053/hsperfdata
|
|
cd src/github.com/xin053/hsperfdata
|
|
go build cli.exe
|
|
```
|
|
|
|
### use the release package
|
|
|
|
download the executable from the release page, then here you go!
|
|
|
|
## Want deeper?
|
|
|
|
### java HotSpot virtual machine performance data structures
|
|
|
|
```go
|
|
// perfdataHeader http://openjdk.java.net/groups/serviceability/jvmstat/sun/jvmstat/perfdata/monitor/AbstractPerfDataBufferPrologue.html
|
|
// source code https://github.com/dmlloyd/openjdk/blob/jdk/jdk/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBufferPrologue.java
|
|
type perfdataHeader struct {
|
|
Magic uint32 // magic number - 0xcafec0c0
|
|
ByteOrder byte // big_endian == 0, little_endian == 1
|
|
Major byte // major version numbers
|
|
Minor byte // minor version numbers
|
|
// ReservedByte byte // used as Accessible flag at performance data V2
|
|
}
|
|
|
|
// prologue http://openjdk.java.net/groups/serviceability/jvmstat/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBufferPrologue.html
|
|
// source code https://github.com/dmlloyd/openjdk/blob/jdk/jdk/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBufferPrologue.java
|
|
type bufferPrologueV2 struct {
|
|
Accessible byte // Accessible flag at performance data V2
|
|
Used int32 // number of PerfData memory bytes used
|
|
Overflow int32 // number of bytes of overflow
|
|
ModTimestamp int64 // time stamp of the last structural modification
|
|
EntryOffset int32 // offset of the first PerfDataEntry
|
|
NumEntries int32 // number of allocated PerfData entries
|
|
}
|
|
|
|
// entryHeader http://openjdk.java.net/groups/serviceability/jvmstat/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.html
|
|
// source code https://github.com/dmlloyd/openjdk/blob/jdk/jdk/src/jdk.internal.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java
|
|
type entryHeader struct {
|
|
EntryLength int32 // entry length in bytes
|
|
NameOffset int32 // offset to entry name, relative to start of entry
|
|
VectorLength int32 // length of the vector. If 0, then scalar.
|
|
DataType byte // JNI field descriptor type
|
|
Flags byte // miscellaneous attribute flags 0x01 - supported
|
|
DataUnits byte // unit of measure attribute
|
|
DataVar byte // variability attribute
|
|
DataOffset int32 // offset to data item, relative to start of entry.
|
|
}
|
|
```
|
|
|
|
**You can read the source code `hsperfdata.go` to get more information, have a good time!**
|
|
|
|
**You can open a issue if you have any questions.**
|
|
|
|
## Attention
|
|
|
|
The newest java HotSpot virtual machine performance data structures was V2 when I wrote this code, so these data structures may change from release to release, so this parser code only support JVM performance data V2. If there is new version, please open a issue or pull request, thx.
|
|
|
|
## Reference link
|
|
|
|
1. http://openjdk.java.net/groups/serviceability/jvmstat/index.html
|
|
2. https://github.com/tokuhirom/go-hsperfdata
|
|
3. https://github.com/njwhite/telegraf/blob/master/plugins/inputs/hsperfdata/hsperfdata.go
|
|
4. https://github.com/twitter/commons/blob/master/src/python/twitter/common/java/perfdata/bin/jammystat.py
|
|
5. https://github.com/YaSuenag/hsbeat/blob/master/module/hotspot/hsperfdata/parser.go
|
|
|
|
## License
|
|
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fxin053%2Fhsperfdata?ref=badge_large) |