暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Golang Dep 依赖冲突处理

poslua 2019-03-15
518

对于 Golang 应用内存堆栈的监控,基本都是读取 runtime.MemStats
,然后发往一些 TSDB 进行可视化展示。代码一般都是这样的:

  1. memStats := &runtime.MemStats{}

  2. runtime.ReadMemStats(memStats)

如果希望获取 GC 状态,可以这样:

  1. gcstats := &debug.GCStats{PauseQuantiles: make([]time.Duration, 100)}

  2. debug.ReadGCStats(gcstats)

再简单点儿,可以直接用 Golang 的标准库 - expvar,使用也非常方便:

  1. package main


  2. import (

  3. "expvar"

  4. "net/http"

  5. )


  6. func main() {

  7. http.Handle("/stats", expvar.Handler())

  8. http.ListenAndServe(":8080", nil)

  9. }

之后直接访问 http://localhost:8080/stats ,就可以得到服务运行各项指标和状态:

  1. {

  2. "cmdline": [

  3. "/tmp/go-build076828032/b001/exe/main"

  4. ],

  5. "memstats": {

  6. "Alloc": 406936,

  7. "TotalAlloc": 406936,

  8. "Sys": 71629048,

  9. "Lookups": 0,

  10. "Mallocs": 1392,

  11. "Frees": 147,

  12. "HeapAlloc": 406936,

  13. "HeapSys": 66781184,

  14. "HeapIdle": 65683456,

  15. "HeapInuse": 1097728,

  16. "HeapReleased": 0,

  17. "HeapObjects": 1245,

  18. "StackInuse": 327680,

  19. "StackSys": 327680,

  20. "MSpanInuse": 16568,

  21. "MSpanSys": 32768,

  22. "MCacheInuse": 3456,

  23. "MCacheSys": 16384,

  24. "BuckHashSys": 1442888,

  25. "GCSys": 2234368,

  26. "OtherSys": 793776,

  27. "NextGC": 4473924,

  28. "LastGC": 0,

  29. "PauseTotalNs": 0,

  30. "PauseNs": [

  31. 0,

  32. 0

  33. ],

  34. "PauseEnd": [

  35. 0,

  36. 0

  37. ],

  38. "NumGC": 0,

  39. "NumForcedGC": 0,

  40. "GCCPUFraction": 0,

  41. "EnableGC": true,

  42. "DebugGC": false,

  43. "BySize": [

  44. {

  45. "Size": 0,

  46. "Mallocs": 0,

  47. "Frees": 0

  48. },

  49. {

  50. "Size": 8,

  51. "Mallocs": 47,

  52. "Frees": 0

  53. }

  54. ]

  55. }

  56. }

当然 Prometheus 也内置了 Golang metrics 暴露的 handler,只需要简单调用即可实现,如下:

  1. package main


  2. import (

  3. "net/http"


  4. "github.com/prometheus/client_golang/prometheus/promhttp"

  5. )


  6. func main() {

  7. http.Handle("/metrics", promhttp.Handler())

  8. http.ListenAndServe(":8080", nil)

  9. }

访问 http://localhost:8080/metrics 即可,然后通过 Prometheus 聚合可以方便的在 Grafana 呈现应用运行的历史趋势。

然而通过这种方式,我在使用 dep 打包 vendor 的时候,遇到了个问题:

  1. # .../vendor/github.com/prometheus/client_golang/prometheus

  2. ../vendor/github.com/prometheus/client_golang/prometheus/desc.go:88: undefined: model.IsValidMetricName

  3. ../vendor/github.com/prometheus/client_golang/prometheus/labels.go:56: model.LabelName(l).IsValid undefined (type model.LabelName has no field or method IsValid)

这个原因是由于 dep 在打包的时候用的是 Prometheus 的语义化版本 0.9.2
,其依赖的 client_model proto 文件并不是最新的,具体可以参考这里。解决这个问题只需要覆盖掉 dep 的约束即可,手动编辑 Gopkg.toml 新增以下规则:

  1. [[override]]

  2. name = "github.com/prometheus/client_golang"

  3. branch = "master"

再次执行 depensure-update
,又出现:

  1. unable to update checked out version: fatal: reference is not a tree: fa4aa9000d2863904891d193dea354d23f3d712a

至于这个是因为 dep 的缓存导致,清空掉 $GOPATH/pkg/dep/
即可。

文章转载自poslua,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论