Apache ShenYu 网关监控插件 monitor 应用以及源码分析

说明

  • 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);
    }

    ……
}

One thought on “Apache ShenYu 网关监控插件 monitor 应用以及源码分析

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注