Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 0 additions & 12 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -661,18 +661,6 @@ REDIS_URL=redis://redis:6379 # REQUIRED for the self-host review
# data source after Grafana is up with: ./scripts/setup-github-datasource.sh (reads GITHUB_TOKEN below).
# GITHUB_TOKEN=<read-only-github-token> # fine-grained PAT: Pull requests:read, Issues:read, Contents:read
#
# In-Grafana Sentry error/issue visualization (#5369). Self-host no longer sends new events to Sentry
# (error tracking now goes through PostHog, above) -- this panel only remains useful for an operator's own
# PRE-EXISTING Sentry issue history in an org they still separately maintain; pending removal (epic #8286).
# Install is automatic (GF_INSTALL_PLUGINS); add the data source after Grafana is up with:
# ./scripts/setup-sentry-datasource.sh (reads the two vars below). A Sentry event-ingestion DSN is NOT
# reusable here -- this datasource needs a separate read/query API token instead.
# SENTRY_API_TOKEN=<sentry-internal-integration-token> # Sentry -> Settings -> Developer Settings -> Custom
# # Integrations -> New Internal Integration, with Read access on
# # Project, Issue & Event, and Organization scopes
# SENTRY_ORG_SLUG=<your-sentry-org-slug>
# SENTRY_API_URL=https://sentry.io # override only for a self-hosted Sentry instance
#
# Discord notifications. Alertmanager → Discord (system/stack alerts) is configured in alertmanager/alertmanager.yml.
# The ENGINE posts a per-repo review summary when it publishes a review — set a per-repo map and/or a global fallback:
# DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/... # global fallback for any repo without its own
Expand Down
41 changes: 0 additions & 41 deletions apps/loopover-ui/content/docs/self-hosting-operations.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -842,47 +842,6 @@ means the process may still be alive but the recurring work is not checking in o
Pair the monitor with queue depth, dead-job counts, and the structured error log for the
same subsystem.

## Grafana Sentry data source (in-Grafana issue visualization)

<Callout variant="note">
Self-host no longer sends new events to Sentry (error tracking now goes through PostHog, above)
-- this panel only remains useful for an operator's own PRE-EXISTING Sentry issue history in an
org they still separately maintain. It is pending removal (tracked under epic #8286).
</Callout>

Query recent Sentry issues, top issues by event count, and error-volume trend directly in
Grafana — no more switching tabs to check Sentry, and errors line up in time with the rest
of the stack's metrics/logs/traces. This is read-only visualization; alert routing to
Sentry/Discord/Slack is a separate, unrelated concern covered above.

<Callout variant="warn" title="A DSN does not work here">
This data source needs a separate **Sentry Internal Integration token**, not an event-ingestion
DSN: Sentry → Settings → Developer Settings → Custom Integrations → New Internal Integration
(requires an Admin/Manager/Owner role in Sentry), with **Read** access on the **Project**,
**Issue &amp; Event**, and **Organization** resource scopes.
</Callout>

The [grafana-sentry-datasource](https://grafana.com/grafana/plugins/grafana-sentry-datasource/)
plugin installs automatically (`GF_INSTALL_PLUGINS`, same mechanism as the GitHub
data source below). Add the data source itself after Grafana is up — a backend datasource
whose token isn't ready at Grafana's own boot time would crash file-based
provisioning, so this one is added over the API instead, exactly like the GitHub data
source:

<CodeBlock
filename=".env"
code={`SENTRY_API_TOKEN=<your-sentry-internal-integration-token>
SENTRY_ORG_SLUG=<your-sentry-org-slug>
# SENTRY_API_URL=https://sentry.io # override only for a self-hosted Sentry instance`}
/>

<CodeBlock lang="bash" code={`./scripts/setup-sentry-datasource.sh`} />

The script is idempotent — safe to re-run after rotating the token. Open the
**Sentry issues** dashboard once it succeeds. Same trade-off as the GitHub data
source: this one is API-managed, so it stays editable via the Grafana UI rather than locked
read-only like the file-provisioned data sources.

## Re-gate sweeps (agent-regate-sweep)

Live PR review is webhook-driven, but open PRs still need periodic re-evaluation — the base
Expand Down
2 changes: 1 addition & 1 deletion apps/loopover-ui/src/lib/selfhost-docs-audit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ export const SELFHOST_SOURCE_OF_TRUTH_ROWS: readonly SelfHostSourceOfTruthRow[]
runtimeSources: [".github/workflows/release-selfhost.yml", "Dockerfile"],
docsPath: "/docs/self-hosting-releases",
notes:
"Release workflow uploads source maps to Sentry; maps never ship inside the runtime image.",
"Release workflow uploads source maps to PostHog; maps never ship inside the runtime image.",
},
{
topic: "Release smoke matrix and image-contents audit",
Expand Down
4 changes: 1 addition & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -927,9 +927,7 @@ services:
# check lives in entrypoint below. Runtime still fails closed unless the operator sets GRAFANA_ADMIN_PASSWORD.
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-${GRAFANA_LOCAL_SMOKE_PASSWORD:-}}
GF_USERS_ALLOW_SIGN_UP: "false"
# grafana-sentry-datasource (#5369): first-party Grafana Labs plugin, confirmed Grafana-signed and
# installs cleanly on this pinned Grafana version (verified live, not assumed).
GF_INSTALL_PLUGINS: frser-sqlite-datasource,grafana-github-datasource,grafana-sentry-datasource
GF_INSTALL_PLUGINS: frser-sqlite-datasource,grafana-github-datasource
# Read-only fine-grained PAT for the GitHub data source provisioning ($GITHUB_TOKEN expansion). From .env.
GITHUB_TOKEN: "${GITHUB_TOKEN:-}"
deploy:
Expand Down
4 changes: 2 additions & 2 deletions grafana/dashboards/resource-hub.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
{
"title": "Sentry — errors",
"type": "link",
"url": "https://jsonbored.sentry.io/projects/gittensory/",
"url": "https://jsonbored.sentry.io/projects/loopover/",
"icon": "bolt",
"targetBlank": true,
"tooltip": "Crash & error tracking (uncaught, dead-letter jobs, review failures)"
Expand All @@ -66,7 +66,7 @@
"gridPos": { "h": 13, "w": 12, "x": 12, "y": 0 },
"options": {
"mode": "markdown",
"content": "## 📊 Dashboards\n- **[Upstream PRs & issues (GitHub)](/d/loopover-github)** — live, accurate census + open-PR triage (GitHub API).\n- **[Reviews & PRs (maintainer)](/d/loopover-maintainer)** — loopover's own review activity + reviewed-PR log.\n- **[AI usage](/d/loopover-ai-usage)** — durable cross-provider ai_usage_events (filterable by provider/feature/model), live Prometheus counters, and Claude Code's own OTEL session telemetry, all in one place.\n- **[LoopOver (infra)](/d/loopover-selfhost)** — queue, jobs, HTTP, GitHub API cache/rate limits.\n- **[GPU metrics](/d/loopover-gpu)** — utilization/VRAM for a self-hosted Ollama GPU box.\n- **[Infra health](/d/loopover-infra-health)** — host CPU/mem/disk/network (node-exporter), per-container resource usage (cAdvisor), Redis, Qdrant, and whether the observability stack itself is up.\n- **[REES (review-enrichment)](/d/loopover-rees)** — request outcomes/latency and per-analyzer run/timeout/degrade rates for the optional `--profile rees` service.\n- **[Browserless (visual review)](/d/loopover-browserless)** — queue depth, concurrency, and rejection/error/timeout rate for the optional `--profile visual-review` screenshot service.\n- **[Sentry issues](/d/loopover-sentry)** — recent unresolved issues, top issues by event count, and error-volume trend, queried live from Sentry (`scripts/setup-sentry-datasource.sh`). The plain link below still opens Sentry itself for actions this read-only view can't do (resolving/assigning issues).\n- **[Miner usage (AMS)](/d/loopover-miner-usage)** — attempt outcomes, cost/token spend, and per-provider usage from the local `loopover-miner` AMS ledger — the miner-side counterpart to the ORB review-service dashboards above (see the AMS panel below for wiring its datasources up).\n\n## 📈 Metrics & logs\n- **Prometheus** — [targets](http://localhost:9090/targets) · [graph](http://localhost:9090)\n- **Alertmanager** — [alerts](http://localhost:9093)\n- **Loki** — query in [Explore](/explore) (pick the *Loki* datasource), e.g. `{compose_service=\"loopover\"}`\n- **Sentry** — release/source-map enriched errors. Edit the dashboard link if your project URL differs.\n\n## 🩺 Quick health checks\n| What | Where |\n|---|---|\n| App serving | `GET /ready` → 200 |\n| AI wired | boot log `selfhost_ai_provider` |\n| Embeds wired | boot log `selfhost_embed_provider` |\n| Vectors wired | boot log `selfhost_vectorize` |\n| Token spend | **[AI usage](/d/loopover-ai-usage)** dashboard |\n\n## 📚 Docs\n- [Maintainer self-hosting](https://loopover.ai/docs/maintainer-self-hosting) — setup, configuration, AI, REES, RAG, operations, and troubleshooting."
"content": "## 📊 Dashboards\n- **[Upstream PRs & issues (GitHub)](/d/loopover-github)** — live, accurate census + open-PR triage (GitHub API).\n- **[Reviews & PRs (maintainer)](/d/loopover-maintainer)** — loopover's own review activity + reviewed-PR log.\n- **[AI usage](/d/loopover-ai-usage)** — durable cross-provider ai_usage_events (filterable by provider/feature/model), live Prometheus counters, and Claude Code's own OTEL session telemetry, all in one place.\n- **[LoopOver (infra)](/d/loopover-selfhost)** — queue, jobs, HTTP, GitHub API cache/rate limits.\n- **[GPU metrics](/d/loopover-gpu)** — utilization/VRAM for a self-hosted Ollama GPU box.\n- **[Infra health](/d/loopover-infra-health)** — host CPU/mem/disk/network (node-exporter), per-container resource usage (cAdvisor), Redis, Qdrant, and whether the observability stack itself is up.\n- **[REES (review-enrichment)](/d/loopover-rees)** — request outcomes/latency and per-analyzer run/timeout/degrade rates for the optional `--profile rees` service.\n- **[Browserless (visual review)](/d/loopover-browserless)** — queue depth, concurrency, and rejection/error/timeout rate for the optional `--profile visual-review` screenshot service.\n- **[Miner usage (AMS)](/d/loopover-miner-usage)** — attempt outcomes, cost/token spend, and per-provider usage from the local `loopover-miner` AMS ledger — the miner-side counterpart to the ORB review-service dashboards above (see the AMS panel below for wiring its datasources up).\n\n## 📈 Metrics & logs\n- **Prometheus** — [targets](http://localhost:9090/targets) · [graph](http://localhost:9090)\n- **Alertmanager** — [alerts](http://localhost:9093)\n- **Loki** — query in [Explore](/explore) (pick the *Loki* datasource), e.g. `{compose_service=\"loopover\"}`\n- **Sentry** — release/source-map enriched errors. Edit the dashboard link if your project URL differs.\n\n## 🩺 Quick health checks\n| What | Where |\n|---|---|\n| App serving | `GET /ready` → 200 |\n| AI wired | boot log `selfhost_ai_provider` |\n| Embeds wired | boot log `selfhost_embed_provider` |\n| Vectors wired | boot log `selfhost_vectorize` |\n| Token spend | **[AI usage](/d/loopover-ai-usage)** dashboard |\n\n## 📚 Docs\n- [Maintainer self-hosting](https://loopover.ai/docs/maintainer-self-hosting) — setup, configuration, AI, REES, RAG, operations, and troubleshooting."
}
},

Expand Down
99 changes: 0 additions & 99 deletions grafana/dashboards/sentry-issues.json

This file was deleted.

71 changes: 0 additions & 71 deletions scripts/setup-sentry-datasource.sh

This file was deleted.

Loading
Loading