Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
B
bookinfo-pageproduct
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
禅道
禅道
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
黄兴尧
bookinfo-pageproduct
Commits
b8ab0d18
提交
b8ab0d18
authored
3月 07, 2021
作者:
huangxingyao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增指标监控
上级
98f2f924
隐藏空白字符变更
内嵌
并排
正在显示
8 个修改的文件
包含
205 行增加
和
3 行删除
+205
-3
pom.xml
pom.xml
+19
-0
ProductpageApplication.java
src/main/java/com/bookinfo/ProductpageApplication.java
+10
-1
AppConfig.java
src/main/java/com/bookinfo/config/AppConfig.java
+22
-0
InitPrometheus.java
src/main/java/com/bookinfo/prometheus/InitPrometheus.java
+32
-0
MyMetrics.java
src/main/java/com/bookinfo/prometheus/MyMetrics.java
+63
-0
PrometheusMetricsInterceptor.java
...com/bookinfo/prometheus/PrometheusMetricsInterceptor.java
+45
-0
ProductPageController.java
src/main/java/com/bookinfo/rest/ProductPageController.java
+2
-2
application.yml
src/main/resources/application.yml
+12
-0
没有找到文件。
pom.xml
浏览文件 @
b8ab0d18
...
@@ -19,6 +19,25 @@
...
@@ -19,6 +19,25 @@
</properties>
</properties>
<dependencies>
<dependencies>
<!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_common -->
<dependency>
<groupId>
io.prometheus
</groupId>
<artifactId>
simpleclient_common
</artifactId>
<version>
0.7.0
</version>
</dependency>
<dependency>
<groupId>
io.micrometer
</groupId>
<artifactId>
micrometer-core
</artifactId>
</dependency>
<dependency>
<groupId>
io.micrometer
</groupId>
<artifactId>
micrometer-registry-prometheus
</artifactId>
</dependency>
<dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
<artifactId>
spring-boot-starter-web
</artifactId>
...
...
src/main/java/com/bookinfo/ProductpageApplication.java
浏览文件 @
b8ab0d18
package
com
.
bookinfo
;
package
com
.
bookinfo
;
import
io.micrometer.core.instrument.MeterRegistry
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.boot.web.client.RestTemplateBuilder
;
import
org.springframework.boot.web.client.RestTemplateBuilder
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
...
@@ -9,7 +11,7 @@ import org.springframework.web.client.RestTemplate;
...
@@ -9,7 +11,7 @@ import org.springframework.web.client.RestTemplate;
import
java.time.Duration
;
import
java.time.Duration
;
@SpringBootApplication
@SpringBootApplication
public
class
ProductpageApplication
{
public
class
ProductpageApplication
{
@Bean
@Bean
public
RestTemplate
restTemplate
(
RestTemplateBuilder
builder
)
{
public
RestTemplate
restTemplate
(
RestTemplateBuilder
builder
)
{
return
builder
return
builder
...
@@ -20,4 +22,11 @@ public class ProductpageApplication {
...
@@ -20,4 +22,11 @@ public class ProductpageApplication {
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
ProductpageApplication
.
class
,
args
);
SpringApplication
.
run
(
ProductpageApplication
.
class
,
args
);
}
}
@Bean
(
value
=
"meterRegistryCustomizer"
)
MeterRegistryCustomizer
<
MeterRegistry
>
meterRegistryCustomizer
()
{
return
meterRegistry
->
meterRegistry
.
config
()
.
commonTags
(
"application"
,
"springboot-app"
);
}
}
}
src/main/java/com/bookinfo/config/AppConfig.java
0 → 100644
浏览文件 @
b8ab0d18
package
com
.
bookinfo
.
config
;
import
com.bookinfo.prometheus.PrometheusMetricsInterceptor
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.servlet.config.annotation.InterceptorRegistry
;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport
;
/**
* @author: Bowen huang
* @date: 2021/03/07
*/
@Configuration
public
class
AppConfig
extends
WebMvcConfigurationSupport
{
@Override
protected
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
new
PrometheusMetricsInterceptor
()).
addPathPatterns
(
"/**"
);
super
.
addInterceptors
(
registry
);
}
}
\ No newline at end of file
src/main/java/com/bookinfo/prometheus/InitPrometheus.java
0 → 100644
浏览文件 @
b8ab0d18
package
com
.
bookinfo
.
prometheus
;
import
io.micrometer.prometheus.PrometheusMeterRegistry
;
import
io.prometheus.client.CollectorRegistry
;
import
org.springframework.context.ApplicationListener
;
import
org.springframework.context.event.ContextRefreshedEvent
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
/**
* @author: Bowen huang
* @date: 2021/03/07
*/
@Component
public
class
InitPrometheus
implements
ApplicationListener
<
ContextRefreshedEvent
>
{
@Resource
PrometheusMeterRegistry
meterRegistry
;
@Override
public
void
onApplicationEvent
(
ContextRefreshedEvent
event
)
{
new
MyMetrics
();
CollectorRegistry
prometheusRegistry
=
meterRegistry
.
getPrometheusRegistry
();
prometheusRegistry
.
register
(
MyMetrics
.
requestCounter
);
prometheusRegistry
.
register
(
MyMetrics
.
inprogressRequests
);
prometheusRegistry
.
register
(
MyMetrics
.
requestLatencyHistogram
);
prometheusRegistry
.
register
(
MyMetrics
.
requestLatency
);
}
}
src/main/java/com/bookinfo/prometheus/MyMetrics.java
0 → 100644
浏览文件 @
b8ab0d18
package
com
.
bookinfo
.
prometheus
;
import
io.prometheus.client.Counter
;
import
io.prometheus.client.Gauge
;
import
io.prometheus.client.Histogram
;
import
io.prometheus.client.Summary
;
public
class
MyMetrics
{
/**
* 计数器可以用于记录只会增加不会减少的指标类型,比如记录应用请求的总量(http_requests_total),
* cpu使用时间(process_cpu_seconds_total)等。 一般而言,Counter类型的metrics指标在命名中
* 我们使用_total结束。
*/
public
static
Counter
requestCounter
=
Counter
.
build
()
.
name
(
"io_namespace_http_requests_total"
)
.
labelNames
(
"path"
,
"method"
,
"code"
)
.
help
(
"Total requests."
).
register
();
/**
* 使用Gauge可以反映应用的当前状态,例如在监控主机时,主机当前空闲的内容大小(node_memory_MemFree),
* 可用内存大小(node_memory_MemAvailable)。或者容器当前的CPU使用率,内存使用率。这里我们使用
* Gauge记录当前应用正在处理的Http请求数量。
*/
public
static
Gauge
inprogressRequests
=
Gauge
.
build
()
.
name
(
"io_namespace_http_inprogress_requests"
).
labelNames
(
"path"
,
"method"
)
.
help
(
"Inprogress requests."
).
register
();
/**
* 主要用于在指定分布范围内(Buckets)记录大小(如http request bytes)或者事件发生的次数。
* 以请求响应时间requests_latency_seconds为例
*/
public
static
Histogram
requestLatencyHistogram
=
Histogram
.
build
()
.
labelNames
(
"path"
,
"method"
,
"code"
)
.
name
(
"io_namespace_http_requests_latency_seconds_histogram"
)
.
help
(
"Request latency in seconds."
)
.
register
();
public
static
Histogram
.
Timer
histogramRequestTimer
;
/**
* 和Histogram类似,不同在于Histogram可以通过histogram_quantile函数在服务器端计算分位数,而
* Sumamry的分位数则是直接在客户端进行定义。因此对于分位数的计算。 Summary在通过PromQL进行查询时
* 有更好的性能表现,而Histogram则会消耗更多的资源。相对的对于客户端而言Histogram消耗的资源更少
*/
public
static
Summary
requestLatency
=
Summary
.
build
()
.
name
(
"io_namespace_http_requests_latency_seconds_summary"
)
.
quantile
(
0.5
,
0.05
)
.
quantile
(
0.9
,
0.01
)
.
labelNames
(
"path"
,
"method"
,
"code"
)
.
help
(
"Request latency in seconds."
).
register
();
public
static
Summary
.
Timer
requestTimer
;
public
MyMetrics
(){
System
.
out
.
println
(
null
==
requestCounter
);
System
.
out
.
println
(
null
==
inprogressRequests
);
System
.
out
.
println
(
null
==
requestLatencyHistogram
);
System
.
out
.
println
(
null
==
histogramRequestTimer
);
System
.
out
.
println
(
null
==
requestLatency
);
System
.
out
.
println
(
null
==
requestTimer
);
}
}
\ No newline at end of file
src/main/java/com/bookinfo/prometheus/PrometheusMetricsInterceptor.java
0 → 100644
浏览文件 @
b8ab0d18
package
com
.
bookinfo
.
prometheus
;
import
org.springframework.web.servlet.handler.HandlerInterceptorAdapter
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
/**
* @author: Bowen huang
* @date: 2021/03/07
*/
public
class
PrometheusMetricsInterceptor
extends
HandlerInterceptorAdapter
{
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
String
requestURI
=
request
.
getRequestURI
();
String
method
=
request
.
getMethod
();
int
status
=
response
.
getStatus
();
MyMetrics
.
inprogressRequests
.
labels
(
requestURI
,
method
).
inc
();
MyMetrics
.
histogramRequestTimer
=
MyMetrics
.
requestLatencyHistogram
.
labels
(
requestURI
,
method
,
String
.
valueOf
(
status
)).
startTimer
();
MyMetrics
.
requestTimer
=
MyMetrics
.
requestLatency
.
labels
(
requestURI
,
method
,
String
.
valueOf
(
status
)).
startTimer
();
return
super
.
preHandle
(
request
,
response
,
handler
);
}
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
Exception
ex
)
throws
Exception
{
String
requestURI
=
request
.
getRequestURI
();
String
method
=
request
.
getMethod
();
int
status
=
response
.
getStatus
();
MyMetrics
.
requestCounter
.
labels
(
requestURI
,
method
,
String
.
valueOf
(
status
)).
inc
();
MyMetrics
.
inprogressRequests
.
labels
(
requestURI
,
method
).
dec
();
MyMetrics
.
histogramRequestTimer
.
observeDuration
();
MyMetrics
.
requestTimer
.
observeDuration
();
super
.
afterCompletion
(
request
,
response
,
handler
,
ex
);
}
}
src/main/java/com/bookinfo/rest/ProductPageController.java
浏览文件 @
b8ab0d18
...
@@ -40,12 +40,12 @@ public class ProductPageController {
...
@@ -40,12 +40,12 @@ public class ProductPageController {
HttpServletRequest
request
){
HttpServletRequest
request
){
String
user
=
username
;
String
user
=
username
;
request
.
getSession
().
setAttribute
(
"user"
,
user
);
request
.
getSession
().
setAttribute
(
"user"
,
user
);
return
"
redirect:/
productpage"
;
return
"productpage"
;
}
}
@GetMapping
(
"/logout"
)
@GetMapping
(
"/logout"
)
public
String
destroySession
(
HttpServletRequest
request
)
{
public
String
destroySession
(
HttpServletRequest
request
)
{
request
.
getSession
().
invalidate
();
request
.
getSession
().
invalidate
();
return
"
redirect:/
productpage"
;
return
"productpage"
;
}
}
@GetMapping
(
"/productpage"
)
@GetMapping
(
"/productpage"
)
...
...
src/main/resources/application.yml
浏览文件 @
b8ab0d18
...
@@ -36,3 +36,14 @@ spring:
...
@@ -36,3 +36,14 @@ spring:
detailsHostname
:
${DETAILS_HOST:#{'http://localhost:8084'}}
detailsHostname
:
${DETAILS_HOST:#{'http://localhost:8084'}}
ratingsHostname
:
${RATINGS_HOST:#{'http://localhost:8085'}}
ratingsHostname
:
${RATINGS_HOST:#{'http://localhost:8085'}}
reviewsHostname
:
${REVIEWS_HOST:#{'http://localhost:8081'}}
reviewsHostname
:
${REVIEWS_HOST:#{'http://localhost:8081'}}
management
:
#server:
#port: 7777 #不单独设置端口的话,和服务的端口一致
#servlet:
#context-path: /boot
endpoints
:
web
:
exposure
:
include
:
"
*"
base-path
:
/
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论