DataDog/gostackparse
GitHub: DataDog/gostackparse
一个高性能的 Go 库,用于将 panic 或 debug.Stack 产生的 goroutine 堆栈跟踪文本解析为结构化数据。
Stars: 127 | Forks: 9
[](https://github.com/DataDog/gostackparse/actions/workflows/go.yml?query=branch%3Amain)
[](https://pkg.go.dev/github.com/DataDog/gostackparse)
# gostackparse
gostackparse 包用于解析由 [`panic()`](https://golang.org/pkg/builtin/#panic) 或 [`debug.Stack()`](https://golang.org/pkg/runtime/debug/#Stack) 生成的 goroutine 堆栈跟踪,速度约为 ~300 MiB/s。
解析这些数据可用于 [Goroutine 性能分析](https://github.com/DataDog/go-profiler-notes/blob/main/goroutine.md#feature-matrix)或分析来自日志文件的崩溃信息。
## 用法
该包提供了一个简单的 [Parse()](https://pkg.go.dev/github.com/DataDog/gostackparse#Parse) API。你可以像[这样](./example)使用它:
```
import "github.com/DataDog/gostackparse"
func main() {
// Get a text-based stack trace
stack := debug.Stack()
// Parse it
goroutines, _ := gostackparse.Parse(bytes.NewReader(stack))
// Ouptut the results
json.NewEncoder(os.Stdout).Encode(goroutines)
}
```
结果是一个简单的 [Goroutine](https://pkg.go.dev/github.com/DataDog/gostackparse#Goroutine) 结构体列表:
```
[
{
"ID": 1,
"State": "running",
"Wait": 0,
"LockedToThread": false,
"Stack": [
{
"Func": "runtime/debug.Stack",
"File": "/usr/local/Cellar/go/1.16/libexec/src/runtime/debug/stack.go",
"Line": 24
},
{
"Func": "main.main",
"File": "/home/go/src/github.com/DataDog/gostackparse/example/main.go",
"Line": 18
}
],
"FramesElided": false,
"CreatedBy": null
}
]
```
## 设计目标
1. 安全:不应抛出 panic。
2. 简单:保持此包小巧且易于修改。
3. 宽容:即使输入数据与预期不同,也倾向于生成部分结果而不是没有结果。
4. 高效:解析速度达到数百 MiB/s。
## 测试
gostackparse 结合使用了精心挑选的 [测试夹具](./test-fixtures)、[基于属性的测试](https://github.com/DataDog/gostackparse/search?q=TestParse_PropertyBased)和[模糊测试](https://github.com/DataDog/gostackparse/search?q=Fuzz)进行测试。
## 与 panicparse 的比较
[panicparse](https://github.com/maruel/panicparse) 是一个实现了类似功能的流行库。
## 基准测试
gostackparse 包含一个小型基准测试,展示了它可以以 ~300 MiB/s 的速度解析 [test-fixtures/waitsince.txt](./test-fixtures/waitsince.txt),以及它与 panicparse 的比较情况。
```
$ cp panicparse_test.go.disabled panicparse_test.go
$ go get -t .
$ go test -bench .
goos: darwin
goarch: amd64
pkg: github.com/DataDog/gostackparse
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkGostackparse-12 45456 26275 ns/op 302.34 MiB/s 17243 B/op 306 allocs/op
BenchmarkPanicparse-12 76 15943320 ns/op 0.50 MiB/s 5274247 B/op 116049 allocs/op
PASS
ok github.com/DataDog/gostackparse 3.634s
```
## 许可证
本作品采用 Apache 2.0 或 BSD3 双重许可。详见 [LICENSE](./LICENSE)。
标签:EVTX分析, 日志审计