15. 导出指标

按照设计,Linkerd 仅在较短的固定时间窗口(目前为 6 小时)内保留指标数据。 这意味着如果 Linkerd 的指标数据对您很有价值,您可能希望将其导出到成熟的指标存储中。

在内部,Linkerd 将其指标存储在作为 Viz 扩展的一部分运行的 Prometheus 实例中。 以下教程需要在启用 prometheus 的情况下安装 viz 扩展。 从 Linkerd 导出指标数据有几种基本方法:

使用 Prometheus federation API

如果您使用 Prometheus 作为您自己的指标存储,我们建议利用 Prometheusfederation API, 该 API 专为将数据从一个 Prometheus 复制到另一个的用例而设计。

只需将以下项目添加到 Prometheus 配置文件中的 scrape_configs (将 {{.Namespace}} 替换为运行 Linkerd Viz 扩展的命名空间):

- job_name: 'linkerd'
  kubernetes_sd_configs:
  - role: pod
    namespaces:
      names: ['{{.Namespace}}']

  relabel_configs:
  - source_labels:
    - __meta_kubernetes_pod_container_name
    action: keep
    regex: ^prometheus$

  honor_labels: true
  metrics_path: '/federate'

  params:
    'match[]':
      - '{job="linkerd-proxy"}'
      - '{job="linkerd-controller"}'

或者,如果您更喜欢使用 PrometheusServiceMonitors 来配置您的 Prometheus, 您可以使用此 ServiceMonitor YAML (将 {{.Namespace}} 替换为运行 Linkerd Viz 扩展的命名空间):

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: linkerd-prometheus
    release: monitoring
  name: linkerd-federate
  namespace: {{.Namespace}}
spec:
  endpoints:
  - interval: 30s
    scrapeTimeout: 30s
    params:
      match[]:
      - '{job="linkerd-proxy"}'
      - '{job="linkerd-controller"}'
    path: /federate
    port: admin-http
    honorLabels: true
    relabelings:
    - action: keep
      regex: '^prometheus$'
      sourceLabels:
      - '__meta_kubernetes_pod_container_name'
  jobLabel: app
  namespaceSelector:
    matchNames:
    - {{.Namespace}}
  selector:
    matchLabels:
      component: prometheus

就是这样!您的 Prometheus 集群现已配置为从 Linkerd 的 内部 Prometheus 实例联合 Linkerd 的指标。

一旦指标在您的 Prometheus 中, Linkerd代理指标将带有标签 job="linkerd-proxy"Linkerd控制平面指标将带有标签 job="linkerd-controller"。 有关特定指标和标签定义的更多信息,请查看代理指标

有关 Prometheus/federate 端点的更多信息, 请查看 Prometheus federation 文档

使用 Prometheus 集成

如果您不使用 Prometheus 作为您自己的长期数据存储, 您可以利用 Prometheus众多 集成 之一自动将 LinkerdPrometheus 实例中 的数据提取到您选择的数据存储中。有关详细信息,请参阅 Prometheus 文档。

通过 Prometheus 的 API 提取数据

如果 Prometheus federationPrometheus 集成都不适合您, 则可以调用 PrometheusAPILinkerd 中提取数据。

例如,您可以通过以下命令直接调用 federation API

curl -G \
  --data-urlencode 'match[]={job="linkerd-proxy"}' \
  --data-urlencode 'match[]={job="linkerd-controller"}' \
  http://prometheus.linkerd-viz.svc.cluster.local:9090/federate

/federate API 类似,Prometheus 提供了一个 JSON 查询 API 来检索所有指标:

curl http://prometheus.linkerd-viz.svc.cluster.local:9090/api/v1/query?query=request_total

直接从 Linkerd 代理收集数据

最后,如果您想完全避免 LinkerdPrometheus, 您可以直接在其 /metrics 端点上查询 Linkerd 代理。

例如,要从在 linkerd 命名空间中运行的单个 Linkerd 代理查看 /metrics

kubectl -n linkerd port-forward \
  $(kubectl -n linkerd get pods \
    -l linkerd.io/control-plane-ns=linkerd \
    -o jsonpath='{.items[0].metadata.name}') \
  4191:4191

然后:

curl localhost:4191/metrics

或者,linkerd diagnostics proxy-metrics 可用于检索给定工作负载代理指标