作者 青鸟

在做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。