Kubernetes Monitoring

Cluster, workload, and span in one view

Install one Helm chart. Kubelet, host, and kube-state metrics flow in over OTLP. The OpenTelemetry Operator injects pod identity into every span your apps emit, so a slow request lands you on the exact replica that served it.

In motion

The pod underneath the slow span.

Drop a Helm chart on your cluster. Kubelet, host, and kube-state metrics start flowing in. Every span your apps emit arrives carrying pod, node, and namespace, so a slow request lands you on the exact replica that served it.

pod heatmap · 192 pods · cluster cpu 44% LIVE
PODS 192
RUNNING 184
DEGRADED 6
FAILING 2
HOT >78% 11
default default 72
observability obs 32
kube-system kube-sys 40
ingress-nginx ingress 24
data data 24
CPU
0% 100% degraded failing

Cluster console

Workloads, pods, and nodes — one filter sidebar

The same view your platform team lives in. Facet down to a deployment in a namespace on a node, or scope to a cluster and watch it live.

cluster: prod-us-east-1 LIVE
infra › kubernetes › workloads
Last 12 hours Reload Live 10s
Nodes 12
Workloads 8
Cluster CPU 42%
Cluster MEM 54%

Workloads

Aggregated pod metrics by deployment, statefulset, and daemonset.

Deployment StatefulSet DaemonSet
Namespace Workload Kind Ready CPU Memory Node
default api-gateway Deployment 3/3
47%
62%
ip-10-0-1-12
default order-service Deployment 4/4
71%
51%
ip-10-0-1-44
default checkout-worker StatefulSet 2/2
23%
38%
ip-10-0-2-08
observability otel-collector DaemonSet 6/6
39%
48%
per-node
default payment-svc Deployment 2/3
86%
67%
ip-10-0-1-44
default inventory-svc Deployment 3/3
34%
49%
ip-10-0-2-08
kube-system coredns Deployment 2/2
12%
21%
ip-10-0-1-12
ingress-nginx nginx-ingress DaemonSet 3/3
28%
33%
per-node

Three views

Pods, nodes, and workloads — first-class

Same filters everywhere. Click through from a workload to its pods to the node that runs them.

/infra/kubernetes/pods 200 pods

Pods

Per-pod CPU and memory — against requests and limits.

Pod CPU req CPU lim Mem lim
otel-gateway-5988fb47f… ns observability 147% 37% 30%
prd-artifacts-api-6688… ns default 0% 52% 10%
prd-warpstream-5bb84bb… ns warpstream 42% 42% 35%
prd-enrichment-api-769… ns default 0% 34% 21%
/infra/kubernetes/nodes 3 nodes

Nodes

Kubelet stats per node, with uptime and lifecycle.

Node Status CPU Last seen
i-0ef7f77feb3e0a3eb Active 3.00 14s ago
i-0293a9e7e2bac82a4 Active 2.65 30s ago
i-0a8c19f2d4e7b15c1 Active 1.84 22s ago
 
/infra/kubernetes/workloads 21 workloads

Workloads

Aggregated by deployment, statefulset, daemonset.

Workload Pods Avg CPU NS
api-gateway 3 47% default
order-service 4 71% default
payment-svc 2 86% default
inventory-svc 3 34% default

Span → pod

From a slow span to the exact pod

The OpenTelemetry Operator stamps every span with k8s.pod.name, k8s.node.name, and k8s.namespace.name at admission. The slow trace already knows where it ran.

Trace: 7af1c204 1.18s

Waterfall

api-gateway
POST /checkout
1.18s
order-service
createOrder
425ms
payment-svc
processPayment
612ms
inventory-svc
reserveItems
98ms
Pod attribution Active

pod

payment-svc-78f4d6c89b-x7k2p

k8s.pod.name
payment-svc-78f4d6c89b-x7k2p
k8s.node.name
ip-10-0-1-44.ec2.internal
k8s.namespace.name
default

One Helm chart

Drop it on your cluster

Read the chart end-to-end. Three commands and the cluster is reporting kubelet, host, and kube-state metrics over OTLP.

helm install maple-k8s-infra 3 steps
1 Create the ingest-key secret
kubectl create namespace maple
kubectl -n maple create secret generic maple-ingest-key \
  --from-literal=ingest-key=$MAPLE_INGEST_KEY
2 Install the chart
helm upgrade --install maple-k8s-infra \
  oci://ghcr.io/makisuo/charts/maple-k8s-infra \
  --namespace maple \
  --set maple.ingestKey.existingSecret.name=maple-ingest-key \
  --set maple.ingestKey.existingSecret.key=ingest-key \
  --set global.clusterName=production
3 Watch the rollout
kubectl -n maple rollout status daemonset/maple-k8s-infra-agent

What it does

Cluster and application, one pipeline

helm install
Helm chart, not a black box
maple-k8s-infra is a small Helm chart you can read end-to-end. Kubelet stats per pod, host metrics per node, kube-state metrics across the cluster. OTLP receivers on every node for your apps.
k8s.pod.name
Pod and span, joined
Spans arrive carrying k8s.pod.name, k8s.node.name, and k8s.namespace.name. Drill from a slow trace straight to the pod and node that ran it.
kube-state
Kube-state metrics
Deployments, StatefulSets, DaemonSets, replica counts, and pod phase, all scraped via the standard kube-state-metrics exporter.
/infra/kubernetes
Workloads, pods, and nodes
Three first-class infrastructure views in the dashboard. Inspect a deployment, a single pod, or a single node, with the same filters you use everywhere else.
OTel Operator
OpenTelemetry Operator
Pods get OTEL_EXPORTER_OTLP_ENDPOINT and pod/node identity injected at admission. Apps with an OTel SDK linked are instrumented without code changes.
one endpoint
Multi-cluster ingest
One ingest endpoint per organization. Send from prod, staging, and a developer's kind cluster, and split them with cluster-name resource attributes.

Keep going

Surfaces that share this data

Point OTLP at Maple.

One endpoint, one key. Traces, logs, metrics and sessions land on the same trace id from the first request.