DataDog/gostackparse

GitHub: DataDog/gostackparse

一个高性能的 Go 库,用于将 panic 或 debug.Stack 产生的 goroutine 堆栈跟踪文本解析为结构化数据。

Stars: 127 | Forks: 9

[![CI 测试状态](https://img.shields.io/github/workflow/status/DataDog/gostackparse/Go?label=tests)](https://github.com/DataDog/gostackparse/actions/workflows/go.yml?query=branch%3Amain) [![文档](http://img.shields.io/badge/godoc-reference-blue.svg)](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分析, 日志审计