springboot2.X整合prometheus监控的实例讲解
springboot2.x暴露健康状况通过prometheus监控
加入依赖
org.springframework.boot spring-boot-starter-actuator io.micrometer micrometer-registry-prometheus
application.yml加入相关配置
management: security: enabled:false #prometheus+grafana+springboot2监控集成配置 metrics: export: prometheus: enabled:true jmx: enabled:true endpoints: web: exposure: include:'*' base-path:/metrics #prometheus+grafana+springboot2监控集成配置
主启动类加入配置
packagecom.drore.saas;
importcom.drore.saas.services.service.StorageService;
importio.micrometer.core.instrument.MeterRegistry;
importorg.springframework.boot.CommandLineRunner;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.boot.web.servlet.ServletComponentScan;
importorg.springframework.context.annotation.Bean;
@SpringBootApplication
@ServletComponentScan
publicclassTenantappApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(TenantappApplication.class,args);
}
@Bean
CommandLineRunnerinit(StorageServicestorageService){
return(args)->{
storageService.init();
};
}
#prometheus+grafana+springboot2监控集成配置
@Bean
MeterRegistryCustomizermeterRegistryCustomizer(MeterRegistrymeterRegistry){
returnmeterRegistry1->{
meterRegistry.config()
.commonTags("application","Tenantapp");
};
}
#prometheus+grafana+springboot2监控集成配置
}
启动之后通过路径访问查看健康状况
http://xxxxxx/metrics/prometheus
查看到的数据如下:
[root@saas98/]$curl"http://10.98.94.220:80/ts/metrics/prometheus"
#HELPprocess_start_time_secondsStarttimeoftheprocesssinceunixepoch.
#TYPEprocess_start_time_secondsgauge
process_start_time_seconds{application="Tenantapp",}1.556068841226E9
#HELPtomcat_threads_busy_threads
#TYPEtomcat_threads_busy_threadsgauge
tomcat_threads_busy_threads{application="Tenantapp",name="http-nio-9081",}1.0
#HELPtomcat_sessions_expired_sessions_total
#TYPEtomcat_sessions_expired_sessions_totalcounter
tomcat_sessions_expired_sessions_total{application="Tenantapp",}0.0
#HELPtomcat_sessions_active_current_sessions
#TYPEtomcat_sessions_active_current_sessionsgauge
tomcat_sessions_active_current_sessions{application="Tenantapp",}0.0
#HELPjvm_gc_memory_promoted_bytes_totalCountofpositiveincreasesinthesizeoftheoldgenerationmemorypoolbeforeGCtoafterGC
#TYPEjvm_gc_memory_promoted_bytes_totalcounter
jvm_gc_memory_promoted_bytes_total{application="Tenantapp",}1.18894656E8
#HELPtomcat_global_request_max_seconds
#TYPEtomcat_global_request_max_secondsgauge
tomcat_global_request_max_seconds{application="Tenantapp",name="http-nio-9081",}3.366
#HELPjvm_memory_used_bytesTheamountofusedmemory
#TYPEjvm_memory_used_bytesgauge
jvm_memory_used_bytes{application="Tenantapp",area="heap",id="SurvivorSpace",}653880.0
jvm_memory_used_bytes{application="Tenantapp",area="nonheap",id="Metaspace",}1.36445248E8
jvm_memory_used_bytes{application="Tenantapp",area="heap",id="EdenSpace",}7511504.0
jvm_memory_used_bytes{application="Tenantapp",area="nonheap",id="CodeCache",}3.8031424E7
jvm_memory_used_bytes{application="Tenantapp",area="heap",id="TenuredGen",}1.3880212E8
jvm_memory_used_bytes{application="Tenantapp",area="nonheap",id="CompressedClassSpace",}1.7220968E7
#HELPtomcat_sessions_created_sessions_total
#TYPEtomcat_sessions_created_sessions_totalcounter
tomcat_sessions_created_sessions_total{application="Tenantapp",}0.0
#HELPsystem_cpu_countThenumberofprocessorsavailabletotheJavavirtualmachine
#TYPEsystem_cpu_countgauge
system_cpu_count{application="Tenantapp",}1.0
#HELPtomcat_global_sent_bytes_total
#TYPEtomcat_global_sent_bytes_totalcounter
tomcat_global_sent_bytes_total{application="Tenantapp",name="http-nio-9081",}8168269.0
#HELPjvm_threads_daemon_threadsThecurrentnumberoflivedaemonthreads
#TYPEjvm_threads_daemon_threadsgauge
jvm_threads_daemon_threads{application="Tenantapp",}34.0
#HELPlogback_events_totalNumberoferrorleveleventsthatmadeittothelogs
#TYPElogback_events_totalcounter
logback_events_total{application="Tenantapp",level="debug",}0.0
logback_events_total{application="Tenantapp",level="error",}965.0
logback_events_total{application="Tenantapp",level="warn",}4.0
logback_events_total{application="Tenantapp",level="info",}1047.0
logback_events_total{application="Tenantapp",level="trace",}0.0
#HELPtomcat_cache_access_total
#TYPEtomcat_cache_access_totalcounter
tomcat_cache_access_total{application="Tenantapp",}0.0
#HELPtomcat_servlet_error_total
#TYPEtomcat_servlet_error_totalcounter
tomcat_servlet_error_total{application="Tenantapp",name="dispatcherServlet",}0.0
tomcat_servlet_error_total{application="Tenantapp",name="statViewServlet",}0.0
tomcat_servlet_error_total{application="Tenantapp",name="default",}0.0
#HELPjvm_buffer_total_capacity_bytesAnestimateofthetotalcapacityofthebuffersinthispool
prometheus-operator监控java应用整合
目前的prometheus-operator目录下的相关文件
https://github.com/coreos/prometheus-operator.git
已经移植到
https://github.com/coreos/kube-prometheus.git
具体原因参照官网。
下面也有自己总结的文档的地址,大家可以参照下:
https://github.com/hkj123/kube-prometheus-manifests.git
具体的文件如下图展示,这里有很多文件,我们只介绍关注的几个文件,其他的可以参照官网了解:
构建springboot项目的时候需要注意的点:
--- kind:Service apiVersion:v1 metadata: labels: app:ms#prometheus配置监控需要通过app去监控,这个k8s-app和app都可以 namespace:drore-saas name:ms spec: ports: -name:http-ms#prometheus配置监控需要通过portname去识别,当然也可以直接配置端口,不过这样看起来更专业 nodePort:31945 protocol:TCP port:80 targetPort:80 selector: app:ms type:NodePort ---
部署prometheus需要注意的点
https://github.com/coreos/kube-prometheus/manifests
提供了一套整合的例子:
需要修改的文件:prometheus-clusterRole.yaml
默认的文件内容:
apiVersion:rbac.authorization.k8s.io/v1 kind:ClusterRole metadata: name:prometheus-k8s rules: -apiGroups: -"" resources: -nodes/metrics verbs: -get -nonResourceURLs: -/metrics verbs: -get
可以发现这里的监控的resources:-nodes/metrics
我们需要监控自己构建的java应用需要扩大权限
apiVersion:rbac.authorization.k8s.io/v1 kind:ClusterRole metadata: name:prometheus-k8s rules: -apiGroups: -"" resources: -nodes -services -endpoints -pods -nodes/proxy verbs: -get -list -watch -apiGroups: -"" resources: -configmaps -nodes/metrics verbs: -get -nonResourceURLs: -/metrics verbs: -get
书写monitor监控文件,提供了一下参考的文件:prometheus-serviceMonitor.yaml
自己编写的:prometheus-serviceMonitorSelfServiceMs.yaml
apiVersion:monitoring.coreos.com/v1 kind:ServiceMonitor metadata: name:drore-saas-ms namespace:monitoring spec: endpoints: -interval:15s port:http-ms#prometheus配置注意这个port的名称 path:/ms/metrics/prometheus#prometheus配置注意这个路径 jobLabel:app#prometheus配置注意我们用的是app在springboot构建的时候 namespaceSelector:#表示去匹配某一命名空间中的service,如果想从所有的namespace中匹配用any:true matchNames: -drore-saas selector: matchLabels: app:ms#prometheus配置注意我们用的是app在springboot构建的时候
配置完毕之后使用
kubectlapply-fprometheus-clusterRole.yaml-fprometheus-serviceMonitorSelfServiceMs.yaml
就可以登录管理界面去看了
http://118.31.17.205:31144/targets
报警规则可以通过prometheus-rules.yaml去配置
参考
https://github.com/coreos/prometheus-operator
补充:springboot2.x暴露监控endpoint并配置prometheus及grafana对多个targets进行监控
1.build.gradle中添加依赖
compilegroup:'org.springframework.boot',name:'spring-boot-starter-actuator'
compilegroup:'org.springframework.boot',name:'spring-boot-starter-security'
compile('io.micrometer:micrometer-registry-prometheus')
2.springboot2.x暴露信息
不同于之前的Actuator1.x,Actuator2.x的大多数端点默认被禁掉。Actuator2.x中的默认端点增加了/actuator前缀。
3.springboot服务端改造
配置信息
server.port=8085 management.endpoints.web.exposure.include=prometheus management.endpoint.metrics.enabled=true spring.security.user.name=xxx spring.security.user.password=123456 spring.security.user.roles=ACTUATOR_ADMIN management.server.port=8090 management.endpoints.web.base-path=/admin
指定权限
@Configuration
publicclassActuatorSecurityConfigextendsWebSecurityConfigurerAdapter{
@Override
protectedvoidconfigure(HttpSecurityhttp)throwsException{
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests().antMatchers("/actuator/*").hasRole(
"ACTUATOR_ADMIN").and().httpBasic();
}
}
这样我们可以看到:
这个springboot服务启动了两个端口:
8085端口,进行正常的业务处理
8090端口,admin,暴露出监控信息,并通过springsecurity进行权限控制
打开浏览器访问http://192.168.211.2:8090/admin/prometheus
输入用户名密码
4.Prometheus监控多个springboot服务
下载prometheus-2.11.1.linux-amd64.tar.gz
编写配置文件prometheus.yml
global: scrape_interval:10s scrape_timeout:10s evaluation_interval:10m scrape_configs: -job_name:app-gateway scrape_interval:5s scrape_timeout:5s metrics_path:/admin/prometheus scheme:http basic_auth: username:root password:1230456 static_configs: -targets: -192.168.211.2:8099 -job_name:search scrape_interval:5s scrape_timeout:5s metrics_path:/admin/prometheus scheme:http basic_auth: username:root password:1230456 static_configs: -targets: -192.168.211.2:8090
其中,我的springboot服务部署在192.168.211.2上,而prometheus和grafana都部署在192.168.211.101上
配置了两个服务
执行以下命令启动./prometheus--config.file=prometheus.yml&
访问http://192.168.211.101:9090/targets
可以看到
5.grafana可视化监控多个prometheustargets
下载grafana-6.2.5.linux-amd64.tar.gz
启动grafana
./grafana-server&
http://192.168.211.101:3000
在dashboard中配置时,要采用这样的方式
jvm_gc_pause_seconds_count{action="endofminorGC",cause="MetadataGCThreshold",instance="192.168.211.2:8090",job="search"}
通过instance和job来进行区分prometheus的targets
可以看到dashboard中有两个prometheus的targets
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。