For the complete documentation index, see llms.txt. Markdown versions are available by appending .md to documentation URLs.

Monitor GCP Kubernetes Engine (GKE) Metrics

SigNoz Cloud - This page applies to SigNoz Cloud editions.
Self-Hosted Enterprise - This page applies to self-hosted SigNoz with an active license.

The Google Kubernetes Engine (GKE) integration brings cluster metrics (container CPU and memory utilization, container restarts, pod startup latency, pod and node network throughput, volume usage, and node health) into SigNoz, with a pre-built dashboard for the service.

GKE publishes its system metrics to Cloud Monitoring. SigNoz reads them through the OpenTelemetry Collector running in your GCP project.

Choose a setup method

Available now. You run the OpenTelemetry Collector in your own GCP project and add the GKE metrics to its configuration. You control which metrics are pulled and how often.

Complete the GCP integration setup once, then follow the steps on this page for each project that hosts the clusters you want to monitor.

Prerequisites

Before configuring this service, complete the shared GCP integration setup:

Step 1: Enable the service in SigNoz

  1. In SigNoz, go to Integrations > Google Cloud Platform.
  2. Select GCP Kubernetes Engine from the service list.
  3. Toggle Metric Collection on to activate the pre-built dashboard.
  4. Open the Data Collected tab and note the metrics listed there. These are the metrics the dashboard's panels query.

Step 2: Add the metrics to your Collector config

Open the otel-collector-config.yaml you created in Deploy the Collector and add the GKE metric names to the metrics_list of the googlecloudmonitoring receiver for the project your clusters run in. Only the metrics_list shown below changes; leave the rest of the file as is:

otel-collector-config.yaml
receivers:
  googlecloudmonitoring:
    project_id: "<monitored-project-id>"
    collection_interval: 300s   # 5 minutes; minimum is 60s
    metrics_list:
      # Container CPU and memory
      - metric_name: "kubernetes.io/container/cpu/limit_utilization"
      - metric_name: "kubernetes.io/container/cpu/request_utilization"
      - metric_name: "kubernetes.io/container/memory/limit_utilization"
      - metric_name: "kubernetes.io/container/memory/request_utilization"
      # Workload health
      - metric_name: "kubernetes.io/container/restart_count"
      - metric_name: "kubernetes.io/pod/latencies/pod_first_ready"
      # Pod network
      - metric_name: "kubernetes.io/pod/network/received_bytes_count"
      - metric_name: "kubernetes.io/pod/network/sent_bytes_count"
      # Storage
      - metric_name: "kubernetes.io/pod/volume/utilization"
      # Nodes
      - metric_name: "kubernetes.io/node/cpu/allocatable_utilization"
      - metric_name: "kubernetes.io/node/memory/allocatable_utilization"
      - metric_name: "kubernetes.io/node/ephemeral_storage/used_bytes"
      - metric_name: "kubernetes.io/node/ephemeral_storage/allocatable_bytes"
      - metric_name: "kubernetes.io/node/network/received_bytes_count"
      - metric_name: "kubernetes.io/node/network/sent_bytes_count"
      - metric_name: "kubernetes.io/node/status_condition"

Verify these values:

  • <monitored-project-id>: The GCP project that hosts your GKE clusters. It must be one of the entries in your Projects to Monitor list.

The receiver polls every metric in the list once per collection_interval, and the Monitoring API bills per read call, so keep the list to the metrics your dashboards and alerts actually use. This list is longer than most services, so it is the one to trim first if your Monitoring API bill matters. See Cost and tuning.

Step 3: Apply the configuration

The Collector loads its config from the signoz-collector-config secret, so a config change needs a new secret version and a redeploy:

  1. Save your updated otel-collector-config.yaml.
  2. Add a new secret version (step 2 of Deploy the Collector).
  3. Redeploy the Cloud Run service (step 3).

Validate

  1. Wait one or two collection intervals (up to about 5 minutes with the default 300s).
  2. In SigNoz, go to Dashboards and open the Kubernetes Engine dashboard. Panels should start filling in.
  3. To check a single metric, open Metrics Explorer and query kubernetes.io/container/cpu/limit_utilization.

What's collected

Metrics

See the Data Collected tab in the SigNoz integration for the definitive list the dashboard uses, and the GKE system metrics list for full definitions.

Metric nameUnitType
kubernetes.io/container/cpu/limit_utilizationRatioGauge
kubernetes.io/container/cpu/request_utilizationRatioGauge
kubernetes.io/container/memory/limit_utilizationRatioGauge
kubernetes.io/container/memory/request_utilizationRatioGauge
kubernetes.io/container/restart_countCountSum
kubernetes.io/pod/latencies/pod_first_readySecondsGauge
kubernetes.io/pod/network/received_bytes_countBytesSum
kubernetes.io/pod/network/sent_bytes_countBytesSum
kubernetes.io/pod/volume/utilizationRatioGauge
kubernetes.io/node/cpu/allocatable_utilizationRatioGauge
kubernetes.io/node/memory/allocatable_utilizationRatioGauge
kubernetes.io/node/ephemeral_storage/used_bytesBytesGauge
kubernetes.io/node/ephemeral_storage/allocatable_bytesBytesGauge
kubernetes.io/node/network/received_bytes_countBytesSum
kubernetes.io/node/network/sent_bytes_countBytesSum
kubernetes.io/node/status_conditionBoolGauge
Dashboard panels

The pre-built dashboard has 15 panels in five sections:

CPU and memory. Container resource pressure, each as a time series: % Container CPU Limit Utilization, % Container CPU Request Utilization, % Container Memory Limit Utilization, and % Container Memory Request Utilization. Usage against limit shows how close a container is to being throttled or OOM killed; usage against request shows how well the request is sized.

Workload health. Two tables: Container Restarts (total), which lists only containers that have restarted, and Pod First-Ready Latency, the time from pod creation to first Ready state.

Network. Pod Network Receive Throughput and Pod Network Sent Throughput, in bytes per second per pod.

Storage. % PVC Volume Utilization, PersistentVolumeClaim usage as a percentage of capacity.

Nodes (namespace agnostic). Six node-level panels: % Node CPU Allocatable Utilization, % Node Memory Allocatable Utilization, Node status conditions (a table filtered to unhealthy states), % Node Ephemeral Storage Utilization, Node Network Receive Throughput, and Node Network Sent Throughput.

Three single-select variables scope the panels: project_id, cluster_name, and namespace_name.

Pre-built dashboards are read-only. To customize one, use Export JSON from the dashboard menu and import it as a new dashboard.

Troubleshooting

A dashboard panel is empty. The metric backing that panel is missing from your metrics_list. Compare the Data Collected tab against your otel-collector-config.yaml, add what's missing, and repeat step 3.

No GKE metrics at all. Confirm the signoz-integration service account holds roles/monitoring.viewer on the project in project_id, and that the Cloud Monitoring API is enabled there. Then confirm system metrics collection is still enabled on the cluster, and check the Cloud Run logs for googlecloudmonitoring receiver errors.

The Container Restarts table is empty. That is the healthy state. The panel excludes containers with no restarts, so an empty table means nothing has restarted in the selected window.

Node panels ignore the namespace filter. Expected. Node metrics are not namespaced, so the filter cannot apply to them.

% PVC Volume Utilization is empty. pod/volume/utilization only reports for pods with a PersistentVolumeClaim. Workloads using only ephemeral storage produce no series here.

Limit utilization panels are empty for some workloads. limit_utilization is only reported for containers that set a CPU or memory limit. Containers with no limit set have nothing to divide by, so they are absent from those panels. The request panels behave the same way for containers with no request.

Next steps

  • Create alerts on container restart spikes, CPU or memory utilization approaching the limit, node status conditions turning unhealthy, or PVCs nearing capacity.
  • Build custom dashboards to correlate cluster saturation with traces from the services running on it.
  • Instrument the workloads themselves so pod-level pressure can be tied to request latency and errors.

Get Help

If you need help with the steps in this topic, please reach out to us on SigNoz Community Slack. If you are a SigNoz Cloud user, please use in product chat support located at the bottom right corner of your SigNoz instance or contact us at cloud-support@signoz.io.

Is this page helpful

Last updated—August 18, 2026

Edit on GitHub