在 Elasticsearch 中存储 Open Distro for Elasticsearch 的 Performance Analyzer 输出
Open Distro for Elasticsearch 的 Performance Analyzer 插件显示从 Elasticsearch 集群返回指标的 REST API。要充分利用这些指标,您可以将它们存储在 Elasticsearch 中,并使用 Kibana 对其进行可视化。尽管您可以使用 Open Distro for Elasticsearch 的 PerfTop 来构建可视化效果,但 PerfTop 不会保留数据,这意味着它为轻量级。
在本博文中,我将通过一个代码示例探索 Performance Analyzer 的 API,该代码读取 Performance Analyzer 的指标并将其写入 Elasticsearch。您可能会想知道为什么 Performance Analyzer 还没有这样做(欢迎您发起 Pull Request!)。Performance Analyzer 设计为 Elasticsearch 的轻量级协同进程。如果您的 Elasticsearch 集群有问题,则它可能无法响应请求,并且 Kibana 可能无法正常工作。如果采用示例代码,建议将数据发送到不同的 Open Distro for Elasticsearch 集群以避免出现此问题。
您可以遵循我在 GitHub 社区存储库中发布的示例代码。当您克隆存储库时,代码位于 pa-to-es
文件夹中。有关其他代码示例的信息,请参阅往期博客文章。
代码概述
pa-to-es
文件夹包含三个 Python 文件(需要 Python 版本 3.x)和一个 Elasticsearch 模板,该模板将 @timestamp 字段的类型设置为 date
。main.py 是一个应用程序,包含调用 Performance Analyzer 的无限循环,以进行提取指标、解析这些指标并将其发送到 Elasticsearch:
while 1: print('Gathering docs') docs = MetricGatherer().get_all_metrics() print('Sending docs: ', len(docs)) MetricWriter(get_args()).put_doc_batches(docs)
如您所见,main.py
提供 MetricGatherer
和 MetricWriter
两个类别,以与 Elasticsearch 进行通信。MetricGatherer.get_all_metrics()
将遍历 metric_descriptions.py
(每个都调用 get_metric()
)中的运行指标说明。
要获取指标,MetricGatherer 将生成表单的 URL:
http://localhost:9600/_opendistro/_performanceanalyzer/metrics?metrics=<metric>&dim=<dimensions>&agg=<aggregation>&nodes=all
(您可以在我们的文档中获取有关 Performance Analyzer API 的更多详细信息。) 指标说明是 namedtuple
,提供指标/维度/聚合三元组。发送多个项目的效率会更高,但我发现解析结果要复杂得多,这使得任何性能提升都不那么重要。为了确定指标说明,我生成了指标/维度/聚合的所有可能组合,测试运行说明并将其保留在 metric_descriptions.py
中。比较好的做法是构建可显示有效组合的 API,而不是从静态描述集进行运行(正如我前面提到的,我们欢迎大家发起 Pull Request)。
MetricGatherer
使用 result_parse.ResultParser
解释对 Performance Analyzer 的调用的输出。输出 JSON 的每个节点包含一个元素。在该元素中,它返回 fields
列表,后跟一组 records
:
{ "XU9kOXBBQbmFSvkGLv4iGw": { "timestamp": 1558636900000, "data": { "fields":[ { "name":"ShardID", "type":"VARCHAR" }, { "name":"Latency", "type":"DOUBLE" }, { "name":"CPU_Utilization", "type":"DOUBLE" } ], "records":[ [ null, null, 0.016093937677199393 ] ] } }, ...
ResultParser
将分离的字段名称和值压缩在一起,生成一个 dict
,跳过空值。records
生成器函数使用此 dict 作为其返回的基础,添加来自原始返回正文的时间戳。records
还将节点名称和聚合作为字段添加到 dict
中,以便在 Kibana 中可视化数据。
MetricWriter
关闭循环,同时收集 dict
并将其作为文档写入 Elasticsearch,构建 _bulk
正文,然后通过 POST 请求批量写入 Elasticsearch。编写时,代码为硬连线,以将 _bulk
发送至 https://localhost:9200
。实际上,您需要更改输出以转到不同的 Elasticsearch 集群。POST 请求的身份验证为 admin:admin,请确保在更改 Open Distro for Elasticsearch 的密码时对其进行更改。
将模板添加到集群
您可以按如上所述方式运行代码,您将看到数据流入 Open Distro for Elasticsearch 集群。但是,Performance Analyzer 返回的时间戳是长整数,Elasticsearch 会将映射设置为 number
,您将无法对索引使用 Kibana 基于时间的函数。我可以截取时间戳或重写时间戳,以便自动检测映射。我选择了设置模板。
以下模板(pa-to-es
文件夹中的 template.json
)将 @timestamp 的字段类型设置为 date
。在发送任何数据、自动创建索引之前,您需要将此模板发送到 Elasticsearch。(如果您已经运行了 pa-to-es
,请不要担心,只需删除
它创建的任何索引。) 您可以使用 Kibana 开发人员窗格将模板发送到 Elasticsearch。
导航至 https://localhost:5601
。登录、关闭启动画面,然后选择 DevTools 选项卡。单击 Get to work。复制以下文本并粘贴到交互式窗格中,然后单击右侧的三角形。(根据您运行的 Elasticsearch 版本,您可能会收到有关类型删除的警告。您可以忽略此警告。)
POST _template/pa { "index_patterns": ["pa-*"], "settings": { "number_of_shards": 1 }, "mappings": { "log": { "properties": { "@timestamp": { "type": "date" } } } } }
监控 Elasticsearch
我运行 esrally,通过 http_logs
跟踪我的 Open Distro for Elasticsearch,还运行 main.py
来收集指标。然后,我使用这些数据构建了一个 Kibana 控制面板,用于监控我的集群。
小结
Elasticsearch 文档中存储的指标具有单个指标/维度/聚合组合,让您可以自由地以最精细的粒度构建 Kibana 可视化效果。例如,我的控制面板将 CPU 利用率细化到 Elasticsearch 操作级别、每个节点上的磁盘等待时间,以及每个操作的读写吞吐量。在随后的博文中,我将深入探讨如何使用 Performance Analyzer 数据构建控制面板和其他可视化效果。
本篇作者
相关文章
- 学生数据库管理系统
- SpringDataJpa 用MySQL语句怎么分页,spring全家桶SpringDataJpa 用MySQL语句怎么分页
- Docker创建MySQL容器模板命令
- Elasticsearch对应MySQL的对应关系
- 使用SpringDataJpa保存(save)报错误:SQL Error: 1062, SQLState: 23000 控制台会报:Duplicate entry ‘数‘ for key ‘PRIMA
- Navicat Premium 连接sqlserver数据库时提示安装Client失败,解决方案
- Mysql查询当前用户所有数据库语句(SHOW DATABASES)
- MySQL语句-查看当前数据库有哪些表(SHOW TABLES)
- MySQL5.0版本以上新增的 information_schema 数据库是什么?
- MariaDB数据库备份之逻辑备份
- MariaDB数据库创建用户
- MariaDB数据库给用户授权
- MariaDB数据库刷新权限表命令
- MariaDB数据库删除用户命令
- PhpStudy 2016搭建-sqli-libs靶场
- MySQL手动注入步骤
- Pikachu靶场-SQL注入-数字型注入(post)过关步骤
- Pikachu靶场-SQL注入-字符型注入(get)过关步骤
- 利用SQL注入漏洞实现MySQL数据库读写文件
- Kali-工具-sqlmap常见用法