Build Cadmus on Linux and macOS hosts using cadmuscli. Use when asked how to compile, test, lint, or run the project locally.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Fetch Cadmus application logs from Loki by run ID. Use when asked to look up logs for a specific run, debug a device session, or find log output for a given run ID.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Cadmus logs are shipped to Loki under the stream label service_name="cadmus".
The run ID is stored as a JSON field named resources_cadmus_run_id — it is
not a Loki stream label, so it cannot be used in the stream selector {}.
It must be filtered with | json | resources_cadmus_run_id="<id>" in the
LogQL pipeline.
Cadmus uses two distinct pipelines:
| Source | What it contains | How to query |
|---|---|---|
Loki (http://localhost:3100) | tracing-bridge log records (third-party crate logs like reqwest, i18n_embed) | LogQL via /loki/api/v1/query_range |
Tempo (http://localhost:3200) | Spans and span events from #[tracing::instrument] — this is where cadmus-core importer, library, db spans live | /api/traces/<traceID> |
Important: Cadmus application logic (cadmus_core::*) emits structured
spans via tracing::instrument, not log records. These appear in Tempo, not
Loki. Loki for a cadmus run will mostly contain noise from reqwest::retry,
i18n_embed, etc. — not importer or library logic.
To debug application behaviour (import scan, db inserts, errors), query Tempo. To find third-party log noise or connectivity errors, query Loki.
http://localhost:3100
Override with the LOKI_URL environment variable if the instance is elsewhere.
LOKI_URL="${LOKI_URL:-http://localhost:3100}"
RUN_ID="<run-id>"
curl -sG "${LOKI_URL}/loki/api/v1/query_range" \
--data-urlencode 'query={service_name="cadmus"} | json | resources_cadmus_run_id="'"${RUN_ID}"'"' \
--data-urlencode 'limit=1000' \
--data-urlencode 'direction=forward' \
| jq -r '.data.result[].values[] | .[1] | fromjson | .body // .msg // .'
This prints the body field of each JSON log line in chronological order.
Add | instrumentation_scope_name="log" to isolate records that went through
the log bridge (as opposed to span events). Even then, most records will be
from third-party crates. To further narrow to cadmus-core targets:
curl -sG "${LOKI_URL}/loki/api/v1/query_range" \
--data-urlencode 'query={service_name="cadmus"} | json | resources_cadmus_run_id="'"${RUN_ID}"'" | instrumentation_scope_name="log"' \
--data-urlencode 'limit=1000' \
--data-urlencode 'direction=forward' \
| jq -r '.data.result[].values[] | .[1] | fromjson | select(.attributes["log.target"] | startswith("cadmus")) | .body'
Loki attaches a level stream label (lowercase) derived from the severity
JSON field. Filter by level two ways:
Stream label (preferred — fast, evaluated before parsing):
{service_name="cadmus", level="error"} | json | resources_cadmus_run_id="<id>"
JSON field filter:
{service_name="cadmus"} | json | resources_cadmus_run_id="<id>" | severity="ERROR"
Valid level stream label values: trace, debug, info, warn, error.
Valid severity JSON field values: TRACE, DEBUG, INFO, WARN, ERROR.
Loki returns at most limit entries per request. Keep limit ≤ 1000 —
larger values may return empty results. Paginate using the last timestamp:
LAST_TS=$(echo "$RESPONSE" | jq -r '.data.result[-1].values[-1][0]')
curl -sG "${LOKI_URL}/loki/api/v1/query_range" \
--data-urlencode 'query={service_name="cadmus"} | json | resources_cadmus_run_id="'"${RUN_ID}"'"' \
--data-urlencode "start=$((LAST_TS + 1))" \
--data-urlencode 'limit=1000' \
--data-urlencode 'direction=forward'
| Goal | LogQL |
|---|---|
| All logs for a run | {service_name="cadmus"} | json | resources_cadmus_run_id="<id>" |
| Errors only | {service_name="cadmus", level="error"} | json | resources_cadmus_run_id="<id>" |
| cadmus-core targets only | add | instrumentation_scope_name="log" then filter .attributes["log.target"] in jq |
| Count entries | Use /loki/api/v1/query with count_over_time(...) |
http://localhost:3200
curl -sG "http://localhost:3200/api/search" \
--data-urlencode "tags=cadmus.run_id=<run-id>" \
--data-urlencode "limit=5" \
| jq -r '.traces[] | "\(.traceID) \(.rootName)"'
TRACE_ID="<traceID>"
curl -s "http://localhost:3200/api/traces/${TRACE_ID}" \
| jq -r '.batches[].scopeSpans[].spans[] | "\(.name) | \(.attributes[] | "\(.key)=\(.value.stringValue // .value.intValue)")"'
curl -s "http://localhost:3200/api/traces/${TRACE_ID}" | jq -r '
.batches[].scopeSpans[].spans[]
| select(.status.code == "STATUS_CODE_ERROR")
| {name, status, events: .events}
'
Span events carry the actual error message. Check .events[].attributes for
fields like error which contain the database error string.
curl -s "http://localhost:3200/api/traces/${TRACE_ID}" | jq -r '
.batches[].scopeSpans[].spans[]
| select(.name | test("scan_entries|flush_to_db|batch_insert|run"))
| "\(.name) | \(.attributes[] | select(.key | test("count|library_id|home")) | "\(.key)=\(.value.stringValue // .value.intValue)")"
'
Tempo span timestamps are Unix nanoseconds:
python3 -c "import datetime; print(datetime.datetime.fromtimestamp(<ns>/1e9, tz=datetime.timezone.utc))"
GET /loki/api/v1/query_range — range query (fetching log lines)GET /loki/api/v1/query — instant query (metric expressions)GET /loki/api/v1/labels — list available label namesGET /loki/api/v1/label/{name}/values — list values for a labelAll parameters are passed as query string values and should be URL-encoded. Timestamps can be Unix epoch nanoseconds (integer) or RFC3339 strings.
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Build Cadmus on Linux and macOS hosts using cadmuscli. Use when asked how to compile, test, lint, or run the project locally.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Build, test, and lint Cadmus from a jj sibling workspace that has no .git (non-colocated checkout). Use when jj workspace root is a sibling tmp/agent workspace and builds fail with git submodule or .gitmodules errors, empty thirdparty/ sources, cache-marker misses, or missing sqlite.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Cross-compile Cadmus for Kobo e-reader devices (ARM Linux). Use this when asked to build a Kobo release, cross-compile for ARM, or prepare a device binary.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Run clippy locally and report only issues in the current diff, matching the CI reviewdog flow. Use when asked how to lint changed code or get clippy feedback on a branch before pushing.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Resolve failed Renovate or Dependabot dependency update PRs by fixing version constraints, API breaking changes, and verifying build/test/format compliance. Use when a dependency bump PR fails CI, Cargo cannot select versions, or a crate update requires code migration.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Build the full Cadmus documentation website (mdBook + cargo doc + Storybook + Next.js). Use this when asked to build, preview, or update the documentation site.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.