<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
/actuator
,即可看到暴露的端点以及对应的url{
"_links":{
"self":{
"href":"http://localhost:8081/actuator",
"templated":false
},
"health":{
"href":"http://localhost:8081/actuator/health",
"templated":false
},
"health-path":{
"href":"http://localhost:8081/actuator/health/{*path}",
"templated":true
}
}
}
management:
endpoints:
web:
exposure:
#直接全部暴露,如果想部分的话多个之间用逗号隔开
include: "*"
url:/actuator/health
/health端点会聚合程序的健康指标,来检查程序的健康情况,如redis,rabbitmq、db等组件,当你的项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而采集对应的信息
默认是不公开建康信息的细节,只能看到程序有没有上线,如果想看到健康信息的详细内容,需要设置配置
management:
endpoint:
health:
##always:表示对所有用户暴露详细信息
##never(默认):不展示详细信息,只显示up或down的状态
#when-authorized:详细信息将会展示给通过谁的用户,授权的角色可以通过management.endpoint.health.roles配置
show-details: always
url:/actuator/metrics
/metrics端点用来返回当前应用的各类重要试题指标,比如:内存信息、线程信息、垃圾回收信息、数据库连接池等
访问上面的url,只是给出指标的列表,访问具体哪个指标信息,可以这样:/actuator/metrics/{指标名}
url:/actuator/loggers
/logger端点暴露了我们程序内部配置的所有logger信息
/actuator/loggers/{logName}
,json入参{"configuredLevel":"DEBUG"}
,如果想弄回默认级别,这个入参就传个空字符串就行url:/actuator/beans
返回spring窗口中所有bean的别名、类型、是否单例、依赖等信息
略,都是下载安装包,解压,用就改一下配置文件,启动
也可以用docker,看个人喜欢
<dependency>
<groupId>io.micrometergroupId>
<artifactId>micrometer-registry-prometheusartifactId>
<version>1.6.4version>
dependency>
添加依赖后,springboot将会自动配置PrometheusMeterRegistry和CollectorRegistry来以prometheus可以抓取的格式收集和导出指标数据
访问/actuator/prometheus
,可以看到按照Metrics格式组织起来的程序监控指标数据
metric name>(
application.yml
server:
port: 8081
spring:
application:
name: prometheus-demo
#actuator暴露endpoint
management:
endpoints:
web:
exposure:
include: "*"
metrics:
tags:
application: ${spring.application.name}
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
#上面部分是prometheus自己的,下面才是我们的配置
#job_name写应用名
- job_name: 'prometheus-demo'
#metrics_path写我们应用能拿到监控数据的地址
metrics_path: '/actuator/prometheus'
#应用的ip端口
static_configs:
- targets: ['192.168.31.246:8081']
启动prometheus:./prometheus --config.file=prometheus.yml
,启动后访问localhost:9090
进入,ip自行替换
在prometheus的target页面,就可以看到我们自己添加进去的应用了
启动./bin/grafana-server web
,启动后访问```localhost:3000进入,ip自行替换
进入页面之后,初始账号密码admin/admin,后面自己重新设置初始密码
进入grafana之后,先进入configuration,点击add data source,之后将我们的prometheus的配置填进去,生成一个数据源
之后再找到一个import按钮,它应该在一个+的菜单栏里,这里可以添加一个url,或者一个json来导入一个视图模板,可以去grafana官网找,这里放一个推荐的https://grafana.com/dashboards/4701
,用这个模板还需要在应用中多配置一个bean,这个是人家在文档里面说的,不信可以访问一下上面这个url去看一看
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(
@Value("${spring.application.name}") String applicationName) {
return (registry) -> registry.config().commonTags("application", applicationName);
}
先占个坑,以后看看,告警先用grafana的,下面整活
使用TimedAspect
类,能轻松获取我们的方法的执行次数和总耗时,通过一点简单的计算也可以得到平均耗时,下面做一个简单的demo
<dependency>
<groupId>io.micrometergroupId>
<artifactId>micrometer-registry-prometheusartifactId>
<version>1.6.4version>
dependency>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
<version>1.8.6version>
dependency>
TimedAspect
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
@Scheduled(cron = "*/5 * * * * ?")
@EnableScheduling
@Service
public class TimeActuatorService {
@Scheduled(cron = "*/5 * * * * ?")
//加上此注解后,能够收集它的方法执行次数,方法执行总耗时
//有了上述两点信息,也可以得到平均耗时
@Timed(description = "service.doOperation")
public String doOperation() {
int num = new Random().nextInt(100);
try {
Thread.sleep(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
return String.valueOf(num);
}
}
/actuator/prometheus
,能在监控到的数据里看到如下信息:
进入页面,选择create dashboard,不会有人找不到吧
点击add new panel,之后如下图操作
除了使用现成的TimedAspect
当然micrometer还支持我们自定义其他的metrics,像counter、guage等,这里举一个简单的counter
这里对上面的Service做了亿点点的修改:
@Service
public class TimeActuatorService {
@Autowired
private MeterRegistry meterRegistry;
private Counter oddCounter;
private Counter evenCounter;
@PostConstruct
public void init() {
//奇数计数器,tags为metric name和metric value
oddCounter = meterRegistry.counter("odd counter", "name", "odd counter");
oddCounter.increment();
//偶数计数器,tags为metric name和metric value,也可以用builder来构建一个counter
evenCounter = meterRegistry.counter("even counter", "name", "even counter");
evenCounter.increment();
//evenCounter = Counter.builder("even counter")
// .tag("name", "even counter")
// .register(meterRegistry);
}
@Scheduled(cron = "*/5 * * * * ?")
//加上此注解后,能够收集它的方法执行次数,方法执行总耗时
//有了上述两点信息,也可以得到平均耗时
@Timed(description = "service.doOperation")
public String doOperation() {
int num = new Random().nextInt(100);
try {
Thread.sleep(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (num % 2 == 0) {
evenCounter.increment();
} else {
oddCounter.increment();
}
return String.valueOf(num);
}
}
在上面原有的dashboard上面继续add panel就好,PromQL就不专门展示了
这里选择用qq邮箱来做警报
配置grafana.ini
在grafana的conf目录下,有一个defaults.ini文件,一般不直接用它,拷贝一份出来,
#复制、编辑
cp defaults.ini customer.ini
vim customer.ini
#在下面需要改动的地方改一下,都标记好地方了
#修改SMTP部分内容
#################################### SMTP / Emailing #####################
[smtp]
#需要改
enabled = true
#需要改
host = smtp.qq.com:465
#需要改
user = [email protected]
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
#需要改
password = xxxxxxx
cert_file =
key_file =
#需要改
skip_verify = true
#需要改
from_address = [email protected]
#from_address = [email protected]
#需要改
from_name = Grafana
ehlo_identity =
startTLS_policy =
[emails]
welcome_email_on_sign_up = false
templates_pattern = emails/*.html
重启grafana
#指定配置文件重启grafana,认好现在的目录哦
./bin/grafana-server -config=conf/customer.ini
添加channel
来到grafana页面,点击左侧菜单栏的alerting—notifaction channels—new channel,之后填写内容
name:channel的名字
type:Email(我选的是用qq邮箱)
Address:你要发送到的邮箱地址
配置好上面三项后,点击下面的test,测试一下能不能发送成功,成功后点击save
添加报警规则
进入一个dashboard,之后找一个panel,点击edit,进入后找到alert,设置好rule、condition等后保存,详细内容见下
Rule
Conditions
No Data & Error Handling
Send to:指定channel
Message:报警内容
触发rule就能收到报警邮件