undefined

tencentcloud_cloudmonitor_agent 配置 prometheus 插件的 template 介绍

一、prometheus 数据格式

我们有这样的 prometheus 的数据如下(以下是伪代码):

1
2
3
4
5
6
7
8
prometheusCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "TXHJ",
Name: "SRMP_OrderDataServer_api_pre_costTime_total",
},
[]string{"cpu"},
)
prometheusCounter.With(prometheus.Labels{"cpu":"cpu0"}).Add(float64(10))

如上,我们有一个 counter 类型的一个监控指标。其中,namespace:TXHJ。measurement ( metric_name ):SRMP_OrderDataServer_api_pre_costTime_total。dimension ( tags ):[]string{“cpu”} 。
由于使用 prometheus pull 方式,我们在本机使用 curl 127.0.0.1:8080/metrics 得到下面的prometheus 监控数据。

1
2
3
# HELP TXHJ_SRMP_OrderDataServer_api_pre_costTime_total 
# TYPE TXHJ_SRMP_OrderDataServer_api_pre_costTime_total counter
TXHJ_SRMP_OrderDataServer_api_pre_costTime_total{cpu="cpu0"} 10

查看更多

undefined

1. hdfs 和 hbase 的区别

Hbase,其实是Hadoop Database的简称,本质上来说就是Hadoop系统的数据库,为Hadoop框架当中的结构化数据提供存储服务,是面向列的分布式数据库。 这一点与HDFS是不一样的,HDFS是分布式文件系统,管理的是存放在多个硬盘上的数据文件,而Hbase管理的是类似于key—value映射的表

https://www.bookstack.cn/read/prometheus-book/ha-scale-prometheus-with-federation.md?wd=job

prometheus 配置详解:https://yasongxu.gitbook.io/container-monitor/yi-.-kai-yuan-fang-an/di-2-zhang-prometheus/prometheus-de-pei-zhi-yu-fu-wu-fa-xian

federate

go语言defer关键字浅析

Go语言 defer 关键字浅析

Go 语言中 defer 是比较常用的关键字,为了使用好他,我站在底层简单的剖析一下。

一、使用现象

1. defer 的执行时机

Go 官方对于 defer 的解释

1
A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement, reached the end of its function body, or because the corresponding goroutine is panicking.

查看更多

一致性哈希

一致性哈希

https://segmentfault.com/a/1190000021199728
https://blog.csdn.net/suifeng629/article/details/81567777

一、传统哈希的问题

1. 节点减少的场景

在分布式多节点系统中,出现故障很常见。任何节点都可能在没有任何事先通知的情况下挂掉。

传统的哈希,当节点减少会导致键与节点的映射关系发生变化,这个变化对新的键来说并不会产生任何影响,但对于已有的键,将导致节点映射错误

2. 节点增加的场景

在分布式多节点系统中,需要对服务节点进行扩容,以应对突发流量。同样的,传统哈希,当节点增加会导致已有的键,映射节点错误。

3. 问题

对于分布式缓存这种系统而言,映射规则失效就意味着之前缓存的失效,若同一时刻出现大量的缓存失效,则可能出现“缓存雪崩”,这将导致灾难性的后果。

查看更多

MVC框架

MVC

1. 传统的三层架构,包含这样三层:

  • 控制器(Controller),恰如其名,主要负责请求的处理、校验和转发。
  • 视图(View),将内容数据以界面的方式呈现给用户,也捕获和响应用户的操作。
  • 模型(Model),数据和业务逻辑真正的集散地。

查看更多

go语言正确的获取连接的文件描述符

go语言正确的获取连接的文件描述符

一、遇到的场景

工作时写一个 web 服务的时候,底层使用 udp 传输协议,需要对 udp 的 socket recv buffer 进行获取和调整。用 go 语言实现,于是有了类似下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
func serve(addr string)  {
address, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
fmt.Printf("resolve udp service address: %v failed, error: %v", addr, err.Error())
return
}
udpConn, err := net.ListenUDP("udp", address)
if err != nil {
fmt.Printf("listen udp address: %v failed, error: %v", address.String(), err.Error())
return
}
// 获取文件描述符
fd, err := udpConn.File()
if err != nil {
fmt.Printf("get udp conn file err: %v \n", err)
return
}
defer fd.Close()
oriUdpSocketBufferSize, err := syscall.GetsockoptInt(int(fd.Fd()), syscall.SOL_SOCKET, unix.SO_RCVBUF)
fmt.Printf("get opt int fd recv buf size: %v \n", oriUdpSocketBufferSize)

fmt.Printf("udp server create success \n")

go func() {
buf := make([]byte, 1024)
for {
n, caddr, err := udpConn.ReadFrom(buf)
if err != nil {
fmt.Println("read failed", err)
continue
}
fmt.Println(addr, caddr, string(buf[:n]))
}
}()

time.Sleep(2*time.Second)

go func() {
err := udpConn.Close()
if err != nil {
fmt.Printf("udp conn close err: %v \n", err)
return
}
_, err = net.ListenUDP("udp", address)
if err != nil {
fmt.Printf("listen udp address: %v failed, error: %v \n", address.String(), err.Error())
}
fmt.Printf("repeat listen udp success")
}()
}

func main() {
go serve("127.0.0.1:1234")
select {}
}

以上代码是随手写的一个案例,目的想要实现一个 udp server 的重启。但是是有问题的,比如:在调用 udpConn.Close 的时候会阻塞,导致重启失败

这个问题让我花费了一点时间去看源代码才明白,因此记录下来

查看更多

查看二进制/动态库文件依赖的库

objdump

1
2
3
4
objdump -x xxx.so | grep NEEDED
objdump -x ./test | grep NEEDED
可以查看依赖的动态库
objdump -x 选项是展示一个文件的所有headers,可以通过grep NEEDED来获得依赖

readelf

1
2
3
4
5
6
7
8
readelf -a xxx.so/xxx | grep NEEDED 
readelf -a xxx.so/xxx | grep Shared

readelf -d xxx.so/xxx
可以查看程序或者动态库所依赖的动态库

readelf -d xxx.a
可以查看到静态库是有哪些 .o 文件组成的

ldd 命令

1
2
ldd xxx.so/xxx
查看程序或者动态库所依赖的动态库

查看更多