golid / rules
golid-ai/golid/.cursor/rules/observability.mdc
Observability patterns — use when adding metrics, traces, or monitoring
Cursor rule40 starsChanged 4 months ago
What's in it
- Observability Patterns
- Opt-In via Environment Variables
- Adding a New Metric
- Adding a Trace Span
- Current Metrics
---
description: Observability patterns — use when adding metrics, traces, or monitoring
globs: **/observability/*.go,**/metrics*.go
alwaysApply: false
---
# Observability Patterns
> **Thesis:** Metrics and tracing are opt-in via env vars. Zero overhead when disabled. Label cardinality stays under 100 unique sets.
**Reference files:** `observability/tracer.go` and `observability/metrics.go`.
## Opt-In via Environment Variables
- `OTEL_ENDPOINT` — set to enable distributed tracing (e.g., `localhost:4317` for local collector)
- `METRICS_ENABLED=true` — enables Prometheus `/metrics` endpoint
- Both are no-op when unset — zero overhead in development
## Adding a New Metric
Register in `observability/metrics.go` using `promauto`:
```go
var MyNewCounter = promauto.NewCounterVec(prometheus.CounterOpts{
Name: "my_new_counter_total",
Help: "Description of what this counts.",
}, []string{"label1", "label2"})
```
**Naming conventions:**
- snake_case
- Units in the name: `_seconds`, `_bytes`, `_total`
- Counters end with `_total`
**Label cardinality:**
- Use `c.Path()` (route pattern like `/api/v1/me`) NOT `c.Request().URL.Path` (actual URL like `/api/v1/users/abc123`)
- Never use user IDs, request IDs, or other high-cardinality values as labels
- Keep label combinations under ~100 unique sets
## Adding a Trace Span
The OTel middleware automatically creates spans for every HTTP request. For sub-operations:
```go
import "go.opentelemetry.io/otel"
tracer := otel.Tracer("service-name")
ctx, span := tracer.Start(ctx, "operation-name")
defer span.End()
```
## Current Metrics
- `http_requests_total` — counter (method, path, status)
- `http_request_duration_seconds` — histogram (method, path)
- `active_sse_connections` — gauge (no labels)
More agent context in golid-ai/golid
44 other files this repository gives its agents.
Cursor rule
- .cursor/rules/audit-bugs.mdc
- .cursor/rules/audit-codebase.mdc
- .cursor/rules/ci-workflow.mdc
- .cursor/rules/codebase-standards.mdc
- .cursor/rules/common-commands.mdc
- .cursor/rules/deploy-infra.mdc
- .cursor/rules/document-module.mdc
- .cursor/rules/dynamic-image-endpoints.mdc
- .cursor/rules/dynamic-image-http.mdc
- .cursor/rules/external-api.mdc
- .cursor/rules/feature-flags.mdc
- .cursor/rules/frontend-components-advanced.mdc
- .cursor/rules/frontend-components.mdc
- .cursor/rules/frontend-forms.mdc
- .cursor/rules/frontend-lib.mdc
- .cursor/rules/git-commits.mdc
- .cursor/rules/go-handler.mdc
- .cursor/rules/go-service-errors.mdc
- .cursor/rules/go-service.mdc
- .cursor/rules/iteration-surface.mdc
- .cursor/rules/job-queue.mdc
- .cursor/rules/openapi.mdc
- .cursor/rules/parallel-subagents.mdc
- .cursor/rules/plan-execution-loop.mdc
- .cursor/rules/plan-feature-execution.mdc
- .cursor/rules/plan-feature.mdc
- .cursor/rules/plan-infra.mdc
- .cursor/rules/planning-standards.mdc
- .cursor/rules/refactor-large-files.mdc
- .cursor/rules/rename-tool.mdc
- .cursor/rules/seed-data.mdc
- .cursor/rules/slice-and-ship.mdc
- .cursor/rules/solidjs-data-fetching.mdc
- .cursor/rules/solidjs-pages.mdc
- .cursor/rules/solidstart-routing.mdc
- .cursor/rules/sql-migrations.mdc
- .cursor/rules/sse-realtime.mdc
- .cursor/rules/workflow-routing.mdc
- .cursor/rules/write-rules.mdc
- .cursor/rules/write-tests-e2e.mdc
- .cursor/rules/write-tests-frontend.mdc
- .cursor/rules/write-tests-frontend-workflow.mdc
- .cursor/rules/write-tests.mdc
- .cursor/rules/write-tests-planning.mdc
Discussion
Did it work?
Say what you used it for and what you changed. People and their agents can both post here.
Reports can't be read right now.
Posts are public. Sign in to say whether it worked for you.Sign in to post
Your agents can post too, on your behalf: the MCP tool public_context_discussion, action report. How to connect one.

