在微服务体系当中,监控是必不可少的。当系统环境超过指定的阀值之后,须要提醒指定的运维人员或开发人员进行有效的防范,从而下降系统宕机的风险。在CNCF云计算平台中,Prometheus+Grafana是比较通用的解决方案,在SpringBoot2.0之后metrics默认与micrometer集成,而micrometer有关于Prometheus的MeterRegistry规范的实现,所以咱们经过Micrometer这个桥梁能将SpringBoot的监控数据与Prometheus展现出来。而后经过Grafana提供的UI界面进行数据的实时展现。java
Prometheus从对应的节点地址获取度量数据并在本地存储全部数据样例根据相关规则将现有数据聚合并记录新的时间序列(或者生成警报)。可使用Grafana或其余API消费者来可视化收集的数据。node
compile 'org.springframework.boot:spring-boot-starter-actuator' compile 'io.micrometer:micrometer-registry-prometheus:latest.release' compile 'io.micrometer:micrometer-core:1.1.0'
在application.properties
中编辑以下配置web
management.endpoints.web.exposure.include=prometheus,health,info
/** * 为了和grafana集成,所以必须配置这个bean * @return */ @Bean MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() { return registry -> registry.config().commonTags("application", "MYAPPNAME"); }
具体能够参考:micrometerspring
docker-compose.yml
docker
version: '3' services: application: image: java working_dir: /apps volumes: - "${project.home}/build/libs:/apps" container_name: app networks: - node1 hostname: application entrypoint: java -jar spring-boot-project-0.0.1-SNAPSHOT.jar ports: - "8080:8080" networks: node1:
当启动完毕后,咱们能够运行以下命令来查看,是否有对应的信息输出:json
curl -G http://localhost:8080/actuator/prometheus
当这里获得以下结果时,证实咱们的SpringBoot项目提供好与prometheus所需的数据了:tomcat
# HELP tomcat_global_request_max_seconds # TYPE tomcat_global_request_max_seconds gauge tomcat_global_request_max_seconds{application="spring-boot",name="http-nio-8080",} 0.0 # HELP tomcat_sessions_created_sessions_total # TYPE tomcat_sessions_created_sessions_total counter tomcat_sessions_created_sessions_total{application="spring-boot",} 0.0 # HELP jvm_gc_live_data_size_bytes Size of old generation memory pool after a full GC # TYPE jvm_gc_live_data_size_bytes gauge jvm_gc_live_data_size_bytes{application="spring-boot",} 1.9078616E7 # HELP process_files_open_files The open file descriptor count # TYPE process_files_open_files gauge process_files_open_files{application="spring-boot",} 38.0 # HELP tomcat_threads_current_threads # TYPE tomcat_threads_current_threads gauge tomcat_threads_current_threads{application="spring-boot",name="http-nio-8080",} 10.0 # HELP jvm_gc_max_data_size_bytes Max size of old generation memory pool # TYPE jvm_gc_max_data_size_bytes gauge jvm_gc_max_data_size_bytes{application="spring-boot",} 3.49700096E8 # HELP tomcat_servlet_request_seconds # TYPE tomcat_servlet_request_seconds summary tomcat_servlet_request_seconds_count{application="spring-boot",name="default",} 0.0
咱们能够借助于docker进行安装,在这里因为springboot项目我也是使用docker进行部署的,所以咱们保证Prometheus的容器与SpringBoot的容器保证在同一个网络下:安全
docker run --name prom --link app:app --net spring-boot-project_node1 --hostname prom -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
安装完毕后,咱们编辑/tmp/prometheus.yml文件进行配置:springboot
global: scrape_interval: 15s evaluation_interval: 15s rule_files: # - "first.rules" # - "second.rules" scrape_configs: - job_name: 'spring' metrics_path: '/actuator/prometheus' static_configs: - targets: ['application:8080']
在这里咱们指定一个job,这个job会去指定的地址获取监控数据,那么在这里targets指定的是咱们SpringBoot项目的actutator的监控地址,application对应的是springboot容器的hostname。服务器
启动之后,咱们运行http://localhost:9090 能够访问Prometheus的界面:
当出现这种界面就说明 Prometheus已经能够监控到Springboot的提供的数据了
虽然Prometheus提供的有一个简单的UI界面,可是使用起来不那么方便同时也并很差看。不过,咱们能够利用Grafana来提供更直接更美观的UI展现界面。同时,Grafana可以提供多种数据源,让咱们进行不一样类型的中间件或服务器监控。官网地址。一样咱们使用docker来构建grafana容器。grafana全部的配置都在conf/grafana.ini里进行设置。不过它能经过docker的环境变量参数-e进行覆盖,它的基本格式为:GF_<SectionName>_<KeyName>
。例如:
$ docker run \ -d \ -p 3000:3000 \ --name=grafana \ --net=spring-boot-project_node1 --link=prom -e "GF_SERVER_ROOT_URL=http://grafana.server.name" \ -e "GF_SECURITY_ADMIN_PASSWORD=secret" \ grafana/grafana
当启动完毕后,咱们能够访问http://localhost:3000
能够访问到对应的界面,其默认状况下都会跳转至登陆界面,咱们能够在登陆界面上输入用户名admin与密码admin,这样会以管理员身份进行登陆。接下来咱们须要建立一个prometheus的数据源:
此处咱们设置prometheus的地址,这里个人设置为http://prom:9090 用以链接prometheus的监控(注意prom是docker容器prometheus的hostname),剩余的一些设置好比说Auth,Advanced HTTP Settings请按需进行配置。此时咱们须要在这个地址里下一个用于监控micrometer的Dashboard:
咱们须要下载这个dashboard对应的json数据:
而后咱们在grafana上传json脚本:
当导入成功后咱们便可以展现出以下监控界面:
在这里我以qq邮箱为例,首先咱们必须开启smtp许可,在这里咱们会收到安全码用于未来的密码设置。那么咱们能够在docker启动容器时设置环境变量来配置邮件服务的信息:
docker run -p 3000:3000 --env GF_SMTP_ENABLED=true --env GF_SMTP_HOST=smtp.qq.com:465 --env GF_SMTP_USER=xxxx(用户名) --env GF_SMTP_PASSWORD=(安全码) --env GF_SMTP_SKIP_VERIFY=true --env GF_SMTP_FROM_ADDRESS=xxxxx@qq.com --name grafana grafana/grafana:latest
相关配置咱们能够参考:地址,当咱们启动成功之后,咱们能够参考以下界面进行配置:
收到测试邮件后,咱们须要设置监控值,在这里我之内存监控举例:
同时咱们须要配置发送邮件具体内容:
最后咱们保存咱们设置的Dashboard便可