Compare commits
55
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8754b81a2b | ||
|
|
af8f421cdf | ||
|
|
32ca0bdd58 | ||
|
|
5e5f940a86 | ||
|
|
8d1e2bf1ab | ||
|
|
20f6a31655 | ||
|
|
1c70f0aa14 | ||
|
|
fd610f0ee5 | ||
|
|
00c4148228 | ||
|
|
3d0f553b2b | ||
|
|
092ff9df8f | ||
|
|
e99f62d225 | ||
|
|
a132573506 | ||
|
|
dfc19783b6 | ||
|
|
60a97b18a6 | ||
|
|
c54831a4cb | ||
|
|
04be1205fa | ||
|
|
270e477d82 | ||
|
|
ab4571d46d | ||
|
|
0c4f408229 | ||
|
|
a3914aa608 | ||
|
|
39ec64e519 | ||
|
|
38ec2af7ed | ||
|
|
cbb18f4cc3 | ||
|
|
d72b218f47 | ||
|
|
fbec133ddf | ||
|
|
0dcbf23604 | ||
|
|
b8578ae178 | ||
|
|
e57ffe3d32 | ||
|
|
09e675d385 | ||
|
|
e124412b55 | ||
|
|
f84c89d18f | ||
|
|
861971d4ca | ||
|
|
93f62dc326 | ||
|
|
a3fa905341 | ||
|
|
5f9fcf974c | ||
|
|
b560c86b1d | ||
|
|
870a21dc5b | ||
|
|
e010159544 | ||
|
|
6e2e9b93bb | ||
|
|
95957da1fb | ||
|
|
fe4bfd3cf4 | ||
|
|
dc2882d675 | ||
|
|
3ac8ca7395 | ||
|
|
eb2de99089 | ||
|
|
12e4cacf03 | ||
|
|
ab2fe97396 | ||
|
|
f2ab8a12b0 | ||
|
|
53b455b4a7 | ||
|
|
0ab53eb746 | ||
|
|
8e64601291 | ||
|
|
767533f8ef | ||
|
|
0a13ef6982 | ||
|
|
e9bcd48f5f | ||
|
|
69896d6536 |
@@ -1,12 +1,12 @@
|
||||
---
|
||||
name: playwright-test-generator
|
||||
description: Use this agent to convert a SigNoz E2E test plan into Playwright spec files under `tests/e2e/tests/<feature>/`. Examples — <example>Context: A test plan exists and needs to be turned into runnable specs. user: 'Generate the dashboards list specs from the plan in tests/e2e/specs/dashboards-list-test-plan.md' assistant: 'Using the generator agent to drive each scenario in a real browser and write the corresponding Playwright tests.'</example>
|
||||
description: Use this agent to convert a O11y E2E test plan into Playwright spec files under `tests/e2e/tests/<feature>/`. Examples — <example>Context: A test plan exists and needs to be turned into runnable specs. user: 'Generate the dashboards list specs from the plan in tests/e2e/specs/dashboards-list-test-plan.md' assistant: 'Using the generator agent to drive each scenario in a real browser and write the corresponding Playwright tests.'</example>
|
||||
tools: Glob, Grep, Read, Bash, mcp__playwright-test__browser_click, mcp__playwright-test__browser_drag, mcp__playwright-test__browser_evaluate, mcp__playwright-test__browser_file_upload, mcp__playwright-test__browser_handle_dialog, mcp__playwright-test__browser_hover, mcp__playwright-test__browser_navigate, mcp__playwright-test__browser_press_key, mcp__playwright-test__browser_select_option, mcp__playwright-test__browser_snapshot, mcp__playwright-test__browser_type, mcp__playwright-test__browser_verify_element_visible, mcp__playwright-test__browser_verify_list_visible, mcp__playwright-test__browser_verify_text_visible, mcp__playwright-test__browser_verify_value, mcp__playwright-test__browser_wait_for, mcp__playwright-test__generator_read_log, mcp__playwright-test__generator_setup_page, mcp__playwright-test__generator_write_test
|
||||
model: sonnet
|
||||
color: blue
|
||||
---
|
||||
|
||||
You are the Playwright Test Generator for the SigNoz frontend. You take a plan written by `playwright-test-planner` and produce runnable Playwright specs that match the conventions documented in [docs/contributing/tests/e2e.md](../../docs/contributing/tests/e2e.md). **Read that doc first.** Adhere to it.
|
||||
You are the Playwright Test Generator for the O11y frontend. You take a plan written by `playwright-test-planner` and produce runnable Playwright specs that match the conventions documented in [docs/contributing/tests/e2e.md](../../docs/contributing/tests/e2e.md). **Read that doc first.** Adhere to it.
|
||||
|
||||
# Repo conventions you must follow
|
||||
|
||||
@@ -83,7 +83,7 @@ For a plan section:
|
||||
#### TC-01 page chrome and core controls render
|
||||
**Steps:**
|
||||
1. Navigate to `/dashboard`
|
||||
2. Verify the page title is "SigNoz | All Dashboards"
|
||||
2. Verify the page title is "O11y | All Dashboards"
|
||||
3. Verify the heading "Dashboards" is visible
|
||||
**Cleanup:** delete the seeded dashboard via API.
|
||||
```
|
||||
@@ -136,7 +136,7 @@ test.describe('Dashboards List Page', () => {
|
||||
|
||||
await gotoDashboardsList(page);
|
||||
|
||||
await expect(page).toHaveTitle('SigNoz | All Dashboards');
|
||||
await expect(page).toHaveTitle('O11y | All Dashboards');
|
||||
await expect(
|
||||
page.getByRole('heading', { name: 'Dashboards', level: 1 }),
|
||||
).toBeVisible();
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
name: playwright-test-healer
|
||||
description: Use this agent to debug and fix failing SigNoz E2E Playwright tests. Examples — <example>Context: A spec is red. user: 'tests/e2e/tests/dashboards/list.spec.ts is failing, fix it' assistant: 'Using the healer agent to debug each failing scenario and adjust the spec.'</example> <example>Context: After a frontend change a previously-green spec broke. user: 'TC-09 in alerts started failing' assistant: 'Launching the healer to investigate.'</example>
|
||||
description: Use this agent to debug and fix failing O11y E2E Playwright tests. Examples — <example>Context: A spec is red. user: 'tests/e2e/tests/dashboards/list.spec.ts is failing, fix it' assistant: 'Using the healer agent to debug each failing scenario and adjust the spec.'</example> <example>Context: After a frontend change a previously-green spec broke. user: 'TC-09 in alerts started failing' assistant: 'Launching the healer to investigate.'</example>
|
||||
tools: Glob, Grep, Read, Write, Edit, Bash, mcp__playwright-test__browser_console_messages, mcp__playwright-test__browser_evaluate, mcp__playwright-test__browser_generate_locator, mcp__playwright-test__browser_network_requests, mcp__playwright-test__browser_snapshot, mcp__playwright-test__test_debug, mcp__playwright-test__test_list, mcp__playwright-test__test_run
|
||||
model: sonnet
|
||||
color: red
|
||||
---
|
||||
|
||||
You are the Playwright Test Healer for the SigNoz E2E suite. You debug and fix red specs with a methodical approach. Read [docs/contributing/tests/e2e.md](../../docs/contributing/tests/e2e.md) before you start — it documents the harness and the conventions you must preserve.
|
||||
You are the Playwright Test Healer for the O11y E2E suite. You debug and fix red specs with a methodical approach. Read [docs/contributing/tests/e2e.md](../../docs/contributing/tests/e2e.md) before you start — it documents the harness and the conventions you must preserve.
|
||||
|
||||
# Preconditions
|
||||
|
||||
@@ -24,7 +24,7 @@ Don't try to start the stack yourself — it can take ~4 minutes on a cold build
|
||||
3. **Per failing test, debug.** Use `mcp__playwright-test__test_debug` to attach. When the test pauses on the error:
|
||||
- `browser_snapshot` to read the current accessibility tree.
|
||||
- `browser_console_messages` for client-side errors.
|
||||
- `browser_network_requests` for API failures (the SigNoz API requires `Authorization: Bearer <localStorage.AUTH_TOKEN>`; 401s usually mean the test bypassed the fixture).
|
||||
- `browser_network_requests` for API failures (the O11y API requires `Authorization: Bearer <localStorage.AUTH_TOKEN>`; 401s usually mean the test bypassed the fixture).
|
||||
- `browser_generate_locator` to suggest a stable locator if the failing one drifted.
|
||||
4. **Root-cause.** Distinguish between:
|
||||
- **Selector drift** — the app changed `data-testid` or text. Fix the locator. Prefer `data-testid` (grep `frontend/src/<feature-dir>/` for the new one).
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
name: playwright-test-planner
|
||||
description: Use this agent to create a comprehensive E2E test plan for a SigNoz frontend feature. Examples — <example>Context: A new feature has shipped and we need test coverage. user: 'Plan E2E tests for the alerts list page' assistant: 'I'll use the planner agent to read the relevant frontend source, navigate the page in a real browser, and produce a structured test plan.' <commentary>Test planning needs both source code understanding and live browser exploration — perfect for this agent.</commentary></example> <example>Context: User wants edge-case coverage on an existing feature. user: 'What scenarios are we missing for dashboard variables?' assistant: 'Launching the planner agent to map flows and identify gaps.'</example>
|
||||
description: Use this agent to create a comprehensive E2E test plan for a O11y frontend feature. Examples — <example>Context: A new feature has shipped and we need test coverage. user: 'Plan E2E tests for the alerts list page' assistant: 'I'll use the planner agent to read the relevant frontend source, navigate the page in a real browser, and produce a structured test plan.' <commentary>Test planning needs both source code understanding and live browser exploration — perfect for this agent.</commentary></example> <example>Context: User wants edge-case coverage on an existing feature. user: 'What scenarios are we missing for dashboard variables?' assistant: 'Launching the planner agent to map flows and identify gaps.'</example>
|
||||
tools: Glob, Grep, Read, Write, Bash, mcp__playwright-test__browser_click, mcp__playwright-test__browser_close, mcp__playwright-test__browser_console_messages, mcp__playwright-test__browser_drag, mcp__playwright-test__browser_evaluate, mcp__playwright-test__browser_file_upload, mcp__playwright-test__browser_handle_dialog, mcp__playwright-test__browser_hover, mcp__playwright-test__browser_navigate, mcp__playwright-test__browser_navigate_back, mcp__playwright-test__browser_network_requests, mcp__playwright-test__browser_press_key, mcp__playwright-test__browser_select_option, mcp__playwright-test__browser_snapshot, mcp__playwright-test__browser_take_screenshot, mcp__playwright-test__browser_type, mcp__playwright-test__browser_wait_for, mcp__playwright-test__planner_setup_page
|
||||
model: sonnet
|
||||
color: green
|
||||
---
|
||||
|
||||
You are an expert E2E test planner for the SigNoz frontend, working inside the SigNoz monorepo. Your test plans drive Playwright specs that run against the local pytest-bootstrapped backend. Read [docs/contributing/tests/e2e.md](../../docs/contributing/tests/e2e.md) before planning — it documents the harness, the `authedPage` fixture, the TC-NN naming convention, and the self-contained-state principle that every plan you write must respect.
|
||||
You are an expert E2E test planner for the O11y frontend, working inside the O11y monorepo. Your test plans drive Playwright specs that run against the local pytest-bootstrapped backend. Read [docs/contributing/tests/e2e.md](../../docs/contributing/tests/e2e.md) before planning — it documents the harness, the `authedPage` fixture, the TC-NN naming convention, and the self-contained-state principle that every plan you write must respect.
|
||||
|
||||
You will:
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ services:
|
||||
- CLICKHOUSE_SKIP_USER_SETUP=1
|
||||
networks:
|
||||
- default
|
||||
- signoz-devenv
|
||||
- o11y-devenv
|
||||
zookeeper:
|
||||
image: observe/zookeeper:3.7.1
|
||||
container_name: zookeeper
|
||||
@@ -88,8 +88,8 @@ services:
|
||||
restart: on-failure
|
||||
networks:
|
||||
- default
|
||||
- signoz-devenv
|
||||
- o11y-devenv
|
||||
|
||||
networks:
|
||||
signoz-devenv:
|
||||
name: signoz-devenv
|
||||
o11y-devenv:
|
||||
name: o11y-devenv
|
||||
+3
-3
@@ -37,8 +37,8 @@ services:
|
||||
- "host.docker.internal:host-gateway"
|
||||
networks:
|
||||
- default
|
||||
- signoz-devenv
|
||||
- o11y-devenv
|
||||
|
||||
networks:
|
||||
signoz-devenv:
|
||||
name: signoz-devenv
|
||||
o11y-devenv:
|
||||
name: o11y-devenv
|
||||
@@ -23,7 +23,7 @@ assignees: ''
|
||||
3.
|
||||
|
||||
## Version information
|
||||
* **Signoz version**:
|
||||
* **O11y version**:
|
||||
* **Browser version**:
|
||||
* **Your OS and version**:
|
||||
* **Your CPU Architecture**(ARM/Intel):
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
<rect width="1280" height="640" fill="#0A0A0A"/>
|
||||
<svg x="96" y="215" width="210" height="210" viewBox="0 0 67 67"><path d="M22.21 67V44.6369H0V67H22.21Z" fill="#fff"/><path d="M66.7038 22.3184H22.2534L0.0878906 44.6367H44.4634L66.7038 22.3184Z" fill="#fff"/><path d="M22.21 0H0V22.3184H22.21V0Z" fill="#fff"/><path d="M66.7198 0H44.5098V22.3184H66.7198V0Z" fill="#fff"/><path d="M66.7198 67V44.6369H44.5098V67H66.7198Z" fill="#fff"/></svg>
|
||||
<text x="378" y="276" font-family="Inter,system-ui,-apple-system,sans-serif" font-size="78" font-weight="800" letter-spacing="-2" fill="#ffffff">o11y</text>
|
||||
<text x="378" y="322" font-family="Inter,system-ui,sans-serif" font-size="30" fill="#ffffff" opacity=".66">SigNoz is an open-source observability platform native to OpenTelemetry…</text>
|
||||
<text x="378" y="322" font-family="Inter,system-ui,sans-serif" font-size="30" fill="#ffffff" opacity=".66">O11y is an open-source observability platform native to OpenTelemetry…</text>
|
||||
<rect x="378" y="338" width="806" height="3" rx="1.5" fill="#ffffff" opacity=".9"/>
|
||||
<text x="378" y="390" font-family="Inter,system-ui,sans-serif" font-size="24" font-weight="600" fill="#ffffff" opacity=".5">github.com/hanzoai</text>
|
||||
<text x="1184" y="390" text-anchor="end" font-family="Inter,system-ui,sans-serif" font-size="24" font-weight="600" fill="#ffffff" opacity=".5">hanzo.ai</text>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
@@ -12,7 +12,7 @@ permissions:
|
||||
jobs:
|
||||
build:
|
||||
name: build & test
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: hanzo-build-linux-amd64
|
||||
env:
|
||||
GOPRIVATE: github.com/hanzoai/*
|
||||
GOSUMDB: "off"
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: hanzoai/cloud
|
||||
ref: 884bdebd2d73880421028b67a1ef337aedc0e06f
|
||||
ref: ce6c4dc374160fae6873dd6ad6222bf52d803f71
|
||||
token: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }}
|
||||
path: cloud
|
||||
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
run: go build ./...
|
||||
|
||||
# TestEmailRejected asserts an emersion/go-smtp v0.24.0 error string that
|
||||
# upstream (wholesale-synced SigNoz) formats with quotes; skip only it.
|
||||
# upstream (wholesale-synced O11y) formats with quotes; skip only it.
|
||||
- name: go test
|
||||
working-directory: o11y
|
||||
run: go test -count=1 -skip '^TestEmailRejected$' ./...
|
||||
|
||||
@@ -26,7 +26,7 @@ concurrency:
|
||||
jobs:
|
||||
build-push:
|
||||
name: build & push o11y-site image
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: hanzo-build-linux-amd64
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
@@ -16,7 +16,7 @@ concurrency:
|
||||
jobs:
|
||||
build-push:
|
||||
name: build & push image
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: hanzo-build-linux-amd64
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -61,6 +61,12 @@ jobs:
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
provenance: false
|
||||
# cmd/community pulls PRIVATE hanzoai forks (sqlite, datastore-go); the
|
||||
# Dockerfile mounts this as secret id `gh_token` and configs
|
||||
# url.insteadOf before `go build`. Without it the build 128s on
|
||||
# `git ls-remote https://github.com/hanzoai/sqlite` (auth required).
|
||||
secrets: |
|
||||
gh_token=${{ secrets.GH_PAT }}
|
||||
build-args: |
|
||||
VERSION=${{ steps.meta.outputs.version }}
|
||||
COMMIT_HASH=${{ github.sha }}
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
# write permission is required for autolabeler
|
||||
# otherwise, read permission is required at least
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: hanzo-build-linux-amd64
|
||||
steps:
|
||||
# (Optional) GitHub Enterprise requires GHE_HOST variable set
|
||||
#- name: Set GHE_HOST
|
||||
|
||||
+7
-6
@@ -40,11 +40,11 @@ frontend/src/constants/env.ts
|
||||
**/__debug_bin
|
||||
|
||||
.env
|
||||
pkg/query-service/signoz.db
|
||||
pkg/query-service/o11y.db
|
||||
|
||||
pkg/query-service/tests/test-deploy/data/
|
||||
|
||||
ee/query-service/signoz.db
|
||||
ee/query-service/o11y.db
|
||||
|
||||
ee/query-service/tests/test-deploy/data/
|
||||
|
||||
@@ -54,8 +54,8 @@ ee/query-service/tests/test-deploy/data/
|
||||
*.db-shm
|
||||
*.db-wal
|
||||
**/db
|
||||
/deploy/docker/clickhouse-setup/data/
|
||||
/deploy/docker-swarm/clickhouse-setup/data/
|
||||
/deploy/docker/datastore-setup/data/
|
||||
/deploy/docker-swarm/datastore-setup/data/
|
||||
bin/
|
||||
.local/
|
||||
*/query-service/queries.active
|
||||
@@ -78,8 +78,8 @@ __debug_bin**
|
||||
# goreleaser
|
||||
dist/
|
||||
|
||||
# ignore user_scripts that is fetched by init-clickhouse
|
||||
deploy/common/clickhouse/user_scripts/
|
||||
# ignore user_scripts that is fetched by the datastore init container
|
||||
deploy/common/datastore/user_scripts/
|
||||
|
||||
queries.active
|
||||
|
||||
@@ -232,3 +232,4 @@ cython_debug/
|
||||
pyrightconfig.json
|
||||
|
||||
|
||||
community
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ Currently, the Hanzo O11y Community Advocate Program is **invite-only**. We're s
|
||||
|
||||
We'll be working closely with our first advocates to shape the program details, benefits, and structure based on what works best for everyone involved.
|
||||
|
||||
If you're interested in learning more about the program or want to get more involved in the Hanzo O11y community, join our [Slack community](https://signoz-community.slack.com/) and let us know!
|
||||
If you're interested in learning more about the program or want to get more involved in the Hanzo O11y community, join our [Slack community](https://o11y-community.slack.com/) and let us know!
|
||||
|
||||
---
|
||||
|
||||
|
||||
+11
-11
@@ -5,19 +5,19 @@ Thank you for your interest in contributing to our project! We greatly value fee
|
||||
## How can I contribute?
|
||||
|
||||
### Finding Issues to Work On
|
||||
- Check our [existing open issues](https://github.com/Hanzo O11y/signoz/issues?q=is%3Aopen+is%3Aissue)
|
||||
- Look for [good first issues](https://github.com/Hanzo O11y/signoz/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to start with
|
||||
- Review [recently closed issues](https://github.com/Hanzo O11y/signoz/issues?q=is%3Aissue+is%3Aclosed) to avoid duplicates
|
||||
- Check our [existing open issues](https://github.com/Hanzo O11y/o11y/issues?q=is%3Aopen+is%3Aissue)
|
||||
- Look for [good first issues](https://github.com/Hanzo O11y/o11y/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to start with
|
||||
- Review [recently closed issues](https://github.com/Hanzo O11y/o11y/issues?q=is%3Aissue+is%3Aclosed) to avoid duplicates
|
||||
|
||||
### Types of Contributions
|
||||
|
||||
1. **Report Bugs**: Use our [Bug Report template](https://github.com/Hanzo O11y/signoz/issues/new?assignees=&labels=&template=bug_report.md&title=)
|
||||
2. **Request Features**: Submit using [Feature Request template](https://github.com/Hanzo O11y/signoz/issues/new?assignees=&labels=&template=feature_request.md&title=)
|
||||
1. **Report Bugs**: Use our [Bug Report template](https://github.com/Hanzo O11y/o11y/issues/new?assignees=&labels=&template=bug_report.md&title=)
|
||||
2. **Request Features**: Submit using [Feature Request template](https://github.com/Hanzo O11y/o11y/issues/new?assignees=&labels=&template=feature_request.md&title=)
|
||||
3. **Improve Documentation**: Create an issue with the `documentation` label
|
||||
4. **Report Performance Issues**: Use our [Performance Issue template](https://github.com/Hanzo O11y/signoz/issues/new?assignees=&labels=&template=performance-issue-report.md&title=)
|
||||
5. **Request Dashboards**: Submit using [Dashboard Request template](https://github.com/Hanzo O11y/signoz/issues/new?assignees=&labels=dashboard-template&projects=&template=request_dashboard.md&title=%5BDashboard+Request%5D+)
|
||||
6. **Report Security Issues**: Follow our [Security Policy](https://github.com/Hanzo O11y/signoz/security/policy)
|
||||
7. **Join Discussions**: Participate in [project discussions](https://github.com/Hanzo O11y/signoz/discussions)
|
||||
4. **Report Performance Issues**: Use our [Performance Issue template](https://github.com/Hanzo O11y/o11y/issues/new?assignees=&labels=&template=performance-issue-report.md&title=)
|
||||
5. **Request Dashboards**: Submit using [Dashboard Request template](https://github.com/Hanzo O11y/o11y/issues/new?assignees=&labels=dashboard-template&projects=&template=request_dashboard.md&title=%5BDashboard+Request%5D+)
|
||||
6. **Report Security Issues**: Follow our [Security Policy](https://github.com/Hanzo O11y/o11y/security/policy)
|
||||
7. **Join Discussions**: Participate in [project discussions](https://github.com/Hanzo O11y/o11y/discussions)
|
||||
|
||||
### Creating Helpful Issues
|
||||
|
||||
@@ -71,8 +71,8 @@ Each repository has its own contributing guidelines. Please refer to the guideli
|
||||
## How can I get help?
|
||||
|
||||
Need assistance? Join our Slack community:
|
||||
- [`#contributing`](https://signoz-community.slack.com/archives/C01LWQ8KS7M)
|
||||
- [`#contributing-frontend`](https://signoz-community.slack.com/archives/C027134DM8B)
|
||||
- [`#contributing`](https://o11y-community.slack.com/archives/C01LWQ8KS7M)
|
||||
- [`#contributing-frontend`](https://o11y-community.slack.com/archives/C027134DM8B)
|
||||
|
||||
## Where do I go from here?
|
||||
|
||||
|
||||
+14
-6
@@ -8,9 +8,12 @@
|
||||
# and no sibling checkout is required — cloud lives only in the root `mount.go`
|
||||
# cloud-embed adapter, which `cmd/community` never pulls in.
|
||||
#
|
||||
# All external modules in cmd/community's graph are public (hanzoai/* forks of
|
||||
# signoz-otel-collector, govaluate, clickhouse-go-mock, expr), so the module
|
||||
# fetch needs no private git auth — only GOPRIVATE + GOSUMDB=off.
|
||||
# cmd/community's graph pulls PRIVATE hanzoai/* forks (hanzoai/sqlite +
|
||||
# hanzoai/datastore-go — the sqlite + datastore drivers added by the driver
|
||||
# swap), so the module fetch DOES need git auth. A `gh_token` build secret
|
||||
# (docker.yaml passes secrets.GH_PAT) is mounted and wired via git
|
||||
# url.insteadOf before the build; GOPRIVATE + GOSUMDB=off route hanzoai/*
|
||||
# direct and skip the sumdb.
|
||||
#
|
||||
# The browser SPA is served at the edge by hanzoai/static (house-native static
|
||||
# plugin), not bundled here, so the server runs headless (O11Y_WEB_ENABLED=false).
|
||||
@@ -24,7 +27,8 @@ FROM golang:1.26.4-alpine AS backend
|
||||
RUN apk add --no-cache git ca-certificates
|
||||
WORKDIR /src
|
||||
|
||||
# hanzoai/* modules are fetched via direct git (all public); trust go.sum.
|
||||
# hanzoai/* modules fetched via direct git (some private — auth'd by the
|
||||
# gh_token secret mounted on the build RUN below); trust go.sum.
|
||||
ENV GOPRIVATE=github.com/hanzoai/* \
|
||||
GOSUMDB=off \
|
||||
CGO_ENABLED=0 \
|
||||
@@ -46,6 +50,10 @@ ARG VARIANT=community
|
||||
# not include cloud.
|
||||
RUN --mount=type=cache,target=/go/pkg/mod \
|
||||
--mount=type=cache,target=/root/.cache/go-build \
|
||||
--mount=type=secret,id=gh_token \
|
||||
if [ -s /run/secrets/gh_token ]; then \
|
||||
git config --global url."https://x-access-token:$(cat /run/secrets/gh_token)@github.com/".insteadOf "https://github.com/"; \
|
||||
fi && \
|
||||
VERPKG=github.com/hanzoai/o11y/pkg/version && \
|
||||
go build -trimpath -tags timetzdata \
|
||||
-ldflags "-s -w \
|
||||
@@ -62,11 +70,11 @@ RUN --mount=type=cache,target=/go/pkg/mod \
|
||||
FROM alpine:3.20
|
||||
LABEL org.opencontainers.image.source="https://github.com/hanzoai/o11y" \
|
||||
org.opencontainers.image.title="hanzo-o11y" \
|
||||
org.opencontainers.image.description="Hanzo O11y — OTLP-native observability (SigNoz fork), standalone community server" \
|
||||
org.opencontainers.image.description="Hanzo O11y — OTLP-native observability (O11y fork), standalone community server" \
|
||||
maintainer="hanzoai"
|
||||
|
||||
RUN apk add --no-cache ca-certificates && \
|
||||
mkdir -p /var/lib/signoz
|
||||
mkdir -p /var/lib/o11y
|
||||
|
||||
WORKDIR /root
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
# dashboard SPA at the edge, and the ingress routes o11y.hanzo.ai here while
|
||||
# /api/* goes to the backend (universe infra/k8s/o11y/ingress.yaml).
|
||||
#
|
||||
# CONTENT: built FROM SOURCE (frontend/) now that the @signozhq -> @hanzo/ui
|
||||
# CONTENT: built FROM SOURCE (frontend/) now that the @o11yhq -> @hanzo/ui
|
||||
# migration is complete, tsgo --noEmit is clean, and `pnpm build` is green. The
|
||||
# production build resolves the [[.BaseHref]]/[[.Settings]] Go-template placeholders
|
||||
# at build time (vite.config.ts) so index.html is placeholder-free; assets are
|
||||
|
||||
@@ -8,38 +8,64 @@
|
||||
</h1>
|
||||
|
||||
Hanzo's observability spine — OTLP in, Hanzo Datastore (ClickHouse OLAP) on disk,
|
||||
serving o11y.hanzo.ai. A clean full fork of **latest SigNoz** (synced to upstream
|
||||
serving o11y.hanzo.ai. A clean full fork of **latest O11y** (synced to upstream
|
||||
`main`), building green (`go build ./...` = 0), MIT-only (no `ee/`).
|
||||
|
||||
## Dependency ownership (fork boundary)
|
||||
|
||||
All SigNoz-branded platform deps are OWNED as public `hanzoai/*` forks — never
|
||||
All O11y-branded platform deps are OWNED as public `hanzoai/*` forks — never
|
||||
consumed as upstream-branded modules. Do NOT reintroduce `github.com/SigNoz/*`.
|
||||
|
||||
| upstream | fork | tag pinned | fork module path |
|
||||
|---|---|---|---|
|
||||
| SigNoz/signoz-otel-collector | hanzoai/signoz-otel-collector | v0.144.6 | `github.com/hanzoai/signoz-otel-collector` (renamed) |
|
||||
| SigNoz/signoz-otel-collector | hanzoai/otel-collector | v0.144.7 | `github.com/hanzoai/otel-collector` (renamed) |
|
||||
| SigNoz/clickhouse-go-mock | hanzoai/clickhouse-go-mock | v0.14.1 | `github.com/hanzoai/clickhouse-go-mock` (renamed) |
|
||||
| SigNoz/govaluate | hanzoai/govaluate | v0.1.0 | `github.com/hanzoai/govaluate` (renamed) |
|
||||
| SigNoz/expr | hanzoai/expr | v1.17.8 | `github.com/expr-lang/expr` (KEEP upstream path — consumed via `replace`) |
|
||||
| SigNoz/signoz | hanzoai/signoz | synced to upstream `main` (3e6339019) | owned base; `pkg/ cmd/` re-synced wholesale to latest, `ee/` stripped (MIT-only) |
|
||||
| SigNoz/signoz | hanzoai/o11y | synced to upstream `main` (3e6339019) | owned base; `pkg/ cmd/` re-synced wholesale to latest, `ee/` stripped (MIT-only) |
|
||||
|
||||
The vendored SigNoz source in `pkg/ ee/ cmd/` self-references as
|
||||
The vendored O11y source in `pkg/ ee/ cmd/` self-references as
|
||||
`github.com/hanzoai/o11y/...` (NOT `github.com/SigNoz/signoz/...`). Generic
|
||||
ecosystem libs (`golang.org/x`, `google.golang.org`, prometheus, otel, gin,
|
||||
cobra, `luxfi/*`) are NOT forked — only the SigNoz platform.
|
||||
cobra, `luxfi/*`) are NOT forked — only the O11y platform.
|
||||
|
||||
## Build
|
||||
|
||||
`go build ./...` = 0 on `main`. The tree is a clean fork of latest SigNoz — the
|
||||
`go build ./...` = 0 on `main`. The tree is a clean fork of latest O11y — the
|
||||
prior "missing 22 packages" gap was a version-skew artifact (a franken-fork mixing
|
||||
SigNoz eras); it dissolved when the whole `pkg/ cmd/` tree was re-synced to one
|
||||
consistent upstream version. Keep it that way: bump by re-syncing to a newer SigNoz
|
||||
O11y eras); it dissolved when the whole `pkg/ cmd/` tree was re-synced to one
|
||||
consistent upstream version. Keep it that way: bump by re-syncing to a newer O11y
|
||||
`main`, not by piecemeal-porting individual packages.
|
||||
|
||||
The real server binary is `./cmd/community` (NOT `./cmd/server`, which does not
|
||||
exist). Build check: `GOPRIVATE='github.com/hanzoai/*' GOSUMDB=off go build ./cmd/community`.
|
||||
|
||||
### go.mod is paired with the ci.yaml cloud pin — bump BOTH or CI goes red
|
||||
|
||||
Root `mount.go` imports `github.com/hanzoai/cloud`, and go.mod resolves it via
|
||||
`replace => ../cloud`. There is no such sibling in CI, so `ci.yaml` checks one out
|
||||
**at an exact commit** (`ref:` under "Checkout hanzoai/cloud") — deliberately, since
|
||||
cloud's `main` drifts independently. That makes go.mod and the ci.yaml ref **ONE fact
|
||||
in two places**: touch either alone and `go build ./...` dies with the misleading
|
||||
`go: updates to go.mod needed; to update it: go mod tidy`. This kept CI red for weeks.
|
||||
|
||||
To re-tidy: `go mod tidy` against the sibling, then **bump the ci.yaml `ref` to the
|
||||
same cloud commit in the same PR**. Two traps:
|
||||
|
||||
- Tidy resolves against **whatever `../cloud` is checked out right now** — that clone
|
||||
is a working copy, often on someone's feature branch, and it moves under you. Derive
|
||||
versions from the commit you are pinning (`git -C ../cloud show <sha>:go.mod`), not
|
||||
from the branch that happens to be there. Same class of hazard as the stale luxfi
|
||||
clones.
|
||||
- The resulting version jumps are **not upgrade decisions** — MVS forces them, because
|
||||
cloud already requires them. Do not "fix" them back down; re-pair the two sides.
|
||||
|
||||
Since a green build is NOT sufficient evidence (`hanzoai/zip` → `zap-proto/zip` can
|
||||
boot-panic while CI stays green), smoke-test the binary: it must reach
|
||||
`Query server started listening on 0.0.0.0:8080`. `TestEmailRejected`
|
||||
(`alertmanagernotify/email`) fails on any go.mod — upstream string mismatch; ci.yaml
|
||||
already `-skip`s it by name.
|
||||
|
||||
## Container image (`ghcr.io/hanzoai/o11y`)
|
||||
|
||||
Root `Dockerfile` + `.github/workflows/docker.yaml` build a standalone community
|
||||
@@ -51,28 +77,36 @@ This replaces an unrelated upstream image that previously squatted the tags.
|
||||
no cloud sibling is checked out. (Cloud lives only in root `mount.go`, compiled by
|
||||
the `go build ./...` CI job — so `ci.yaml` still needs the sibling; the container
|
||||
does not.) A bare `go mod download` WOULD fail (cloud→../cloud); build the one pkg.
|
||||
- All external deps in its graph are PUBLIC hanzoai/* forks (signoz-otel-collector,
|
||||
govaluate, clickhouse-go-mock, expr) → no private git auth, just
|
||||
`GOPRIVATE=github.com/hanzoai/* GOSUMDB=off`. GHCR push uses `GH_PAT || GITHUB_TOKEN`
|
||||
(the package is linked to hanzoai/o11y, so GITHUB_TOKEN+`packages: write` suffices).
|
||||
- Its graph pulls **PRIVATE** hanzoai/* forks — `hanzoai/sqlite` and
|
||||
`hanzoai/datastore-go` (the sqlite + datastore drivers added by the driver
|
||||
swap) — alongside the public ones (otel-collector, govaluate,
|
||||
clickhouse-go-mock, expr). So the module fetch DOES need git auth: the
|
||||
Dockerfile mounts a `gh_token` build secret (docker.yaml passes
|
||||
`secrets.GH_PAT`) and wires `git url.insteadOf` before `go build`. Without it
|
||||
the build 128s on `git ls-remote https://github.com/hanzoai/sqlite` ("could
|
||||
not read Username … terminal prompts disabled"). `GOPRIVATE=github.com/hanzoai/*
|
||||
GOSUMDB=off` still route hanzoai/* direct and skip the sumdb. GHCR push uses
|
||||
`GH_PAT || GITHUB_TOKEN` (package linked to hanzoai/o11y, so
|
||||
GITHUB_TOKEN+`packages: write` suffices for the push; GH_PAT is needed for the
|
||||
cross-repo private module fetch).
|
||||
- Runs headless: `O11Y_WEB_ENABLED=false`. `routerweb` os.Stat()s its web dir at
|
||||
boot and fatals if missing; the SPA is served by hanzoai/static at the edge. The
|
||||
`frontend/` tree is NOT bundled — its `pnpm-lock.yaml` is STALE vs `package.json`
|
||||
(mid rolldown-vite/oxlint migration), fails `--frozen-lockfile`. TODO: regen lockfile.
|
||||
- Listens on `0.0.0.0:8080` (constants.HTTPHostPort); sqlstore default = sqlite at
|
||||
`/var/lib/signoz/signoz.db`; needs an external ClickHouse for telemetry.
|
||||
`/var/lib/o11y/o11y.db`; needs an external ClickHouse for telemetry.
|
||||
|
||||
Boot fix: `pkg/instrumentation/sdk.go` hard-pinned `semconv/v1.40.0.SchemaURL`,
|
||||
which contrib `NewSDK` merges against `resource.Default()` (schema 1.41.0, from the
|
||||
re-synced otel/sdk) — OTEL rejects differing non-empty schema URLs, so `signoz.New`
|
||||
re-synced otel/sdk) — OTEL rejects differing non-empty schema URLs, so `o11y.New`
|
||||
crashed at boot with "conflicting Schema URL". Now sourced from the detected resource
|
||||
(`resource.SchemaURL()`), version-agnostic. Verified: boots, runs migrations, serves :8080.
|
||||
|
||||
## Hanzo layer to re-apply on the green base
|
||||
|
||||
The re-sync reverted these Hanzo-original packages to SigNoz canonical to kill the
|
||||
The re-sync reverted these Hanzo-original packages to O11y canonical to kill the
|
||||
skew; re-layer them on top (they live in git history at `c9ab975`): `pkg/authz/iamauthz`
|
||||
(Hanzo IAM authz — REQUIRED per the house "always use Hanzo IAM" rule; SigNoz's
|
||||
(Hanzo IAM authz — REQUIRED per the house "always use Hanzo IAM" rule; O11y's
|
||||
OpenFGA is the current default and must be replaced), `pkg/zapreceiver` +
|
||||
`pkg/zapmetricreceiver` (ZAP-native OTLP receivers), `pkg/billing` + `pkg/types/billingtypes`.
|
||||
Preserved through the sync: module path, `mount.go` (the `cloud.Register`/zip mount
|
||||
@@ -110,7 +144,7 @@ now sets `SetupCompleted = true` unconditionally — no org/user counting, no ro
|
||||
gate. So `/api/v1/register` is inert ("self-registration is disabled") and the SPA
|
||||
never shows an onboarding wizard. Native login/session/invite endpoints remain
|
||||
compiled but are dead: no native users are ever created, so nothing can log in
|
||||
through them. `apikeyidentn` (service-account API keys, `SIGNOZ-API-KEY`) stays for
|
||||
through them. `apikeyidentn` (service-account API keys, `O11Y-API-KEY`) stays for
|
||||
machine/OTLP identity — that is not human auth.
|
||||
|
||||
**Security boundary (important):** trusting `X-Org-Id`/`X-User-Id` is safe **only
|
||||
@@ -124,14 +158,41 @@ data (llmobs observations/scores/sessions, dashboards, …) is scoped by
|
||||
`claims.OrgID`; ClickHouse telemetry is isolated only insofar as the emit path tags
|
||||
the same org id via resource attributes.
|
||||
|
||||
## Config env naming (debranded — no SIGNOZ/CLICKHOUSE)
|
||||
## No third-party trackers — analytics is Insights, support chat is Hanzo Chat
|
||||
|
||||
o11y ships **zero** third-party SaaS trackers. The upstream fork wired in product
|
||||
analytics, onboarding tours and a support-chat widget, and the frontend build gated
|
||||
each on `VITE_*_ENABLED !== 'false'` — **opt-OUT**, so an operator who set nothing
|
||||
shipped all three: a self-hosted observability tool phoning home to third parties with
|
||||
its users' data, `index.html` injecting vendor `<script>` tags on every page load, and
|
||||
the chat block HMAC-hashing the logged-in user's email for the vendor. All removed
|
||||
(`web.Settings`/`SettingsConfig`, `docs/config/web-settings.json`, index.html, vite
|
||||
defines, window typings). Do not reintroduce them.
|
||||
|
||||
**Sentry stays** — our own fork (`hanzoai/sentry`) — and is **opt-IN** (`=== 'true'`).
|
||||
Product analytics is Hanzo Insights (`@hanzo/insights`, first-party). `logEvent` →
|
||||
`/event` on our own backend is likewise first-party; it is not a tracker.
|
||||
|
||||
`frontend/src/types/generated/webSettings.ts` is GENERATED from
|
||||
`docs/config/web-settings.json` — edit the schema and run
|
||||
`pnpm generate:config:web-settings`, never hand-edit the `.ts`.
|
||||
|
||||
Support chat is **one way**: `utils/supportChat.ts` → `openSupportChat()` (Hanzo Chat).
|
||||
All call sites (SideNav, Support, LaunchChatSupport) route through it — no per-component
|
||||
chat integration. It delegates to `utils/navigation.ts` → `openInNewTab`, which the
|
||||
repo's own `o11y/no-raw-absolute-path` lint rule mandates over a bare `window.open`
|
||||
(`withBasePath` passes external URLs through untouched). `openInNewTab` passes
|
||||
`noopener`: `window.open`, unlike `<a target="_blank">`, does not imply it, and without
|
||||
it every opened tab can navigate us back via `window.opener` (reverse tabnabbing).
|
||||
|
||||
## Config env naming (debranded — no O11Y/CLICKHOUSE)
|
||||
|
||||
Operator-facing env vars and config keys are Hanzo-branded, never SigNoz/ClickHouse.
|
||||
Naming-only: the store is still ClickHouse wire-protocol under the hood — the
|
||||
`clickhouse-go` driver, `db.system=clickhouse` semconv, and the `clickhouse`
|
||||
telemetrystore provider registration all stay (implementation, not surface).
|
||||
|
||||
- **Env prefix `O11Y_`** (was `SIGNOZ_`): set once at `pkg/config/envprovider/provider.go`
|
||||
- **Env prefix `O11Y_`** (was `O11Y_`): set once at `pkg/config/envprovider/provider.go`
|
||||
(`prefix`). The koanf env provider derives every structured key from it. Single `_`
|
||||
is the `::` path delimiter, double `__` is a literal `_`.
|
||||
- **Store key segment `datastore`** (was `clickhouse`): the `mapstructure` tag on
|
||||
@@ -139,21 +200,49 @@ telemetrystore provider registration all stay (implementation, not surface).
|
||||
`Clickhouse` name — internal). YAML key `telemetrystore.datastore`. Provider
|
||||
selector value stays `clickhouse`.
|
||||
- **Canonical DSN key `O11Y_DATASTORE_DSN`** (flat — THE operator knob): wired as an
|
||||
override alias in `pkg/signoz/config.go` (`mergeAndEnsureBackwardCompatibility`),
|
||||
override alias in `pkg/o11y/config.go` (`mergeAndEnsureBackwardCompatibility`),
|
||||
mapping into `telemetrystore.datastore.dsn`. Value → Hanzo Datastore
|
||||
(`tcp://datastore.hanzo.svc:9000/?database=o11y`, set at deploy time). It takes
|
||||
precedence over the structured `O11Y_TELEMETRYSTORE_DATASTORE_DSN`, which stays as
|
||||
an internal fallback (don't document/set the long form). Keep operator knobs flat and
|
||||
short — no `O11Y_A_B_C_D` compounds where a flat alias reads better.
|
||||
- **Legacy override aliases** in `pkg/signoz/config.go` (`mergeAndEnsureBackwardCompatibility`)
|
||||
- **Legacy override aliases** in `pkg/o11y/config.go` (`mergeAndEnsureBackwardCompatibility`)
|
||||
debranded too: `O11Y_LOCAL_DB_PATH`, `DatastoreUrl`, `O11Y_SAAS_SEGMENT_KEY`,
|
||||
`O11Y_JWT_SECRET`; and headless web via `O11Y_WEB_ENABLED` / `O11Y_WEB_DIRECTORY`.
|
||||
- **Deliberately NOT renamed** (implementation / not app-config surface): the `clickhouse`
|
||||
provider value + `MustNewName("clickhouse")` registration, `clickhouse-go` driver + mock,
|
||||
SQL/table/DB names (`signoz_traces` etc.) and query-template vars
|
||||
(`SIGNOZ_START_TIME`/`SIGNOZ_END_TIME`), the ClickHouse **server** container in `deploy/`
|
||||
(service/volume names, its own `CLICKHOUSE_SKIP_USER_SETUP` env), the `SIGNOZ_E2E_*`
|
||||
SQL/table/DB names (`o11y_traces` etc.) and query-template vars
|
||||
(`O11Y_START_TIME`/`O11Y_END_TIME`), the ClickHouse **server** container in `deploy/`
|
||||
(service/volume names, its own `CLICKHOUSE_SKIP_USER_SETUP` env), the `O11Y_E2E_*`
|
||||
Playwright test-harness vars (separate `tests/e2e` subsystem). The
|
||||
`O11Y_OTEL_COLLECTOR_DATASTORE_*` keys in `deploy/` are consumed by the
|
||||
`hanzoai/signoz-otel-collector` fork — renamed here for consistency; that fork must
|
||||
`hanzoai/otel-collector` fork — renamed here for consistency; that fork must
|
||||
accept the `_DATASTORE_` segment (coordinated cross-repo rename).
|
||||
|
||||
## Native datastore metrics driver (`pkg/datastoremetrics`) — the fork unblock
|
||||
|
||||
- **What**: the o11y-native write path for metrics. `Writer.WriteMetrics` satisfies
|
||||
`zapmetricreceiver.Handler`, decoding a ZAP `MetricBatch` straight into the datastore
|
||||
`time_series_v4` + `samples_v4` tables over **upstream** `clickhouse-go` v2 (via
|
||||
`telemetrystore.TelemetryStore.ClickhouseDB()`), reusing the `telemetrymetrics`
|
||||
table-name constants so a series written here is immediately queryable.
|
||||
- **Why it exists**: the stock `o11yclickhousemetrics` exporter serialises OTLP
|
||||
exponential histograms as a DDSketch into `exp_hist.sketch`, which needs the FORKED
|
||||
ch-go (`proto.DD/.Store/.IndexMapping`). That fork conflicts with the upstream ch-go
|
||||
the query plane pins — the reason metrics ingest could not move in-process. This driver
|
||||
sidesteps the fork: the ZAP wire carries CLASSIC Prometheus shapes, so histograms
|
||||
decompose into `<name>.bucket{le=…}` / `.count` / `.sum` samples and summaries into
|
||||
`.quantile{quantile=…}` — no sketch, no `exp_hist`, NO fork. Only the two tables the
|
||||
query plane already reads.
|
||||
- **Fingerprint parity**: the labels→fingerprint hash (FNV-1a, hierarchical
|
||||
resource→scope→point, salted with `__name__`) is ported verbatim from the fork's
|
||||
`internal/common/fingerprint` (which is import-walled), so join keys are byte-identical
|
||||
and the existing reader joins samples to series unchanged. Column strings match too:
|
||||
temporality `Cumulative`/`Unspecified`, type `Sum`/`Gauge`/`Histogram`/`Summary`.
|
||||
- **Wire-in**: `datastoremetrics.NewWriter(store.ClickhouseDB())` +
|
||||
`zapmetricreceiver.New(Config{OnBatch: w.WriteMetrics})`. Consumed by `hanzoai/cloud`'s
|
||||
embedded o11y runtime (opt-in `O11Y_METRICS_ZAP_LISTEN`, fail-soft) so the standalone
|
||||
`otel-collector` metrics path can later repoint to cloud (verify-then-cutover).
|
||||
- **Boundary unchanged**: the physical `o11y_metrics.*_v4` names still live in
|
||||
`telemetrymetrics` (the source of truth this driver reuses) — renaming them is a
|
||||
datastore migration, out of scope here.
|
||||
|
||||
@@ -51,9 +51,9 @@ help: ## Displays help.
|
||||
##############################################################
|
||||
# devenv commands
|
||||
##############################################################
|
||||
.PHONY: devenv-clickhouse
|
||||
devenv-clickhouse: ## Run clickhouse in devenv
|
||||
@cd .devenv/docker/clickhouse; \
|
||||
.PHONY: devenv-datastore
|
||||
devenv-datastore: ## Run datastore in devenv
|
||||
@cd .devenv/docker/datastore; \
|
||||
docker compose -f compose.yaml up -d
|
||||
|
||||
.PHONY: devenv-postgres
|
||||
@@ -63,20 +63,20 @@ devenv-postgres: ## Run postgres in devenv
|
||||
|
||||
.PHONY: devenv-otel-collector
|
||||
devenv-otel-collector: ## Run otel-collector in devenv (requires datastore to be running)
|
||||
@cd .devenv/docker/signoz-otel-collector; \
|
||||
@cd .devenv/docker/otel-collector; \
|
||||
docker compose -f compose.yaml up -d
|
||||
|
||||
.PHONY: devenv-up
|
||||
devenv-up: devenv-clickhouse devenv-otel-collector ## Start both datastore and otel-collector for local development
|
||||
devenv-up: devenv-datastore devenv-otel-collector ## Start both datastore and otel-collector for local development
|
||||
@echo "Development environment is ready!"
|
||||
@echo " - Datastore: http://localhost:8123"
|
||||
@echo " - OTEL Collector: grpc://localhost:4317, http://localhost:4318"
|
||||
|
||||
.PHONY: devenv-clickhouse-clean
|
||||
devenv-clickhouse-clean: ## Clean all ClickHouse data from filesystem
|
||||
@echo "Removing ClickHouse data..."
|
||||
@rm -rf .devenv/docker/clickhouse/fs/tmp/*
|
||||
@echo "ClickHouse data cleaned!"
|
||||
.PHONY: devenv-datastore-clean
|
||||
devenv-datastore-clean: ## Clean all Datastore data from filesystem
|
||||
@echo "Removing Datastore data..."
|
||||
@rm -rf .devenv/docker/datastore/fs/tmp/*
|
||||
@echo "Datastore data cleaned!"
|
||||
|
||||
##############################################################
|
||||
# go commands
|
||||
@@ -209,11 +209,11 @@ py-lint: ## Run ruff check across the shared tests project
|
||||
@cd tests && uv run ruff check --fix .
|
||||
|
||||
.PHONY: py-test-setup
|
||||
py-test-setup: ## Bring up the shared SigNoz backend used by integration and e2e tests
|
||||
py-test-setup: ## Bring up the shared O11y backend used by integration and e2e tests
|
||||
@cd tests && uv run pytest --basetemp=./tmp/ -vv --reuse --capture=no integration/bootstrap/setup.py::test_setup
|
||||
|
||||
.PHONY: py-test-teardown
|
||||
py-test-teardown: ## Tear down the shared SigNoz backend
|
||||
py-test-teardown: ## Tear down the shared O11y backend
|
||||
@cd tests && uv run pytest --basetemp=./tmp/ -vv --teardown --capture=no integration/bootstrap/setup.py::test_teardown
|
||||
|
||||
.PHONY: py-test
|
||||
|
||||
@@ -6,7 +6,40 @@ licensed under the MIT Expat license:
|
||||
|
||||
Copyright (c) 2020-present SigNoz Inc.
|
||||
|
||||
Forked from https://github.com/SigNoz/signoz (SigNoz core, MIT Expat), synced
|
||||
to upstream main at commit 3e6339019. The import history was squashed, so the
|
||||
repository root commit is a Hanzo branding commit rather than the upstream
|
||||
commit history.
|
||||
|
||||
Only the MIT Expat-licensed portions of SigNoz are used here. SigNoz's
|
||||
source-available "ee/" and "cmd/enterprise/" code (governed by the separate,
|
||||
non-OSS SigNoz Enterprise License) is NOT included in this repository and is
|
||||
never redistributed.
|
||||
|
||||
DEVIATIONS
|
||||
|
||||
The following changes distinguish this distribution from upstream SigNoz. They
|
||||
are recorded for provenance and do not alter the MIT Expat license terms above.
|
||||
|
||||
* Product rebranded to "o11y" (Hanzo o11y): Go module github.com/hanzoai/o11y,
|
||||
frontend package @hanzo/o11y, served title "Hanzo O11y", Hanzo logo and icon.
|
||||
* The SigNoz "ee/" and "cmd/enterprise/" directories (SigNoz Enterprise License,
|
||||
non-OSS) are excluded entirely; this is an MIT Expat-only core distribution.
|
||||
* Upstream Go modules renamed to Hanzo forks: SigNoz/signoz-otel-collector ->
|
||||
github.com/hanzoai/otel-collector, SigNoz/govaluate -> github.com/hanzoai/govaluate.
|
||||
* github.com/expr-lang/expr is consumed via a go.mod replace directive pointing
|
||||
at github.com/hanzoai/expr.
|
||||
* The ClickHouse mock and SQL builder/parser dependencies are flipped to the
|
||||
hanzo-ds/* forks (hanzo-ds/go, hanzo-ds/mock, hanzo-ds/sqlbuilder, hanzo-ds/sqlparser).
|
||||
* Telemetry storage is debranded: the legacy signoz_* ClickHouse databases and
|
||||
their signoz_-prefixed tables are renamed to o11y_* identifiers
|
||||
(deploy/datastore/migrations/0001_rename_signoz_to_o11y.sql).
|
||||
* Native Hanzo IAM authorization is added (pkg/authz/iamauthz) with per-request
|
||||
org scoping via the X-Org-Id header derived from the JWT.
|
||||
* Native Hanzo API surfaces are added under pkg/apiserver/o11yapiserver,
|
||||
including error tracking, LLM observability, Sentry-compatible ingest, and a
|
||||
community embed accessor.
|
||||
* The service runs behind the Hanzo gateway and mounts as the o11y subsystem of
|
||||
the unified cloud binary per HIP-0106.
|
||||
* Operator-facing environment variables and configuration keys are Hanzo-branded
|
||||
rather than SigNoz-branded.
|
||||
|
||||
+11
-11
@@ -1,21 +1,21 @@
|
||||
<p align="center">
|
||||
<img src="https://res.cloudinary.com/dcv3epinx/image/upload/v1618904450/signoz-images/LogoGithub_sigfbu.svg" alt="Hanzo O11y-logo" width="240" />
|
||||
<img src="https://res.cloudinary.com/dcv3epinx/image/upload/v1618904450/o11y-images/LogoGithub_sigfbu.svg" alt="Hanzo O11y-logo" width="240" />
|
||||
|
||||
<p align="center">Überwache deine Anwendungen und behebe Probleme in deinen bereitgestellten Anwendungen. Hanzo O11y ist eine Open Source Alternative zu DataDog, New Relic, etc.</p>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="Downloads" src="https://img.shields.io/docker/pulls/signoz/query-service?label=Downloads"> </a>
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/signoz/signoz"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,signoz,observability">
|
||||
<img alt="Downloads" src="https://img.shields.io/docker/pulls/o11y/query-service?label=Downloads"> </a>
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/o11y/o11y"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,o11y,observability">
|
||||
<img alt="tweet" src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social"> </a>
|
||||
</p>
|
||||
|
||||
<h3 align="center">
|
||||
<a href="https://o11y.hanzo.ai/docs"><b>Dokumentation</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.md"><b>Readme auf Englisch </b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.zh-cn.md"><b>ReadMe auf Chinesisch</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.pt-br.md"><b>ReadMe auf Portugiesisch</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.md"><b>Readme auf Englisch </b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.zh-cn.md"><b>ReadMe auf Chinesisch</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.pt-br.md"><b>ReadMe auf Portugiesisch</b></a> •
|
||||
<a href="https://o11y.hanzo.ai/slack"><b>Slack Community</b></a> •
|
||||
<a href="https://twitter.com/Hanzo O11yHq"><b>Twitter</b></a>
|
||||
</h3>
|
||||
@@ -154,7 +154,7 @@ Außerdem hat Hanzo O11y noch mehr spezielle Funktionen im Vergleich zu Jaeger:
|
||||
|
||||
### Hanzo O11y vs Elastic
|
||||
|
||||
- Die Verwaltung von Hanzo O11y-Protokollen basiert auf 'ClickHouse', einem spaltenbasierten OLAP-Datenspeicher, der aggregierte Protokollanalyseabfragen wesentlich effizienter macht.
|
||||
- Die Verwaltung von Hanzo O11y-Protokollen basiert auf einem spaltenbasierten OLAP-Datenspeicher, der aggregierte Protokollanalyseabfragen wesentlich effizienter macht.
|
||||
- 50 % geringerer Ressourcenbedarf im Vergleich zu Elastic während der Aufnahme.
|
||||
|
||||
Wir haben Benchmarks veröffentlicht, die Elastic mit SignNoz vergleichen. Schauen Sie es sich [hier](https://o11y.hanzo.ai/blog/logs-performance-benchmark/?utm_source=github-readme&utm_medium=logs-benchmark)
|
||||
@@ -188,10 +188,10 @@ Du findest unsere Dokumentation unter https://o11y.hanzo.ai/docs/. Falls etwas u
|
||||
|
||||
Werde Teil der [slack community](https://o11y.hanzo.ai/slack) um mehr über verteilte Einzelschritt-Fehlersuche, Messung von Systemzuständen oder Hanzo O11y zu erfahren und sich mit anderen Nutzern und Mitwirkenden in Verbindung zu setzen.
|
||||
|
||||
Falls du irgendwelche Ideen, Fragen oder Feedback hast, kannst du sie gerne über unsere [Github Discussions](https://github.com/Hanzo O11y/signoz/discussions) mit uns teilen.
|
||||
Falls du irgendwelche Ideen, Fragen oder Feedback hast, kannst du sie gerne über unsere [Github Discussions](https://github.com/Hanzo O11y/o11y/discussions) mit uns teilen.
|
||||
|
||||
Wie immer, Dank an unsere großartigen Mitwirkenden!
|
||||
|
||||
<a href="https://github.com/signoz/signoz/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=signoz/signoz" />
|
||||
<a href="https://github.com/o11y/o11y/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=o11y/o11y" />
|
||||
</a>
|
||||
|
||||
@@ -51,17 +51,17 @@ Implements:
|
||||
<p align="center">All your logs, metrics, and traces in one place. Monitor your application, spot issues before they occur and troubleshoot downtime quickly with rich context. Hanzo O11y is a cost-effective open-source alternative to Datadog and New Relic. Visit <a href="https://o11y.hanzo.ai" target="_blank">o11y.hanzo.ai</a> for the full documentation, tutorials, and guide.</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/signoz/signoz"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,signoz,observability">
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/o11y/o11y"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,o11y,observability">
|
||||
<img alt="tweet" src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social"> </a>
|
||||
</p>
|
||||
|
||||
|
||||
<h3 align="center">
|
||||
<a href="https://o11y.hanzo.ai/docs"><b>Documentation</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.zh-cn.md"><b>ReadMe in Chinese</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.de-de.md"><b>ReadMe in German</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.pt-br.md"><b>ReadMe in Portuguese</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.zh-cn.md"><b>ReadMe in Chinese</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.de-de.md"><b>ReadMe in German</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.pt-br.md"><b>ReadMe in Portuguese</b></a> •
|
||||
<a href="https://o11y.hanzo.ai/slack"><b>Slack Community</b></a> •
|
||||
<a href="https://twitter.com/Hanzo O11yHq"><b>Twitter</b></a>
|
||||
</h3>
|
||||
@@ -80,7 +80,7 @@ You can [instrument](https://o11y.hanzo.ai/docs/instrumentation/) your applicati
|
||||
|
||||
### Logs Management
|
||||
|
||||
Hanzo O11y can be used as a centralized log management solution. We use ClickHouse (used by likes of Uber & Cloudflare) as a datastore, ⎯ an extremely fast and highly optimized storage for logs data. Instantly search through all your logs using quick filters and a powerful query builder.
|
||||
Hanzo O11y can be used as a centralized log management solution. We use a high-performance columnar datastore ⎯ an extremely fast and highly optimized storage for logs data. Instantly search through all your logs using quick filters and a powerful query builder.
|
||||
|
||||
You can also create charts on your logs and monitor them with customized dashboards. Read [more](https://o11y.hanzo.ai/log-management/).
|
||||
|
||||
@@ -154,9 +154,9 @@ Hanzo O11y is a single tool for all your monitoring and observability needs. Her
|
||||
|
||||
- Correlated logs, metrics and traces for much richer context while debugging
|
||||
|
||||
- Uses ClickHouse (used by likes of Uber & Cloudflare) as datastore - an extremely fast and highly optimized storage for observability data
|
||||
- Uses a high-performance columnar datastore - an extremely fast and highly optimized storage for observability data
|
||||
|
||||
- DIY Query builder, PromQL, and ClickHouse queries to fulfill all your use-cases around querying observability data
|
||||
- DIY Query builder, PromQL, and Datastore SQL queries to fulfill all your use-cases around querying observability data
|
||||
|
||||
- Open-Source - you can use open-source, our [cloud service](https://o11y.hanzo.ai/teams/) or a mix of both based on your use case
|
||||
|
||||
@@ -240,7 +240,7 @@ Moreover, Hanzo O11y has few more advanced features wrt Jaeger:
|
||||
|
||||
### Hanzo O11y vs Elastic
|
||||
|
||||
- Hanzo O11y Logs management are based on ClickHouse, a columnar OLAP datastore which makes aggregate log analytics queries much more efficient
|
||||
- Hanzo O11y Logs management is based on a columnar OLAP datastore which makes aggregate log analytics queries much more efficient
|
||||
- 50% lower resource requirement compared to Elastic during ingestion
|
||||
|
||||
We have published benchmarks comparing Elastic with Hanzo O11y. Check it out [here](https://o11y.hanzo.ai/blog/logs-performance-benchmark/?utm_source=github-readme&utm_medium=logs-benchmark)
|
||||
@@ -278,10 +278,10 @@ You can find docs at https://o11y.hanzo.ai/docs/. If you need any clarification
|
||||
|
||||
Join the [slack community](https://o11y.hanzo.ai/slack) to know more about distributed tracing, observability, or Hanzo O11y and to connect with other users and contributors.
|
||||
|
||||
If you have any ideas, questions, or any feedback, please share on our [Github Discussions](https://github.com/Hanzo O11y/signoz/discussions)
|
||||
If you have any ideas, questions, or any feedback, please share on our [Github Discussions](https://github.com/Hanzo O11y/o11y/discussions)
|
||||
|
||||
As always, thanks to our amazing contributors!
|
||||
|
||||
<a href="https://github.com/signoz/signoz/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=signoz/signoz" />
|
||||
<a href="https://github.com/o11y/o11y/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=o11y/o11y" />
|
||||
</a>
|
||||
|
||||
+16
-16
@@ -1,13 +1,13 @@
|
||||
<p align="center">
|
||||
<img src="https://res.cloudinary.com/dcv3epinx/image/upload/v1618904450/signoz-images/LogoGithub_sigfbu.svg" alt="Hanzo O11y-logo" width="240" />
|
||||
<img src="https://res.cloudinary.com/dcv3epinx/image/upload/v1618904450/o11y-images/LogoGithub_sigfbu.svg" alt="Hanzo O11y-logo" width="240" />
|
||||
|
||||
<p align="center">Monitore seus aplicativos e solucione problemas em seus aplicativos implantados, uma alternativa de código aberto para soluções como DataDog, New Relic, entre outras.</p>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="Downloads" src="https://img.shields.io/docker/pulls/signoz/frontend?label=Downloads"> </a>
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/signoz/signoz"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,signoz,observability">
|
||||
<img alt="Downloads" src="https://img.shields.io/docker/pulls/o11y/frontend?label=Downloads"> </a>
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/o11y/o11y"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,o11y,observability">
|
||||
<img alt="tweet" src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social"> </a>
|
||||
</p>
|
||||
|
||||
@@ -29,11 +29,11 @@ Hanzo O11y auxilia os desenvolvedores a monitorarem aplicativos e solucionar pro
|
||||
👉 Execute agregações em dados de rastreamento para obter métricas de negócios relevantes.
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/Contributing.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/Contributing.svg" width="50px" />
|
||||
|
||||
## Junte-se à nossa comunidade no Slack
|
||||
|
||||
@@ -41,7 +41,7 @@ Venha dizer oi para nós no [Slack](https://o11y.hanzo.ai/slack) 👋
|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/Features.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/Features.svg" width="50px" />
|
||||
|
||||
## Funções:
|
||||
|
||||
@@ -54,7 +54,7 @@ Venha dizer oi para nós no [Slack](https://o11y.hanzo.ai/slack) 👋
|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/WhatsCool.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/WhatsCool.svg" width="50px" />
|
||||
|
||||
## Por que escolher Hanzo O11y?
|
||||
|
||||
@@ -77,7 +77,7 @@ Você pode encontrar a lista completa de linguagens aqui - https://opentelemetry
|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/Philosophy.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/Philosophy.svg" width="50px" />
|
||||
|
||||
## Iniciando
|
||||
|
||||
@@ -98,7 +98,7 @@ Siga as etapas listadas [aqui](https://o11y.hanzo.ai/docs/deployment/helm_chart)
|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/UseHanzo O11y.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/UseHanzo O11y.svg" width="50px" />
|
||||
|
||||
## Comparações com ferramentas similares
|
||||
|
||||
@@ -121,7 +121,7 @@ Além disso, Hanzo O11y tem alguns recursos mais avançados do que Jaeger:
|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/Contributors.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/Contributors.svg" width="50px" />
|
||||
|
||||
## Contribuindo
|
||||
|
||||
@@ -132,7 +132,7 @@ Não sabe como começar? Basta enviar um sinal para nós no canal `#contributing
|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/DevelopingLocally.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/DevelopingLocally.svg" width="50px" />
|
||||
|
||||
## Documentação
|
||||
|
||||
@@ -140,18 +140,18 @@ Você pode encontrar a documentação em https://o11y.hanzo.ai/docs/. Se você t
|
||||
|
||||
<br /><br />
|
||||
|
||||
<img align="left" src="https://signoz-public.s3.us-east-2.amazonaws.com/Contributing.svg" width="50px" />
|
||||
<img align="left" src="https://o11y-public.s3.us-east-2.amazonaws.com/Contributing.svg" width="50px" />
|
||||
|
||||
## Comunidade
|
||||
|
||||
Junte-se a [comunidade no Slack](https://o11y.hanzo.ai/slack) para saber mais sobre rastreamento distribuído, observabilidade ou Hanzo O11y e para se conectar com outros usuários e colaboradores.
|
||||
|
||||
Se você tiver alguma ideia, pergunta ou feedback, compartilhe em nosso [Github Discussões](https://github.com/Hanzo O11y/signoz/discussions)
|
||||
Se você tiver alguma ideia, pergunta ou feedback, compartilhe em nosso [Github Discussões](https://github.com/Hanzo O11y/o11y/discussions)
|
||||
|
||||
Como sempre, obrigado aos nossos incríveis colaboradores!
|
||||
|
||||
<a href="https://github.com/signoz/signoz/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=signoz/signoz" />
|
||||
<a href="https://github.com/o11y/o11y/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=o11y/o11y" />
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
+11
-11
@@ -1,20 +1,20 @@
|
||||
<img src="https://res.cloudinary.com/dcv3epinx/image/upload/v1618904450/signoz-images/LogoGithub_sigfbu.svg" alt="Hanzo O11y-logo" width="240" />
|
||||
<img src="https://res.cloudinary.com/dcv3epinx/image/upload/v1618904450/o11y-images/LogoGithub_sigfbu.svg" alt="Hanzo O11y-logo" width="240" />
|
||||
|
||||
<p align="center">监控你的应用,并且可排查已部署应用的问题,这是一个可替代 DataDog、NewRelic 的开源方案</p>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="Downloads" src="https://img.shields.io/docker/pulls/signoz/query-service?label=Docker Downloads"> </a>
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/signoz/signoz"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,signoz,observability">
|
||||
<img alt="Downloads" src="https://img.shields.io/docker/pulls/o11y/query-service?label=Docker Downloads"> </a>
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/o11y/o11y"> </a>
|
||||
<a href="https://twitter.com/intent/tweet?text=Monitor%20your%20applications%20and%20troubleshoot%20problems%20with%20Hanzo O11y,%20an%20open-source%20alternative%20to%20DataDog,%20NewRelic.&url=https://o11y.hanzo.ai/&via=Hanzo O11yHQ&hashtags=opensource,o11y,observability">
|
||||
<img alt="tweet" src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social"> </a>
|
||||
</p>
|
||||
|
||||
<h3 align="center">
|
||||
<a href="https://o11y.hanzo.ai/docs"><b>文档</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.zh-cn.md"><b>中文ReadMe</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.de-de.md"><b>德文ReadMe</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/signoz/blob/main/README.pt-br.md"><b>葡萄牙语ReadMe</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.zh-cn.md"><b>中文ReadMe</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.de-de.md"><b>德文ReadMe</b></a> •
|
||||
<a href="https://github.com/Hanzo O11y/o11y/blob/main/README.pt-br.md"><b>葡萄牙语ReadMe</b></a> •
|
||||
<a href="https://o11y.hanzo.ai/slack"><b>Slack 社区</b></a> •
|
||||
<a href="https://twitter.com/Hanzo O11yHq"><b>Twitter</b></a>
|
||||
</h3>
|
||||
@@ -161,7 +161,7 @@ Jaeger 仅仅是一个分布式追踪系统。 但是 Hanzo O11y 可以提供 me
|
||||
|
||||
### Hanzo O11y vs Elastic
|
||||
|
||||
- Hanzo O11y 的日志管理是基于 ClickHouse 实现的,可以使日志的聚合更加高效,因为它是基于 OLAP 的数据仓储。
|
||||
- Hanzo O11y 的日志管理基于列式 OLAP 数据仓储实现,可以使日志的聚合更加高效。
|
||||
|
||||
- 与 Elastic 相比,可以节省 50% 的资源成本
|
||||
|
||||
@@ -199,10 +199,10 @@ Jaeger 仅仅是一个分布式追踪系统。 但是 Hanzo O11y 可以提供 me
|
||||
|
||||
加入 [slack 社区](https://o11y.hanzo.ai/slack) 去了解更多关于分布式追踪、可观测性系统 。或者与 Hanzo O11y 其他用户和贡献者交流。
|
||||
|
||||
如果你有任何想法、问题、或者任何反馈, 请通过 [Github Discussions](https://github.com/Hanzo O11y/signoz/discussions) 分享。
|
||||
如果你有任何想法、问题、或者任何反馈, 请通过 [Github Discussions](https://github.com/Hanzo O11y/o11y/discussions) 分享。
|
||||
|
||||
不管怎么样,感谢这个项目的所有贡献者!
|
||||
|
||||
<a href="https://github.com/signoz/signoz/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=signoz/signoz" />
|
||||
<a href="https://github.com/o11y/o11y/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=o11y/o11y" />
|
||||
</a>
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
|
||||
version: 2
|
||||
|
||||
project_name: signoz-community
|
||||
project_name: o11y-community
|
||||
|
||||
before:
|
||||
hooks:
|
||||
- go mod tidy
|
||||
|
||||
builds:
|
||||
- id: signoz
|
||||
binary: bin/signoz
|
||||
- id: o11y
|
||||
binary: bin/o11y
|
||||
main: ./cmd/community
|
||||
goos:
|
||||
- linux
|
||||
@@ -24,12 +24,12 @@ builds:
|
||||
- v8.0
|
||||
ldflags:
|
||||
- -s -w
|
||||
- -X github.com/SigNoz/signoz/pkg/version.version=v{{ .Version }}
|
||||
- -X github.com/SigNoz/signoz/pkg/version.variant=community
|
||||
- -X github.com/SigNoz/signoz/pkg/version.hash={{ .ShortCommit }}
|
||||
- -X github.com/SigNoz/signoz/pkg/version.time={{ .CommitTimestamp }}
|
||||
- -X github.com/SigNoz/signoz/pkg/version.branch={{ .Branch }}
|
||||
- -X github.com/SigNoz/signoz/pkg/analytics.key=9kRrJ7oPCGPEJLF6QjMPLt5bljFhRQBr
|
||||
- -X github.com/hanzoai/o11y/pkg/version.version=v{{ .Version }}
|
||||
- -X github.com/hanzoai/o11y/pkg/version.variant=community
|
||||
- -X github.com/hanzoai/o11y/pkg/version.hash={{ .ShortCommit }}
|
||||
- -X github.com/hanzoai/o11y/pkg/version.time={{ .CommitTimestamp }}
|
||||
- -X github.com/hanzoai/o11y/pkg/version.branch={{ .Branch }}
|
||||
- -X github.com/hanzoai/o11y/pkg/analytics.key=9kRrJ7oPCGPEJLF6QjMPLt5bljFhRQBr
|
||||
mod_timestamp: "{{ .CommitTimestamp }}"
|
||||
tags:
|
||||
- timetzdata
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
FROM alpine:3.20.3
|
||||
LABEL maintainer="signoz"
|
||||
LABEL maintainer="o11y"
|
||||
WORKDIR /root
|
||||
|
||||
ARG OS="linux"
|
||||
@@ -10,10 +10,10 @@ RUN apk update && \
|
||||
rm -rf /var/cache/apk/*
|
||||
|
||||
|
||||
COPY ./target/${OS}-${TARGETARCH}/signoz-community /root/signoz
|
||||
COPY ./target/${OS}-${TARGETARCH}/o11y-community /root/o11y
|
||||
COPY ./templates /root/templates
|
||||
COPY frontend/build/ /etc/signoz/web/
|
||||
COPY frontend/build/ /etc/o11y/web/
|
||||
|
||||
RUN chmod 755 /root /root/signoz
|
||||
RUN chmod 755 /root /root/o11y
|
||||
|
||||
ENTRYPOINT ["./signoz", "server"]
|
||||
ENTRYPOINT ["./o11y", "server"]
|
||||
@@ -1,7 +1,7 @@
|
||||
ARG ALPINE_SHA="pass-a-valid-docker-sha-otherwise-this-will-fail"
|
||||
|
||||
FROM alpine@sha256:${ALPINE_SHA}
|
||||
LABEL maintainer="signoz"
|
||||
LABEL maintainer="o11y"
|
||||
WORKDIR /root
|
||||
|
||||
ARG OS="linux"
|
||||
@@ -11,10 +11,10 @@ RUN apk update && \
|
||||
apk add ca-certificates && \
|
||||
rm -rf /var/cache/apk/*
|
||||
|
||||
COPY ./target/${OS}-${ARCH}/signoz-community /root/signoz-community
|
||||
COPY ./target/${OS}-${ARCH}/o11y-community /root/o11y-community
|
||||
COPY ./templates /root/templates
|
||||
COPY frontend/build/ /etc/signoz/web/
|
||||
COPY frontend/build/ /etc/o11y/web/
|
||||
|
||||
RUN chmod 755 /root /root/signoz-community
|
||||
RUN chmod 755 /root /root/o11y-community
|
||||
|
||||
ENTRYPOINT ["./signoz-community", "server"]
|
||||
ENTRYPOINT ["./o11y-community", "server"]
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/hanzoai/o11y/cmd"
|
||||
"github.com/hanzoai/o11y/pkg/community"
|
||||
"github.com/hanzoai/o11y/pkg/instrumentation"
|
||||
)
|
||||
|
||||
@@ -14,7 +15,7 @@ func main() {
|
||||
// register a list of commands to the root command
|
||||
registerServer(cmd.RootCmd, logger)
|
||||
cmd.RegisterGenerate(cmd.RootCmd, logger)
|
||||
cmd.RegisterMetastore(cmd.RootCmd, logger, sqlstoreProviderFactories, sqlschemaProviderFactories)
|
||||
cmd.RegisterMetastore(cmd.RootCmd, logger, community.SQLStoreProviderFactories, community.SQLSchemaProviderFactories)
|
||||
|
||||
cmd.Execute(logger)
|
||||
}
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/hanzoai/o11y/pkg/factory"
|
||||
"github.com/hanzoai/o11y/pkg/signoz"
|
||||
"github.com/hanzoai/o11y/pkg/sqlschema"
|
||||
"github.com/hanzoai/o11y/pkg/sqlstore"
|
||||
)
|
||||
|
||||
func sqlstoreProviderFactories() factory.NamedMap[factory.ProviderFactory[sqlstore.SQLStore, sqlstore.Config]] {
|
||||
return signoz.NewSQLStoreProviderFactories()
|
||||
}
|
||||
|
||||
func sqlschemaProviderFactories(sqlstore sqlstore.SQLStore) factory.NamedMap[factory.ProviderFactory[sqlschema.SQLSchema, sqlschema.Config]] {
|
||||
return signoz.NewSQLSchemaProviderFactories(sqlstore)
|
||||
}
|
||||
+17
-105
@@ -7,47 +7,10 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
|
||||
"github.com/hanzoai/o11y/cmd"
|
||||
"github.com/hanzoai/o11y/pkg/alertmanager"
|
||||
"github.com/hanzoai/o11y/pkg/analytics"
|
||||
"github.com/hanzoai/o11y/pkg/auditor"
|
||||
"github.com/hanzoai/o11y/pkg/authn"
|
||||
"github.com/hanzoai/o11y/pkg/authz"
|
||||
"github.com/hanzoai/o11y/pkg/authz/iamauthz"
|
||||
"github.com/hanzoai/o11y/pkg/cache"
|
||||
"github.com/hanzoai/o11y/pkg/community"
|
||||
"github.com/hanzoai/o11y/pkg/errors"
|
||||
"github.com/hanzoai/o11y/pkg/factory"
|
||||
"github.com/hanzoai/o11y/pkg/flagger"
|
||||
"github.com/hanzoai/o11y/pkg/gateway"
|
||||
"github.com/hanzoai/o11y/pkg/gateway/noopgateway"
|
||||
"github.com/hanzoai/o11y/pkg/global"
|
||||
"github.com/hanzoai/o11y/pkg/licensing"
|
||||
"github.com/hanzoai/o11y/pkg/licensing/nooplicensing"
|
||||
"github.com/hanzoai/o11y/pkg/meterreporter"
|
||||
"github.com/hanzoai/o11y/pkg/modules/cloudintegration"
|
||||
"github.com/hanzoai/o11y/pkg/modules/cloudintegration/implcloudintegration"
|
||||
"github.com/hanzoai/o11y/pkg/modules/dashboard"
|
||||
"github.com/hanzoai/o11y/pkg/modules/dashboard/impldashboard"
|
||||
"github.com/hanzoai/o11y/pkg/modules/metricreductionrule"
|
||||
"github.com/hanzoai/o11y/pkg/modules/metricreductionrule/implmetricreductionrule"
|
||||
"github.com/hanzoai/o11y/pkg/modules/organization"
|
||||
"github.com/hanzoai/o11y/pkg/modules/retention"
|
||||
"github.com/hanzoai/o11y/pkg/modules/rulestatehistory"
|
||||
"github.com/hanzoai/o11y/pkg/modules/serviceaccount"
|
||||
"github.com/hanzoai/o11y/pkg/modules/tag"
|
||||
"github.com/hanzoai/o11y/pkg/prometheus"
|
||||
"github.com/hanzoai/o11y/pkg/querier"
|
||||
"github.com/hanzoai/o11y/pkg/query-service/app"
|
||||
"github.com/hanzoai/o11y/pkg/queryparser"
|
||||
"github.com/hanzoai/o11y/pkg/ruler"
|
||||
"github.com/hanzoai/o11y/pkg/ruler/signozruler"
|
||||
"github.com/hanzoai/o11y/pkg/signoz"
|
||||
"github.com/hanzoai/o11y/pkg/sqlstore"
|
||||
"github.com/hanzoai/o11y/pkg/telemetrystore"
|
||||
"github.com/hanzoai/o11y/pkg/types/authtypes"
|
||||
"github.com/hanzoai/o11y/pkg/types/telemetrytypes"
|
||||
"github.com/hanzoai/o11y/pkg/o11y"
|
||||
"github.com/hanzoai/o11y/pkg/version"
|
||||
"github.com/hanzoai/o11y/pkg/zeus"
|
||||
"github.com/hanzoai/o11y/pkg/zeus/noopzeus"
|
||||
)
|
||||
|
||||
func registerServer(parentCmd *cobra.Command, logger *slog.Logger) {
|
||||
@@ -55,10 +18,10 @@ func registerServer(parentCmd *cobra.Command, logger *slog.Logger) {
|
||||
|
||||
serverCmd := &cobra.Command{
|
||||
Use: "server",
|
||||
Short: "Run the SigNoz server",
|
||||
Short: "Run the O11y server",
|
||||
FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true},
|
||||
RunE: func(currCmd *cobra.Command, args []string) error {
|
||||
config, err := cmd.NewSigNozConfig(currCmd.Context(), logger, configFiles)
|
||||
config, err := cmd.NewO11yConfig(currCmd.Context(), logger, configFiles)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -71,66 +34,17 @@ func registerServer(parentCmd *cobra.Command, logger *slog.Logger) {
|
||||
parentCmd.AddCommand(serverCmd)
|
||||
}
|
||||
|
||||
func runServer(ctx context.Context, config signoz.Config, logger *slog.Logger) error {
|
||||
func runServer(ctx context.Context, config o11y.Config, logger *slog.Logger) error {
|
||||
// print the version
|
||||
version.Info.PrettyPrint(config.Version)
|
||||
|
||||
signoz, err := signoz.New(
|
||||
ctx,
|
||||
config,
|
||||
zeus.Config{},
|
||||
noopzeus.NewProviderFactory(),
|
||||
licensing.Config{},
|
||||
func(_ sqlstore.SQLStore, _ zeus.Zeus, _ organization.Getter, _ analytics.Analytics) factory.ProviderFactory[licensing.Licensing, licensing.Config] {
|
||||
return nooplicensing.NewFactory()
|
||||
},
|
||||
signoz.NewEmailingProviderFactories(),
|
||||
signoz.NewCacheProviderFactories(),
|
||||
signoz.NewWebProviderFactories(config.Global),
|
||||
sqlschemaProviderFactories,
|
||||
sqlstoreProviderFactories(),
|
||||
signoz.NewTelemetryStoreProviderFactories(),
|
||||
func(ctx context.Context, providerSettings factory.ProviderSettings, store authtypes.AuthNStore, licensing licensing.Licensing) (map[authtypes.AuthNProvider]authn.AuthN, error) {
|
||||
return signoz.NewAuthNs(ctx, providerSettings, store, licensing, config.Global)
|
||||
},
|
||||
func(_ context.Context, sqlstore sqlstore.SQLStore, _ authz.Config, _ licensing.Licensing, _ []authz.OnBeforeRoleDelete) (factory.ProviderFactory[authz.AuthZ, authz.Config], error) {
|
||||
// Hanzo IAM is the sole authorization provider — every decision is
|
||||
// delegated to IAM's Casbin enforce endpoint. No OpenFGA, no fallback.
|
||||
return iamauthz.NewProviderFactory(sqlstore), nil
|
||||
},
|
||||
func(store sqlstore.SQLStore, settings factory.ProviderSettings, analytics analytics.Analytics, orgGetter organization.Getter, queryParser queryparser.QueryParser, _ querier.Querier, _ licensing.Licensing, tagModule tag.Module) dashboard.Module {
|
||||
return impldashboard.NewModule(impldashboard.NewStore(store), settings, analytics, orgGetter, queryParser, tagModule)
|
||||
},
|
||||
func(_ licensing.Licensing) factory.ProviderFactory[gateway.Gateway, gateway.Config] {
|
||||
return noopgateway.NewProviderFactory()
|
||||
},
|
||||
func(_ licensing.Licensing) factory.NamedMap[factory.ProviderFactory[auditor.Auditor, auditor.Config]] {
|
||||
return signoz.NewAuditorProviderFactories()
|
||||
},
|
||||
func(_ context.Context, _ factory.ProviderSettings, _ flagger.Flagger, _ licensing.Licensing, _ telemetrystore.TelemetryStore, _ retention.Getter, _ organization.Getter, _ zeus.Zeus) (factory.NamedMap[factory.ProviderFactory[meterreporter.Reporter, meterreporter.Config]], string) {
|
||||
return signoz.NewMeterReporterProviderFactories(), "noop"
|
||||
},
|
||||
func(ps factory.ProviderSettings, q querier.Querier, a analytics.Analytics) querier.Handler {
|
||||
return querier.NewHandler(ps, q, a)
|
||||
},
|
||||
func(_ sqlstore.SQLStore, _ dashboard.Module, _ global.Global, _ zeus.Zeus, _ gateway.Gateway, _ licensing.Licensing, _ serviceaccount.Module, _ cloudintegration.Config) (cloudintegration.Module, error) {
|
||||
return implcloudintegration.NewModule(), nil
|
||||
},
|
||||
func(_ sqlstore.SQLStore, _ telemetrystore.TelemetryStore, _ dashboard.Module, _ queryparser.QueryParser, _ licensing.Licensing, _ flagger.Flagger, _ telemetrytypes.MetadataStore, _ factory.ProviderSettings, _ int) metricreductionrule.Module {
|
||||
return implmetricreductionrule.NewModule()
|
||||
},
|
||||
func(c cache.Cache, am alertmanager.Alertmanager, ss sqlstore.SQLStore, ts telemetrystore.TelemetryStore, ms telemetrytypes.MetadataStore, p prometheus.Prometheus, og organization.Getter, rsh rulestatehistory.Module, q querier.Querier, qp queryparser.QueryParser) factory.NamedMap[factory.ProviderFactory[ruler.Ruler, ruler.Config]] {
|
||||
return factory.MustNewNamedMap(signozruler.NewFactory(c, am, ss, ts, ms, p, og, rsh, q, qp, nil, nil))
|
||||
},
|
||||
)
|
||||
// community.NewServer is the ONE construction shared with the hanzoai/cloud
|
||||
// embed — same providers, same identity (iamidentn gateway-header auth), same
|
||||
// wiring. Standalone owns the process: bind listeners, run background
|
||||
// evaluation, block until shutdown.
|
||||
server, o11y, err := community.NewServer(ctx, config)
|
||||
if err != nil {
|
||||
logger.ErrorContext(ctx, "failed to create signoz", errors.Attr(err))
|
||||
return err
|
||||
}
|
||||
|
||||
server, err := app.NewServer(config, signoz)
|
||||
if err != nil {
|
||||
logger.ErrorContext(ctx, "failed to create server", errors.Attr(err))
|
||||
logger.ErrorContext(ctx, "failed to create o11y server", errors.Attr(err))
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -139,22 +53,20 @@ func runServer(ctx context.Context, config signoz.Config, logger *slog.Logger) e
|
||||
return err
|
||||
}
|
||||
|
||||
signoz.Start(ctx)
|
||||
o11y.Start(ctx)
|
||||
|
||||
if err := signoz.Wait(ctx); err != nil {
|
||||
logger.ErrorContext(ctx, "failed to start signoz", errors.Attr(err))
|
||||
if err := o11y.Wait(ctx); err != nil {
|
||||
logger.ErrorContext(ctx, "failed to start o11y", errors.Attr(err))
|
||||
return err
|
||||
}
|
||||
|
||||
err = server.Stop(ctx)
|
||||
if err != nil {
|
||||
if err := server.Stop(ctx); err != nil {
|
||||
logger.ErrorContext(ctx, "failed to stop server", errors.Attr(err))
|
||||
return err
|
||||
}
|
||||
|
||||
err = signoz.Stop(ctx)
|
||||
if err != nil {
|
||||
logger.ErrorContext(ctx, "failed to stop signoz", errors.Attr(err))
|
||||
if err := o11y.Stop(ctx); err != nil {
|
||||
logger.ErrorContext(ctx, "failed to stop o11y", errors.Attr(err))
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
+9
-27
@@ -4,33 +4,15 @@ import (
|
||||
"context"
|
||||
"log/slog"
|
||||
|
||||
"github.com/hanzoai/o11y/pkg/config"
|
||||
"github.com/hanzoai/o11y/pkg/config/envprovider"
|
||||
"github.com/hanzoai/o11y/pkg/config/fileprovider"
|
||||
"github.com/hanzoai/o11y/pkg/signoz"
|
||||
"github.com/hanzoai/o11y/pkg/community"
|
||||
"github.com/hanzoai/o11y/pkg/o11y"
|
||||
)
|
||||
|
||||
func NewSigNozConfig(ctx context.Context, logger *slog.Logger, configFiles []string) (signoz.Config, error) {
|
||||
uris := make([]string, 0, len(configFiles)+1)
|
||||
for _, f := range configFiles {
|
||||
uris = append(uris, "file:"+f)
|
||||
}
|
||||
uris = append(uris, "env:")
|
||||
|
||||
config, err := signoz.NewConfig(
|
||||
ctx,
|
||||
logger,
|
||||
config.ResolverConfig{
|
||||
Uris: uris,
|
||||
ProviderFactories: []config.ProviderFactory{
|
||||
envprovider.NewFactory(),
|
||||
fileprovider.NewFactory(),
|
||||
},
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return signoz.Config{}, err
|
||||
}
|
||||
|
||||
return config, nil
|
||||
// NewO11yConfig resolves the O11y config from the given YAML files plus the
|
||||
// process environment. It delegates to community.NewConfig — the ONE config path
|
||||
// shared by the standalone binary and the hanzoai/cloud embed — so both read
|
||||
// configuration (and the Hanzo operator-facing aliases like O11Y_DATASTORE_DSN)
|
||||
// identically.
|
||||
func NewO11yConfig(ctx context.Context, logger *slog.Logger, configFiles []string) (o11y.Config, error) {
|
||||
return community.NewConfig(ctx, logger, configFiles)
|
||||
}
|
||||
|
||||
+10
-10
@@ -11,14 +11,14 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestNewSigNozConfig_NoConfigFiles(t *testing.T) {
|
||||
func TestNewO11yConfig_NoConfigFiles(t *testing.T) {
|
||||
logger := slog.New(slog.DiscardHandler)
|
||||
config, err := NewSigNozConfig(context.Background(), logger, nil)
|
||||
config, err := NewO11yConfig(context.Background(), logger, nil)
|
||||
require.NoError(t, err)
|
||||
assert.NotZero(t, config)
|
||||
}
|
||||
|
||||
func TestNewSigNozConfig_SingleConfigFile(t *testing.T) {
|
||||
func TestNewO11yConfig_SingleConfigFile(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
configPath := filepath.Join(dir, "config.yaml")
|
||||
err := os.WriteFile(configPath, []byte(`
|
||||
@@ -28,12 +28,12 @@ cache:
|
||||
require.NoError(t, err)
|
||||
|
||||
logger := slog.New(slog.DiscardHandler)
|
||||
config, err := NewSigNozConfig(context.Background(), logger, []string{configPath})
|
||||
config, err := NewO11yConfig(context.Background(), logger, []string{configPath})
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "redis", config.Cache.Provider)
|
||||
}
|
||||
|
||||
func TestNewSigNozConfig_MultipleConfigFiles_LaterOverridesEarlier(t *testing.T) {
|
||||
func TestNewO11yConfig_MultipleConfigFiles_LaterOverridesEarlier(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
|
||||
basePath := filepath.Join(dir, "base.yaml")
|
||||
@@ -53,7 +53,7 @@ cache:
|
||||
require.NoError(t, err)
|
||||
|
||||
logger := slog.New(slog.DiscardHandler)
|
||||
config, err := NewSigNozConfig(context.Background(), logger, []string{basePath, overridePath})
|
||||
config, err := NewO11yConfig(context.Background(), logger, []string{basePath, overridePath})
|
||||
require.NoError(t, err)
|
||||
// Later file overrides earlier
|
||||
assert.Equal(t, "redis", config.Cache.Provider)
|
||||
@@ -61,7 +61,7 @@ cache:
|
||||
assert.Equal(t, "sqlite", config.SQLStore.Provider)
|
||||
}
|
||||
|
||||
func TestNewSigNozConfig_EnvOverridesConfigFile(t *testing.T) {
|
||||
func TestNewO11yConfig_EnvOverridesConfigFile(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
configPath := filepath.Join(dir, "config.yaml")
|
||||
err := os.WriteFile(configPath, []byte(`
|
||||
@@ -73,14 +73,14 @@ cache:
|
||||
t.Setenv("O11Y_CACHE_PROVIDER", "fromenv")
|
||||
|
||||
logger := slog.New(slog.DiscardHandler)
|
||||
config, err := NewSigNozConfig(context.Background(), logger, []string{configPath})
|
||||
config, err := NewO11yConfig(context.Background(), logger, []string{configPath})
|
||||
require.NoError(t, err)
|
||||
// Env should override file
|
||||
assert.Equal(t, "fromenv", config.Cache.Provider)
|
||||
}
|
||||
|
||||
func TestNewSigNozConfig_NonexistentFile(t *testing.T) {
|
||||
func TestNewO11yConfig_NonexistentFile(t *testing.T) {
|
||||
logger := slog.New(slog.DiscardHandler)
|
||||
_, err := NewSigNozConfig(context.Background(), logger, []string{"/nonexistent/config.yaml"})
|
||||
_, err := NewO11yConfig(context.Background(), logger, []string{"/nonexistent/config.yaml"})
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
+9
-9
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
"github.com/hanzoai/o11y/pkg/factory"
|
||||
"github.com/hanzoai/o11y/pkg/instrumentation"
|
||||
"github.com/hanzoai/o11y/pkg/signoz"
|
||||
"github.com/hanzoai/o11y/pkg/o11y"
|
||||
"github.com/hanzoai/o11y/pkg/sqlmigration"
|
||||
"github.com/hanzoai/o11y/pkg/sqlmigrator"
|
||||
"github.com/hanzoai/o11y/pkg/sqlschema"
|
||||
@@ -70,7 +70,7 @@ func registerSyncUp(parentCmd *cobra.Command, logger *slog.Logger, sqlstoreProvi
|
||||
Short: "Runs 'up' migrations for the metastore. Up migrations are used to apply new migrations to the metastore",
|
||||
FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true},
|
||||
RunE: func(currCmd *cobra.Command, args []string) error {
|
||||
config, err := NewSigNozConfig(currCmd.Context(), logger, configFiles)
|
||||
config, err := NewO11yConfig(currCmd.Context(), logger, configFiles)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -91,7 +91,7 @@ func registerSyncCheck(parentCmd *cobra.Command, logger *slog.Logger, sqlstorePr
|
||||
Short: "Runs a check for 'sync' migrations on the metastore. Returns a non-zero exit code if any migrations are pending.",
|
||||
FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true},
|
||||
RunE: func(currCmd *cobra.Command, args []string) error {
|
||||
config, err := NewSigNozConfig(currCmd.Context(), logger, configFiles)
|
||||
config, err := NewO11yConfig(currCmd.Context(), logger, configFiles)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -104,7 +104,7 @@ func registerSyncCheck(parentCmd *cobra.Command, logger *slog.Logger, sqlstorePr
|
||||
parentCmd.AddCommand(syncCheckCmd)
|
||||
}
|
||||
|
||||
func runSyncUp(ctx context.Context, config signoz.Config, sqlstoreProviderFactories SQLStoreProviderFactories, sqlschemaProviderFactories SQLSchemaProviderFactories) error {
|
||||
func runSyncUp(ctx context.Context, config o11y.Config, sqlstoreProviderFactories SQLStoreProviderFactories, sqlschemaProviderFactories SQLSchemaProviderFactories) error {
|
||||
migrator, err := newSyncMigrator(ctx, config, sqlstoreProviderFactories, sqlschemaProviderFactories)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -113,7 +113,7 @@ func runSyncUp(ctx context.Context, config signoz.Config, sqlstoreProviderFactor
|
||||
return migrator.Migrate(ctx)
|
||||
}
|
||||
|
||||
func runSyncCheck(ctx context.Context, config signoz.Config, sqlstoreProviderFactories SQLStoreProviderFactories, sqlschemaProviderFactories SQLSchemaProviderFactories) error {
|
||||
func runSyncCheck(ctx context.Context, config o11y.Config, sqlstoreProviderFactories SQLStoreProviderFactories, sqlschemaProviderFactories SQLSchemaProviderFactories) error {
|
||||
migrator, err := newSyncMigrator(ctx, config, sqlstoreProviderFactories, sqlschemaProviderFactories)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -122,8 +122,8 @@ func runSyncCheck(ctx context.Context, config signoz.Config, sqlstoreProviderFac
|
||||
return migrator.Check(ctx)
|
||||
}
|
||||
|
||||
func newSyncMigrator(ctx context.Context, config signoz.Config, sqlstoreProviderFactories SQLStoreProviderFactories, sqlschemaProviderFactories SQLSchemaProviderFactories) (sqlmigrator.SQLMigrator, error) {
|
||||
instrumentation, err := instrumentation.New(ctx, config.Instrumentation, version.Info, "signoz")
|
||||
func newSyncMigrator(ctx context.Context, config o11y.Config, sqlstoreProviderFactories SQLStoreProviderFactories, sqlschemaProviderFactories SQLSchemaProviderFactories) (sqlmigrator.SQLMigrator, error) {
|
||||
instrumentation, err := instrumentation.New(ctx, config.Instrumentation, version.Info, "o11y")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -140,12 +140,12 @@ func newSyncMigrator(ctx context.Context, config signoz.Config, sqlstoreProvider
|
||||
return nil, err
|
||||
}
|
||||
|
||||
telemetrystore, err := factory.NewProviderFromNamedMap(ctx, providerSettings, config.TelemetryStore, signoz.NewTelemetryStoreProviderFactories(), config.TelemetryStore.Provider)
|
||||
telemetrystore, err := factory.NewProviderFromNamedMap(ctx, providerSettings, config.TelemetryStore, o11y.NewTelemetryStoreProviderFactories(), config.TelemetryStore.Provider)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sqlmigrations, err := sqlmigration.New(ctx, providerSettings, config.SQLMigration, signoz.NewSQLMigrationProviderFactories(sqlstore, sqlschema, telemetrystore, providerSettings))
|
||||
sqlmigrations, err := sqlmigration.New(ctx, providerSettings, config.SQLMigration, o11y.NewSQLMigrationProviderFactories(sqlstore, sqlschema, telemetrystore, providerSettings))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
+4
-4
@@ -5,7 +5,7 @@ import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/hanzoai/o11y/pkg/instrumentation"
|
||||
"github.com/hanzoai/o11y/pkg/signoz"
|
||||
"github.com/hanzoai/o11y/pkg/o11y"
|
||||
"github.com/hanzoai/o11y/pkg/version"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
func registerGenerateOpenAPI(parentCmd *cobra.Command) {
|
||||
openapiCmd := &cobra.Command{
|
||||
Use: "openapi",
|
||||
Short: "Generate OpenAPI schema for SigNoz",
|
||||
Short: "Generate OpenAPI schema for O11y",
|
||||
RunE: func(currCmd *cobra.Command, args []string) error {
|
||||
return runGenerateOpenAPI(currCmd.Context())
|
||||
},
|
||||
@@ -23,12 +23,12 @@ func registerGenerateOpenAPI(parentCmd *cobra.Command) {
|
||||
}
|
||||
|
||||
func runGenerateOpenAPI(ctx context.Context) error {
|
||||
instrumentation, err := instrumentation.New(ctx, instrumentation.Config{Logs: instrumentation.LogsConfig{Level: slog.LevelInfo}}, version.Info, "signoz")
|
||||
instrumentation, err := instrumentation.New(ctx, instrumentation.Config{Logs: instrumentation.LogsConfig{Level: slog.LevelInfo}}, version.Info, "o11y")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
openapi, err := signoz.NewOpenAPI(ctx, instrumentation)
|
||||
openapi, err := o11y.NewOpenAPI(ctx, instrumentation)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import (
|
||||
)
|
||||
|
||||
var RootCmd = &cobra.Command{
|
||||
Use: "signoz",
|
||||
Use: "o11y",
|
||||
Short: "OpenTelemetry-Native Logs, Metrics and Traces in a single pane",
|
||||
Version: version.Info.Version(),
|
||||
SilenceUsage: true,
|
||||
|
||||
+9
-9
@@ -9,9 +9,9 @@ global:
|
||||
external_url: <unset>
|
||||
# the url where the Hanzo O11y backend receives telemetry data (traces, metrics, logs) from instrumented applications.
|
||||
ingestion_url: <unset>
|
||||
# the url of the SigNoz MCP server. when unset, the MCP settings page is hidden in the frontend.
|
||||
# the url of the O11y MCP server. when unset, the MCP settings page is hidden in the frontend.
|
||||
# mcp_url: <unset>
|
||||
# the url of the SigNoz AI Assistant server. when unset, the AI Assistant is hidden in the frontend.
|
||||
# the url of the O11y AI Assistant server. when unset, the AI Assistant is hidden in the frontend.
|
||||
# ai_assistant_url: <unset>
|
||||
|
||||
##################### Version #####################
|
||||
@@ -128,7 +128,7 @@ querier:
|
||||
|
||||
##################### TelemetryStore #####################
|
||||
# Uses Hanzo Datastore (hanzoai/datastore) as the telemetry storage backend.
|
||||
# The datastore is a high-performance columnar database (ClickHouse-compatible).
|
||||
# The datastore is a high-performance columnar OLAP database.
|
||||
telemetrystore:
|
||||
# Maximum number of idle connections in the connection pool.
|
||||
max_idle_conns: 50
|
||||
@@ -137,7 +137,7 @@ telemetrystore:
|
||||
# Maximum time to wait for a connection to be established.
|
||||
dial_timeout: 5s
|
||||
# Specifies the telemetrystore provider to use.
|
||||
provider: clickhouse
|
||||
provider: datastore
|
||||
datastore:
|
||||
# The DSN for Hanzo Datastore. Canonical env override: O11Y_DATASTORE_DSN
|
||||
# (e.g. tcp://datastore.hanzo.svc:9000/?database=o11y).
|
||||
@@ -175,11 +175,11 @@ alertmanager:
|
||||
poll_interval: 1m
|
||||
# The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself.
|
||||
external_url: http://localhost:8080
|
||||
# The list of globs from which SigNoz's alertmanager notification templates are loaded (e.g. the email.signoz.html layout).
|
||||
# The list of globs from which O11y's alertmanager notification templates are loaded (e.g. the email.o11y.html layout).
|
||||
# This mirrors the upstream alertmanager `templates` config option. The upstream default templates (default.tmpl, email.tmpl)
|
||||
# are always loaded from the embedded alertmanager assets, so only SigNoz's own templates need to be listed here.
|
||||
# are always loaded from the embedded alertmanager assets, so only O11y's own templates need to be listed here.
|
||||
templates:
|
||||
- /opt/signoz/conf/templates/alertmanager/*.gotmpl
|
||||
- /opt/o11y/conf/templates/alertmanager/*.gotmpl
|
||||
# The global configuration for the alertmanager. All the exahustive fields can be found in the upstream: https://github.com/prometheus/alertmanager/blob/efa05feffd644ba4accb526e98a8c6545d26a783/config/config.go#L833
|
||||
global:
|
||||
# ResolveTimeout is the time after which an alert is declared resolved if it has not been updated.
|
||||
@@ -372,7 +372,7 @@ identn:
|
||||
enabled: true
|
||||
# headers to use for apikey identN resolver
|
||||
headers:
|
||||
- SIGNOZ-API-KEY
|
||||
- O11Y-API-KEY
|
||||
impersonation:
|
||||
# toggle impersonation identN, when enabled, all requests will impersonate the root user
|
||||
enabled: false
|
||||
@@ -381,7 +381,7 @@ identn:
|
||||
serviceaccount:
|
||||
email:
|
||||
# email domain for the service account principal
|
||||
domain: signozserviceaccount.com
|
||||
domain: o11yserviceaccount.com
|
||||
|
||||
analytics:
|
||||
# toggle service account analytics
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
# Deploy
|
||||
|
||||
Check that you have cloned [signoz/signoz](https://github.com/signoz/signoz)
|
||||
and currently are in `signoz/deploy` folder.
|
||||
Check that you have cloned [o11y/o11y](https://github.com/o11y/o11y)
|
||||
and currently are in `o11y/deploy` folder.
|
||||
|
||||
## Docker
|
||||
|
||||
@@ -52,7 +52,7 @@ To install Hanzo O11y using Docker Swarm, run the following command:
|
||||
|
||||
```sh
|
||||
cd deploy/docker-swarm
|
||||
docker stack deploy -c docker-compose.yaml signoz
|
||||
docker stack deploy -c docker-compose.yaml o11y
|
||||
```
|
||||
|
||||
Open http://localhost:8080 in your favourite browser.
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
# ClickHouse `signoz_*` → `o11y_*` schema cutover — lockstep deploy plan
|
||||
|
||||
The org-wide `signoz`→`o11y` rebrand renamed the **physical** ClickHouse
|
||||
databases and tables. The writer (collector), the data-preserving RENAME
|
||||
migration, and both readers (o11y querier + cloud) now all agree on `o11y_*`.
|
||||
|
||||
**These three MUST ship together. If the collector writes `o11y_*` before the
|
||||
migration renames the existing data, or the readers query `o11y_*` before either,
|
||||
telemetry blackholes** (new ingest lands in tables the readers don't query, or
|
||||
readers query tables that don't exist yet).
|
||||
|
||||
## The shared identifier set (writer == migration == readers)
|
||||
|
||||
Proven byte-identical between the schema-migrator DDL (writer) and the RENAME
|
||||
migration; both readers reference only names drawn from this set.
|
||||
|
||||
**Databases (6):** `o11y_traces` `o11y_metrics` `o11y_logs` `o11y_metadata`
|
||||
`o11y_analytics` `o11y_meter`
|
||||
|
||||
**Tables carrying the prefix (8, traces db):** `o11y_index_v3` /
|
||||
`distributed_o11y_index_v3`, `o11y_index_v2` / `distributed_o11y_index_v2`,
|
||||
`o11y_error_index_v2` / `distributed_o11y_error_index_v2`, `o11y_spans` /
|
||||
`distributed_o11y_spans`. (All other tables — `logs_v2`, `samples_v4`,
|
||||
`time_series_v4`, `distributed_tag_attributes_v2`, … — keep their names; only
|
||||
their containing database is renamed, moved wholesale by `RENAME DATABASE`.)
|
||||
|
||||
**Deliberately NOT renamed (wire contracts, unchanged on both sides):**
|
||||
spanmetrics/usage metric NAMES (`signoz_calls_total`, `signoz_latency*`,
|
||||
`signoz_*_count`/`_bytes`, `signoz_normalize_operator_logs_processed`,
|
||||
`signoz_metadata_exporter_json_logs_processed`), resource ATTRIBUTES
|
||||
(`signoz.gen_ai.*`), OTel component TYPE strings (`signozclickhousemetrics`,
|
||||
`signozclickhousemeter`, `signozlogspipeline`, `signozllmpricing`),
|
||||
query-time SQL aliases (`signoz_input_idx__`, `signoz_log_id__`).
|
||||
|
||||
## Component versions that must move together
|
||||
|
||||
| component | change | artifact |
|
||||
|---|---|---|
|
||||
| writer | schema-migrator + ClickHouse exporters emit `o11y_*` | `ghcr.io/hanzoai/otel-collector` **v0.144.8** (+ `o11y-schema-migrator`) |
|
||||
| migration | data-preserving `RENAME DATABASE`/`RENAME TABLE` | `deploy/datastore/migrations/0001_rename_signoz_to_o11y.sql` |
|
||||
| reader (o11y) | querier reads `o11y_*` | hanzoai/o11y#28 @ collector v0.144.8 |
|
||||
| reader (cloud) | direct ClickHouse reads `o11y_*` | hanzoai/cloud#202 @ collector v0.144.8 |
|
||||
|
||||
## Pre-flight — prove it on a FRESH/scratch ClickHouse (never prod)
|
||||
|
||||
Run end-to-end against a throwaway ClickHouse before touching prod:
|
||||
|
||||
1. **Create schema fresh** with the v0.144.8 schema-migrator → it creates the
|
||||
`o11y_*` databases + tables directly (no `signoz_*` ever exist).
|
||||
```
|
||||
docker run --rm --net <scratch-ch-net> ghcr.io/hanzoai/o11y-schema-migrator:v0.144.8 \
|
||||
sync --dsn 'tcp://<scratch-ch>:9000' --replication=false --up=
|
||||
```
|
||||
Verify: `SELECT name FROM system.databases WHERE name LIKE 'o11y_%'` returns 6;
|
||||
`SELECT count() FROM system.tables WHERE name LIKE '%o11y_index_v3%'` > 0;
|
||||
`SELECT count() FROM system.databases WHERE name LIKE 'signoz_%'` = **0**.
|
||||
2. **Emit a trace + a metric** through the v0.144.8 collector at the scratch DSN
|
||||
(OTLP/ZAP in). Confirm rows land: `SELECT count() FROM o11y_traces.distributed_o11y_index_v3`
|
||||
> 0 and `SELECT count() FROM o11y_metrics.distributed_samples_v4` > 0.
|
||||
3. **Query it back through o11y** (community server @ collector v0.144.8, pointed
|
||||
at scratch DSN): the trace is visible via the querier and cloud's
|
||||
`requestLogs`/`metricsRead` SQL (`FROM o11y_traces.distributed_o11y_index_v3`)
|
||||
returns the row. Green = writer↔reader agree on a fresh install.
|
||||
4. **Rehearse the RENAME on a signoz-seeded scratch DB**: create with the OLD
|
||||
v0.144.7 migrator (produces `signoz_*`), ingest a row, run
|
||||
`0001_rename_signoz_to_o11y.sql`, then confirm the row is still present under
|
||||
`o11y_*` and `system.databases` shows no `signoz_*`. Proves data is preserved
|
||||
in place (metadata-only rename, no copy).
|
||||
|
||||
## Prod cutover order (single maintenance window)
|
||||
|
||||
> Gated by the migration's own pre-check (`SELECT ... system.databases WHERE name
|
||||
> IN ('signoz_traces', …)`). Fresh installs already on `o11y_*` skip the migration.
|
||||
> Clustered deployments: append `ON CLUSTER '<cluster>'` to every RENAME (see the
|
||||
> migration header).
|
||||
|
||||
1. **Deploy the collector v0.144.8** (schema-migrator + collector). On an existing
|
||||
install the migrator is a no-op for already-present databases; the collector
|
||||
now WRITES `o11y_*`. Briefly, new ingest targets `o11y_*` while old data is
|
||||
still under `signoz_*` — this is why step 2 follows immediately.
|
||||
2. **Run the RENAME migration** `0001_rename_signoz_to_o11y.sql` once. It moves the
|
||||
existing `signoz_*` databases/tables (with all rows) to `o11y_*` — metadata-only,
|
||||
no drop, no copy. After this, historical + new data share the `o11y_*` names.
|
||||
3. **Deploy o11y + cloud** (both @ collector v0.144.8). They now READ `o11y_*`,
|
||||
matching what the collector writes and the migration produced.
|
||||
|
||||
Roll the window tight: the gap between (1) and (3) is the only interval where a
|
||||
stale reader (still on `signoz_*`) would see no data. Because the migration is a
|
||||
metadata rename, step 2 is near-instant, keeping the window minimal.
|
||||
|
||||
## Rollback
|
||||
|
||||
`RENAME` is reversible: `RENAME DATABASE o11y_traces TO signoz_traces; …` (invert
|
||||
every statement) restores the old names, and redeploying the prior collector
|
||||
v0.144.7 + prior o11y/cloud images resumes `signoz_*` reads/writes. No data is
|
||||
lost either direction because nothing is dropped.
|
||||
@@ -0,0 +1,78 @@
|
||||
-- 0001_rename_signoz_to_o11y.sql
|
||||
--
|
||||
-- Data-preserving ClickHouse cutover: rename the legacy `signoz_*` telemetry
|
||||
-- databases and their `signoz_`-prefixed tables to the debranded `o11y_*`
|
||||
-- identifiers that the o11y querier now reads (pkg/query-service, pkg/telemetry*).
|
||||
--
|
||||
-- WHY: the o11y read plane was debranded signoz_* -> o11y_* (databases, tables,
|
||||
-- and query template identifiers). For a live deployment to keep serving its
|
||||
-- existing telemetry after the upgrade, the physical ClickHouse objects must be
|
||||
-- renamed to match. This is a coordinated cutover with the otel-collector write
|
||||
-- side (see the CAVEAT below).
|
||||
--
|
||||
-- DATA-PRESERVING: every statement is a metadata-only `RENAME` (ClickHouse moves
|
||||
-- the table/database entry — it never copies or rewrites parts). There is NO
|
||||
-- DROP, NO CREATE ... AS, NO INSERT. Live telemetry is preserved in place.
|
||||
--
|
||||
-- GUARD / IDEMPOTENCY: ClickHouse `RENAME DATABASE|TABLE` has no `IF EXISTS`
|
||||
-- clause, so apply this script ONCE during the cutover window, gated by the
|
||||
-- pre-check below. The check makes it safe whether or not the objects exist
|
||||
-- (fresh installs that were provisioned directly as o11y_* are skipped; a
|
||||
-- half-applied run resumes because already-renamed objects fall out of the set).
|
||||
--
|
||||
-- -- run first; only proceed with the renames it reports as still `signoz_*`:
|
||||
-- SELECT name FROM system.databases
|
||||
-- WHERE name IN ('signoz_traces','signoz_metrics','signoz_logs',
|
||||
-- 'signoz_metadata','signoz_analytics','signoz_meter');
|
||||
-- SELECT database, name FROM system.tables
|
||||
-- WHERE database IN ('signoz_traces','o11y_traces')
|
||||
-- AND name LIKE 'signoz_%' OR name LIKE 'distributed_signoz_%';
|
||||
--
|
||||
-- CLUSTERED DEPLOYMENTS: append `ON CLUSTER '<cluster>'` (SigNoz/o11y default
|
||||
-- cluster name is `cluster`) to every statement so the rename is replicated to
|
||||
-- all shards/replicas, e.g. `RENAME DATABASE signoz_traces TO o11y_traces ON CLUSTER 'cluster';`.
|
||||
--
|
||||
-- =====================================================================
|
||||
-- 1) Databases — moves every table inside (samples_v4, time_series_v4,
|
||||
-- logs_v2, *_v4, usage, tag_attributes_v2, …) WITH its data.
|
||||
-- =====================================================================
|
||||
RENAME DATABASE signoz_traces TO o11y_traces;
|
||||
RENAME DATABASE signoz_metrics TO o11y_metrics;
|
||||
RENAME DATABASE signoz_logs TO o11y_logs;
|
||||
RENAME DATABASE signoz_metadata TO o11y_metadata;
|
||||
RENAME DATABASE signoz_analytics TO o11y_analytics;
|
||||
RENAME DATABASE signoz_meter TO o11y_meter;
|
||||
|
||||
-- =====================================================================
|
||||
-- 2) Tables whose NAME carries the signoz_ prefix (traces database only).
|
||||
-- They now live under o11y_traces (renamed in step 1); rename the table
|
||||
-- identifiers to the o11y_ names the querier references. Distributed and
|
||||
-- local (sharded) tables are renamed as matched pairs.
|
||||
-- =====================================================================
|
||||
RENAME TABLE o11y_traces.signoz_index_v3 TO o11y_traces.o11y_index_v3;
|
||||
RENAME TABLE o11y_traces.distributed_signoz_index_v3 TO o11y_traces.distributed_o11y_index_v3;
|
||||
RENAME TABLE o11y_traces.signoz_index_v2 TO o11y_traces.o11y_index_v2;
|
||||
RENAME TABLE o11y_traces.distributed_signoz_index_v2 TO o11y_traces.distributed_o11y_index_v2;
|
||||
RENAME TABLE o11y_traces.signoz_error_index_v2 TO o11y_traces.o11y_error_index_v2;
|
||||
RENAME TABLE o11y_traces.distributed_signoz_error_index_v2 TO o11y_traces.distributed_o11y_error_index_v2;
|
||||
RENAME TABLE o11y_traces.signoz_spans TO o11y_traces.o11y_spans;
|
||||
RENAME TABLE o11y_traces.distributed_signoz_spans TO o11y_traces.distributed_o11y_spans;
|
||||
|
||||
-- =====================================================================
|
||||
-- NOTE — COLUMNS: no data-preserving `ALTER TABLE … RENAME COLUMN` is required.
|
||||
-- The audit found NO stored column carrying a `signoz_` prefix; the `signoz_*`
|
||||
-- tokens that look column-shaped in the query layer are (a) SQL result aliases
|
||||
-- (e.g. signoz_input_idx__, signoz_log_id__) which are query-time only, and
|
||||
-- (b) span-metrics metric NAMES stored as row VALUES in the metrics `__name__`
|
||||
-- column (signoz_calls_total, signoz_latency_bucket/_count, signoz_db_calls_total).
|
||||
-- Those metric-name values are written by the collector spanmetrics connector,
|
||||
-- not schema, so they are cut over on the write side (+ optional value backfill)
|
||||
-- — outside DDL scope. If a backfill is desired it is a plain UPDATE on the
|
||||
-- metric-name column, still no drop.
|
||||
--
|
||||
-- CAVEAT (coordination) — as of otel-collector v0.144.7 the collector's SQL
|
||||
-- schema (cmd/o11yschemamigrator) still CREATES/writes the physical objects
|
||||
-- under the `signoz_*` names above (only its Go package paths were debranded).
|
||||
-- Apply this migration only in lockstep with a collector release whose schema
|
||||
-- migrator emits the `o11y_*` identifiers, otherwise new ingest lands in the old
|
||||
-- names. This file is the read-plane/data half of that coordinated rename.
|
||||
@@ -81,7 +81,7 @@ services:
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
volumes:
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
zookeeper-1:
|
||||
!!merge <<: *zookeeper-defaults
|
||||
# ports:
|
||||
@@ -89,7 +89,7 @@ services:
|
||||
# - "2888:2888"
|
||||
# - "3888:3888"
|
||||
volumes:
|
||||
- ./clickhouse-setup/data/zookeeper-1:/bitnami/zookeeper
|
||||
- ./datastore-setup/data/zookeeper-1:/bitnami/zookeeper
|
||||
environment:
|
||||
- ZOO_SERVER_ID=1
|
||||
- ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper-2:2888:3888,zookeeper-3:2888:3888
|
||||
@@ -104,7 +104,7 @@ services:
|
||||
# - "2889:2888"
|
||||
# - "3889:3888"
|
||||
volumes:
|
||||
- ./clickhouse-setup/data/zookeeper-2:/bitnami/zookeeper
|
||||
- ./datastore-setup/data/zookeeper-2:/bitnami/zookeeper
|
||||
environment:
|
||||
- ZOO_SERVER_ID=2
|
||||
- ZOO_SERVERS=zookeeper-1:2888:3888,0.0.0.0:2888:3888,zookeeper-3:2888:3888
|
||||
@@ -119,7 +119,7 @@ services:
|
||||
# - "2890:2888"
|
||||
# - "3890:3888"
|
||||
volumes:
|
||||
- ./clickhouse-setup/data/zookeeper-3:/bitnami/zookeeper
|
||||
- ./datastore-setup/data/zookeeper-3:/bitnami/zookeeper
|
||||
environment:
|
||||
- ZOO_SERVER_ID=3
|
||||
- ZOO_SERVERS=zookeeper-1:2888:3888,zookeeper-2:2888:3888,0.0.0.0:2888:3888
|
||||
@@ -145,9 +145,9 @@ services:
|
||||
- source: clickhouse-cluster
|
||||
target: /etc/clickhouse-server/config.d/cluster.ha.xml
|
||||
volumes:
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ./clickhouse-setup/data/clickhouse/:/var/lib/clickhouse/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ./datastore-setup/data/datastore/:/var/lib/clickhouse/
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
clickhouse-2:
|
||||
!!merge <<: *clickhouse-defaults
|
||||
hostname: clickhouse-2
|
||||
@@ -165,9 +165,9 @@ services:
|
||||
- source: clickhouse-cluster
|
||||
target: /etc/clickhouse-server/config.d/cluster.ha.xml
|
||||
volumes:
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ./clickhouse-setup/data/clickhouse-2/:/var/lib/clickhouse/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ./datastore-setup/data/datastore-2/:/var/lib/clickhouse/
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
clickhouse-3:
|
||||
!!merge <<: *clickhouse-defaults
|
||||
hostname: clickhouse-3
|
||||
@@ -185,9 +185,9 @@ services:
|
||||
- source: clickhouse-cluster
|
||||
target: /etc/clickhouse-server/config.d/cluster.ha.xml
|
||||
volumes:
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ./clickhouse-setup/data/clickhouse-3/:/var/lib/clickhouse/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ./datastore-setup/data/datastore-3/:/var/lib/clickhouse/
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
observe:
|
||||
!!merge <<: *db-depend
|
||||
image: ghcr.io/hanzoai/o11y:v0.115.0
|
||||
@@ -195,7 +195,7 @@ services:
|
||||
- "8080:8080" # observe port
|
||||
# - "6060:6060" # pprof port
|
||||
volumes:
|
||||
- ./clickhouse-setup/data/observe/:/var/lib/observe/
|
||||
- ./datastore-setup/data/observe/:/var/lib/observe/
|
||||
environment:
|
||||
- O11Y_ALERTMANAGER_PROVIDER=observe
|
||||
- O11Y_DATASTORE_DSN=tcp://clickhouse:9000
|
||||
@@ -275,13 +275,13 @@ volumes:
|
||||
name: o11y-zookeeper-3
|
||||
configs:
|
||||
clickhouse-config:
|
||||
file: ../common/clickhouse/config.xml
|
||||
file: ../common/datastore/config.xml
|
||||
clickhouse-users:
|
||||
file: ../common/clickhouse/users.xml
|
||||
file: ../common/datastore/users.xml
|
||||
clickhouse-custom-function:
|
||||
file: ../common/clickhouse/custom-function.xml
|
||||
file: ../common/datastore/custom-function.xml
|
||||
clickhouse-cluster:
|
||||
file: ../common/clickhouse/cluster.ha.xml
|
||||
file: ../common/datastore/cluster.ha.xml
|
||||
otel-collector-config:
|
||||
file: ./otel-collector-config.yaml
|
||||
otel-manager-config:
|
||||
|
||||
@@ -78,7 +78,7 @@ services:
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
volumes:
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
zookeeper-1:
|
||||
!!merge <<: *zookeeper-defaults
|
||||
# ports:
|
||||
@@ -113,8 +113,8 @@ services:
|
||||
target: /etc/clickhouse-server/config.d/cluster.xml
|
||||
volumes:
|
||||
- clickhouse:/var/lib/clickhouse/
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
observe:
|
||||
!!merge <<: *db-depend
|
||||
image: ghcr.io/hanzoai/o11y:v0.115.0
|
||||
@@ -193,13 +193,13 @@ volumes:
|
||||
name: o11y-zookeeper-1
|
||||
configs:
|
||||
clickhouse-config:
|
||||
file: ../common/clickhouse/config.xml
|
||||
file: ../common/datastore/config.xml
|
||||
clickhouse-users:
|
||||
file: ../common/clickhouse/users.xml
|
||||
file: ../common/datastore/users.xml
|
||||
clickhouse-custom-function:
|
||||
file: ../common/clickhouse/custom-function.xml
|
||||
file: ../common/datastore/custom-function.xml
|
||||
clickhouse-cluster:
|
||||
file: ../common/clickhouse/cluster.xml
|
||||
file: ../common/datastore/cluster.xml
|
||||
otel-collector-config:
|
||||
file: ./otel-collector-config.yaml
|
||||
otel-manager-config:
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
This directory is deprecated and will be removed in the future.
|
||||
Please use the new directory for Clickhouse setup scripts: `scripts/clickhouse` instead.
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
This data directory is deprecated and will be removed in the future.
|
||||
Please use the migration script under `scripts/volume-migration` to migrate data from bind mounts to Docker volumes.
|
||||
The script also renames the project name to `signoz` and the network name to `signoz-net` (if not already in place).
|
||||
The script also renames the project name to `o11y` and the network name to `o11y-net` (if not already in place).
|
||||
@@ -0,0 +1,2 @@
|
||||
This directory is deprecated and will be removed in the future.
|
||||
Please use the new directory for Datastore setup scripts: `scripts/datastore` instead.
|
||||
@@ -85,7 +85,7 @@ services:
|
||||
mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
zookeeper-1:
|
||||
!!merge <<: *zookeeper-defaults
|
||||
container_name: o11y-zookeeper-1
|
||||
@@ -142,13 +142,13 @@ services:
|
||||
# - "8123:8123"
|
||||
# - "9181:9181"
|
||||
volumes:
|
||||
- ../common/clickhouse/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/clickhouse/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/clickhouse/cluster.ha.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- ../common/datastore/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/datastore/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/datastore/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/cluster.ha.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- clickhouse:/var/lib/clickhouse/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
clickhouse-2:
|
||||
!!merge <<: *clickhouse-defaults
|
||||
container_name: o11y-datastore-2
|
||||
@@ -157,13 +157,13 @@ services:
|
||||
# - "8124:8123"
|
||||
# - "9182:9181"
|
||||
volumes:
|
||||
- ../common/clickhouse/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/clickhouse/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/clickhouse/cluster.ha.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- ../common/datastore/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/datastore/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/datastore/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/cluster.ha.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- clickhouse-2:/var/lib/clickhouse/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
clickhouse-3:
|
||||
!!merge <<: *clickhouse-defaults
|
||||
container_name: o11y-datastore-3
|
||||
@@ -172,13 +172,13 @@ services:
|
||||
# - "8125:8123"
|
||||
# - "9183:9181"
|
||||
volumes:
|
||||
- ../common/clickhouse/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/clickhouse/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/clickhouse/cluster.ha.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- ../common/datastore/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/datastore/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/datastore/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/cluster.ha.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- clickhouse-3:/var/lib/clickhouse/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
observe:
|
||||
!!merge <<: *db-depend
|
||||
image: ghcr.io/hanzoai/o11y:${VERSION:-v0.115.0}
|
||||
|
||||
@@ -76,7 +76,7 @@ services:
|
||||
mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
zookeeper-1:
|
||||
!!merge <<: *zookeeper-defaults
|
||||
container_name: o11y-zookeeper-1
|
||||
@@ -100,13 +100,13 @@ services:
|
||||
# - "8123:8123"
|
||||
# - "9181:9181"
|
||||
volumes:
|
||||
- ../common/clickhouse/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/clickhouse/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/clickhouse/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/clickhouse/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- ../common/datastore/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../common/datastore/users.xml:/etc/clickhouse-server/users.xml
|
||||
- ../common/datastore/custom-function.xml:/etc/clickhouse-server/custom-function.xml
|
||||
- ../common/datastore/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../common/datastore/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- clickhouse:/var/lib/clickhouse/
|
||||
# - ../common/clickhouse/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
# - ../common/datastore/storage.xml:/etc/clickhouse-server/config.d/storage.xml
|
||||
observe:
|
||||
!!merge <<: *db-depend
|
||||
image: ghcr.io/hanzoai/o11y:${VERSION:-v0.115.0}
|
||||
|
||||
+22
-22
@@ -123,7 +123,7 @@ check_os() {
|
||||
}
|
||||
|
||||
|
||||
# This function checks if the relevant ports required by SigNoz are available or not
|
||||
# This function checks if the relevant ports required by O11y are available or not
|
||||
# The script should error out in case they aren't available
|
||||
check_ports_occupied() {
|
||||
local port_check_output
|
||||
@@ -144,8 +144,8 @@ check_ports_occupied() {
|
||||
send_event "port_not_available"
|
||||
|
||||
echo "+++++++++++ ERROR ++++++++++++++++++++++"
|
||||
echo "SigNoz requires ports 8080 & 4317 to be open. Please shut down any other service(s) that may be running on these ports."
|
||||
echo "You can run SigNoz on another port following this guide https://signoz.io/docs/install/troubleshooting/"
|
||||
echo "O11y requires ports 8080 & 4317 to be open. Please shut down any other service(s) that may be running on these ports."
|
||||
echo "You can run O11y on another port following this guide https://o11y.io/docs/install/troubleshooting/"
|
||||
echo "++++++++++++++++++++++++++++++++++++++++"
|
||||
echo ""
|
||||
exit 1
|
||||
@@ -272,8 +272,8 @@ bye() { # Prints a friendly good bye message and exits the script.
|
||||
echo -e "cd ${DOCKER_STANDALONE_DIR}"
|
||||
echo -e "$sudo_cmd $docker_compose_cmd ps -a"
|
||||
|
||||
echo "Please read our troubleshooting guide https://signoz.io/docs/install/troubleshooting/"
|
||||
echo "or reach us for support in #help channel in our Slack Community https://signoz.io/slack"
|
||||
echo "Please read our troubleshooting guide https://o11y.io/docs/install/troubleshooting/"
|
||||
echo "or reach us for support in #help channel in our Slack Community https://o11y.io/slack"
|
||||
echo "++++++++++++++++++++++++++++++++++++++++"
|
||||
|
||||
if [[ $email == "" ]]; then
|
||||
@@ -307,13 +307,13 @@ request_sudo() {
|
||||
fi
|
||||
|
||||
echo -e "Got it! Thanks!! 🙏\n"
|
||||
echo -e "Okay! We will bring up the SigNoz cluster from here 🚀\n"
|
||||
echo -e "Okay! We will bring up the O11y cluster from here 🚀\n"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
echo ""
|
||||
echo -e "👋 Thank you for trying out SigNoz! "
|
||||
echo -e "👋 Thank you for trying out O11y! "
|
||||
echo ""
|
||||
|
||||
sudo_cmd=""
|
||||
@@ -358,9 +358,9 @@ elif hash openssl 2>/dev/null; then
|
||||
fi
|
||||
|
||||
if [[ -z $digest_cmd ]]; then
|
||||
SIGNOZ_INSTALLATION_ID="$sysinfo"
|
||||
O11Y_INSTALLATION_ID="$sysinfo"
|
||||
else
|
||||
SIGNOZ_INSTALLATION_ID=$(echo "$sysinfo" | $digest_cmd | grep -E -o '[a-zA-Z0-9]{64}')
|
||||
O11Y_INSTALLATION_ID=$(echo "$sysinfo" | $digest_cmd | grep -E -o '[a-zA-Z0-9]{64}')
|
||||
fi
|
||||
|
||||
setup_type='clickhouse'
|
||||
@@ -421,7 +421,7 @@ send_event() {
|
||||
error='"error": "'"$error"'", '
|
||||
fi
|
||||
|
||||
DATA='{ "anonymousId": "'"$SIGNOZ_INSTALLATION_ID"'", "event": "'"$event"'", "properties": { "os": "'"$os"'", '"$error $others"' "setup_type": "'"$setup_type"'" } }'
|
||||
DATA='{ "anonymousId": "'"$O11Y_INSTALLATION_ID"'", "event": "'"$event"'", "properties": { "os": "'"$os"'", '"$error $others"' "setup_type": "'"$setup_type"'" } }'
|
||||
|
||||
if has_curl; then
|
||||
curl -sfL -d "$DATA" --header "$HEADER_1" --header "$HEADER_2" "$URL" > /dev/null 2>&1
|
||||
@@ -482,21 +482,21 @@ start_docker
|
||||
# Switch to the Docker Standalone directory
|
||||
pushd "${BASE_DIR}/${DOCKER_STANDALONE_DIR}" > /dev/null 2>&1
|
||||
|
||||
# check for open ports, if signoz is not installed
|
||||
# check for open ports, if o11y is not installed
|
||||
if is_command_present docker-compose; then
|
||||
if $sudo_cmd $docker_compose_cmd ps | grep "signoz" | grep -q "healthy" > /dev/null 2>&1; then
|
||||
echo "SigNoz already installed, skipping the occupied ports check"
|
||||
if $sudo_cmd $docker_compose_cmd ps | grep "o11y" | grep -q "healthy" > /dev/null 2>&1; then
|
||||
echo "O11y already installed, skipping the occupied ports check"
|
||||
else
|
||||
check_ports_occupied
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "\n🟡 Pulling the latest container images for SigNoz.\n"
|
||||
echo -e "\n🟡 Pulling the latest container images for O11y.\n"
|
||||
$sudo_cmd $docker_compose_cmd pull
|
||||
|
||||
echo ""
|
||||
echo "🟡 Starting the SigNoz containers. It may take a few minutes ..."
|
||||
echo "🟡 Starting the O11y containers. It may take a few minutes ..."
|
||||
echo
|
||||
# The $docker_compose_cmd command does some nasty stuff for the `--detach` functionality. So we add a `|| true` so that the
|
||||
# script doesn't exit because this command looks like it failed to do it's thing.
|
||||
@@ -519,8 +519,8 @@ if [[ $status_code -ne 200 ]]; then
|
||||
echo "$sudo_cmd $docker_compose_cmd down -v"
|
||||
echo ""
|
||||
|
||||
echo "Please read our troubleshooting guide https://signoz.io/docs/install/troubleshooting/"
|
||||
echo "or reach us on SigNoz for support https://signoz.io/slack"
|
||||
echo "Please read our troubleshooting guide https://o11y.io/docs/install/troubleshooting/"
|
||||
echo "or reach us on O11y for support https://o11y.io/slack"
|
||||
echo "++++++++++++++++++++++++++++++++++++++++"
|
||||
|
||||
send_event "installation_error_checks"
|
||||
@@ -533,12 +533,12 @@ else
|
||||
echo ""
|
||||
echo "🟢 Your installation is complete!"
|
||||
echo ""
|
||||
echo -e "🟢 SigNoz is running on http://localhost:8080"
|
||||
echo -e "🟢 O11y is running on http://localhost:8080"
|
||||
echo ""
|
||||
echo "ℹ️ By default, retention period is set to 15 days for logs and traces, and 30 days for metrics."
|
||||
echo -e "To change this, navigate to the General tab on the Settings page of SigNoz UI. For more details, refer to https://signoz.io/docs/userguide/retention-period \n"
|
||||
echo -e "To change this, navigate to the General tab on the Settings page of O11y UI. For more details, refer to https://o11y.io/docs/userguide/retention-period \n"
|
||||
|
||||
echo "ℹ️ To bring down SigNoz and clean volumes:"
|
||||
echo "ℹ️ To bring down O11y and clean volumes:"
|
||||
echo ""
|
||||
echo "cd ${DOCKER_STANDALONE_DIR}"
|
||||
echo "$sudo_cmd $docker_compose_cmd down -v"
|
||||
@@ -547,9 +547,9 @@ else
|
||||
echo "+++++++++++++++++++++++++++++++++++++++++++++++++"
|
||||
echo ""
|
||||
echo "👉 Need help in Getting Started?"
|
||||
echo -e "Join us on Slack https://signoz.io/slack"
|
||||
echo -e "Join us on Slack https://o11y.io/slack"
|
||||
echo ""
|
||||
echo -e "\n📨 Please share your email to receive support & updates about SigNoz!"
|
||||
echo -e "\n📨 Please share your email to receive support & updates about O11y!"
|
||||
read -rp 'Email: ' email
|
||||
|
||||
while [[ $email == "" ]]
|
||||
|
||||
@@ -40,7 +40,7 @@ matcher, notification, receiver, recurrence, route, schedule, template`.
|
||||
|
||||
## Why it's hard
|
||||
|
||||
1. **The schema IS the API.** SigNoz's frontend, our k8s CRDs, and any
|
||||
1. **The schema IS the API.** O11y's frontend, our k8s CRDs, and any
|
||||
external alert source all speak the Alertmanager YAML schema. Replacing
|
||||
the parser without preserving the schema breaks every consumer.
|
||||
2. **Routing is non-trivial.** Alertmanager's route tree (with `continue`,
|
||||
@@ -101,7 +101,7 @@ get reimplemented; routing tree stays Alertmanager's.
|
||||
### Option 4 — Accept the Alertmanager dep
|
||||
|
||||
The o11y team explicitly carves out alerting as the one place we
|
||||
intentionally use upstream Prometheus types, because SigNoz's contract
|
||||
intentionally use upstream Prometheus types, because O11y's contract
|
||||
*is* the Alertmanager schema. Every other Hanzo repo is now
|
||||
prometheus-free.
|
||||
|
||||
@@ -117,7 +117,7 @@ prometheus-free.
|
||||
The 24-repo client_golang → luxfi/metric migration that shipped alongside
|
||||
this RFC already removes Prometheus from 161 files. The remaining
|
||||
alertmanager dependency is *isolated to o11y's alerting plane* and is
|
||||
load-bearing for the SigNoz frontend's contract.
|
||||
load-bearing for the O11y frontend's contract.
|
||||
|
||||
A clean-room rewrite (Option 1) is the only path that ends with zero
|
||||
Prometheus in any Hanzo binary. But it's a 4-6 week initiative that
|
||||
@@ -143,8 +143,8 @@ Total: ~4-6 weeks calendar time for one engineer focused.
|
||||
1. Does anything outside o11y consume the Alertmanager config schema
|
||||
(e.g. k8s CRDs, alert-router)? If yes, schema changes are
|
||||
cross-repo and need their own coordination.
|
||||
2. Is the SigNoz frontend wired to send alerts to o11y via the
|
||||
Alertmanager v2 OpenAPI schema, or via SigNoz's own internal RPC?
|
||||
2. Is the O11y frontend wired to send alerts to o11y via the
|
||||
Alertmanager v2 OpenAPI schema, or via O11y's own internal RPC?
|
||||
If the former, the v2 wire format is part of the contract and we
|
||||
need a compatibility shim regardless of which option we pick.
|
||||
3. Do we actually use Alertmanager's inhibit rules in production? If
|
||||
|
||||
+116
-116
@@ -1015,13 +1015,13 @@ components:
|
||||
type: string
|
||||
ingestionUrl:
|
||||
type: string
|
||||
sigNozApiKey:
|
||||
o11yApiKey:
|
||||
type: string
|
||||
sigNozApiUrl:
|
||||
o11yApiUrl:
|
||||
type: string
|
||||
required:
|
||||
- sigNozApiUrl
|
||||
- sigNozApiKey
|
||||
- o11yApiUrl
|
||||
- o11yApiKey
|
||||
- ingestionUrl
|
||||
- ingestionKey
|
||||
type: object
|
||||
@@ -2434,9 +2434,9 @@ components:
|
||||
type: object
|
||||
DashboardtypesBuilderQuerySpec:
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5LogAggregation'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5MetricAggregation'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5TraceAggregation'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5LogAggregation'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5MetricAggregation'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5TraceAggregation'
|
||||
DashboardtypesComparisonOperator:
|
||||
enum:
|
||||
- above
|
||||
@@ -2529,13 +2529,13 @@ components:
|
||||
- $ref: '#/components/schemas/DashboardtypesDatasourcePluginVariantStruct'
|
||||
DashboardtypesDatasourcePluginKind:
|
||||
enum:
|
||||
- signoz/Datasource
|
||||
- o11y/Datasource
|
||||
type: string
|
||||
DashboardtypesDatasourcePluginVariantStruct:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/Datasource
|
||||
- o11y/Datasource
|
||||
type: string
|
||||
spec:
|
||||
nullable: true
|
||||
@@ -2744,28 +2744,28 @@ components:
|
||||
type: object
|
||||
DashboardtypesPanelPlugin:
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesTimeSeriesPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesBarChartPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesNumberPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesPieChartPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesTablePanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesHistogramPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesListPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesTimeSeriesPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesBarChartPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesNumberPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesPieChartPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesTablePanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesHistogramPanelSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesListPanelSpec'
|
||||
DashboardtypesPanelPluginKind:
|
||||
enum:
|
||||
- signoz/TimeSeriesPanel
|
||||
- signoz/BarChartPanel
|
||||
- signoz/NumberPanel
|
||||
- signoz/PieChartPanel
|
||||
- signoz/TablePanel
|
||||
- signoz/HistogramPanel
|
||||
- signoz/ListPanel
|
||||
- o11y/TimeSeriesPanel
|
||||
- o11y/BarChartPanel
|
||||
- o11y/NumberPanel
|
||||
- o11y/PieChartPanel
|
||||
- o11y/TablePanel
|
||||
- o11y/HistogramPanel
|
||||
- o11y/ListPanel
|
||||
type: string
|
||||
DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesBarChartPanelSpec:
|
||||
DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesBarChartPanelSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/BarChartPanel
|
||||
- o11y/BarChartPanel
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesBarChartPanelSpec'
|
||||
@@ -2773,11 +2773,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesHistogramPanelSpec:
|
||||
DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesHistogramPanelSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/HistogramPanel
|
||||
- o11y/HistogramPanel
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesHistogramPanelSpec'
|
||||
@@ -2785,11 +2785,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesListPanelSpec:
|
||||
DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesListPanelSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/ListPanel
|
||||
- o11y/ListPanel
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesListPanelSpec'
|
||||
@@ -2797,11 +2797,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesNumberPanelSpec:
|
||||
DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesNumberPanelSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/NumberPanel
|
||||
- o11y/NumberPanel
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesNumberPanelSpec'
|
||||
@@ -2809,11 +2809,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesPieChartPanelSpec:
|
||||
DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesPieChartPanelSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/PieChartPanel
|
||||
- o11y/PieChartPanel
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesPieChartPanelSpec'
|
||||
@@ -2821,11 +2821,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesTablePanelSpec:
|
||||
DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesTablePanelSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/TablePanel
|
||||
- o11y/TablePanel
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesTablePanelSpec'
|
||||
@@ -2833,11 +2833,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesPanelPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesTimeSeriesPanelSpec:
|
||||
DashboardtypesPanelPluginVariantGithubComO11yO11yPkgTypesDashboardtypesTimeSeriesPanelSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/TimeSeriesPanel
|
||||
- o11y/TimeSeriesPanel
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesTimeSeriesPanelSpec'
|
||||
@@ -2916,26 +2916,26 @@ components:
|
||||
type: object
|
||||
DashboardtypesQueryPlugin:
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesBuilderQuerySpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5CompositeQuery'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderFormula'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5PromQuery'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5ClickHouseQuery'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderTraceOperator'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesDashboardtypesBuilderQuerySpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5CompositeQuery'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderFormula'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5PromQuery'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5DatastoreQuery'
|
||||
- $ref: '#/components/schemas/DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderTraceOperator'
|
||||
DashboardtypesQueryPluginKind:
|
||||
enum:
|
||||
- signoz/BuilderQuery
|
||||
- signoz/CompositeQuery
|
||||
- signoz/Formula
|
||||
- signoz/PromQLQuery
|
||||
- signoz/ClickHouseSQL
|
||||
- signoz/TraceOperator
|
||||
- o11y/BuilderQuery
|
||||
- o11y/CompositeQuery
|
||||
- o11y/Formula
|
||||
- o11y/PromQLQuery
|
||||
- o11y/DatastoreSQL
|
||||
- o11y/TraceOperator
|
||||
type: string
|
||||
DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesDashboardtypesBuilderQuerySpec:
|
||||
DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesDashboardtypesBuilderQuerySpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/BuilderQuery
|
||||
- o11y/BuilderQuery
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesBuilderQuerySpec'
|
||||
@@ -2943,23 +2943,23 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5ClickHouseQuery:
|
||||
DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5DatastoreQuery:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/ClickHouseSQL
|
||||
- o11y/DatastoreSQL
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5ClickHouseQuery'
|
||||
$ref: '#/components/schemas/Querybuildertypesv5DatastoreQuery'
|
||||
required:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5CompositeQuery:
|
||||
DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5CompositeQuery:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/CompositeQuery
|
||||
- o11y/CompositeQuery
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5CompositeQuery'
|
||||
@@ -2967,11 +2967,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5PromQuery:
|
||||
DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5PromQuery:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/PromQLQuery
|
||||
- o11y/PromQLQuery
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5PromQuery'
|
||||
@@ -2979,11 +2979,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderFormula:
|
||||
DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderFormula:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/Formula
|
||||
- o11y/Formula
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderFormula'
|
||||
@@ -2991,11 +2991,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesQueryPluginVariantGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderTraceOperator:
|
||||
DashboardtypesQueryPluginVariantGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5QueryBuilderTraceOperator:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/TraceOperator
|
||||
- o11y/TraceOperator
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderTraceOperator'
|
||||
@@ -3156,7 +3156,7 @@ components:
|
||||
type: object
|
||||
DashboardtypesVariable:
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/DashboardtypesVariableEnvelopeGithubComSigNozSignozPkgTypesDashboardtypesListVariableSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesVariableEnvelopeGithubComO11yO11yPkgTypesDashboardtypesListVariableSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesVariableEnvelopeGithubComPersesPersesPkgModelApiV1DashboardTextVariableSpec'
|
||||
DashboardtypesVariableEnvelopeGithubComPersesPersesPkgModelApiV1DashboardTextVariableSpec:
|
||||
properties:
|
||||
@@ -3170,7 +3170,7 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesVariableEnvelopeGithubComSigNozSignozPkgTypesDashboardtypesListVariableSpec:
|
||||
DashboardtypesVariableEnvelopeGithubComO11yO11yPkgTypesDashboardtypesListVariableSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
@@ -3184,20 +3184,20 @@ components:
|
||||
type: object
|
||||
DashboardtypesVariablePlugin:
|
||||
oneOf:
|
||||
- $ref: '#/components/schemas/DashboardtypesVariablePluginVariantGithubComSigNozSignozPkgTypesDashboardtypesDynamicVariableSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesVariablePluginVariantGithubComSigNozSignozPkgTypesDashboardtypesQueryVariableSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesVariablePluginVariantGithubComSigNozSignozPkgTypesDashboardtypesCustomVariableSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesVariablePluginVariantGithubComO11yO11yPkgTypesDashboardtypesDynamicVariableSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesVariablePluginVariantGithubComO11yO11yPkgTypesDashboardtypesQueryVariableSpec'
|
||||
- $ref: '#/components/schemas/DashboardtypesVariablePluginVariantGithubComO11yO11yPkgTypesDashboardtypesCustomVariableSpec'
|
||||
DashboardtypesVariablePluginKind:
|
||||
enum:
|
||||
- signoz/DynamicVariable
|
||||
- signoz/QueryVariable
|
||||
- signoz/CustomVariable
|
||||
- o11y/DynamicVariable
|
||||
- o11y/QueryVariable
|
||||
- o11y/CustomVariable
|
||||
type: string
|
||||
DashboardtypesVariablePluginVariantGithubComSigNozSignozPkgTypesDashboardtypesCustomVariableSpec:
|
||||
DashboardtypesVariablePluginVariantGithubComO11yO11yPkgTypesDashboardtypesCustomVariableSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/CustomVariable
|
||||
- o11y/CustomVariable
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesCustomVariableSpec'
|
||||
@@ -3205,11 +3205,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesVariablePluginVariantGithubComSigNozSignozPkgTypesDashboardtypesDynamicVariableSpec:
|
||||
DashboardtypesVariablePluginVariantGithubComO11yO11yPkgTypesDashboardtypesDynamicVariableSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/DynamicVariable
|
||||
- o11y/DynamicVariable
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesDynamicVariableSpec'
|
||||
@@ -3217,11 +3217,11 @@ components:
|
||||
- kind
|
||||
- spec
|
||||
type: object
|
||||
DashboardtypesVariablePluginVariantGithubComSigNozSignozPkgTypesDashboardtypesQueryVariableSpec:
|
||||
DashboardtypesVariablePluginVariantGithubComO11yO11yPkgTypesDashboardtypesQueryVariableSpec:
|
||||
properties:
|
||||
kind:
|
||||
enum:
|
||||
- signoz/QueryVariable
|
||||
- o11y/QueryVariable
|
||||
type: string
|
||||
spec:
|
||||
$ref: '#/components/schemas/DashboardtypesQueryVariableSpec'
|
||||
@@ -5095,7 +5095,7 @@ components:
|
||||
format: double
|
||||
type: number
|
||||
type: object
|
||||
Querybuildertypesv5ClickHouseQuery:
|
||||
Querybuildertypesv5DatastoreQuery:
|
||||
properties:
|
||||
disabled:
|
||||
type: boolean
|
||||
@@ -5344,7 +5344,7 @@ components:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5OrderBy'
|
||||
type: array
|
||||
type: object
|
||||
Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5LogAggregation:
|
||||
Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5LogAggregation:
|
||||
properties:
|
||||
aggregations:
|
||||
items:
|
||||
@@ -5395,7 +5395,7 @@ components:
|
||||
stepInterval:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5Step'
|
||||
type: object
|
||||
Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5MetricAggregation:
|
||||
Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5MetricAggregation:
|
||||
properties:
|
||||
aggregations:
|
||||
items:
|
||||
@@ -5446,7 +5446,7 @@ components:
|
||||
stepInterval:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5Step'
|
||||
type: object
|
||||
Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5TraceAggregation:
|
||||
Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5TraceAggregation:
|
||||
properties:
|
||||
aggregations:
|
||||
items:
|
||||
@@ -5561,7 +5561,7 @@ components:
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryEnvelopeFormula'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryEnvelopeTraceOperator'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryEnvelopePromQL'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryEnvelopeClickHouseSQL'
|
||||
- $ref: '#/components/schemas/Querybuildertypesv5QueryEnvelopeDatastoreSQL'
|
||||
properties:
|
||||
spec: {}
|
||||
type:
|
||||
@@ -5570,28 +5570,28 @@ components:
|
||||
Querybuildertypesv5QueryEnvelopeBuilderLog:
|
||||
properties:
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5LogAggregation'
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5LogAggregation'
|
||||
type:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryType'
|
||||
type: object
|
||||
Querybuildertypesv5QueryEnvelopeBuilderMetric:
|
||||
properties:
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5MetricAggregation'
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5MetricAggregation'
|
||||
type:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryType'
|
||||
type: object
|
||||
Querybuildertypesv5QueryEnvelopeBuilderTrace:
|
||||
properties:
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComSigNozSignozPkgTypesQuerybuildertypesQuerybuildertypesv5TraceAggregation'
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryBuilderQueryGithubComO11yO11yPkgTypesQuerybuildertypesQuerybuildertypesv5TraceAggregation'
|
||||
type:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryType'
|
||||
type: object
|
||||
Querybuildertypesv5QueryEnvelopeClickHouseSQL:
|
||||
Querybuildertypesv5QueryEnvelopeDatastoreSQL:
|
||||
properties:
|
||||
spec:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5ClickHouseQuery'
|
||||
$ref: '#/components/schemas/Querybuildertypesv5DatastoreQuery'
|
||||
type:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5QueryType'
|
||||
type: object
|
||||
@@ -5619,7 +5619,7 @@ components:
|
||||
Querybuildertypesv5QueryRangeRequest:
|
||||
description: Request body for the v5 query range endpoint. Supports builder
|
||||
queries (traces, logs, metrics), formulas, joins, trace operators, PromQL,
|
||||
and ClickHouse SQL queries.
|
||||
and Datastore SQL queries.
|
||||
properties:
|
||||
compositeQuery:
|
||||
$ref: '#/components/schemas/Querybuildertypesv5CompositeQuery'
|
||||
@@ -5661,7 +5661,7 @@ components:
|
||||
- builder_query
|
||||
- builder_formula
|
||||
- builder_trace_operator
|
||||
- clickhouse_sql
|
||||
- datastore_sql
|
||||
- promql
|
||||
type: string
|
||||
Querybuildertypesv5QueryWarnData:
|
||||
@@ -6186,7 +6186,7 @@ components:
|
||||
RuletypesQueryType:
|
||||
enum:
|
||||
- builder
|
||||
- clickhouse_sql
|
||||
- datastore_sql
|
||||
- promql
|
||||
type: string
|
||||
RuletypesRenotify:
|
||||
@@ -7296,9 +7296,9 @@ components:
|
||||
type: http
|
||||
info:
|
||||
contact:
|
||||
email: support@signoz.io
|
||||
name: SigNoz Support
|
||||
url: https://signoz.io
|
||||
email: support@o11y.io
|
||||
name: O11y Support
|
||||
url: https://o11y.io
|
||||
description: OpenTelemetry-Native Logs, Metrics and Traces in a single pane
|
||||
title: Hanzo O11y
|
||||
version: ""
|
||||
@@ -14690,7 +14690,7 @@ paths:
|
||||
/api/v2/metrics/onboarding:
|
||||
get:
|
||||
deprecated: false
|
||||
description: Lightweight endpoint that checks if any non-SigNoz metrics have
|
||||
description: Lightweight endpoint that checks if any non-O11y metrics have
|
||||
been ingested, used for onboarding status detection
|
||||
operationId: GetMetricsOnboardingStatus
|
||||
responses:
|
||||
@@ -14731,7 +14731,7 @@ paths:
|
||||
- VIEWER
|
||||
- tokenizer:
|
||||
- VIEWER
|
||||
summary: Check if non-SigNoz metrics have been received
|
||||
summary: Check if non-O11y metrics have been received
|
||||
tags:
|
||||
- metrics
|
||||
/api/v2/metrics/stats:
|
||||
@@ -15285,7 +15285,7 @@ paths:
|
||||
metric_anomaly:
|
||||
description: Anomaly rules are not yet supported under schemaVersion
|
||||
v2alpha1, so this example uses the v1 shape. Wraps a builder query
|
||||
in the `anomaly` function with daily seasonality SigNoz compares
|
||||
in the `anomaly` function with daily seasonality O11y compares
|
||||
each point against the forecast for that time of day. Fires when
|
||||
the anomaly score stays below the threshold for the entire window;
|
||||
`requireMinPoints` guards against noisy intervals.
|
||||
@@ -15850,7 +15850,7 @@ paths:
|
||||
traces_threshold_latency:
|
||||
description: Builder query against the traces signal with p99(duration_nano).
|
||||
The series unit is ns (compositeQuery.unit), the target is in seconds
|
||||
(threshold.targetUnit) SigNoz converts before comparing. Canonical
|
||||
(threshold.targetUnit) O11y converts before comparing. Canonical
|
||||
shape when series and target live in different units.
|
||||
summary: Traces threshold p99 latency (ns → s conversion)
|
||||
value:
|
||||
@@ -16234,7 +16234,7 @@ paths:
|
||||
metric_anomaly:
|
||||
description: Anomaly rules are not yet supported under schemaVersion
|
||||
v2alpha1, so this example uses the v1 shape. Wraps a builder query
|
||||
in the `anomaly` function with daily seasonality SigNoz compares
|
||||
in the `anomaly` function with daily seasonality O11y compares
|
||||
each point against the forecast for that time of day. Fires when
|
||||
the anomaly score stays below the threshold for the entire window;
|
||||
`requireMinPoints` guards against noisy intervals.
|
||||
@@ -16799,7 +16799,7 @@ paths:
|
||||
traces_threshold_latency:
|
||||
description: Builder query against the traces signal with p99(duration_nano).
|
||||
The series unit is ns (compositeQuery.unit), the target is in seconds
|
||||
(threshold.targetUnit) SigNoz converts before comparing. Canonical
|
||||
(threshold.targetUnit) O11y converts before comparing. Canonical
|
||||
shape when series and target live in different units.
|
||||
summary: Traces threshold p99 latency (ns → s conversion)
|
||||
value:
|
||||
@@ -17086,7 +17086,7 @@ paths:
|
||||
metric_anomaly:
|
||||
description: Anomaly rules are not yet supported under schemaVersion
|
||||
v2alpha1, so this example uses the v1 shape. Wraps a builder query
|
||||
in the `anomaly` function with daily seasonality SigNoz compares
|
||||
in the `anomaly` function with daily seasonality O11y compares
|
||||
each point against the forecast for that time of day. Fires when
|
||||
the anomaly score stays below the threshold for the entire window;
|
||||
`requireMinPoints` guards against noisy intervals.
|
||||
@@ -17651,7 +17651,7 @@ paths:
|
||||
traces_threshold_latency:
|
||||
description: Builder query against the traces signal with p99(duration_nano).
|
||||
The series unit is ns (compositeQuery.unit), the target is in seconds
|
||||
(threshold.targetUnit) SigNoz converts before comparing. Canonical
|
||||
(threshold.targetUnit) O11y converts before comparing. Canonical
|
||||
shape when series and target live in different units.
|
||||
summary: Traces threshold p99 latency (ns → s conversion)
|
||||
value:
|
||||
@@ -18441,7 +18441,7 @@ paths:
|
||||
metric_anomaly:
|
||||
description: Anomaly rules are not yet supported under schemaVersion
|
||||
v2alpha1, so this example uses the v1 shape. Wraps a builder query
|
||||
in the `anomaly` function with daily seasonality SigNoz compares
|
||||
in the `anomaly` function with daily seasonality O11y compares
|
||||
each point against the forecast for that time of day. Fires when
|
||||
the anomaly score stays below the threshold for the entire window;
|
||||
`requireMinPoints` guards against noisy intervals.
|
||||
@@ -19006,7 +19006,7 @@ paths:
|
||||
traces_threshold_latency:
|
||||
description: Builder query against the traces signal with p99(duration_nano).
|
||||
The series unit is ns (compositeQuery.unit), the target is in seconds
|
||||
(threshold.targetUnit) SigNoz converts before comparing. Canonical
|
||||
(threshold.targetUnit) O11y converts before comparing. Canonical
|
||||
shape when series and target live in different units.
|
||||
summary: Traces threshold p99 latency (ns → s conversion)
|
||||
value:
|
||||
@@ -20171,15 +20171,15 @@ paths:
|
||||
post:
|
||||
deprecated: false
|
||||
description: Execute a composite query over a time range. Supports builder queries
|
||||
(traces, logs, metrics), formulas, trace operators, PromQL, and ClickHouse
|
||||
(traces, logs, metrics), formulas, trace operators, PromQL, and Datastore
|
||||
SQL.
|
||||
operationId: QueryRangeV5
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
examples:
|
||||
clickhouse_sql_logs_raw:
|
||||
summary: 'ClickHouse SQL: raw logs with resource filter'
|
||||
datastore_sql_logs_raw:
|
||||
summary: 'Datastore SQL: raw logs with resource filter'
|
||||
value:
|
||||
compositeQuery:
|
||||
queries:
|
||||
@@ -20195,13 +20195,13 @@ paths:
|
||||
>= $start_timestamp - 1800 AND ts_bucket_start <= $end_timestamp
|
||||
AND severity_text = 'ERROR' ORDER BY timestamp DESC LIMIT
|
||||
100
|
||||
type: clickhouse_sql
|
||||
type: datastore_sql
|
||||
end: 1640998800000
|
||||
requestType: raw
|
||||
schemaVersion: v1
|
||||
start: 1640995200000
|
||||
clickhouse_sql_traces_scalar:
|
||||
summary: 'ClickHouse SQL: scalar aggregate with resource filter'
|
||||
datastore_sql_traces_scalar:
|
||||
summary: 'Datastore SQL: scalar aggregate with resource filter'
|
||||
value:
|
||||
compositeQuery:
|
||||
queries:
|
||||
@@ -20215,13 +20215,13 @@ paths:
|
||||
FROM __resource_filter) AND timestamp >= $start_datetime
|
||||
AND timestamp <= $end_datetime AND ts_bucket_start >= $start_timestamp
|
||||
- 1800 AND ts_bucket_start <= $end_timestamp
|
||||
type: clickhouse_sql
|
||||
type: datastore_sql
|
||||
end: 1640998800000
|
||||
requestType: scalar
|
||||
schemaVersion: v1
|
||||
start: 1640995200000
|
||||
clickhouse_sql_traces_time_series:
|
||||
summary: 'ClickHouse SQL: traces time series with resource filter'
|
||||
datastore_sql_traces_time_series:
|
||||
summary: 'Datastore SQL: traces time series with resource filter'
|
||||
value:
|
||||
compositeQuery:
|
||||
queries:
|
||||
@@ -20237,7 +20237,7 @@ paths:
|
||||
AND timestamp <= $end_datetime AND ts_bucket_start >= $start_timestamp
|
||||
- 1800 AND ts_bucket_start <= $end_timestamp GROUP BY ts
|
||||
ORDER BY ts
|
||||
type: clickhouse_sql
|
||||
type: datastore_sql
|
||||
end: 1640998800000
|
||||
requestType: time_series
|
||||
schemaVersion: v1
|
||||
@@ -20623,15 +20623,15 @@ paths:
|
||||
tags:
|
||||
- querier
|
||||
servers:
|
||||
- description: The fully qualified URL to the SigNoz APIServer.
|
||||
- description: The fully qualified URL to the O11y APIServer.
|
||||
url: https://{host}:{port}{base_path}
|
||||
variables:
|
||||
base_path:
|
||||
default: /
|
||||
description: The base path of the SigNoz APIServer
|
||||
description: The base path of the O11y APIServer
|
||||
host:
|
||||
default: localhost
|
||||
description: The host of the SigNoz APIServer
|
||||
description: The host of the O11y APIServer
|
||||
port:
|
||||
default: "8080"
|
||||
description: The port of the SigNoz APIServer
|
||||
description: The port of the O11y APIServer
|
||||
|
||||
@@ -1,48 +1,9 @@
|
||||
{
|
||||
"required": [
|
||||
"posthog",
|
||||
"appcues",
|
||||
"sentry",
|
||||
"pylon"
|
||||
"sentry"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"definitions": {
|
||||
"Appcues": {
|
||||
"required": [
|
||||
"enabled"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"Posthog": {
|
||||
"required": [
|
||||
"enabled"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"Pylon": {
|
||||
"required": [
|
||||
"enabled"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"Sentry": {
|
||||
"required": [
|
||||
"enabled"
|
||||
@@ -57,15 +18,6 @@
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"appcues": {
|
||||
"$ref": "#/definitions/Appcues"
|
||||
},
|
||||
"posthog": {
|
||||
"$ref": "#/definitions/Posthog"
|
||||
},
|
||||
"pylon": {
|
||||
"$ref": "#/definitions/Pylon"
|
||||
},
|
||||
"sentry": {
|
||||
"$ref": "#/definitions/Sentry"
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ Before diving in, make sure you have these tools installed:
|
||||
- **Pnpm** - Our frontend package manager
|
||||
- Follow the [installation guide](https://pnpm.io/installation)
|
||||
|
||||
- **Docker** - For running Clickhouse and Postgres locally
|
||||
- **Docker** - For running Datastore and Postgres locally
|
||||
- Get it from [docs.docker.com/get-docker](https://docs.docker.com/get-docker/)
|
||||
|
||||
> 💡 **Tip**: Run `make help` to see all available commands with descriptions
|
||||
@@ -30,27 +30,27 @@ Before diving in, make sure you have these tools installed:
|
||||
1. Open your terminal
|
||||
2. Clone the repository:
|
||||
```bash
|
||||
git clone https://github.com/Hanzo O11y/signoz.git
|
||||
git clone https://github.com/Hanzo O11y/o11y.git
|
||||
```
|
||||
3. Navigate to the project:
|
||||
```bash
|
||||
cd signoz
|
||||
cd o11y
|
||||
```
|
||||
|
||||
## How do I run it locally?
|
||||
|
||||
Hanzo O11y has three main components: Clickhouse, Backend, and Frontend. Let's set them up one by one.
|
||||
Hanzo O11y has three main components: Datastore, Backend, and Frontend. Let's set them up one by one.
|
||||
|
||||
### 1. Setting up ClickHouse
|
||||
### 1. Setting up Datastore
|
||||
|
||||
First, we need to get ClickHouse running:
|
||||
First, we need to get Datastore running:
|
||||
|
||||
```bash
|
||||
make devenv-clickhouse
|
||||
make devenv-datastore
|
||||
```
|
||||
|
||||
This command:
|
||||
- Starts ClickHouse in a single-shard, single-replica cluster
|
||||
- Starts Datastore in a single-shard, single-replica cluster
|
||||
- Sets up Zookeeper
|
||||
- Runs the latest schema migrations
|
||||
|
||||
@@ -59,15 +59,15 @@ This command:
|
||||
Next, start the OpenTelemetry Collector to receive telemetry data:
|
||||
|
||||
```bash
|
||||
make devenv-signoz-otel-collector
|
||||
make devenv-otel-collector
|
||||
```
|
||||
|
||||
This command:
|
||||
- Starts the Hanzo O11y OpenTelemetry Collector
|
||||
- Listens on port 4317 (gRPC) and 4318 (HTTP) for incoming telemetry data
|
||||
- Forwards data to ClickHouse for storage
|
||||
- Forwards data to Datastore for storage
|
||||
|
||||
> 💡 **Quick Setup**: Use `make devenv-up` to start both ClickHouse and OTel Collector together
|
||||
> 💡 **Quick Setup**: Use `make devenv-up` to start both Datastore and OTel Collector together
|
||||
|
||||
### 3. Starting the Backend
|
||||
|
||||
@@ -114,7 +114,7 @@ Now you're all set to start developing! Happy coding! 🎉
|
||||
## Verifying Your Setup
|
||||
To verify everything is working correctly:
|
||||
|
||||
1. **Check ClickHouse**: `curl http://localhost:8123/ping` (should return "Ok.")
|
||||
1. **Check Datastore**: `curl http://localhost:8123/ping` (should return "Ok.")
|
||||
2. **Check OTel Collector**: `curl http://localhost:13133` (should return health status)
|
||||
3. **Check Backend**: `curl http://localhost:8080/api/v1/health` (should return `{"status":"ok"}`)
|
||||
4. **Check Frontend**: Open `http://localhost:3301` in your browser
|
||||
|
||||
@@ -77,8 +77,8 @@ Use the `Flagger` interface to evaluate feature flags. The interface provides ty
|
||||
|
||||
```go
|
||||
import (
|
||||
"github.com/Hanzo O11y/signoz/pkg/flagger"
|
||||
"github.com/Hanzo O11y/signoz/pkg/types/featuretypes"
|
||||
"github.com/Hanzo O11y/o11y/pkg/flagger"
|
||||
"github.com/Hanzo O11y/o11y/pkg/types/featuretypes"
|
||||
)
|
||||
|
||||
func DoSomething(ctx context.Context, flagger flagger.Flagger) error {
|
||||
|
||||
@@ -21,7 +21,7 @@ Each route wraps a module handler method with the following:
|
||||
- A generic HTTP `handler.Handler` (from `pkg/http/handler`)
|
||||
- An `OpenAPIDef` that describes the operation for OpenAPI generation
|
||||
|
||||
For example, in `pkg/apiserver/signozapiserver`:
|
||||
For example, in `pkg/apiserver/o11yapiserver`:
|
||||
|
||||
```go
|
||||
if err := router.Handle("/api/v1/invite", handler.New(
|
||||
@@ -57,7 +57,7 @@ When adding a new endpoint:
|
||||
|
||||
1. Add a method to the appropriate module `Handler` interface.
|
||||
2. Implement that method in the module.
|
||||
3. Register the method in `signozapiserver` with the correct route, HTTP method, auth, and `OpenAPIDef`.
|
||||
3. Register the method in `o11yapiserver` with the correct route, HTTP method, auth, and `OpenAPIDef`.
|
||||
|
||||
### 1. Extend an existing `Handler` interface or create a new one
|
||||
|
||||
@@ -109,9 +109,9 @@ func (h *handler) CreateThing(rw http.ResponseWriter, req *http.Request) {
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Register the handler in `signozapiserver`
|
||||
### 3. Register the handler in `o11yapiserver`
|
||||
|
||||
In `pkg/apiserver/signozapiserver`, add a route in the appropriate `add*Routes` function (`addUserRoutes`, `addSessionRoutes`, `addOrgRoutes`, etc.). The pattern is:
|
||||
In `pkg/apiserver/o11yapiserver`, add a route in the appropriate `add*Routes` function (`addUserRoutes`, `addSessionRoutes`, `addOrgRoutes`, etc.). The pattern is:
|
||||
|
||||
```go
|
||||
if err := router.Handle("/api/v1/things", handler.New(
|
||||
@@ -193,7 +193,7 @@ type OpenAPIExample struct {
|
||||
}
|
||||
```
|
||||
|
||||
For reference, see `pkg/apiserver/signozapiserver/querier.go` which defines examples inline for the `/api/v5/query_range` endpoint:
|
||||
For reference, see `pkg/apiserver/o11yapiserver/querier.go` which defines examples inline for the `/api/v5/query_range` endpoint:
|
||||
|
||||
```go
|
||||
if err := router.Handle("/api/v5/query_range", handler.New(provider.authZ.ViewAccess(provider.querierHandler.QueryRange), handler.OpenAPIDef{
|
||||
@@ -337,9 +337,9 @@ func (Step) JSONSchema() (jsonschema.Schema, error) {
|
||||
## What should I remember?
|
||||
|
||||
- **Keep handlers thin**: focus on HTTP concerns and delegate logic to modules/services.
|
||||
- **Always register routes through `signozapiserver`** using `handler.New` and a complete `OpenAPIDef`.
|
||||
- **Always register routes through `o11yapiserver`** using `handler.New` and a complete `OpenAPIDef`.
|
||||
- **Choose accurate request/response types** from the `types` packages so OpenAPI schemas are correct.
|
||||
- **Add `required:"true"`** on fields where the key must be present in the JSON (this is about key presence, not about the zero value).
|
||||
- **Add `nullable:"true"`** on fields that can be `null`. Pay special attention to slices and maps -- in Go these default to `nil` which serializes to `null`. If the field should always be an array, initialize it and do not mark it nullable.
|
||||
- **Implement `Enum()`** on every type that has a fixed set of acceptable values so the JSON schema generates proper `enum` constraints.
|
||||
- **Add request examples** via `RequestExamples` in `OpenAPIDef` for any non-trivial endpoint. See `pkg/apiserver/signozapiserver/querier.go` for reference.
|
||||
- **Add request examples** via `RequestExamples` in `OpenAPIDef` for any non-trivial endpoint. See `pkg/apiserver/o11yapiserver/querier.go` for reference.
|
||||
|
||||
@@ -81,8 +81,8 @@ import (
|
||||
"github.com/gorilla/mux"
|
||||
|
||||
// 3. Internal
|
||||
"github.com/Hanzo O11y/signoz/pkg/errors"
|
||||
"github.com/Hanzo O11y/signoz/pkg/types"
|
||||
"github.com/Hanzo O11y/o11y/pkg/errors"
|
||||
"github.com/Hanzo O11y/o11y/pkg/types"
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
@@ -17,19 +17,19 @@ For example, the [prometheus](/pkg/prometheus) provider delivers a prometheus en
|
||||
|
||||
- `pkg/prometheus/prometheus.go` - Interface definition
|
||||
- `pkg/prometheus/config.go` - Configuration
|
||||
- `pkg/prometheus/clickhouseprometheus/provider.go` - Clickhouse-powered implementation
|
||||
- `pkg/prometheus/datastoreprometheus/provider.go` - Datastore-powered implementation
|
||||
- `pkg/prometheus/prometheustest/provider.go` - Mock implementation
|
||||
|
||||
## How to wire it up?
|
||||
|
||||
The `pkg/signoz` package contains the inversion of control container responsible for wiring providers. It handles instantiation, configuration, and assembly of providers based on configuration metadata.
|
||||
The `pkg/o11y` package contains the inversion of control container responsible for wiring providers. It handles instantiation, configuration, and assembly of providers based on configuration metadata.
|
||||
|
||||
> 💡 **Note**: Coming from a Java background? Providers are similar to Spring beans.
|
||||
|
||||
Wiring up a provider involves three steps:
|
||||
|
||||
1. Wiring up the configuration
|
||||
Add your config from `pkg/<name>/config.go` to the `pkg/signoz/config.Config` struct and in new factories:
|
||||
Add your config from `pkg/<name>/config.go` to the `pkg/o11y/config.Config` struct and in new factories:
|
||||
|
||||
```go
|
||||
type Config struct {
|
||||
@@ -48,7 +48,7 @@ func NewConfig(ctx context.Context, resolverConfig config.ResolverConfig, ....)
|
||||
```
|
||||
|
||||
2. Wiring up the provider
|
||||
Add available provider implementations in `pkg/signoz/provider.go`:
|
||||
Add available provider implementations in `pkg/o11y/provider.go`:
|
||||
|
||||
```go
|
||||
func NewMyProviderFactories() factory.NamedMap[factory.ProviderFactory[myprovider.MyProvider, myprovider.Config]] {
|
||||
@@ -59,7 +59,7 @@ func NewMyProviderFactories() factory.NamedMap[factory.ProviderFactory[myprovide
|
||||
}
|
||||
```
|
||||
|
||||
3. Instantiate the provider by adding it to the `Hanzo O11y` struct in `pkg/signoz/signoz.go`:
|
||||
3. Instantiate the provider by adding it to the `Hanzo O11y` struct in `pkg/o11y/o11y.go`:
|
||||
|
||||
```go
|
||||
type Hanzo O11y struct {
|
||||
@@ -83,7 +83,7 @@ func New(...) (*Hanzo O11y, error) {
|
||||
To use a provider, import its interface. For example, to use the prometheus provider, import `pkg/prometheus/prometheus.go`:
|
||||
|
||||
```go
|
||||
import "github.com/Hanzo O11y/signoz/pkg/prometheus/prometheus"
|
||||
import "github.com/Hanzo O11y/o11y/pkg/prometheus/prometheus"
|
||||
|
||||
func CreateSomething(ctx context.Context, prometheus prometheus.Prometheus) {
|
||||
...
|
||||
|
||||
@@ -221,7 +221,7 @@ The implementation (e.g. `pkg/tokenizer/opaquetokenizer/provider.go`) implements
|
||||
|
||||
## How to wire it up
|
||||
|
||||
Wiring happens in `pkg/signoz/signoz.go`.
|
||||
Wiring happens in `pkg/o11y/o11y.go`.
|
||||
|
||||
### 1. Instantiate the service
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Types
|
||||
|
||||
Domain types in `pkg/types/<domain>/` live on three serialization boundaries — inbound HTTP, outbound HTTP, and SQL — on top of an in-memory domain representation. SigNoz's convention is **core-type-first**: every domain defines a single canonical type `X`, and specialized flavors (`PostableX`, `GettableX`, `UpdatableX`, `StorableX`) are introduced **only when they actually differ from `X`**. This guide spells out when each flavor is warranted and how they relate to each other.
|
||||
Domain types in `pkg/types/<domain>/` live on three serialization boundaries — inbound HTTP, outbound HTTP, and SQL — on top of an in-memory domain representation. O11y's convention is **core-type-first**: every domain defines a single canonical type `X`, and specialized flavors (`PostableX`, `GettableX`, `UpdatableX`, `StorableX`) are introduced **only when they actually differ from `X`**. This guide spells out when each flavor is warranted and how they relate to each other.
|
||||
|
||||
Before reading, make sure you have read [abstractions.md](abstractions.md) — the rules here build on its guidance that every new type must earn its place.
|
||||
|
||||
|
||||
@@ -306,7 +306,7 @@ import ec2Url from '@/assets/Logos/ec2.svg';
|
||||
2. Add your data source object to the `onboardingConfigWithLinks` array, referencing the imported variable for `imgUrl`
|
||||
3. Test the flow locally with `pnpm dev`
|
||||
4. Validation:
|
||||
- Navigate to the [onboarding page](http://localhost:3301/get-started-with-signoz-cloud) on your local machine
|
||||
- Navigate to the [onboarding page](http://localhost:3301/get-started-with-o11y-cloud) on your local machine
|
||||
- Data source appears in the list
|
||||
- Search keywords work correctly
|
||||
- All links redirect to the correct pages
|
||||
|
||||
@@ -8,9 +8,9 @@ This document defines the design principles, invariants, and architectural contr
|
||||
|
||||
## Core Architectural Principle
|
||||
|
||||
**The user speaks OpenTelemetry. The storage speaks ClickHouse. The system translates between them. These two worlds must never leak into each other.**
|
||||
**The user speaks OpenTelemetry. The storage speaks Datastore. The system translates between them. These two worlds must never leak into each other.**
|
||||
|
||||
Every design choice in Query Range flows from this separation. The user-facing API surface deals exclusively in `TelemetryFieldKey`: a representation of fields as they exist in the OpenTelemetry data model. The storage layer deals in ClickHouse column expressions, table names, and SQL fragments. The translation between them is mediated by a small set of composable abstractions with strict boundaries.
|
||||
Every design choice in Query Range flows from this separation. The user-facing API surface deals exclusively in `TelemetryFieldKey`: a representation of fields as they exist in the OpenTelemetry data model. The storage layer deals in Datastore column expressions, table names, and SQL fragments. The translation between them is mediated by a small set of composable abstractions with strict boundaries.
|
||||
|
||||
---
|
||||
|
||||
@@ -60,16 +60,16 @@ The query pipeline is built from four interfaces that compose vertically. Each l
|
||||
StatementBuilder <- Orchestrates everything into executable SQL
|
||||
├── AggExprRewriter <- Rewrites aggregation expressions (maps field refs to columns)
|
||||
├── ConditionBuilder <- Builds WHERE predicates (field + operator + value -> SQL)
|
||||
└── FieldMapper <- Maps TelemetryFieldKey -> ClickHouse column expression
|
||||
└── FieldMapper <- Maps TelemetryFieldKey -> Datastore column expression
|
||||
```
|
||||
|
||||
### FieldMapper
|
||||
|
||||
**Contract:** Given a `TelemetryFieldKey`, return a ClickHouse column expression that yields the value for that field when used in a SELECT.
|
||||
**Contract:** Given a `TelemetryFieldKey`, return a Datastore column expression that yields the value for that field when used in a SELECT.
|
||||
|
||||
**Principle:** This is the *only* place where field-to-column translation happens. No other layer should contain knowledge of how fields map to storage. If you need a column expression, go through the FieldMapper.
|
||||
|
||||
**Why:** The user says `http.request.method`. ClickHouse might store it as `attributes_string['http.request.method']`, or as a materialized column `` `attribute_string_http$$request$$method` ``, or via a JSON access path in a body column. This variation is entirely contained within the FieldMapper. Everything above it is storage-agnostic.
|
||||
**Why:** The user says `http.request.method`. Datastore might store it as `attributes_string['http.request.method']`, or as a materialized column `` `attribute_string_http$$request$$method` ``, or via a JSON access path in a body column. This variation is entirely contained within the FieldMapper. Everything above it is storage-agnostic.
|
||||
|
||||
### ConditionBuilder
|
||||
|
||||
@@ -81,7 +81,7 @@ StatementBuilder <- Orchestrates everything into executable SQL
|
||||
|
||||
### AggExprRewriter
|
||||
|
||||
**Contract:** Given a user-facing aggregation expression like `sum(duration_nano)`, resolve field references within it and produce valid ClickHouse SQL.
|
||||
**Contract:** Given a user-facing aggregation expression like `sum(duration_nano)`, resolve field references within it and produce valid Datastore SQL.
|
||||
|
||||
**Dependency:** Uses FieldMapper to resolve field names within expressions.
|
||||
|
||||
@@ -103,11 +103,11 @@ The StatementBuilder must not call FieldMapper directly to build conditions, it
|
||||
|
||||
## Design Decisions as Constraints
|
||||
|
||||
### Constraint: Formula evaluation happens in Go, not in ClickHouse
|
||||
### Constraint: Formula evaluation happens in Go, not in Datastore
|
||||
|
||||
Formulas (`A + B`, `A / B`, `sqrt(A*A + B*B)`) are evaluated application-side by `FormulaEvaluator`, not via ClickHouse JOINs.
|
||||
Formulas (`A + B`, `A / B`, `sqrt(A*A + B*B)`) are evaluated application-side by `FormulaEvaluator`, not via Datastore JOINs.
|
||||
|
||||
**Why this is a constraint, not just an implementation choice:** The original JOIN-based approach was abandoned because ClickHouse evaluates joins right-to-left, serializing execution unnecessarily. Running queries independently allows parallelism and caching of intermediate results. Any future optimization must not reintroduce the JOIN pattern without solving the serialization problem.
|
||||
**Why this is a constraint, not just an implementation choice:** The original JOIN-based approach was abandoned because Datastore evaluates joins right-to-left, serializing execution unnecessarily. Running queries independently allows parallelism and caching of intermediate results. Any future optimization must not reintroduce the JOIN pattern without solving the serialization problem.
|
||||
|
||||
**Consequence:** Individual query results must be independently cacheable. Formula evaluation must handle label matching, timestamp alignment, and missing values without requiring the queries to coordinate at the SQL level.
|
||||
|
||||
@@ -130,7 +130,7 @@ Only additive/counting aggregations (`count`, `count_distinct`, `sum`, `rate`) d
|
||||
|
||||
### Constraint: Post-processing functions operate on result sets, not in SQL
|
||||
|
||||
Functions like `cutOffMin`, `ewma`, `median`, `timeShift`, `fillZero`, `runningDiff`, and `cumulativeSum` are applied in Go on the returned time series, not pushed into ClickHouse SQL.
|
||||
Functions like `cutOffMin`, `ewma`, `median`, `timeShift`, `fillZero`, `runningDiff`, and `cumulativeSum` are applied in Go on the returned time series, not pushed into Datastore SQL.
|
||||
|
||||
**Why:** These are sequential time-series transformations that require complete, ordered result sets. Pushing them into SQL would complicate query generation, prevent caching of raw results, and make the functions harder to test. They are applied via `ApplyFunctions` after query execution.
|
||||
|
||||
@@ -202,11 +202,11 @@ Fields inside JSON body columns (`body.response.errors[].code`) need pre-compute
|
||||
|
||||
## Summary of Inviolable Rules
|
||||
|
||||
1. **User-facing types never contain ClickHouse column names or SQL fragments.**
|
||||
1. **User-facing types never contain Datastore column names or SQL fragments.**
|
||||
2. **Field-to-column translation only happens in FieldMapper.**
|
||||
3. **Normalization happens once at the API boundary, never deeper.**
|
||||
4. **Historical aliases in fieldContexts and fieldDataTypes must not be removed.**
|
||||
5. **Formula evaluation stays in Go — do not push it into ClickHouse JOINs.**
|
||||
5. **Formula evaluation stays in Go — do not push it into Datastore JOINs.**
|
||||
6. **Zero-defaulting is aggregation-type-dependent — do not universally default to zero.**
|
||||
7. **Positive operators imply existence, negative operators do not.**
|
||||
8. **Post-processing functions operate on Go result sets, not in SQL.**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# E2E Tests
|
||||
|
||||
SigNoz uses end-to-end tests to verify the frontend works correctly against a real backend. These tests use Playwright to drive a real browser against a containerized SigNoz stack that pytest brings up — the same fixture graph integration tests use, with an extra HTTP seeder container for per-spec telemetry seeding.
|
||||
O11y uses end-to-end tests to verify the frontend works correctly against a real backend. These tests use Playwright to drive a real browser against a containerized O11y stack that pytest brings up — the same fixture graph integration tests use, with an extra HTTP seeder container for per-spec telemetry seeding.
|
||||
|
||||
## How to set up the E2E test environment?
|
||||
|
||||
@@ -30,7 +30,7 @@ yarn install:browsers # one-time Playwright browser install
|
||||
|
||||
### Starting the Test Environment
|
||||
|
||||
To spin up the backend stack (SigNoz, ClickHouse, Postgres, Zookeeper, Zeus mock, gateway mock, seeder, migrator-with-web) and keep it running:
|
||||
To spin up the backend stack (O11y, Datastore, Postgres, Zookeeper, Zeus mock, gateway mock, seeder, migrator-with-web) and keep it running:
|
||||
|
||||
```bash
|
||||
cd tests
|
||||
@@ -46,7 +46,7 @@ This command will:
|
||||
- Write backend coordinates to `tests/e2e/.env.local` (loaded by `playwright.config.ts` via dotenv)
|
||||
- Keep containers running via the `--reuse` flag
|
||||
|
||||
The `--with-web` flag builds the frontend into the SigNoz container — required for E2E. The build takes ~4 mins on a cold start.
|
||||
The `--with-web` flag builds the frontend into the O11y container — required for E2E. The build takes ~4 mins on a cold start.
|
||||
|
||||
### Stopping the Test Environment
|
||||
|
||||
@@ -60,11 +60,11 @@ uv run pytest --basetemp=./tmp/ -vv --teardown \
|
||||
|
||||
## Understanding the E2E Test Framework
|
||||
|
||||
Playwright drives a real browser (Chromium / Firefox / WebKit) against the running SigNoz frontend. The backend is brought up by the same pytest fixture graph integration tests use, so both suites share one source of truth for container lifecycle, license seeding, and test-user accounts.
|
||||
Playwright drives a real browser (Chromium / Firefox / WebKit) against the running O11y frontend. The backend is brought up by the same pytest fixture graph integration tests use, so both suites share one source of truth for container lifecycle, license seeding, and test-user accounts.
|
||||
|
||||
- **Why Playwright?** First-class TypeScript support, network interception, automatic wait-for-visibility, built-in trace viewer that captures every request/response the UI triggers — so specs rarely need separate API probes alongside UI clicks.
|
||||
- **Why pytest for lifecycle?** The integration suite already owns container bring-up. Reusing it keeps the E2E stack exactly in sync with the integration stack and avoids a parallel lifecycle framework.
|
||||
- **Why a separate seeder container?** Per-spec telemetry seeding (traces / logs / metrics) needs a thin HTTP wrapper around the ClickHouse insert helpers so a browser spec can POST from inside the test. The seeder lives at `tests/seeder/`, is built from `tests/Dockerfile.seeder`, and reuses the same `fixtures/{traces,logs,metrics}.py` as integration tests.
|
||||
- **Why a separate seeder container?** Per-spec telemetry seeding (traces / logs / metrics) needs a thin HTTP wrapper around the Datastore insert helpers so a browser spec can POST from inside the test. The seeder lives at `tests/seeder/`, is built from `tests/Dockerfile.seeder`, and reuses the same `fixtures/{traces,logs,metrics}.py` as integration tests.
|
||||
|
||||
```
|
||||
tests/
|
||||
@@ -246,11 +246,11 @@ yarn report # open the last HTML report (artifacts/html)
|
||||
|
||||
### Staging fallback
|
||||
|
||||
Point `SIGNOZ_E2E_BASE_URL` at a remote env via `.env` — no local backend bring-up, no `.env.local` generated, Playwright hits the URL directly:
|
||||
Point `O11Y_E2E_BASE_URL` at a remote env via `.env` — no local backend bring-up, no `.env.local` generated, Playwright hits the URL directly:
|
||||
|
||||
```bash
|
||||
cd tests/e2e
|
||||
cp .env.example .env # fill SIGNOZ_E2E_USERNAME / PASSWORD
|
||||
cp .env.example .env # fill O11Y_E2E_USERNAME / PASSWORD
|
||||
yarn test:staging
|
||||
```
|
||||
|
||||
@@ -260,10 +260,10 @@ yarn test:staging
|
||||
|
||||
| Variable | Description |
|
||||
|---|---|
|
||||
| `SIGNOZ_E2E_BASE_URL` | Base URL the browser targets. Written by `bootstrap/setup.py` for local mode; set manually for staging. |
|
||||
| `SIGNOZ_E2E_USERNAME` | Admin email. Bootstrap writes `admin@integration.test`. |
|
||||
| `SIGNOZ_E2E_PASSWORD` | Admin password. Bootstrap writes the integration-test default. |
|
||||
| `SIGNOZ_E2E_SEEDER_URL` | Seeder HTTP base URL — hit by specs that need per-test telemetry. |
|
||||
| `O11Y_E2E_BASE_URL` | Base URL the browser targets. Written by `bootstrap/setup.py` for local mode; set manually for staging. |
|
||||
| `O11Y_E2E_USERNAME` | Admin email. Bootstrap writes `admin@integration.test`. |
|
||||
| `O11Y_E2E_PASSWORD` | Admin password. Bootstrap writes the integration-test default. |
|
||||
| `O11Y_E2E_SEEDER_URL` | Seeder HTTP base URL — hit by specs that need per-test telemetry. |
|
||||
|
||||
Loading order in `playwright.config.ts`: `.env` first (user-provided, staging), then `.env.local` with `override: true` (bootstrap-generated, local mode). Anything already set in `process.env` at yarn-test time wins because dotenv doesn't touch vars that are already present.
|
||||
|
||||
@@ -282,8 +282,8 @@ The same pytest flags integration tests expose work here, since E2E reuses the s
|
||||
|
||||
- `--reuse` — keep containers warm between runs (required for all iteration).
|
||||
- `--teardown` — tear everything down.
|
||||
- `--with-web` — build the frontend into the SigNoz container. **Required for E2E**; integration tests don't need it.
|
||||
- `--sqlstore-provider`, `--postgres-version`, `--clickhouse-version`, etc. — see `docs/contributing/integration.md`.
|
||||
- `--with-web` — build the frontend into the O11y container. **Required for E2E**; integration tests don't need it.
|
||||
- `--sqlstore-provider`, `--postgres-version`, `--datastore-version`, etc. — see `docs/contributing/integration.md`.
|
||||
|
||||
## What should I remember?
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Integration Tests
|
||||
|
||||
SigNoz uses integration tests to verify that different components work together correctly in a real environment. These tests run against actual services (ClickHouse, PostgreSQL, SigNoz, Zeus mock, Keycloak, etc.) spun up as containers, so suites exercise the same code paths production does.
|
||||
O11y uses integration tests to verify that different components work together correctly in a real environment. These tests run against actual services (Datastore, PostgreSQL, O11y, Zeus mock, Keycloak, etc.) spun up as containers, so suites exercise the same code paths production does.
|
||||
|
||||
## How to set up the integration test environment?
|
||||
|
||||
@@ -41,7 +41,7 @@ uv run pytest --basetemp=./tmp/ -vv --reuse integration/bootstrap/setup.py::test
|
||||
```
|
||||
|
||||
This command will:
|
||||
- Start all required services (ClickHouse, PostgreSQL, Zookeeper, SigNoz, Zeus mock, gateway mock)
|
||||
- Start all required services (Datastore, PostgreSQL, Zookeeper, O11y, Zeus mock, gateway mock)
|
||||
- Register an admin user
|
||||
- Keep containers running via the `--reuse` flag
|
||||
|
||||
@@ -77,11 +77,11 @@ tests/
|
||||
├── fixtures/ # shared fixture library (flat package)
|
||||
│ ├── __init__.py
|
||||
│ ├── auth.py # admin/editor/viewer users, tokens, license
|
||||
│ ├── clickhouse.py
|
||||
│ ├── datastore.py
|
||||
│ ├── http.py # WireMock helpers
|
||||
│ ├── keycloak.py # IdP container
|
||||
│ ├── postgres.py
|
||||
│ ├── signoz.py # SigNoz-backend container
|
||||
│ ├── o11y.py # O11y-backend container
|
||||
│ ├── sql.py
|
||||
│ ├── types.py
|
||||
│ └── ... # logs, metrics, traces, alerts, dashboards, ...
|
||||
@@ -110,7 +110,7 @@ Each test suite follows these principles:
|
||||
|
||||
### Test Suite Design
|
||||
|
||||
Test suites should target functional domains or subsystems within SigNoz. When designing a test suite, consider these principles:
|
||||
Test suites should target functional domains or subsystems within O11y. When designing a test suite, consider these principles:
|
||||
|
||||
- **Functional Cohesion**: Group tests around a specific capability or service boundary
|
||||
- **Data Flow**: Follow the path of data through related components
|
||||
@@ -131,15 +131,15 @@ from fixtures.logger import setup_logger
|
||||
logger = setup_logger(__name__)
|
||||
|
||||
|
||||
def test_version(signoz: types.SigNoz) -> None:
|
||||
def test_version(o11y: types.O11y) -> None:
|
||||
response = requests.get(
|
||||
signoz.self.host_configs["8080"].get("/api/v1/version"),
|
||||
o11y.self.host_configs["8080"].get("/api/v1/version"),
|
||||
timeout=2,
|
||||
)
|
||||
logger.info(response)
|
||||
```
|
||||
|
||||
We have written a simple test which calls the `version` endpoint of the SigNoz backend. **To run just this function, run the following command:**
|
||||
We have written a simple test which calls the `version` endpoint of the O11y backend. **To run just this function, run the following command:**
|
||||
|
||||
```bash
|
||||
cd tests
|
||||
@@ -160,10 +160,10 @@ from fixtures.logger import setup_logger
|
||||
logger = setup_logger(__name__)
|
||||
|
||||
|
||||
def test_user_registration(signoz: types.SigNoz) -> None:
|
||||
def test_user_registration(o11y: types.O11y) -> None:
|
||||
"""Test user registration functionality."""
|
||||
response = requests.post(
|
||||
signoz.self.host_configs["8080"].get("/api/v1/register"),
|
||||
o11y.self.host_configs["8080"].get("/api/v1/register"),
|
||||
json={
|
||||
"name": "testuser",
|
||||
"orgId": "",
|
||||
@@ -224,9 +224,9 @@ Tests can be configured using pytest options:
|
||||
- `--sqlstore-provider` — Choose the SQL store provider (default: `postgres`)
|
||||
- `--sqlite-mode` — SQLite journal mode: `delete` or `wal` (default: `delete`). Only relevant when `--sqlstore-provider=sqlite`.
|
||||
- `--postgres-version` — PostgreSQL version (default: `15`)
|
||||
- `--clickhouse-version` — ClickHouse version (default: `25.5.6`)
|
||||
- `--datastore-version` — Datastore version (default: `25.5.6`)
|
||||
- `--zookeeper-version` — Zookeeper version (default: `3.7.1`)
|
||||
- `--schema-migrator-version` — SigNoz schema migrator version (default: `v0.144.2`)
|
||||
- `--schema-migrator-version` — O11y schema migrator version (default: `v0.144.2`)
|
||||
|
||||
Example:
|
||||
|
||||
@@ -243,9 +243,9 @@ uv run pytest --basetemp=./tmp/ -vv --reuse \
|
||||
- **Do not pre-emptively teardown before setup.** If the stack is partially up, `--reuse` picks up from wherever it is. `make py-test-teardown` then `make py-test-setup` wastes minutes.
|
||||
- **Follow the naming convention** with two-digit numeric prefixes (`01_`, `02_`) for ordered test execution within a suite.
|
||||
- **Use proper timeouts** in HTTP requests to avoid hanging tests (`timeout=5` is typical).
|
||||
- **Clean up test data** between tests in the same suite to avoid interference — or rely on a fresh SigNoz container if you need full isolation.
|
||||
- **Clean up test data** between tests in the same suite to avoid interference — or rely on a fresh O11y container if you need full isolation.
|
||||
- **Use descriptive test names** that clearly indicate what is being tested.
|
||||
- **Leverage fixtures** for common setup. The shared fixture package is at `tests/fixtures/` — reuse before adding new ones.
|
||||
- **Test both success and failure scenarios** (4xx / 5xx paths) to ensure robust functionality.
|
||||
- **Run `make py-fmt` and `make py-lint` before committing** Python changes — black + isort + autoflake + pylint.
|
||||
- **`--sqlite-mode=wal` does not work on macOS.** The integration test environment runs SigNoz inside a Linux container with the SQLite database file mounted from the macOS host. WAL mode requires shared memory between connections, and connections crossing the VM boundary (macOS host ↔ Linux container) cannot share the WAL index, resulting in `SQLITE_IOERR_SHORT_READ`. WAL mode is tested in CI on Linux only.
|
||||
- **`--sqlite-mode=wal` does not work on macOS.** The integration test environment runs O11y inside a Linux container with the SQLite database file mounted from the macOS host. WAL mode requires shared memory between connections, and connections crossing the VM boundary (macOS host ↔ Linux container) cannot share the WAL index, resulting in `SQLITE_IOERR_SHORT_READ`. WAL mode is tested in CI on Linux only.
|
||||
|
||||
+11
-11
@@ -6,17 +6,17 @@ This guide provides a step-by-step walkthrough for setting up the **OpenTelemetr
|
||||
<br/>
|
||||
|
||||
__Table of Contents__
|
||||
- [Send data to Hanzo O11y Self-hosted with Docker](#send-data-to-signoz-self-hosted-with-docker)
|
||||
- [Send data to Hanzo O11y Self-hosted with Docker](#send-data-to-o11y-self-hosted-with-docker)
|
||||
- [Prerequisites](#prerequisites)
|
||||
- [Clone the OpenTelemetry Demo App Repository](#clone-the-opentelemetry-demo-app-repository)
|
||||
- [Modify OpenTelemetry Collector Config](#modify-opentelemetry-collector-config)
|
||||
- [Start the OpenTelemetry Demo App](#start-the-opentelemetry-demo-app)
|
||||
- [Monitor with Hanzo O11y (Docker)](#monitor-with-signoz-docker)
|
||||
- [Send data to Hanzo O11y Self-hosted with Kubernetes](#send-data-to-signoz-self-hosted-with-kubernetes)
|
||||
- [Monitor with Hanzo O11y (Docker)](#monitor-with-o11y-docker)
|
||||
- [Send data to Hanzo O11y Self-hosted with Kubernetes](#send-data-to-o11y-self-hosted-with-kubernetes)
|
||||
- [Prerequisites](#prerequisites-1)
|
||||
- [Install Helm Repo and Charts](#install-helm-repo-and-charts)
|
||||
- [Start the OpenTelemetry Demo App](#start-the-opentelemetry-demo-app-1)
|
||||
- [Monitor with Hanzo O11y (Kubernetes)](#monitor-with-signoz-kubernetes)
|
||||
- [Monitor with Hanzo O11y (Kubernetes)](#monitor-with-o11y-kubernetes)
|
||||
- [What's next](#whats-next)
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ service:
|
||||
exporters: [otlp]
|
||||
```
|
||||
|
||||
The Hanzo O11y OTel collector [sigNoz's otel-collector service] listens at 4317 port on localhost. When the OTel demo app is running within a Docker container and needs to transmit telemetry data to Hanzo O11y, it cannot directly reference 'localhost' as this would refer to the container's own internal network. Instead, Docker provides a special DNS name, `host.docker.internal`, which resolves to the host machine's IP address from within containers. By configuring the OpenTelemetry Demo application to send data to `host.docker.internal:4317`, we establish a network path that allows the containerized application to transmit telemetry data across the container boundary to the Hanzo O11y OTel collector running on the host machine's port 4317.
|
||||
The Hanzo O11y OTel collector [o11y's otel-collector service] listens at 4317 port on localhost. When the OTel demo app is running within a Docker container and needs to transmit telemetry data to Hanzo O11y, it cannot directly reference 'localhost' as this would refer to the container's own internal network. Instead, Docker provides a special DNS name, `host.docker.internal`, which resolves to the host machine's IP address from within containers. By configuring the OpenTelemetry Demo application to send data to `host.docker.internal:4317`, we establish a network path that allows the containerized application to transmit telemetry data across the container boundary to the Hanzo O11y OTel collector running on the host machine's port 4317.
|
||||
|
||||
>
|
||||
> Note: When merging extra configuration values with the existing collector config (`src/otel-collector/otelcol-config.yml`), objects are merged and arrays are replaced resulting in previous pipeline configurations getting overridden.
|
||||
@@ -83,7 +83,7 @@ exporters:
|
||||
tls:
|
||||
insecure: false
|
||||
headers:
|
||||
signoz-access-token: <SIGNOZ-KEY>
|
||||
o11y-access-token: <O11Y-KEY>
|
||||
debug:
|
||||
verbosity: detailed
|
||||
|
||||
@@ -128,7 +128,7 @@ The result should look similar to this,
|
||||
Navigate to `http://localhost:8081/` where you can access OTel demo app UI. Generate some traffic to send to Hanzo O11y [Docker].
|
||||
|
||||
## Monitor with Hanzo O11y [Docker]
|
||||
Signoz exposes its UI at `http://localhost:8080/`. You should be able to see multiple services listed down as shown in the snapshot below.
|
||||
O11y exposes its UI at `http://localhost:8080/`. You should be able to see multiple services listed down as shown in the snapshot below.
|
||||
|
||||
|
||||

|
||||
@@ -173,7 +173,7 @@ default:
|
||||
- name: OTEL_RESOURCE_ATTRIBUTES
|
||||
value: 'service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo'
|
||||
- name: OTEL_COLLECTOR_NAME
|
||||
value: signoz-otel-collector.<namespace>.svc.cluster.local
|
||||
value: otel-collector.<namespace>.svc.cluster.local
|
||||
```
|
||||
Replace namespace with your appropriate namespace. This file will replace the chart’s existing settings with our new ones, ensuring telemetry data is sent to Hanzo O11y [Kubernetes].
|
||||
|
||||
@@ -193,7 +193,7 @@ opentelemetry-collector:
|
||||
tls:
|
||||
insecure: false
|
||||
headers:
|
||||
signoz-access-token: <SIGNOZ-KEY>
|
||||
o11y-access-token: <O11Y-KEY>
|
||||
debug:
|
||||
verbosity: detailed
|
||||
service:
|
||||
@@ -238,7 +238,7 @@ Navigate to `http://localhost:8081/` where you can access OTel demo app UI. Gene
|
||||
|
||||
|
||||
## Monitor with Hanzo O11y [Kubernetes]
|
||||
Signoz exposes it's UI at `http://localhost:8080/`. You should be able to see multiple services listed down as shown in the snapshot below.
|
||||
O11y exposes it's UI at `http://localhost:8080/`. You should be able to see multiple services listed down as shown in the snapshot below.
|
||||
|
||||
|
||||

|
||||
@@ -253,4 +253,4 @@ This verifies that your OTel demo app is successfully sending telemetry data to
|
||||
|
||||
Don't forget to check our OpenTelemetry [track](https://o11y.hanzo.ai/resource-center/opentelemetry/), guaranteed to take you from a newbie to sensei in no time!
|
||||
|
||||
Also from a fellow OTel fan to another, we at [Hanzo O11y](https://o11y.hanzo.ai/) are building an open-source, OTel native, observability platform (one of its kind). So, show us love - star us on [GitHub](https://github.com/Hanzo O11y/signoz), nitpick our [docs](https://o11y.hanzo.ai/docs/introduction/), or just tell your app we’re the ones who’ll catch its crashes mid-flight and finally shush all the 3am panic calls!
|
||||
Also from a fellow OTel fan to another, we at [Hanzo O11y](https://o11y.hanzo.ai/) are building an open-source, OTel native, observability platform (one of its kind). So, show us love - star us on [GitHub](https://github.com/Hanzo O11y/o11y), nitpick our [docs](https://o11y.hanzo.ai/docs/introduction/), or just tell your app we’re the ones who’ll catch its crashes mid-flight and finally shush all the 3am panic calls!
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
description: Prefer SigNoz UI and icons across frontend code
|
||||
description: Prefer O11y UI and icons across frontend code
|
||||
globs: **/*.{ts,tsx,js,jsx}
|
||||
alwaysApply: true
|
||||
---
|
||||
@@ -16,4 +16,4 @@ For all frontend implementation work in this repository:
|
||||
## Migration guidance
|
||||
|
||||
- If touching a file that already uses non-`components/ui/icons` icons, prefer migrating that file to `components/ui/icons` as part of the same change when practical.
|
||||
- If a required component or icon is missing from SigNoz packages, call this out explicitly in the PR/summary before introducing alternatives.
|
||||
- If a required component or icon is missing from O11y packages, call this out explicitly in the PR/summary before introducing alternatives.
|
||||
|
||||
+10
-10
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
||||
"jsPlugins": [
|
||||
"./plugins/signoz.mjs",
|
||||
"./plugins/o11y.mjs",
|
||||
"eslint-plugin-sonarjs"
|
||||
],
|
||||
"plugins": [
|
||||
@@ -279,15 +279,15 @@
|
||||
// "react-hooks/unsupported-syntax": "warn",
|
||||
// "react-hooks/use-memo": "error",
|
||||
// "react-hooks/incompatible-library": "warn",
|
||||
"signoz/no-unsupported-asset-pattern": "error",
|
||||
"o11y/no-unsupported-asset-pattern": "error",
|
||||
// Prevents the wrong usage of assets to break custom base path installations
|
||||
"signoz/no-zustand-getstate-in-hooks": "error",
|
||||
"o11y/no-zustand-getstate-in-hooks": "error",
|
||||
// Prevents useStore.getState() - export standalone actions instead
|
||||
"signoz/no-navigator-clipboard": "error",
|
||||
"o11y/no-navigator-clipboard": "error",
|
||||
// Prevents navigator.clipboard - use useCopyToClipboard hook instead (disabled in tests via override)
|
||||
"signoz/no-raw-absolute-path": "error",
|
||||
"o11y/no-raw-absolute-path": "error",
|
||||
// Prevents window.open(path), window.location.origin + path, window.location.href = path
|
||||
"signoz/no-antd-components": "error",
|
||||
"o11y/no-antd-components": "error",
|
||||
// Prevents the usage of specific antd components in favor of our lib
|
||||
"no-restricted-globals": [
|
||||
"error",
|
||||
@@ -529,12 +529,12 @@
|
||||
"rules": {
|
||||
"import/first": "off",
|
||||
// Should ignore due to mocks
|
||||
"signoz/no-navigator-clipboard": "off",
|
||||
"o11y/no-navigator-clipboard": "off",
|
||||
// Tests can use navigator.clipboard directly,
|
||||
"signoz/no-raw-absolute-path":"off",
|
||||
"o11y/no-raw-absolute-path":"off",
|
||||
"no-restricted-globals": "off",
|
||||
// Tests need raw localStorage/sessionStorage to seed DOM state for isolation
|
||||
"signoz/no-zustand-getstate-in-hooks": "off",
|
||||
"o11y/no-zustand-getstate-in-hooks": "off",
|
||||
"@typescript-eslint/no-explicit-any": "off", // Tests often need any for mocks/stubs
|
||||
"@typescript-eslint/explicit-module-boundary-types": "off", // Return types not required in tests
|
||||
"@typescript-eslint/explicit-function-return-type": "off" // Same as above rule, don't need to care about return type
|
||||
@@ -547,7 +547,7 @@
|
||||
"**/*Store.tsx"
|
||||
],
|
||||
"rules": {
|
||||
"signoz/no-zustand-getstate-in-hooks": "off"
|
||||
"o11y/no-zustand-getstate-in-hooks": "off"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { PropsWithChildren } from 'react';
|
||||
import { PropsWithChildren, type JSX } from 'react';
|
||||
|
||||
type CommonProps = PropsWithChildren<{
|
||||
className?: string;
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
NODE_ENV="development"
|
||||
BUNDLE_ANALYSER="true"
|
||||
VITE_FRONTEND_API_ENDPOINT="http://localhost:8080"
|
||||
VITE_PYLON_APP_ID="pylon-app-id"
|
||||
VITE_APPCUES_APP_ID="appcess-app-id"
|
||||
VITE_PYLON_IDENTITY_SECRET="pylon-identity-secret"
|
||||
|
||||
CI="1"
|
||||
|
||||
+13
-63
@@ -10,10 +10,6 @@
|
||||
<meta http-equiv="Pragma" content="no-cache" />
|
||||
<meta http-equiv="Expires" content="0" />
|
||||
|
||||
<link rel="preconnect" href="https://cdn.vercel.com" crossorigin />
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/geist@1.3.1/dist/fonts/geist-sans/style.css" />
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/geist@1.3.1/dist/fonts/geist-mono/style.css" />
|
||||
|
||||
<title data-react-helmet="true">
|
||||
Hanzo O11y
|
||||
</title>
|
||||
@@ -63,7 +59,7 @@
|
||||
// Mirrors the logic in ThemeProvider (hooks/useDarkMode/index.tsx).
|
||||
(function () {
|
||||
try {
|
||||
// When served under a URL prefix (e.g. /signoz/), storage keys are scoped
|
||||
// When served under a URL prefix (e.g. /o11y/), storage keys are scoped
|
||||
// to that prefix by the React app (see utils/storage.ts getScopedKey).
|
||||
// Read the <base> tag — already populated by the Go template — to derive
|
||||
// the same prefix here, before any JS module has loaded.
|
||||
@@ -89,76 +85,30 @@
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<script type="application/json" id="signoz-boot-settings">
|
||||
<script type="application/json" id="o11y-boot-settings">
|
||||
[[.Settings]]
|
||||
</script>
|
||||
<script>
|
||||
try {
|
||||
var _el = document.getElementById('signoz-boot-settings');
|
||||
window.signozBootData = {
|
||||
var _el = document.getElementById('o11y-boot-settings');
|
||||
window.o11yBootData = {
|
||||
settings: _el ? JSON.parse(_el.textContent) : null,
|
||||
};
|
||||
} catch (e) {
|
||||
window.signozBootData = { settings: null };
|
||||
window.o11yBootData = { settings: null };
|
||||
}
|
||||
</script>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
|
||||
<script>
|
||||
var PYLON_APP_ID = '<%- PYLON_APP_ID %>';
|
||||
var pylonSettings =
|
||||
((window.signozBootData || {}).settings || {}).pylon || {};
|
||||
var pylonEnabled = pylonSettings.enabled !== false;
|
||||
if (PYLON_APP_ID && pylonEnabled) {
|
||||
(function () {
|
||||
var e = window;
|
||||
var t = document;
|
||||
var n = function () {
|
||||
n.e(arguments);
|
||||
};
|
||||
n.q = [];
|
||||
n.e = function (e) {
|
||||
n.q.push(e);
|
||||
};
|
||||
e.Pylon = n;
|
||||
var r = function () {
|
||||
var e = t.createElement('script');
|
||||
e.setAttribute('type', 'text/javascript');
|
||||
e.setAttribute('async', 'true');
|
||||
e.setAttribute(
|
||||
'src',
|
||||
'https://widget.usepylon.com/widget/' + PYLON_APP_ID,
|
||||
);
|
||||
var n = t.getElementsByTagName('script')[0];
|
||||
n.parentNode.insertBefore(e, n);
|
||||
};
|
||||
if (t.readyState === 'complete') {
|
||||
r();
|
||||
} else if (e.addEventListener) {
|
||||
e.addEventListener('load', r, false);
|
||||
}
|
||||
})();
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
window.AppcuesSettings = { enableURLDetection: true };
|
||||
</script>
|
||||
<script>
|
||||
var APPCUES_APP_ID = '<%- APPCUES_APP_ID %>';
|
||||
var appcuesSettings =
|
||||
((window.signozBootData || {}).settings || {}).appcues || {};
|
||||
var appcuesEnabled = appcuesSettings.enabled !== false;
|
||||
if (APPCUES_APP_ID && appcuesEnabled) {
|
||||
(function (d, t) {
|
||||
var a = d.createElement(t);
|
||||
a.async = 1;
|
||||
a.src = '//fast.appcues.com/' + APPCUES_APP_ID + '.js';
|
||||
var s = d.getElementsByTagName(t)[0];
|
||||
s.parentNode.insertBefore(a, s);
|
||||
})(document, 'script');
|
||||
}
|
||||
</script>
|
||||
<!--
|
||||
NO third-party widgets or trackers are loaded here, and none may be
|
||||
added. The upstream fork injected a support-chat widget and an
|
||||
onboarding tracker, both enabled by default — a self-hosted
|
||||
observability tool must never make outbound calls to third parties
|
||||
with our users' data. Support chat is Hanzo Chat (utils/supportChat);
|
||||
analytics is Hanzo Insights. Sentry is opt-in, on our own fork.
|
||||
-->
|
||||
<link rel="stylesheet" href="css/uPlot.min.css" />
|
||||
<script type="module" src="./src/index.tsx"></script>
|
||||
</body>
|
||||
|
||||
@@ -44,7 +44,10 @@ const config: Config.InitialOptions = {
|
||||
'^.+\\.(js|jsx)$': 'babel-jest',
|
||||
},
|
||||
transformIgnorePatterns: [
|
||||
'node_modules/(?!(lodash-es|react-dnd|core-dnd|@react-dnd|dnd-core|react-dnd-html5-backend|axios|@o11yhq/design-tokens|@o11yhq/table|@o11yhq/calendar|@o11yhq/input|@o11yhq/popover|@o11yhq/button|@o11yhq/sonner|@o11yhq/*|date-fns|d3-interpolate|d3-color|api|@codemirror|@lezer|@marijn|@grafana|nuqs)/)',
|
||||
// pnpm's real path is node_modules/.pnpm/<pkg>@<ver>/node_modules/<pkg>/…,
|
||||
// so skip the .pnpm indirection segment and let the allowlist below judge
|
||||
// the inner node_modules/<pkg>/, which is identical in either layout.
|
||||
'node_modules/(?!\\.pnpm/|(lodash-es|react-dnd|core-dnd|@react-dnd|dnd-core|react-dnd-html5-backend|axios|@o11yhq/design-tokens|@o11yhq/table|@o11yhq/calendar|@o11yhq/input|@o11yhq/popover|@o11yhq/button|@o11yhq/sonner|@o11yhq/*|date-fns|d3-interpolate|d3-color|api|@codemirror|@lezer|@marijn|@grafana|nuqs)/)',
|
||||
],
|
||||
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
|
||||
testPathIgnorePatterns: ['/node_modules/', '/public/'],
|
||||
|
||||
+42
-34
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@hanzo/o11y",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"description": "Hanzo o11y frontend — unified observability for metrics, traces, and logs.",
|
||||
"type": "module",
|
||||
"packageManager": "pnpm@10.33.4",
|
||||
"scripts": {
|
||||
@@ -36,6 +36,7 @@
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@ant-design/colors": "6.0.0",
|
||||
"@ant-design/v5-patch-for-react-19": "1.0.3",
|
||||
"@codemirror/autocomplete": "6.18.6",
|
||||
"@codemirror/lang-javascript": "6.2.3",
|
||||
"@codemirror/state": "6.5.2",
|
||||
@@ -45,10 +46,9 @@
|
||||
"@dnd-kit/sortable": "8.0.0",
|
||||
"@dnd-kit/utilities": "3.2.2",
|
||||
"@grafana/data": "^11.6.14",
|
||||
"@monaco-editor/react": "^4.7.0",
|
||||
"@sentry/react": "8.41.0",
|
||||
"@sentry/vite-plugin": "2.22.6",
|
||||
"@hanzo/insights": "^1.357.1",
|
||||
"@hanzo/ui": "^5.3.41",
|
||||
"@monaco-editor/react": "^4.7.0",
|
||||
"@radix-ui/react-avatar": "1.1.11",
|
||||
"@radix-ui/react-checkbox": "1.3.3",
|
||||
"@radix-ui/react-dialog": "1.1.15",
|
||||
@@ -63,27 +63,21 @@
|
||||
"@radix-ui/react-tabs": "1.1.13",
|
||||
"@radix-ui/react-toggle-group": "1.1.11",
|
||||
"@radix-ui/react-tooltip": "1.2.8",
|
||||
"class-variance-authority": "0.7.1",
|
||||
"clsx": "2.1.1",
|
||||
"cmdk": "1.1.1",
|
||||
"lucide-react": "0.498.0",
|
||||
"react-resizable-panels": "^4.0.0",
|
||||
"react-day-picker": "^9.0.0",
|
||||
"sonner": "2.0.7",
|
||||
"tailwind-merge": "3.5.0",
|
||||
"vaul": "1.1.2",
|
||||
"@sentry/react": "8.41.0",
|
||||
"@sentry/vite-plugin": "2.22.6",
|
||||
"@tanstack/react-table": "8.20.6",
|
||||
"@tanstack/react-virtual": "3.11.2",
|
||||
"@uiw/codemirror-theme-copilot": "4.23.11",
|
||||
"@uiw/codemirror-theme-github": "4.24.1",
|
||||
"@uiw/react-codemirror": "4.23.10",
|
||||
"@visx/group": "3.3.0",
|
||||
"@visx/hierarchy": "3.12.0",
|
||||
"@visx/shape": "3.5.0",
|
||||
"@visx/tooltip": "3.3.0",
|
||||
"@visx/group": "4.0.0",
|
||||
"@visx/hierarchy": "4.0.0",
|
||||
"@visx/shape": "4.0.0",
|
||||
"@visx/tooltip": "4.0.0",
|
||||
"@visx/vendor": "4.0.0",
|
||||
"@vitejs/plugin-react": "5.1.4",
|
||||
"ansi-to-html": "0.7.2",
|
||||
"antd": "5.11.0",
|
||||
"antd": "5.29.3",
|
||||
"antd-table-saveas-excel": "2.2.1",
|
||||
"antlr4": "4.13.2",
|
||||
"axios": "1.16.0",
|
||||
@@ -91,7 +85,10 @@
|
||||
"chart.js": "3.9.1",
|
||||
"chartjs-adapter-date-fns": "^2.0.0",
|
||||
"chartjs-plugin-annotation": "^1.4.0",
|
||||
"class-variance-authority": "0.7.1",
|
||||
"classnames": "2.3.2",
|
||||
"clsx": "2.1.1",
|
||||
"cmdk": "1.1.1",
|
||||
"color": "^4.2.1",
|
||||
"crypto-js": "4.2.0",
|
||||
"d3-hierarchy": "3.1.2",
|
||||
@@ -99,6 +96,7 @@
|
||||
"dompurify": "3.4.0",
|
||||
"event-source-polyfill": "1.0.31",
|
||||
"eventemitter3": "5.0.1",
|
||||
"geist": "1.3.1",
|
||||
"history": "4.10.1",
|
||||
"http-proxy-middleware": "4.0.0",
|
||||
"http-status-codes": "2.3.0",
|
||||
@@ -109,30 +107,31 @@
|
||||
"jest": "30.2.0",
|
||||
"js-base64": "^3.7.2",
|
||||
"lodash-es": "^4.17.21",
|
||||
"lucide-react": "0.498.0",
|
||||
"motion": "12.4.13",
|
||||
"nuqs": "2.8.8",
|
||||
"overlayscrollbars": "^2.8.1",
|
||||
"overlayscrollbars-react": "^0.5.6",
|
||||
"papaparse": "5.4.1",
|
||||
"@hanzo/insights": "^1.357.1",
|
||||
"rc-tween-one": "3.0.6",
|
||||
"react": "18.2.0",
|
||||
"react": "19.2.7",
|
||||
"react-addons-update": "15.6.3",
|
||||
"react-beautiful-dnd": "13.1.1",
|
||||
"react-day-picker": "^9.0.0",
|
||||
"react-dnd": "16.0.1",
|
||||
"react-dnd-html5-backend": "16.0.1",
|
||||
"react-dom": "18.2.0",
|
||||
"react-dom": "19.2.7",
|
||||
"react-drag-listview": "2.0.0",
|
||||
"react-force-graph-2d": "^1.29.1",
|
||||
"react-full-screen": "1.1.1",
|
||||
"react-grid-layout": "^1.3.4",
|
||||
"react-helmet-async": "1.3.0",
|
||||
"react-helmet-async": "3.0.0",
|
||||
"react-hook-form": "7.71.2",
|
||||
"react-i18next": "^11.16.1",
|
||||
"react-json-tree": "^0.20.0",
|
||||
"react-markdown": "8.0.7",
|
||||
"react-markdown": "9.0.3",
|
||||
"react-query": "3.39.3",
|
||||
"react-redux": "^7.2.2",
|
||||
"react-redux": "9.3.0",
|
||||
"react-resizable-panels": "^4.0.0",
|
||||
"react-rnd": "^10.5.3",
|
||||
"react-router-dom": "^5.2.0",
|
||||
"react-router-dom-v5-compat": "6.30.3",
|
||||
@@ -142,14 +141,17 @@
|
||||
"redux": "^4.0.5",
|
||||
"redux-thunk": "^2.3.0",
|
||||
"rehype-raw": "7.0.0",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"rollup-plugin-visualizer": "7.0.0",
|
||||
"rrule": "2.8.1",
|
||||
"sonner": "2.0.7",
|
||||
"styled-components": "^5.3.11",
|
||||
"tailwind-merge": "3.5.0",
|
||||
"timestamp-nano": "^1.0.0",
|
||||
"typescript": "5.9.3",
|
||||
"uplot": "1.6.31",
|
||||
"uuid": "^8.3.2",
|
||||
"vaul": "1.1.2",
|
||||
"vite": "npm:rolldown-vite@7.3.1",
|
||||
"vite-plugin-html": "3.2.2",
|
||||
"zod": "4.3.6",
|
||||
@@ -178,7 +180,7 @@
|
||||
"@jest/globals": "30.4.1",
|
||||
"@jest/types": "30.2.0",
|
||||
"@testing-library/jest-dom": "5.16.5",
|
||||
"@testing-library/react": "13.4.0",
|
||||
"@testing-library/react": "16.3.2",
|
||||
"@testing-library/user-event": "14.4.3",
|
||||
"@types/color": "^3.0.3",
|
||||
"@types/crypto-js": "4.2.2",
|
||||
@@ -189,12 +191,10 @@
|
||||
"@types/lodash-es": "^4.17.4",
|
||||
"@types/node": "^16.10.3",
|
||||
"@types/papaparse": "5.3.7",
|
||||
"@types/react": "18.0.26",
|
||||
"@types/react": "19.2.17",
|
||||
"@types/react-addons-update": "0.14.21",
|
||||
"@types/react-beautiful-dnd": "13.1.8",
|
||||
"@types/react-dom": "18.0.10",
|
||||
"@types/react-dom": "19.2.3",
|
||||
"@types/react-grid-layout": "^1.1.2",
|
||||
"@types/react-redux": "^7.1.11",
|
||||
"@types/react-resizable": "3.0.3",
|
||||
"@types/react-router-dom": "^5.1.6",
|
||||
"@types/react-syntax-highlighter": "15.5.13",
|
||||
@@ -246,8 +246,8 @@
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"@types/react": "18.0.26",
|
||||
"@types/react-dom": "18.0.10",
|
||||
"@types/react": "19.2.17",
|
||||
"@types/react-dom": "19.2.3",
|
||||
"debug": "4.3.4",
|
||||
"semver": "7.5.4",
|
||||
"xml2js": "0.5.0",
|
||||
@@ -264,6 +264,14 @@
|
||||
"on-headers": "^1.1.0",
|
||||
"tmp": "0.2.4",
|
||||
"vite": "npm:rolldown-vite@7.3.1"
|
||||
},
|
||||
"peerDependencyRules": {
|
||||
"allowedVersions": {
|
||||
"react-query>react": "19",
|
||||
"react-query>react-dom": "19",
|
||||
"@grafana/data>react": "19",
|
||||
"@grafana/data>react-dom": "19"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Oxlint custom rules plugin for SigNoz.
|
||||
* Oxlint custom rules plugin for O11y.
|
||||
*
|
||||
* This plugin aggregates all custom SigNoz linting rules.
|
||||
* This plugin aggregates all custom O11y linting rules.
|
||||
* Individual rules are defined in the ./rules directory.
|
||||
*/
|
||||
|
||||
@@ -13,7 +13,7 @@ import noAntdComponents from './rules/no-antd-components.mjs';
|
||||
|
||||
export default {
|
||||
meta: {
|
||||
name: 'signoz',
|
||||
name: 'o11y',
|
||||
},
|
||||
rules: {
|
||||
'no-zustand-getstate-in-hooks': noZustandGetStateInHooks,
|
||||
@@ -2,7 +2,7 @@
|
||||
* Rule: no-raw-absolute-path
|
||||
*
|
||||
* Catches patterns that break at runtime when the app is served from a
|
||||
* sub-path (e.g. /signoz/):
|
||||
* sub-path (e.g. /o11y/):
|
||||
*
|
||||
* 1. window.open(path, '_blank')
|
||||
* → use openInNewTab(path) which calls withBasePath internally
|
||||
|
||||
Generated
+2014
-2011
File diff suppressed because it is too large
Load Diff
@@ -19,7 +19,7 @@ const allDeps = {
|
||||
};
|
||||
|
||||
// 4. Filter for @hanzo packages (design system + libs)
|
||||
const signozPackages = Object.keys(allDeps).filter((dep) =>
|
||||
const o11yPackages = Object.keys(allDeps).filter((dep) =>
|
||||
dep.startsWith('@hanzo/'),
|
||||
);
|
||||
|
||||
@@ -36,14 +36,14 @@ const fileContent = `// --------------------------------------------------------
|
||||
// PR for reference: https://github.com/hanzoai/o11y/pull/9694
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
${signozPackages.map((pkg) => `import '${pkg}';`).join('\n')}
|
||||
${o11yPackages.map((pkg) => `import '${pkg}';`).join('\n')}
|
||||
`;
|
||||
|
||||
// 6. Write the file
|
||||
try {
|
||||
fs.writeFileSync(registryPath, fileContent);
|
||||
console.log(
|
||||
`✅ Auto-import registry updated with ${signozPackages.length} @hanzo packages.`,
|
||||
`✅ Auto-import registry updated with ${o11yPackages.length} @hanzo packages.`,
|
||||
);
|
||||
} catch (err) {
|
||||
console.error('❌ Failed to update auto-import registry:', err);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user