在之前的文章中,我曾写过关于分布式跟踪以及如何在Elastic堆栈上轻松实现。我曾经使用过很多观察性平台,包括NewRelic、Splunk和DataDog。它们都是非常强大的平台,拥有为你的应用程序实现全栈观察能力所需的一切。
Elastic通常用于快速而强大的内容搜索和日志聚合与分析,但它最近在全栈观察方面也获得了普及。它几乎拥有你在可观察性平台中想要的所有功能,包括支持在现代技术栈上编写的应用程序,支持跟踪/日志/指标,强大的开箱代理,可视化和仪表板,警报,基于AI的异常检测,等等。
在我看来,Elastic observability的关键优势在于:
- 它是由Elasticsearch提供的。所有可观察的数据(日志、跟踪、指标、正常运行时间健康状况等)都被处理、索引并存储为Elasticsearch文档,这使其具有灵活性。
- 应用摄取管道,在索引前处理、丰富和转换可观察性数据。
- 使用索引生命周期策略来控制可观察数据的存储大小,从而控制成本。
- 使用自定义Elastic查询设置警报,这使得警报非常灵活,不限于错误计数、日志计数、错误率、延迟阈值等标准警报。
- 用户界面是Kibana,它是一个强大而灵活的UI工具,提供了在索引文件之上建立自定义仪表盘的能力。
在这篇文章中,我们将重点讨论摄取管道。
摄取管道
输入管道是Elastic提供的预索引钩子 ,用于对你的输入文档进行转换。一旦你创建了一个管道,并为传入的文档进行了设置,每一个文档都会经过这个管道。一些转换的例子包括。
- 转换:改变一个字段的数据类型;例如:字符串到整数,字符串到布尔值
- CSV:从一个字段中提取逗号分隔的数据并创建一个数组字段
- 删除:从索引中删除整个文档(在某些条件下)
- Grok:通过应用grok模式从一个文本文件中提取结构化字段
- GeoIp:为一个给定的IP地址添加地理信息,如城市、国家、大陆或纬度/经度。
- 丰富:用另一个索引的额外信息来丰富你的文件
Apdex得分的摄取管线
让我们把摄取管道用于一些实际用途。我们将创建一个摄取管道,通过计算和添加所有交易的Apdex分数来增强分布式跟踪数据。
管道可以从Kibana用户界面或通过API调用创建。
从Kibana用户界面创建
第1步:创建Apdex Score管道
1.进入左上角的菜单-->堆栈管理-->输入管道。点击页面右上方的 "创建管道 "按钮。
2.2.给管道一个名称和一个可选的描述。
3.添加一个处理器,将transaction.duration.us 转换为Double,并将其设置为一个字段。transaction.duration.us 是以微秒为单位的请求所花费的时间。
4.添加一个脚本处理器来计算Apdex分数,并添加以下脚本。
//acceptable latency in ms. edit as per your needs
int transaction_threshold=2000;
double final_apdex_score=1.0;
double transaction_duration_in_millis = ctx.apdex_score_test / 1000; //convert to ms
//logic: requests with latency less than threshold are satisfying requests,
//requests taking less than 4x of threshold are tolerable
//requests taking more than 4x are unacceptable
if ( transaction_duration_in_millis < transaction_threshold ) {
final_apdex_score = 1.0;
} else if ( transaction_duration_in_millis > transaction_threshold ) {
if ( transaction_duration_in_millis <= 4 * transaction_threshold ) {
final_apdex_score = 0.5;
} else {
final_apdex_score = 0.0;
}
}
ctx.apdex_score_test = final_apdex_score;
5.创建流水线。
第2步:编辑默认的APM管道
Elastic有一个默认的APM管道,它适用于所有APM数据。每个索引只可能有一个管道。为了让Elastic同时通过默认管道和我们的自定义管道来处理文件,我们将编辑默认管道以包括自定义管道。
1.进入左上角的菜单-->堆栈管理-->导入管道。搜索apm 。编辑 "apm" 管道。
2.添加一个 "流水线 "类型的处理器。将管道名称指定为apm_apdex_pipeline (我们上面创建的管道的名称),条件为ctx.processor?.event='transaction' (我们希望这个管道只用于交易而不是跨度)。
4.保存处理器,确保它是管道的最后一步,并保存管道。(你可以在保存管道之前测试它,如下所述)。
通过API创建
如果你喜欢通过API调用做所有这些,这里有创建Apdex分数管道和更新APM管道的请求。这些请求可以从Kibana的Dev Tools下的API控制台执行。
创建Apdex管道
PUT _ingest/pipeline/apm_apdex_pipeline
{
"description": "calculates apdex score",
"processors": [
{
"convert": {
"field": "transaction.duration.us",
"type": "double",
"target_field": "apdex_score_test",
"ignore_missing": true,
"ignore_failure": true
}
},
{
"script": {
"source": "int transaction_threshold=2000;\ndouble final_apdex_score=1.0;\ndouble transaction_duration_in_millis = ctx.apdex_score_test / 1000;\nif ( transaction_duration_in_millis < transaction_threshold ) { \n final_apdex_score = 1.0; \n} else if ( transaction_duration_in_millis > transaction_threshold ) { \n if ( transaction_duration_in_millis <= 4 * transaction_threshold ) { \n final_apdex_score = 0.5; \n } else { \n final_apdex_score = 0.0; \n } \n}\nctx.apdex_score_test = final_apdex_score;",
"ignore_failure": true
}
}
]
}
更新APM管道
PUT _ingest/pipeline/apm
{
"description": "Default enrichment for APM events",
"processors": [
{
"pipeline": {
"name": "apm_ingest_timestamp"
}
},
{
"pipeline": {
"name": "apm_user_agent"
}
},
{
"pipeline": {
"name": "apm_user_geo"
}
},
{
"pipeline": {
"name": "apm_remove_span_metadata"
}
},
{
"pipeline": {
"name": "apm_error_grouping_name",
"if": "ctx.processor?.event == 'error'"
}
},
{
"pipeline": {
"name": "apm_metrics_dynamic_template",
"if": "ctx.processor?.event == 'metric'"
}
},
{
"pipeline": {
"name": "apm_apdex_pipeline",
"if": "ctx.processor?.event == 'transaction'",
"ignore_failure": true
}
}
]
}
测试摄取管道
APM摄取管道现在为所有交易计算和设置Apdex分数。要测试这个。
- 打开APM管道,点击添加文档-->从索引添加测试文档。
- 提供要测试的索引和文件,并将文件添加进去。我们的管道被设置为对交易类型的APM文档工作。索引将是
apm-<version>-transaction-<sequencenumber>。例如:apm-7.17.2-transaction-000002。你可以在发现标签中找到ID和索引名称。 - 另外,也可以手动将文件复制到文件字段中。
- 一旦添加了一个文件,点击输出标签。由此产生的文件应该有一个名为
apdex_score_test的字段,数值为1或0或0.5。
每个服务的Apdex得分
摄取管道现在被设置为计算每个请求的Apdex分数。对于每个请求,都会计算并设置一个分数(1代表满意的请求,0.5代表可容忍的请求,0代表非常慢的请求)。为了找到一个特定服务的分数,我们现在需要做的就是平均该服务中所有请求的分数。当平均Apdex得分低于某个值时,你可以为你的服务设置Elastic Alerts on Index Threshold。例如,你可以对低于0.85的情况设置警告,对低于0.75的情况设置关键警报。
输入管道的其他用例
输入管道是强大的工具,可以帮助改善你的可观察性数据。有了丰富的处理器选项,可以实现的东西是无限的。下面是一些额外的用例。
为所有交易添加地理信息
每个传入的请求都有一个与之相关的客户IP。GeoIp处理器可以用来增强这些数据,包括大陆名称、国家名称、国家ISO代码、城市名称、纬度/经度等等。
在交易错误中添加团队名称/联系人以获得支持
Enrich处理器提供了一种从另一个索引查找数据的方法。对于这个用例,我们可以加载一个索引,每个服务有一个文档。每个文件都应该有服务名称、团队名称和联系细节。然后,Enrich处理器可以用来在APM的service.name 字段上查找这个索引,以填补每个失败交易的团队和联系细节。这可以被你的第一级支持团队使用,以联系到正确的团队以获得额外的帮助。
删除多余的字段以节省存储空间
弹性文件包含大量的信息,随着更多的文件被索引,你的存储成本可能会飙升。删除未使用/不需要的字段将有助于减少文档的大小,并使Kibana的索引视图更加整洁。这可以使用删除处理器来完成。