Common issues and solutions for Gobservability.
Symptoms:
- No nodes showing up in dashboard
- Dashboard shows empty cluster
Possible Causes & Solutions:
# Check agent pods
kubectl get pods -n gobservability -l app=gobservability-agent
# Expected: One pod per node in Running state
# If missing or not Running, check logs:
kubectl logs -n gobservability -l app=gobservability-agent --tail=50# Verify agent can access Kubernetes API
kubectl auth can-i get pods --as=system:serviceaccount:gobservability:gobservability-agent
# Should return: yes
# If no, apply RBAC manifests:
kubectl apply -f k8s/helm/templates/rbac.yaml# Verify /proc mount is working
kubectl exec -it -n gobservability gobservability-agent-xxxxx -- ls /host/proc
# Should show: 1, 2, 3, ... (process IDs)
# If error, check DaemonSet hostPath mounts# Check server is reachable from agent
kubectl exec -it -n gobservability gobservability-agent-xxxxx -- nc -zv gobservability-server 9090
# Should show: Connection to gobservability-server 9090 port [tcp/*] succeeded!
# Check server logs for connection errors:
kubectl logs -n gobservability -l app=gobservability-server | grep -i grpcSymptoms:
- Agent pods constantly restarting
CrashLoopBackOffstatus
Solutions:
# Get recent logs from crashed pod
kubectl logs -n gobservability gobservability-agent-xxxxx --previous
# Common errors:
# - "permission denied" → Check securityContext capabilities
# - "connection refused" → Check server service name/port
# - "context deadline exceeded" → Network policy blocking traffic# Check agent has required capabilities
kubectl get daemonset gobservability-agent -n gobservability -o yaml | grep -A10 securityContext
# Must have:
# privileged: true
# capabilities: SYS_ADMIN, SYS_PTRACE, SYS_RAWIO# Check if agent is OOMKilled
kubectl describe pod -n gobservability gobservability-agent-xxxxx | grep -i oom
# If yes, increase memory limits in values.yaml:
agent:
resources:
limits:
memory: 128Mi # Increase from 64MiSymptoms:
- Agent running but not detecting pods
- Empty pod list in dashboard
Solutions:
# Check agent can list pods
kubectl exec -it -n gobservability gobservability-agent-xxxxx -- \
wget -qO- --header="Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
https://kubernetes.default.svc/api/v1/pods
# Should return JSON with pod list# Verify NODE_NAME is correctly set
kubectl exec -it -n gobservability gobservability-agent-xxxxx -- env | grep NODE_NAME
# Should match actual node name:
kubectl get nodesSymptoms:
- Server pod in
CrashLoopBackOff - Dashboard not accessible
Solutions:
# Check server logs for database errors
kubectl logs -n gobservability -l app=gobservability-server | grep -i postgres
# Common errors:
# - "connection refused" → PostgreSQL not ready
# - "authentication failed" → Wrong credentials
# - "database does not exist" → Database not created# Check PostgreSQL pod
kubectl get pods -n gobservability | grep postgres
# If using CloudNativePG:
kubectl get cluster -n gobservability
# Check PostgreSQL logs:
kubectl logs -n gobservability gobservability-postgres-1# Connect to PostgreSQL from server pod
kubectl exec -it -n gobservability gobservability-server-xxxxx -- \
apk add postgresql-client && \
psql "postgres://gobs:gobs123@gobservability-postgres-rw:5432/gobservability"
# If successful, issue is in server code
# If failed, check PostgreSQL service/credentialsSymptoms:
- Dashboard loads but no metrics displayed
- Empty node list
Solutions:
# Check server logs for gRPC connections
kubectl logs -n gobservability -l app=gobservability-server | grep -i "agent connected"
# Should see: "Agent connected: node-name"# Server uses in-memory cache with 10s TTL
# If no agents have sent data in >10s, cache is empty
# Wait for next metric collection cycle (5s default)# Check if NetworkPolicy is blocking agent→server traffic
kubectl get networkpolicy -n gobservability
# If exists, verify it allows:
# - Agent egress to server:9090
# - Server ingress from agents on port 9090Symptoms:
- Metrics exceed threshold but no Discord notification
- No alerts shown in alerts page
Solutions:
# Navigate to alerts page: http://localhost:8080/alerts/{nodename}
# Check "Enabled" column shows "Yes"# Verify secret exists
kubectl get secret discord-webhook -n gobservability -o yaml
# Decode webhook URL (base64)
kubectl get secret discord-webhook -n gobservability -o jsonpath='{.data.webhook_url}' | base64 -d
# Test webhook manually:
curl -X POST "YOUR_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"content": "Test notification from Gobservability"}'# Check alert evaluation logs
kubectl logs -n gobservability -l app=gobservability-server | grep -i alert
# Look for:
# - "Alert fired: ..."
# - "Discord notification sent"
# - "Failed to send Discord notification: ..." (errors)# Connect to database and check alerts table
kubectl exec -it -n gobservability gobservability-postgres-1 -- \
psql -U gobs -d gobservability -c "SELECT * FROM alerts ORDER BY created_at DESC LIMIT 10;"
# If empty, alert evaluation is not working
# Check server logs for database errorsSymptoms:
- Receiving multiple Discord notifications for same alert
Solution:
This is a bug - alerts should only notify on state change. Check server logs:
kubectl logs -n gobservability -l app=gobservability-server | grep "Discord notification"
# If seeing multiple "sent" messages for same alert, report issueSymptoms:
- "Cannot delete rule with active alert" error
Solution:
This is expected behavior. You must either:
- Dismiss the alert manually via UI
- Wait for alert to auto-resolve (when metric returns below threshold)
- Disable the rule (keeps rule but stops evaluation)
# Option 1: Dismiss via API
curl -X PUT http://localhost:8080/api/alerts/dismiss/{alert-id}
# Option 2: Disable rule (not delete)
# Navigate to alerts page and click "Disable"Symptoms:
- "Flamegraph generation failed" error
- Task status shows "error"
Solutions:
# Check perf is installed in agent
kubectl exec -it -n gobservability gobservability-agent-xxxxx -- which perf
# Should return: /usr/bin/perf
# If not found, agent image is broken (should use Ubuntu base with perf)# Verify SYS_ADMIN, SYS_PTRACE, SYS_RAWIO capabilities
kubectl get daemonset gobservability-agent -n gobservability -o yaml | grep -A5 capabilities
# Must include all three capabilities# Navigate to process details page
# Check that PID field shows a positive number (not -1)
# If PID is -1, pod has no running process (might be completed/failed)# Look for perf errors
kubectl logs -n gobservability gobservability-agent-xxxxx | grep -i perf
# Common errors:
# - "perf: permission denied" → Missing capabilities
# - "No such process" → PID no longer exists
# - "Cannot attach to process" → Process security context blocks ptraceSymptoms:
- Task status never completes
- No error shown
Solutions:
# Default timeout is 10 minutes
# If profiling duration is 600s (10 minutes), task may time out
# Wait for task completion or check agent logs for errors
kubectl logs -n gobservability gobservability-agent-xxxxx | grep flamegraph# Flamegraph uses gRPC server-to-agent communication
# Check server can send requests to agents
kubectl logs -n gobservability -l app=gobservability-server | grep -i flamegraphSymptoms:
- Server pod using >128Mi memory
- OOMKilled events
Solutions:
# In values.yaml
server:
resources:
limits:
memory: 256Mi # Double the limitThe server caches all metrics in-memory. For large clusters:
- Reduce cache TTL (modify
storage/store.go) - Limit number of nodes monitored
- Add metric sampling (collect every 10s instead of 5s)
Symptoms:
- Agent pod using >64Mi memory
- OOMKilled on nodes with many pods
Solutions:
# In values.yaml
agent:
resources:
limits:
memory: 128Mi# In values.yaml
agent:
interval: 10s # Instead of default 5sSymptoms:
- Agent using >200m CPU constantly
Solutions:
- Agents parse
/procfiles which is CPU-intensive - Expected on nodes with 50+ pods
- Reduce collection interval (10s instead of 5s)
- Increase CPU limits if acceptable
- Optimize
/procparsing code (e.g., skip unused fields)
Symptoms:
- Cannot access dashboard via external domain
- "404 Not Found" or "Service Unavailable"
Solutions:
kubectl get pods -n ingress-nginx
# If not installed:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yamlkubectl get ingress -n gobservability
# Verify:
# - Host matches your domain
# - Backend service is gobservability-server:8080# Check domain resolves to cluster
nslookup gobservability.example.com
# Should point to ingress controller LoadBalancer IP# If using cert-manager
kubectl get certificate -n gobservability
# Should show "Ready: True"
# If not, check cert-manager logs:
kubectl logs -n cert-manager -l app=cert-managerSymptoms:
kubectl port-forwardhangs or times out
Solutions:
kubectl get svc -n gobservability gobservability-server
# Should show ClusterIP service with ports 8080, 9090kubectl get pods -n gobservability -l app=gobservability-server
# Should show 1/1 Running# Correct:
kubectl port-forward -n gobservability svc/gobservability-server 8080:8080
# Incorrect:
kubectl port-forward -n gobservability pod/gobservability-server-xxxxx 8080:8080Symptoms:
- PostgreSQL pod in
PendingorCrashLoopBackOff
Solutions:
kubectl get pvc -n gobservability
# Should show "Bound" status
# If "Pending", check storage class exists:
kubectl get storageclasskubectl get pods -n cnpg-system
# If not installed:
kubectl apply -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.24/releases/cnpg-1.24.0.yamlkubectl logs -n gobservability gobservability-postgres-1
# Look for:
# - "database system is ready to accept connections" (success)
# - "FATAL: ..." (errors)Symptoms:
- Server logs show "failed to migrate database"
Solutions:
# Connect to PostgreSQL
kubectl exec -it -n gobservability gobservability-postgres-1 -- \
psql -U gobs -c "\l"
# If "gobservability" database missing, create it:
kubectl exec -it -n gobservability gobservability-postgres-1 -- \
psql -U gobs -c "CREATE DATABASE gobservability;"# Server uses GORM auto-migration
# If fails, check PostgreSQL logs for permission errorsSymptoms:
- Script errors or no agents starting
Solutions:
# Start PostgreSQL first
docker-compose up -d postgres
# Or use local PostgreSQL:
export POSTGRES_URL="postgres://user:pass@localhost:5432/gobservability"# Kill existing server
lsof -ti:8080 | xargs kill -9
# Then retry
make agentsSymptoms:
- "failed to solve" or build errors
Solutions:
docker ps
# If error, start Docker daemondocker-compose build --no-cache# Requires Go 1.24+
go versionIf your issue is not listed here:
-
Check Logs:
kubectl logs -n gobservability -l app=gobservability-server kubectl logs -n gobservability -l app=gobservability-agent
-
Enable Debug Mode:
# In server deployment env: - name: GIN_MODE value: "debug"
-
Report Issue:
- Open issue on GitHub: https://github.com/ThomasCardin/gobservability/issues
- Include logs, Kubernetes version, and deployment method