收集 Prometheus 指标
您可以配置 Alloy 来收集 Prometheus 指标,并将其转发到任何 Prometheus 兼容的数据库。
本主题介绍如何:
- 配置指标投递。
- 从 Kubernetes Pods 收集指标。
本主题中使用的组件
开始之前
- 确保您对使用 Prometheus 埋点应用有基本的了解。
- 准备一组 Prometheus exporter 或暴露 Prometheus 指标的应用,您想要从它们收集指标。
- 确定写入收集到的指标的位置。指标可以写入 Prometheus 或 Prometheus 兼容的端点,如 Grafana Mimir、Grafana Cloud 或 Grafana Enterprise Metrics。
- 熟悉 Alloy 中的组件概念。
配置指标投递
在组件收集 Prometheus 指标之前,您必须有一个负责将这些指标写入某个位置的组件。
prometheus.remote_write
组件负责将 Prometheus 指标投递到一个或多个 Prometheus 兼容的端点。定义 prometheus.remote_write
组件后,您可以使用其他 Alloy 组件将指标转发给它。
要配置用于指标投递的 prometheus.remote_write
组件,请完成以下步骤:
将以下
prometheus.remote_write
组件添加到您的配置文件中。prometheus.remote_write "<LABEL>" { endpoint { url = "<PROMETHEUS_URL>" } }
替换以下内容:
<LABEL>
:组件的标签,例如default
。您使用的标签在同一配置文件中的所有prometheus.remote_write
组件中必须是唯一的。<PROMETHEUS_URL>
指标发送到的 Prometheus 兼容端点的完整 URL,例如 Prometheus 的https://prometheus-us-central1.grafana.net/api/v1/write
或 Mimir 的https://mimir-us-central1.grafana.net/api/v1/push/
。端点 URL 取决于您使用的数据库。
如果您的端点需要基本身份验证,请将以下内容粘贴到
endpoint
块中。basic_auth { username = "<USERNAME>" password = "<PASSWORD>" }
替换以下内容:
<USERNAME>
:基本身份验证的用户名。<PASSWORD>
:基本身份验证的密码或 API 密钥。
如果您有多个要写入指标的端点,请为其他端点重复
endpoint
块。
以下示例演示了如何配置包含多个端点、混合使用基本身份验证以及将指标转发到其中的 prometheus.remote_write
组件和 prometheus.scrape
组件。
prometheus.remote_write "default" {
endpoint {
url = "https://:9009/api/prom/push"
}
endpoint {
url = "https://prometheus-us-central1.grafana.net/api/prom/push"
// Get basic authentication based on environment variables.
basic_auth {
username = sys.env("<REMOTE_WRITE_USERNAME>")
password = sys.env("<REMOTE_WRITE_PASSWORD>")
}
}
}
prometheus.scrape "example" {
// Collect metrics from the default listen address.
targets = [{
__address__ = "127.0.0.1:12345",
}]
forward_to = [prometheus.remote_write.default.receiver]
}
有关配置指标投递的更多信息,请参阅prometheus.remote_write。
从 Kubernetes Pods 收集指标
Alloy 可以通过以下方式配置从 Kubernetes Pods 收集指标:
- 发现要收集指标的 Kubernetes Pods。
- 从发现的 Pods 收集指标。
要从 Kubernetes Pods 收集指标,请完成以下步骤:
遵循配置指标投递,确保收集到的指标可以写入某个位置。
发现 Kubernetes Pods
将以下
discovery.kubernetes
组件添加到您的配置文件中,以发现集群中所有命名空间中的每个 Pod。discovery.kubernetes "<DISCOVERY_LABEL>" { role = "pod" }
替换以下内容:
<DISCOVERY_LABEL>
:组件的标签,例如pods
。您使用的标签在同一配置文件中的所有discovery.kubernetes
组件中必须是唯一的。
这将为每个发现的 Pod 上的每个暴露的端口生成一个 Prometheus 目标。
要限制发现 Pod 的命名空间,请在
discovery.kubernetes
组件内添加以下块。namespaces { own_namespace = true names = [<NAMESPACE_NAMES>] }
替换以下内容:
<NAMESPACE_NAMES>
:一个逗号分隔的字符串列表,表示要搜索的命名空间。每个字符串必须用双引号括起来。例如,"default","kube-system"
。
如果您不想在 Alloy 运行的命名空间中搜索 Pods,请将
own_namespace
设置为false
。要使用字段选择器来限制发现的 Pods 数量,请在
discovery.kubernetes
组件内添加以下块。selectors { role = "pod" field = "<FIELD_SELECTOR>" }
替换以下内容:
<FIELD_SELECTOR>
:要使用的 Kubernetes 字段选择器,例如metadata.name=my-service
。有关字段选择器的更多信息,请参阅 Kubernetes 文档中的字段选择器。
为您想要应用的每个字段选择器创建额外的
selectors
块。要使用标签选择器来限制发现的 Pods 数量,请在
discovery.kubernetes
组件内添加以下块。selectors { role = "pod" label = "LABEL_SELECTOR" }
替换以下内容:
<LABEL_SELECTOR>
:Kubernetes 标签选择器,例如environment in (production, qa)
。有关标签选择器的更多信息,请参阅 Kubernetes 文档中的标签和选择器。
为您想要应用的每个标签选择器创建额外的
selectors
块。
从发现的 Pods 收集指标
将以下
prometheus.scrape
组件添加到您的配置文件中。prometheus.scrape "<SCRAPE_LABEL>" { targets = discovery.kubernetes.<DISCOVERY_LABEL>.targets forward_to = [prometheus.remote_write.<REMOTE_WRITE_LABEL>.receiver] }
替换以下内容:
<SCRAPE_LABEL>
:组件的标签,例如pods
。您使用的标签在同一配置文件中的所有prometheus.scrape
组件中必须是唯一的。<DISCOVERY_LABEL>
:discovery.kubernetes
组件的标签。<REMOTE_WRITE_LABEL>
:您的prometheus.remote_write
组件的标签。
以下示例演示了如何配置 Alloy 从 default
命名空间中运行的生产 Kubernetes Pods 收集指标。
discovery.kubernetes "pods" {
role = "pod"
namespaces {
own_namespace = false
names = ["default"]
}
selectors {
role = "pod"
label = "environment in (production)"
}
}
prometheus.scrape "pods" {
targets = discovery.kubernetes.pods.targets
forward_to = [prometheus.remote_write.default.receiver]
}
prometheus.remote_write "default" {
endpoint {
url = "https://:9009/api/prom/push"
}
}
有关配置 Kubernetes 服务投递和收集指标的更多信息,请参阅 discovery.kubernetes
和 prometheus.scrape
。
从 Kubernetes Services 收集指标
您可以配置 Alloy 来收集 Kubernetes Services 的指标,通过:
- 发现要收集指标的 Kubernetes Services。
- 从发现的 Services 收集指标。
要从 Kubernetes Services 收集指标,请完成以下步骤。
遵循配置指标投递,确保收集到的指标可以写入某个位置。
发现 Kubernetes Services
将以下
discovery.kubernetes
组件添加到您的配置文件中,以发现集群中所有命名空间中的每个 Service。discovery.kubernetes "<DISCOVERY_LABEL>" { role = "service" }
替换以下内容:
<DISCOVERY_LABEL>
:组件的标签,例如services
。您使用的标签在同一配置文件中的所有discovery.kubernetes
组件中必须是唯一的。
这将为每个发现的 Service 上的每个暴露的端口生成一个 Prometheus 目标。
要限制发现 Service 的命名空间,请在
discovery.kubernetes
组件内添加以下块。namespaces { own_namespace = true names = [<NAMESPACE_NAMES>] }
替换以下内容:
<NAMESPACE_NAMES>
:一个逗号分隔的字符串列表,表示要搜索的命名空间。每个字符串必须用双引号括起来。例如,"default","kube-system"
。
如果您不想在 Alloy 运行的命名空间中搜索 Services,请将
own_namespace
设置为false
。要使用字段选择器来限制发现的 Services 数量,请在
discovery.kubernetes
组件内添加以下块。selectors { role = "service" field = "<FIELD_SELECTOR>" }
替换以下内容:
<FIELD_SELECTOR>
:Kubernetes 字段选择器,例如metadata.name=my-service
。有关字段选择器的更多信息,请参阅 Kubernetes 文档中的字段选择器。
为您想要应用的每个字段选择器创建额外的
selectors
块。要使用标签选择器来限制发现的 Services 数量,请在
discovery.kubernetes
组件内添加以下块。selectors { role = "service" label = "<LABEL_SELECTOR>" }
替换以下内容:
<LABEL_SELECTOR>
:Kubernetes 标签选择器,例如environment in (production, qa)
。有关标签选择器的更多信息,请参阅 Kubernetes 文档中的标签和选择器。
为您想要应用的每个标签选择器创建额外的
selectors
块。
从发现的 Services 收集指标
将以下
prometheus.scrape
组件添加到您的配置文件中。prometheus.scrape "<SCRAPE_LABEL>" { targets = discovery.kubernetes.<DISCOVERY_LABEL>.targets forward_to = [prometheus.remote_write.<REMOTE_WRITE_LABEL>.receiver] }
替换以下内容:
<SCRAPE_LABEL>
:组件的标签,例如services
。您使用的标签在同一配置文件中的所有prometeus.scrape
组件中必须是唯一的。<DISCOVERY_LABEL>
:discovery.kubernetes
组件的标签。<REMOTE_WRITE_LABEL>
:您的prometheus.remote_write
组件的标签。
以下示例演示了如何配置 Alloy 从 default
命名空间中运行的生产 Kubernetes Services 收集指标。
discovery.kubernetes "services" {
role = "service"
namespaces {
own_namespace = false
names = ["default"]
}
selectors {
role = "service"
label = "environment in (production)"
}
}
prometheus.scrape "services" {
targets = discovery.kubernetes.services.targets
forward_to = [prometheus.remote_write.default.receiver]
}
prometheus.remote_write "default" {
endpoint {
url = "https://:9009/api/prom/push"
}
}
有关配置 Kubernetes 服务投递和收集指标的更多信息,请参阅 discovery.kubernetes
和 prometheus.scrape
。
从自定义目标收集指标
您可以配置 Alloy 从一组自定义目标收集指标,而无需进行服务发现。
要从一组自定义目标收集指标,请完成以下步骤。
遵循配置指标投递,确保收集到的指标可以写入某个位置。
将以下
prometheus.scrape
组件添加到您的配置文件中。prometheus.scrape "<SCRAPE_LABEL>" { targets = [<TARGET_LIST>] forward_to = [prometheus.remote_write.<REMOTE_WRITE_LABEL>.receiver] }
替换以下内容:
_
<SCRAPE_LABEL>
:组件的标签,例如custom_targets
。您使用的标签在同一配置文件中的所有prometheus.scrape
组件中必须是唯一的。<TARGET_LIST>
:一个逗号分隔的对象列表,表示 Prometheus 目标。每个对象必须符合以下规则:- 必须有一个
__address__
键,表示要收集指标的目标的HOST:PORT
。 - 要明确指定要使用的协议,请将
__scheme__
键设置为"http"
或"https"
。如果未提供__scheme__
键,则使用的协议继承自prometheus.scrape
组件的设置。默认值为"http"
。 - 要明确指定要收集指标的 HTTP 路径,请将
__metrics_path__
键设置为要使用的 HTTP 路径。如果未提供__metrics_path__
键,则使用的路径继承自prometheus.scrape
组件的设置。默认值为"/metrics"
。 - 根据需要添加其他键,以便为收集到的指标注入额外的标签。任何以双下划线(
__
)开头的标签在抓取之前都会被删除。
- 必须有一个
<REMOTE_WRITE_LABEL>
:您的prometheus.remote_write
组件的标签。
以下示例演示了如何配置 prometheus.scrape
从一组自定义端点收集指标。
prometheus.scrape "custom_targets" {
targets = [
{
__address__ = "prometheus:9090",
},
{
__address__ = "mimir:8080",
__scheme__ = "https",
},
{
__address__ = "custom-application:80",
__metrics_path__ = "/custom-metrics–path",
},
{
__address__ = "alloy:12345",
application = "alloy",
environment = "production",
},
]
forward_to = [prometheus.remote_write.default.receiver]
}
prometheus.remote_write "default" {
endpoint {
url = "https://:9009/api/prom/push"
}
}