在Prometheus官网的GETTING STARTED 文档中,有个用go语言开发的client_golang的例子,这段示例执行后,可以模拟三个被监控的目标。
代码所属的章节如下:
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.io
Or$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 和 以后的命令都没有再报错。