开发者社区> jeff216> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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, "")

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Dubbo 可观测性实践之 Metrics 功能解析
目前 Dubbo 3 的可观测性正在建设中,本文主要介绍 Metrics 模块基础知识与进度。
0 0
K8S原理剖析:Service原理剖析和实践
K8S原理剖析:Service原理剖析和实践
0 0
kube-proxy源码分析:深入浅出理解k8s的services工作原理
在进行k8s实践中, services 是经常碰到的资源对象,services 充当了 k8s 集群 pod 服务抽象的功能,为后端pod 提供了负载均衡和服务发现,那他到底是如何工作的呢,这里从 services 的具体实现 kube-proxy 出发解读 services 的工作机制。
0 0
Envoy源码分析之Stats基础
# 简介 Envoy官方文档中提到`One of the primary goals of Envoy is to make the network understandable`,让网络变的可理解,为了实现这个目标Envoy中内置了`stats`用于统计各类网络相关的指标,Envoy没有选择使用`Prometheus`SDK,而是选择自己实现了`stats`,[目的是为了适配Envoy的线
0 0
Envoy源码分析之Stats Scope
# Scope 在上一篇文章中提到Envoy中通过`Scope`来创建`Metrics`,为什么要搞一个`Scope`的东西出来呢?`Scope`诞生的目的其实是为了更好的管理一组`stats`,比如关于集群的`stats`,这类`stats`的名称有个特点就是都是以`cluster.`作为前缀,那么可以以`cluster.`来创建一个`Scope`,这样就可以通过这个`Scope`来管理
0 0
Envoy源码分析之Stats符号表
# Symbol 在前面几篇文章中我们介绍了`Scope`,通过`Scope`可以使得我们共享相同的`stats`前缀,例如下面两个stats, ![share-scope.jpg](https://ata2-img.cn-hangzhou.oss-pub.aliyun-inc.com/db6cfdfa57dd322f79dd87c89b354dff.jpg) 这两个stats可
0 0
Envoy源码分析之Load balancing基础
# 什么是Load balancing? > Load balancing is a way of distributing traffic between multiple hosts within a single upstream cluster in order to effectively make use of available resources. There are man
0 0
Envoy源码分析之Load balancing Priority
# Priority Level 在上一篇文章中我提到`Priority`,一个集群可以包含多个`Priority`,每一个`Priority`下可以有很多主机,默认的`Priority`是0,也是最高的优先级,如果一个集群同时存在多个`Priority`,Envoy是如何来进行处理呢? Envoy默认只从`Priority`为0的的主机中进行负载均衡,直到`Priority`为0的主机其健
0 0
RyuBook1.0案例二:Traffic Monitor项目源码分析
RyuBook1.0案例二:Traffic Monitor项目源码分析
1183 0
+关注
jeff216
专注与Linux C++、Linux内核、高性能网络编程、DevOps、Docker等
文章
问答
文章排行榜
最热
最新
相关电子书
更多
开源广进-用Service Catalog构造K8S服务能力
立即下载
Kubernetes在大规模场景下的service性能优化实战
立即下载
Group Replication 原理解析与实践经验
立即下载