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.
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.
Aggregated pod metrics by deployment, statefulset, and daemonset.
| Namespace | Workload | Kind | Ready | CPU | Memory | Node |
|---|---|---|---|---|---|---|
| default | api-gateway | Deployment | 3/3 | ip-10-0-1-12 | ||
| default | order-service | Deployment | 4/4 | ip-10-0-1-44 | ||
| default | checkout-worker | StatefulSet | 2/2 | ip-10-0-2-08 | ||
| observability | otel-collector | DaemonSet | 6/6 | per-node | ||
| default | payment-svc | Deployment | 2/3 ⟳ | ip-10-0-1-44 | ||
| default | inventory-svc | Deployment | 3/3 | ip-10-0-2-08 | ||
| kube-system | coredns | Deployment | 2/2 | ip-10-0-1-12 | ||
| ingress-nginx | nginx-ingress | DaemonSet | 3/3 | per-node |
Same filters everywhere. Click through from a workload to its pods to the node that runs them.
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% |
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 |
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 |
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.
Read the chart end-to-end. Three commands and the cluster is reporting kubelet, host, and kube-state metrics over OTLP.
kubectl create namespace maple
kubectl -n maple create secret generic maple-ingest-key \
--from-literal=ingest-key=$MAPLE_INGEST_KEY 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 kubectl -n maple rollout status daemonset/maple-k8s-infra-agent 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.
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.
Deployments, StatefulSets, DaemonSets, replica counts, and pod phase, all scraped via the standard kube-state-metrics exporter.
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.
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 ingest endpoint per organization. Send from prod, staging, and a developer's kind cluster, and split them with cluster-name resource attributes.
Start sending traces, logs, and metrics in under five minutes.
maple.dev — observability, simplified