Envoy源码分析之Stats使用基础

简介: # Stats基本使用 在上一篇文章中我们介绍了`Metrics`,以及对应的三个具体的`Metrics`类型`CounterImpl`、`GaugeImpl`、`HistogramImpl`,而本文将会介绍下,如何去使用这个三个Metrics类型。在Envoy中要定义一组`stats`一般会按照下面的步骤来创建。 1. 定义一组`stats` ```cpp #define M

Stats基本使用

在上一篇文章中我们介绍了Metrics,以及对应的三个具体的Metrics类型CounterImplGaugeImplHistogramImpl,而本文将会介绍下,如何去使用这个三个Metrics类型。在Envoy中要定义一组stats一般会按照下面的步骤来创建。

  1. 定义一组stats
#define MY_COOL_STATS(COUNTER, GAUGE, HISTOGRAM)     \
COUNTER(counter1)                                    \
GAUGE(gauge1, mode)                                  \
HISTOGRAM(histogram1)
  1. 将定义好的stats放到一个struct
struct MyCoolStats {
  MY_COOL_STATS(GENERATE_COUNTER_STRUCT, GENERATE_GAUGE_STRUCT,GENERATE_HISTOGRAM_STRUCT)
};
  1. 初始化stats
MyCoolStats stats{MY_COOL_STATS(POOL_COUNTER_PREFIX(scope, prefix), POOL_GAUGE_PREFIX(scope, prefix), POOL_HISTOGRAM_PREFIX(scope, prefix))};
  1. 使用stats
stats.counter1_.inc();
stats.gauge1_.inc();
stats.histogram1.recordValue(xx)

到此为止一组stats就定义好了,在代码中创建一份实例,然后通过这个实例就可以引用对应的stats来进行统计了。整个stats的创建和使用还是比较简单的,这都要归功于Envoy预先定义好的一组stats macors。下面我们将进一步分析这些宏的背后到底做了哪些事情。

Stats macros分析

// Fully-qualified for use in external callsites.
#define GENERATE_COUNTER_STRUCT(NAME) Envoy::Stats::Counter& NAME##_;
#define GENERATE_GAUGE_STRUCT(NAME, MODE) Envoy::Stats::Gauge& NAME##_;
#define GENERATE_HISTOGRAM_STRUCT(NAME) Envoy::Stats::Histogram& NAME##_;

GENERATE_*_STRUCT开头的宏其实就是定义了对应的Metrics类型的基类引用,这个部分还是很好理解的,MyCoolStats展开后如下:

struct MyCoolStats {
  Envoy::Stats::Counter& counter1_;
  Envoy::Stats::Gauge& gauge1_;
  Envoy::Stats::Histogram& histogram1_;
};

接着构造MyCoolStats的时候,通过POOL_*_PREFIX开头的宏来创建对应的Metrics类型的实例,其实现如下:

#define FINISH_STAT_DECL_(X) + std::string(#X)),
#define FINISH_STAT_DECL_MODE_(X, MODE) + std::string(#X), Envoy::Stats::Gauge::ImportMode::MODE),

#define POOL_COUNTER_PREFIX(POOL, PREFIX) (POOL).counter(PREFIX FINISH_STAT_DECL_
#define POOL_GAUGE_PREFIX(POOL, PREFIX) (POOL).gauge(PREFIX FINISH_STAT_DECL_MODE_
#define POOL_HISTOGRAM_PREFIX(POOL, PREFIX) (POOL).histogram(PREFIX FINISH_STAT_DECL_

需要传入一个POOL,这个POOL在Envoy中指的就是Scope对象后面的文章会重点来介绍,用来创建不同类型的Metrics,展开后如下。

MyCoolStats stats{scope.counter(prefix + std::string("counter1")),
                  scope.gauge(prefix + std::string("gauge1")),
                  scope.histogram(prefix + std::string("histogram1"))}

如果不需要提供prefix的话,也可以使用POOL_*宏,创建不带prefix的Metrics。 其内部也是调用带有prefix的宏来实现的。

#define POOL_COUNTER(POOL) POOL_COUNTER_PREFIX(POOL, "")
#define POOL_GAUGE(POOL) POOL_GAUGE_PREFIX(POOL, "")
#define POOL_HISTOGRAM(POOL) POOL_HISTOGRAM_PREFIX(POOL, "")
目录
相关文章
|
4月前
|
负载均衡 监控 Cloud Native
|
29天前
|
微服务 Windows
【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式
【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式
|
4月前
|
负载均衡 监控 Cloud Native
Service Mesh的实现原理
【5月更文挑战第6天】Service Mesh是一种针对云原生应用的服务治理技术,通过轻量级网络代理(SideCar)实现服务间的通信和可靠性保证,无需代码集成。它解决了跨语言服务调用和云原生服务治理的问题。
|
4月前
|
缓存 安全 网络协议
Envoy中Wasm Filter相关概念解释
本文旨在介绍Envoy中Wasm Filter相关概念,让用户对相关架构有更加深入的了解,可以快速开发出自己的Wasm插件。 阿里云服务网格(Service Mesh,简称ASM)提供一个全托管式的服务网格平台,兼容社区Istio开源服务网格,用于简化服务的治理,包括服务调用之间的流量路由与拆分管理、服务间通信的认证安全以及网格可观测性能力,从而极大地减轻开发与运维的工作负担。 ASM支持Wasm插件。
151 2
|
4月前
|
负载均衡 监控 Cloud Native
Service Mesh 的实现原理
【2月更文挑战第20天】
|
4月前
|
消息中间件 Dubbo Java
Simple RPC - 01 框架原理及总体架构初探
Simple RPC - 01 框架原理及总体架构初探
74 0
|
9月前
|
Kubernetes 安全 网络协议
k8s教程(service篇)-ingress 7层路由机制(下)
k8s教程(service篇)-ingress 7层路由机制(下)
261 0
|
9月前
|
Kubernetes 网络协议 应用服务中间件
k8s教程(service篇)-ingress 7层路由机制(上)
k8s教程(service篇)-ingress 7层路由机制(上)
624 0
|
开发框架 算法 NoSQL
.NET服务治理之限流中间件-FireflySoft.RateLimit2
.NET服务治理之限流中间件-FireflySoft.RateLimit2
125 0
|
存储 开发框架 算法
.NET服务治理之限流中间件-FireflySoft.RateLimit1
.NET服务治理之限流中间件-FireflySoft.RateLimit1
134 0