10.3. Troubleshooting
How to diagnose and resolve problems with installation, agent connections, missing data and performance.
Overview
Where you run into a problem using OPENMARU Observability, use this document to establish the cause and resolve it. Each kind of problem comes with the order to check things in and what to do.
Note: the
kubectlexamples in this document use-n openmaru-observas the namespace. If you installed into a different namespace, substitute its name.
Installation problems
A pod does not start, or keeps restarting
Symptom: kubectl get pods -n openmaru-observ shows a pod as Pending, CrashLoopBackOff or Error.
Cause and action:
-
Check the storage class
Where PersistentVolume provisioning fails, the pod stays
Pending.kubectl get pvc -n openmaru-observWhere the PVC is
Pending, check that the storage class you specified at Helm install time exists on the cluster.kubectl get storageclassFind the name of an available storage class, set it correctly in
values.yamland reinstall.Note: the Helm chart's default storage class is
nfs-client. Change it to one that suits your cluster. -
Check for insufficient resources
Where a node has no CPU or memory to spare, the pod is not scheduled.
kubectl describe pod <pod-name> -n openmaru-observWhere you see
Insufficient cpuorInsufficient memory, free up cluster resources, or reduce each component's resource requests invalues.yamland reinstall. -
Check for an image pull failure
ImagePullBackOffmeans the container image registry cannot be reached.kubectl describe pod <pod-name> -n openmaru-observRead the image-related error in the Events section. Check the registry address and the network connection. In an air-gapped environment, check that the images are registered correctly in the internal registry.
Note: where you use a private registry,
imagePullSecretsmust be set invalues.yaml. Check that the Kubernetes Secret was created correctly. -
The server pod takes too long to start
On its first start the server pod performs initialisation such as database migration. This can take up to five minutes, so wait before checking the state.
Where the server pod stays in
CrashLoopBackOff, read its logs.kubectl logs <server-pod-name> -n openmaru-observThe cause is usually a failure to connect to PostgreSQL or ClickHouse. Check that those pods are running first.
The UI is unreachable
Symptom: the page does not open when you go to the OPENMARU Observability address in a browser.
Cause and action:
-
Check the ingress or route
Check that ingress was enabled at Helm install time.
kubectl get ingress -n openmaru-observWhere there is no ingress resource, enable ingress in
values.yamland reinstall.On OpenShift, check the route resource instead.
kubectl get route -n openmaru-observ -
Check the pod states
kubectl get pods -n openmaru-observCheck that the server and UI pods are
Running. Where they are not, see A pod does not start, or keeps restarting above. -
Check the services
Check that the services connect to one another correctly inside the cluster.
kubectl get svc -n openmaru-observThe UI pod connects to the server to fetch data. Check that the server service was created correctly.
-
Check the network
Check that the browser can reach the server address. A firewall or security group may be blocking it.
A kube-state-metrics warning appears
Symptom: the project status on the Settings > System settings tab shows kube-state-metrics as unhealthy.
Cause: kube-state-metrics is not installed on the cluster, or cannot be reached.
Action:
kubectl get pods -A | grep kube-state-metrics
Where kube-state-metrics is absent, install it first. It is the component that exposes Kubernetes resource state as metrics, and OPENMARU Observability needs it to build the application list.
Check too that the kube-state-metrics included in the Helm chart is enabled — confirm that component is on in values.yaml.
Where it is installed and the warning still appears, check that VictoriaMetrics is collecting kube-state-metrics' metrics. The kube-state-metrics pod's container name must match the configuration.
A database connection error occurs
Symptom: the server pod's logs show a database connection failure.
Cause and action:
-
Check the PostgreSQL pod
kubectl get pods -n openmaru-observ | grep postgresCheck that the PostgreSQL pod is
Running. On its first start, PostgreSQL can take about two minutes to initialise. -
Check the ClickHouse pod
kubectl get pods -n openmaru-observ | grep clickhouseCheck that the ClickHouse pod is
Running. -
Check the storage
Check that the database pods' PersistentVolumes bound correctly.
kubectl get pvc -n openmaru-observCheck that the PVCs are
Bound. Where the storage is full, enlarge the volume or clear out data you no longer need. -
Read the database pods' logs
The problem may be in a database pod itself. Read its logs.
kubectl logs <postgres-pod-name> -n openmaru-observkubectl logs <clickhouse-pod-name> -n openmaru-observ
Pods are unhealthy after a Helm upgrade
Symptom: some pods do not start correctly after helm upgrade.
Cause and action:
-
Check the upgrade status
helm status openmaru-observ -n openmaru-observCheck that the deployment status is
deployed. -
Check the pod events
kubectl describe pod <pod-name> -n openmaru-observRead the cause in the Events section.
-
Check the server pod's ordering
The server pod needs PostgreSQL and ClickHouse running first. Check that the database pods are all
Running, then restart the server pod.kubectl rollout restart statefulset <server-statefulset-name> -n openmaru-observ
Agent connection problems
The node agent is not recognised
Symptom: the project status on the Settings > System settings tab shows the agent as unhealthy. No nodes appear in the Nodes menu.
Cause and action:
-
Check the API key
The node agent authenticates with an API key. Check that a key has been issued on the Settings > System settings tab.
Check that you used the right API key when installing the agent. If you have issued a new key, the agent must be redeployed.
-
Check the server URL
Check that the agent is configured with a URL at which it can reach the OPENMARU Observability server. The node the agent runs on must be able to reach that URL.
-
Check the agent pods
Where the node agent is deployed as a DaemonSet, check that its pod is running on each node.
kubectl get pods -n <the namespace the agent is deployed in> -o wideWhere a pod is unhealthy, read its logs.
kubectl logs <pod-name> -n <namespace> -
Check the kernel version
The node agent uses eBPF and needs Linux kernel 4.16 or later. Below that, the agent exits at start-up.
uname -r -
Check the security context
The node agent must run in privileged mode to load eBPF programs. Check that the cluster's security policy (PodSecurityPolicy, Pod Security Standards and so on) allows privileged mode.
Check too that the agent pod's volume mounts are in place.
/host/sys/fs/cgroup(the cgroup filesystem, read-only)/sys/kernel/tracing(tracefs)/sys/kernel/debug(debugfs)
-
Wait after installing the agent
On a first installation, the first data can take one to two minutes to arrive. Wait a moment, then refresh the Settings > System settings tab.
Note: the node agent requires a Linux operating system with kernel 4.16 or later. Below that, eBPF-based collection does not work.
The cluster agent does not connect
Symptom: cluster-level data such as the dashboard and the application list is missing.
Cause and action:
-
Check the cluster agent pod.
kubectl get pods -n openmaru-observ | grep cluster-agent -
Where the pod is unhealthy, read its logs.
kubectl logs <cluster-agent-pod-name> -n openmaru-observ -
Check that the following are set correctly in
values.yaml.Item What to check Cluster agent server URL That the server can be reached at this URL Cluster agent API key That the API key is valid -
The cluster agent needs permission to reach the Kubernetes API. Check that its ClusterRole and ClusterRoleBinding were created correctly.
kubectl get clusterrole | grep cluster-agentkubectl get clusterrolebinding | grep cluster-agentThe cluster agent needs the following permissions.
- nodes, services, endpoints, pods, secrets (core API)
- replicasets, deployments, statefulsets, daemonsets (apps API)
- jobs, cronjobs (batch API)
OpenTelemetry data does not arrive
Symptom: the trace or log data from an application instrumented with the OpenTelemetry SDK does not appear in the Distributed tracing or Log viewer menus.
What to check, in order:
-
Check the OTel Collector pod
kubectl get pods -n openmaru-observ | grep otel-collectorCheck that the OTel Collector pod is
Running. -
Check the endpoint configuration
Check that the endpoint in your application's OpenTelemetry SDK configuration points at the OTel Collector service correctly. Click the OpenTelemetry integration button at the top of the Distributed tracing page to see the correct endpoint.
The OTel Collector receives data on these ports.
- gRPC: 4317
- HTTP: 4318
-
Check the API key
The OTel Collector needs a valid API key to send data to the OPENMARU Observability server. Check the API key setting in
values.yaml. -
Check the network
Check that the application can reach the OTel Collector, and that the OTel Collector can reach the OPENMARU Observability server.
-
Read the OTel Collector's logs
The OTel Collector's logs show what it is receiving and sending.
kubectl logs <otel-collector-pod-name> -n openmaru-observWhere data is being dropped because a memory limit is exceeded, raise the OTel Collector's memory limit in
values.yaml.
When data does not appear
There is no cluster data on the dashboard
Symptom: the cluster resource gauges and health cards on the dashboard are empty.
What to check, in order:
-
Check the real-time connection
Check that the Live badge at the top of the dashboard is green. Grey or an error state means the real-time connection to the server has dropped. Refreshing the page reconnects automatically.
-
Check the cluster agent
See The cluster agent does not connect above.
-
Check kube-state-metrics
Without kube-state-metrics working, cluster state data cannot be collected. See A kube-state-metrics warning appears above.
-
Check VictoriaMetrics
The dashboard's cluster resource data comes from VictoriaMetrics.
kubectl get pods -n openmaru-observ | grep victoria-metricsCheck that the VictoriaMetrics pod is running.
The application list is empty
Symptom: nothing appears in the list when you click the Applications menu.
What to check, in order:
-
Check the filters
Check that the filters at the top of the page (namespace, category, status) are not excluding your data. Reset them all and look again.
-
Check the time range
Check that the time picker at the top right is set to the last hour or three hours. A range set too far in the past may hold no data.
-
Check the cluster agent and kube-state-metrics
Both must be working for the application list to be built.
-
Check the namespace
Check that the namespaces you monitor have workloads running. Namespaces without workloads show no applications.
A metric chart has no data
Symptom: the charts are empty on the metric tabs of an application detail page, or on a node detail page.
What to check, in order:
-
Check the time range
There may be no data in the range set in the time picker at the top right. If you have just installed the agent, choose the last hour.
-
Check the node agent
Check that the agent is installed and running on that node. The Nodes menu shows the node list and their states.
-
Check the VictoriaMetrics (metric store) connection
Check that VictoriaMetrics shows as connected in the Node status section of the Settings > System settings tab. This reflects the connection to the time-series database (VictoriaMetrics) that stores metric data.
kubectl get pods -n openmaru-observ | grep victoria-metrics -
Check VictoriaMetrics' scrape targets
Check that VictoriaMetrics is collecting the agent's metrics correctly. The node agent pods must carry the metric scrape annotations.
No logs appear
Symptom: the Log viewer menu, or the Logs tab of an application detail page, returns nothing.
What to check, in order:
-
Reset the filters
Check the conditions set in the application filter at the top of the Log viewer and in the attribute filter panel on the left, and clear any you did not intend.
-
Check the severity filter
Check that the level you want is selected in the log level filter (ERROR, WARN, INFO, DEBUG).
-
Check the time range
Set the time picker at the top right to the last hour and query again.
-
Check that the node agent is collecting logs
The node agent must be installed for container logs to be collected. Where the agent was installed with log collection disabled, check its configuration.
-
Check ClickHouse
Log data is stored in ClickHouse. Check that the ClickHouse pod is running.
kubectl get pods -n openmaru-observ | grep clickhouseWhere ClickHouse's storage is full, log queries can fail. Check the PVC.
-
Check the log source
On the Logs tab of an application detail page you can switch the log source between agent and OpenTelemetry (otel). Check the right source is selected.
There is no distributed trace data
Symptom: the heatmap or the trace list in the Distributed tracing menu is empty.
What to check, in order:
-
Check eBPF automatic collection
The node agent collects HTTP and gRPC traffic automatically with eBPF. This works only on servers with kernel 4.16 or later. Check the server's kernel version.
uname -r -
Check whether OpenTelemetry is integrated
Collecting more detailed trace data requires instrumenting the application with the OpenTelemetry SDK. Click the OpenTelemetry integration button at the top of the Distributed tracing page to see how.
-
Check the time range and filters
Reset the time picker and the filter conditions and query again. The distributed tracing screen offers filters on service name, span name, status code and more, so check that a filter is not the reason for the empty result.
-
Check ClickHouse
Trace data is stored in ClickHouse. Without ClickHouse working, distributed trace data cannot be queried.
Note: eBPF-based automatic collection works with no application code changes. Adding OpenTelemetry gives you detailed span data at function level.
There is no profiling data
Symptom: no flame graph appears on the Profiling tab of an application detail page.
What to check, in order:
-
Check that profiling is enabled
Profiling is enabled by default. Check the profiling settings on the application detail page.
-
Check the node agent
Profiling data is collected by the node agent on each node, with eBPF. Check that the node agent is running. (For a particular application's pprof profiles, the cluster agent scrapes them additionally where the
openmaru.io/profile-scrape: "true"annotation is present.) -
Check the time range
Choose the last hour in the time picker and query again.
-
Check that the runtime is supported
Profiling works on the supported runtimes (Java, Go, Python, .NET, Node.js and so on). Check that the application you are monitoring runs on one.
No services appear on the topology map
Symptom: the service connection graph in the Topology map menu is empty.
What to check, in order:
-
Check the real-time connection
Check that the Live badge at the top of the Topology map is green.
-
Check the node agent
Connection information between services comes from the node agent's eBPF-based TCP connection tracking. Check that the node agent is installed correctly on every node.
-
Check that there is traffic
Without traffic between services, no connections appear on the topology map. Check that real requests are reaching your applications.
Performance problems
The dashboard is slow to load
Symptom: the dashboard or another screen takes a long time to load.
Cause and action:
-
Check the server's resources
Check the CPU and memory usage of the OPENMARU Observability server pod.
kubectl top pods -n openmaru-observWhere usage is high, raise the server's resource requests in
values.yaml, or increase the number of server replicas, and reinstall. -
Check ClickHouse
High storage usage in ClickHouse — which stores log, trace and profiling data — degrades query performance.
kubectl get pvc -n openmaru-observ | grep clickhouseWhere usage is high, enlarge the ClickHouse volume in
values.yamland reinstall, or shorten the retention period so old data is removed automatically. -
Check VictoriaMetrics' storage
Check the storage of VictoriaMetrics, which stores metric data, too. Insufficient storage degrades metric query performance.
kubectl get pvc -n openmaru-observ | grep victoria-metrics -
Narrow the query time range
The wider the range you query at once, the more there is to process. Narrowing the range in the time picker improves performance.
Note: choosing a range longer than three days on an application detail page still shows only three days of data (with a "3-day limit" badge), because of the raw metric retention period (three days by default in VictoriaMetrics).
The agent uses too much of the server's resources
Symptom: CPU or memory usage rises on the nodes where the node agent is installed.
Cause and action:
-
Widen the collection interval
Collecting metrics less often reduces the agent's resource use. Set the metric collection interval higher than the default (
15s) at Helm install time. -
Disable L7 tracing
In environments with heavy network traffic, eBPF-based L7 tracing can use substantial resources. Where you do not need tracing, disable it in the agent's configuration.
-
Disable log parsing
In environments with very high container log volume, disabling log parsing reduces the agent's load.
-
Set resource limits
Check that the node agent's resource limits are appropriate. You can adjust its CPU and memory limits in
values.yamlto suit your environment. The defaults are a request of 500m CPU and 500Mi memory, and a limit of 4Gi memory (there is no CPU limit). -
Check the buffer disk usage
Where the node agent fails to send data, it buffers it temporarily on local disk. A persistent connection problem therefore raises disk usage. Check the server connection first.
ClickHouse storage grows quickly
Symptom: the ClickHouse PVC's storage usage grows faster than expected.
Cause and action:
-
Check the retention periods
Check the retention (TTL) settings for log, trace and profiling data. Shortening them removes old data automatically.
-
Check the log volume
Check whether an application is producing excessive logs. Analysing log patterns in the Log viewer identifies the applications producing unnecessary volume.
-
Enlarge the storage
Adjust the volume with
openmaruObservClickhouse.persistentVolume.sizeinvalues.yaml. The default is 300Gi; environments with a lot of log and trace data need more. See the sizing table in Installation.
A custom dashboard log panel is empty, or shows a warning
Symptom: a log panel on a custom dashboard has no data, or warns that a field has many distinct values.
Cause and action:
-
Check that ClickHouse is configured
The logs and audit log data sources need ClickHouse. The template gallery hides the log templates where it is absent, but the panel editor still offers the sources. If a panel you created stays empty, check this first.
-
Narrow the grouping key
Group by a field with very many distinct values (a request ID, say) and a warning appears. The chart would run to thousands of bars, so change the key or filter the range down.
-
Check the query range
Where the range is wide, the server folds it to at most 24 hours for the aggregate. Longer periods are not shown.
A custom dashboard realtime widget is not moving
Symptom: the request viewer or realtime request monitor placed on a custom dashboard looks frozen.
Cause and action:
-
Check the panel size
Below 160px wide or 72px tall the animation stops. Try making the panel bigger.
-
Check for traffic
Realtime widgets draw the requests happening now. With no traffic in that namespace, empty is correct.
-
Check the per-dashboard limit
One dashboard holds up to three distinct filter combinations of realtime widgets. Past that, the data source turns disabled in the panel editor with the reason shown.
VictoriaMetrics is short of storage
Symptom: the VictoriaMetrics pod restarts, or data is missing from the metric charts.
Cause and action:
-
Check the PVC's capacity
kubectl get pvc -n openmaru-observ | grep victoria-metrics -
Check the retention period
VictoriaMetrics retains data for three days by default (
--retentionPeriod=3d). Extend the retention period, or enlarge the PVC where storage is short. The default size is 10Gi. -
Check what is being collected
Check whether unnecessary metrics are being collected. An application you do not monitor exposing excessive metrics raises storage usage.
Screen problems
The live connection does not hold
Symptom: the Live badge at the top of the dashboard or the topology map turns grey, or keeps trying to reconnect.
Cause and action:
- Check whether you clicked through a certificate warning. If you reached the site through Advanced > Proceed without adding your internal certificate authority (CA) certificate to the browser's trust store, that exception expires after seven days. When it does, the live connection drops silently first. See A certificate warning appears below.
- Where an ingress or proxy sits between the server and the UI, check that it allows WebSocket connections (
ws://orwss://). - Where the proxy's connection timeout is too short, the WebSocket connection drops often. Raise the timeout.
- Check that a firewall is not blocking WebSocket connections.
Where the page shows a Reconnect button, click it to reconnect immediately. Refreshing the page also reconnects.
A certificate warning appears
Symptom: connecting brings up a "Your connection is not private" warning with the error NET::ERR_CERT_AUTHORITY_INVALID. It can also reappear after a few days of working fine.
Cause: the PC does not have your internal certificate authority (CA) in its trust store. There is nothing wrong with the certificate itself; the PC simply does not know the authority that issued it.
Clicking Advanced > Proceed on the warning does get you in, but that is a temporary exception lasting only seven days. After seven days the warning returns — and before it does, the live connection drops first. Reopening or refreshing the page does not extend the exception.
Action: adding your internal root CA certificate to the PC's trust store stops it recurring. For the detailed procedure on Windows and macOS, see the Trusting the certificate in your browser section of Installation.
Where there are many PCs, Windows group policy can distribute it in bulk. The procedure is in the same section.
Note: where you connect to several clusters, each has its own certificate. Registering it for one environment leaves the warning in place for the others.
Alerts are not sent
Symptom: no alert arrives in Slack, Teams and so on when an incident occurs.
What to check, in order:
-
Check the alert channel configuration
Check that the alert channel is connected on the Settings > Alert channels tab. The channel's connection state should show a check mark.
-
Check the base URL
Check that the Base URL field on the Settings > Alert channels tab holds a OPENMARU Observability URL reachable from outside. Without it, the links in alert messages may not be built correctly.
-
Check the webhook URL is valid
Check that the Slack or Teams webhook URL is still valid. Where it has changed, set it again on the Settings > Alert channels tab.
-
Check which events the channel receives
Check that the incident alerts and deployment alerts options are enabled in the channel's configuration.
-
Send a test alert
Send a test alert from the Settings > Alert channels tab to confirm the integration works.
-
Check the server's network
Check that the OPENMARU Observability server can reach the external webhook URL. In an air-gapped environment, outbound connections to external webhook services may be blocked.
No incidents are raised
Symptom: an application is producing errors but no incident appears in the Incidents menu.
What to check, in order:
-
Check the inspection conditions
Check that the inspection conditions are enabled on the Settings > Inspection conditions tab. Their thresholds must be set appropriately for incidents to be raised.
-
Check the resolved toggle
Where the resolved toggle in the Incidents menu is off, already-resolved incidents are hidden. Turn it on to see them all.
-
Check the agent
The node agent must be working for the inspection conditions to be evaluated against metric data. Check the agent's connection.
-
Check the SLO configuration
Incidents are raised from SLO breaches. Check that the SLO configuration (the availability and response time targets) is set correctly on the application detail page.
Diagnostic commands
The commands you will use most often.
Checking every pod
kubectl get pods -n openmaru-observ
Checking one pod in detail
kubectl describe pod <pod-name> -n openmaru-observ
Reading a pod's logs
# Recent logs
kubectl logs <pod-name> -n openmaru-observ
# The previous pod's logs (where it restarted)
kubectl logs <pod-name> -n openmaru-observ --previous
Checking PVCs
kubectl get pvc -n openmaru-observ
Checking services
kubectl get svc -n openmaru-observ
Checking resource usage
kubectl top pods -n openmaru-observ
Checking ingress or routes
# Kubernetes Ingress
kubectl get ingress -n openmaru-observ
# OpenShift Route
kubectl get route -n openmaru-observ
Checking RBAC resources
kubectl get clusterrole | grep openmaru
kubectl get clusterrolebinding | grep openmaru
If none of this resolves it
Where the above does not resolve the problem, gather the following and contact OPENMARU technical support.
- Your OPENMARU Observability version (from the version information at the bottom left of the screen)
- Your Kubernetes version (
kubectl version) - Which menu the problem occurs in, and how to reproduce it
- The relevant pod logs (
kubectl logs <pod-name> -n openmaru-observ) - The relevant pod events (
kubectl describe pod <pod-name> -n openmaru-observ)
Related documents
- Quick start - first installation and configuration
- Installation - system requirements and installation options
- Settings - API key management, alert channels, user management
- Nodes - node state and agent status
- Distributed tracing - OpenTelemetry integration and trace analysis
- Log viewer - searching and filtering logs