Work in Progress: This page is under development. Use the feedback button on the bottom right to help us improve it.

Dashboards

Grafana dashboards are pre-configured for monitoring Laminar pipelines and infrastructure.

Datasources

Grafana has three pre-configured datasources:

NameTypeEndpointPurpose
Laminar-MetricsPrometheuslaminar-engine:8004Laminar engine metrics
GrepTimeDB-MetricsPrometheusgreptimedb:4000/v1/prometheusContainer/node/K8s metrics
GrepTimeDB-LogsMySQLgreptimedb:4002Log queries

Dashboard Provisioning

Dashboards are provisioned from ConfigMaps with the label grafana_dashboard: "1".

The Grafana sidecar watches all namespaces for ConfigMaps with this label and automatically loads them.

Adding Custom Dashboards

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-custom-dashboard
  namespace: laminar-monitoring
  labels:
    grafana_dashboard: "1"
  annotations:
    grafana_folder: "Custom"
data:
  my-dashboard.json: |
    {
      "title": "My Dashboard",
      "panels": [...]
    }

Built-in Dashboards

Dashboards are provisioned from the laminar-dashboards ConfigMap in the "Laminar" folder.

Laminar Logs

UID: laminar-logs Datasource: GrepTimeDB-Logs (MySQL)

Displays application logs from GrepTimeDB.

PanelTypeQuery
Errors (1h)StatSELECT COUNT(*) FROM logs WHERE level = 'error' AND greptime_timestamp > NOW() - INTERVAL 1 HOUR
Warnings (1h)StatSELECT COUNT(*) FROM logs WHERE level = 'warn' AND greptime_timestamp > NOW() - INTERVAL 1 HOUR
Total Logs (1h)StatSELECT COUNT(*) FROM logs WHERE greptime_timestamp > NOW() - INTERVAL 1 HOUR
Recent LogsTableLast 100 logs with timestamp, level, target, message
Error Logs (24h)TableLast 50 ERROR level logs with fields

Laminar Metrics

UID: laminar-metrics Datasource: GrepTimeDB-Metrics (Prometheus)

Displays Laminar engine metrics.

PanelTypeQuery
Active PipelinesTime Serieslaminar_controller_active_pipelines
Slot UtilizationTime Serieslaminar_controller_registered_slots and laminar_controller_free_slots
Registered NodesStatlaminar_controller_registered_nodes
Total SlotsStatlaminar_controller_registered_slots
Free SlotsStatlaminar_controller_free_slots
Active PipelinesStatlaminar_controller_active_pipelines
Worker BytesTime Seriessum(laminar_worker_bytes_recv) by (operator_name)
Worker MessagesTime Seriessum(laminar_worker_messages_recv) by (operator_name)

Kubernetes Cluster Overview

UID: k8s-cluster-overview Datasource: GrepTimeDB-Metrics (Prometheus)

High-level view of the Kubernetes cluster.

PanelTypeQuery
Total NodesStatcount(kube_node_info)
Running PodsStatsum(kube_pod_status_phase{phase="Running"})
Pending PodsStatsum(kube_pod_status_phase{phase="Pending"})
Failed PodsStatsum(kube_pod_status_phase{phase="Failed"})
Cluster CPU UsageTime Series1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))
Cluster Memory UsageTime Seriessum(node_memory_total_bytes) - sum(node_memory_available_bytes)
Pods by PhaseTime Seriessum by (phase) (kube_pod_status_phase)
Pod Restarts (1h)TableTop 10 pods by restart count

Kubernetes Node Resources

UID: k8s-node-resources Datasource: GrepTimeDB-Metrics (Prometheus) Variables: $node (multi-select, default: All)

Detailed resource metrics per node.

PanelTypeQuery
Node CPU UsageTime Series1 - avg by(node) (rate(node_cpu_seconds_total{mode="idle"}[5m]))
Node Memory UsageTime Series1 - (node_memory_available_bytes / node_memory_total_bytes)
Node Disk Usage (/)Time Series1 - (node_filesystem_free_bytes / node_filesystem_total_bytes)
Node Network I/OTime Seriesrate(node_network_receive_bytes_total[5m])
Node Load AverageTime Seriesnode_load1, node_load5, node_load15
CPU Requests / AllocatableTime SeriesCPU requests vs allocatable ratio
Memory Requests / AllocatableTime SeriesMemory requests vs allocatable ratio
Node Resource Requests vs AllocatableTableSummary table with CPU/Memory requests, allocatable, available, and percentages

Kubernetes Pod Resources

UID: k8s-pod-resources Datasource: GrepTimeDB-Metrics (Prometheus) Variables: $namespace, $pod (multi-select, default: All)

Per-pod resource metrics.

PanelTypeQuery
Pod CPU Usage vs RequestsTime Seriessum by(pod) (rate(container_cpu_usage_seconds_total[5m]))
Pod Memory Usage vs LimitsTime Seriessum by(pod) (container_memory_working_set_bytes)
Container Restarts (1h)Time Seriessum by(pod, container) (increase(kube_pod_container_status_restarts_total[1h]))
Pod StatusTableCurrent pod phase by namespace and pod
Pod Network I/OTime Seriesrate(container_network_receive_bytes_total[5m])

Access

Desktop Mode

Grafana is available at: http://localhost:3001

Credentials: laminar / laminar

Kubernetes

Grafana is available at: https://grafana.{baseDomain}

Credentials: laminar / laminar

Creating Custom Dashboards

Using Grafana UI

  1. Navigate to Grafana → Dashboards → New Dashboard
  2. Add panels using the available datasources
  3. Save and export as JSON

Using ConfigMaps (Kubernetes)

  1. Export dashboard JSON from Grafana
  2. Create a ConfigMap with the grafana_dashboard: "1" label
  3. Apply to the cluster
kubectl create configmap my-dashboard \
  --from-file=dashboard.json \
  -n laminar-monitoring
 
kubectl label configmap my-dashboard grafana_dashboard=1 \
  -n laminar-monitoring