自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qq_35753140的博客

疯琴的学习记录

  • 博客(114)
  • 收藏
  • 关注

原创 Prometheus源码学习(11)-common_model

prometheus/common 库源码学习

2022-07-17 16:19:27 610 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 510

原创 Kubernetes 集群DNS选择:CoreDNS vs Kube-DNS

在二进制部署 Kubernetes 集群时,最后一步是部署 DNS,有两个选项:CoreDNS 和 Kube-DNS,二者主要有什么区别,如何选择呢?CoreDNS 和 Kube-DNS 作为 Kubernetes 集群的 DNS 服务提供者,在做用和完成的工作上是完全相同的。二者在实现上有一些不同,这导致了在资源消耗和性能上的差异。主要有:CoreDNS 每个实例只有一个容器,而 Kube-DNS 有三个Kube-DNS 使用 dnsmasq 进行缓存,这是一个 C 线程。Core-DNS 使用

2021-07-17 08:26:25 1450

原创 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 728

原创 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 724

原创 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 1317

原创 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 692

原创 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 482 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 1165

原创 Prometheus源码学习(5) notifier

文章目录notifier 模块Alert 结构体Manager 结构体Manager.Run()Manager.sendAll()习得notifier 模块按照 main.go 的顺序逐个捋一下每个模块的细节。notifier 模块是用于向 Alertmanager 发送告警通知的。主要的结构体包括:AlertManagerOptionsalertMetricsalertmanagerLabelsalertmanagerSetAlert 结构体字段都是 Alertmanager

2021-04-21 20:22:55 398

原创 第一次开源项目代码贡献 - prometheus-nginxlog-exporter

2021年2月26日,我的第一次开源项目代码贡献被合并了。这完成了我一个宿愿。几年前老罗向 OpenSSL 捐献手机发布会门票款,我在上班的地铁上看到《隐形战友》这篇文章,有点激动,许下一个心愿:此生哪怕为开源项目贡献一行代码。后来在做模型开发的时候开始参与社区,翻译了一些 Flink 的文档,Flink 的大部分维护者是国人,主力是阿里。大项目要想参与代码贡献是比较难的,尤其是真正有意义的代码,做一做 lint 不能算。所以我先从翻译文档开始,在翻译的过程中可以比较细致的学习项目的功能,同时提高英语读

2021-02-28 16:10:04 914 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 215

原创 Prometheus 通过 nginx log 日志监控应用服务

选型通常后端应用都通过 api 接口暴露服务,通过 nginx log 监控服务有以下特点和优势满足应用监控的需求通过响应状态码识别错误距离用户侧更近,请求时延包含了 nginx 到后端的网络时延,更接近用户体验对后端程序完全无侵入可以通过 namespace 从一份日志中解析出各个服务指标应用监控使用 RED 指标,即request 请求频率error 错误数delay 请求时延监控方案使用 prometheus-nginx-exporter采集 nginx 的 acc

2021-02-02 21:05:29 3839

原创 网络设备日志监控告警部署方案

部署两个 logstash 高可用全部交换机配置日志发送给两个 logstashlogstash 分别从 514 和 5000 两个 udp 端口接收 H3C 和 Cisco 的日志logstash 使用不同的 grok 表达式解析两种交换机的日志,将日志级别作为告警阈值logstash 设置 @timestamp 字段为当前时区的时间,作为日志采集时间logstash 通过 fingerprint 设置两台高可用的去重标识,供 es 进行去重处理logstash 将数据发送给 es开发应..

2021-02-02 11:21:36 939

原创 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 810

原创 Prometheus 监控 windows process 进程存活

安装 windows-exportermsiexec /i "D:\monitor\windoes_exporter.msi" ENABELD_COLLECTORS="os,cpu,cs.logical_disk,net,system,process" LISTEN_PORT="19182" EXTRA_FLAGS="--collector.process.whitelist=abc|windows_exporter"rule 配置up{job="windows",ip="10.0.0.1"} *

2021-01-27 10:22:22 2984 3

原创 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 303

原创 Prometheus源码学习(2) 服务发现

Prometheus 每个被控目标暴露一个 endpoint 供 server 抓取,要获知这些 endpoint 有多种方式,最简单的是在配置文件里静态配置,还有基于 k8s、consul、dns 等多种方式,基于文件的服务发现是比较灵活普遍的一种方式。当监控目标量比较大,变化的频率和量也比较大的时候,用 file SD 比较合适,我尝试过 consul,因为每次更新都要删除全量数据重新填充,所以不太适用这个场景。下文以 file SD 为例研究服务发现。概要介绍(from README.md)SD

2021-01-22 20:00:16 755

原创 Prometheus 基于 snmp 监控网络设备注意事项

使用ifHCOUTOctets 而不是 ifOUTOctets,前者是64位的counter,后者是32位的snmp-exporter 的配置文件中,抓什么指标就 walk 什么 oid,最小化 walk 提高效率告警指标通常使用端口占用率而不是端口流量绝对值,ifSpeed 的值 GB口是 1000,也就是10进制,单位是兆比特,例如rate(ifHCOUTOctets{job='snmp',ifOperStatus='1'}[2m]) * 8 / (ifSpeed{ifOperStatus=".

2021-01-22 17:29:00 2659

原创 Prometheus 监控进程的内存使用率 PromQL 多对一向量匹配

使用 process-exporter 监控进程,node-expoert 监控节点获取每个进程的内存使用量的表达式为 node_process_namegroup_memory_bytes{job="process",ip="10.1.1.1",memtype="resident"}获取节点总内存量的表达式为 node_memory_MemTotal_bytes{job="node",ip="10.1.1.1"}如果想计算每个进程的内存使用率,简单地将二者相除是得不到结果的,正确的计算表达式为

2021-01-21 17:13:04 6103

原创 更新 Prometheus 配置文件的正确姿势

Prometheus 有几种配置文件,每种可能有多个具体的文件。这些配置文件可能包括:配置文件如 prometheus.yml告警规则文件如 rule.yml服务发现用的监控目标文件如 targets.jsonnode-exporter 的 textfile这些文件有些可能会手工修改,然后手工触发 reload,有些可能会由 sidecar 程序监控变更并reload,如 thanos-sidecar,有些可能由自定义的程序进行修改如自己写的 go 程序定期更新目标文件。以监控目标文件为例

2021-01-21 15:08:43 1899 2

原创 Grafana table 表格配置方法

使用 table panel 展示文件系统的使用率,这个指标只关心当前值。在 Query tab 设置 Format 为 Table,勾选 InstantPanel tab 的 Visualization 选择 TableTransform tab 隐藏不显示的列Field tab 设置 Cell display mode 和 Unit修改列名...

2021-01-21 14:34:35 26937 30

原创 Prometheus源码学习(1) 编译源码

代码里面看不明白的变量或者函数可以通过两种方式观测它的值来了解其含义一种是把代码片段摘出来,写到一个测试程序里运行一下另一种时日志里打印它的值来观察第一种比较简单易行,但是代码片段要比较独立才好做,第二种要修改源码重新编译,可以在整个源码上下文中观测,但是需要编码源码,相对麻烦一些,研究源码早晚也要编译,所以先总结一下编译 Prometheus 源码的步骤。编译 Prometheus 源码需要 node.js 和 yarn。我是在 WSL2 上编译的。安装 node.js$ curl -

2021-01-19 21:32:51 848

原创 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 235

原创 时间复杂度更低程序执行却更慢?

昨天做一道算法题,发现时间复杂度更低的算法程序执行却更慢。在分析的过程中我对于程序和算法的性能有了更加深入的理解。下文仅限于Go语言实现,提交是在英文 leetcode 网站,与中文网站结果不同,不知道测算的方式有没有差别。leetcode 239题 - 数据的滑动窗口最大值我只想到了暴力解法,每次滑动丢弃和新加入值以后判断窗口内的最大值,时间复杂度是O((n-k+1)*k)。官方推荐使用双端队列来实现线性时间复杂度,我在 小浩算法 看到他用暴力解法的结果性能不好。然而我用双端队列AC以后看最快的答案

2020-08-16 11:08:32 775

原创 Prometheus节点失联后CPU使用率不准确

现象测试节点失联自恢的程序时发现一个异常现象,失联的节点cpu使用率超过60%,实际上测试节点什么程序都没跑,cpu使用率接近0。原因该节点每分钟刮取一次监控数据,5分钟取得5个数据点,计算CPU使用率使用的公式是5分钟均值:1 - (rate(node_cpu_seconds_total{mode="idle",instance="192.168.1.1"}[5m]))节点从失联到自恢用了3-4分钟,这样5分钟之内每分钟少一个数据,除法的分母减1,得到的商就会变大,将5m改成2m就正常了。

2020-07-31 16:11:54 771

原创 部署 etcd 3 节点集群

1. 准备csr文件etcd-csr.json{ "CN": "etcd", "hosts": [ "127.0.0.1", "192.168.220.121", "192.168.220.122", "192.168.220.123" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "CN": "CN", "ST": "BeiJing"

2020-06-14 16:45:55 871

原创 kubernetes kubectl 签名TLS证书

kubernetes 集群可以为证书签名,用于集群内部的TLS通信,ca就是集群的ca,每个pod里面serviceaccount的secret都带着。1. 创建证书签名请求-csr$ cat <<EOF | ./cfssl genkey - | ./cfssljson -bare server{ "hosts": [ "nginx.default.svc.cluster.local" ], "CN": "nginx.default.svc.cluster.local"

2020-06-04 17:03:00 1000

原创 kubernetes 部署 https 服务器

创建ca证书签名请求文件ca-cst.json{ "CN": "www.abc.com", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "yngwie", "OU": "ops" } ]}生成ca证书和私钥../cfs.

2020-05-18 21:52:37 514

翻译 Kubernetes 污点和容忍

Node affinity: pod 亲和节点Taints: 节点驱逐pod一个node可以设置多个污点,不容忍污点的pod不能调度到这个节点,容忍度设置给pod,这样的pod允许但不是必须调度到有这些污点的node。概念添加污点kubectl taint nodes <node-name> key=value:NoSchedule删除污点kubectl taint...

2020-05-06 20:59:03 1290

原创 Kubernetes Pod 关闭流程

翻译自官方文档用户发送delete pod命令,grace period 参数即宽限期(假设为30秒)API Server 更新 pod 的宽限期字段执行pod get 命令显示pod状态变为Terminating与3同时,kubelet看到pod被标识了deleteTimestamp也就是标识为Terminating,它开始执行关闭pod流程:如果pod中的一个容器定义了 preS...

2020-05-06 10:23:26 4260

翻译 Kubernetes API 的访问控制

翻译自官方文档用户使用 kubectl 或 REST 请求访问 API、客户端库。人类用户和service account 二者可以授权访问 API。当请求到达API,它经过若干步骤。传输安全典型的 Kubernetes 集群中,API Server 位于6443端口。API Server 出示证书。此证书通常是自签名的,所以用户机器上的$USER/.kube/config通常包含API ...

2020-05-05 12:30:57 806

原创 Prometheus 拉取模式的扩展性

首先,官方文档的 FAQ 是这么解释为何使用拉取(pull)而不是推送(push)模式:可以在笔记本上监控开发时产生的变更如果监控目标宕了可以更容易发现可以通过web浏览器手工访问监控目标并检查其健康状况总之我们认为拉取比推送好一点点,但是这并不一个监控系统需要考虑的重点。下文是一篇 Prometheus 官方博客的阅读笔记。有些人认为拉取模式是无法扩展的,然而这和我们的实践经...

2020-05-02 08:26:00 2087

原创 使用Linux 网桥手工搭建docker容器网络

运行容器,在busybox里添加静态路由要求有真正的root权限,所以要加--privileged=true$ docker run --rm --name box1 -d --net none --privileged=true busybox sleep 9999$ docker run --rm --name box2 -d --net none --privileged=tru...

2020-04-19 20:07:44 410

原创 《HTTP 权威指南》读书笔记:第四章-连接管理

文章目录1. TCP 连接2. TCP性能HTTP事务时延:1. TCP握手:2. 延迟确认3. TCP 慢启动3. HTTP 连接的处理串行事务处理时延4. 并行连接5. 持久连接http/1.0+keep alive限制http/1.1 持久连接限制6. 管道化连接队头阻塞7. 关闭连接1. TCP 连接四元组:源IP、源端口、目的IP、目的端口浏览器与web服务器交互流程:浏览器...

2020-04-11 19:44:03 161

翻译 Pod 生命周期

翻译官方文档文章目录Pod 阶段Pod 状态(conditions)容器探针pod和容器 status容器 statespod就绪gate重启策略pod 生命周期Pod 阶段Pending 下载镜像Running 全部pod已经绑定节点,全部镜像已经创建。至少一个容器正在运行或者正在启动/重启Succedded 全部容器成功终止,不会重启Failed 所有容器都终止了,至少一个容器因...

2020-04-10 10:36:55 474

原创 Prometheus 查询语言 PromQL 的 CPU 使用率计算方法

CPU 使用率的计算方法翻了几篇 Prometheus 的 PromQL 查询 cpu 使用率的文章,说得都不是特别透,结合一篇英文文章终于搞明白了怎么计算这个指标。cpu 模式一颗 cpu 要通过分时复用的方式运行于不同的模式中,可以类比为让不同的人使用 cpu,张三使一会儿,李四使一会儿。这些模式可以用 top 命令查看,包括:us:用户进程使用cpu的时间sy:内核进程使用cpu...

2020-03-26 16:21:13 19594 6

原创 Go 使用普通锁实现读写锁

比较粗糙简单,思路就是用一个mutex作为资源锁,用两个整数记录读者数和写者数,用一个内部锁保护这个两个整数和mutex,读写操作互斥,写写操作互斥,读读操作不互斥。type RWMutex struct { mu sync.Mutex // 锁定资源的锁 lock sync.Mutex // 保护读者数和写者数的锁 reader int writer int}func ...

2020-03-13 20:02:38 299

原创 Go 源码学习 - sync.atomic 库

这个包里的主要功能应该都是底层实现的,不是go写的,先看一下说明文档。原子包提供了实用的底层原子内存原语用以实现同步算法。这些函数需要非常小心才能正确使用。除底层应用这一特殊情况以外,同步最好使用通道或者 sync 包里的其他工具实现。通过通信来共享内存;不要通过共享内存来通信。SwapT 函数实现的交换操作,原子等价于:old = *addr*addr = newreturn old...

2020-03-12 12:24:01 142

原创 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 719

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除