- 在VisualStudio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)
- Android开机流程介绍
- STM32CubeMX教程31USB_DEVICE-HID外设_模拟键盘或鼠标
- 深入浅出Java多线程(五):线程间通信
前段时间无意间看到一篇公众号 招贤令:一起来搞一个新开源项目,作者介绍他想要做一个开源项目:cprobe 用于整合目前市面上散落在各地的 Exporter,统一进行管理.
比如我们常用的 blackbox_exporter/mysqld_exporter 等.
以往的每一个 Exporter 都需要单独部署运维.
同时又完全兼容 Prometheus 生态,也可以复用现有的监控面板.
恰好这段时间我也在公司从事可观测性相关的业务,发现这确实是一个痛点.
于是便一直在关注这个项目,同时也做了些贡献;因为该项目的核心是用于整合 exporter,所以为其编写插件也是非常重要的贡献了.
整个项目执行流程图如下:
可以看到编写插件最核心的便是自定义插件解析自定义的配置文件、抓取指标的逻辑.
比如我们需要在配置中指定抓取目标的域名、抓取规则等.
这里 cprobe 已经抽象出了两个接口,我们只需要做对应的实现即可.
type Plugin interface {
// ParseConfig is used to parse config
ParseConfig(baseDir string, bs []byte) (any, error)
// Scrape is used to scrape metrics, cfg need to be cast specific cfg
Scrape(ctx context.Context, target string, cfg any, ss *types.Samples) error
}
下面就以我之前编写的 Consul 为例.
# Allows any Consul server (non-leader) to service a read.
allow_stale = true
# === CA
# File path to a PEM-encoded certificate authority used to validate the authenticity of a server certificate.
ca_file = "/etc/consul.d/consul-agent-ca.pem"
# File path to a PEM-encoded certificate used with the private key to verify the exporter's authenticity.
cert_file = "/etc/consul.d/consul-agent.pem"
# Generate a health summary for each service instance. Needs n+1 queries to collect all information.
health_summary = true
# File path to a PEM-encoded private key used with the certificate to verify the exporter's authenticity
key_file = "/etc/consul.d/consul-agent-key.pem"
# Disable TLS host verification.
insecure = false
这里每个插件的配置都不相同,所以我们需要将配置解析到具体的结构体中.
func (*Consul) ParseConfig(baseDir string, bs []byte) (any, error) {
var c Config
err := toml.Unmarshal(bs, &c)
if err != nil {
return nil, err
}
if c.Timeout == 0 {
c.Timeout = time.Millisecond * 500
}
return &c, nil
}
解析配置文件没啥好说的,根据自己的逻辑实现即可,可能会配置一些默认值而已.
下面是核心的抓取逻辑,本质上就是使用对应插件的 Client 获取一些核心指标封装为 Prometheus 的 Metric,然后由 cprobe 写入到远端的 Prometheus 中(或者是兼容 Prometheus 的数据库中).
// Create client
config.HttpClient.Timeout = opts.Timeout
config.HttpClient.Transport = transport
client, err := consul_api.NewClient(config)
if err != nil {
return nil, err
}
var requestLimitChan chan struct{}
if opts.RequestLimit > 0 {
requestLimitChan = make(chan struct{}, opts.RequestLimit)
}
所有的指标数据都是通过对应的客户端获取.
如果是迁移一个存在的 export 到 cprobe 中时,这些抓取代码我们都可以直接复制对应 repo 中的代码.
比如我就是参考的:https://github.com/prometheus/consul_exporter 。
除非我们是重新写一个插件,不然对于一些流行的库或者是中间件都已经有对应的 exporter 了.
具体的列表可以参考这里: https://prometheus.io/docs/instrumenting/exporters/ 。
之后便需要在对应的插件目录(./conf.d)创建我们的配置文件:
为了方便测试,可以在启动 cprobe 时添加 -no-writer 让指标打印在控制台,从而方便调试.
之前就有人问我有没有毕竟好上手的开源项目,这不就来了吗?
正好目前项目创建时间不长,代码和功能也比较简单,同时还有可观察系统大佬带队,确实是一个非常适合新手参与的开源项目.
项目地址:
https://github.com/cprobe/cprobe 。
最后夹带一点私货:前两天帮一个读者朋友做了一次付费的技术咨询(主要是关于 Pulsar 相关的),也是我第一次做付费内容,这种拿人钱财替人消灾难道就是知识付费的味道吗😂?
所以我就趁热打铁在朋友圈发了个广告,没想到又有个朋友找我做关于职场相关咨询,最后能帮助到对方自己也很开心.
其实经常也有人通过社媒、邮件等渠道找我帮忙看问题,一些简单的我通常也会抽时间回复.
但后面这位朋友也提到,如果我不是付费,他也不好意思来找我聊这些内容,毕竟涉及到一些隐私,同时也需要占用双方 1~2 小时的时间.
这样明码标价的方式确实也能更方便的沟通,同时也能减轻对方的心里负担,直接从白嫖转为付费大佬.
铺垫了这么多,主要目的是想进行一个小范围的尝试,如果对以下内容感兴趣的朋友欢迎加我微信私聊:
包括但不限于技术、职场、开源等我有经验的行业都可以聊.
反馈不错的话也需要可以作为我的长期副业做下去.
最后此篇关于手把手教你为开源项目贡献代码的文章就讲到这里了,如果你想了解更多关于手把手教你为开源项目贡献代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
去年(2023年)年底我初学flutter,看了一些文档和教程,想找个东西*练练手。 小时候看过一个关于历史名人儿时事迹的短片,有一集是讲*总理的,有一个细节我记得很清楚:幼年***经常要做一个游戏
今天给大家分享一个我做的小工具,可以自定义扩展右键菜单的功能来提高工作效率,效果图如下: image 如上图,右键菜单多了几个我自定义的菜单
书接上回,今天继续和大家享一些关于枚举操作相关的常用扩展方法。 今天主要分享通过枚举值转换成枚举、枚举名称以及枚举描述相关实现。 我们首先修改一下上一篇定义用来测试的正常枚举,新增一个枚举项,
今天和大家享一些关于枚举操作相关的常用扩展方法。 我们平时用的比较多的是正常枚举,同时还有加[Flags]特性的位标志枚举,因此以下所有扩展方法同时适用正常枚举以及位标志枚举。 我们首先定义两
书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天(周一)核心思想是一样的,只是把求周一改成
书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当天的开始时间 当天的开始时间指00:00:00时刻,因此只需要获取DateTime的Date属性只获取时间即可,具体代
书接上回,我们继续来分享一些关于时间转换的常用扩展方法。 01、时间转日期时间 TimeOnly 该方式是把TimeOnly类型转为DateTime类型,其中日期部分使用系统当前日期,时间部分
从事软件开发这么多年,平时也积累了一些方便自己快速开发的帮助类,一直在想着以什么方式分享出来,因此有了这个系列文章,后面我将以《开源-Ideal库》系列文章分享一些我认为比较成熟、比较方便、比较好的代
任何人都可以建议我应该使用什么程序/方法? 我需要有一个像谷歌地图这样的 map ,我可以在其中显示 map 、添加标记多边形等。 但是我不能依赖这样的在线服务,因为客户担心这样的服务会消失,我们的系
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 11年前关闭。 Improve this qu
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
您知道 EDA(电子设计自动化)领域有哪些开源项目正在寻找 C++ 程序员吗? 最佳答案 如果您经常关注 gEDA 的邮件列表,您也许能够加入 gEDA。详情:http://www.gpleda.or
如果现有Hadoop群集上有10个数据节点,则可以在4个或6个数据节点上安装NiFi吗? NiFi的主要目的是每天将数据从RDBMS加载到高容量的HDFS。 数据节点将配置为具有100 GB的高RAM
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
Closed. This question is off-topic。它当前不接受答案。
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
【Github源码】 《上一篇》 介绍了Xmtool工具库中的图形验证码类库,今天我们继续为大家介绍其中的扩展动态对象类库。 扩展动态对象是整个工具库中最重要的一个设计。
【Github源码】 《上一篇》 介绍了Xmtool工具库中的Web操作类库,今天我们继续为大家介绍其中的图形验证码类库。 图形验证码是为了抵御恶意攻击出现的一种设计;例如用
我是一名优秀的程序员,十分优秀!