Prometheus是一个开源的监控报警系统,搭配prometheus进行监控,支持多种exporter数据采集方式,支持pushgateway上报数据,Prometheus性能足够支撑上万台规模的集群。
搭建环境是基于Docker,Docker Compose。

Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud.
Prometheus collects and stores its metrics as time series data, i.e. metrics information is stored with the timestamp at which it was recorded, alongside optional key-value pairs called labels.
Prometheus 是一个开源系统监控和警报工具包,最初构建于 SoundCloud。
Prometheus 将其指标收集并存储为时间序列数据,即指标信息与记录它的时间戳一起存储,以及称为标签的可选键值对。

1. 创建目录。

  1. mkdir -p prometheus/alertmanager
  2. mkdir -p prometheus/pushgateway
  3. mkdir -p prometheus/grafana/data
  4. mkdir -p prometheus/prometheus/conf
  5. mkdir -p prometheus/prometheus/data

Prometheus目录如下:

  1. .
  2. ├── alertmanager
  3. ├── docker-compose.yml
  4. ├── grafana
  5. └── data
  6. ├── csv
  7. ├── grafana.db
  8. ├── plugins
  9. └── png
  10. ├── prometheus
  11. ├── conf
  12. └── prometheus.yml
  13. └── data
  14. └── pushgateway

2. 创建prometheus的配置文件prometheus.yml并放入conf文件夹。

prometheus.yml的参考配置。

  1. scrape_configs:
  2. - job_name: prometheus
  3. static_configs:
  4. - targets: ['192.168.3.77:9090']
  5. labels:
  6. instance: prometheus
  7. - job_name: 'mysql-exporter'
  8. static_configs:
  9. - targets: ['192.168.3.77:9104']
  10. - job_name: 'redis-exporter'
  11. static_configs:
  12. - targets: ['192.168.3.77:9121']
  13. - job_name: 'your-project'
  14. metrics_path: '/your-project/actuator/prometheus'
  15. static_configs:
  16. - targets: ['192.168.3.77:8880']

3. 创建docker-compose.yml文件并放在根目录。

  1. version: '3.8'
  2. services:
  3. prometheus:
  4. container_name: prometheus
  5. image: prom/prometheus:v2.31.1
  6. volumes:
  7. - ./prometheus/conf:/etc/prometheus
  8. - ./prometheus/data:/prometheus
  9. command:
  10. - '--config.file=/etc/prometheus/prometheus.yml'
  11. - '--storage.tsdb.path=/prometheus'
  12. - '--web.console.libraries=/etc/prometheus/console_libraries'
  13. - '--web.console.templates=/etc/prometheus/consoles'
  14. - '--storage.tsdb.retention.time=200h'
  15. - '--web.enable-lifecycle'
  16. ports:
  17. - '9090:9090'
  18. mysqld-exporter:
  19. container_name: mysqld-exporter
  20. image: prom/mysqld-exporter:v0.13.0
  21. external_links:
  22. - mysql-maxscale
  23. links:
  24. - prometheus
  25. environment:
  26. - DATA_SOURCE_NAME=exporter:111111@(192.168.3.77:4006)/
  27. ports:
  28. - '9104:9104'
  29. depends_on:
  30. - prometheus
  31. redis-exporter:
  32. container_name: redis-exporter
  33. image: bitnami/redis-exporter:1.31.1
  34. links:
  35. - prometheus
  36. environment:
  37. - REDIS_ADDR=redis://192.168.3.77:7001
  38. - REDIS_ADDR=redis://192.168.3.77:7002
  39. - REDIS_ADDR=redis://192.168.3.77:7003
  40. - REDIS_ADDR=redis://192.168.3.77:7004
  41. - REDIS_ADDR=redis://192.168.3.77:7005
  42. - REDIS_ADDR=redis://192.168.3.77:7006
  43. - REDIS_PASSWORD=111111
  44. ports:
  45. - '9121:9121'
  46. depends_on:
  47. - prometheus
  48. grafana:
  49. container_name: grafana
  50. image: grafana/grafana:8.2.3
  51. volumes:
  52. - ./grafana/data:/var/lib/grafana
  53. environment:
  54. - GF_SECURITY_ADMIN_USER=admin
  55. - GF_SECURITY_ADMIN_PASSWORD=admin
  56. - GF_USERS_ALLOW_SIGN_UP=false
  57. ports:
  58. - '3000:3000'
  59. depends_on:
  60. - prometheus

4. 配置exporter。

本文中我使用了2个exporter。

4.1 mysqld-exporter,官方提供

需要创建账号并授权

  1. CREATE USER 'exporter'@'%' IDENTIFIED BY '111111';
  2. GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'%';
  3. GRANT SELECT ON performance_schema.* TO 'exporter'@'%';

4.2 redis-exporter,非官方提供,GithubGitee

5. 以上准备工作都做好后,开始实操。

5.1 启动Prometheus。

  1. docker-compose up

5.2 查看prometheus和exporter状态。

5.2.1 打开浏览器访问。

http://192.168.3.77:9090/targets

5.2.2 查看Endpoint的State,up表示连接成功。

image.png

5.3 通过Grafana展示监控数据。

5.3.1 打开浏览器访问。

http://192.168.3.77:3000/
账号/密码:admin/admin
提出修改密码,直接跳过就可以。

5.3.2 添加数据源。

5.3.2.1 数据源管理。

image.png

5.3.2.2 添加prometheus数据源。

image.png

5.3.2.3 配置prometheus数据源。

image.png

5.3.3 导入监控模板。

image.png
输入模板 ID: 13625,并点击Load
模板不止这一个,去官网挑个适合自己的。

6. Spring项目集成。

6.1 pom.xml

  1. <!-- Spring监控管理 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-actuator</artifactId>
  5. </dependency>
  6. <!-- prometheus客户端 -->
  7. <dependency>
  8. <groupId>io.micrometer</groupId>
  9. <artifactId>micrometer-registry-prometheus</artifactId>
  10. <version>1.7.6</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.prometheus</groupId>
  14. <artifactId>simpleclient</artifactId>
  15. <version>0.10.0</version>
  16. </dependency>
  17. <!-- 一定要使用jackson,同SpringBoot版本即可 -->
  18. <dependency>
  19. <groupId>com.fasterxml.jackson.core</groupId>
  20. <artifactId>jackson-annotations</artifactId>
  21. <version>${jackson.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.fasterxml.jackson.core</groupId>
  25. <artifactId>jackson-core</artifactId>
  26. <version>${jackson.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>com.fasterxml.jackson.core</groupId>
  30. <artifactId>jackson-databind</artifactId>
  31. <version>${jackson.version}</version>
  32. </dependency>

6.2 application.properties

  1. # 不单独设置端口,默认使用项目启动端口
  2. management.metrics.tags.application=your-project
  3. management.metrics.export.prometheus.enabled=true
  4. management.endpoints.enabled-by-default=false
  5. management.endpoints.web.exposure.include=*
  6. management.endpoint.metrics.enabled=true
  7. management.endpoint.prometheus.enabled=true
  8. management.endpoint.health.show-details=ALWAYS

6.3 自定义interceptor,不要拦截”/actuator/**”。

  1. @Override
  2. public void addInterceptors(InterceptorRegistry registry) {
  3. registry
  4. .addInterceptor(yourInterceptor())
  5. .excludePathPatterns("/actuator/**");
  6. }

6.4 系统中的HttpMessageConverter,不要使用fastjson,一定要使用jackson。

使用fastjson时,打开6.5中的地址,被监控的系统会报错误:

  1. ERROR : HttpMessageNotWritableException: No converter for [class java.lang.String] with preset Content-Type 'null'
  2. org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.lang.String] with preset Content-Type 'null'

同时,prometheus也会报错误:

  1. "INVALID" is not a valid start token

image.png

6.5 打开浏览器并访问http://192.168.3.77:8880/your-project/actuator/prometheus

image.png

7. 附录。

7.1 Prometheus官方文档

7.2 Prometheus中文文档

7.3 prometheus集群方案thanos

7.4 thanos集群方案参考

7.5 docker监控方案

7.6 集成alertmanager

7.7 集成pushgateway

[

](http://192.168.101.57:8880/superSkl/actuator/prometheus)