Prometheus官网文档中编译random示例时go语言报错的解决办法

在Prometheus官网的GETTING STARTED 文档中,有个用go语言开发的client_golang的例子,这段示例执行后,可以模拟三个被监控的目标。

代码所属的章节如下:

Starting up some sample targets

Download the Go client library for Prometheus and run three of these example processes:

相关命令行如下:

# Fetch the client library code and compile example.
git clone https://github.com/prometheus/client_golang.git
cd client_golang/examples/random
go get -d
go build

# Start 3 example targets in separate terminals:
./random -listen-address=:8080
./random -listen-address=:8081
./random -listen-address=:8082

下载并安装安装了golang和git后,就可以执行上面的代码了。Prometheus官网给出的示例是linux操作系统的,我的是windows环境,所以我在windows PowerShell下执行,除了提示符不一样,命令都一样。

git clone https://github.com/prometheus/client_golang.git
cd client_golang/examples/random 

前两行都正常,没有报错。

当执行到 go get -d 命令时,报了类似下面的错:

Fetching https://golang.org/x/net?go-get=1 https fetch failed: Get https://golang.org/x/net?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. package golang.org/x/net/...: unrecognized import path "golang.org/x/net/..." 

报错原因是由于被墙了,无法连接到https://golang.org/x/net...

由于从未学习过go语言,无任何基础,在网上一通搜索,发现此类问题最常用的的解决方法是:

在src目录下面构造目录结构
$mkdir -p $GOPATH/src/golang.org/x/
$cd $GOPATH/src/golang.org/x/
$git clone 
https://github.com/golang/net.git net
$go install net
执行go install之后没有提示,就说明安装好了。

对于Prometheus的这个示例,这个方法无效。又用go env命令检查了环境变量设置,主要看了GOPATH也没发现有什么问题。

后来在client_golang下看到一个go.mod里有所有get的的依赖包,go.mod的文件内容如下:

module github.com/prometheus/client_golang

require (
    github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973
    github.com/golang/protobuf v1.2.0
    github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
    github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910
    github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce
    github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d
    golang.org/x/net v0.0.0-20181114220301-adae6a3d119a
    golang.org/x/sync v0.0.0-20181108010431-42b317875d0f // indirect
)

其中后面两行,跟执行 go get -d 命令时的报错内容关键字完全匹配。怀疑问题出在这儿。然后上网又搜了一通,找到了下面的内容:

go mod命令

随着Go 1.11的发布,go开始支持mod子命令

这个命令解决了Go依赖更新的问题。刚开始学起来有一点难度,不过学会了之后,会发现这玩意比原来的 vendor好太多。
官方还专门弄了一个
https://goproxy.io网站,专门方便我们这些国内的用户。

然后到https://goproxy.io网站一看,页面及其简洁,除了标题,就只有下面几句,也没有链接:

 

A global proxy for go modules 

First, you will need to enable the Go Modules feature and configure Go to use the proxy.

export GOPROXY=https://goproxy.ioOr$env:GOPROXY = "https://goproxy.io"Now, when you build and run your applications, go will fetch dependencies via goproxy.io.

Note: This proxy can't fetch your private repos of course.

  其核心就是配置GOPROXY环境变量,把GOPROXY配置为https://goproxy.io。我的是windows环境,所以就在PowerShell命令行执行了$env:GOPROXY = "https://goproxy.io"。

 设置好GOPROXY后,再执行 go get -d 和 以后的命令都没有再报错。


更多精彩内容