说明
- monitor 插件是网关用来监控自身运行状态(JVM相关),请求的响应迟延,QPS、TPS等相关metrics。
- 本文将用 prometheus 结合 grafana 展示 apache shenyu 网关 monitor 监控图,并分析monitor插件源码
应用
我们将用 prometheus 做 monitor监控插件的时序数据库,并用 grafana 做指标展示。
Apache ShenYu 网关开启 monitor 插件
- shenyu-admin管理页面 -> 插件管理 -> monitor 编辑 -> 开启
- 在 monitor插件新增如下配置,用于给prometheus拉取监控数据
{"metricsName":"prometheus","host":"localhost","port":"9190","async":"true"}
- shenyu-bootstrap 项目添加 monitor插件,并重启项目
<!-- shenyu monitor plugin start--> <dependency> <groupId>org.apache.shenyu</groupId> <artifactId>shenyu-spring-boot-starter-plugin-monitor</artifactId> <version>${last.version}</version> </dependency> <!-- shenyu monitor plugin end-->
- 选择器和规则配置不在此赘述,可参考本站前文 Apache ShenYu 网关选择器和规则解析
prometheus
- prometheus的安装不在此叙述,大家可参考 prometheus官网,上面有详细的说明
- 配置: 在 prometheus 上配置 shenyu 网关metrics信息
scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'shenyu-gateway' # 任务名称 # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9190'] # shenyu 网关配置的 prometheus 客户端信息
- 启动 prometheus:
prometheus --config.file="prometheus.yml"
grafana
说明
- grafana 安装、启动不在此叙述,大家可参考 grafana官网,上面有详细的说明
- prometheus 数据源配置: grafana 首页 -> configruration -> Data Sources -> prometheus -> 填上prometheus的连接信息
Dashboards配置
grafana 指示板配置非常灵活,我们可以根据我们项目埋点的数据去 DIY 面板。 在 shenyu 网关已正确开启插件,prometheus正确配置的情况下,我们可以访问 http://macbook-pro.local:9190/metrics 去查看我们埋点的数据(macbook-pro.local是 shenyu 网关的地址,端口是 shenyu 网关在开启monitor插件的时候配置的端口)。部分信息如下:
# HELP jvm_memory_bytes_used Used bytes of a given JVM memory area.
# TYPE jvm_memory_bytes_used gauge
jvm_memory_bytes_used{area="heap",} 6.706872E7
jvm_memory_bytes_used{area="nonheap",} 5.6532656E7
# HELP jvm_memory_bytes_committed Committed (bytes) of a given JVM memory area.
# TYPE jvm_memory_bytes_committed gauge
jvm_memory_bytes_committed{area="heap",} 4.75529216E8
jvm_memory_bytes_committed{area="nonheap",} 6.037504E7
# HELP jvm_memory_bytes_max Max (bytes) of a given JVM memory area.
# TYPE jvm_memory_bytes_max gauge
jvm_memory_bytes_max{area="heap",} 3.817865216E9
jvm_memory_bytes_max{area="nonheap",} -1.0
# HELP jvm_memory_bytes_init Initial bytes of a given JVM memory area.
# TYPE jvm_memory_bytes_init gauge
jvm_memory_bytes_init{area="heap",} 2.68435456E8
jvm_memory_bytes_init{area="nonheap",} 2555904.0
# HELP jvm_memory_pool_bytes_used Used bytes of a given JVM memory pool.
# TYPE jvm_memory_pool_bytes_used gauge
jvm_memory_pool_bytes_used{pool="Code Cache",} 8229440.0
jvm_memory_pool_bytes_used{pool="Metaspace",} 4.2412896E7
jvm_memory_pool_bytes_used{pool="Compressed Class Space",} 5890320.0
jvm_memory_pool_bytes_used{pool="PS Eden Space",} 3.7901168E7
jvm_memory_pool_bytes_used{pool="PS Survivor Space",} 9121152.0
jvm_memory_pool_bytes_used{pool="PS Old Gen",} 2.00464E7
……
我们就可以基于上述信息去自定义指示板了。例如我们加入 jvm_memory_bytes_used 信息的指示板,步骤如下:
- grafana 首页 -> Dashboards -> Manage -> New Dashboard -> Add new panel -> 选择我们添加的prometheus数据源 -> Metrcs 填上 jvm_memory_bytes_used(这涉及到 PromQL 语法,具体说明可自行查阅资料)-> 填写title -> apply
- 压测时效果如下:
# 12线程 400并发 持续30秒 (开始时间 2021-02-05 22:13:00) wrk -t12 -c400 -d30s http://localhost:9195/http/order/findById\?id\=10
源码分析
技术方案图(来自官方)
shenyu 网关 monitor 插件是用 prometheus client api 将网关请求数和 jvm 相关指数存到 prometheus 当中,供其展示(上述用的 grafana )。相关核心源码分析:
public final class MetricsTrackerHandler {
……
private void handlerCounter(final String metricsLabel, final String... labelValues) {
//通过工厂创建 metrics tracker,然后调用inc方法往 promethues里存埋点数据
metricsTrackerManager.getMetricsTrackerFactory().create(MetricsTypeEnum.COUNTER.name(), metricsLabel)
.ifPresent(metricsTracker -> ((CounterMetricsTracker) metricsTracker).inc(1.0, labelValues));
}
……
}
//指标跟踪器工厂类
public final class PrometheusMetricsTrackerFactory implements MetricsTrackerFactory {
private static final Collection<MetricsTracker> REGISTER = new ArrayList<>();
static {
REGISTER.add(new RequestTotalCounterMetricsTracker());
REGISTER.add(new HttpRequestCounterMetricsTracker());
REGISTER.add(new RequestLatencyHistogramMetricsTracker());
REGISTER.add(new RequestLatencySummaryMetricsTracker());
}
//根据 type 和 lable从工厂里获取具体的指标追踪器对象
@Override
public Optional<MetricsTracker> create(final String metricsType, final String metricsLabel) {
return REGISTER.stream().filter(each -> each.metricsLabel().equals(metricsLabel) && each.metricsType().equals(metricsType)).findFirst();
}
}
//请求总数记数指标追踪器
public final class RequestTotalCounterMetricsTracker implements CounterMetricsTracker {
// Counter 是 prometheus 埋点的具体对象,下面代码就是创建了一个计数器的数据结构
private static final Counter REQUEST_TOTAL = Counter.build()
.name("request_total")
.help("shenyu request total count")
.register();
//进行埋点
@Override
public void inc(final double amount, final String... labelValues) {
REQUEST_TOTAL.inc(amount);
}
……
}
Hello,
Best new music scene releases https://0daymusic.org
Pop, Metal, Rock, Rap, Jazz, House, Trance, Techno, Dance…
Best regards,
0day MP3s