7.2. Serverless 开发人员指标

指标 (metrics) 使开发人员能够监控 Knative 服务的运行情况。您可以使用 OpenShift Container Platform 监控堆栈记录并查看 Knative 服务的健康检查和指标。

您可以通过在 OpenShift Container Platform Web 控制台 Developer 视角中导航到 Dashboards 来查看 OpenShift Serverless 的不同指标。

警告

如果使用 mTLS 启用 Service Mesh,则 Knative Serving 的指标会被默认禁用,因为 Service Mesh 会防止 Prometheus 提取指标。

有关解决这个问题的详情,请参阅在使用带有 mTLS 的 Service Mesh 时启用 Knative Serving 指标

提取指标不会影响 Knative 服务的自动扩展,因为提取请求不会通过激活器。因此,如果没有 pod 正在运行,则不会进行提取。

7.2.1. Knative 服务指标默认公开

表 7.1. 在端口 9090 上为每个 Knative 服务公开的指标

指标名称、单元和类型描述指标标签

queue_requests_per_second

指标单元:无维度

指标类型:量表

每秒到达队列代理的请求数。

公式: stats.RequestCount / r.reportingPeriodSeconds

stats.RequestCount 直接从给定报告持续时间的网络 pkg stats 中计算。

destination_configuration="event-display", destination_namespace="pingsource1", destination_pod="event-display-00001-deployment-6b455479cb-75p6w", destination_revision="event-display-00001"

queue_proxied_operations_per_second

指标单元:无维度

指标类型:量表

每秒代理请求数.

公式: stats.ProxiedRequestCount / r.reportingPeriodSeconds

stats.ProxiedRequestCount 直接从给定报告持续时间的网络 pkg stats 中计算。

 

queue_average_concurrent_requests

指标单元:无维度

指标类型:量表

此 pod 当前处理的请求数。

在网络 pkg 侧计算平均并发,如下所示:

  • 当发生 req 更改时,将计算更改之间的时间传送时间。根据结果,计算超过 delta 的当前并发数,并添加到当前计算的并发数。此外,还保留了 deltas 的总和。

    增量型的当前并发性计算如下:

    global_concurrency delta

  • 每次完成报告时,都会重置总和和当前计算的并发性。
  • 在报告平均并发时,当前计算的并发性被除以 deltas 的总和。
  • 当一个新请求进入时,全局并发计数器会增加。当请求完成后,计数器会减少。

destination_configuration="event-display", destination_namespace="pingsource1", destination_pod="event-display-00001-deployment-6b455479cb-75p6w", destination_revision="event-display-00001"

queue_average_proxied_concurrent_requests

指标单元:无维度

指标类型:量表

当前由此 pod 处理的代理请求数:

stats.AverageProxiedConcurrency

destination_configuration="event-display", destination_namespace="pingsource1", destination_pod="event-display-00001-deployment-6b455479cb-75p6w", destination_revision="event-display-00001"

process_uptime

指标单元: 秒

指标类型:量表

进程启动的秒数。

destination_configuration="event-display", destination_namespace="pingsource1", destination_pod="event-display-00001-deployment-6b455479cb-75p6w", destination_revision="event-display-00001"

表 7.2. 在端口 9091 上为每个 Knative 服务公开的指标

指标名称、单元和类型描述指标标签

request_count

指标单元:无维度

指标类型:计数器

路由到 queue-proxy 的请求数。

configuration_name="event-display", container_name="queue-proxy", namespace_name="apiserversource1", pod_name="event-display-00001-deployment-658fd4f9cf-qcnr5", response_code="200", response_code_class="2xx", revision_name="event-display-00001", service_name="event-display"

request_latencies

指标单元:毫秒

指标类型:togram

以毫秒为单位的响应时间。

configuration_name="event-display", container_name="queue-proxy", namespace_name="apiserversource1", pod_name="event-display-00001-deployment-658fd4f9cf-qcnr5", response_code="200", response_code_class="2xx", revision_name="event-display-00001", service_name="event-display"

app_request_count

指标单元:无维度

指标类型:计数器

路由到 user-container 的请求数。

configuration_name="event-display", container_name="queue-proxy", namespace_name="apiserversource1", pod_name="event-display-00001-deployment-658fd4f9cf-qcnr5", response_code="200", response_code_class="2xx", revision_name="event-display-00001", service_name="event-display"

app_request_latencies

指标单元:毫秒

指标类型:togram

以毫秒为单位的响应时间。

configuration_name="event-display", container_name="queue-proxy", namespace_name="apiserversource1", pod_name="event-display-00001-deployment-658fd4f9cf-qcnr5", response_code="200", response_code_class="2xx", revision_name="event-display-00001", service_name="event-display"

queue_depth

指标单元:无维度

指标类型:量表

服务和等待队列中的当前项目数,或者如果无限并发,则不报告。使用 breaker.inFlight

configuration_name="event-display", container_name="queue-proxy", namespace_name="apiserversource1", pod_name="event-display-00001-deployment-658fd4f9cf-qcnr5", response_code="200", response_code_class="2xx", revision_name="event-display-00001", service_name="event-display"

7.2.2. 带有自定义应用程序指标的 Knative 服务

您可以扩展 Knative 服务导出的指标集合。具体的实施取决于您的应用和使用的语言。

以下列表实施了一个 Go 应用示例,它导出处理的事件计数自定义指标。

package main

import (
  "fmt"
  "log"
  "net/http"
  "os"

  "github.com/prometheus/client_golang/prometheus" 1
  "github.com/prometheus/client_golang/prometheus/promauto"
  "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
  opsProcessed = promauto.NewCounter(prometheus.CounterOpts{ 2
     Name: "myapp_processed_ops_total",
     Help: "The total number of processed events",
  })
)


func handler(w http.ResponseWriter, r *http.Request) {
  log.Print("helloworld: received a request")
  target := os.Getenv("TARGET")
  if target == "" {
     target = "World"
  }
  fmt.Fprintf(w, "Hello %s!\n", target)
  opsProcessed.Inc() 3
}

func main() {
  log.Print("helloworld: starting server...")

  port := os.Getenv("PORT")
  if port == "" {
     port = "8080"
  }

  http.HandleFunc("/", handler)

  // Separate server for metrics requests
  go func() { 4
     mux := http.NewServeMux()
     server := &http.Server{
        Addr: fmt.Sprintf(":%s", "9095"),
        Handler: mux,
     }
     mux.Handle("/metrics", promhttp.Handler())
     log.Printf("prometheus: listening on port %s", 9095)
     log.Fatal(server.ListenAndServe())
  }()

   // Use same port as normal requests for metrics
  //http.Handle("/metrics", promhttp.Handler()) 5
  log.Printf("helloworld: listening on port %s", port)
  log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}
1
包含 Prometheus 软件包。
2
定义 opsProcessed 指标。
3
递增 opsProcessed 指标。
4
将配置为将单独的服务器用于指标请求.
5
将配置为使用与指标和指标子路径正常请求相同的端口。

7.2.3. 配置提取自定义指标

自定义指标提取由专门用于用户工作负载监控的 Prometheus 实例执行。启用用户工作负载监控并创建应用程序后,您需要一个配置来定义监控堆栈提取指标的方式。

以下示例配置为您的应用程序定义了 ksvc 并配置服务监控器。确切的配置取决于您的应用程序以及它如何导出指标。

apiVersion: serving.knative.dev/v1 1
kind: Service
metadata:
  name: helloworld-go
spec:
  template:
    metadata:
      labels:
        app: helloworld-go
      annotations:
    spec:
      containers:
      - image: docker.io/skonto/helloworld-go:metrics
        resources:
          requests:
            cpu: "200m"
        env:
        - name: TARGET
          value: "Go Sample v1"
---
apiVersion: monitoring.coreos.com/v1 2
kind: ServiceMonitor
metadata:
  labels:
  name: helloworld-go-sm
spec:
  endpoints:
  - port: queue-proxy-metrics
    scheme: http
  - port: app-metrics
    scheme: http
  namespaceSelector: {}
  selector:
    matchLabels:
       name:  helloworld-go-sm
---
apiVersion: v1 3
kind: Service
metadata:
  labels:
    name:  helloworld-go-sm
  name:  helloworld-go-sm
spec:
  ports:
  - name: queue-proxy-metrics
    port: 9091
    protocol: TCP
    targetPort: 9091
  - name: app-metrics
    port: 9095
    protocol: TCP
    targetPort: 9095
  selector:
    serving.knative.dev/service: helloworld-go
  type: ClusterIP
1
应用程序规格。
2
配置提取应用程序的指标。
3
提取指标的方式的配置。

7.2.4. 检查服务的指标

在将应用配置为导出指标和监控堆栈以提取它们后,您可以在 web 控制台中查看指标数据。

先决条件

  • 已登陆到 OpenShift Container Platform Web 控制台。
  • 安装了 OpenShift Serverless Operator 和 Knative Serving。

流程

  1. 可选:针对应用程序运行请求,您可以在指标中看到:

    $ hello_route=$(oc get ksvc helloworld-go -n ns1 -o jsonpath='{.status.url}') && \
        curl $hello_route

    输出示例

    Hello Go Sample v1!

  2. 在 Web 控制台中,进入到 MonitoringMetrics 界面。
  3. 在输入字段中,输入您要观察到的指标的查询,例如:

    revision_app_request_count{namespace="ns1", job="helloworld-go-sm"}

    另一个示例:

    myapp_processed_ops_total{namespace="ns1", job="helloworld-go-sm"}
  4. 观察视觉化的指标:

    观察服务的指标
    观察服务的指标

7.2.4.1. 队列代理指标

每个 Knative 服务都有一个代理容器,用于代理到应用程序容器的连接。报告多个用于队列代理性能的指标。

您可以使用以下指标来测量请求是否排入代理端,并在应用一侧服务请求的实际延迟。

指标名称描述类型Tags单位

revision_request_count

路由到 queue-proxy pod 的请求数。

计数

configuration_name, container_name, namespace_name, pod_name, response_code, response_code_class, revision_name, service_name

整数(无单位)

revision_request_latencies

修订请求的响应时间。

Histogram

configuration_name, container_name, namespace_name, pod_name, response_code, response_code_class, revision_name, service_name

Milliseconds

revision_app_request_count

路由到 user-container 容器集的请求数。

计数

configuration_name, container_name, namespace_name, pod_name, response_code, response_code_class, revision_name, service_name

整数(无单位)

revision_app_request_latencies

修订应用程序请求的响应时间。

Histogram

configuration_name, namespace_name, pod_name, response_code, response_code_class, revision_name, service_name

Milliseconds

revision_queue_depth

当前在 servingwaiting 队列中的项的数量。如果配置了无限并发,则不会报告此指标。

量表

configuration_name, event-display, container_name, namespace_name, pod_name, response_code_class, revision_name, service_name

整数(无单位)

7.2.5. 在仪表板中检查服务的指标

您可以使用专用的仪表板来按命名空间聚合队列代理指标,以检查指标。

先决条件

  • 已登陆到 OpenShift Container Platform Web 控制台。
  • 安装了 OpenShift Serverless Operator 和 Knative Serving。

流程

  1. 在 Web 控制台中,进入到 MonitoringMetrics 界面。
  2. 选择 Knative User Services(Queue Proxy metrics) 仪表板。
  3. 选择与应用程序对应的 NamespaceConfigurationRevision
  4. 观察视觉化的指标:

    使用仪表板来观察服务的指标

7.2.6. 其他资源