作者 青鸟
在做java web课设的时候有一项要求为对系统监控,出于整活的目的,选择了使用prometheus来做系统监控。关于prometheus的相关知识就不再赘述,讲一些在部署采集器时候遇到的坑。由于mac无法配置cadvisor,于是这里就不做赘述cadvisor了。
prometheus与grafana#
1
2
3
| docker pull prom/prometheus
docker run --name=prometheus -p 9090:9090 prom/prometheus
|
1
2
3
4
5
6
| docker pull grafana/grafana
docker run --name=grafana \
-p 3000:3000 \
-v $PWD/grafana-storage:/var/lib/grafana \
grafana/grafana
|
这里给一些常见需要使用的命令
下面这条命令的主要作用是为了查看容器在docker网络中的ip地址,由于我们选择将prometheus部署在docker中,采集器也是在网络中,所以ip使用的应该是docker网络中的ip,而不是localhost
。
1
| docker inspect redis_exporter | grep IPAddress
|
下面这条命令是将普罗米修斯的配置文件拷贝到docker内部,prometheus.yml决定了配置哪些采集器
1
| docker cp $PWD/prometheus.yml prometheus:/etc/prometheus/prometheus.yml
|
一个prometheus.yml
配置如下所示
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
| scrape_configs:
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
- job_name: mac
static_configs:
- targets: ['192.168.0.1:9100'] #被监控端的IP地址和端口号(有多个被监控端可用逗号隔开)
labels:
instance: node_exporter
- job_name: mysql
static_configs:
- targets: ['172.17.0.4:9104']
labels:
instance: mysqld_exporter
- job_name: redis
static_configs:
- targets: ['172.17.0.5:9121']
labels:
instance: redis_exporter
- job_name: kafka
static_configs:
- targets: ['172.17.0.5:9308']
labels:
instance: kafka_exporter
- job_name: 'java'
static_configs:
- targets: ['192.168.0.1:8070']
labels:
instance: jvm_exporter
|
这里顺带也给出一些较好的grafana的dashboard的id
- cadvisor 11600
- mysqld_exporter 7362
- redis_exporte 17507
- node_exporter 1860
- kafka_exporter
node采集器#
一般的node采集器由于是直接从系统中采集数据,因此直接安装在系统中去采集是哥较优的选择,但是prometheus是部署在docker网络中,我们配置的yaml里假如使用本地地址127.0.0.1
去访问node-exporter,就会直接访问到容器。因此我们需要使用宿主机地址,本地地址可以在容器内部ping宿主机的域名。Docker for Mac有两个内置的域名host.docker.internal和gateway.docker.internal分别表示宿主机ip和网关ip。
1
2
| brew install node_exporter
brew services start node_exporter
|
mysql采集器#
这里的一个坑是版本问题,在现行的发行版中,应该使用my.cnf
来作为配置,挂载或复制到docker容器中,早期的环境变量配置到现版本中是不行的。
1
2
3
| docker pull prom/mysqld-exporter
docker run -d -p 9104:9104 --name mysqld-exporter -v /Users/crk/cs/prometheus/my.cnf:/.my.cnf prom/mysqld-exporter
|
1
2
3
4
5
| [client]
user=bluebird
password=123456
host=192.168.0.0
port=3306
|
redis采集器#
1
2
3
4
5
6
| docker pull oliver006/redis_exporter
docker run -d \
--name redis-exporter \
-p 9121:9121 \
oliver006/redis_exporter --redis.addr=redis://192.168.0.0:6379 --redis.password=""
|
kafka采集器#
1
2
3
| docker pull danielqsj/kafka-exporter
docker run --name=kafka-exporter -p 9308:9308 danielqsj/kafka-exporter --kafka.server=172.17.0.4:9092
|
JVM采集器#
需要使用jmx_exporter
来导出JMX(Java Management Extensions)数据。以下是配置步骤:
下载JMX Exporter,从GitHub releases页面下载最新的jmx_prometheus_javaagent.jar
。
在Tomcat的启动脚本中添加以下内容,使其使用JMX Exporter。假设你将jmx_prometheus_javaagent.jar
和配置文件(例如jmx_config.yaml
)放在Tomcat的lib
目录下:
在启动脚本中添加下面的语句,在mac中的文件就是catalina.sh
1
| CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/jmx_prometheus_javaagent.jar=8070:/path/jmx_config.yaml"
|
这里的8070是JMX Exporter监听的端口。
创建一个配置文件jmx_config.yaml
,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| ---
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem"]
blacklistObjectNames: []
rules:
- pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
name: os_$1_bytes
type: GAUGE
attrNameSnakeCase: true
- pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
name: os_$1
type: GAUGE
attrNameSnakeCase: true
|
在Prometheus的配置文件prometheus.yml
中添加一个job,用于抓取JMX Exporter的指标:
1
2
3
4
5
| - job_name: 'java'
static_configs:
- targets: ['192.168.0.1:8070']
labels:
instance: jvm_exporter
|
启动jvm和Prometheus。