首页 > 其他分享 >Go每日一库之129:promu(Prometheus构建发布工具)

Go每日一库之129:promu(Prometheus构建发布工具)

时间:2023-09-29 21:15:16浏览次数:37  
标签:编译 prometheus promu 一库 Prometheus version go com

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

promu is the utility tool for building and releasing Prometheus projects``_# promu是一个构建和发行Prometheus项目的实用工具_

promu工具的获取

源码编译:

git clone https://github.com/prometheus/promu.git
make build

直接下载可执行文件:

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工具进行打包的配置文件

# 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
每日一库之129:promu(Prometheus构建发布工具)-1
(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目录下找,如下图:
    每日一库之129:promu(Prometheus构建发布工具)-2

build标签

(1)binaries

  • 输出的二进制包的名字:name
  • 指定main包的位置:path
  • 可以以yml列表的形式编写多个,执行build命令后生成多个二进制包
    (2)flags
    -a:强制重新构建
    -tags:TODO,还不清楚具体干啥
    (3)ldflags
    编译时加上ldflags属性,可以设置变量的值,在prometheus项目中通常用来设置版本等基础信息(当前项目必需被git所管理,否则编译时获取不到分支等信息),并结合prometheus的version包来使用,下面是个简单的例子:
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
    每日一库之129:promu(Prometheus构建发布工具)-3

tarball标签

(1)files
编译完成之后,你可能需要将二进制文件和其他文件一起打个包,则可使用这个命令
命令: ./promu tarball

crossbuild标签

golang支持交叉编译,我们生产环境均为linux/amd64环境,无需使用该功能,不然多环境的使用会引入不必要的麻烦。
但是某些依赖库在操作系统上安装部署非常麻烦,可以借助crossbuild在docker环境中构建可执行程序。

标签:编译,prometheus,promu,一库,Prometheus,version,go,com
From: https://www.cnblogs.com/arena/p/17737338.html

相关文章

  • Go每日一库之128:podinfo(k8s微服务模板)
    项目介绍官方Github:PodinfoPodinfo是一个用Go制作的小型web应用程序,它展示了在Kubernetes中运行微服务的最佳实践。它已实现的技术指标(截选自官方README.md):里面每一项技术指标的实现方式,其实都可以拿出来单独讲好久,相关理论也有好多。这里我只是讲针对这个项......
  • Go每日一库之145:MinIO(高性能对象存储)
    1.MinIO简介MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNUAGPLv3开源协议,项目地址是https://github.com/minio/minio,官网是https://min.io。它适合存储海量的非结构化的数据,例如说图片、音频、视频等常见文件,备份数据、容器、虚拟机镜像等等,小......
  • Go每日一库之146:bbs-go(bbs框架)
    概要bbs-go是一款基于Go语言研发的开源、前后端分离、精美小巧、跨平台的社区系统。初期该项目仅用过学习和交流,开源之后越来越多的小伙伴儿开始喜欢和关注他,这也是我长期升级和维护的动力。bbs-go为前后端分离设计,后端接口服务使用简洁的Go语言进行开发,前端页面使用Vue.js进......
  • Go每日一库之144:go-obs-websocket(OBS连接器)
    推荐理由互联网的兴起带动了直播行业的火热,除了少数直播网站有自己的推流工具之外,OBS是主流的推流工具,广泛应用在直转播技术之上。简介go-obs-websocket是一个与OBS进行websocket通信的连接库,具备调用大部分OBS功能的接口,在互动直播和智能转播技术上广泛应用。快速开始安装g......
  • Go每日一库之143:servicegroup(进程内优雅管理多个服务)
    前言在go-zero社区里,经常会有同学问,把APIgateway和RPCservice放在同一个进程内可不可以?怎么弄?有时也会有同学把对外服务和消费队列放在一个进程内。咱们姑且不说此种用法合理与否,因为各个公司的业务场景和开发模式的差异,我们就只来看看此类问题怎么解比较优雅。问题举例......
  • Go每日一库之141:go-bindata(嵌入静态文件)
    使用Go开发应用的时候,有时会遇到需要读取静态资源的情况。比如开发Web应用,程序需要加载模板文件生成输出的HTML。在程序部署的时候,除了发布应用可执行文件外,还需要发布依赖的静态资源文件。这给发布过程添加了一些麻烦。既然发布单独一个可执行文件是非常简单的操作,就有人会......
  • Go每日一库之140:Zinc(轻量级搜索引擎)
    ‍项目介绍Zinc是一个轻量级替代Elasticsearch的开源搜索引擎。Elasticsearch真的好用,但是Elasticsearch安装和配置也是真的繁琐,后续的一些维护也有一定成本。另外一个Elasticsearch的不足就是服务运行起来需要的计算资源较多,对于普通的用户来说是有点浪费的。Zinc,拥有......
  • Go每日一库之139:cmux (连接多路复用)
    如果一个应用需要同时对外提供HTTP和gRPC服务,通常情况下我们会为两个服务绑定不同的监听端口,而本文要介绍的cmux为我们提供了一种连接多路复用的新选择,使用cmux可以将不同服务绑定在同一个网络端口上!简介多路复用是个很常见的概念,我们在编写HTTP服务时通常会用http.S......
  • Go每日一库之138:dive(Docker 镜像分析)
    什么是dive?用于探索Docker镜像、每一层中的内容以及发现缩小Docker/OCI镜像大小的方法的工具。安装divego get github.com/wagoodman/divedive特性按层分解Docker镜像可视化展示每一层变化分析镜像空间使用百分比快速构建分析镜像支持多种镜像源和容器引擎......
  • Go每日一库之137:easeprobe(探活工具)
    服务探活在现实场景中应用广泛,比如:服务发现、服务负载均衡、服务调度、服务状态监控等。然而,“探活”往往是作为一个功能模块或者组件集成在各个平台系统中。本次要介绍的easeprobe是一款轻量级的,可独立运行的探活工具,利用easeprobe,无需其他系统支持,就可以对多种类型的服务/中间件......