正在加载

教程:观察您的 Kubernetes 部署

Elastic Stack

在像 Kubernetes 这样的容器化环境中运行的应用程序提出了一个独特的监控挑战:您如何诊断和解决数千个容器上运行的数百个微服务的问题,这些微服务运行在短暂且可丢弃的 Pod 中?

一个成功的 Kubernetes 监控解决方案需要满足以下几个要求

  • 监控您技术堆栈的所有层,包括

    • Kubernetes 运行的主机系统。
    • Kubernetes 核心组件、节点、Pod 和集群中运行的容器。
    • 所有在 Kubernetes 容器中运行的应用程序和服务。
  • 自动检测和监控动态出现的服务。

  • 提供一种关联相关数据的方法,以便您可以对相关的指标、日志和其他可观察性数据进行分组和探索。

本指南介绍了如何使用 Elastic Observability 观察应用程序的所有层,包括编排软件本身

  • 从 Kubernetes 和您的应用程序收集日志和指标
  • 从使用 Kubernetes 部署的应用程序收集跟踪数据
  • 将数据集中在 Elastic Stack 中
  • 使用定制的仪表板和 Observability UI 实时浏览数据

本指南介绍如何使用 Elastic Agent 清单文件将 Elastic 监控代理部署为 DaemonSet。 对于其他部署选项,请参阅来自 Elastic Cloud on Kubernetes (ECK) 的 Kubernetes 运算符和自定义资源定义。

Elastic Stack 提供了以下用于监控 Kubernetes 的组件

  1. Elastic Agent 是一种单一的、统一的方式,可为您的主机添加对日志和指标等数据的监控。
  2. Elastic Agent Kubernetes 集成与 Elastic Agent 配合使用,可从 Kubernetes 集群收集日志和指标。
  3. APM(稍后描述)用于监控、检测和诊断复杂的应用程序性能问题。
  4. Elasticsearch 用于存储和搜索您的数据。
  5. Kibana 中的 Observability 应用用于可视化和管理您的可观察性数据。
Kubernetes monitoring architecture

Elastic Agent 的默认安装作为 DaemonSet 部署到 Kubernetes,以确保集群的每个节点上都运行一个实例。 它从在 Kubernetes 上运行的 Pod、容器和应用程序收集日志和指标。

Elastic Agent 提供处理器,用于向事件添加元数据。 元数据对于分组和浏览相关数据非常有价值。 例如,在分析容器日志时,您需要知道主机和容器名称,并且能够关联日志、指标和跟踪。

默认部署包括在需要时使用处理器来丰富包含云和主机元数据的事件。

Metadata processors for cloud

有关这些处理器的更多信息,请参阅 add_cloud_metadataadd_host_metadata 文档。

默认情况下,Kubernetes 集成使用有价值的元数据来丰富日志和指标。

默认情况下,所有 Kubernetes 指标都使用元数据进行丰富。 丰富在代码中进行,并且可以使用每个数据集上的 add_resource_metadata 块进行配置。 有关配置 add_resource_metadata 块的更多信息,请参阅 配置 kubelet API 元数据丰富配置 kube-state-metrics 元数据丰富

默认情况下,所有 Kubernetes 日志都使用元数据进行丰富。 有关配置元数据丰富的更多信息,请参阅 收集 Kubernetes 容器日志

现在您已经对监控架构有了基本的了解,让我们学习如何将监控部署到您的 Kubernetes 环境。

在您可以监控 Kubernetes 之前,您需要以下内容

  • Elasticsearch 用于存储和搜索您的可观察性数据,Kibana 用于可视化和管理它。
  • 如果您想收集 Kubernetes 状态指标,您需要部署 kube-state-metrics。 有关部署说明,请参阅 Kubernetes 文档

要开始从您的 Kubernetes 集群收集日志和指标,首先将 Kubernetes 集成 添加到您的策略,并配置您要收集的指标和日志。

按照以下步骤将 Kubernetes 集成添加到您的策略

  1. 在主菜单中找到 集成,或使用全局搜索字段
  2. 在搜索栏中输入“Kubernetes”,然后选择 Kubernetes 集成。
  3. 单击 Kubernetes 集成页面顶部的 添加 Kubernetes
  4. 单击“添加集成即可(跳过代理安装)”在添加集成页面底部。

继续到 步骤 2:配置您的 Kubernetes 集成

Kubernetes 集成可以从多个组件获取指标和日志。 在 添加 Kubernetes 集成 页面中,配置您要收集的指标和日志的选项。 以下部分概述了配置选项。

收集指标

收集关于 Kubernetes 集群以及在其上运行的工作负载的指标是 Kubernetes 可观察性的一个关键方面。 您需要收集关于底层基础设施上运行的资源(例如,您的 Kubernetes 集群的机器)的指标、整个集群的指标以及容器和 Pod 的各个指标。 具体来说,您需要监控以下内容的运行状况和性能

  • Kubernetes 组件运行的主机。 每个主机都会生成诸如 CPU、内存、磁盘利用率以及磁盘和网络 I/O 之类的指标。
  • Kubernetes 容器,它们会生成自己的一组指标。
  • 作为 Kubernetes Pod 运行的应用程序,例如应用程序服务器和数据库,每个都会生成自己的一组指标。
  • 其他 Kubernetes 资源(如服务、部署、cronjob)是整个基础设施的宝贵资产,并且会生成自己的一组需要监控的指标。

Elastic Agent 与 Kubernetes 集成一起提供了一个统一的解决方案来监控您的 Kubernetes 技术堆栈的所有层,因此您不需要多种技术来收集指标。

您可以使用以下选项来收集关于您的 Kubernetes 集群以及在其上运行的工作负载的指标

收集日志

收集和分析 Kubernetes 核心组件以及在 Kubernetes 上运行的各种应用程序的日志是 Kubernetes 可观察性的强大工具。 在 Kubernetes Pod 中运行的容器会将日志发布到 stdout 或 stderr。

您可以使用以下选项来收集 Kubernetes 日志

默认情况下,从 kubelet API 收集指标处于开启状态。 Kubelet 是在每个 Kubernetes 节点上运行的代理,对于管理单个 Pod 以及托管它们的节点至关重要。 有关 kubelet 的更多信息,请参阅 Kubernetes kubelet 文档

Elastic Agent 与 Kubernetes 集成可以从 kubelet API 收集指标,以获取有关 Kubernetes 节点、Pod、容器和其他资源状态的重要信息。 pale展开以下列表以查看来自 kubelet API 的所有可用指标。

为每个 kubelet API 选项提供以下信息

添加元数据
此选项会将元数据添加到事件。 元数据对于分组和浏览相关数据很有价值。 默认情况下,此选项处于启用状态。
Bearer Token 文件
用于向 kubelet API 进行身份验证的令牌的文件路径。
主机
Elastic 将连接以收集指标的 kubelet API 服务器的地址。 ${env.NODE_NAME} 是一个环境变量,表示 Kubernetes 节点的名称。 端口 10250 是 kubelet API 监听 HTTPS 连接的默认端口。
周期
轮询 kubelet API 以获取指标的频率。 默认值为每 10 秒一次。
SSL 验证模式
指定如何处理 SSL 验证。 none 表示 SSL 验证已禁用。

Kubernetes 容器指标Kubernetes Pod 指标 下,您可以从 高级选项 → 添加节点和命名空间元数据 配置元数据丰富。

从这里,更新 add_resource_metadata 块以配置丰富

add_resource_metadata:
  namespace:
    include_labels: ["namespacelabel1"]
  node:
    include_labels: ["nodelabel2"]
    include_annotations: ["nodeannotation1"]
  deployment: false
注意

您需要先部署 kube-state-metrics,然后才能使用它来收集指标数据。 要了解如何部署,请参阅 Kubernetes 部署文档

默认情况下,从 kube-state-metrics 收集指标处于启用状态。 kube-state-metrics 服务提供有关 Kubernetes 对象运行状况的集群范围指标。 有关更多信息,请参阅 kube-state-metrics 文档

kube-state-metrics 提供水平分片以支持大型 Kubernetes 部署。 有关更多信息,请参阅 kube-state-metrics 分片 文档。

通过 Kubernetes 集成,您可以使用 kube-state-metrics 收集许多指标。 展开以下列表以查看来自 kube-state-metrics 的所有可用指标。

为每个 kube-state-metrics 选项提供以下信息

添加元数据
此选项会将元数据添加到事件。 元数据对于分组和浏览相关数据很有价值。 默认情况下,此选项处于启用状态。
主机
kube-state-metrics 正在运行的地址。 端口 8080 是默认端口。
领导者选举
启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 kube_state_metrics 检索指标。 这可以防止多节点 Kubernetes 集群中出现重复数据。
周期
轮询 kube-state-metrics 以获取指标的频率。 默认值为每 10 秒一次。

Kubernetes 容器指标Kubernetes Pod 指标 下,您可以从 高级选项 → 添加节点和命名空间元数据 配置元数据丰富。

从这里,更新 add_resource_metadata 块以配置丰富

add_resource_metadata:
  namespace:
   enabled: true
    #use_regex_include: false
    include_labels: ["namespacelabel1"]
    #use_regex_exclude: false
    #exclude_labels: ["namespacelabel2"]
  node:
   enabled: true
    #use_regex_include: false
    include_labels: ["nodelabel2"]
    include_annotations: ["nodeannotation1"]
    #use_regex_exclude: false
    #exclude_labels: ["nodelabel3"]
  #deployment: false
  #cronjob: false

默认情况下,从 kube-apiserver 收集指标处于启用状态。 kube-apiserver 设置和验证 Pod、服务和其他 API 对象。 这些指标提供了对 API 服务器的性能、工作负载和运行状况的深入了解。

有关收集的指标的更多信息,请参阅 kube-apiserver 指标

提供以下信息以收集 kube-apiserver 指标

Bearer Token 文件
用于向 kube-apiserver 进行身份验证的令牌的文件路径。
主机
集成连接到的 Kubernetes API 服务器的地址。 它使用 KUBERNETES_SERVICE_HOSTKUBERNETES_SERVICE_PORT 环境变量。
领导者选举
启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 kube-apiserver 检索指标。 这可以防止多节点 Kubernetes 集群中出现重复数据。
周期
轮询 kube-state-metrics 以获取指标的频率。 默认值为每 30 秒一次。
SSL 证书颁发机构
用于验证 Kubernetes API 服务器的 TLS 证书的证书颁发机构 (CA) 捆绑包的路径。

kube-proxy 在每个节点上运行并维护网络规则。 默认情况下,从 kube-proxy 收集指标处于启用状态。 这些指标提供了对代理的网络活动、性能和资源使用情况的深入了解。

有关收集的指标的更多信息,请参阅 kube-proxy 指标

提供以下信息以收集 Kubernetes 代理指标

主机
kube-proxy 正在运行的地址。 端口 10249 是默认端口。
周期
轮询 kube-state-metrics 以获取指标的频率。 默认值为每 10 秒一次。

kube-scheduler 将没有节点分配的新 Pod 分配给最合适的节点。 启用此选项可从 kube-scheduler 获取指标。 这些指标提供了对 kube-scheduler 的性能、资源使用情况和运行状况的深入了解。

有关收集的指标的更多信息,请参阅 kube-scheduler 指标

提供以下信息以收集 Kubernetes 调度器指标

Bearer Token 文件
用于向 kube-scheduler 进行身份验证的令牌的文件路径。
主机
Elastic 集成应从中收集指标的 kube-scheduler 的地址和端口。 端口 10259 是默认端口。
周期
轮询 kube-scheduler 以获取指标的频率。 默认值为每 10 秒一次。
SSL 验证模式
指定如何处理 SSL 验证。 默认为 none,表示 SSL 验证已禁用。

kube-controller-manager 管理集群的状态。开启此选项可从 kube-controller-manager 获取指标。这些指标提供了关于 kube-controller-manager 的性能、资源使用和健康状况的洞察。

有关收集的指标的更多信息,请参阅 kube-controller-manager 指标

提供以下信息以收集 kube-controller-manager 指标

Bearer Token 文件
用于向 kube-controller-manager 进行身份验证的令牌的文件路径。
主机
集成应从中收集指标的 kube-controller-manager 的地址和端口。默认端口为 10259。
周期
轮询 kube-controller-manager 以获取指标的频率。默认值为每 10 秒。
SSL 验证模式
指定如何处理 SSL 验证。 默认为 none,表示 SSL 验证已禁用。

事件指标让你全面了解集群中发生的事情。这些指标帮助你了解集群中发生的事情并提高可靠性和稳定性。默认情况下,从 Kubernetes API 服务器收集 Kubernetes 事件已开启。

有关收集的指标的更多信息,请参阅 事件指标

提供以下信息以收集 Kubernetes 事件指标

周期
轮询 kube-api-server 以获取事件的频率。默认值为每 10 秒。
添加元数据
开启此选项可向事件添加元数据。元数据对于分组和浏览相关数据很有价值。
跳过较旧的事件
忽略在某个时间之前发生的事件
领导者选举
启用时(默认行为),只有持有领导者锁的 Elastic Agent 才会从 kube-apiserver 检索指标。 这可以防止多节点 Kubernetes 集群中出现重复数据。

默认情况下,已开启收集和解析 Kubernetes 容器日志。在 Kubernetes Pod 中运行的容器将日志发布到 stdout 或 stderr。这些日志会被写入 kubelet 已知的位置。默认情况下,容器解析器已启用。你可以在高级设置中启用其他解析器。

默认情况下,也启用了元数据丰富,并且基于 Kubernetes 提供程序。使用 Kubernetes 提供程序的 add_resource_metadata 块对其进行配置。有关配置提供程序的更多信息,请参阅 Kubernetes 提供程序 文档。

有关收集容器日志的更多信息,请参阅 Kubernetes 容器日志

提供以下信息以收集容器日志

使用符号链接
符号链接很轻巧,不包含日志文件的数据,但指向它们的实际位置。默认情况下使用符号链接。
条件
你可以指定一个条件来控制是否将配置应用于正在运行的 Elastic Agent。
警告

此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。

开启此选项可收集审计日志。 Kubernetes 审计日志记录来自内部和外部组件的 Kubernetes API 请求。这些日志可以帮助你了解集群行为并调试问题。

有关收集审计日志的更多信息,请参阅 Kubernetes 审计日志

配置集成后,你需要下载并更新你的清单。首先,通过完成以下步骤下载清单

  1. 添加 Kubernetes 集成 页面的底部,单击 保存并继续

  2. 单击 将 Elastic Agent 添加到你的主机

  3. 注册 Fleet? 下,选择 以独立模式运行

    Select run standalone under Enroll in Fleet
  4. 配置 Agent 下,选择 下载清单

下载清单后,打开它并更新 DaemonSet 中的 ES_USERNAMEES_PASSWORD 环境变量以匹配你的 Elasticsearch 凭据。

你还可以进一步修改清单以满足你的需求。例如,你可能想要启用自动发现以自动发现容器日志。有关在清单中启用自动发现的更多信息,请参阅 Fleet 指南中的 自动发现文档

准备好部署 Elastic Agent 后

  1. 从你下载清单的目录中,运行以下 apply 命令

    kubectl apply -f elastic-agent-standalone-kubernetes.yml
    
  2. 使用以下命令检查 Elastic Agent 状态

    kubectl -n kube-system get pods -l app=elastic-agent
    

如果在配置或安装 Elastic Agent 时遇到任何问题,请参阅 调试独立的 Elastic Agents

使用 Kibana 查看 Elastic Agent 收集的指标和日志数据。有关查看数据的更多信息,请参阅以下部分。

要查看 Elastic Agent 收集的性能和健康状况指标,请在主菜单中找到 基础设施 或使用 全局搜索字段

基础设施清单 页面上,你可以在不同的视图之间切换以查看 Kubernetes 上运行的容器和 Pod 的概览

Inventory page that shows Kubernetes pods

有关使用清单页面的更多信息,请参阅 按资源类型查看基础设施指标

指标资源管理器 页面上,你可以对正在监视的资源的指标进行分组和分析。

Metrics dashboard that shows CPU usage for Kubernetes pods

有关使用 指标资源管理器 页面的更多信息,请参阅 随时间推移探索基础设施指标

全局搜索字段 中查找 Discover

数据视图 菜单中,选择 所有日志。 从这里,你可以快速搜索和筛选你的日志数据,获取有关日志字段结构的信息,并在可视化中显示你的发现。 然后,你可以筛选你的日志数据并深入研究单个日志以查找和排除问题。 有关更多信息,请参阅

借助 Elastic 应用程序性能监视 (APM),快速诊断和排除应用程序性能问题。

想想延迟峰值 — APM 可以帮助你将调查范围缩小到单个服务。因为你还摄取并关联了日志和指标,所以你可以将问题链接到特定 Kubernetes Pod 的 CPU 和内存使用率或错误日志条目。

应用程序监视数据从 Kubernetes 中运行的应用程序流式传输到 APM,在那里对其进行验证、处理并转换为 Elasticsearch 文档。

在处理 Kubernetes 时,有许多方法可以部署 APM,但本指南假设你使用的是 Elastic Cloud 托管的部署。如果尚未执行此操作,请在 Elastic Cloud Console 中启用 APM。

如果你想自己管理 APM,还有一些替代方案

一个 密钥令牌 用于保护 APM Agent 和 APM Server 之间的通信。要在 Kibana 中创建或更新你的密钥令牌,

  1. 在主菜单中找到 Fleet,或者使用 全局搜索字段
  2. Agent policies(Agent策略) 选项卡下,选择你想要配置的策略。
  3. 找到 Elastic APM 集成,然后选择 Actions(操作)→ Edit integration(编辑集成)
  4. 导航到 Agent authorization(Agent授权)→ Secret token(密钥令牌),并设置你的令牌值。
  5. 单击 Save integration(保存集成)。APM Server 将在更改生效前重启。

为避免暴露密钥令牌,你可以将其存储在 Kubernetes Secret 中。例如

kubectl create secret generic apm-secret --from-literal=ELASTIC_APM_SECRET_TOKEN=asecretpassword --namespace=kube-system
  1. 在你将部署应用程序的同一命名空间中创建 Secret。

如果你自己管理 APM Server,请参阅 密钥令牌,获取有关如何设置密钥令牌的说明。

如果你使用 ECK 设置 APM Server,则操作员会自动为你生成一个 {{APM-server-name}}-apm-token secret。

在大多数情况下,设置 APM Agent 从而检测你的应用程序就像安装一个库并添加几行代码一样简单。

选择你的应用程序的语言以获取详细信息

安装 Agent

为 Go 安装 APM Agent 包。

go get go.elastic.co/apm

检测你的应用程序

通过使用提供的检测模块之一或直接使用 tracer API 来检测你的 Go 应用程序。

import (
	"net/http"

	"go.elastic.co/apm/module/apmhttp"
)

func main() {
	mux := http.NewServeMux()
	...
	http.ListenAndServe(":8080", apmhttp.Wrap(mux))
}

配置 Agent

使用环境变量配置 Agent

# ...
- name: ELASTIC_APM_SERVER_URL
  value: "apm-server-url-goes-here"
- name: ELASTIC_APM_SECRET_TOKEN
  valueFrom:
    secretKeyRef:
      name: apm-secret
      key: ELASTIC_APM_SECRET_TOKEN
- name: ELASTIC_APM_SERVICE_NAME
  value: "service-name-goes-here"
  1. 默认为 http://localhost:8200
  2. 从先前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN
  3. 允许的字符:a-z、A-Z、0-9、-、_ 和空格

在 Agent 参考中了解更多信息

附加 Agent

Java Agent 可以在不更改应用程序镜像或代码的情况下检测受支持的技术。为此,你需要一个基于官方 Elastic APM Docker 镜像的 init container

在你的应用程序启动之前,将 Agent 从 init container 复制到共享卷中。例如,使用 Java Agent

# ...
spec:
  volumes:
  - name: elastic-apm-agent
    emptyDir: {}
  initContainers:
  - name: elastic-java-agent
    image: docker.elastic.co/observability/apm-agent-java:1.12.0
    volumeMounts:
    - mountPath: /elastic/apm/agent
      name: elastic-apm-agent
    command: ['cp', '-v', '/usr/agent/elastic-apm-agent.jar', '/elastic/apm/agent']
  1. 共享卷
  2. 从官方 Elastic Java Agent 镜像构建 initContainer
  3. 将 Agent 复制到共享卷

Java 命令行需要一种方法来获取此 javaagent 配置。你可以使用标准的 JVM TI JAVA_TOOL_OPTIONS 环境变量来执行此操作。它不必显式指定,并且在 JVM 启动时会自动获取。

提示

对于不支持此选项的 JVM,你可以使用任何其他环境变量 — 可以是启动脚本中已定义的变量,例如某些 servlet 容器脚本中的 JAVA_OPTS,也可以添加一个专用的空变量,如果未设置该变量,则不会产生任何影响。

# ...
containers:
- name: your-app-container
  env:
  # ...
  - name: JAVA_TOOL_OPTIONS
    value: -javaagent:/elastic/apm/agent/elastic-apm-agent.jar
  1. 用于命令行获取 javaagent 配置

配置 Agent

使用环境变量配置 Agent

# ...
- name: ELASTIC_APM_SERVER_URLS
  value: "apm-server-url-goes-here"
- name: ELASTIC_APM_SECRET_TOKEN
  valueFrom:
    secretKeyRef:
      name: apm-secret
      key: ELASTIC_APM_SECRET_TOKEN
- name: ELASTIC_APM_SERVICE_NAME
  value: "service-name-goes-here"
- name: ELASTIC_APM_APPLICATION_PACKAGES
  value: "org.springframework.samples.petclinic"
- name: JAVA_TOOL_OPTIONS
  value: -javaagent:/elastic/apm/agent/elastic-apm-agent.jar
  1. 默认为 http://localhost:8200
  2. 从先前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN
  3. 允许的字符:a-z、A-Z、0-9、-、_ 和空格
  4. 用于确定堆栈跟踪帧是应用内帧还是帧。
  5. 先前已解释

在 Agent 参考中了解更多信息

注意

这些说明适用于 .NET Core v2.2+。所有其他用例都需要从 NuGet 下载 Agent 并将其添加到你的应用程序。有关完整详细信息,请参阅设置 Agent。Agent 设置完成后,跳转到此页面上的 配置 Agent 部分。

使用 init container 下载并提取 Agent

.Net Agent 会自动检测 .NET Core 2.2 及更高版本,无需任何应用程序代码更改。为此,你需要一个 init container,它会提取并解压缩最新的 Agent 版本

# ...
spec:
  volumes:
  - name: elastic-apm-agent
    emptyDir: {}
  initContainers:
  - name: elastic-dotnet-agent
    image: busybox
    command: ["/bin/sh","-c"]
    args:
      - wget -qO './elastic-apm-agent/ElasticApmAgent.zip' https://github.com/elastic/apm-agent-dotnet/releases/download/1.7.0/ElasticApmAgent_1.7.0.zip;
        cd elastic-apm-agent;
        cat ElasticApmAgent.zip | busybox unzip -;
    volumeMounts:
    - mountPath: /elastic-apm-agent
      name: elastic-apm-agent
  1. 共享卷。
  2. 运行 shell 并执行提供的 args
  3. 获取最新的 apm-agent-dotnet 版本并将其保存到 elastic-apm-agent/ElasticApmAgent.zip。然后 cd 进入目录并解压缩该文件的内容。不要忘记使用你要使用的 Agent 版本更新此命令中的 GitHub URL。

要将 Agent 连接到你的应用程序,请将 DOTNET_STARTUP_HOOKS 环境变量指向现在位于 elastic-apm-agent 卷的 /elastic-apm-agent 目录中的 ElasticApmAgentStartupHook.dll 文件。

# ...
containers:
- name: your-app-container
  volumeMounts:
  - mountPath: /elastic-apm-agent
    name: elastic-apm-agent
  env:
  # ...
  - name: DOTNET_STARTUP_HOOKS
    value: "/elastic-apm-agent/ElasticApmAgentStartupHook.dll"

配置 Agent

使用环境变量配置 Agent

# ...
- name: ELASTIC_APM_SERVER_URLS
  value: "apm-server-url-goes-here"
- name: ELASTIC_APM_SECRET_TOKEN
  valueFrom:
    secretKeyRef:
      name: apm-secret
      key: ELASTIC_APM_SECRET_TOKEN
- name: ELASTIC_APM_SERVICE_NAME
  value: "service-name-goes-here"
- name: DOTNET_STARTUP_HOOKS
  value: "/elastic-apm-agent/ElasticApmAgentStartupHook.dll"
  1. 默认为 http://localhost:8200
  2. 从先前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN
  3. 允许的字符:a-z、A-Z、0-9、-、_ 和空格
  4. 先前已解释,仅在使用无代码检测方法时才需要。

在 Agent 参考中了解更多信息

安装 APM Agent

将 Node.js 的 APM Agent 作为你应用程序的依赖项安装。

npm install elastic-apm-node --save

启动 Agent

重要的是,在你在 Node.js 应用程序中需要任何其他模块之前(在 expresshttp 等之前)启动 Agent。

var apm = require('elastic-apm-node').start()

配置 Agent

使用环境变量配置 Agent

# ...
- name: ELASTIC_APM_SERVER_URL
  value: "apm-server-url-goes-here"
- name: ELASTIC_APM_SECRET_TOKEN
  valueFrom:
    secretKeyRef:
      name: apm-secret
      key: ELASTIC_APM_SECRET_TOKEN
- name: ELASTIC_APM_SERVICE_NAME
  value: "service-name-goes-here"
  1. 默认为 http://localhost:8200
  2. 从先前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN
  3. 如果未指定,则默认为 package.json 中的“name”字段。允许的字符:a-z、A-Z、0-9、-、_ 和空格

在 Agent 参考中了解更多信息

安装 Agent

使用 已发布的包之一安装 PHP Agent。

要使用 RPM 包(RHEL/CentOS 和 Fedora)

rpm -ivh <package-file>.rpm

要使用 DEB 包(Debian 和 Ubuntu)

dpkg -i <package-file>.deb

要使用 APK 包(Alpine)

apk add --allow-untrusted <package-file>.apk

如果你找不到你的发行版,你可以通过从源代码构建来安装 Agent。

配置 Agent

使用环境变量配置 Agent

# ...
- name: ELASTIC_APM_SERVER_URL
  value: "apm-server-url-goes-here"
- name: ELASTIC_APM_SECRET_TOKEN
  valueFrom:
    secretKeyRef:
      name: apm-secret
      key: ELASTIC_APM_SECRET_TOKEN
- name: ELASTIC_APM_SERVICE_NAME
  value: "service-name-goes-here"
  1. 默认为 http://localhost:8200
  2. 从先前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN
  3. 允许的字符:a-z、A-Z、0-9、-、_ 和空格

在 Agent 参考中了解更多信息

安装 APM Agent

将 Python 的 APM Agent 作为依赖项安装

# Django
pip install elastic-apm

# Flask
pip install elastic-apm[flask]

将 Agent 添加到你的应用程序

对于 Django,将 elasticapm.contrib.django 添加到你的设置中的 INSTALLED_APPS

INSTALLED_APPS = (
   # ...
   'elasticapm.contrib.django',
)

对于 Flask,使用环境变量初始化你的应用程序的 Agent

from elasticapm.contrib.flask import ElasticAPM

app = Flask(__name__)

apm = ElasticAPM(app)

配置 Agent

使用环境变量配置 Agent

# ...
- name: ELASTIC_APM_SERVER_URL
  value: "apm-server-url-goes-here"
- name: ELASTIC_APM_SECRET_TOKEN
  valueFrom:
    secretKeyRef:
      name: apm-secret
      key: ELASTIC_APM_SECRET_TOKEN
- name: ELASTIC_APM_SERVICE_NAME
  value: "service-name-goes-here"
  1. 默认为 http://localhost:8200
  2. 从先前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN
  3. 允许的字符:a-z、A-Z、0-9、-、_ 和空格

在 Agent 参考中了解更多信息

安装 APM Agent

将 Agent 添加到你的 Gemfile。

gem 'elastic-apm'

启动 Agent

Rails:当你的应用程序启动时,APM 将自动启动。

Rack:包含中间件并启动和停止 Elastic APM

# config.ru

app = lambda do |env|
  [200, {'Content-Type' => 'text/plain'}, ['ok']]
end

# Wraps all requests in transactions and reports exceptions
use ElasticAPM::Middleware

# Start an instance of the Agent
ElasticAPM.start()

run app

# Gracefully stop the agent when process exits.
# Makes sure any pending transactions have already sent.
at_exit { ElasticAPM.stop }

配置 Agent

使用环境变量配置 Agent

# ...
- name: ELASTIC_APM_SERVER_URL
  value: "apm-server-url-goes-here"
- name: ELASTIC_APM_SECRET_TOKEN
  valueFrom:
    secretKeyRef:
      name: apm-secret
      key: ELASTIC_APM_SECRET_TOKEN
- name: ELASTIC_APM_SERVICE_NAME
  value: "service-name-goes-here"
  1. 默认为 http://localhost:8200
  2. 从先前创建的 apm-secret 密钥库中传入 ELASTIC_APM_SECRET_TOKEN
  3. 允许的字符:a-z、A-Z、0-9、-、_ 和空格

在 Agent 参考中了解更多信息

在大多数情况下,APM Agent 会自动从容器内部读取 Kubernetes 数据并将其发送到 APM Server。如果不是这种情况,或者你希望覆盖此数据,你可以为 Agent 设置环境变量以进行读取。这些环境变量通过 Kubernetes Pod 规范中的 Downward API 设置

# ...
containers:
- name: your-app-container
  env:
  # ...
  - name: KUBERNETES_NODE_NAME
    valueFrom:
      fieldRef:
        fieldPath: spec.nodeName
  - name: KUBERNETES_POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  - name: KUBERNETES_NAMESPACE
    valueFrom:
      fieldRef:
        fieldPath: metadata.namespace
  - name: KUBERNETES_POD_UID
    valueFrom:
      fieldRef:
        fieldPath: metadata.uid

下表将这些环境变量映射到 APM 元数据事件字段

环境变量 元数据字段名称
KUBERNETES_NODE_NAME system.kubernetes.node.name
KUBERNETES_POD_NAME system.kubernetes.pod.name
KUBERNETES_NAMESPACE system.kubernetes.namespace
KUBERNETES_POD_UID system.kubernetes.pod.uid

APM Agent 与你的应用程序一起部署。

kubectl apply -f demo.yml

应用程序跟踪数据在 Service Inventory(服务清单) 中可用。要打开 Service Inventory(服务清单),请在主菜单中找到 Applications(应用程序),或者使用 全局搜索字段

Applications(应用程序) 应用程序允许你实时监控你的软件服务和应用程序:可视化你的服务的详细性能信息,识别和分析错误,并监控主机级别和 Agent 特定的指标,如 JVM 和 Go 运行时指标。

Applications UI Kubernetes

只需点击几下即可访问应用程序级别的见解,可以大大减少你花费在调试错误、响应时间慢和崩溃上的时间。

最重要的是,由于 Kubernetes 环境变量已映射到 APM 元数据事件,因此你可以按 Kubernetes namespacenode.namepod.namepod.uid 过滤你的跟踪数据。

Applications UI Kubernetes
  • 想要保护你的端点免受安全威胁?尝试 Elastic Security。添加端点保护只是你添加到 Agent 策略的另一个集成!
  • 你的眼睛是否因盯着一堵屏幕墙而感到模糊?创建警报,并在你一边品尝你最喜欢的泳池边饮料时了解问题。
  • 希望 Elastic 完成繁重的工作?使用机器学习来检测异常
© . All rights reserved.