目录
(1).关于saf
(2).前置准备
(3).saf-dubbo之度量原理
(4).开启访问流量
(5).度量体验
1.Incoming Dubbo Dashboard
2.outcoming Dubbo Dashboard
3.其他
(6).相关文章
(1).关于saf
项目地址:
https://github.com/saf-group
1.一个微服务框架,完全基于注解的方式开发。
2.适用于云原生(K8S)下的微服务体系搭建,为技术中台提供底层支撑。
3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。
(2).前置准备
需要完成一个saf-dubbo-demo的容器化部署,要准备很多准备,详情参见:
微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署
参考下述文章,完成prometheus-saf的部署,这样可以抓取demo的metrics:
grafana&prometheus生产级容器化监控-1:生产级容器化
(3).saf-dubbo之度量原理
使用DubboFilter去拦截每个请求,进行度量,拓扑机制如下:
通过springboot的加载机制初始化公用Config;
通过dubbo的Filter加载机制初始化Filter;
自定义注解@EnableSafDubbo,通过SafDubboBeanValueBindingPostProcessor将apollo上的自定义配置绑定到对应的config,这样实现了本地0配置化;
在Filter中拦截每次请求,注入度量代码,有两个Filter是因为provdier是流量入,consumer是流量出,要分别度量。
SafDubboConsumerFilter的核心代码举例:
代码语言:javascript复制private static final PrometheusMetricProfilerProcessor PROFILE_DUBBO_OUT = new PrometheusMetricProfilerProcessor(
"dubbo_requests_out", "dubbo:out", "dubbo_requests_out", new String[] { "class", "method" });
private static final Gauge PROFILE_DUBBO_FTL_OUT = Gauge.build().name("dubbo_requests_out_ftl")
.help("dubbo_requests_out_ftl").labelNames("class", "method").register();
private static final Set<String> FTL_OUT_MARKED_SET = Sets.newConcurrentHashSet();
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// 可以开关控制是否开启monitor
if (!MonitorConfig.ENABLE_MONITOR_DUBBO) {
return invoker.invoke(invocation);
}
// motanRPC class
String clazz = SafDubboUtil.getShortName(invoker.getInterface().getName());
// motanRPC method
String method = clazz "." invocation.getMethodName();
// invalid and return at once.
if (StringUtils.isEmpty(method) || StringUtils.isEmpty(clazz)) {
return invoker.invoke(invocation);
}
long begin = System.nanoTime();
boolean specialException = true;
boolean isError = false;
// 判断是否是第一次访问
final boolean firstAccessFlag = beforeCall(clazz, method);
Result result = null;
try {
result = invoker.invoke(invocation);
if (result == null) {
isError = true;
} else {
if (result.getException() != null) {
isError = true;
}
}
specialException = false;
return result;
} catch (Exception e) {
// 这里有可能跑出RuntimeException,这里不能吞异常
// TODO 后续要对Exception分类
log.error(e.getMessage(), e);
isError = true;
return null;
} finally {
if (specialException) {
isError = true;
}
afterCall(clazz, method, begin, isError, firstAccessFlag);
}
}
(4).开启访问流量
启动访问脚本,给demo服务一定压力好观测数据。
代码语言:javascript复制#!/bin/bash
for((i=1;i<=100000000;i ));
do
curl http://saf-sample-dubbo-apollo-web-prod/shop/getShop?shopId=1
done
(5).度量体验
dubbo度量目前只有2个dashboard,还可拓展出p99同比等。
dashboard | 用途 |
---|---|
Incoming Dubbo | 度量dubbo provider,如qps, lantency, p99等。 |
Outcoming Dubbo | 度量dubbo consumer,如qps, lantency, p99等。 |
1.Incoming Dubbo Dashboard
注意上图,大家很容易有一个疑惑,就是并发为什么非0即1,是不是有问题。实际上没有问题,因为访问脚本是单线程的,所以并发不可能超过1,大多数时间为0是因为30秒抓取一次,不一定能抓到的。
2.outcoming Dubbo Dashboard
3.其他
根据现有metrics,还可以定制出p99同比等dashboard。
另外,还有非常关键的APM度量,这个以后有时间另开文章陈述:
(6).相关文章
微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署
grafana&prometheus生产级容器化监控-1:生产级容器化