前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Prometheus构建发布工具 promu 使用

Prometheus构建发布工具 promu 使用

作者头像
我是阳明
发布2022-04-06 08:14:37
1K0
发布2022-04-06 08:14:37
举报
文章被收录于专栏:k8s技术圈

众所周知,Go语言中打包命令是 go build。在项目中,你可以单独使用 go build 命令对项目进行编译打包,也可以根据自己的需要,在该命令后加各种参数。prometheus官方为了统一项目(包括 prometheus、alertmanager和各种官方的 exporter)的编译和打包,开发了 promu 工具。

官方对 promu 工具的介绍:

代码语言:javascript
复制
`promu is the utility tool for building and releasing Prometheus projects``# promu是一个构建和发行Prometheus项目的实用工具`

promu工具的获取

源码编译

代码语言:javascript
复制
git clone https://github.com/prometheus/promu.git
make build

直接下载可执行文件

代码语言:javascript
复制
curl -s -L https://github.com/prometheus/promu/releases/download/v0.5.0/promu-0.5.0.linux-amd64.tar.gz | tar -xvzf - -C /tmp

promu配置文件介绍

promu使用过程中,最重要的配置文件是 .promu.yml,但是,官网上除了对promu工具参数的简单解释外,没有对 .promu.yml的编写进行说明,下面我们对一些常用的配置进行说明(可能官方觉得既然都要去编译prometheus项目了,那肯定会去看代码的,所以就不写文档了)

下面这个.promu.yml文件,就是在我的一个go项目中使用promu工具进行打包的配置文件

代码语言:javascript
复制
# go相关的基本配置
go:
  cgo: true
repository:
  # module name
  path: woqutech.com/jianqiang.zhu/my-golang
# 构建
build:
  binaries:
      # 输出的二进制包名称
    - name: woqu
      # main方法所在go文件的位置
      path: ./
  flags: -a -tags netgo
  # 编译时注入变量,结合prometheus的version包使用
  ldflags: |
    -X github.com/prometheus/common/version.Version={{.Version}}
    -X github.com/prometheus/common/version.Revision={{.Revision}}
    -X github.com/prometheus/common/version.Branch={{.Branch}}
    -X github.com/prometheus/common/version.BuildUser={{user}}@{{host}}
    -X github.com/prometheus/common/version.BuildDate={{date "20060102-15:04:05"}}
# 打包,将生成的二进制包和files下列出的文件进行打包
tarball:
  files:
    - default.yml
    - README.md
# 交叉编译
crossbuild:
  platforms:
    - linux/amd64
    - linux/386

go标签

(1)cgo

go语言提供了CGO机制,使得能够在go代码中直接调用C的库函数,大大提高了效率,减少了重复开发工作,如果你的项目中引用了用CGO写成的库,在编译时要把CGO_ENABLED=1开起来。如在使用go-sqlite3

(2)Oracle exporter 需要oracle提供的OCI或ODPI动态链接库支持,需要开启CGO特性

(3)网上说使用CGO的库,会使整个系统的性能大大降低。goroutine 通过 CGO 进入到 C 接口的执行阶段后,已经脱离了 golang 运行时的调度并且会独占线程,此时实际上变成了多线程同步的编程模型。如果 C 接口里有阻塞操作,这时候可能会导致所有线程都处于阻塞状态?

repository标签

(1)path

- path后所填的变量为你的模块,go语言在1.11后,官方支持了模块,即Go Modules,使用go mod命令实现

- 当你在你项目的根目录执行 go mod init woqutech.com/jianqiang.zhu/my-golang后,当前目录就变成了一个go模块,并会生成一个go.mod文件

- 若path后所填不是模块名,promu工具编译时则会去GOPATH或GOROOT目录下找,如下图:

build标签

(1)binaries

- 输出的二进制包的名字:name

- 指定main包的位置:path

- 可以以yml列表的形式编写多个,执行build命令后生成多个二进制包

(2)flags

-a:强制重新构建

-tags:TODO,还不清楚具体干啥

(3)ldflags

编译时加上ldflags属性,可以设置变量的值,在prometheus项目中通常用来设置版本等基础信息(当前项目必需被git所管理,否则编译时获取不到分支等信息),并结合prometheus的version包来使用,下面是个简单的例子:

代码语言:javascript
复制
package main
  
import "gopkg.in/alecthomas/kingpin.v2"
import "github.com/prometheus/common/version"
  
func main() {
    kingpin.Version(version.Print("woqu"))
    kingpin.Parse()
}

- 命令: ./promu build

tarball标签

(1)files

编译完成之后,你可能需要将二进制文件和其他文件一起打个包,则可使用这个命令

命令: ./promu tarball

crossbuild标签

golang支持交叉编译,我们生产环境均为linux/amd64环境,无需使用该功能,不然多环境的使用会引入不必要的麻烦。

但是某些依赖库在操作系统上安装部署非常麻烦,可以借助crossbuild在docker环境中构建可执行程序。

原文链接:http://blog.lujianxin.com/x/art/mwuvnoldjj83

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

本文分享自 k8s技术圈 微信公众号,前往查看

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

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

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