Pre-launch — Gluecron is in final validation. Public signups and git hosting for non-owner users open after launch review.
CodeIssuesDiscussionsWikiPull RequestsProjectsCommitsActionsReleasesContributorsPulse● GatesSecuritySettingsDeploymentsPipelineInsightsAgents✨ Explain✨ Ask AI✨ Workspace✨ Spec✨ Tests▓ Debt Map✨ NL Search🏛 Archaeology
claude/adoring-hopper-5x74bqclaude/affectionate-feynman-ykrf1hclaude/architecture-audit-design-wxprenclaude/build-status-update-3MXsfclaude/charming-meitner-mllb5rclaude/compare-gate-gluecron-s4mFQclaude/confident-faraday-tikcwbclaude/continue-work-XMTlIclaude/crontech-gluecron-deploy-7MIECclaude/crontech-platform-setup-SeKfwclaude/design-2026claude/ecstatic-ptolemy-jMdigclaude/enhance-github-integration-QNHdGclaude/fix-aa-loop-issue-PonMQclaude/fix-actions-and-processclaude/fix-desktop-errors-XqoW8claude/fix-red-workflowsclaude/fix-website-access-6FKJNclaude/gatetest-integration-hardeningclaude/github-audit-improvements-bDFr9claude/gluecron-launch-status-FoMRlclaude/hopeful-lamport-olfCTclaude/issue-to-pr-and-protectionsclaude/jolly-heisenberg-2sg1Qclaude/launch-preparation-QmTb6claude/new-session-xk1l7claude/plan-platform-architecture-kkN4yclaude/platform-analysis-roadmap-1nUGLclaude/platform-launch-assessment-8dWV8claude/polish-platform-release-AeDrUclaude/resume-previous-work-KzyLwclaude/review-crontech-handoff-qYEVqclaude/review-project-completeness-lHhS2claude/review-readme-docs-ulqPKclaude/serene-edison-rj87weclaude/setup-multi-repo-dev-BCwNQclaude/ship-fixes-and-tests-Jvz1cclaude/site-audit-competitive-pctlwgclaude/site-migration-vercel-XstpKclaude/standalone-product-repos-XHFTDcopilot/feat-smart-empty-states-keyboard-first-enhancementcopilot/feat-smart-morning-digest-review-context-restorecopilot/fix-and-process-workflowscopilot/update-ai-powered-code-reviewfeat/debt-mapfeat/push-policy-codeowners-hardeningfeat/smart-digest-contextfeat/stage-impactfeat/t1-secret-migrationfeat/u-polishfeat/w-self-hostfeat/w2-claude-configfix/agent-journey-orphan-sweepgatetest/auto-fix-1776586424172gatetest/auto-fix-1776586534814gatetest/auto-fix-1776590685143gatetest/auto-fix-1776590808199mainops/redeploy-retriggerstyle/dxt-cta-themeworktree-agent-a3377aad30d55da26worktree-agent-a7ef607b7ee1d6c74
gluecron.rules.yml5.0 KB · 133 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# Prometheus alerting rules for gluecron.com.
#
# Drop-in for any Prometheus-compatible system: Prometheus itself,
# Grafana Mimir, VictoriaMetrics, Thanos. Point Alertmanager at the
# rules file or include it via `rule_files:` in prometheus.yml.
#
# Scrape target assumed: /metrics on the gluecron container (Prom format).
# Label `job="gluecron"` assumed — edit if your scrape config uses a
# different job name.
#
# Severity convention:
#   critical = page (SMS / phone / Slack-critical channel)
#   warning  = notify (Slack-warning channel, email)
#   info     = dashboard only

groups:
  - name: gluecron-availability
    interval: 30s
    rules:
      - alert: GluecronDown
        expr: up{job="gluecron"} == 0
        for: 2m
        labels:
          severity: critical
          service: gluecron
        annotations:
          summary: "gluecron.com is down"
          description: "Prometheus cannot scrape /metrics on {{ $labels.instance }}. Likely the container exited or Caddy can't reach it. Check `docker compose ps` and `docker compose logs gluecron` on 45.76.171.37."
          runbook: "https://github.com/ccantynz-alt/Gluecron.com/blob/main/DEPLOY_CHECKLIST.md#rollback"

      - alert: GluecronNotReady
        expr: probe_success{instance=~".*/readyz"} == 0
        for: 5m
        labels:
          severity: critical
          service: gluecron
        annotations:
          summary: "gluecron /readyz failing for 5m"
          description: "App is running but /readyz is returning non-200. Usually means the DB (Neon) is unreachable or the git repos volume is unmounted. Check `docker compose exec gluecron bun run src/scripts/db-check.ts` or equivalent."

  - name: gluecron-errors
    interval: 30s
    rules:
      - alert: GluecronHigh5xxRate
        expr: |
          (
            sum(rate(http_requests_total{job="gluecron",status=~"5.."}[5m]))
            /
            sum(rate(http_requests_total{job="gluecron"}[5m]))
          ) > 0.05
        for: 10m
        labels:
          severity: warning
          service: gluecron
        annotations:
          summary: ">5% 5xx rate over 10m"
          description: "Current 5xx rate is {{ $value | humanizePercentage }}. Look at the error-webhook/Sentry sink and recent deploys."

      - alert: GluecronSpike5xx
        expr: |
          sum(rate(http_requests_total{job="gluecron",status=~"5.."}[1m])) > 1
        for: 2m
        labels:
          severity: critical
          service: gluecron
        annotations:
          summary: "5xx spike (>1/s for 2m)"
          description: "Absolute 5xx rate exceeded 1/s. A post-deploy regression or downstream outage."

      - alert: GluecronErrorSinkFailing
        expr: increase(error_sink_failures_total{job="gluecron"}[15m]) > 0
        for: 15m
        labels:
          severity: warning
          service: gluecron
        annotations:
          summary: "Error webhook / Sentry sink failing"
          description: "Errors are being generated but the sink (ERROR_WEBHOOK_URL / SENTRY_DSN) is rejecting them. Check the credentials and the sink's own status page."

  - name: gluecron-latency
    interval: 30s
    rules:
      - alert: GluecronHighLatencyP95
        expr: |
          histogram_quantile(0.95,
            sum by (le) (rate(http_request_duration_seconds_bucket{job="gluecron"}[5m]))
          ) > 2
        for: 15m
        labels:
          severity: warning
          service: gluecron
        annotations:
          summary: "p95 latency >2s for 15m"
          description: "Current p95 is {{ $value }}s. Check DB connection pool, Neon status, and recent slow queries."

  - name: gluecron-autopilot
    interval: 1m
    rules:
      - alert: GluecronAutopilotStalled
        expr: time() - autopilot_last_run_timestamp_seconds{job="gluecron"} > 900
        for: 5m
        labels:
          severity: warning
          service: gluecron
        annotations:
          summary: "Autopilot ticker stalled >15m"
          description: "Autopilot runs every 5m; last tick was {{ $value | humanizeDuration }} ago. If AUTOPILOT_DISABLED=1 this alert should be muted at the receiver. Otherwise investigate the ticker in `src/lib/autopilot.ts`."

  - name: gluecron-resources
    interval: 30s
    rules:
      - alert: GluecronHighMemory
        expr: |
          (container_memory_usage_bytes{name=~".*gluecron.*"}
            / container_spec_memory_limit_bytes{name=~".*gluecron.*"}) > 0.9
        for: 15m
        labels:
          severity: warning
          service: gluecron
        annotations:
          summary: "Container memory >90% of limit"
          description: "Near the OOM cliff. Either raise the compose memory limit or investigate a leak."

      - alert: GluecronDiskFillingFast
        expr: |
          predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[1h], 24*3600) < 0
        for: 30m
        labels:
          severity: warning
          service: gluecron
        annotations:
          summary: "Disk will fill within 24h at current rate"
          description: "Usually the git repos volume growing unchecked. Check `/data/repos` size and retention policy."