
go
文章平均质量分 63
疯琴
这个作者很懒,什么都没留下…
展开
-
Prometheus源码学习(11)-common_model
prometheus/common 库源码学习原创 2022-07-17 16:19:27 · 911 阅读 · 1 评论 -
Golang 设置操作超时的一种方法
读 etcd 源码看到一种超时的设置方法,控制一个循环的总时长,每轮迭代检查一下是否超时,适用于对超时时间要求不是非常精细,并且操作不会阻塞的场景func main() { ctx, cancel := context.WithTimeout(context.Background(), 6*time.Second) defer cancel() for i := 0; i < 10; i++ { select { case <-ctx.Done(): fmt.Printl原创 2021-09-18 09:48:39 · 684 阅读 · 0 评论 -
Golang channel 注意事项
channel 是引用类型,仅仅 var 声明而没有 make 初始化的 channel 值是nil,channel 值可以用 == 比较,可以判断 == nil。读、写 nil 的 channel 都会阻塞,可以通过将 channel 置为 nil 来屏蔽 select 中的某个 channel。关闭 nil 或 已关闭的 channel 会 pannic。已关闭的 channel 仍然可以取出值,取出的是 channel 元素类型的零值。取出 channel 中的元素的操作可以赋值给两个变量,第.原创 2021-05-29 08:33:22 · 896 阅读 · 0 评论 -
Prometheus源码学习(9) scrape-target
主要作用scrape.Target 是一次抓取的具体对象,包含了抓取和抓取后存储所需要的全部信息。从 targetGroup.Group 到 scrape.Target 的转换过程如下:targetsFromGroup函数遍历每个targetGroup.Group中的Target,合并targetGroup.Group的公共标签集(记为A)和这个Target本身的标签集(记为B)为标签集C。populateLabels函数从C和*config.ScrapeConfig中创建Target。以下是具原创 2021-05-23 21:33:52 · 943 阅读 · 0 评论 -
Prometheus源码学习(8) scrape总体流程
1. main 函数中初始化 scrapeManager 实例// 初始化 scrapeManager,fanout Storage 是一个读写多个底层存储的代理scrapeManager = scrape.NewManager(log.With(logger, "component", "scrape manager"), fanoutStorage)fanoutStorage 是读写多个底层存储的代理,实现了 storage.Appendable 接口。scrape.Manager 结构体.原创 2021-05-22 08:39:03 · 1533 阅读 · 0 评论 -
goroutine生命周期管理-errgroup和run
Go 语言有提供了多个包来将多个 goroutine 的生命周期编组管理。最简单的是标准库的 sync .WaitGroup,应用比较普遍的是 google 的 errgroup,Prometheus 用的是 oklog 的 run。下面学习后两个包的用法。errgrouperrgroup 为作为一个任务中的多个子任务的多组 goroutine 提供了同步、错误传播和取消上下文。Package errgroup provides synchronization, error propagation,原创 2021-05-20 09:45:23 · 842 阅读 · 0 评论 -
Prometheus源码学习(7) targetgroup
targroup 是抓取目标// Group is a set of targets with a common label set(production , test, staging etc.).// Group 是一组目标的集合,这组目标有一个共同的标签集。type Group struct { // Targets is a list of targets identified by a label set. Each target is // uniquely identifiable原创 2021-05-01 08:43:45 · 581 阅读 · 2 评论 -
Prometheus源码学习(6) labels
github.com/prometheus/prometheus/pkg/labels时间序列由一组 Label 唯一标识。labels包中是对 Label 和 Labels 对象的定义和方法。还有一个构建 Labels 的 Builder 对象。一个标签(Label)就是一个字符串键值对// Label is a key/value pair of strings.type Label struct { Name, Value stringLabels 是 Label 的有序列表,实现了 s原创 2021-04-22 20:09:26 · 1402 阅读 · 0 评论 -
Prometheus源码学习(5) notifier
文章目录notifier 模块Alert 结构体Manager 结构体Manager.Run()Manager.sendAll()习得notifier 模块按照 main.go 的顺序逐个捋一下每个模块的细节。notifier 模块是用于向 Alertmanager 发送告警通知的。主要的结构体包括:AlertManagerOptionsalertMetricsalertmanagerLabelsalertmanagerSetAlert 结构体字段都是 Alertmanager原创 2021-04-21 20:22:55 · 579 阅读 · 0 评论 -
第一次开源项目代码贡献 - prometheus-nginxlog-exporter
2021年2月26日,我的第一次开源项目代码贡献被合并了。这完成了我一个宿愿。几年前老罗向 OpenSSL 捐献手机发布会门票款,我在上班的地铁上看到《隐形战友》这篇文章,有点激动,许下一个心愿:此生哪怕为开源项目贡献一行代码。后来在做模型开发的时候开始参与社区,翻译了一些 Flink 的文档,Flink 的大部分维护者是国人,主力是阿里。大项目要想参与代码贡献是比较难的,尤其是真正有意义的代码,做一做 lint 不能算。所以我先从翻译文档开始,在翻译的过程中可以比较细致的学习项目的功能,同时提高英语读原创 2021-02-28 16:10:04 · 1111 阅读 · 9 评论 -
Prometheus源码学习(4) 通过2.24对实例化Discoverer代码的改进学习依赖倒置
前面读的是 2.19.2 版本的代码,最新更新了 2.24.1,发现在实例化 Discoverer 时改进了设计。这个改变是在 2.21 做出的。2.19.2 中的实现方式在 discovery.Manager 结构体中包含了一个 *provider 的 slicetype Manager struct { ... // providers keeps track of SD providers. providers []*provider ...}provider 接口提包原创 2021-02-08 21:35:35 · 283 阅读 · 0 评论 -
Prometheus源码学习(3) main程序启动
主要工作流程设置命令行参数及其默认值和描述信息解析启动命令的命令行参数为 cfg 实例校验配置文件(–config.file 设置),默认是 prometheus.yml打印 “Starting Prometheus” 和主机系统信息日志初始化子任务对象并发启动各个子任务在单独的 goroutine 中执行的子任务接收 kill/web 终止信号,退出程序启动Scrape Discovery manager启动 Notify Discovery manager启动 Scrape原创 2021-02-01 20:49:28 · 924 阅读 · 0 评论 -
Go 中 nil 的作用
总结自 GopherCon 2016: Francesc Campoy - Understanding nilnil pointer可以调用 nil 接收者的方法nil slice完美的零值nil map合法的空指,可以被 for range,用于只读的 mapnil channel停止 select casepackage demo_channelimport ( "fmt" "testing" "time")func produceA(a chan<- int)原创 2021-01-24 21:54:59 · 351 阅读 · 0 评论 -
Prometheus源码学习(2) 服务发现
Prometheus 每个被控目标暴露一个 endpoint 供 server 抓取,要获知这些 endpoint 有多种方式,最简单的是在配置文件里静态配置,还有基于 k8s、consul、dns 等多种方式,基于文件的服务发现是比较灵活普遍的一种方式。当监控目标量比较大,变化的频率和量也比较大的时候,用 file SD 比较合适,我尝试过 consul,因为每次更新都要删除全量数据重新填充,所以不太适用这个场景。下文以 file SD 为例研究服务发现。概要介绍(from README.md)SD原创 2021-01-22 20:00:16 · 900 阅读 · 0 评论 -
Prometheus源码学习(1) 编译源码
代码里面看不明白的变量或者函数可以通过两种方式观测它的值来了解其含义一种是把代码片段摘出来,写到一个测试程序里运行一下另一种时日志里打印它的值来观察第一种比较简单易行,但是代码片段要比较独立才好做,第二种要修改源码重新编译,可以在整个源码上下文中观测,但是需要编码源码,相对麻烦一些,研究源码早晚也要编译,所以先总结一下编译 Prometheus 源码的步骤。编译 Prometheus 源码需要 node.js 和 yarn。我是在 WSL2 上编译的。安装 node.js$ curl -原创 2021-01-19 21:32:51 · 999 阅读 · 0 评论 -
Prometheus源码学习(0) 总览
架构和工作流程Prometheus server 的核心功能模块是 HTTP server、TSDB 、服务发现和指标抓取整个工作流程大概是这样的:通过 Service discovery 知道要抓取什么指标抓取指标数据存入 TSDB客户通过 HTTP server 使用 PromQL 查询结果目录Prometheus源码学习(0) 概览Prometheus源码学习(1) 编译源码Prometheus源码学习(3) 服务发现...原创 2021-01-19 21:31:41 · 292 阅读 · 0 评论 -
时间复杂度更低程序执行却更慢?
昨天做一道算法题,发现时间复杂度更低的算法程序执行却更慢。在分析的过程中我对于程序和算法的性能有了更加深入的理解。下文仅限于Go语言实现,提交是在英文 leetcode 网站,与中文网站结果不同,不知道测算的方式有没有差别。leetcode 239题 - 数据的滑动窗口最大值我只想到了暴力解法,每次滑动丢弃和新加入值以后判断窗口内的最大值,时间复杂度是O((n-k+1)*k)。官方推荐使用双端队列来实现线性时间复杂度,我在 小浩算法 看到他用暴力解法的结果性能不好。然而我用双端队列AC以后看最快的答案原创 2020-08-16 11:08:32 · 985 阅读 · 0 评论 -
Go 使用普通锁实现读写锁
比较粗糙简单,思路就是用一个mutex作为资源锁,用两个整数记录读者数和写者数,用一个内部锁保护这个两个整数和mutex,读写操作互斥,写写操作互斥,读读操作不互斥。type RWMutex struct { mu sync.Mutex // 锁定资源的锁 lock sync.Mutex // 保护读者数和写者数的锁 reader int writer int}func ...原创 2020-03-13 20:02:38 · 351 阅读 · 0 评论 -
Go 源码学习 - sync.atomic 库
这个包里的主要功能应该都是底层实现的,不是go写的,先看一下说明文档。原子包提供了实用的底层原子内存原语用以实现同步算法。这些函数需要非常小心才能正确使用。除底层应用这一特殊情况以外,同步最好使用通道或者 sync 包里的其他工具实现。通过通信来共享内存;不要通过共享内存来通信。SwapT 函数实现的交换操作,原子等价于:old = *addr*addr = newreturn old...原创 2020-03-12 12:24:01 · 195 阅读 · 0 评论 -
Go 源码学习 - http库:浅析一次 http 请求的处理过程
文章目录缘起web app 必要构件整体流程阅读源码1 http.ListenAndServe2 Server.ListenAndServe3 Server.Server4 *conn.Serve5. serverHandler.ServeHTTP6. ServeMux.ServeHTTP7 *ServeMux.handler总结缘起Go 的 web 编程非常简便。python 写 web a...原创 2020-03-10 22:22:08 · 818 阅读 · 0 评论 -
Go 库学习:Cobra
https://github.com/spf13/cobraKubernetes、Docker、etcd 等很多著名的项目使用 Cobra 构建其命令行接口。概述Cobra 库提供简单的接口来创建类似 git 和 go tools 的强大的现代命令行接口。主要功能:基于子命令的 CLI,如 app server、app fetch完全符合 POSIX 标准的参数标志(长短标志都支持)...原创 2020-03-01 21:07:21 · 389 阅读 · 1 评论 -
浅尝 grpc
项目目录demo_grpc/├── client│ └── main.go├── go.mod├── go.sum├── protos│ ├── helloworld.pb.go│ └── helloworld.proto└── server └── main.goprotos/helloworld.protosyntax = "proto3";pac...原创 2020-02-26 21:15:35 · 260 阅读 · 0 评论 -
认识 Protocol Buffers
定义developers.google.com 大概是这么定义的:一种用于通信协议、数据存储等用途,语言中立、平台中立的,可扩展的,对结构化数据进行序列化的方法。Protocol buffers 是一种灵活、高效的自动化的序列化结构化数据的机制——对比 XML,其更小、更快、更简单。一次性定义好数据的结构,然后就可以生成一种特定的源码,轻松地使用各种语言在向多种数据流写入或从多种数据流读取结构...原创 2020-02-25 21:27:04 · 329 阅读 · 0 评论 -
Go 源码学习 - log 库
log 包实现了一个简单的日志功能。Logger 结构体作为日志对象,生成文本行到 io.Writer。每次记录日志的操作都生成一行日志,即便是log.Printf也不用包含\n。结构体中有sync.Metex锁,保证了在多 goroutine 情况时的顺序写入。type Logger struct { mu sync.Mutex // 确保原子写入 prefix string ...原创 2020-02-11 09:55:40 · 173 阅读 · 0 评论 -
百倍速度的 Ansible -- Python 与 Go 的并发性能对比测试
题目有点标题党了:P测试目标用 Python 和 Go 的并发编程实现类似 Ansible 的 ping 命令,对比不同并发规模的执行效率。测试环境i7 7500 双核超线程的笔记本,win10系统。测试结果主机数AnsiblePython multiprocessingPython threadingPython geventGo goroutine10...原创 2019-11-26 15:56:47 · 1786 阅读 · 3 评论 -
792. Number of Matching Subsequences
最近开始同时使用python和go做题,go的效率高很多,用python brute force的方法提交以后TLE,同样的方法用go可以AC,用python可以榨取更快的算法。题目给定一个字符串S和一个单词列表words,找到words里所有S的子串。Example :Input:S = “abcde”words = [“a”, “bb”, “acd”, “ace”]Outpu...原创 2019-01-06 09:33:14 · 243 阅读 · 0 评论 -
python与go线程性能简单对比
昨天看到一篇关于python多线程公众号文章,做了简单的对比试验。用python和go做单线程1亿递减到1和两个线程各自从5千万减到1,看程序执行时间:python一个线程:def decrement(n): while n > 0: n -= 1from time import perf_counter as pcstart = pc()dec...原创 2018-05-04 18:11:51 · 3688 阅读 · 0 评论