Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
7caf8e3
ci(dashboard): pull lime-packages test reports from another side
ccasanueva7 May 23, 2026
08dd153
Merge pull request #82 from fcefyn-testbed/feat/collect-lime-results
ccasanueva7 May 23, 2026
f5fdba5
ci(dashboard): collect-lime-results opens auto-merged PR
ccasanueva7 May 23, 2026
68e86d9
Merge pull request #84 from fcefyn-testbed/fix/collect-lime-results-p…
ccasanueva7 May 23, 2026
e415561
fix(ci): use default GITHUB_TOKEN for collect-lime-results PR
ccasanueva7 May 23, 2026
89a62ac
Merge pull request #85 from fcefyn-testbed/fix/collect-lime-results-t…
ccasanueva7 May 23, 2026
e9c97b9
fix(ci): use BOT_PR_TOKEN for PR creation + auto-merge
ccasanueva7 May 23, 2026
90b7755
Merge pull request #86 from fcefyn-testbed/fix/collect-lime-results-b…
ccasanueva7 May 23, 2026
70dd7c0
ci: collect lime-packages test results (13 new) (#87)
ccasanueva7 May 23, 2026
b8ec26b
fix(dashboard): point PAGES_BASE to this repo's GitHub Pages (#88)
ccasanueva7 May 23, 2026
ba45078
docs(ci-results): rewrite publishing.md for pull-based flow
ccasanueva7 May 23, 2026
45dabe0
docs(ci-results): fix architecture.md report-source URLs
ccasanueva7 May 23, 2026
90e801d
docs(ci-results): rewrite maintenance.md for pull pipeline
ccasanueva7 May 23, 2026
8f2c996
docs(ci-results): fix device coverage table
ccasanueva7 May 23, 2026
5d8f6b7
docs(observability): list Lab Overview dashboard alongside the others
ccasanueva7 May 23, 2026
dbf4064
docs(observability): document Lab Services and WireGuard sections
ccasanueva7 May 23, 2026
805607d
docs(observability): list lab-overview.json in Key files table
ccasanueva7 May 23, 2026
eae4a40
docs(observability): describe Lab Overview dashboard sections
ccasanueva7 May 23, 2026
0060e76
docs(observability): note network errors and drops panel on DUTs
ccasanueva7 May 23, 2026
9b3f9a7
docs(ci-results): fix registered devices table
ccasanueva7 May 23, 2026
49fca32
docs(ci-results): update search examples to current place names
ccasanueva7 May 23, 2026
771a315
docs(glossary): add auto-merge entry
ccasanueva7 May 23, 2026
5cededa
docs(glossary): define node_openwrt_info and node_systemd_unit_state
ccasanueva7 May 23, 2026
c9e8d97
docs(glossary): add PAT entry
ccasanueva7 May 23, 2026
a431382
docs(test-flow): cross-link to CI dashboard publishing
ccasanueva7 May 23, 2026
4eb8f3d
docs(test-run-flow): replace publish-results section with pull flow
ccasanueva7 May 23, 2026
2c265af
docs(debugging-faq): point to collect-lime-results when card has no d…
ccasanueva7 May 23, 2026
cd5909c
feat(grafana): agregar panel de offset NTP en dashboard del orchestrator
ccasanueva7 May 24, 2026
86e8609
feat(grafana): agregar panel de uso de conntrack al dashboard del orc…
ccasanueva7 May 24, 2026
8442be5
feat(grafana): agregar fila de load1 al dashboard Lab Overview
ccasanueva7 May 24, 2026
930e887
feat(grafana): agregar fila de swap al dashboard Lab Overview
ccasanueva7 May 24, 2026
a13034c
feat(grafana): agregar fila de tráfico de red al dashboard Lab Overview
ccasanueva7 May 24, 2026
c4e384a
feat(observability): agregar reglas de alerting de Grafana
ccasanueva7 May 24, 2026
049a1a3
chore: adjust stage
francoriba May 23, 2026
7daa7be
feat(observability): enable Grafana anonymous read-only access
francoriba May 24, 2026
db3fe72
fix
ccasanueva7 May 24, 2026
5273931
docs(ci): add build-and-test-libremesh workflow documentation (#65)
ccasanueva7 May 24, 2026
4de3d19
docs + grafana: align con pipeline pull-based, alerting, paneles nuev…
ccasanueva7 May 24, 2026
cc3154a
Revert "docs + grafana: align con pipeline pull-based, alerting, pane…
ccasanueva7 May 24, 2026
1bc9c0e
Merge pull request #91 from fcefyn-testbed/revert-89-docs/update-ci-r…
ccasanueva7 May 24, 2026
aa65927
Merge pull request #92 from fcefyn-testbed/docs/update-ci-results-flow
ccasanueva7 May 24, 2026
8c403e2
Merge branch 'main' into develop
ccasanueva7 May 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 34 additions & 11 deletions .github/workflows/collect-lime-results.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ on:

permissions:
contents: write
pull-requests: write

concurrency:
group: collect-lime-results
Expand Down Expand Up @@ -124,16 +125,38 @@ jobs:
echo "Collected $new_files new report.xml file(s)."
echo "NEW_FILES=$new_files" >> "$GITHUB_ENV"

- name: Commit and push results
# `develop` is protected (signed commits required, PRs only), so we
# cannot push directly from the bot. Open a PR with API-signed
# commits via peter-evans/create-pull-request and auto-merge it.
- name: Create PR with collected results
if: env.NEW_FILES != '0'
id: cpr
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.BOT_PR_TOKEN }}
base: develop
branch: bot/lime-results
delete-branch: true
sign-commits: true
commit-message: |
ci: collect lime-packages test results (${{ env.NEW_FILES }} new)
title: 'ci: collect lime-packages test results'
body: |
Automated PR with ${{ env.NEW_FILES }} freshly downloaded `report.xml`
file(s) from `fcefyn-testbed/lime-packages` CI artifacts.

Triggered by the `Collect lime-packages test results` workflow.
labels: |
ci
automated
add-paths: |
docs/ci-results/results/

- name: Enable auto-merge
if: steps.cpr.outputs.pull-request-number
env:
GH_TOKEN: ${{ secrets.BOT_PR_TOKEN }}
run: |
set -euo pipefail
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add docs/ci-results/results/
if git diff --cached --quiet; then
echo "Nothing to commit."
exit 0
fi
git commit -m "ci: collect lime-packages test results ($NEW_FILES new)"
git push origin develop
gh pr merge --auto --squash \
--repo "${{ github.repository }}" \
"${{ steps.cpr.outputs.pull-request-number }}"
9 changes: 9 additions & 0 deletions ansible/roles/observability/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,12 @@ grafana_config:
cookie_secure: "true"
cookie_samesite: "lax"
allow_sign_up: "false"

# Anonymous access: let anyone browse dashboards as read-only Viewer
# without logging in. No VPS changes needed; Grafana handles auth.
# Set enabled: false to revert to login-only access.
grafana_anonymous:
enabled: "true"
org_name: "Main Org."
org_role: "Viewer"
hide_version: "true"
279 changes: 279 additions & 0 deletions ansible/roles/observability/files/alerting/fcefyn-alerts.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
apiVersion: 1

groups:
- orgId: 1
name: fcefyn-testbed
folder: FCEFyN Alerts
interval: 1m
rules:

# -----------------------------------------------------------------------
# Target down
# Fires when any Prometheus target (DUT or orchestrator) stops responding.
# -----------------------------------------------------------------------
- uid: fcefyn-target-down
title: Target down
condition: C
for: 2m
annotations:
summary: "{{ $labels.job }} / {{ $labels.instance }} is down"
description: "Prometheus target has been unreachable for more than 2 minutes."
labels:
severity: critical
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: prometheus
model:
expr: "up == 0"
instant: true
refId: A
- refId: C
datasourceUid: __expr__
model:
type: classic_conditions
refId: C
conditions:
- evaluator:
type: gt
params: [0]
operator:
type: and
query:
params: [A]
reducer:
type: last

# -----------------------------------------------------------------------
# High CPU (orchestrator host)
# -----------------------------------------------------------------------
- uid: fcefyn-high-cpu
title: High CPU usage
condition: C
for: 5m
annotations:
summary: "High CPU on {{ $labels.instance }}"
description: "CPU usage has been above 90% for more than 5 minutes."
labels:
severity: warning
data:
- refId: A
relativeTimeRange:
from: 600
to: 0
datasourceUid: prometheus
model:
expr: "100 - (avg by (instance, dut) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
instant: true
refId: A
- refId: C
datasourceUid: __expr__
model:
type: classic_conditions
refId: C
conditions:
- evaluator:
type: gt
params: [90]
operator:
type: and
query:
params: [A]
reducer:
type: last

# -----------------------------------------------------------------------
# High memory
# -----------------------------------------------------------------------
- uid: fcefyn-high-memory
title: High memory usage
condition: C
for: 5m
annotations:
summary: "High memory on {{ $labels.instance }}"
description: "Memory usage has been above 90% for more than 5 minutes."
labels:
severity: warning
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: prometheus
model:
expr: "(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100"
instant: true
refId: A
- refId: C
datasourceUid: __expr__
model:
type: classic_conditions
refId: C
conditions:
- evaluator:
type: gt
params: [90]
operator:
type: and
query:
params: [A]
reducer:
type: last

# -----------------------------------------------------------------------
# Low disk space
# -----------------------------------------------------------------------
- uid: fcefyn-low-disk
title: Low disk space
condition: C
for: 0m
annotations:
summary: "Low disk on {{ $labels.instance }} ({{ $labels.mountpoint }})"
description: "Disk usage is above 85% on {{ $labels.mountpoint }}."
labels:
severity: warning
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: prometheus
model:
expr: "(1 - node_filesystem_avail_bytes{fstype!~\"tmpfs|overlay\"} / node_filesystem_size_bytes{fstype!~\"tmpfs|overlay\"}) * 100"
instant: true
refId: A
- refId: C
datasourceUid: __expr__
model:
type: classic_conditions
refId: C
conditions:
- evaluator:
type: gt
params: [85]
operator:
type: and
query:
params: [A]
reducer:
type: last

# -----------------------------------------------------------------------
# DUT metrics tunnel down
# Checks that autossh tunnel units are not in failed state.
# Metric comes from the orchestrator's node_exporter.
# -----------------------------------------------------------------------
- uid: fcefyn-tunnel-down
title: DUT metrics tunnel down
condition: C
for: 2m
annotations:
summary: "Metrics tunnel failed: {{ $labels.name }}"
description: "autossh unit {{ $labels.name }} is in failed state — DUT metrics may be stale."
labels:
severity: warning
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: prometheus
model:
expr: "node_systemd_unit_state{name=~\"dut-metrics-tunnel-.+\\.service\", state=\"failed\"} == 1"
instant: true
refId: A
- refId: C
datasourceUid: __expr__
model:
type: classic_conditions
refId: C
conditions:
- evaluator:
type: gt
params: [0]
operator:
type: and
query:
params: [A]
reducer:
type: last

# -----------------------------------------------------------------------
# Systemd units in failed state (orchestrator host)
# Catches prometheus, grafana, labgrid-coordinator, etc.
# -----------------------------------------------------------------------
- uid: fcefyn-systemd-failed
title: Systemd unit failed
condition: C
for: 1m
annotations:
summary: "Systemd unit failed on {{ $labels.instance }}: {{ $labels.name }}"
description: "A systemd unit is in failed state on the orchestration host."
labels:
severity: warning
data:
- refId: A
relativeTimeRange:
from: 300
to: 0
datasourceUid: prometheus
model:
expr: "node_systemd_unit_state{state=\"failed\", name!~\"dut-metrics-tunnel-.+\\.service\"} == 1"
instant: true
refId: A
- refId: C
datasourceUid: __expr__
model:
type: classic_conditions
refId: C
conditions:
- evaluator:
type: gt
params: [0]
operator:
type: and
query:
params: [A]
reducer:
type: last

# -----------------------------------------------------------------------
# Network errors (orchestrator host)
# Sustained error rate on physical interfaces.
# -----------------------------------------------------------------------
- uid: fcefyn-network-errors
title: Network interface errors
condition: C
for: 5m
annotations:
summary: "Network errors on {{ $labels.instance }} / {{ $labels.device }}"
description: "Interface {{ $labels.device }} has a sustained error/drop rate over 5 minutes."
labels:
severity: warning
data:
- refId: A
relativeTimeRange:
from: 600
to: 0
datasourceUid: prometheus
model:
expr: "rate(node_network_receive_errs_total{device!~\"lo|veth.+|docker.+\"}[5m]) + rate(node_network_transmit_errs_total{device!~\"lo|veth.+|docker.+\"}[5m]) + rate(node_network_receive_drop_total{device!~\"lo|veth.+|docker.+\"}[5m]) > 0.1"
instant: true
refId: A
- refId: C
datasourceUid: __expr__
model:
type: classic_conditions
refId: C
conditions:
- evaluator:
type: gt
params: [0]
operator:
type: and
query:
params: [A]
reducer:
type: last
Loading
Loading