前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang Dep 依赖冲突处理

Golang Dep 依赖冲突处理

作者头像
poslua
发布2019-08-19 14:56:36
1.2K0
发布2019-08-19 14:56:36
举报
文章被收录于专栏:posluaposlua

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

代码语言:javascript
复制
memStats := &runtime.MemStats{}
runtime.ReadMemStats(memStats)

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

代码语言:javascript
复制
gcstats := &debug.GCStats{PauseQuantiles: make([]time.Duration, 100)}
debug.ReadGCStats(gcstats)

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

代码语言:javascript
复制
package main

import (
    "expvar"
    "net/http"
)

func main() {
    http.Handle("/stats", expvar.Handler())
    http.ListenAndServe(":8080", nil)
}

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

代码语言:javascript
复制
{
    "cmdline": [
        "/tmp/go-build076828032/b001/exe/main"
    ],
    "memstats": {
        "Alloc": 406936,
        "TotalAlloc": 406936,
        "Sys": 71629048,
        "Lookups": 0,
        "Mallocs": 1392,
        "Frees": 147,
        "HeapAlloc": 406936,
        "HeapSys": 66781184,
        "HeapIdle": 65683456,
        "HeapInuse": 1097728,
        "HeapReleased": 0,
        "HeapObjects": 1245,
        "StackInuse": 327680,
        "StackSys": 327680,
        "MSpanInuse": 16568,
        "MSpanSys": 32768,
        "MCacheInuse": 3456,
        "MCacheSys": 16384,
        "BuckHashSys": 1442888,
        "GCSys": 2234368,
        "OtherSys": 793776,
        "NextGC": 4473924,
        "LastGC": 0,
        "PauseTotalNs": 0,
        "PauseNs": [
            0,
            0
        ],
        "PauseEnd": [
            0,
            0
        ],
        "NumGC": 0,
        "NumForcedGC": 0,
        "GCCPUFraction": 0,
        "EnableGC": true,
        "DebugGC": false,
        "BySize": [
            {
                "Size": 0,
                "Mallocs": 0,
                "Frees": 0
            },
            {
                "Size": 8,
                "Mallocs": 47,
                "Frees": 0
            }
        ]
    }
}

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

代码语言:javascript
复制
package main

import (
    "net/http"

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

func main() {
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}

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

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

代码语言:javascript
复制
# .../vendor/github.com/prometheus/client_golang/prometheus
../vendor/github.com/prometheus/client_golang/prometheus/desc.go:88: undefined: model.IsValidMetricName
../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 新增以下规则:

代码语言:javascript
复制
[[override]]
  name = "github.com/prometheus/client_golang"
  branch = "master"

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

代码语言:javascript
复制
unable to update checked out version: fatal: reference is not a tree: fa4aa9000d2863904891d193dea354d23f3d712a

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 poslua 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Prometheus 监控服务
Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档