Prometheus + Grafana 运行数据可视化
@2022-07-12 11:19:16
@sizaif
@涉及知识:
- docker 容器间通信
- docker compose 用法
- 数据编码格式
需求
原先效果如下:
将运行的执行数据可视化后
效果如下:
前提准备
-
采用docker的方式
grafana
statsd_exporter
prometheus -
宿主机为Windows环境
架构图如下:
说明:
- fuzz程序,grafana,statsd_exporter,prometheus 都在docker容器中,涉及到容器间通信
端口映射关系如下:
IMAGE | PORTS | NAMES |
---|---|---|
grafana/grafana | 0.0.0.0:3000->3000/tcp | grafana |
prom/statsd-exporter | 0.0.0.0:9102->9102/tcp, 9125/tcp, 0.0.0.0:8125->9125/udp | statsd_exporter |
prom/prometheus | 0.0.0.0:9090->9090/tcp | prometheus |
采用docker compose
创建一个以桥接方式的statsd-net
网络,
此时docker compose
内的容器可通过容器name+port
进行通信
例如:promethes
获取statsd-exporter
中的数据
只需用get获取http://statsd-exporter:9102
即可获取
statsd-net
网络中的某个容器的ip段如下: 172.18.0.2-172.18.0.4
"Networks": {
"docker-compose_statsd-net": {
·····
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
·····
}
}
此时若statsd-net
网络外的容器想与网络内的容器进行通信只需将其加入到statsd-net
网络即可[1]
[1] 此处参考: https://zhuanlan.zhihu.com/p/429276977
执行: docker network connect statsd-net <container ID>
执行后
"Networks": {
"bridge": {
·····
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
·····
},
"docker-compose_statsd-net": {
·····
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.5",
·····
}
}
}
此时所有容器可相互通信
步骤
docker 部分
-
创建
docker-compose.yml
文件,内容如下version: '3' networks: statsd-net: driver: bridge services: prometheus: image: prom/prometheus container_name: prometheus volumes: - ./prometheus.yml:/prometheus.yml command: - '--config.file=/prometheus.yml' restart: unless-stopped ports: - "9090:9090" networks: - statsd-net statsd_exporter: image: prom/statsd-exporter container_name: statsd_exporter volumes: - ./statsd_mapping.yml:/statsd_mapping.yml command: - "--statsd.mapping-config=/statsd_mapping.yml" ports: - "9102:9102/tcp" - "8125:9125/udp" networks: - statsd-net grafana: image: grafana/grafana container_name: grafana restart: unless-stopped ports: - "3000:3000" networks: - statsd-net
-
创建
prometheus.yml
文件,内容如下global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'fuzzing_metrics' static_configs: - targets: ['statsd_exporter:9102']
-
Create a
statsd_mapping.yml
containing the following:mappings: - match: "fuzzing.*" name: "fuzzing" labels: type: "$1"
-
目录如下:
执行
docker compose up -d
命令
后台管理
-
登录
prometheus
后, (localhost:9090
)targets 中状态为up
-
登录
Grafana
后台 (localhost:3000
) user:admin , pwd: admin**设置数据源** URL为: `http://Prometheus:9090` ![image-20220712120444022](https://s2.loli.net/2022/07/12/T4JcEnZyQmo6qXH.png)
数据发送StatSD
-
编写
发送.cpp
使用socket通信, port为:8125 (此处端口为statsd_exporter映射的udp接收端端口)
host为:
statsd-exporter
, docker会自动进行ip转换StatSD数据格式:
参考:
https://registry.hub.docker.com/r/prom/statsd-exporter
https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/?tabs=metrics
DogStatsD:
metric.name:<value>|<type>|#key:value,key2:value2
InfluxDB
metric.name,key=value,key2=value2:<value>|<type>
Librato
metric.name#key=value,key2=value2:<value>|<type>
SignalFX
metric.name[key=value,key2=value2]:<value>|<type>