[5]elasticsearch源码深入分析——cat API是如何加载的

本篇为elasticsearch源码分析系列文章的第五篇,如果在命令行模式下启动ElasticSearch会首先接触到cat API相关的内容。如果使用JSON格式的数据展示,在终端命令下会显得易读性就差,这就需要紧凑对齐的文本,分行分表格的展示数据,也就是ElasticSearch中的cat API接口。

cat API的分类

cat API是esAPI中比较简单的一种,es中的API按照大类分为下面几种:

  • 文档API(Document APIs): 提供对文档的增删改查操作
  • 搜索API(Search APIs): 提供对文档进行某个字段的查询
  • 索引API(Indices APIs): 提供对索引进行操作
  • 查看API(cat APIs): 按照更直观的形式返回数据,更适用于控制台请求展示
  • 集群API(Cluster APIs): 对集群进行查看和操作的API

下面我们以简单的cat APIs为切入点,对API源码进行分析。

cat API的用法

相信用过elasticsearch的同学都知道,elasticsearch提供了restful的查看API,来对运行中的elasticsearch进行查看。

具体的API命令如下:

参照官方文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/cat.html#intro

命令 举例 解释
aliases /_cat/XXX/aliases?v
/_cat/aliases/alias1,aliase2
查询当前配置索引,过滤器,路由的别名,指定一至多个别名,则以逗号隔开
allocation /_cat/allocation?v 查询每个节点上分配的分片(shard)的数量和每个分片(shard)所使用的硬盘容量
count /_cat/count?v 快速查询当前整个集群或者指定索引的document的数量(不包括删除的但是还没有清理掉的document)
fielddata /_cat/fielddata?v
/_cat/fielddata?v&fields=XXX
/_cat/fielddata/field1,field2,field3?v
查询集群中节点的filedata所使用的堆内存,指定fields,或多个fields
health /_cat/health?v
/_cat/health?v&ts=false
查询当前集群的健康信息(同/_cluster/health)
ts用于控制是否显示时间戳(timestamp)
1、常见的用途是用于监测节点之间的健康值
2、通过循环使用该命令,用于追踪大集群恢复的时间
/_cat/health; sleep 120;
done green:每个索引的primary shard和replica shard都是active状态的。
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
indices /_cat/indices/index1?v 查询指定索引index1的相关信息(组成一个索引(index)的shard数量,document的数量,删除的doc数量,主存大小和所有索引的总存储大小(包括replicas)
    其中document的数量和删除document的数量是lucense层级的,包括所有隐藏的document数量<br />
    要获取Elasticsearch层级的精确的document数量可以使用 cat count或者Count API<br />
master /_cat/master?v 仅用于显示master的节点ID,绑定IP地址,节点名称
nodeattrs /_cat/nodeattrs?v 输出显示自定义节点属性
nodes /_cat/nodes?v
/_cat/nodes?v&full_id=false
输出当前集群的拓扑结构(包括当前节点所在的地方和整个集群的相关信息等)
full_id(true/false)用于是否格式化ID字段以显示ID的全长或者简写
pending_tasks /_cat/pending_tasks?v 输出集群中正在执行的任务(集群层级的变化,比如:创建索引,更新mapping,分配或者fail shard)同 /_cluster/pending_tasks
plugins /_cat/plugins?v 输出每个节点正在运行的插件信息
recovery /_cat/recovery?v 提供一个视图关于索引分片 正在恢复或者已经完成恢复的相关信息,恢复事件操作可以发生在集群中一个索引分片从一个节点移动到另外一个节点上。可以发生在快照恢复期间,一个replication层级的变化,节点失败,或者节点启动的时候。节点启动的恢复操作也叫本地存储恢复(当一个节点启动的时候分片从硬盘上被加载到)
repositories /_cat/repositories?v 输出集群中注册快照存储库
thread pool /_cat/thread_pool 输出每个节点集群范围的线程池统计信息,默认情况下返回正在活动,队列和被拒绝的统计信息
shards /_cat/shards
/_cat/shards/twitt*
输出节点包含分片的详细信息(当前分片是primary shard还是 replica shard,doc的数量,硬盘上占用的字节已经该节点被分配在哪里等) 指定索引(模糊匹配)
这个命令可以用于查看分片的迁移情况和分片的状态
segments /_cat/segments?v
/_cat/segments/index1,index1
输出索引分片中关于segment的低层级的信息(包括索引名称,分片数量,doc数量等),提供的信息类似于_segments端点查询指定索引(index1,index2)的segments信息
snapshots /_cat/snapshots/repo1?v 输出属于指定仓库的快照信息(snapshots)每个快照信息包括了它被启动和被停止的信息。
templates /_cat/templates?v
/_cat/templates/templateName1
/_cat/templates/template*
输出当前正在存在的模板信息
输出指定模板的信息

Cat的通用参数如下:

命令 举例 解释
Verbose /_cat/XXX/?v 开启详细输出
Help /_cat/XXX/?help 输出可用的列
Headers /_cat/XXX/?h=column1,column2 指定输出的列
Sort /_cat/XXX/?v&s=column1,column2:desc,column3 指定输出的列进行排序,默认按照升序排序
Format /_cat/XXX?format=json 指定响应返回的数据格式:text(默认),json,yaml,smile,cbor(通过设置 Accept的HTTP头部的多媒体格式的优先级更高)

cat API源码详情

针对http://127.0.0.1:9200/_cat/这个最简单的cat API请求,我们很容易就能在org.elasticsearch.rest包中找到关于cat API的代码,而且elasticsearch的代码也很清晰,如下图:

cat API相关代码

上图中的各种Action类,就对应了前面列出的cat API中的各种实例。

我们在"启动过程(Bootstrap)"一篇的最后提到了Node的实例化,而加载RestAction就是在Node的实例化中,在取得http.enabled的设定参数值为true后,会开始初始化http处理程序,如下图:

加载http处理器

调用了ActionModule类的initRestHandlers方法,知道这些Action类会全部加载到registerHandler中。initRestHandlers方法需要的参数setting和restController,在ActionModule的实例化过程中已经被注入了。

加载Action类

为了使得浏览器在调用http://127.0.0.1:9200/_cat/的时候输出正确内容,controller先注册了 “_cat” 这个路径,注册的代码如下:

controller.registerHandler(GET, "/_cat", this);

然后将List<AbstractCatAction> catActions 中保存的所有action按照预先在documentation中设定好的文本取出来,送入Response中。这样就能在请求http://127.0.0.1:9200/_cat/的时候输出正确的文本。这就是最简单的cat API的逻辑。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 基础概念 Elasticsearch有几个核心概念,从一开始理解这些概念会对整个学习过程有莫大的帮助。 接近实时(...
    山天大畜阅读 2,102评论 0 4
  • 一、环境搭建 软件版本: Linux:centos7 64bit JDK:1.8.0 elasticsearch:...
    lailai900201阅读 3,561评论 0 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 简介 Elasticsearch是一个高可扩展的开源全文搜索和分析引擎,它允许存储、搜索和分析大量的数据,并且这个...
    零度沸腾_yjz阅读 5,520评论 0 8
  • 我们是不是时常会感到自己的回报不及付出,辛苦努力却一直见不到成果,在一次又一次地失败后安慰自己“人生有100次失败...
    玖代乒乓球谱阅读 663评论 0 3