Envoy源码分析之Stats使用基础-阿里云开发者社区

开发者社区> jeff216> 正文

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

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

相关文章
postman的基础使用
搜索进入postman官网下载客户端,或者安装谷歌浏览器postman扩展插件。
490 0
Microsoft Visual Studio与Firefly 一直提示加载项目,更新源码状态问题
        笔记本一开始安装的是vs2010,由于近期开发要用vs2008与vs2005于是今天又把2008、2005安装上了,但在打开项目的时候,先是提示加载项目文件,然后一直提示更新源码状态,很慢很慢的,之前只有vs2010的时候,打开是很快的,现在不管是用2008、2005、2010就没有一个快的,源码管理用的是firefly,有人知道为什么会出现这种情况吗?        
991 0
Swift基础--使用TableViewController自定义列表
<p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; font-family:Arial; font-size:14px; line-height:26px"> 首先建立一个swift项目,把storyboard的内容删掉,添加一个Navigation Controller,然后
933 0
+关注
jeff216
专注与Linux C++、Linux内核、高性能网络编程、DevOps、Docker等
16
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载