Elastic——如何使用摄入管道来增强弹性观察力数据

77 阅读6分钟

之前的文章中,我曾写过关于分布式跟踪以及如何在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的索引视图更加整洁。这可以使用删除处理器来完成。