- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
推荐到官网去下载:Windows版的应用程序 。
下载最新版 prometheus-2.37.8.windows-amd64 压缩包:解压就行 。
下载最新版 grafana-9.5.2 压缩包:解压就行 。
导入相关的监控依赖 。
<!--监控站点开启-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- prometheus -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.10.5</version>
</dependency>
<!--SpringSecurity 安全访问-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
#springSecurity 配置
spring.security.user.name=root
spring.security.user.password=root
spring.security.user.roles=ADMIN
#增加开启springboot actuator监控的配置
management:
endpoint:
shutdown:
enabled: true # 开启端点
health:
show-details: always # 是否展示健康检查详情
endpoints:
web:
exposure:
include:
- prometheus
- health
metrics:
tags:
application: ${spring.application.name}
package com.gton.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* @description:
* @author: GuoTong
* @createTime: 2023-06-01 21:44:49
* @since JDK 1.8 OR 11
**/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().and().authorizeRequests()
.antMatchers("/actuator/**", "/favicon.ico", "/doc.html").permitAll()
.antMatchers("/static/**").permitAll()
.antMatchers("/favicon.ico").permitAll()
// swagger
.antMatchers("/swagger**/**").permitAll()
.antMatchers("/webjars/**").permitAll()
.antMatchers("/v2/**").permitAll()
.anyRequest().authenticated().and().csrf().disable(); //关闭csrf保护
}
/**
* Description: 忽略一些借口
*
* @author: GuoTong
* @date: 2023-06-01 21:44:49
* @return:
*/
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers(
"/doc.html",
"/swagger-resources/configuration/ui",
"/swagger*",
"/swagger**/**",
"/webjars/**",
"/favicon.ico",
"/**/*.css",
"/**/*.js",
"/**/*.png",
"/**/*.gif",
"/v2/**",
"/**/*.ttf",
"/actuator/**"
);
}
}
@Value("${auth.global.enable:false}")
private boolean enableGlobalAuth;
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
/**
* Description: 添加全局跨域CORS处理
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
//设置允许跨域请求的域名
.allowedOrigins("http://127.0.0.1:8787")
// 是否允许证书
.allowCredentials(true)
// 设置允许的方法
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
}
/**
* Description: 静态资源过滤
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//ClassPath:/Static/** 静态资源释放
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
//释放swagger
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
//释放webjars
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
/**
* 解决springboot升到2.6.x之后,knife4j报错
*
* @param webEndpointsSupplier the web endpoints supplier
* @param servletEndpointsSupplier the servlet endpoints supplier
* @param controllerEndpointsSupplier the controller endpoints supplier
* @param endpointMediaTypes the endpoint media types
* @param corsEndpointProperties the cors properties
* @param webEndpointProperties the web endpoints properties
* @param environment the environment
* @return the web mvc endpoint handler mapping
*/
@Bean
public WebMvcEndpointHandlerMapping webMvcEndpointHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier,
ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsEndpointProperties, WebEndpointProperties webEndpointProperties,
Environment environment) {
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
allEndpoints.addAll(webEndpoints);
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
String basePath = webEndpointProperties.getBasePath();
EndpointMapping endpointMapping = new EndpointMapping(basePath);
boolean shouldRegisterLinksMapping = shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsEndpointProperties.toCorsConfiguration(), new EndpointLinksResolver(
allEndpoints, basePath), shouldRegisterLinksMapping, null);
}
/**
* shouldRegisterLinksMapping
*
* @param webEndpointProperties
* @param environment
* @param basePath
* @return
*/
private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
}
/**
* Description: 过滤器
*
* @param registry
* @author: GuoTong
* @date: 2023-06-03 12:32:39
* @return:void
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MicrometerTPSInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/doc.html")
.excludePathPatterns("/swagger-resources/**")
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/v2/**")
.excludePathPatterns("/favicon.ico")
.excludePathPatterns("/sso/**")
.excludePathPatterns("/swagger-ui.html/**");
}
/**
* Description: Bean 如下来监控 JVM 性能指标信息:
* http://localhost:8889/actuator/prometheus 指标地址
*
* @param applicationName
* @author: GuoTong
* @date: 2023-06-03 12:34:36
* @return:org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer<io.micrometer.core.instrument.MeterRegistry>
*/
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {
return registry -> registry.config().commonTags("application", applicationName);
}
# Prometheus 启动完成之后 http://localhost:9090/targets
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['127.0.0.1:9090']
###以下内容为SpringBoot应用配置
- job_name: 'BackStageApp'
scrape_interval: 5s
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['127.0.0.1:8889']
labels:
instance: "BackStageApp-prometheus"
service: "BackStageApp-8889-prometheus"
显示的是: http://sky-20200720fyp:8889/actuator/prometheus 说明Prometheus配置完成 。
首次登录使用 admin:admin 然后可以设置自己的账号密码,也可以跳过Skip 。
上一步点击然后选择 import ,会进入这个界面,什么都没有 。
选择自己项目的站点配置的application和instance就行了,刷新左上角的时间 。
很多看板自己研究把 。
可以把监控看板移加入分类分组 。
最后此篇关于Springboot+actuator+prometheus+Grafana集成的文章就讲到这里了,如果你想了解更多关于Springboot+actuator+prometheus+Grafana集成的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有办法在grafana中舍入十进制值? round()和 ceil()函数获取“即时向量”,而不是数值,例如,添加类似 ceil(1/15) 的查询将返回 0 . 最佳答案 这取决于您用于显示数据
嗨,我想在grafana中创建一个简单的警报,以检查最近5分钟是否没有数据。 但我得到一个错误 警报查询中不支持模板变量 好吧,根据此issue模板在grafana中尚不支持。 我有两个问题: 模板是
我是 Grafana 的新开发人员,我想要一个查询,该查询返回名称末尾带有“CA”的变量。 我正在使用 SEARCH 键代码,但它似乎只返回包含的字符,而我对这些字符的位置非常感兴趣。 例如,我写了这
在 Grafana 中,可以使用外部数据库来保存配置。我使用 MySQL,问题是是否有任何选项可以配置 Grafana 中的最大内部数据库连接数? 最佳答案 可以在问题关闭时设置 max_conn:h
我正在尝试将来自 Prometheus 的内存使用数据聚合到 Grafana 中的表中,但我只想要最新的内存使用统计信息。目前,我不断重复使用同一服务的内存。 我试过减少时间范围,但这似乎没有影响。
我在 Server1 的 Grafana 托管中有 20 多个仪表板。我们购买了另一台服务器,并且确实在 Server2 机器上安装了相同版本的 Grafana。 我想知道是否可以将 Server-1
有没有办法让 Grafana 中的 Prometheus 计数器真正单调? 每当服务器重新启动时,我服务器上的计数器(使用 Prometheus Java 库)都会重置,并且 Grafana 中的计数
有没有办法在没有管理员登录的情况下将 Grafana 中的仪表板设置为主页?我有一个用于部署 Grafana 的 Helm 图表,因此我想在配置级别执行此操作。 我在 http://docs.graf
我正在使用 Grafana,我的 URL 字符串是这样的: http://servername:3000/dashboard/db/dashboard?refresh=10s&node=hanoi 我
我必须为 Grafana 创建一个插件。为此,我从 Github 克隆了代码并关注了 this .我已经设法构建了 grafana,但在运行服务器时遇到了问题。我收到错误 Grafana-server
在我的 Grafana 仪表板(以 Prometheus 作为数据源)中,我有一个自定义 $tier变量,它允许用户从下拉列表中选择层。它被定义为: Values separated by comma
我已经通过 Grafana 仪表板设置在 Grafana 仪表板中定义了一个变量 变量属于“自定义”类型。 我希望这个变量在仪表板打开时具有默认值。 如何设置默认值? 最佳答案 在仪表板中选择您的默认
我正在用 Grafana 表绘制数据图表,我想将一天中的所有数据点聚合到表中的一行中。正如您在下面看到的,我当前的设置是按每分钟显示值。 问题:如何制作显示按天聚合的值的 Grafana 表? |
是否可以在带有 prometheus 后端的 grafana 中确定数据集生命周期内记录的最高值,如果是,确定该值发生的时间? 例如,我正在使用 site_logged_in作为 Singlestat
我在 Grafana 中的图表每隔几秒钟就会自动更新一次。随着数据的进入,右侧的最后一个数据点会暂时下降。最终会显示正确的值,但在几次更新时该值较低。这是正常的吗?可以修复吗? 最佳答案 也许,这会有
我正在 Grafana 中寻找一个函数,它看起来应该是微不足道的,但直到现在我还无法找到它是如何实现的(如果有的话)。 使用最近的模板选项,我可以轻松创建仪表板一次,并快速更改显示的数据以查看数据的不
我在grafana中有一个视觉效果。我可以手动转到菜单单击导出并导出 json 中的时间序列数据。这很好用。有没有办法可以在 python 中编写脚本?是否有一些我可以点击的 api 会返回视觉对象的
我有一个新的数据源,我希望使用现有的仪表板。 我怎样才能改变它?有没有比导出/导入仪表板更快的方法? 最佳答案 指定一个变量并不能解决更改现有仪表板的数据源的所有问题 - 仍然会有一些元数据指向旧的,
尽管有这些设置,Grafana 仍然需要使用密码才能查看仪表板。有人可以帮我进行正确的设置吗? [auth.anonymous] # enable anonymous access enabled =
我正在尝试为每个 API 端点添加一个下拉列表,它将显示 http 请求的 QPS 和延迟(红色指标)。 我使用了 Grafana 的模板并使用了以下 prometheus 查询。 label_val
我是一名优秀的程序员,十分优秀!