作者 青鸟
在做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' static_configs: - targets: ['localhost:9090' ] labels: instance: prometheus - job_name: mac static_configs: - targets: ['192.168.0.1:9100' ] 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。