正如我们在之前的博客中展示的那样,Elastic® 提供了一种从 Kubernetes 集群和在其上运行的应用程序中摄取和管理遥测数据的方法。Elastic 提供开箱即用的仪表板,以帮助跟踪指标、日志管理和分析、APM 功能(也支持原生 OpenTelemetry),以及通过 AIOps 功能和机器学习 (ML) 分析所有内容的能力。虽然您可以使用 Elastic 中预先存在的 ML 模型、开箱即用的 AIOps 功能或您自己的 ML 模型,但仍需要更深入地挖掘问题的根本原因。
Elastic 有助于减少支持更高效运营的操作工作,但用户仍然需要一种方法来调查和理解从问题的原因到特定错误消息的含义的所有内容。作为运营用户,如果您之前没有遇到过特定的错误,或者它是某些运行手册的一部分,您很可能会去 Google 并开始搜索信息。
OpenAI 的 ChatGPT 正在成为一种有趣的生成式 AI 工具,它有助于使用其背后的模型提供更多信息。如果可以使用 OpenAI 来获取生产或开发环境中错误的更深入的见解(甚至是简单的语义),会怎么样?您可以轻松地将 Elastic 与 OpenAI 的 API 关联以实现此目的。
Kubernetes 是大多数部署(本地或云服务提供商)的中流砥柱,需要大量的专业知识,即使这些专业知识是管理像 GKE、EKS 或 AKS 这样的服务。
在这篇博客中,我将介绍如何使用 Elastic 的监视器功能将 Elastic 连接到 OpenAI,并向其询问有关 Elastic 从 Kubernetes 集群中提取的错误日志的更多信息。更具体地说,我们将使用Azure 的 OpenAI 服务。Azure OpenAI 是 Microsoft 和 OpenAI 之间的合作伙伴关系,因此 Microsoft 版本中提供了 OpenAI 的相同模型。
虽然这篇博客讨论了一个具体的示例,但可以针对 Elastic 在日志中接收到的其他类型的错误进行修改。无论是来自 AWS、应用程序、数据库等,都可以轻松修改此博客中描述的配置和脚本。
先决条件和配置
如果您计划遵循这篇博客,以下是我们用于设置配置的一些组件和详细信息
- 请确保您在 Elastic Cloud 上拥有一个帐户和一个已部署的堆栈(请参阅此处的说明)。
- 我们使用了 GCP GKE Kubernetes 集群,但您可以使用您选择的任何 Kubernetes 集群服务(本地或基于云)。
- 我们还使用 OpenTelemetry Demo 的版本运行。有关将 Elastic 与 OpenTelemetry Demo 一起使用的说明,请参阅 此处。
- 我们还有一个 Azure 帐户和 配置的 Azure OpenAI 服务。您需要从 Azure 获取相应的令牌和来自 Azure OpenAI 服务的正确 URL 端点。
- 我们将使用 Elastic 的开发工具,具体来说是控制台,来加载和运行脚本,这是一个 Elastic 监视器。
- 我们还将添加一个新索引来存储来自 OpenAI 查询的结果。
这是我们将在本博客中设置的配置
当我们逐步完成设置时,我们还将提供使用 OpenAI 与 Azure OpenAI 服务的替代设置。
全部设置
在接下来的几个步骤中,我将介绍
- 在 Elastic Cloud 上获取帐户并设置您的 K8S 集群和应用程序
- 获取 Azure OpenAI 授权(使用 OpenAI 的替代选项)
- 识别 Kubernetes 错误日志
- 使用正确的脚本配置监视器
- 比较 Azure OpenAI/OpenAI 与 ChatGPT UI 的输出
步骤 0:在 Elastic Cloud 上创建帐户
按照说明开始使用 Elastic Cloud。
拥有 Elastic Cloud 登录名后,设置您的 Kubernetes 集群和应用程序。完整的逐步说明博客可在此处获得。 这也概述了如何在 Elastic 中查看 Kubernetes 集群指标以及如何使用仪表板对其进行监控。
步骤 1:Azure OpenAI 服务和授权
当您登录到您的 Azure 订阅并设置 Azure OpenAI 服务的实例时,您将能够在“管理密钥”下获取您的密钥。
您的 OpenAI 实例有两个密钥,但您只需要 KEY 1。
此外,您还需要获取服务 URL。请参阅上面我们服务 URL 为空白的图片,以了解在哪里获取 KEY 1 和 URL。
如果您不使用 Azure OpenAI 服务和标准 OpenAI 服务,则可以在此处获取密钥
**https** ://platform.openai.com/account/api-keys
您将需要创建一个密钥并保存它。获得密钥后,您可以转到步骤 2。
步骤 2:在 Elastic 日志中识别 Kubernetes 错误
当您的 Kubernetes 集群运行时,在集群上 Elastic Agent 守护进程集中运行的 Elastic 的 Kubernetes 集成会将日志和指标发送到 Elastic。 遥测数据被摄取、处理和索引。Kubernetes 日志存储在一个名为 .ds-logs-kubernetes.container_logs-default-* 的索引中(* 代表日期),并且还会预加载一个自动数据流 logs-kubernetes.container_logs。因此,虽然您可以使用一些现成的仪表板来调查指标,但您也可以在 Elastic Discover 中查看所有日志。
虽然来自 Kubernetes 的任何错误都可能令人畏惧,但更细微的问题发生在 kube-system 命名空间中运行的 Pod 的错误。以 konnectivity agent pod 为例,它本质上是一个在节点上运行的网络代理代理,用于帮助建立隧道,是 Kubernetes 中的一个重要组件。任何错误都会导致集群出现连接问题,并导致一系列问题,因此了解并解决这些错误非常重要。
当我们筛选出 konnectivity agent 的错误日志时,我们会看到大量的错误。
但不幸的是,我们仍然无法理解这些错误意味着什么。
引入 OpenAI 来帮助我们更好地理解这个问题。通常,您会从 Discover 中获取错误消息,并将其与问题一起粘贴到 ChatGPT 中(或在 Google 上搜索该消息)。
我们遇到的一个特殊错误,但我们不理解的是:
E0510 02:51:47.138292 1 client.go:388] could not read stream err=rpc error: code = Unavailable desc = error reading from server: read tcp 10.120.0.8:46156->35.230.74.219:8132: read: connection timed out serverID=632d489f-9306-4851-b96b-9204b48f5587 agentID=e305f823-5b03-47d3-a898-70031d9f4768
OpenAI 的输出如下:
ChatGPT 给了我们一些关于为什么针对我们的 konnectivity-agent 发生此 rpc 错误的相当不错的想法。
那么,当这些错误发生时,我们如何自动获得此输出以了解错误呢?
步骤 3:使用正确的脚本配置 watcher
什么是 Elastic watcher? Watcher 是一个 Elasticsearch 功能,您可以使用它基于条件创建操作,这些条件会使用对您的数据的查询定期进行评估。Watcher 对于分析任务关键型和业务关键型流数据很有帮助。例如,您可能会监视应用程序日志中导致更大操作问题的错误。
配置好 watcher 后,它可以:
- 手动触发
- 定期运行
- 使用 UI 或脚本创建
在这种情况下,我们将使用脚本,因为我们可以轻松修改它并根据需要运行它。
我们正在使用 DevTools 控制台输入脚本并进行测试
该脚本在博客末尾的附录中列出。也可以从此处下载。
该脚本执行以下操作:
- 它每五分钟持续运行一次。
- 它将搜索来自容器 konnectivity-agent 的错误日志。
- 它将获取第一个错误的消息,对其进行转换(重新格式化和清理),并将其放入变量 first_hit 中。
"script": "return ['first_hit': ctx.payload.first.hits.hits.0._source.message.replace('\"', \"\")]"
- 错误消息将与查询一起发送到 OpenAI。
What are the potential reasons for the following kubernetes error:
{ { ctx.payload.second.first_hit } }
- 如果搜索产生错误,它将继续创建一个索引,并将错误消息、pod.name(在我们的设置中是 konnectivity-agent-6676d5695b-ccsmx)和 OpenAI 输出放入一个名为 chatgpt_k8_analyzed 的新索引中。
为了查看结果,我们针对新创建的索引创建了一个名为 chatgpt_k8_analyzed 的新数据视图
在 Discover 中,数据视图上的输出为我们提供了错误分析。
对于脚本在五分钟间隔内看到的每个错误,它都会获取该错误的分析。我们也可以根据需要使用范围来在特定时间范围内进行分析。只需相应地修改脚本即可。
步骤 4:来自 Azure OpenAI/OpenAI 与 ChatGPT UI 的输出
如上所述,我们从 Azure OpenAI API 调用中获得了与我们在 ChatGPT UI 中测试查询时获得的结果大致相同。这是因为我们将 API 调用配置为运行与 UI 中选择的相同/相似的模型。
对于 API 调用,我们使用了以下参数:
"request": {
"method" : "POST",
"Url": "https://XXX.openai.azure.com/openai/deployments/pme-gpt-35-turbo/chat/completions?api-version=2023-03-15-preview",
"headers": {"api-key" : "XXXXXXX",
"content-type" : "application/json"
},
"body" : "{ \"messages\": [ { \"role\": \"system\", \"content\": \"You are a helpful assistant.\"}, { \"role\": \"user\", \"content\": \"What are the potential reasons for the following kubernetes error: {{ctx.payload.second.first_hit}}\"}], \"temperature\": 0.5, \"max_tokens\": 2048}" ,
"connection_timeout": "60s",
"read_timeout": "60s"
}
通过将 role:system 设置为“你是一个有帮助的助手”并使用 gpt-35-turbo url 部分,我们本质上是将 API 设置为使用 davinci 模型,该模型与默认情况下设置的 ChatGPT UI 模型相同。
此外,对于 Azure OpenAI 服务,您需要将 URL 设置为类似于以下内容:
https://YOURSERVICENAME.openai.azure.com/openai/deployments/pme-gpt-35-turbo/chat/completions?api-version=2023-03-15-preview
如果您使用 OpenAI(而不是 Azure OpenAI 服务),则针对 https://api.openai.com/v1/completions 的请求调用将如下所示:
"request": {
"scheme": "https",
"host": "api.openai.com",
"port": 443,
"method": "post",
"path": "\/v1\/completions",
"params": {},
"headers": {
"content-type": "application\/json",
"authorization": "Bearer YOUR_ACCESS_TOKEN"
},
"body": "{ \"model\": \"text-davinci-003\", \"prompt\": \"What are the potential reasons for the following kubernetes error: {{ctx.payload.second.first_hit}}\", \"temperature\": 1, \"max_tokens\": 512, \"top_p\": 1.0, \"frequency_penalty\": 0.0, \"presence_penalty\": 0.0 }",
"connection_timeout_in_millis": 60000,
"read_timeout_millis": 60000
}
如果您有兴趣创建更多基于 OpenAI 的版本,可以下载备用脚本并查看Elastic 社区成员的另一篇博客。
在 Kubernetes 日志之外获取其他见解
现在脚本已启动并运行,您可以使用不同的内容修改它:
- 输入
- 条件
- 操作
- 转换
有关如何修改它的更多信息,请参阅此处。修改的一些示例可能包括:
- 查找来自应用程序组件(例如,来自 OTel 演示的 cartService、frontEnd)、云服务提供商(例如,AWS/Azure/GCP 日志),甚至来自 Kafka、数据库等组件的错误日志。
- 将时间范围从持续运行更改为在特定范围内运行。
- 查找日志中的特定错误。
- 一次查询对一组错误(而不是我们演示的一个错误)进行分析。
修改是无穷无尽的,当然,您可以将此与 OpenAI 而不是 Azure OpenAI 服务一起运行。
结论
我希望您已经了解了 Elastic Observability 如何帮助您连接到 OpenAI 服务(我们展示的 Azure OpenAI,甚至 OpenAI)来更好地分析错误日志消息,而无需运行多次 Google 搜索并寻找可能的见解。
以下是我们涵盖内容的快速回顾:
- 开发一个 Elastic watcher 脚本,该脚本可用于查找 Kubernetes 错误并将其发送到 OpenAI,然后将其插入新索引中。
- 使用正确的授权和请求参数配置 Azure OpenAI 服务或 OpenAI。
准备好开始了吗?注册 Elastic Cloud,并试用我上面概述的功能,以便从您的 OpenTelemetry 数据中获得最大价值和可见性。
附录
Watcher 脚本
PUT _watcher/watch/chatgpt_analysis
{
"trigger": {
"schedule": {
"interval": "5m"
}
},
"input": {
"chain": {
"inputs": [
{
"first": {
"search": {
"request": {
"search_type": "query_then_fetch",
"indices": [
"logs-kubernetes*"
],
"rest_total_hits_as_int": true,
"body": {
"query": {
"bool": {
"must": [
{
"match": {
"kubernetes.container.name": "konnectivity-agent"
}
},
{
"match" : {
"message":"error"
}
}
]
}
},
"size": "1"
}
}
}
}
},
{
"second": {
"transform": {
"script": "return ['first_hit': ctx.payload.first.hits.hits.0._source.message.replace('\"', \"\")]"
}
}
},
{
"third": {
"http": {
"request": {
"method" : "POST",
"url": "https://XXX.openai.azure.com/openai/deployments/pme-gpt-35-turbo/chat/completions?api-version=2023-03-15-preview",
"headers": {
"api-key" : "XXX",
"content-type" : "application/json"
},
"body" : "{ \"messages\": [ { \"role\": \"system\", \"content\": \"You are a helpful assistant.\"}, { \"role\": \"user\", \"content\": \"What are the potential reasons for the following kubernetes error: {{ctx.payload.second.first_hit}}\"}], \"temperature\": 0.5, \"max_tokens\": 2048}" ,
"connection_timeout": "60s",
"read_timeout": "60s"
}
}
}
}
]
}
},
"condition": {
"compare": {
"ctx.payload.first.hits.total": {
"gt": 0
}
}
},
"actions": {
"index_payload" : {
"transform": {
"script": {
"source": """
def payload = [:];
payload.timestamp = new Date();
payload.pod_name = ctx.payload.first.hits.hits[0]._source.kubernetes.pod.name;
payload.error_message = ctx.payload.second.first_hit;
payload.chatgpt_analysis = ctx.payload.third.choices[0].message.content;
return payload;
"""
}
},
"index" : {
"index" : "chatgpt_k8s_analyzed"
}
}
}
}
其他日志记录资源
- Elastic 日志记录入门(快速入门)
- 通过集成摄取常见的已知日志(计算节点示例)
- 集成列表
- 将自定义应用程序日志摄取到 Elastic 中
- 在 Elastic 中丰富日志
- 使用 异常检测 (ML) 和 AIOps 分析日志
日志的常见用例示例
在此博文中,我们可能使用了第三方生成式 AI 工具,这些工具归其各自所有者所有和运营。Elastic 对第三方工具没有任何控制权,我们对其内容、操作或使用,以及因您使用此类工具而可能产生的任何损失或损害不承担任何责任或义务。使用包含个人、敏感或机密信息的 AI 工具时请务必谨慎。您提交的任何数据都可能用于 AI 训练或其他目的。我们不保证您提供的信息将得到安全或保密。您应在使用任何生成式 AI 工具之前熟悉其隐私做法和使用条款。
Elastic、Elasticsearch 及相关标记是 Elasticsearch N.V. 在美国和其他国家的商标、徽标或注册商标。所有其他公司和产品名称是其各自所有者的商标、徽标或注册商标。
经 Microsoft 许可使用的 Microsoft 产品屏幕截图。