Hosts and Kubernetes
Send host and Kubernetes metrics with the OpenTelemetry Collector, and see hosts, nodes, workloads, and pods with restarts and OOM kills.
WizeLens has no agent of its own. The standard OpenTelemetry Collector (the contrib build) reads your hosts and your
cluster and sends OTLP to a hub or to WizeLens Cloud. The recipe is in the repository:
a Helm chart for Kubernetes, and one config file for a plain host.
Kubernetes
The chart is in deploy/helm/wizelens-collector.
It runs two collectors:
| Collector | Runs as | Reads |
|---|---|---|
| Agent | DaemonSet, one per node | Node, pod, and container usage from the kubelet (kubeletstats), the node's own CPU, memory, disks, and network (hostmetrics), and OTLP from apps on that node |
| Cluster | Deployment, one replica | Pod phases, restarts, last exit reasons, node conditions, and workload desired and ready counts (k8s_cluster) |
Both add pod, namespace, node, and workload names (k8sattributes), and send to one endpoint.
git clone https://github.com/brandonkorous/wizelens
helm install wizelens-collector ./wizelens/deploy/helm/wizelens-collector \
--namespace wizelens --create-namespace \
--set endpoint=https://app.wizelens.com \
--set ingestKey=wl_ik_... \
--set clusterName=prod
For a hub, set endpoint to its address (for example http://wizelens-hub.wizelens:5960) and ingestKey to the hub's
--token, or leave it empty when the hub has none.
| Value | What it does |
|---|---|
endpoint |
Where to send. The collector adds /v1/metrics, /v1/traces, and /v1/logs. |
ingestKey |
A cloud ingest key, or the hub's token. |
existingSecret.name, existingSecret.key |
Read the key from a Secret you made instead. |
clusterName |
Shown as the cluster on every node, pod, and workload. Set it when one project has several clusters. |
environment |
deployment.environment.name for everything the collectors send, for the environment menu. |
project |
wizelens.project, for a hub that holds several projects. The cloud takes the project from the key. |
agent.hostMetrics |
The node's own disks and network for the Hosts page. On by default. |
agent.collectionInterval, cluster.collectionInterval |
How often to read. Default 30s. |
agent.kubeletUseNodeIp |
Reach the kubelet by node address, for clusters where node names do not resolve. |
agent.memoryLimitMib, cluster.memoryLimitMib |
The collector refuses data above this. Keep it under the memory limit. |
The collectors only read: the ClusterRole allows get, list, and watch, and the kubelet's nodes/stats.
Spans that know their pod
Point your apps at the node's agent instead of straight at WizeLens:
OTEL_EXPORTER_OTLP_ENDPOINT=http://wizelens-collector-wizelens-collector-agent.wizelens:4318
The Service keeps traffic on the node, so the agent knows which pod sent each span. The span then carries
k8s.pod.name, k8s.node.name, and k8s.namespace.name, and the trace page links to that pod and node. WizeLens
add-ons that send straight to a hub or the cloud still show their pods: inside Kubernetes their host name is the pod's
name.
A plain host
deploy/collector/host.yaml reads
one machine and takes OTLP from apps on it. With Docker:
docker run -d --name wizelens-collector -v /:/hostfs:ro -v $PWD/host.yaml:/etc/otelcol-contrib/config.yaml \
-e WIZELENS_ENDPOINT=https://app.wizelens.com -e WIZELENS_INGEST_KEY=wl_ik_... \
-e HOST_ROOT=/hostfs -e OTEL_RESOURCE_ATTRIBUTES=host.name=$(hostname) \
-p 4317:4317 -p 4318:4318 otel/opentelemetry-collector-contrib:0.137.0
Without Docker, run otelcol-contrib --config host.yaml with the same variables and no HOST_ROOT.
The Hosts page
Every host that sends hostmetrics: CPU busy, memory used, the fullest disk, network in and out, and the services that
run on it. A service runs on a host when it reports that host name, when its Kubernetes node is that host, or when its
pod runs on that node. Open a host for CPU, memory, disk, and network over time, its file systems, its services, and its
pods when it is a Kubernetes node.
The Kubernetes page
Cards for ready nodes, pods, pending pods, and container restarts in the time range with out-of-memory kills. Below, three lists:
- Pods: phase, node, CPU, memory against the limit, restarts (new ones in red), out-of-memory kills, and the services in the pod. A pod no longer reported for 5 minutes shows as "Gone".
- Workloads: Deployments, StatefulSets, DaemonSets, and Jobs with ready against desired. Open one for its pods.
- Nodes: Ready, CPU and memory against what can be allocated, pods, and pending pods.
Open a pod for its usage over time, its containers with restarts and how each last stopped, and its services. Open a node for its usage, pods, and services. Filter by cluster, namespace, or name at the top.
A service's own page lists its pods, and the hosts it runs on.
What WizeLens keeps
Collector metrics have no service.name, so they are filed under the service "infrastructure". They are kept like any
other metric and also show on the Metrics page. The host and Kubernetes names (host.name, k8s.*) on each resource
are kept on every point.
Troubleshooting
- No hosts. Check the agent's log:
kubectl -n wizelens logs ds/wizelens-collector-wizelens-collector-agent. A401means the ingest key is wrong. - Nodes but no CPU or memory. The kubelet refused the agent. Try
agent.kubeletUseNodeIp=true. - Spans without a pod. The app sends straight to WizeLens, or through a Service without a local traffic policy.