Rebrand: Sentry -> Cairn OBS

Full rebrand across cosmetic branding, code identifiers, and
infrastructure/data-plane naming, using the supplied Cairn OBS logo
package. Cosmetic: favicon/logo swap (also closes a stale license-audit
finding -- the old favicon was SvelteKit's unreplaced scaffold logo),
new centered welcome landing page, larger/legible sidebar logo, page
titles, CLAUDE.md/README/docs prose.

Code identifiers: Go module path github.com/sentry/sentry ->
github.com/cairnobs/cairnobs across all 13 modules and ~91 files (protoc
regenerated); Rust crates sentry-agent/sentry-parser/sentry-search ->
cairnobs-*; CLI sentryctl -> cairnobsctl; Terraform provider fully
renamed (sentry_dashboard etc. -> cairnobs_dashboard, provider type,
env vars); every session/auth cookie name; agent config paths and
Windows service identity.

Deliberately preserved: the gRPC wire protocol's protobuf packages
(sentry.logs.v1, sentry.agent.v1) and their Go import directory
(proto/sentry/...) -- renaming the wire-level package would break every
currently-deployed agent binary (confirmed two real hosts, including
mail.inbuxa.com, are actively streaming through this exact contract)
until rebuilt and redeployed in lockstep with an ingest cutover. Only
the Go module path wrapping the generated code changes.

Infrastructure: every docker-compose container name (root and three
component-level compose files); the Helm chart (directory, Chart.yaml,
named-template helpers, all templates, values.yaml image repos);
Kubernetes Operator (CRD group sentry.io -> cairnobs.io, both CRD YAML
files, Go identifiers, RBAC markers); the coupled enterprise/tenantcrd
package. Caught and fixed real path-coupling bugs along the way: the
Helm chart's search/ingest volume mounts and the dev-only-credential
detection constant vs. docker-compose.yml's literal values had to move
together or a security warning would have silently stopped firing.

Data plane: Postgres database sentry_metadata -> cairnobs_metadata and
role sentry -> cairnobs; ClickHouse database sentry -> cairnobs; Kafka
topic sentry.logs.raw -> cairnobs.logs.raw and its consumer groups.
Source-level defaults, docker-compose.yml, and every migrate.sh/
provision script default updated together; already-applied migration
files left untouched per this repo's immutable-migration convention.

Verified at every layer: all 13 Go modules build/vet/test clean, both
Rust workspaces (agent, search) build/clippy/test clean, npm run check/
build clean, docker compose config validates on all four compose files.
Live-verified against a real docker stack multiple times through this
work, including a final fresh-volume run confirming the actual renamed
Postgres database/role, ClickHouse database, and Kafka topic all work
end to end with a real login and query, zero console errors.
This commit is contained in:
2026-08-21 20:53:32 -07:00
parent 9e21ea17bb
commit 13cf9a30cb
291 changed files with 1565 additions and 1441 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# api
Sentry's query API: a single `POST /query` endpoint accepting either the
Cairn OBS's query API: a single `POST /query` endpoint accepting either the
pipe syntax or raw SQL, compiled and routed across ClickHouse and Tantivy
by `internal/querylang`. Replaces Phase 0/1's two separate placeholder
endpoints (raw-SQL-only `/query`, free-text-only `/search`) — see
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"path"
"strings"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
// store is the narrow interface Handler depends on -- *Store (store.go)
+2 -2
View File
@@ -11,7 +11,7 @@ import (
"net/http/httptest"
"testing"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
func discardLogger() *slog.Logger {
@@ -259,7 +259,7 @@ func TestHandleSetConfigDenylistsSensitivePaths(t *testing.T) {
"/home/alice/.ssh/id_rsa",
"/home/alice/.ssh/authorized_keys",
"/proc/1/environ",
"/etc/sentry-agent/client-key.pem",
"/etc/cairnobs-agent/client-key.pem",
"/opt/app/../../etc/shadow",
"/opt/app/id_ed25519",
}
+6 -6
View File
@@ -22,12 +22,12 @@ import (
"strings"
"time"
"github.com/sentry/sentry/api/ai/costguard"
"github.com/sentry/sentry/api/ai/provider"
"github.com/sentry/sentry/api/ai/router"
"github.com/sentry/sentry/api/authz"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/sentry/sentry/api/internal/querylang/planner"
"github.com/cairnobs/cairnobs/api/ai/costguard"
"github.com/cairnobs/cairnobs/api/ai/provider"
"github.com/cairnobs/cairnobs/api/ai/router"
"github.com/cairnobs/cairnobs/api/authz"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/planner"
)
// SchemaContextSource resolves the calling tenant's grounding data.
+2 -2
View File
@@ -10,8 +10,8 @@ import (
"net/http/httptest"
"testing"
"github.com/sentry/sentry/api/ai/provider"
"github.com/sentry/sentry/api/ai/router"
"github.com/cairnobs/cairnobs/api/ai/provider"
"github.com/cairnobs/cairnobs/api/ai/router"
)
type fakeProvider struct {
+2 -2
View File
@@ -29,8 +29,8 @@ import (
"net/http/httptest"
"testing"
"github.com/sentry/sentry/api/ai/provider/ollama"
"github.com/sentry/sentry/api/ai/router"
"github.com/cairnobs/cairnobs/api/ai/provider/ollama"
"github.com/cairnobs/cairnobs/api/ai/router"
)
// jsonBody marshals v for use as an http.Post body -- the integration
+1 -1
View File
@@ -21,7 +21,7 @@ import (
"strings"
"time"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
)
type Level string
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
)
// A raw-row (non-aggregation) query with no time range and no explicit
+2 -2
View File
@@ -25,8 +25,8 @@ import (
"sync"
"time"
"github.com/sentry/sentry/api/ai/provider"
"github.com/sentry/sentry/api/querylang/executor"
"github.com/cairnobs/cairnobs/api/ai/provider"
"github.com/cairnobs/cairnobs/api/querylang/executor"
)
// staticFields are always present regardless of what's actually been
+2 -2
View File
@@ -6,8 +6,8 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/ai/provider"
"github.com/sentry/sentry/api/querylang/executor"
"github.com/cairnobs/cairnobs/api/ai/provider"
"github.com/cairnobs/cairnobs/api/querylang/executor"
)
// routingFakeRunner returns a canned result keyed by a substring match
+1 -1
View File
@@ -15,7 +15,7 @@ import (
"net/http"
"strings"
"github.com/sentry/sentry/api/ai/provider"
"github.com/cairnobs/cairnobs/api/ai/provider"
)
// Client implements provider.Provider against one Ollama server and one
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"strings"
"testing"
"github.com/sentry/sentry/api/ai/provider"
"github.com/cairnobs/cairnobs/api/ai/provider"
)
// fakeOllamaServer stands in for a real Ollama server, returning the
+8 -8
View File
@@ -4,18 +4,18 @@ import (
"fmt"
"strings"
"github.com/sentry/sentry/api/ai/provider"
"github.com/cairnobs/cairnobs/api/ai/provider"
)
// grammarReference is a condensed version of
// /docs/query-language-reference.md -- every operation's system prompt
// includes this so the model is grounded in Sentry's actual pipe syntax,
// includes this so the model is grounded in Cairn OBS's actual pipe syntax,
// not whatever generic log-query DSL it may have seen in training.
// Trimmed to the parts that matter for generation/explanation (the full
// doc's prose and examples aren't needed here); kept in sync with that
// doc by hand -- if the grammar changes, this needs updating too, same
// as any other place the language is described outside its own parser.
const grammarReference = `Sentry query language (pipe syntax):
const grammarReference = `Cairn OBS query language (pipe syntax):
<base search> | <stage> | <stage> | ...
@@ -64,7 +64,7 @@ func renderSchema(s provider.SchemaContext) string {
}
func translateSystemPrompt(schema provider.SchemaContext) string {
return fmt.Sprintf(`You translate a plain-English question into a Sentry pipe-syntax query. You never explain, never execute anything, never write raw SQL unless the pipe syntax genuinely cannot express the request.
return fmt.Sprintf(`You translate a plain-English question into a Cairn OBS pipe-syntax query. You never explain, never execute anything, never write raw SQL unless the pipe syntax genuinely cannot express the request.
%s
@@ -77,7 +77,7 @@ If you cannot produce a query you're reasonably confident in, set confidence to
}
func completeSystemPrompt(schema provider.SchemaContext) string {
return fmt.Sprintf(`You suggest how to continue a partially-typed Sentry query. You are given everything typed so far; respond with ONLY the suggested continuation text (what should appear after the cursor), not the text already typed, not an explanation.
return fmt.Sprintf(`You suggest how to continue a partially-typed Cairn OBS query. You are given everything typed so far; respond with ONLY the suggested continuation text (what should appear after the cursor), not the text already typed, not an explanation.
%s
@@ -94,12 +94,12 @@ Respond with ONLY a JSON object, no other text, no markdown fences:
// ExplainRequest.RuleFindings' doc comment.
func explainSystemPrompt(hasIntent, hasFindings bool) string {
if hasFindings {
return fmt.Sprintf(`A rule-based check already found one or more real issues with a Sentry query's efficiency (e.g. a missing time range). Your only job is to phrase those findings as a short, clear, actionable suggestion for the person who wrote the query -- do not invent additional issues, do not restate the query's own syntax back at them, do not hedge with "might" or "could" about something the check already confirmed. One or two sentences.
return fmt.Sprintf(`A rule-based check already found one or more real issues with a Cairn OBS query's efficiency (e.g. a missing time range). Your only job is to phrase those findings as a short, clear, actionable suggestion for the person who wrote the query -- do not invent additional issues, do not restate the query's own syntax back at them, do not hedge with "might" or "could" about something the check already confirmed. One or two sentences.
%s`, grammarReference)
}
base := fmt.Sprintf(`You explain what a Sentry query does in plain English, for someone who may not know the query language. Be concise -- two or three sentences, not a line-by-line breakdown unless the query is unusually complex.
base := fmt.Sprintf(`You explain what a Cairn OBS query does in plain English, for someone who may not know the query language. Be concise -- two or three sentences, not a line-by-line breakdown unless the query is unusually complex.
%s`, grammarReference)
if hasIntent {
@@ -109,7 +109,7 @@ func explainSystemPrompt(hasIntent, hasFindings bool) string {
}
func fixSystemPrompt(schema provider.SchemaContext) string {
return fmt.Sprintf(`You fix a broken Sentry query given its error message. Produce a corrected query and a short explanation of what was wrong.
return fmt.Sprintf(`You fix a broken Cairn OBS query given its error message. Produce a corrected query and a short explanation of what was wrong.
%s
+1 -1
View File
@@ -14,7 +14,7 @@
// consume it).
package router
import "github.com/sentry/sentry/api/ai/provider"
import "github.com/cairnobs/cairnobs/api/ai/provider"
type Operation string
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"testing"
"github.com/sentry/sentry/api/ai/provider"
"github.com/cairnobs/cairnobs/api/ai/provider"
)
// namedFakeProvider lets a test tell which configured provider actually
+2 -2
View File
@@ -19,7 +19,7 @@ func TestHTTPAuthorizerForwardsCredentialsAndParsesIdentity(t *testing.T) {
a := NewHTTPAuthorizer(srv.URL)
incoming := httptest.NewRequest(http.MethodPost, "/query", nil)
incoming.Header.Set("Cookie", "sentry_session=abc123")
incoming.Header.Set("Cookie", "cairnobs_session=abc123")
incoming.Header.Set("Authorization", "Bearer service-token-xyz")
identity, err := a.Authorize(incoming)
@@ -29,7 +29,7 @@ func TestHTTPAuthorizerForwardsCredentialsAndParsesIdentity(t *testing.T) {
if identity.TenantID != "acme" || identity.UserID != "u1" || identity.Role != RoleEditor {
t.Fatalf("unexpected identity: %+v", identity)
}
if gotCookie != "sentry_session=abc123" {
if gotCookie != "cairnobs_session=abc123" {
t.Fatalf("Cookie header not forwarded, got %q", gotCookie)
}
if gotAuth != "Bearer service-token-xyz" {
+15 -15
View File
@@ -1,4 +1,4 @@
// Command api is Sentry's query API: a single POST /query endpoint
// Command api is Cairn OBS's query API: a single POST /query endpoint
// accepting either the pipe syntax or raw SQL, compiled and routed
// across ClickHouse and search by internal/querylang. See
// queryapi and /docs/query-language-design.md for why this is
@@ -23,20 +23,20 @@ import (
"github.com/ClickHouse/clickhouse-go/v2"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/sentry/sentry/api/agents"
"github.com/sentry/sentry/api/ai/aiapi"
"github.com/sentry/sentry/api/ai/grounding"
"github.com/sentry/sentry/api/ai/provider/ollama"
"github.com/sentry/sentry/api/ai/router"
"github.com/sentry/sentry/api/authz"
"github.com/sentry/sentry/api/dashboards"
"github.com/sentry/sentry/api/httpserver"
"github.com/sentry/sentry/api/internal/config"
"github.com/sentry/sentry/api/localauth"
"github.com/sentry/sentry/api/logretention"
"github.com/sentry/sentry/api/queryapi"
"github.com/sentry/sentry/api/querylang/executor"
"github.com/sentry/sentry/api/searchclient"
"github.com/cairnobs/cairnobs/api/agents"
"github.com/cairnobs/cairnobs/api/ai/aiapi"
"github.com/cairnobs/cairnobs/api/ai/grounding"
"github.com/cairnobs/cairnobs/api/ai/provider/ollama"
"github.com/cairnobs/cairnobs/api/ai/router"
"github.com/cairnobs/cairnobs/api/authz"
"github.com/cairnobs/cairnobs/api/dashboards"
"github.com/cairnobs/cairnobs/api/httpserver"
"github.com/cairnobs/cairnobs/api/internal/config"
"github.com/cairnobs/cairnobs/api/localauth"
"github.com/cairnobs/cairnobs/api/logretention"
"github.com/cairnobs/cairnobs/api/queryapi"
"github.com/cairnobs/cairnobs/api/querylang/executor"
"github.com/cairnobs/cairnobs/api/searchclient"
)
// groundingRefreshInterval matches chwriter.Registry/search's
+2 -2
View File
@@ -7,7 +7,7 @@ import (
"log/slog"
"net/http"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
// store is the narrow interface Handler depends on -- *Store (store.go)
@@ -187,7 +187,7 @@ func (h *Handler) handleGet(w http.ResponseWriter, r *http.Request) {
func (h *Handler) handleExport(w http.ResponseWriter, r *http.Request) {
// Export is the same document GET /dashboards/{id} returns -- the
// import endpoint below consumes exactly this shape, and so does
// `sentryctl dashboards apply`, so there's one JSON contract used
// `cairnobsctl dashboards apply`, so there's one JSON contract used
// from every call site rather than a bespoke export format.
h.handleGet(w, r)
}
+1 -1
View File
@@ -11,7 +11,7 @@ import (
"strings"
"testing"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
// fakeStore enforces tenant scoping the same way store.go's real
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"context"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
// Permission is one dashboard_permissions row -- see
+1 -1
View File
@@ -11,7 +11,7 @@
//
// docker run --rm --network sentry_default -v $(pwd)/../../..:/src -w /src/api \
// -e DASHBOARDS_TEST_POSTGRES_ADDR=metadata-postgres:5432 \
// -e DASHBOARDS_TEST_POSTGRES_PASSWORD=sentry-dev-only \
// -e DASHBOARDS_TEST_POSTGRES_PASSWORD=cairnobs-dev-only \
// golang:1.25-alpine go test ./dashboards/... -run Integration -v
package dashboards
+3 -3
View File
@@ -1,4 +1,4 @@
module github.com/sentry/sentry/api
module github.com/cairnobs/cairnobs/api
go 1.25.0
@@ -6,12 +6,12 @@ require (
github.com/ClickHouse/clickhouse-go/v2 v2.48.0
github.com/google/uuid v1.6.0
github.com/jackc/pgx/v5 v5.10.0
github.com/sentry/sentry/proto v0.0.0-00010101000000-000000000000
github.com/cairnobs/cairnobs/proto v0.0.0-00010101000000-000000000000
golang.org/x/crypto v0.55.0
google.golang.org/grpc v1.83.0
)
replace github.com/sentry/sentry/proto => ../proto
replace github.com/cairnobs/cairnobs/proto => ../proto
require (
github.com/ClickHouse/ch-go v0.74.0 // indirect
+1 -1
View File
@@ -82,7 +82,7 @@ type PostgresConfig struct {
// real deployment that skips docker-compose.override.yml would
// otherwise go live with a password anyone can read straight off
// GitHub. See DevCredentialWarnings.
const devOnlyCredential = "sentry-dev-only"
const devOnlyCredential = "cairnobs-dev-only"
// DevCredentialWarnings reports which configured credentials still
// equal docker-compose.yml's literal dev-only default -- cmd/api/main.go
+1 -1
View File
@@ -33,7 +33,7 @@ func TestLoadInvalidTimeoutErrors(t *testing.T) {
// TestDevCredentialWarnings is the regression test for the
// security-audit finding that docker-compose.yml's hardcoded
// "sentry-dev-only" password has no runtime fail-safe if an operator
// "cairnobs-dev-only" password has no runtime fail-safe if an operator
// forgets to override it for a real deployment.
func TestDevCredentialWarnings(t *testing.T) {
if got := (Config{}).DevCredentialWarnings(); len(got) != 0 {
+2 -2
View File
@@ -9,8 +9,8 @@ import (
"fmt"
"strconv"
"github.com/sentry/sentry/api/internal/querylang/ast"
"github.com/sentry/sentry/api/internal/querylang/lexer"
"github.com/cairnobs/cairnobs/api/internal/querylang/ast"
"github.com/cairnobs/cairnobs/api/internal/querylang/lexer"
)
// Parse parses a pipe-syntax query. Callers are responsible for routing
+1 -1
View File
@@ -3,7 +3,7 @@ package parser
import (
"testing"
"github.com/sentry/sentry/api/internal/querylang/ast"
"github.com/cairnobs/cairnobs/api/internal/querylang/ast"
)
func TestParseSimpleFilter(t *testing.T) {
+3 -3
View File
@@ -9,9 +9,9 @@ import (
"strings"
"time"
"github.com/sentry/sentry/api/internal/querylang/ast"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/sentry/sentry/api/internal/querylang/parser"
"github.com/cairnobs/cairnobs/api/internal/querylang/ast"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/parser"
)
// Language selects which syntax a query is written in.
@@ -5,7 +5,7 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
)
var fixedNow = time.Date(2026, 8, 14, 12, 0, 0, 0, time.UTC)
+3 -3
View File
@@ -5,7 +5,7 @@ import (
"errors"
"net/http"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
// sessionStore is the narrow interface Authorizer depends on -- *Store
@@ -19,7 +19,7 @@ type sessionStore interface {
// needs to know about implicitly (via credentials: 'include', not by
// name -- the browser handles the cookie, JS never reads it since it's
// HttpOnly).
const sessionCookieName = "sentry_local_session"
const sessionCookieName = "cairnobs_local_session"
// Authorizer implements api/authz.Authorizer against local_sessions --
// wiring a non-nil *Authorizer into api/cmd/api/main.go's authorizer
@@ -37,7 +37,7 @@ func NewAuthorizer(store sessionStore) *Authorizer {
var errNoCredential = errors.New("localauth: no session credential presented")
// Authorize checks Authorization: Bearer first (sentryctl and other
// Authorize checks Authorization: Bearer first (cairnobsctl and other
// non-browser callers), then the session cookie (the web UI) -- same
// precedence authz.HTTPAuthorizer's caller-side forwarding implies,
// and the same reason POST /auth/login's response body returns the raw
+1 -1
View File
@@ -5,7 +5,7 @@ import (
"strconv"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
// fakeStore implements both store (handler.go) and sessionStore
+4 -4
View File
@@ -8,7 +8,7 @@ import (
"net/http"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
const maxBodyBytes = 1 << 20 // 1 MiB, same cap as queryapi/dashboards/agents
@@ -36,8 +36,8 @@ type store interface {
type CookieConfig struct {
// Domain is typically empty for local dev (host-only cookie, works
// fine when web/api are both localhost:<port>) and something like
// ".sentry.example.com" in production, so the same cookie is sent to
// api.sentry.example.com and alerting.sentry.example.com too -- see
// ".cairnobs.example.com" in production, so the same cookie is sent to
// api.cairnobs.example.com and alerting.cairnobs.example.com too -- see
// /docs (deployment runbook) for the subdomain scheme this assumes.
Domain string
// Secure defaults to true (the cookie is never sent over plain
@@ -129,7 +129,7 @@ type loginRequest struct {
type sessionResponse struct {
// Token duplicates what the Set-Cookie header already carries,
// specifically for non-browser callers with no cookie jar --
// sentryctl captures this into SENTRYCTL_TOKEN and sends it back as
// cairnobsctl captures this into CAIRNOBSCTL_TOKEN and sends it back as
// Authorization: Bearer (see authorizer.go's credentialFromRequest,
// which accepts either). The web UI ignores this field entirely and
// relies on the cookie.
+1 -1
View File
@@ -10,7 +10,7 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
func newTestHandler(t *testing.T, fs *fakeStore) (*Handler, *http.ServeMux) {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
func TestLoginLimiterAllowsUpToMax(t *testing.T) {
+1 -1
View File
@@ -37,7 +37,7 @@ import (
"github.com/jackc/pgx/v5/pgconn"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
var (
+2 -2
View File
@@ -10,7 +10,7 @@
//
// docker run --rm --network sentry_default -v $(pwd)/../../..:/src -w /src/api \
// -e LOCALAUTH_TEST_POSTGRES_ADDR=metadata-postgres:5432 \
// -e LOCALAUTH_TEST_POSTGRES_PASSWORD=sentry-dev-only \
// -e LOCALAUTH_TEST_POSTGRES_PASSWORD=cairnobs-dev-only \
// golang:1.25-alpine go test ./localauth/... -run Integration -v
package localauth
@@ -25,7 +25,7 @@ import (
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
func integrationStore(t *testing.T) *Store {
+1 -1
View File
@@ -8,7 +8,7 @@ import (
"strconv"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
const maxBodyBytes = 1 << 20 // 1 MiB, same cap as localauth/dashboards/agents
+1 -1
View File
@@ -13,7 +13,7 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/cairnobs/cairnobs/api/authz"
)
func discardLogger() *slog.Logger {
+1 -1
View File
@@ -13,7 +13,7 @@
// service is a genuine per-log-record dimension already, not something
// this package invents: storage/migrations/0001_create_logs_table.sql
// has always had a `service` column, and distinct services on one host
// are a real, already-supported shape (separate sentry-agent processes
// are a real, already-supported shape (separate cairnobs-agent processes
// on the same machine, each with its own agent.toml `service` -- see
// /docs/agent-management-design.md), not merely a per-agent label.
//
+5 -5
View File
@@ -1,4 +1,4 @@
// Package queryapi is Sentry's query API: a single POST /query endpoint
// Package queryapi is Cairn OBS's query API: a single POST /query endpoint
// accepting either the pipe syntax or raw SQL, compiled by
// querylang/planner and executed by querylang/executor. Replaces Phase
// 0/1's two separate placeholder endpoints (raw-SQL-only /query,
@@ -19,10 +19,10 @@ import (
"strings"
"time"
"github.com/sentry/sentry/api/ai/costguard"
"github.com/sentry/sentry/api/authz"
"github.com/sentry/sentry/api/internal/querylang/planner"
"github.com/sentry/sentry/api/querylang/executor"
"github.com/cairnobs/cairnobs/api/ai/costguard"
"github.com/cairnobs/cairnobs/api/authz"
"github.com/cairnobs/cairnobs/api/internal/querylang/planner"
"github.com/cairnobs/cairnobs/api/querylang/executor"
)
// AuditLogger is core's extension point for query audit logging --
+2 -2
View File
@@ -12,8 +12,8 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/authz"
"github.com/sentry/sentry/api/querylang/executor"
"github.com/cairnobs/cairnobs/api/authz"
"github.com/cairnobs/cairnobs/api/querylang/executor"
)
type fakeSQLRunner struct {
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"context"
"fmt"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
)
type Result struct {
+1 -1
View File
@@ -7,7 +7,7 @@ import (
"testing"
"time"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
)
func mustParseTime(t *testing.T, s string) time.Time {
+1 -1
View File
@@ -6,7 +6,7 @@ import (
"strings"
"time"
"github.com/sentry/sentry/api/internal/querylang/ir"
"github.com/cairnobs/cairnobs/api/internal/querylang/ir"
)
// defaultRowLimit is the safety net when a raw-row query has neither an
+1 -1
View File
@@ -12,7 +12,7 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
searchv1 "github.com/sentry/sentry/proto/sentry/search/v1"
searchv1 "github.com/cairnobs/cairnobs/proto/sentry/search/v1"
)
type Client struct {