date: 2021-01-11title: 批量注册exporter到consul并配置Prometheus自动发现 #标题
tags: 自动发现 #标签
categories: 监控 # 分类

此文章用于记录下将各种exporter批量注册到consul中的脚本,以及Prometheus增加相关job,实现自动发现。

注册node_exporter到consul集群

  1. $ cat registry.sh # 脚本内容如下
  2. #!/usr/bin/env bash
  3. while read host_name host_addr
  4. do
  5. curl -X PUT -d '{"id": "'${host_name}'","name": "node-exporter","address": "'${host_addr}'","port":9100,"tags": ["node-exporter"],"checks": [{"http": "http://'${host_addr}':9100/","interval": "5s"}]}' http://192.168.20.2:8500/v1/agent/service/register
  6. done < /root/registry/hosts
  7. $ cat hosts # 脚本中读取的hosts文件如下
  8. node-exporter-20-2 192.168.20.2
  9. node-exporter-20-3 192.168.20.3
  10. node-exporter-20-4 192.168.20.4

注册mysqld_exporter到consul集群

  1. $ cat registry_mysql.sh # 脚本文件如下
  2. #!/usr/bin/env bash
  3. while read mysql_name mysql_addr
  4. do
  5. curl -X PUT -d '{"id": "'${mysql_name}'","name": "mysql-exporter","address": "'${mysql_addr}'","port":9104,"tags": ["mysql-exporter"],"checks": [{"http": "http://'${mysql_addr}':9104/","interval": "5s"}]}' http://192.168.20.2:8500/v1/agent/service/register
  6. done < /root/registry/mysql_instance
  7. $ cat mysql_instance # 读取的文件如下
  8. mysql-20-3 192.168.20.3
  9. mysql-20-4 192.168.20.4

注册redis_exporter集群到consul集群

可参考博文:Prometheus监控redis集群 启动redis_exporter。

  1. $ cat registry_redis.sh # 先将redis-exporter注册到consul中
  2. #!/usr/bin/env bash
  3. while read redis_name redis_addr port
  4. do
  5. curl -X PUT -d '{"id": "'${redis_name}'","name": "redis-exporter","address": "'${redis_addr}'","port":'${port}',"tags": ["redis-exporter"],"checks": [{"http": "http://'${redis_addr}':'${port}'/","interval": "5s"}]}' http://192.168.20.2:8500/v1/agent/service/register
  6. done < /root/registry/redis_exporter
  7. $ cat redis_exporter # 以下写入各个redis-exporter
  8. redis-exporter-20-2-9121 192.168.20.2 9121
  9. $ cat registry_redis_instance.sh # 再将各个redis节点注册到consul中
  10. #!/usr/bin/env bash
  11. while read redis_name redis_addr port
  12. do
  13. curl -X PUT -d '{"id": "'${redis_name}'","name": "redis-instance","address": "'${redis_addr}'","port":'${port}',"tags": ["redis-instance"],"checks": [{"http": "http://'${redis_addr}':'${port}'/","interval": "5s"}]}' http://192.168.20.2:8500/v1/agent/service/register
  14. done < /root/registry/redis_instance
  15. $ cat redis_instance # redis_instance 文件内容如下
  16. redis-instance-20-2-7001 192.168.20.2 7001
  17. redis-instance-20-2-7002 192.168.20.2 7002
  18. redis-instance-20-3-7001 192.168.20.3 7001
  19. redis-instance-20-3-7002 192.168.20.3 7002
  20. redis-instance-20-4-7001 192.168.20.4 7001
  21. redis-instance-20-4-7002 192.168.20.4 7002

注意:redis各个实例注册到consul中,健康检查都是失败的,不过没关系,并不影响Prometheus自动发现。

查看consul中注册的服务

可以看到如下注册的服务,就说明没有问题。

批量注册exporter到consul - 图1

配置Prometheus基于consul实现自动发现

  1. $ vim prometheus.yml # prometheus.yml 配置文件中增加如下job
  2. # ....... 省略部分内容
  3. # 这里配置多个job的目的,就是为了在Prometheus的target列表中,可以针对不同的服务进行分组
  4. - job_name: node-exporter
  5. honor_labels: true
  6. metrics_path: /metrics
  7. scheme: http
  8. consul_sd_configs:
  9. - server: 192.168.20.2:8500
  10. - server: 192.168.20.3:8500
  11. - server: 192.168.20.4:8500
  12. services: []
  13. relabel_configs:
  14. - source_labels: ['__meta_consul_tags']
  15. target_label: 'product'
  16. - source_labels: ['__meta_consul_dc']
  17. target_label: 'idc'
  18. - source_labels: ['product']
  19. regex: ",node-exporter,"
  20. action: keep
  21. - job_name: mysqld-exporter
  22. honor_labels: true
  23. metrics_path: /metrics
  24. scheme: http
  25. consul_sd_configs:
  26. - server: 192.168.20.2:8500
  27. - server: 192.168.20.3:8500
  28. - server: 192.168.20.4:8500
  29. services: []
  30. relabel_configs:
  31. - source_labels: ['__meta_consul_tags']
  32. target_label: 'product'
  33. - source_labels: ['__meta_consul_dc']
  34. target_label: 'idc'
  35. - source_labels: ['product']
  36. regex: ",mysql-exporter,"
  37. action: keep
  38. - job_name: redis-exporter
  39. honor_labels: true
  40. metrics_path: /metrics
  41. scheme: http
  42. consul_sd_configs:
  43. - server: 192.168.20.2:8500
  44. - server: 192.168.20.3:8500
  45. - server: 192.168.20.4:8500
  46. services: []
  47. relabel_configs:
  48. - source_labels: ['__meta_consul_tags']
  49. target_label: 'product'
  50. - source_labels: ['__meta_consul_dc']
  51. target_label: 'idc'
  52. - source_labels: ['product','__meta_consul_service_port']
  53. regex: ",redis-exporter,;9121"
  54. action: keep
  55. - job_name: redis-instance
  56. honor_labels: true
  57. metrics_path: /metrics
  58. scheme: http
  59. consul_sd_configs:
  60. - server: 192.168.20.2:8500
  61. - server: 192.168.20.3:8500
  62. - server: 192.168.20.4:8500
  63. services: []
  64. relabel_configs:
  65. - source_labels: ['__address__']
  66. target_label: '__param_target'
  67. - source_labels: ['__param_target']
  68. target_label: 'instace'
  69. - target_label: '__address__'
  70. replacement: 192.168.20.2:9121
  71. - source_labels: ['__meta_consul_tags']
  72. target_label: 'product'
  73. - source_labels: ['__meta_consul_dc']
  74. target_label: 'idc'
  75. - source_labels: ['product']
  76. regex: ",redis-instance,"
  77. action: keep

确认Prometheus的target列表无误

如果访问Prometheus的target列表,可以看到所有注册到consul中的exporter,则表明配置无误。

批量注册exporter到consul - 图2