You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2026/05/26 06:58:15 UTC
(skywalking-horizon-ui) branch main updated: feat(i18n): eight-locale parity + admin polish + live-debug + upstream id-required compat (#16)
This is an automated email from the ASF dual-hosted git repository.
wu-sheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-horizon-ui.git
The following commit(s) were added to refs/heads/main by this push:
new 3f58846 feat(i18n): eight-locale parity + admin polish + live-debug + upstream id-required compat (#16)
3f58846 is described below
commit 3f58846f9c6f329871709b3db67a837b8cfb0c9b
Author: 吴晟 Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue May 26 14:58:09 2026 +0800
feat(i18n): eight-locale parity + admin polish + live-debug + upstream id-required compat (#16)
* feat(i18n): eight-locale parity across UI chrome + layer/overview overlays
Brings every advertised locale (en, zh-CN, ja, ko, es, pt, de, fr) to
full coverage across both UI chrome and BFF-shipped template overlays.
UI chrome (apps/ui/src/i18n/locales/*.json)
Each non-English catalog now mirrors en.json exactly at 511 keys. Tech
terms (SkyWalking, OAP, MQE, eBPF, Zipkin, OTLP, Kubernetes, K8s,
Istio, GraphQL, OAL/MAL/LAL, LDAP, BanyanDB, Elasticsearch, JVM,
Apdex, RPS/RPM/SLA, hot/warm/cold, scope enums, layer keys, MQE
function names, env vars, HTTP status codes, language runtimes, all
DB / MQ / cache / gateway product names) stay verbatim in every
locale; surrounding English is translated idiomatically. User-specified
popular mappings honored (e.g. zh-CN general.alias = 普通应用).
BFF layer templates (apps/bff/src/bundled_templates/layers/*.i18n.<loc>.json)
All 42 layer source templates carry a per-locale overlay for each of
the seven non-English locales, covering every translatable leaf
(alias, title, description, tip, label, group; aliases.* / slots.*
values; expressionLabels[] / tableHeaders[] entries). Coverage ~2,300
leaves per locale, previously 0–300 in most cases.
i18n wiring across components (~55 .vue files)
31 routed components and 24 sub-components now use vue-i18n. Strings
that reach the DOM are wrapped in t() with natural-key style. Several
shadowed v-for `t` variables were renamed (tabItem, target, …) to
avoid clobbering the i18n function. Translations push now refetches
the sync-status cache so per-locale state stays fresh.
Validator + housekeeping
- apps/bff/src/i18n/validate.ts: every source template must have a
sibling overlay file per OVERLAY_LOCALES; missing-file is a
finding.
- LiveDebuggerView tab buttons now push to /operate/live-debug/<tab>
instead of the non-existent /debug/<tab>.
- K8s instance Node Status: switched from a single-scalar card to a
table of currently-true Kubernetes conditions (matches the
cluster-scope sibling), and aligned rowSpan so widget heights
line up with neighbors.
- MonacoYaml gutter glyph (▶) on `- name:` lines is now visible; CSS
class was referenced but unstyled.
- ClusterStatusView fully i18n-wired; gate descriptions and
Zipkin/OTLP pane copy translate.
- Capture history row layout consolidated; LIVE chip moved inline
next to the timestamp.
Catalog half-translation policy preserved
A missing key in any non-English catalog still falls back to English
at the leaf. This commit closes most gaps but does not change the
fallback semantics; future template additions remain valid even
before their translations land.
Upstream API note (deferred)
skywalking#13884 made `id` REQUIRED on POST /ui-management/templates.
Horizon's create call still sends only `configuration` here; the
forward-compat change to send `id = horizon.<kind>.<key>` is held
back for a dedicated follow-up. Verified Horizon code treats r.id as
opaque (no UUID-format assumptions) and reconcileDuplicates handles
mixed-id legacy deployments, so the switch will be a small surgical
PR once OAP is on a release line that includes #13884.
* fix(i18n + live-debug): re-apply admin polish + per-locale chips + live-debug bug fixes
A grab-bag of small but visible fixes layered on top of the i18n branch,
several of which had landed earlier in the cycle and were lost to
mid-flight reverts.
Cluster Status — chrome i18n (Pane B columns + Pane C entirely)
- Pane B `Module / State / Env var / Gates` column headers, the
`enabled / missing` per-row badge, the `healthLabel` computed,
`adminBadgeLabel` (loading… / unreachable / all selectors on /
{n} selectors off), and the admin-host-unreachable hint all go
through t() now.
- Pane C `Zipkin / OTLP traces` lede, `Endpoint` card heading,
`zipkinBadgeLabel` (reachable / unreachable / loading…), and the
Zipkin-unreachable hint translated.
- 20 new keys seeded into all 8 locale catalogs (en + 7
translations).
Admin polish — hide BUNDLED when synced
- `OverviewTemplatesAdmin.vue` and `LayerDashboardsAdmin.vue` no
longer surface the `from bundled` source pill or the
`Reset to / Preview Bundled` dropdown items when the row's sync
badge is `synced`. With bundled == remote, the distinction is just
visual noise. LOCAL drafts and DIVERGED rows still show the full
chrome.
Translations picker — per-locale status chips
- `TemplateSyncRow` now carries the existing wire-level `locale?`
field; `useTemplateSources.overlayStatus(name, locale)` looks up the
per-locale overlay row's status from the same sync-status payload
(zero extra round-trips). `TemplatePickerEntry.localeBadges` is
rendered as a strip of small color-coded chips after the source
badge in both the collapsed button and the dropdown rows
(synced / diverged / remote-only / bundled-fallback / local /
empty), and `TranslationsView.metaFor` wires it up.
Live debugger — fixes for history → debug deep-link
- MAL view dead-ended on `?historyId=…` because `loadHistorical`
reset `selectedRow / expandedEntities / foldedRecords` before
those refs were declared (TDZ ReferenceError swallowed by the
setup boundary, no console trace). LAL had the same shape with
`selectedCell`. Hoisted the resettable refs above their consumer.
- Per-DSL view lookups (`history.entries.value.find`) changed to
`history.all.value.find`. The route had already pinned us to the
right widget; double-filtering by widget was a silent way for a
stale `widget` field to drop the entry on the floor.
- `useDebugHistory.save()` now refuses to downgrade a session
snapshot: if the existing entry already has records and the new
input has fewer, only metadata (retentionDeadline, retentionMillis)
updates. Defeats the post-stop wipe — `stop()` triggers one final
`session()` refresh against an already-cleaned-up OAP, which
returns nodes-only-with-empty-records and used to overwrite the
rich live snapshot with an empty one.
- Stable node ordering in `DebugMal / DebugLal / DebugOal` —
`nodeViews` sorts by `nodeId ?? peer` before rendering so cards
don't reshuffle between polls.
- `DebugView` shows an explicit "This capture has no records"
placeholder when an effective session has zero node-views, so an
honest empty capture is visibly different from a bug.
- LiveDebuggerView tab buttons push `/operate/live-debug/<tab>` (the
actual mounted path) instead of the non-existent `/debug/<tab>`.
Same one-line fix in the surrounding doc-comments.
Other small fixes
- MonacoYaml `.rr-debug-glyph` CSS restored — the green ▶ in the MAL
/ LAL editor gutter was referencing an unstyled class, so the
live-debug entrance was invisible.
- RuleCard duplicate BUNDLED pill removed — the status pill in the
header row already conveys it; the second pill below was just
duplication.
- `i18n:validate` tightened: empty `{}` overlays are now a finding
rather than a free pass. The missing-overlay finding's secondary
"(an empty {} is acceptable)" hint goes away.
CLAUDE.md
Adds a sixth failure mode under "Common AI failure modes":
audit `router.push({ path })` and `<router-link to>` against the
router on every route refactor, and hoist refs that param-driven
immediate watches reset above the watch itself (Vue's compiler does
not hoist `const` — a TDZ crash silently aborts setup with no
console error in some browser builds).
* feat(ui-template): send id=<envelope name> on POST /ui-management/templates
Upstream skywalking#13884 ("remove auto generate id for UI templates")
made `id` required on POST /ui-management/templates — OAP no longer
auto-generates one. Pass the envelope name (`horizon.<kind>.<key>` for
source rows, `horizon.<kind>.<key>.i18n.<locale>` for translation
overlays) as the requested id; the row lands at the predictable id on
current OAP and `ack.id` echoes it back.
Forward- and backward-compatible:
- Current OAP (post-#13884): row created at the requested id; Horizon
treats `ack.id` as the wire handle (no change in downstream code,
which already operates on `r.id` as opaque).
- Legacy OAP (pre-#13884): the extra `id` body field is ignored, the
server still auto-assigns a UUID and echoes it back in `ack.id`.
Behavior identical to before.
`createAndConfirm` parses the envelope to extract `name`, so all
existing call-sites (sync.ts, template-sync.ts admin routes) keep their
signatures.
Mixed-id deployments (UUID-keyed legacy rows + name-keyed new rows under
the same envelope name) self-heal via `reconcileDuplicates` on next
boot.
* docs(changelog): 0.6.0 — i18n / Cluster Status / live-debug / id-required
Adds the 0.6.0 release-notes block for everything in this branch:
eight-locale parity, Cluster Status + admin polish, live-debugger
fixes, the gutter-glyph / duplicate-BUNDLED / k8s-Node-Status cleanups,
and the upstream `id`-required ui-management alignment.
---
CHANGELOG.md | 126 +++
CLAUDE.md | 16 +
apps/bff/package.json | 2 +
.../bundled_templates/layers/activemq.i18n.de.json | 261 ++++++
.../bundled_templates/layers/activemq.i18n.es.json | 174 ++++
.../bundled_templates/layers/activemq.i18n.fr.json | 174 ++++
.../bundled_templates/layers/activemq.i18n.ja.json | 174 ++++
.../bundled_templates/layers/activemq.i18n.ko.json | 174 ++++
.../bundled_templates/layers/activemq.i18n.pt.json | 174 ++++
.../layers/activemq.i18n.zh-CN.json | 87 ++
.../layers/alipay_mini_program.i18n.de.json | 142 ++++
.../layers/alipay_mini_program.i18n.es.json | 103 +++
.../layers/alipay_mini_program.i18n.fr.json | 103 +++
.../layers/alipay_mini_program.i18n.ja.json | 103 +++
.../layers/alipay_mini_program.i18n.ko.json | 103 +++
.../layers/alipay_mini_program.i18n.pt.json | 103 +++
.../layers/alipay_mini_program.i18n.zh-CN.json | 56 ++
.../bundled_templates/layers/apisix.i18n.de.json | 184 +++++
.../bundled_templates/layers/apisix.i18n.es.json | 123 +++
.../bundled_templates/layers/apisix.i18n.fr.json | 123 +++
.../bundled_templates/layers/apisix.i18n.ja.json | 123 +++
.../bundled_templates/layers/apisix.i18n.ko.json | 123 +++
.../bundled_templates/layers/apisix.i18n.pt.json | 123 +++
.../layers/apisix.i18n.zh-CN.json | 65 ++
.../layers/aws_dynamodb.i18n.de.json | 283 +++++++
.../layers/aws_dynamodb.i18n.es.json | 188 +++++
.../layers/aws_dynamodb.i18n.fr.json | 188 +++++
.../layers/aws_dynamodb.i18n.ja.json | 188 +++++
.../layers/aws_dynamodb.i18n.ko.json | 188 +++++
.../layers/aws_dynamodb.i18n.pt.json | 188 +++++
.../layers/aws_dynamodb.i18n.zh-CN.json | 71 ++
.../bundled_templates/layers/aws_eks.i18n.de.json | 209 +++++
.../bundled_templates/layers/aws_eks.i18n.es.json | 133 +++
.../bundled_templates/layers/aws_eks.i18n.fr.json | 133 +++
.../bundled_templates/layers/aws_eks.i18n.ja.json | 133 +++
.../bundled_templates/layers/aws_eks.i18n.ko.json | 133 +++
.../bundled_templates/layers/aws_eks.i18n.pt.json | 133 +++
.../layers/aws_eks.i18n.zh-CN.json | 66 ++
.../layers/aws_gateway.i18n.de.json | 157 ++++
.../layers/aws_gateway.i18n.es.json | 109 +++
.../layers/aws_gateway.i18n.fr.json | 109 +++
.../layers/aws_gateway.i18n.ja.json | 109 +++
.../layers/aws_gateway.i18n.ko.json | 109 +++
.../layers/aws_gateway.i18n.pt.json | 109 +++
.../layers/aws_gateway.i18n.zh-CN.json | 56 ++
.../bundled_templates/layers/aws_s3.i18n.de.json | 108 +++
.../bundled_templates/layers/aws_s3.i18n.es.json | 78 ++
.../bundled_templates/layers/aws_s3.i18n.fr.json | 78 ++
.../bundled_templates/layers/aws_s3.i18n.ja.json | 78 ++
.../bundled_templates/layers/aws_s3.i18n.ko.json | 78 ++
.../bundled_templates/layers/aws_s3.i18n.pt.json | 78 ++
.../layers/aws_s3.i18n.zh-CN.json | 41 +
.../layers/bookkeeper.i18n.de.json | 198 +++++
.../layers/bookkeeper.i18n.es.json | 130 +++
.../layers/bookkeeper.i18n.fr.json | 130 +++
.../layers/bookkeeper.i18n.ja.json | 130 +++
.../layers/bookkeeper.i18n.ko.json | 130 +++
.../layers/bookkeeper.i18n.pt.json | 130 +++
.../layers/bookkeeper.i18n.zh-CN.json | 74 ++
.../bundled_templates/layers/browser.i18n.de.json | 215 +++++
.../bundled_templates/layers/browser.i18n.es.json | 139 ++++
.../bundled_templates/layers/browser.i18n.fr.json | 139 ++++
.../bundled_templates/layers/browser.i18n.ja.json | 139 ++++
.../bundled_templates/layers/browser.i18n.ko.json | 139 ++++
.../bundled_templates/layers/browser.i18n.pt.json | 139 ++++
.../layers/browser.i18n.zh-CN.json | 81 ++
.../layers/cilium_service.i18n.de.json | 311 +++++++
.../layers/cilium_service.i18n.es.json | 215 +++++
.../layers/cilium_service.i18n.fr.json | 215 +++++
.../layers/cilium_service.i18n.ja.json | 215 +++++
.../layers/cilium_service.i18n.ko.json | 215 +++++
.../layers/cilium_service.i18n.pt.json | 212 +++++
.../layers/cilium_service.i18n.zh-CN.json | 115 +++
.../layers/clickhouse.i18n.de.json | 320 ++++++++
.../layers/clickhouse.i18n.es.json | 204 +++++
.../layers/clickhouse.i18n.fr.json | 204 +++++
.../layers/clickhouse.i18n.ja.json | 204 +++++
.../layers/clickhouse.i18n.ko.json | 204 +++++
.../layers/clickhouse.i18n.pt.json | 204 +++++
.../layers/clickhouse.i18n.zh-CN.json | 105 +++
.../layers/elasticsearch.i18n.de.json | 324 ++++++++
.../layers/elasticsearch.i18n.es.json | 201 +++++
.../layers/elasticsearch.i18n.fr.json | 201 +++++
.../layers/elasticsearch.i18n.ja.json | 201 +++++
.../layers/elasticsearch.i18n.ko.json | 201 +++++
.../layers/elasticsearch.i18n.pt.json | 201 +++++
.../layers/elasticsearch.i18n.zh-CN.json | 106 +++
.../layers/envoy_ai_gateway.i18n.de.json | 239 ++++++
.../layers/envoy_ai_gateway.i18n.es.json | 154 ++++
.../layers/envoy_ai_gateway.i18n.fr.json | 154 ++++
.../layers/envoy_ai_gateway.i18n.ja.json | 154 ++++
.../layers/envoy_ai_gateway.i18n.ko.json | 154 ++++
.../layers/envoy_ai_gateway.i18n.pt.json | 154 ++++
.../layers/envoy_ai_gateway.i18n.zh-CN.json | 81 ++
.../bundled_templates/layers/envoy_ai_gateway.json | 5 +-
.../bundled_templates/layers/flink.i18n.de.json | 374 +++++++++
.../bundled_templates/layers/flink.i18n.es.json | 231 ++++++
.../bundled_templates/layers/flink.i18n.fr.json | 231 ++++++
.../bundled_templates/layers/flink.i18n.ja.json | 231 ++++++
.../bundled_templates/layers/flink.i18n.ko.json | 231 ++++++
.../bundled_templates/layers/flink.i18n.pt.json | 231 ++++++
.../bundled_templates/layers/flink.i18n.zh-CN.json | 125 +++
.../bundled_templates/layers/general.i18n.de.json | 760 +++++++++++++++++
.../bundled_templates/layers/general.i18n.es.json | 482 +++++++++++
.../bundled_templates/layers/general.i18n.fr.json | 482 +++++++++++
.../bundled_templates/layers/general.i18n.ja.json | 482 +++++++++++
.../bundled_templates/layers/general.i18n.ko.json | 482 +++++++++++
.../bundled_templates/layers/general.i18n.pt.json | 482 +++++++++++
.../layers/general.i18n.zh-CN.json | 272 +++++++
.../src/bundled_templates/layers/ios.i18n.de.json | 216 +++++
.../src/bundled_templates/layers/ios.i18n.es.json | 140 ++++
.../src/bundled_templates/layers/ios.i18n.fr.json | 140 ++++
.../src/bundled_templates/layers/ios.i18n.ja.json | 140 ++++
.../src/bundled_templates/layers/ios.i18n.ko.json | 140 ++++
.../src/bundled_templates/layers/ios.i18n.pt.json | 140 ++++
.../bundled_templates/layers/ios.i18n.zh-CN.json | 80 ++
.../src/bundled_templates/layers/k8s.i18n.de.json | 290 +++++++
.../src/bundled_templates/layers/k8s.i18n.es.json | 205 +++++
.../src/bundled_templates/layers/k8s.i18n.fr.json | 205 +++++
.../src/bundled_templates/layers/k8s.i18n.ja.json | 205 +++++
.../src/bundled_templates/layers/k8s.i18n.ko.json | 205 +++++
.../src/bundled_templates/layers/k8s.i18n.pt.json | 204 +++++
.../bundled_templates/layers/k8s.i18n.zh-CN.json | 113 +++
.../layers/k8s_service.i18n.de.json | 378 +++++++++
.../layers/k8s_service.i18n.es.json | 265 ++++++
.../layers/k8s_service.i18n.fr.json | 265 ++++++
.../layers/k8s_service.i18n.ja.json | 265 ++++++
.../layers/k8s_service.i18n.ko.json | 265 ++++++
.../layers/k8s_service.i18n.pt.json | 261 ++++++
.../layers/k8s_service.i18n.zh-CN.json | 140 ++++
.../bundled_templates/layers/kafka.i18n.de.json | 226 ++++++
.../bundled_templates/layers/kafka.i18n.es.json | 146 ++++
.../bundled_templates/layers/kafka.i18n.fr.json | 146 ++++
.../bundled_templates/layers/kafka.i18n.ja.json | 146 ++++
.../bundled_templates/layers/kafka.i18n.ko.json | 146 ++++
.../bundled_templates/layers/kafka.i18n.pt.json | 146 ++++
.../bundled_templates/layers/kafka.i18n.zh-CN.json | 73 ++
.../src/bundled_templates/layers/kong.i18n.de.json | 219 +++++
.../src/bundled_templates/layers/kong.i18n.es.json | 141 ++++
.../src/bundled_templates/layers/kong.i18n.fr.json | 141 ++++
.../src/bundled_templates/layers/kong.i18n.ja.json | 141 ++++
.../src/bundled_templates/layers/kong.i18n.ko.json | 141 ++++
.../src/bundled_templates/layers/kong.i18n.pt.json | 141 ++++
.../bundled_templates/layers/kong.i18n.zh-CN.json | 71 ++
.../src/bundled_templates/layers/mesh.i18n.de.json | 365 +++++++++
.../src/bundled_templates/layers/mesh.i18n.es.json | 252 ++++++
.../src/bundled_templates/layers/mesh.i18n.fr.json | 252 ++++++
.../src/bundled_templates/layers/mesh.i18n.ja.json | 252 ++++++
.../src/bundled_templates/layers/mesh.i18n.ko.json | 252 ++++++
.../src/bundled_templates/layers/mesh.i18n.pt.json | 249 ++++++
.../bundled_templates/layers/mesh.i18n.zh-CN.json | 145 ++++
.../bundled_templates/layers/mesh_cp.i18n.de.json | 156 ++++
.../bundled_templates/layers/mesh_cp.i18n.es.json | 109 +++
.../bundled_templates/layers/mesh_cp.i18n.fr.json | 109 +++
.../bundled_templates/layers/mesh_cp.i18n.ja.json | 109 +++
.../bundled_templates/layers/mesh_cp.i18n.ko.json | 109 +++
.../bundled_templates/layers/mesh_cp.i18n.pt.json | 106 +++
.../layers/mesh_cp.i18n.zh-CN.json | 56 ++
.../bundled_templates/layers/mesh_dp.i18n.de.json | 115 +++
.../bundled_templates/layers/mesh_dp.i18n.es.json | 75 ++
.../bundled_templates/layers/mesh_dp.i18n.fr.json | 75 ++
.../bundled_templates/layers/mesh_dp.i18n.ja.json | 75 ++
.../bundled_templates/layers/mesh_dp.i18n.ko.json | 75 ++
.../bundled_templates/layers/mesh_dp.i18n.pt.json | 72 ++
.../layers/mesh_dp.i18n.zh-CN.json | 59 ++
.../bundled_templates/layers/mongodb.i18n.de.json | 266 ++++++
.../bundled_templates/layers/mongodb.i18n.es.json | 178 ++++
.../bundled_templates/layers/mongodb.i18n.fr.json | 178 ++++
.../bundled_templates/layers/mongodb.i18n.ja.json | 178 ++++
.../bundled_templates/layers/mongodb.i18n.ko.json | 178 ++++
.../bundled_templates/layers/mongodb.i18n.pt.json | 178 ++++
.../layers/mongodb.i18n.zh-CN.json | 94 +++
.../bundled_templates/layers/mysql.i18n.de.json | 212 +++++
.../bundled_templates/layers/mysql.i18n.es.json | 145 ++++
.../bundled_templates/layers/mysql.i18n.fr.json | 145 ++++
.../bundled_templates/layers/mysql.i18n.ja.json | 145 ++++
.../bundled_templates/layers/mysql.i18n.ko.json | 145 ++++
.../bundled_templates/layers/mysql.i18n.pt.json | 145 ++++
.../bundled_templates/layers/mysql.i18n.zh-CN.json | 80 ++
.../bundled_templates/layers/nginx.i18n.de.json | 188 +++++
.../bundled_templates/layers/nginx.i18n.es.json | 122 +++
.../bundled_templates/layers/nginx.i18n.fr.json | 122 +++
.../bundled_templates/layers/nginx.i18n.ja.json | 122 +++
.../bundled_templates/layers/nginx.i18n.ko.json | 122 +++
.../bundled_templates/layers/nginx.i18n.pt.json | 122 +++
.../bundled_templates/layers/nginx.i18n.zh-CN.json | 63 ++
.../bundled_templates/layers/os_linux.i18n.de.json | 140 ++++
.../bundled_templates/layers/os_linux.i18n.es.json | 101 +++
.../bundled_templates/layers/os_linux.i18n.fr.json | 101 +++
.../bundled_templates/layers/os_linux.i18n.ja.json | 101 +++
.../bundled_templates/layers/os_linux.i18n.ko.json | 101 +++
.../bundled_templates/layers/os_linux.i18n.pt.json | 101 +++
.../layers/os_linux.i18n.zh-CN.json | 57 ++
.../layers/os_windows.i18n.de.json | 93 +++
.../layers/os_windows.i18n.es.json | 73 ++
.../layers/os_windows.i18n.fr.json | 73 ++
.../layers/os_windows.i18n.ja.json | 73 ++
.../layers/os_windows.i18n.ko.json | 73 ++
.../layers/os_windows.i18n.pt.json | 73 ++
.../layers/os_windows.i18n.zh-CN.json | 46 ++
.../layers/postgresql.i18n.de.json | 244 ++++++
.../layers/postgresql.i18n.es.json | 164 ++++
.../layers/postgresql.i18n.fr.json | 164 ++++
.../layers/postgresql.i18n.ja.json | 164 ++++
.../layers/postgresql.i18n.ko.json | 164 ++++
.../layers/postgresql.i18n.pt.json | 164 ++++
.../layers/postgresql.i18n.zh-CN.json | 88 ++
.../bundled_templates/layers/pulsar.i18n.de.json | 204 +++++
.../bundled_templates/layers/pulsar.i18n.es.json | 136 ++++
.../bundled_templates/layers/pulsar.i18n.fr.json | 136 ++++
.../bundled_templates/layers/pulsar.i18n.ja.json | 136 ++++
.../bundled_templates/layers/pulsar.i18n.ko.json | 136 ++++
.../bundled_templates/layers/pulsar.i18n.pt.json | 136 ++++
.../layers/pulsar.i18n.zh-CN.json | 73 ++
.../bundled_templates/layers/rabbitmq.i18n.de.json | 243 ++++++
.../bundled_templates/layers/rabbitmq.i18n.es.json | 162 ++++
.../bundled_templates/layers/rabbitmq.i18n.fr.json | 162 ++++
.../bundled_templates/layers/rabbitmq.i18n.ja.json | 162 ++++
.../bundled_templates/layers/rabbitmq.i18n.ko.json | 162 ++++
.../bundled_templates/layers/rabbitmq.i18n.pt.json | 162 ++++
.../layers/rabbitmq.i18n.zh-CN.json | 84 ++
.../bundled_templates/layers/redis.i18n.de.json | 207 +++++
.../bundled_templates/layers/redis.i18n.es.json | 138 ++++
.../bundled_templates/layers/redis.i18n.fr.json | 138 ++++
.../bundled_templates/layers/redis.i18n.ja.json | 138 ++++
.../bundled_templates/layers/redis.i18n.ko.json | 138 ++++
.../bundled_templates/layers/redis.i18n.pt.json | 138 ++++
.../bundled_templates/layers/redis.i18n.zh-CN.json | 75 ++
.../bundled_templates/layers/rocketmq.i18n.de.json | 233 ++++++
.../bundled_templates/layers/rocketmq.i18n.es.json | 156 ++++
.../bundled_templates/layers/rocketmq.i18n.fr.json | 156 ++++
.../bundled_templates/layers/rocketmq.i18n.ja.json | 156 ++++
.../bundled_templates/layers/rocketmq.i18n.ko.json | 156 ++++
.../bundled_templates/layers/rocketmq.i18n.pt.json | 156 ++++
.../layers/rocketmq.i18n.zh-CN.json | 87 ++
.../layers/so11y_go_agent.i18n.de.json | 64 ++
.../layers/so11y_go_agent.i18n.es.json | 41 +
.../layers/so11y_go_agent.i18n.fr.json | 41 +
.../layers/so11y_go_agent.i18n.ja.json | 41 +
.../layers/so11y_go_agent.i18n.ko.json | 41 +
.../layers/so11y_go_agent.i18n.pt.json | 41 +
.../layers/so11y_go_agent.i18n.zh-CN.json | 25 +
.../layers/so11y_java_agent.i18n.de.json | 64 ++
.../layers/so11y_java_agent.i18n.es.json | 41 +
.../layers/so11y_java_agent.i18n.fr.json | 41 +
.../layers/so11y_java_agent.i18n.ja.json | 41 +
.../layers/so11y_java_agent.i18n.ko.json | 41 +
.../layers/so11y_java_agent.i18n.pt.json | 41 +
.../layers/so11y_java_agent.i18n.zh-CN.json | 25 +
.../layers/so11y_oap.i18n.de.json | 254 ++++++
.../layers/so11y_oap.i18n.es.json | 153 ++++
.../layers/so11y_oap.i18n.fr.json | 153 ++++
.../layers/so11y_oap.i18n.ja.json | 153 ++++
.../layers/so11y_oap.i18n.ko.json | 153 ++++
.../layers/so11y_oap.i18n.pt.json | 153 ++++
.../layers/so11y_oap.i18n.zh-CN.json | 78 ++
.../layers/so11y_satellite.i18n.de.json | 69 ++
.../layers/so11y_satellite.i18n.es.json | 50 ++
.../layers/so11y_satellite.i18n.fr.json | 50 ++
.../layers/so11y_satellite.i18n.ja.json | 50 ++
.../layers/so11y_satellite.i18n.ko.json | 50 ++
.../layers/so11y_satellite.i18n.pt.json | 50 ++
.../layers/so11y_satellite.i18n.zh-CN.json | 31 +
.../layers/virtual_cache.i18n.de.json | 139 ++++
.../layers/virtual_cache.i18n.es.json | 97 +++
.../layers/virtual_cache.i18n.fr.json | 97 +++
.../layers/virtual_cache.i18n.ja.json | 97 +++
.../layers/virtual_cache.i18n.ko.json | 97 +++
.../layers/virtual_cache.i18n.pt.json | 97 +++
.../layers/virtual_cache.i18n.zh-CN.json | 56 ++
.../layers/virtual_database.i18n.de.json | 87 ++
.../layers/virtual_database.i18n.es.json | 72 ++
.../layers/virtual_database.i18n.fr.json | 72 ++
.../layers/virtual_database.i18n.ja.json | 72 ++
.../layers/virtual_database.i18n.ko.json | 72 ++
.../layers/virtual_database.i18n.pt.json | 72 ++
.../layers/virtual_database.i18n.zh-CN.json | 47 ++
.../layers/virtual_genai.i18n.de.json | 181 +++++
.../layers/virtual_genai.i18n.es.json | 129 +++
.../layers/virtual_genai.i18n.fr.json | 129 +++
.../layers/virtual_genai.i18n.ja.json | 129 +++
.../layers/virtual_genai.i18n.ko.json | 129 +++
.../layers/virtual_genai.i18n.pt.json | 129 +++
.../layers/virtual_genai.i18n.zh-CN.json | 75 ++
.../layers/virtual_mq.i18n.de.json | 134 +++
.../layers/virtual_mq.i18n.es.json | 98 +++
.../layers/virtual_mq.i18n.fr.json | 98 +++
.../layers/virtual_mq.i18n.ja.json | 98 +++
.../layers/virtual_mq.i18n.ko.json | 98 +++
.../layers/virtual_mq.i18n.pt.json | 98 +++
.../layers/virtual_mq.i18n.zh-CN.json | 55 ++
.../layers/wechat_mini_program.i18n.de.json | 179 ++++
.../layers/wechat_mini_program.i18n.es.json | 122 +++
.../layers/wechat_mini_program.i18n.fr.json | 122 +++
.../layers/wechat_mini_program.i18n.ja.json | 122 +++
.../layers/wechat_mini_program.i18n.ko.json | 122 +++
.../layers/wechat_mini_program.i18n.pt.json | 122 +++
.../layers/wechat_mini_program.i18n.zh-CN.json | 65 ++
.../bundled_templates/overviews/mesh.i18n.de.json | 58 ++
.../bundled_templates/overviews/mesh.i18n.es.json | 78 ++
.../bundled_templates/overviews/mesh.i18n.fr.json | 58 ++
.../bundled_templates/overviews/mesh.i18n.ja.json | 78 ++
.../bundled_templates/overviews/mesh.i18n.ko.json | 78 ++
.../bundled_templates/overviews/mesh.i18n.pt.json | 78 ++
.../overviews/mesh.i18n.zh-CN.json | 78 ++
.../overviews/services.i18n.de.json | 84 ++
.../overviews/services.i18n.es.json | 126 +++
.../overviews/services.i18n.fr.json | 84 ++
.../overviews/services.i18n.ja.json | 126 +++
.../overviews/services.i18n.ko.json | 126 +++
.../overviews/services.i18n.pt.json | 126 +++
.../overviews/services.i18n.zh-CN.json | 126 +++
apps/bff/src/http/admin/template-sync.ts | 295 ++++++-
apps/bff/src/http/config/bundle.ts | 87 +-
apps/bff/src/http/config/dashboard.ts | 8 +-
apps/bff/src/http/config/layer-template.ts | 3 +
apps/bff/src/http/config/overview.ts | 31 +-
apps/bff/src/http/query/menu.ts | 16 +-
apps/bff/src/i18n/index.ts | 41 +
apps/bff/src/i18n/lexicon/de.json | 131 +++
apps/bff/src/i18n/lexicon/en.json | 139 ++++
apps/bff/src/i18n/lexicon/es.json | 139 ++++
apps/bff/src/i18n/lexicon/fr.json | 131 +++
apps/bff/src/i18n/lexicon/ja.json | 139 ++++
apps/bff/src/i18n/lexicon/ko.json | 139 ++++
apps/bff/src/i18n/lexicon/pt.json | 139 ++++
apps/bff/src/i18n/lexicon/zh-CN.json | 139 ++++
apps/bff/src/i18n/merge.ts | 132 +++
apps/bff/src/i18n/request.ts | 106 +++
apps/bff/src/i18n/seed.ts | 348 ++++++++
apps/bff/src/i18n/store.ts | 192 +++++
apps/bff/src/i18n/types.ts | 68 ++
apps/bff/src/i18n/validate.ts | 379 +++++++++
apps/bff/src/logic/layers/loader.ts | 9 +
apps/bff/src/logic/overview/loader.ts | 7 +-
apps/bff/src/logic/templates/aggregator.ts | 38 +
apps/bff/src/logic/templates/names.ts | 96 ++-
apps/bff/src/logic/templates/sync.ts | 363 ++++++++-
apps/bff/src/rbac/route-policy.ts | 4 +
apps/bff/src/server.ts | 3 +-
apps/ui/src/api/client.ts | 11 +
apps/ui/src/api/scopes/configs.ts | 36 +-
apps/ui/src/api/scopes/template-sync.ts | 54 +-
apps/ui/src/components/charts/TopList.vue | 11 +-
.../ui/src/components/primitives/FloatingPanel.vue | 170 ++++
.../src/components/primitives/TypeaheadSelect.vue | 219 +++++
apps/ui/src/components/primitives/WidgetTip.vue | 164 ++++
apps/ui/src/controls/configBundle.ts | 10 +-
apps/ui/src/controls/localTranslationEdits.ts | 129 +++
.../admin/_shared/LayerDashboardCanvas.vue | 303 +++++++
.../admin/_shared/OverviewDashboardCanvas.vue | 298 +++++++
.../features/admin/_shared/SyncStatusBanner.vue | 60 ++
.../features/admin/_shared/TemplateDiffModal.vue | 40 +-
.../src/features/admin/_shared/TemplatePicker.vue | 421 ++++++++++
.../features/admin/_shared/TranslationEditor.vue | 334 ++++++++
.../features/admin/_shared/translatableFields.ts | 175 ++++
.../features/admin/_shared/useTemplateSources.ts | 34 +-
.../src/features/admin/_shared/useTemplateSync.ts | 38 +-
.../admin/global-defaults/ThemePreviewCard.vue | 19 +-
.../admin/layer-templates/LayerDashboardsAdmin.vue | 145 +++-
.../overview-templates/OverviewTemplatesAdmin.vue | 132 ++-
.../admin/translations/TranslationPreview.vue | 402 +++++++++
.../admin/translations/TranslationsView.vue | 897 +++++++++++++++++++++
apps/ui/src/features/alarms/AlarmDetailPanel.vue | 58 +-
apps/ui/src/features/auth/LoginView.vue | 72 +-
.../ui/src/features/operate/_shared/MonacoYaml.vue | 23 +
apps/ui/src/features/operate/_shared/RuleCard.vue | 14 +-
.../features/operate/cluster/ClusterStatusView.vue | 98 +--
apps/ui/src/features/operate/dsl/DslEditorView.vue | 7 +-
.../ui/src/features/operate/dsl/OalCatalogView.vue | 2 +-
.../operate/live-debug/DebugHistoryView.vue | 8 +-
.../src/features/operate/live-debug/DebugLal.vue | 146 ++--
.../src/features/operate/live-debug/DebugMal.vue | 55 +-
.../src/features/operate/live-debug/DebugOal.vue | 89 +-
.../src/features/operate/live-debug/DebugView.vue | 13 +
.../operate/live-debug/LiveDebuggerView.vue | 10 +-
.../features/operate/live-debug/useDebugHistory.ts | 33 +-
apps/ui/src/i18n/index.ts | 151 ++++
apps/ui/src/i18n/locales/de.json | 534 ++++++++++++
apps/ui/src/i18n/locales/en.json | 534 ++++++++++++
apps/ui/src/i18n/locales/es.json | 534 ++++++++++++
apps/ui/src/i18n/locales/fr.json | 534 ++++++++++++
apps/ui/src/i18n/locales/ja.json | 534 ++++++++++++
apps/ui/src/i18n/locales/ko.json | 534 ++++++++++++
apps/ui/src/i18n/locales/pt.json | 534 ++++++++++++
apps/ui/src/i18n/locales/zh-CN.json | 534 ++++++++++++
apps/ui/src/layer/LayerServiceSelector.vue | 11 +-
apps/ui/src/layer/LayerShell.vue | 152 +---
.../src/layer/profiling/ProcessTopologyGraph.vue | 9 +-
apps/ui/src/layer/profiling/ProfileFlameGraph.vue | 11 +-
apps/ui/src/layer/profiling/ProfileStackTable.vue | 19 +-
apps/ui/src/layer/traces/LayerTracesView.vue | 243 +++---
apps/ui/src/layer/traces/LayerZipkinTracesView.vue | 133 +--
apps/ui/src/layer/traces/TracePopout.vue | 76 +-
apps/ui/src/layer/traces/ZipkinTracePopout.vue | 35 +-
apps/ui/src/main.ts | 6 +
.../render/layer-dashboard/LayerDashboardsView.vue | 28 +-
apps/ui/src/render/widgets/AlarmsWidget.vue | 77 +-
apps/ui/src/render/widgets/KpiTileWidget.vue | 10 +-
.../src/render/widgets/MetricCompositeWidget.vue | 8 +-
apps/ui/src/render/widgets/MetricWidget.vue | 8 +-
apps/ui/src/shell/AdminFeatureWarning.vue | 39 +-
apps/ui/src/shell/AppShell.vue | 7 +-
apps/ui/src/shell/AppSidebar.vue | 101 ++-
apps/ui/src/shell/AppTopbar.vue | 27 +-
apps/ui/src/shell/ColdStageTrapBanner.vue | 10 +-
apps/ui/src/shell/DebugEventPanel.vue | 14 +-
apps/ui/src/shell/GlobalConnectivityBanner.vue | 15 +-
apps/ui/src/shell/LocaleChip.vue | 216 +++++
apps/ui/src/shell/PreviewModeBanner.vue | 7 +-
apps/ui/src/shell/TemplateConflictPrompt.vue | 20 +-
apps/ui/src/shell/router/index.ts | 15 +-
apps/ui/src/state/auth.ts | 8 +-
apps/ui/src/state/layerSelection.ts | 91 +--
apps/ui/src/utils/autosize.ts | 58 ++
docs/customization/i18n.md | 126 +++
docs/menu.yml | 2 +
packages/api-client/src/ui-template.ts | 17 +-
418 files changed, 58015 insertions(+), 963 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 82ab1d3..bcbc513 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,132 @@ packages) plus the BFF's `HORIZON_VERSION` default.
## 0.6.0
+### Eight-locale internationalization
+
+Horizon now ships with eight first-class UI languages — English (source)
+plus zh-CN, ja, ko, es, pt, de, fr — selectable from the top-bar locale
+chip on every page (including the pre-auth login). The choice persists
+per device.
+
+- **UI chrome.** Every routed page (31) and every shared sub-component
+ (24) renders through `vue-i18n`. The English catalog is the source
+ of truth at 531 keys; every other locale carries 531 native
+ translations. Missing keys fall back to English at the leaf, so
+ partial catalogs are valid and degradation is invisible.
+- **BFF-shipped templates.** All 42 layer dashboards and both overview
+ dashboards carry per-locale overlay catalogs alongside the source
+ template. Coverage is ~2,300 translatable leaves per non-English
+ locale across the layer set. The BFF picks the locale from the
+ request's `X-Horizon-Locale` header (auto-set by the SPA), merges
+ the overlay onto the source, and serves the localised template to
+ the renderer — translation resolves once on the BFF, never on
+ every chart mount.
+- **Operator-runnable Translations page.** A new admin surface
+ (Dashboard setup → Translations) edits the per-locale overlays
+ through the live preview: pick a target language, click any widget
+ in the rendered dashboard, type the translation. Per-locale status
+ chips on the template picker show at a glance which dashboards have
+ drafts, which are synced, which diverge from disk, and which are
+ empty for a given locale. Push writes the sibling overlay row on
+ OAP; pushing zh-CN never touches ja.
+- **Tech-term policy.** Product, project, and protocol names
+ (SkyWalking, Kubernetes, OAP, MQE, eBPF, Zipkin, OpenTelemetry,
+ Istio, GraphQL, etc.), OAP scope enums (Service, ServiceInstance,
+ Endpoint, Process), layer keys, MQE function names, env vars, HTTP
+ status codes, and per-language runtimes (JVM, Go, Python, …) stay
+ verbatim in every locale per CLAUDE.md. Phrases containing tech
+ terms are translated around the term (`HTTP Connections` →
+ `HTTP 连接` / `HTTP 接続`), not transliterated.
+- **OAP-supplied data is never translated.** Service names, alarm
+ rule names, trace span operation names, log messages — anything
+ arriving over the OAP wire — render verbatim regardless of locale.
+- **Validator gate.** `i18n:validate` is stricter: every source
+ template must have a sibling overlay file per advertised locale,
+ and empty `{}` overlays are now a finding (used to pass silently —
+ surfaced as "structurally complete" while every translatable string
+ still rendered in English).
+
+### Cluster Status + admin polish
+
+- **Cluster Status — Pane B + Pane C fully translatable.** Module
+ column headers, gate descriptions (the SWIP-13 affects strings),
+ per-row enabled/missing badges, the admin-host status badge
+ (`loading…` / `unreachable` / `all selectors on` / `{n} selectors
+ off`), the admin-host-unreachable hint, the Zipkin / OTLP pane
+ lede, the Endpoint card heading, the Zipkin badge and the
+ Zipkin-unreachable hint all now render in the active locale.
+- **Hide redundant BUNDLED chrome when synced.** On the Overview
+ templates and Layer dashboards admin pages, when the row's sync
+ badge is `synced` the BUNDLED and REMOTE versions are byte-equal,
+ so the `from {source}` pill and the `Reset to / Preview Bundled`
+ dropdown items add no information and are hidden. LOCAL drafts
+ always show; BUNDLED resurfaces the moment the row diverges.
+- **Translations picker prefers the English bundle.** REMOTE-only
+ rows with non-English titles (legacy duplicates from prior import
+ cycles) no longer appear as separate dashboards in the picker — the
+ picker lists the canonical English bundled dashboards once each,
+ and the preview renders the English source as the baseline.
+
+### Live debugger fixes
+
+A clutch of small but visible bugs were caught while exercising the
+i18n surfaces:
+
+- **History → debug deep-link rendered blank.** MAL and LAL views
+ crashed silently on `?historyId=…` because `loadHistorical` reset
+ refs (`selectedRow`, `expandedEntities`, `foldedRecords`;
+ `selectedCell` for LAL) that the file declared further down. The
+ `watch(historyId, …, { immediate: true })` fires during setup, so
+ the TDZ ReferenceError aborted setup before the page rendered, with
+ no console trace. Resettable refs are now hoisted above their
+ consumer.
+- **Captured records wiped on stop.** After `stop()`, the per-DSL
+ view did one final `session()` refresh against an already-cleaned-
+ up OAP, which returned nodes-only-with-empty-records and
+ overwrote the rich live snapshot in localStorage. `save()` now
+ refuses to shrink an existing entry's `recordCount` for the same
+ `sessionId` — only metadata (`retentionDeadline`, `retentionMillis`)
+ updates.
+- **Stable node ordering.** MAL / LAL / OAL node cards now sort by
+ `nodeId ?? peer` so they don't reshuffle between polls.
+- **Tab buttons jumped nowhere.** `LiveDebuggerView.selectTab` pushed
+ `/debug/<tab>` (a path that doesn't exist); fixed to
+ `/operate/live-debug/<tab>`. Same correction in
+ `DebugHistoryView.loadEntry` deep-links and surrounding
+ doc-comments in `RuleCard.vue` / `DslEditorView.vue`.
+- **Empty-capture placeholder.** When a saved session has zero
+ populated nodes, `DebugView` now shows an explicit "This capture
+ has no records" rather than rendering blank, so an honest empty
+ capture is visibly different from a bug.
+- **Per-locale lookup widened.** Per-DSL views look up the historyId
+ via `history.all` (not the widget-filtered `history.entries`); the
+ route already pinned us to the right widget, and double-filtering
+ by `widget` was a silent way for a stale field to drop the entry.
+
+### Other small fixes
+
+- **MAL / LAL editor gutter glyph.** The green ▶ live-debug entrance
+ on every `- name:` row was referencing an unstyled CSS class —
+ Monaco reserved the gutter and wired clicks, but the icon was
+ invisible. Restored.
+- **Rule catalog cards.** Duplicate BUNDLED pill removed; the header
+ status pill already conveyed it.
+- **K8s instance Node Status.** Switched from a single-scalar card
+ (rendering just `1`) to a table of currently-true Kubernetes
+ conditions, matching the cluster-scope sibling and aligning widget
+ heights.
+
+### Upstream `ui-management` compatibility
+
+Aligned with upstream [skywalking#13884](https://github.com/apache/skywalking/pull/13884)
+("remove auto generate id for UI templates"): Horizon now sends
+`id = <envelope name>` on `POST /ui-management/templates`. Current
+OAP requires it (POSTs without `id` are rejected); legacy OAP
+releases ignored the field and auto-generated UUIDs, so the same
+payload works against both. Horizon already treated `r.id` as
+opaque; mixed-id deployments self-heal via `reconcileDuplicates` on
+the next boot.
+
### Smartscape service hierarchy
OAP 10's cross-layer service hierarchy is now reachable from any layer's
diff --git a/CLAUDE.md b/CLAUDE.md
index f6d7248..482ed13 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -55,6 +55,19 @@ Design tokens live in the runtime token CSS (`apps/ui/src/assets/styles/tokens.c
**Docs are written for the end user (operator / dashboard author), not the contributor.** Document what a feature *does*, how to *configure* it (YAML, fields, recipes), and how to *operate / troubleshoot* it. Do **not** document the internal code workflow: no step-by-step algorithms ("1. service-bind 2. user search 3. …"), no source-file paths (`apps/bff/src/...`), no internal function / composable / route names, no "the BFF then fans out / chunks / probes …" implementation narration. If [...]
+## Internationalization
+
+English is the source of truth. Every UI string and every translatable template field is authored in English first; the English bundle ships in the main JS chunk so the app renders without any network locale fetch. Other locales (zh-CN, es, pt, ja, ko at the time of writing) are catalog overlays. A missing key in any non-English catalog falls back to English at the leaf, never at the file — half-translated catalogs are valid and expected. Edit English first; re-translate downstream.
+
+**Translation principles:**
+
+- **IT terms and proper nouns stay in their original form.** Product, project, and protocol names (SkyWalking, Kubernetes, Envoy, Istio, OAP, MQE, eBPF, Zipkin, OpenTelemetry, gRPC, GraphQL, Java, Go, …), OAP scope enums (Service, ServiceInstance, Endpoint, Process), layer keys (GENERAL, MESH, K8S_SERVICE, …), metric ids, MQE function names, and HTTP / SQL / log keywords are **not** translated in any locale. Operators read these terms across docs, source, and other SkyWalking surfaces — [...]
+- **Translate meaning, not words.** Use idiomatic, native phrasing. A literal word-for-word translation that reads like machine output is worse than leaving the string in English — restructure the sentence if the target language needs it. Faithfulness is to the *intent*, not the English syntax.
+- **OAP-supplied data is never translated.** Service names, instance names, endpoint names, alarm rule names, tag values, log messages, trace span operation names, anything coming over the OAP wire — that's mutable user data from outside our control, render verbatim regardless of locale. The only OAP-adjacent strings we translate are the layer `alias` and `aliases.*` fields *inside our own templates* (which name the enum for display); the enum value itself is not translated.
+- **Initial translations are AI-assisted, and that's fine.** When seeding a new locale, modern models handle the technical vocabulary competently — we use them as the starting point and ship. Native speakers refine over time as they spot phrasings that aren't quite right; the in-app locale picker and docs invite corrections via PR. Don't treat AI translations as second-class.
+- **Resolution split is fixed.** UI chrome (Vue templates, validation, error toasts, login page, topbar, sidebar, modals, placeholders) resolves client-side with vue-i18n. BFF-shipped templates (bundled layer dashboards, bundled overview dashboards) and user-maintained dashboards stored on OAP resolve BFF-side from sibling `*.i18n.<lang>.json` catalogs before the response leaves the BFF. The UI never sees template translation keys; the BFF never serves UI chrome strings.
+- **Catalog drift is a build-time error.** Catalog keys that don't exist in the source template are pruned at load with a warning; non-string values at translatable paths are dropped. Source structure is the contract.
+
## Things that are non-negotiable
- **TypeScript strict.** No `any` outside `.d.ts` shims.
@@ -98,3 +111,6 @@ Design tokens live in the runtime token CSS (`apps/ui/src/assets/styles/tokens.c
3. **Blanket reverts.** `git checkout <file>` discards anyone else's uncommitted changes too. Diff first, revert by hunk.
4. **Faking backend data to "unblock" yourself.** A mocked response that shapes nothing real is worse than no response — it hides the real wire mismatch until much later. Ask for OAP access.
5. **Inventing layouts.** The rendered UI is the visual spec; match the existing dark-dense vocabulary rather than introducing new conventions. If something is genuinely new, ask before designing.
+6. **Dead-route / parameter jumps.** Every `router.push({ path: '…' })`, `<router-link to="…">`, and `entry.widget`-style URL-built path must resolve to a route that's actually defined in `apps/ui/src/shell/router/index.ts` — grep it before you commit. Stale paths (`/debug/mal`, `/debug/history`) compile and ship, then dead-end at runtime with a blank page and no error. **Audit twice:**
+ - *The path.* If you refactor route paths anywhere in the app, grep the entire source tree for every push / `to=` / `router.push({ path })` that targets the old prefix — including dynamic builds like `` `/operate/live-debug/${widget}` ``.
+ - *The parameter-on-mount flow.* When a route takes a query/path param the view loads on first mount (e.g. `?historyId=`, `?catalog=&name=`), the watch that consumes it almost always uses `{ immediate: true }` — which fires *during* setup. Any ref the handler writes to must be declared *above* that watch in the file, or you get a TDZ ReferenceError that silently aborts setup and leaves the page blank with no console trace. Hoist resettable refs above their consumer; never assume Vue' [...]
diff --git a/apps/bff/package.json b/apps/bff/package.json
index 0cb5e0a..4bbd8fc 100644
--- a/apps/bff/package.json
+++ b/apps/bff/package.json
@@ -11,6 +11,8 @@
"dev": "NODE_ENV=development tsx watch src/server.ts",
"build": "esbuild src/server.ts --bundle --platform=node --format=esm --target=node20 --outfile=dist/server.js --packages=external",
"cli:hash": "tsx src/cli/hash.ts",
+ "i18n:seed": "tsx src/i18n/seed.ts",
+ "i18n:validate": "tsx src/i18n/validate.ts",
"type-check": "tsc --noEmit",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.de.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.de.json
new file mode 100644
index 0000000..31a6d97
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.de.json
@@ -0,0 +1,261 @@
+{
+ "alias": "ActiveMQ",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Enqueue/s"
+ },
+ {
+ "label": "Dequeue/s"
+ },
+ {
+ "label": "Systemlast"
+ },
+ {
+ "label": "Threads"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Durchsatz",
+ "metrics": [
+ {
+ "label": "Enqueue/s",
+ "tip": "Pro Sekunde in die Queue gestellte Nachrichten."
+ },
+ {
+ "label": "Dequeue/s",
+ "tip": "Pro Sekunde aus der Queue entnommene Nachrichten."
+ },
+ {
+ "label": "Abgelaufen/s",
+ "tip": "Vor dem Verbrauch abgelaufene Nachrichten."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Systemlast Mittel",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Thread-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Heap genutzt (MB)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Heap max (MB)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Enqueue / Dequeue / Dispatch /s",
+ "expressions": [
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch"
+ ]
+ },
+ {
+ "title": "Abgelaufen /s",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Enqueue-Zeit",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "mittel",
+ "max"
+ ]
+ },
+ {
+ "title": "GC-Anzahl (G1+Parallel)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ },
+ {
+ "title": "GC-Zeit (ms)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "Verbindungen",
+ "tip": "Aktuelle TCP/JMS-Verbindungen zu diesem Broker.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Producer-Anzahl",
+ "tip": "Aktive Erzeuger-Sitzungen auf diesem Broker.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Consumer-Anzahl",
+ "tip": "Aktive Verbraucher-Sitzungen auf diesem Broker.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Uptime",
+ "tip": "Broker-Uptime in Stunden seit letztem Neustart.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Verbindungen (Trend)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Enqueue / Dequeue Anzahl",
+ "tip": "Enqueue + Dequeue pro Minute über alle Ziele auf diesem Broker.",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "enqueue",
+ "dequeue"
+ ]
+ },
+ {
+ "title": "Producer / Consumer Zuwachs",
+ "tip": "Pro Minute neu geöffnete Producer- + Consumer-Sitzungen.",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "neue producers",
+ "neue consumers"
+ ]
+ },
+ {
+ "title": "Speichernutzung",
+ "tip": "Aggregierte Speichernutzung über alle Ziele (MB).",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Speicher-Limit",
+ "tip": "Konfigurierte Speicher-Obergrenze über alle Ziele (GB).",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Mittlere Nachrichtengröße",
+ "tip": "Durchschnittliche Nachrichtengröße über alle Ziele.",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Producer-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Consumer-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Queue-Größe",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Speichernutzung (MB)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Nachrichtenanzahl",
+ "expressions": [
+ null,
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch",
+ "abgelaufen",
+ "inflight"
+ ]
+ },
+ {
+ "title": "Enqueue-Zeit (s)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "mittel",
+ "max"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "ActiveMQ-Cluster",
+ "instances": "Broker",
+ "endpoints": "Ziele"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.es.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.es.json
new file mode 100644
index 0000000..a715d47
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.es.json
@@ -0,0 +1,174 @@
+{
+ "overview": {
+ "groups": [
+ {
+ "title": "Rendimiento",
+ "metrics": [
+ {
+ "label": "Enqueue/s",
+ "tip": "Mensajes encolados por segundo."
+ },
+ {
+ "label": "Dequeue/s",
+ "tip": "Mensajes desencolados por segundo."
+ },
+ {
+ "label": "Expirados/s",
+ "tip": "Mensajes que expiraron antes de ser consumidos."
+ }
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "instances": "Brokers",
+ "endpoints": "Destinos",
+ "services": "Clústeres de ActiveMQ"
+ },
+ "alias": "ActiveMQ",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Enqueue/s"
+ },
+ {
+ "label": "Dequeue/s"
+ },
+ {
+ "label": "Carga del sistema"
+ },
+ {
+ "label": "Hilos"
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Load average del sistema"
+ },
+ {
+ "title": "Conteo de hilos"
+ },
+ {
+ "title": "Heap usado (MB)"
+ },
+ {
+ "title": "Heap máx (MB)"
+ },
+ {
+ "title": "Enqueue / dequeue / dispatch /s",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch"
+ ]
+ },
+ {
+ "title": "Expirados /s"
+ },
+ {
+ "title": "Tiempo de enqueue",
+ "expressionLabels": [
+ "media",
+ "máx"
+ ]
+ },
+ {
+ "title": "Conteo de GC (G1+Parallel)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ },
+ {
+ "title": "Tiempo de GC (ms)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "Conexiones",
+ "tip": "Conexiones TCP/JMS actuales a este broker."
+ },
+ {
+ "title": "Conteo de productores",
+ "tip": "Sesiones de productor activas en este broker."
+ },
+ {
+ "title": "Conteo de consumidores",
+ "tip": "Sesiones de consumidor activas en este broker."
+ },
+ {
+ "title": "Uptime",
+ "tip": "Uptime del broker en horas desde el último reinicio."
+ },
+ {
+ "title": "Conexiones (tendencia)"
+ },
+ {
+ "title": "Conteo de enqueue / dequeue",
+ "tip": "Enqueue + dequeue por minuto en todos los destinos de este broker.",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue"
+ ]
+ },
+ {
+ "title": "Incremento de productores / consumidores",
+ "tip": "Sesiones de productor + consumidor nuevas abiertas por minuto.",
+ "expressionLabels": [
+ "productores nuevos",
+ "consumidores nuevos"
+ ]
+ },
+ {
+ "title": "Uso de memoria",
+ "tip": "Uso de memoria agregado en todos los destinos (MB)."
+ },
+ {
+ "title": "Límite de memoria",
+ "tip": "Tope de memoria configurado en todos los destinos (GB)."
+ },
+ {
+ "title": "Tamaño medio de mensaje",
+ "tip": "Tamaño medio de mensaje en todos los destinos."
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Conteo de productores"
+ },
+ {
+ "title": "Conteo de consumidores"
+ },
+ {
+ "title": "Tamaño de cola"
+ },
+ {
+ "title": "Uso de memoria (MB)"
+ },
+ {
+ "title": "Conteo de mensajes",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch",
+ "expirados",
+ "en curso"
+ ]
+ },
+ {
+ "title": "Tiempo de enqueue (s)",
+ "expressionLabels": [
+ "media",
+ "máx"
+ ]
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.fr.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.fr.json
new file mode 100644
index 0000000..6f2dba1
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.fr.json
@@ -0,0 +1,174 @@
+{
+ "alias": "ActiveMQ",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Enqueue/s"
+ },
+ {
+ "label": "Dequeue/s"
+ },
+ {
+ "label": "Charge système"
+ },
+ {
+ "label": "Threads"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Débit",
+ "metrics": [
+ {
+ "label": "Enqueue/s",
+ "tip": "Messages empilés par seconde."
+ },
+ {
+ "label": "Dequeue/s",
+ "tip": "Messages dépilés par seconde."
+ },
+ {
+ "label": "Expirés/s",
+ "tip": "Messages expirés avant consommation."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Load average système"
+ },
+ {
+ "title": "Nombre de threads"
+ },
+ {
+ "title": "Heap utilisé (Mo)"
+ },
+ {
+ "title": "Heap max (Mo)"
+ },
+ {
+ "title": "Enqueue / Dequeue / Dispatch /s",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch"
+ ]
+ },
+ {
+ "title": "Expirés /s"
+ },
+ {
+ "title": "Temps d'enqueue",
+ "expressionLabels": [
+ "moy",
+ "max"
+ ]
+ },
+ {
+ "title": "Nombre de GC (G1+Parallèle)",
+ "expressionLabels": [
+ "ancien",
+ "young"
+ ]
+ },
+ {
+ "title": "Temps GC (ms)",
+ "expressionLabels": [
+ "ancien",
+ "young"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "Connexions",
+ "tip": "Connexions TCP/JMS courantes vers ce broker."
+ },
+ {
+ "title": "Nombre de producers",
+ "tip": "Sessions producteur actives sur ce broker."
+ },
+ {
+ "title": "Nombre de consumers",
+ "tip": "Sessions consommateur actives sur ce broker."
+ },
+ {
+ "title": "Disponibilité",
+ "tip": "Disponibilité du broker en heures depuis le dernier redémarrage."
+ },
+ {
+ "title": "Connexions (tendance)"
+ },
+ {
+ "title": "Nombre d'enqueue / dequeue",
+ "tip": "Enqueue + dequeue par minute sur l'ensemble des destinations de ce broker.",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue"
+ ]
+ },
+ {
+ "title": "Augmentation producer / consumer",
+ "tip": "Nouvelles sessions producer + consumer ouvertes par minute.",
+ "expressionLabels": [
+ "nouveaux producers",
+ "nouveaux consumers"
+ ]
+ },
+ {
+ "title": "Utilisation mémoire",
+ "tip": "Utilisation mémoire agrégée sur l'ensemble des destinations (Mo)."
+ },
+ {
+ "title": "Limite mémoire",
+ "tip": "Plafond mémoire configuré sur l'ensemble des destinations (Go)."
+ },
+ {
+ "title": "Taille de message moyenne",
+ "tip": "Taille moyenne des messages sur l'ensemble des destinations."
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Nombre de producers"
+ },
+ {
+ "title": "Nombre de consumers"
+ },
+ {
+ "title": "Taille de la file"
+ },
+ {
+ "title": "Utilisation mémoire (Mo)"
+ },
+ {
+ "title": "Nombre de messages",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch",
+ "expirés",
+ "en vol"
+ ]
+ },
+ {
+ "title": "Temps d'enqueue (s)",
+ "expressionLabels": [
+ "moy",
+ "max"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "Clusters ActiveMQ",
+ "instances": "Brokers",
+ "endpoints": "Destinations"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.ja.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.ja.json
new file mode 100644
index 0000000..b82677c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.ja.json
@@ -0,0 +1,174 @@
+{
+ "alias": "ActiveMQ",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "エンキュー/s"
+ },
+ {
+ "label": "デキュー/s"
+ },
+ {
+ "label": "システム負荷"
+ },
+ {
+ "label": "スレッド"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "スループット",
+ "metrics": [
+ {
+ "label": "エンキュー/s",
+ "tip": "1秒あたりのエンキューメッセージ数。"
+ },
+ {
+ "label": "デキュー/s",
+ "tip": "1秒あたりのデキューメッセージ数。"
+ },
+ {
+ "label": "期限切れ/s",
+ "tip": "コンシューム前に期限切れとなったメッセージ。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "システムロードアベレージ"
+ },
+ {
+ "title": "スレッド数"
+ },
+ {
+ "title": "ヒープ使用中 (MB)"
+ },
+ {
+ "title": "ヒープ最大 (MB)"
+ },
+ {
+ "title": "エンキュー / デキュー / ディスパッチ /s",
+ "expressionLabels": [
+ "エンキュー",
+ "デキュー",
+ "ディスパッチ"
+ ]
+ },
+ {
+ "title": "期限切れ /s"
+ },
+ {
+ "title": "エンキュー時間",
+ "expressionLabels": [
+ "平均",
+ "最大"
+ ]
+ },
+ {
+ "title": "GC 回数 (G1+Parallel)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ },
+ {
+ "title": "GC 時間 (ms)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "接続",
+ "tip": "この Broker への現在の TCP/JMS 接続数。"
+ },
+ {
+ "title": "プロデューサー数",
+ "tip": "この Broker のアクティブなプロデューサーセッション。"
+ },
+ {
+ "title": "コンシューマー数",
+ "tip": "この Broker のアクティブなコンシューマーセッション。"
+ },
+ {
+ "title": "稼働時間",
+ "tip": "前回の再起動からの Broker 稼働時間(時間単位)。"
+ },
+ {
+ "title": "接続 (傾向)"
+ },
+ {
+ "title": "エンキュー / デキュー件数",
+ "tip": "この Broker の宛先全体での 1分あたりエンキュー + デキュー。",
+ "expressionLabels": [
+ "エンキュー",
+ "デキュー"
+ ]
+ },
+ {
+ "title": "プロデューサー / コンシューマー増分",
+ "tip": "1分あたりに開かれた新規プロデューサー + コンシューマーセッション。",
+ "expressionLabels": [
+ "新規プロデューサー",
+ "新規コンシューマー"
+ ]
+ },
+ {
+ "title": "メモリ使用率",
+ "tip": "宛先全体のメモリ使用量合計 (MB)。"
+ },
+ {
+ "title": "メモリ上限",
+ "tip": "宛先全体の設定メモリ上限 (GB)。"
+ },
+ {
+ "title": "平均メッセージサイズ",
+ "tip": "宛先全体での平均メッセージサイズ。"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "プロデューサー数"
+ },
+ {
+ "title": "コンシューマー数"
+ },
+ {
+ "title": "キューサイズ"
+ },
+ {
+ "title": "メモリ使用量 (MB)"
+ },
+ {
+ "title": "メッセージ数",
+ "expressionLabels": [
+ "エンキュー",
+ "デキュー",
+ "ディスパッチ",
+ "期限切れ",
+ "処理中"
+ ]
+ },
+ {
+ "title": "エンキュー時間 (s)",
+ "expressionLabels": [
+ "平均",
+ "最大"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "ActiveMQ クラスタ",
+ "instances": "Broker",
+ "endpoints": "宛先"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.ko.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.ko.json
new file mode 100644
index 0000000..f4fa78f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.ko.json
@@ -0,0 +1,174 @@
+{
+ "alias": "ActiveMQ",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Enqueue/s"
+ },
+ {
+ "label": "Dequeue/s"
+ },
+ {
+ "label": "시스템 부하"
+ },
+ {
+ "label": "스레드"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "처리량",
+ "metrics": [
+ {
+ "label": "Enqueue/s",
+ "tip": "초당 Enqueue 된 메시지 수입니다."
+ },
+ {
+ "label": "Dequeue/s",
+ "tip": "초당 Dequeue 된 메시지 수입니다."
+ },
+ {
+ "label": "Expired/s",
+ "tip": "소비되기 전에 만료된 메시지입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "시스템 부하 평균"
+ },
+ {
+ "title": "스레드 수"
+ },
+ {
+ "title": "Heap 사용 (MB)"
+ },
+ {
+ "title": "Heap 최대 (MB)"
+ },
+ {
+ "title": "Enqueue / Dequeue / Dispatch /s",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch"
+ ]
+ },
+ {
+ "title": "만료 /s"
+ },
+ {
+ "title": "Enqueue 시간",
+ "expressionLabels": [
+ "평균",
+ "최대"
+ ]
+ },
+ {
+ "title": "GC 수 (G1+Parallel)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ },
+ {
+ "title": "GC 시간 (ms)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "연결",
+ "tip": "이 브로커에 대한 현재 TCP/JMS 연결 수입니다."
+ },
+ {
+ "title": "생산자 수",
+ "tip": "이 브로커의 활성 생산자 세션 수입니다."
+ },
+ {
+ "title": "소비자 수",
+ "tip": "이 브로커의 활성 소비자 세션 수입니다."
+ },
+ {
+ "title": "가동 시간",
+ "tip": "마지막 재시작 이후 브로커 가동 시간(시간 단위)입니다."
+ },
+ {
+ "title": "연결 (추세)"
+ },
+ {
+ "title": "Enqueue / Dequeue 수",
+ "tip": "이 브로커의 대상별 분당 Enqueue + Dequeue 입니다.",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue"
+ ]
+ },
+ {
+ "title": "생산자 / 소비자 증가",
+ "tip": "분당 새로 열리는 생산자 + 소비자 세션 수입니다.",
+ "expressionLabels": [
+ "새 생산자",
+ "새 소비자"
+ ]
+ },
+ {
+ "title": "메모리 사용량",
+ "tip": "대상별 총 메모리 사용량 (MB)입니다."
+ },
+ {
+ "title": "메모리 제한",
+ "tip": "대상별로 설정된 메모리 상한 (GB)입니다."
+ },
+ {
+ "title": "평균 메시지 크기",
+ "tip": "대상 간 평균 메시지 크기입니다."
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "생산자 수"
+ },
+ {
+ "title": "소비자 수"
+ },
+ {
+ "title": "큐 크기"
+ },
+ {
+ "title": "메모리 사용량 (MB)"
+ },
+ {
+ "title": "메시지 수",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch",
+ "만료",
+ "inflight"
+ ]
+ },
+ {
+ "title": "Enqueue 시간 (s)",
+ "expressionLabels": [
+ "평균",
+ "최대"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "ActiveMQ 클러스터",
+ "instances": "Broker",
+ "endpoints": "대상"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.pt.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.pt.json
new file mode 100644
index 0000000..e64e752
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.pt.json
@@ -0,0 +1,174 @@
+{
+ "alias": "ActiveMQ",
+ "group": "MQ",
+ "slots": {
+ "services": "Clusters do ActiveMQ",
+ "instances": "Brokers",
+ "endpoints": "Destinos"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Enqueue/s"
+ },
+ {
+ "label": "Dequeue/s"
+ },
+ {
+ "label": "Carga do sistema"
+ },
+ {
+ "label": "Threads"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Vazão",
+ "metrics": [
+ {
+ "label": "Enqueue/s",
+ "tip": "Mensagens enfileiradas por segundo."
+ },
+ {
+ "label": "Dequeue/s",
+ "tip": "Mensagens desenfileiradas por segundo."
+ },
+ {
+ "label": "Expiradas/s",
+ "tip": "Mensagens que expiraram antes de serem consumidas."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Média de carga do sistema"
+ },
+ {
+ "title": "Quantidade de threads"
+ },
+ {
+ "title": "Heap usado (MB)"
+ },
+ {
+ "title": "Heap máximo (MB)"
+ },
+ {
+ "title": "Enqueue / Dequeue / Dispatch /s",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch"
+ ]
+ },
+ {
+ "title": "Expiradas /s"
+ },
+ {
+ "title": "Tempo de enqueue",
+ "expressionLabels": [
+ "média",
+ "máx"
+ ]
+ },
+ {
+ "title": "Contagem de GC (G1+Parallel)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ },
+ {
+ "title": "Tempo de GC (ms)",
+ "expressionLabels": [
+ "old",
+ "young"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "Conexões",
+ "tip": "Conexões TCP/JMS atuais com este broker."
+ },
+ {
+ "title": "Quantidade de produtores",
+ "tip": "Sessões de produtor ativas neste broker."
+ },
+ {
+ "title": "Quantidade de consumidores",
+ "tip": "Sessões de consumidor ativas neste broker."
+ },
+ {
+ "title": "Uptime",
+ "tip": "Tempo de atividade do broker em horas desde o último reinício."
+ },
+ {
+ "title": "Conexões (tendência)"
+ },
+ {
+ "title": "Contagem de enqueue / dequeue",
+ "tip": "Enqueue + dequeue por minuto entre os destinos deste broker.",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue"
+ ]
+ },
+ {
+ "title": "Aumento de produtores / consumidores",
+ "tip": "Novas sessões de produtor + consumidor abertas por minuto.",
+ "expressionLabels": [
+ "novos produtores",
+ "novos consumidores"
+ ]
+ },
+ {
+ "title": "Uso de memória",
+ "tip": "Uso de memória agregado entre os destinos (MB)."
+ },
+ {
+ "title": "Limite de memória",
+ "tip": "Teto de memória configurado entre os destinos (GB)."
+ },
+ {
+ "title": "Tamanho médio de mensagem",
+ "tip": "Tamanho médio de mensagem entre os destinos."
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Quantidade de produtores"
+ },
+ {
+ "title": "Quantidade de consumidores"
+ },
+ {
+ "title": "Tamanho da fila"
+ },
+ {
+ "title": "Uso de memória (MB)"
+ },
+ {
+ "title": "Contagem de mensagens",
+ "expressionLabels": [
+ "enqueue",
+ "dequeue",
+ "dispatch",
+ "expiradas",
+ "em trânsito"
+ ]
+ },
+ {
+ "title": "Tempo de enqueue (s)",
+ "expressionLabels": [
+ "média",
+ "máx"
+ ]
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/activemq.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/activemq.i18n.zh-CN.json
new file mode 100644
index 0000000..c65c8d5
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/activemq.i18n.zh-CN.json
@@ -0,0 +1,87 @@
+{
+ "group": "MQ",
+ "slots": {
+ "services": "ActiveMQ 集群",
+ "instances": "Broker",
+ "endpoints": "目的地"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "入队/秒" },
+ { "label": "出队/秒" },
+ { "label": "系统负载" },
+ { "label": "线程数" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "吞吐量",
+ "metrics": [
+ { "label": "入队/秒", "tip": "每秒入队的消息数。" },
+ { "label": "出队/秒", "tip": "每秒出队的消息数。" },
+ { "label": "过期/秒", "tip": "在被消费前过期的消息数。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "系统平均负载" },
+ { "title": "线程数" },
+ { "title": "Heap 已用(MB)" },
+ { "title": "Heap 最大值(MB)" },
+ {
+ "title": "入队 / 出队 / 派发 每秒",
+ "expressionLabels": ["enqueue", "dequeue", "dispatch"]
+ },
+ { "title": "过期数 每秒" },
+ {
+ "title": "入队耗时",
+ "expressionLabels": ["avg", "max"]
+ },
+ {
+ "title": "GC 次数(G1+Parallel)",
+ "expressionLabels": ["old", "young"]
+ },
+ {
+ "title": "GC 时间(ms)",
+ "expressionLabels": ["old", "young"]
+ }
+ ],
+ "instance": [
+ { "title": "连接数", "tip": "当前到此 Broker 的 TCP/JMS 连接数。" },
+ { "title": "Producer 数量", "tip": "此 Broker 上活跃的 Producer 会话数。" },
+ { "title": "Consumer 数量", "tip": "此 Broker 上活跃的 Consumer 会话数。" },
+ { "title": "运行时长", "tip": "自上次重启以来 Broker 的运行小时数。" },
+ { "title": "连接数(趋势)" },
+ {
+ "title": "入队 / 出队次数",
+ "tip": "此 Broker 上各目的地每分钟的入队 + 出队次数。",
+ "expressionLabels": ["enqueue", "dequeue"]
+ },
+ {
+ "title": "Producer / Consumer 增长",
+ "tip": "每分钟新建的 Producer + Consumer 会话数。",
+ "expressionLabels": ["新 Producer", "新 Consumer"]
+ },
+ { "title": "内存使用", "tip": "各目的地的总内存使用(MB)。" },
+ { "title": "内存上限", "tip": "各目的地配置的内存上限(GB)。" },
+ { "title": "平均消息大小", "tip": "各目的地的平均消息大小。" }
+ ],
+ "endpoint": [
+ { "title": "Producer 数量" },
+ { "title": "Consumer 数量" },
+ { "title": "队列大小" },
+ { "title": "内存使用(MB)" },
+ {
+ "title": "消息计数",
+ "expressionLabels": ["enqueue", "dequeue", "dispatch", "expired", "inflight"]
+ },
+ {
+ "title": "入队耗时(s)",
+ "expressionLabels": ["avg", "max"]
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.de.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.de.json
new file mode 100644
index 0000000..949769e
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.de.json
@@ -0,0 +1,142 @@
+{
+ "alias": "Alipay Mini-Programm",
+ "group": "Mobil",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Anfrage-RPM"
+ },
+ {
+ "label": "Start"
+ },
+ {
+ "label": "First Render"
+ },
+ {
+ "label": "Fehler"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Latenz & Fehler",
+ "metrics": [
+ {
+ "label": "Anfrage-P95",
+ "tip": "95. Perzentil der Anfragedauer über die Mini-Programm-Netzwerk-Bridge."
+ },
+ {
+ "label": "Start",
+ "tip": "Ungefähre Mini-Programm-Startdauer."
+ },
+ {
+ "label": "Fehler",
+ "tip": "Gemeldete Fehleranzahl."
+ }
+ ]
+ },
+ {
+ "title": "Durchsatz",
+ "metrics": [
+ {
+ "label": "Anfrage-RPM",
+ "tip": "Bridge-Anfragen pro Minute."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "App-Startdauer",
+ "tip": "Ungefähre Kaltstartdauer aus dem Alipay-Container.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "First-Render-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Fehleranzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Anfragelast",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Anfragedauer-Perzentil",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "Startdauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "First-Render-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Anfragelast",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Anfragedauer-Perzentil",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Startdauer auf Seite",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "First-Render-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Anfragelast",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Anfragedauer-Perzentil",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "Mini-Programme",
+ "instances": "Versionen",
+ "endpoints": "Seiten"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.es.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.es.json
new file mode 100644
index 0000000..6e883eb
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.es.json
@@ -0,0 +1,103 @@
+{
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPM de peticiones"
+ },
+ {
+ "label": "Lanzamiento"
+ },
+ {
+ "label": "Primer render"
+ },
+ {
+ "label": "Errores"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Latencia y errores",
+ "metrics": [
+ {
+ "label": "Petición P95",
+ "tip": "Duración de petición en el percentil 95 desde el puente de red del mini programa."
+ },
+ {
+ "label": "Lanzamiento",
+ "tip": "Duración aproximada del lanzamiento del mini programa."
+ },
+ {
+ "label": "Errores",
+ "tip": "Conteo de errores reportados."
+ }
+ ]
+ },
+ {
+ "title": "Rendimiento",
+ "metrics": [
+ {
+ "label": "RPM de peticiones",
+ "tip": "Peticiones del puente por minuto."
+ }
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "instances": "Versiones",
+ "endpoints": "Páginas",
+ "services": "Mini programas"
+ },
+ "alias": "Mini programa de Alipay",
+ "group": "Móvil",
+ "dashboards": {
+ "service": [
+ {
+ "title": "Duración del lanzamiento de la app",
+ "tip": "Duración aproximada del arranque en frío desde el contenedor de Alipay."
+ },
+ {
+ "title": "Duración del primer render"
+ },
+ {
+ "title": "Conteo de errores"
+ },
+ {
+ "title": "Carga de peticiones"
+ },
+ {
+ "title": "Percentil de duración de peticiones"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Duración del lanzamiento"
+ },
+ {
+ "title": "Duración del primer render"
+ },
+ {
+ "title": "Carga de peticiones"
+ },
+ {
+ "title": "Percentil de duración de peticiones"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Duración del lanzamiento en la página"
+ },
+ {
+ "title": "Duración del primer render"
+ },
+ {
+ "title": "Carga de peticiones"
+ },
+ {
+ "title": "Percentil de duración de peticiones"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.fr.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.fr.json
new file mode 100644
index 0000000..5cb9095
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.fr.json
@@ -0,0 +1,103 @@
+{
+ "alias": "Mini-programme Alipay",
+ "group": "Mobile",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPM des requêtes"
+ },
+ {
+ "label": "Lancement"
+ },
+ {
+ "label": "Premier rendu"
+ },
+ {
+ "label": "Erreurs"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Latence et erreurs",
+ "metrics": [
+ {
+ "label": "P95 des requêtes",
+ "tip": "Durée de requête au 95e centile depuis le bridge réseau du mini-programme."
+ },
+ {
+ "label": "Lancement",
+ "tip": "Durée approximative de lancement du mini-programme."
+ },
+ {
+ "label": "Erreurs",
+ "tip": "Nombre d'erreurs remontées."
+ }
+ ]
+ },
+ {
+ "title": "Débit",
+ "metrics": [
+ {
+ "label": "RPM des requêtes",
+ "tip": "Requêtes via le bridge par minute."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Durée de lancement de l'app",
+ "tip": "Durée approximative de lancement à froid depuis le conteneur Alipay."
+ },
+ {
+ "title": "Durée du premier rendu"
+ },
+ {
+ "title": "Nombre d'erreurs"
+ },
+ {
+ "title": "Charge de requêtes"
+ },
+ {
+ "title": "Centile de durée de requête"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Durée de lancement"
+ },
+ {
+ "title": "Durée du premier rendu"
+ },
+ {
+ "title": "Charge de requêtes"
+ },
+ {
+ "title": "Centile de durée de requête"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Durée de lancement sur la page"
+ },
+ {
+ "title": "Durée du premier rendu"
+ },
+ {
+ "title": "Charge de requêtes"
+ },
+ {
+ "title": "Centile de durée de requête"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Mini-programmes",
+ "instances": "Versions",
+ "endpoints": "Pages"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ja.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ja.json
new file mode 100644
index 0000000..739a4b6
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ja.json
@@ -0,0 +1,103 @@
+{
+ "alias": "Alipay ミニプログラム",
+ "group": "モバイル",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "リクエスト RPM"
+ },
+ {
+ "label": "起動"
+ },
+ {
+ "label": "初回描画"
+ },
+ {
+ "label": "エラー"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "レイテンシとエラー",
+ "metrics": [
+ {
+ "label": "リクエスト P95",
+ "tip": "ミニプログラムネットワークブリッジからのリクエスト所要時間の 95 パーセンタイル。"
+ },
+ {
+ "label": "起動",
+ "tip": "ミニプログラムの概算起動所要時間。"
+ },
+ {
+ "label": "エラー",
+ "tip": "報告されたエラー件数。"
+ }
+ ]
+ },
+ {
+ "title": "スループット",
+ "metrics": [
+ {
+ "label": "リクエスト RPM",
+ "tip": "1分あたりのブリッジリクエスト数。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "アプリ起動所要時間",
+ "tip": "Alipay コンテナからの概算コールド起動所要時間。"
+ },
+ {
+ "title": "初回描画所要時間"
+ },
+ {
+ "title": "エラー件数"
+ },
+ {
+ "title": "リクエスト負荷"
+ },
+ {
+ "title": "リクエスト所要時間パーセンタイル"
+ }
+ ],
+ "instance": [
+ {
+ "title": "起動所要時間"
+ },
+ {
+ "title": "初回描画所要時間"
+ },
+ {
+ "title": "リクエスト負荷"
+ },
+ {
+ "title": "リクエスト所要時間パーセンタイル"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "ページ単位の起動所要時間"
+ },
+ {
+ "title": "初回描画所要時間"
+ },
+ {
+ "title": "リクエスト負荷"
+ },
+ {
+ "title": "リクエスト所要時間パーセンタイル"
+ }
+ ]
+ },
+ "slots": {
+ "services": "ミニプログラム",
+ "instances": "バージョン",
+ "endpoints": "ページ"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ko.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ko.json
new file mode 100644
index 0000000..1a5e4db
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.ko.json
@@ -0,0 +1,103 @@
+{
+ "alias": "Alipay 미니프로그램",
+ "group": "모바일",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "요청 RPM"
+ },
+ {
+ "label": "실행"
+ },
+ {
+ "label": "최초 렌더"
+ },
+ {
+ "label": "오류"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "지연 시간 및 오류",
+ "metrics": [
+ {
+ "label": "요청 P95",
+ "tip": "미니 프로그램 네트워크 브리지의 95번째 백분위 요청 시간입니다."
+ },
+ {
+ "label": "실행",
+ "tip": "대략적인 미니 프로그램 실행 시간입니다."
+ },
+ {
+ "label": "오류",
+ "tip": "보고된 오류 수입니다."
+ }
+ ]
+ },
+ {
+ "title": "처리량",
+ "metrics": [
+ {
+ "label": "요청 RPM",
+ "tip": "브리지의 분당 요청 수입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "앱 실행 시간",
+ "tip": "알리페이 컨테이너의 대략적인 콜드 런치 시간입니다."
+ },
+ {
+ "title": "최초 렌더 시간"
+ },
+ {
+ "title": "오류 수"
+ },
+ {
+ "title": "요청 부하"
+ },
+ {
+ "title": "요청 시간 백분위"
+ }
+ ],
+ "instance": [
+ {
+ "title": "실행 시간"
+ },
+ {
+ "title": "최초 렌더 시간"
+ },
+ {
+ "title": "요청 부하"
+ },
+ {
+ "title": "요청 시간 백분위"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "페이지의 실행 시간"
+ },
+ {
+ "title": "최초 렌더 시간"
+ },
+ {
+ "title": "요청 부하"
+ },
+ {
+ "title": "요청 시간 백분위"
+ }
+ ]
+ },
+ "slots": {
+ "services": "미니 프로그램",
+ "instances": "버전",
+ "endpoints": "페이지"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.pt.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.pt.json
new file mode 100644
index 0000000..5b16a8c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.pt.json
@@ -0,0 +1,103 @@
+{
+ "alias": "Mini Programa do Alipay",
+ "group": "Móvel",
+ "slots": {
+ "services": "Mini programas",
+ "instances": "Versões",
+ "endpoints": "Páginas"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPM de requisições"
+ },
+ {
+ "label": "Inicialização"
+ },
+ {
+ "label": "Primeira renderização"
+ },
+ {
+ "label": "Erros"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Latência e erros",
+ "metrics": [
+ {
+ "label": "Requisição P95",
+ "tip": "Duração da requisição no percentil 95 a partir da ponte de rede do mini programa."
+ },
+ {
+ "label": "Inicialização",
+ "tip": "Duração aproximada de inicialização do mini programa."
+ },
+ {
+ "label": "Erros",
+ "tip": "Contagem de erros reportados."
+ }
+ ]
+ },
+ {
+ "title": "Vazão",
+ "metrics": [
+ {
+ "label": "RPM de requisições",
+ "tip": "Requisições da ponte por minuto."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Duração da inicialização do app",
+ "tip": "Duração aproximada do cold-start a partir do contêiner do Alipay."
+ },
+ {
+ "title": "Duração da primeira renderização"
+ },
+ {
+ "title": "Contagem de erros"
+ },
+ {
+ "title": "Carga de requisições"
+ },
+ {
+ "title": "Percentil de duração das requisições"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Duração da inicialização"
+ },
+ {
+ "title": "Duração da primeira renderização"
+ },
+ {
+ "title": "Carga de requisições"
+ },
+ {
+ "title": "Percentil de duração das requisições"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Duração da inicialização na página"
+ },
+ {
+ "title": "Duração da primeira renderização"
+ },
+ {
+ "title": "Carga de requisições"
+ },
+ {
+ "title": "Percentil de duração das requisições"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.zh-CN.json
new file mode 100644
index 0000000..ff8edfb
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/alipay_mini_program.i18n.zh-CN.json
@@ -0,0 +1,56 @@
+{
+ "alias": "支付宝小程序",
+ "group": "移动",
+ "slots": {
+ "services": "小程序",
+ "instances": "版本",
+ "endpoints": "页面"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "请求 RPM" },
+ { "label": "启动" },
+ { "label": "首屏渲染" },
+ { "label": "错误" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "延迟与错误",
+ "metrics": [
+ { "label": "请求 P95", "tip": "来自小程序网络桥的 95 分位请求耗时。" },
+ { "label": "启动", "tip": "小程序大致启动耗时。" },
+ { "label": "错误", "tip": "上报的错误次数。" }
+ ]
+ },
+ {
+ "title": "吞吐量",
+ "metrics": [
+ { "label": "请求 RPM", "tip": "桥每分钟的请求数。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "应用启动耗时", "tip": "来自支付宝容器的大致冷启动耗时。" },
+ { "title": "首屏渲染耗时" },
+ { "title": "错误数" },
+ { "title": "请求负载" },
+ { "title": "请求耗时分位" }
+ ],
+ "instance": [
+ { "title": "启动耗时" },
+ { "title": "首屏渲染耗时" },
+ { "title": "请求负载" },
+ { "title": "请求耗时分位" }
+ ],
+ "endpoint": [
+ { "title": "页面启动耗时" },
+ { "title": "首屏渲染耗时" },
+ { "title": "请求负载" },
+ { "title": "请求耗时分位" }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.de.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.de.json
new file mode 100644
index 0000000..7632905
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.de.json
@@ -0,0 +1,184 @@
+{
+ "alias": "APISIX",
+ "group": "Gateways",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPS"
+ },
+ {
+ "label": "200/s"
+ },
+ {
+ "label": "404/s"
+ },
+ {
+ "label": "503/s"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Durchsatz",
+ "metrics": [
+ {
+ "label": "RPS",
+ "tip": "Anfragen pro Sekunde, die von APISIX-Routen getroffen wurden."
+ },
+ {
+ "label": "5xx",
+ "tip": "Upstream- / Gateway-Fehlerklasse."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "HTTP-Request-Trend",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Status-Trend",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Latenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Bandbreite",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Verbindungen",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Status-Trend ohne Treffer",
+ "tip": "Anfragen ohne passende APISIX-Route.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Latenz ohne Treffer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Bandbreite ohne Treffer",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "HTTP-Request-Trend",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Status-Trend",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Latenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Bandbreite",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Verbindungen",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Shared Dict",
+ "tip": "Kapazität vs. freier Speicher.",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "kapazität",
+ "frei"
+ ]
+ },
+ {
+ "title": "etcd",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "indizes",
+ "erreichbar"
+ ]
+ },
+ {
+ "title": "Traffic ohne Treffer",
+ "tip": "Status + Latenz + Bandbreite für Anfragen ohne passende Route.",
+ "expressions": [
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "status",
+ "latenz (ms)",
+ "bandbreite (KB)"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "HTTP-Status-Trend",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Latenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Bandbreite",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "APISIX-Dienste",
+ "instances": "Knoten",
+ "endpoints": "Routes"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.es.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.es.json
new file mode 100644
index 0000000..8f21fd8
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.es.json
@@ -0,0 +1,123 @@
+{
+ "overview": {
+ "groups": [
+ {
+ "title": "Rendimiento",
+ "metrics": [
+ {
+ "label": "RPS",
+ "tip": "Peticiones por segundo coincidentes con rutas de APISIX."
+ },
+ {
+ "label": "5xx",
+ "tip": "Clase de error upstream / gateway."
+ }
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "instances": "Nodos",
+ "services": "Servicios de APISIX",
+ "endpoints": "Rutas"
+ },
+ "group": "Gateways",
+ "alias": "APISIX",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPS"
+ },
+ {
+ "label": "200/s"
+ },
+ {
+ "label": "404/s"
+ },
+ {
+ "label": "503/s"
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Tendencia de peticiones HTTP"
+ },
+ {
+ "title": "Tendencia de estado HTTP"
+ },
+ {
+ "title": "Latencia HTTP"
+ },
+ {
+ "title": "Ancho de banda HTTP"
+ },
+ {
+ "title": "Conexiones HTTP"
+ },
+ {
+ "title": "Tendencia de estado sin coincidencia",
+ "tip": "Peticiones sin ruta APISIX coincidente."
+ },
+ {
+ "title": "Latencia sin coincidencia"
+ },
+ {
+ "title": "Ancho de banda sin coincidencia"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Tendencia de peticiones HTTP"
+ },
+ {
+ "title": "Tendencia de estado HTTP"
+ },
+ {
+ "title": "Latencia HTTP"
+ },
+ {
+ "title": "Ancho de banda HTTP"
+ },
+ {
+ "title": "Conexiones HTTP"
+ },
+ {
+ "title": "Diccionario compartido",
+ "tip": "Capacidad vs espacio libre.",
+ "expressionLabels": [
+ "capacidad",
+ "libre"
+ ]
+ },
+ {
+ "title": "etcd",
+ "expressionLabels": [
+ "índices",
+ "accesible"
+ ]
+ },
+ {
+ "title": "Tráfico sin coincidencia",
+ "tip": "Estado + latencia + ancho de banda para peticiones sin ruta coincidente.",
+ "expressionLabels": [
+ "estado",
+ "latencia (ms)",
+ "ancho de banda (KB)"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Tendencia de estado HTTP"
+ },
+ {
+ "title": "Latencia HTTP"
+ },
+ {
+ "title": "Ancho de banda HTTP"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.fr.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.fr.json
new file mode 100644
index 0000000..48abde5
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.fr.json
@@ -0,0 +1,123 @@
+{
+ "alias": "APISIX",
+ "group": "Passerelles",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPS"
+ },
+ {
+ "label": "200/s"
+ },
+ {
+ "label": "404/s"
+ },
+ {
+ "label": "503/s"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Débit",
+ "metrics": [
+ {
+ "label": "RPS",
+ "tip": "Requêtes par seconde matchées par les routes APISIX."
+ },
+ {
+ "label": "5xx",
+ "tip": "Classe d'erreur upstream / passerelle."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Tendance des requêtes HTTP"
+ },
+ {
+ "title": "Tendance des statuts HTTP"
+ },
+ {
+ "title": "Latence HTTP"
+ },
+ {
+ "title": "Bande passante HTTP"
+ },
+ {
+ "title": "Connexions HTTP"
+ },
+ {
+ "title": "Tendance des statuts non matchés",
+ "tip": "Requêtes sans route APISIX correspondante."
+ },
+ {
+ "title": "Latence non matchée"
+ },
+ {
+ "title": "Bande passante non matchée"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Tendance des requêtes HTTP"
+ },
+ {
+ "title": "Tendance des statuts HTTP"
+ },
+ {
+ "title": "Latence HTTP"
+ },
+ {
+ "title": "Bande passante HTTP"
+ },
+ {
+ "title": "Connexions HTTP"
+ },
+ {
+ "title": "Dict partagé",
+ "tip": "Capacité vs espace libre.",
+ "expressionLabels": [
+ "capacité",
+ "libre"
+ ]
+ },
+ {
+ "title": "etcd",
+ "expressionLabels": [
+ "index",
+ "joignable"
+ ]
+ },
+ {
+ "title": "Trafic non matché",
+ "tip": "Statut + latence + bande passante pour les requêtes sans route correspondante.",
+ "expressionLabels": [
+ "statut",
+ "latence (ms)",
+ "bande passante (Ko)"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Tendance des statuts HTTP"
+ },
+ {
+ "title": "Latence HTTP"
+ },
+ {
+ "title": "Bande passante HTTP"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Services APISIX",
+ "instances": "Nœuds",
+ "endpoints": "Routes"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.ja.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.ja.json
new file mode 100644
index 0000000..cffd66c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.ja.json
@@ -0,0 +1,123 @@
+{
+ "alias": "APISIX",
+ "group": "ゲートウェイ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPS"
+ },
+ {
+ "label": "200/s"
+ },
+ {
+ "label": "404/s"
+ },
+ {
+ "label": "503/s"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "スループット",
+ "metrics": [
+ {
+ "label": "RPS",
+ "tip": "APISIX ルートにマッチした 1秒あたりのリクエスト数。"
+ },
+ {
+ "label": "5xx",
+ "tip": "アップストリーム / ゲートウェイエラークラス。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "HTTP リクエスト傾向"
+ },
+ {
+ "title": "HTTP ステータス傾向"
+ },
+ {
+ "title": "HTTP レイテンシ"
+ },
+ {
+ "title": "HTTP 帯域"
+ },
+ {
+ "title": "HTTP 接続"
+ },
+ {
+ "title": "未マッチステータス傾向",
+ "tip": "APISIX ルートにマッチしないリクエスト。"
+ },
+ {
+ "title": "未マッチレイテンシ"
+ },
+ {
+ "title": "未マッチ帯域"
+ }
+ ],
+ "instance": [
+ {
+ "title": "HTTP リクエスト傾向"
+ },
+ {
+ "title": "HTTP ステータス傾向"
+ },
+ {
+ "title": "HTTP レイテンシ"
+ },
+ {
+ "title": "HTTP 帯域"
+ },
+ {
+ "title": "HTTP 接続"
+ },
+ {
+ "title": "Shared Dict",
+ "tip": "キャパシティ vs 空き容量。",
+ "expressionLabels": [
+ "容量",
+ "空き"
+ ]
+ },
+ {
+ "title": "etcd",
+ "expressionLabels": [
+ "インデックス",
+ "到達可能"
+ ]
+ },
+ {
+ "title": "未マッチトラフィック",
+ "tip": "ルートにマッチしないリクエストのステータス + レイテンシ + 帯域。",
+ "expressionLabels": [
+ "ステータス",
+ "レイテンシ (ms)",
+ "帯域 (KB)"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "HTTP ステータス傾向"
+ },
+ {
+ "title": "HTTP レイテンシ"
+ },
+ {
+ "title": "HTTP 帯域"
+ }
+ ]
+ },
+ "slots": {
+ "services": "APISIX サービス",
+ "instances": "ノード",
+ "endpoints": "ルート"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.ko.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.ko.json
new file mode 100644
index 0000000..5b7fff1
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.ko.json
@@ -0,0 +1,123 @@
+{
+ "alias": "APISIX",
+ "group": "게이트웨이",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPS"
+ },
+ {
+ "label": "200/s"
+ },
+ {
+ "label": "404/s"
+ },
+ {
+ "label": "503/s"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "처리량",
+ "metrics": [
+ {
+ "label": "RPS",
+ "tip": "APISIX 라우트가 매칭한 초당 요청 수입니다."
+ },
+ {
+ "label": "5xx",
+ "tip": "업스트림 / 게이트웨이 오류 클래스입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "HTTP 요청 추세"
+ },
+ {
+ "title": "HTTP 상태 추세"
+ },
+ {
+ "title": "HTTP 지연 시간"
+ },
+ {
+ "title": "HTTP 대역폭"
+ },
+ {
+ "title": "HTTP 연결"
+ },
+ {
+ "title": "매칭되지 않은 상태 추세",
+ "tip": "매칭되는 APISIX 라우트가 없는 요청입니다."
+ },
+ {
+ "title": "매칭되지 않은 지연 시간"
+ },
+ {
+ "title": "매칭되지 않은 대역폭"
+ }
+ ],
+ "instance": [
+ {
+ "title": "HTTP 요청 추세"
+ },
+ {
+ "title": "HTTP 상태 추세"
+ },
+ {
+ "title": "HTTP 지연 시간"
+ },
+ {
+ "title": "HTTP 대역폭"
+ },
+ {
+ "title": "HTTP 연결"
+ },
+ {
+ "title": "공유 사전",
+ "tip": "용량과 여유 공간 비교.",
+ "expressionLabels": [
+ "용량",
+ "여유"
+ ]
+ },
+ {
+ "title": "etcd",
+ "expressionLabels": [
+ "인덱스",
+ "도달 가능"
+ ]
+ },
+ {
+ "title": "매칭되지 않은 트래픽",
+ "tip": "매칭되는 라우트가 없는 요청의 상태 + 지연 시간 + 대역폭.",
+ "expressionLabels": [
+ "status",
+ "지연 시간 (ms)",
+ "대역폭 (KB)"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "HTTP 상태 추세"
+ },
+ {
+ "title": "HTTP 지연 시간"
+ },
+ {
+ "title": "HTTP 대역폭"
+ }
+ ]
+ },
+ "slots": {
+ "services": "APISIX 서비스",
+ "instances": "노드",
+ "endpoints": "라우트"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.pt.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.pt.json
new file mode 100644
index 0000000..7746f51
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.pt.json
@@ -0,0 +1,123 @@
+{
+ "alias": "APISIX",
+ "group": "Gateways",
+ "slots": {
+ "services": "Serviços do APISIX",
+ "instances": "Nós",
+ "endpoints": "Rotas"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPS"
+ },
+ {
+ "label": "200/s"
+ },
+ {
+ "label": "404/s"
+ },
+ {
+ "label": "503/s"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Vazão",
+ "metrics": [
+ {
+ "label": "RPS",
+ "tip": "Requisições por segundo casadas com rotas do APISIX."
+ },
+ {
+ "label": "5xx",
+ "tip": "Classe de erro de upstream / gateway."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Tendência de requisições HTTP"
+ },
+ {
+ "title": "Tendência de status HTTP"
+ },
+ {
+ "title": "Latência HTTP"
+ },
+ {
+ "title": "Largura de banda HTTP"
+ },
+ {
+ "title": "Conexões HTTP"
+ },
+ {
+ "title": "Tendência de status sem correspondência",
+ "tip": "Requisições sem rota APISIX correspondente."
+ },
+ {
+ "title": "Latência sem correspondência"
+ },
+ {
+ "title": "Largura de banda sem correspondência"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Tendência de requisições HTTP"
+ },
+ {
+ "title": "Tendência de status HTTP"
+ },
+ {
+ "title": "Latência HTTP"
+ },
+ {
+ "title": "Largura de banda HTTP"
+ },
+ {
+ "title": "Conexões HTTP"
+ },
+ {
+ "title": "Dicionário compartilhado",
+ "tip": "Capacidade vs espaço livre.",
+ "expressionLabels": [
+ "capacidade",
+ "livre"
+ ]
+ },
+ {
+ "title": "etcd",
+ "expressionLabels": [
+ "índices",
+ "acessível"
+ ]
+ },
+ {
+ "title": "Tráfego sem correspondência",
+ "tip": "Status + latência + largura de banda para requisições sem rota correspondente.",
+ "expressionLabels": [
+ "status",
+ "latência (ms)",
+ "largura de banda (KB)"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Tendência de status HTTP"
+ },
+ {
+ "title": "Latência HTTP"
+ },
+ {
+ "title": "Largura de banda HTTP"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/apisix.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/apisix.i18n.zh-CN.json
new file mode 100644
index 0000000..5da101e
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/apisix.i18n.zh-CN.json
@@ -0,0 +1,65 @@
+{
+ "group": "网关",
+ "slots": {
+ "services": "APISIX 服务",
+ "instances": "节点",
+ "endpoints": "路由"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "RPS" },
+ { "label": "200/秒" },
+ { "label": "404/秒" },
+ { "label": "503/秒" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "吞吐量",
+ "metrics": [
+ { "label": "RPS", "tip": "APISIX 路由匹配的每秒请求数。" },
+ { "label": "5xx", "tip": "上游 / 网关错误类。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "HTTP 请求趋势" },
+ { "title": "HTTP 状态趋势" },
+ { "title": "HTTP 延迟" },
+ { "title": "HTTP 带宽" },
+ { "title": "HTTP 连接" },
+ { "title": "未匹配状态趋势", "tip": "未匹配到 APISIX 路由的请求。" },
+ { "title": "未匹配延迟" },
+ { "title": "未匹配带宽" }
+ ],
+ "instance": [
+ { "title": "HTTP 请求趋势" },
+ { "title": "HTTP 状态趋势" },
+ { "title": "HTTP 延迟" },
+ { "title": "HTTP 带宽" },
+ { "title": "HTTP 连接" },
+ {
+ "title": "Shared Dict",
+ "tip": "容量 vs 空闲空间。",
+ "expressionLabels": ["capacity", "free"]
+ },
+ {
+ "title": "etcd",
+ "expressionLabels": ["indexes", "reachable"]
+ },
+ {
+ "title": "未匹配流量",
+ "tip": "未匹配路由请求的状态 + 延迟 + 带宽。",
+ "expressionLabels": ["status", "latency (ms)", "bandwidth (KB)"]
+ }
+ ],
+ "endpoint": [
+ { "title": "HTTP 状态趋势" },
+ { "title": "HTTP 延迟" },
+ { "title": "HTTP 带宽" }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.de.json
new file mode 100644
index 0000000..c338db1
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.de.json
@@ -0,0 +1,283 @@
+{
+ "alias": "AWS DynamoDB",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Lese-Drosselung"
+ },
+ {
+ "label": "Schreib-Drosselung"
+ },
+ {
+ "label": "Lese-Systemfehler"
+ },
+ {
+ "label": "Schreib-Systemfehler"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Drosselung",
+ "metrics": [
+ {
+ "label": "Lese-Drosselung",
+ "tip": "Drosselung der Leseanfragen — Kapazitätserschöpfung."
+ },
+ {
+ "label": "Schreib-Drosselung",
+ "tip": "Schreibanfragen gedrosselt."
+ },
+ {
+ "label": "Benutzerfehler",
+ "tip": "Benutzerfehler vom Typ Bad Request."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Gedrosselte Anfragen",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Drosselungs-Ereignisse",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Systemfehler",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Benutzerfehler",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Conditional Check fehlgeschlagen",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Transaktionskonflikt",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Lesekapazität (Einheit/s)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "provisioned",
+ "verbraucht"
+ ]
+ },
+ {
+ "title": "Schreibkapazität (Einheit/s)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "provisioned",
+ "verbraucht"
+ ]
+ },
+ {
+ "title": "Erfolgreiche Anfrage-Latenz (ms)",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "TTL gelöschte Items",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Scan zurückgegebene Items",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Query zurückgegebene Items",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Konto Max. Lesen / Schreiben",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "table-level reads",
+ "table-level writes",
+ "reads",
+ "schreibvorgänge"
+ ]
+ },
+ {
+ "title": "Konto-Kapazitätsauslastung",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Gedrosselte Anfragen",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Drosselungs-Ereignisse",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Systemfehler",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Conditional Check fehlgeschlagen",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Transaktionskonflikt",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "TTL gelöschte Items",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Lesekapazität",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "provisioned",
+ "verbraucht"
+ ]
+ },
+ {
+ "title": "Schreibkapazität",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "provisioned",
+ "verbraucht"
+ ]
+ },
+ {
+ "title": "Erfolgreiche Anfrage-Latenz (ms)",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "Scan zurückgegebene Items",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Query zurückgegebene Items",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "DynamoDB-Konten",
+ "endpoints": "Tabellen"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.es.json
new file mode 100644
index 0000000..568c99d
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.es.json
@@ -0,0 +1,188 @@
+{
+ "alias": "AWS DynamoDB",
+ "overview": {
+ "groups": [
+ {
+ "title": "Limitación",
+ "metrics": [
+ {
+ "label": "Lecturas limitadas",
+ "tip": "Peticiones de lectura throttled — capacidad agotada."
+ },
+ {
+ "label": "Escrituras limitadas",
+ "tip": "Peticiones de escritura throttled."
+ },
+ {
+ "label": "Errores de usuario",
+ "tip": "Errores de usuario tipo bad-request."
+ }
+ ]
+ }
+ ]
+ },
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Lectura throttled"
+ },
+ {
+ "label": "Escritura throttled"
+ },
+ {
+ "label": "Errores de sistema de lectura"
+ },
+ {
+ "label": "Errores de sistema de escritura"
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Peticiones throttled",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "Eventos de throttling",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "Errores del sistema",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "Errores del usuario"
+ },
+ {
+ "title": "Verificación condicional fallida"
+ },
+ {
+ "title": "Conflicto de transacción"
+ },
+ {
+ "title": "Capacidad de lectura (unidad/s)",
+ "expressionLabels": [
+ "aprovisionado",
+ "consumidos"
+ ]
+ },
+ {
+ "title": "Capacidad de escritura (unidad/s)",
+ "expressionLabels": [
+ "aprovisionado",
+ "consumidos"
+ ]
+ },
+ {
+ "title": "Latencia de peticiones exitosas (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "consulta",
+ "scan"
+ ]
+ },
+ {
+ "title": "Items eliminados por TTL"
+ },
+ {
+ "title": "Items devueltos por scan"
+ },
+ {
+ "title": "Items devueltos por la consulta"
+ },
+ {
+ "title": "Lecturas / escrituras máximas de la cuenta",
+ "expressionLabels": [
+ "lecturas a nivel tabla",
+ "escrituras a nivel tabla",
+ "lecturas",
+ "escrituras"
+ ]
+ },
+ {
+ "title": "Utilización de capacidad de la cuenta",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Peticiones throttled",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "Eventos de throttling",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "Errores del sistema",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "Verificación condicional fallida"
+ },
+ {
+ "title": "Conflicto de transacción"
+ },
+ {
+ "title": "Items eliminados por TTL"
+ },
+ {
+ "title": "Capacidad de lectura",
+ "expressionLabels": [
+ "aprovisionado",
+ "consumidos"
+ ]
+ },
+ {
+ "title": "Capacidad de escritura",
+ "expressionLabels": [
+ "aprovisionado",
+ "consumidos"
+ ]
+ },
+ {
+ "title": "Latencia de peticiones exitosas (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "consulta",
+ "scan"
+ ]
+ },
+ {
+ "title": "Items devueltos por scan"
+ },
+ {
+ "title": "Items devueltos por la consulta"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Cuentas de DynamoDB",
+ "endpoints": "Tablas"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.fr.json
new file mode 100644
index 0000000..394b699
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.fr.json
@@ -0,0 +1,188 @@
+{
+ "alias": "AWS DynamoDB",
+ "overview": {
+ "groups": [
+ {
+ "title": "Limitation",
+ "metrics": [
+ {
+ "label": "Lectures limitées",
+ "tip": "Requêtes en lecture throttlées — épuisement de la capacité."
+ },
+ {
+ "label": "Écritures limitées",
+ "tip": "Requêtes d'écriture throttlées."
+ },
+ {
+ "label": "Erreurs utilisateur",
+ "tip": "Erreurs utilisateur de type bad-request."
+ }
+ ]
+ }
+ ]
+ },
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Lectures throttlées"
+ },
+ {
+ "label": "Écritures throttlées"
+ },
+ {
+ "label": "Erreurs système en lecture"
+ },
+ {
+ "label": "Erreurs système en écriture"
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Requêtes throttlées",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "Événements de throttle",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "Erreurs système",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "Erreurs utilisateur"
+ },
+ {
+ "title": "Conditional check échoué"
+ },
+ {
+ "title": "Conflit de transactions"
+ },
+ {
+ "title": "Capacité de lecture (unité/s)",
+ "expressionLabels": [
+ "provisionné",
+ "consommé"
+ ]
+ },
+ {
+ "title": "Capacité d'écriture (unité/s)",
+ "expressionLabels": [
+ "provisionné",
+ "consommé"
+ ]
+ },
+ {
+ "title": "Latence des requêtes réussies (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "Éléments supprimés TTL"
+ },
+ {
+ "title": "Éléments retournés par scan"
+ },
+ {
+ "title": "Éléments retournés par query"
+ },
+ {
+ "title": "Lectures / écritures max du compte",
+ "expressionLabels": [
+ "lectures au niveau table",
+ "écritures au niveau table",
+ "lectures",
+ "écritures"
+ ]
+ },
+ {
+ "title": "Utilisation de la capacité du compte",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Requêtes throttlées",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "Événements de throttle",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "Erreurs système",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "Conditional check échoué"
+ },
+ {
+ "title": "Conflit de transactions"
+ },
+ {
+ "title": "Éléments supprimés TTL"
+ },
+ {
+ "title": "Capacité de lecture",
+ "expressionLabels": [
+ "provisionné",
+ "consommé"
+ ]
+ },
+ {
+ "title": "Capacité d'écriture",
+ "expressionLabels": [
+ "provisionné",
+ "consommé"
+ ]
+ },
+ {
+ "title": "Latence des requêtes réussies (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "Éléments retournés par scan"
+ },
+ {
+ "title": "Éléments retournés par query"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Comptes DynamoDB",
+ "endpoints": "Tables"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ja.json
new file mode 100644
index 0000000..f899152
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ja.json
@@ -0,0 +1,188 @@
+{
+ "alias": "AWS DynamoDB",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "読み取りスロットリング"
+ },
+ {
+ "label": "書き込みスロットリング"
+ },
+ {
+ "label": "読み取りシステムエラー"
+ },
+ {
+ "label": "書き込みシステムエラー"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "スロットリング",
+ "metrics": [
+ {
+ "label": "読み取りスロットリング",
+ "tip": "読み取りリクエストのスロットリング — キャパシティ枯渇。"
+ },
+ {
+ "label": "書き込みスロットリング",
+ "tip": "書き込みリクエストのスロットリング。"
+ },
+ {
+ "label": "ユーザーエラー",
+ "tip": "Bad-request 系のユーザーエラー。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "スロットリクエスト",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "スロットルイベント",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "システムエラー",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "ユーザーエラー"
+ },
+ {
+ "title": "条件付きチェック失敗"
+ },
+ {
+ "title": "トランザクション競合"
+ },
+ {
+ "title": "読み取りキャパシティ (unit/s)",
+ "expressionLabels": [
+ "プロビジョン",
+ "消費"
+ ]
+ },
+ {
+ "title": "書き込みキャパシティ (unit/s)",
+ "expressionLabels": [
+ "プロビジョン",
+ "消費"
+ ]
+ },
+ {
+ "title": "成功リクエストレイテンシ (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "クエリ",
+ "スキャン"
+ ]
+ },
+ {
+ "title": "TTL 削除アイテム"
+ },
+ {
+ "title": "Scan 返却アイテム"
+ },
+ {
+ "title": "Query 返却アイテム"
+ },
+ {
+ "title": "アカウント最大読み取り / 書き込み",
+ "expressionLabels": [
+ "テーブル単位読み取り",
+ "テーブル単位書き込み",
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "アカウントキャパシティ使用率",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "スロットリクエスト",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "スロットルイベント",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "システムエラー",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "条件付きチェック失敗"
+ },
+ {
+ "title": "トランザクション競合"
+ },
+ {
+ "title": "TTL 削除アイテム"
+ },
+ {
+ "title": "読み取りキャパシティ",
+ "expressionLabels": [
+ "プロビジョン",
+ "消費"
+ ]
+ },
+ {
+ "title": "書き込みキャパシティ",
+ "expressionLabels": [
+ "プロビジョン",
+ "消費"
+ ]
+ },
+ {
+ "title": "成功リクエストレイテンシ (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "クエリ",
+ "スキャン"
+ ]
+ },
+ {
+ "title": "Scan 返却アイテム"
+ },
+ {
+ "title": "Query 返却アイテム"
+ }
+ ]
+ },
+ "slots": {
+ "services": "DynamoDB アカウント",
+ "endpoints": "テーブル"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ko.json
new file mode 100644
index 0000000..7c8649f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.ko.json
@@ -0,0 +1,188 @@
+{
+ "alias": "AWS DynamoDB",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "읽기 스로틀"
+ },
+ {
+ "label": "쓰기 스로틀"
+ },
+ {
+ "label": "읽기 시스템 오류"
+ },
+ {
+ "label": "쓰기 시스템 오류"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "제한(스로틀링)",
+ "metrics": [
+ {
+ "label": "읽기 제한",
+ "tip": "용량 소진으로 스로틀된 읽기 요청입니다."
+ },
+ {
+ "label": "쓰기 제한",
+ "tip": "스로틀된 쓰기 요청입니다."
+ },
+ {
+ "label": "사용자 오류",
+ "tip": "잘못된 요청 형태의 사용자 오류입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "스로틀된 요청",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "스로틀 이벤트",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "시스템 오류",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "사용자 오류"
+ },
+ {
+ "title": "조건 확인 실패"
+ },
+ {
+ "title": "트랜잭션 충돌"
+ },
+ {
+ "title": "읽기 용량 (unit/s)",
+ "expressionLabels": [
+ "provisioned",
+ "consumed"
+ ]
+ },
+ {
+ "title": "쓰기 용량 (unit/s)",
+ "expressionLabels": [
+ "provisioned",
+ "consumed"
+ ]
+ },
+ {
+ "title": "성공 요청 지연 시간 (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "TTL 삭제된 항목"
+ },
+ {
+ "title": "스캔 반환 항목"
+ },
+ {
+ "title": "쿼리 반환 항목"
+ },
+ {
+ "title": "계정 최대 읽기 / 쓰기",
+ "expressionLabels": [
+ "테이블 단위 reads",
+ "테이블 단위 writes",
+ "reads",
+ "writes"
+ ]
+ },
+ {
+ "title": "계정 용량 사용률",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "스로틀된 요청",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "스로틀 이벤트",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "시스템 오류",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "조건 확인 실패"
+ },
+ {
+ "title": "트랜잭션 충돌"
+ },
+ {
+ "title": "TTL 삭제된 항목"
+ },
+ {
+ "title": "읽기 용량",
+ "expressionLabels": [
+ "provisioned",
+ "consumed"
+ ]
+ },
+ {
+ "title": "쓰기 용량",
+ "expressionLabels": [
+ "provisioned",
+ "consumed"
+ ]
+ },
+ {
+ "title": "성공 요청 지연 시간 (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "스캔 반환 항목"
+ },
+ {
+ "title": "쿼리 반환 항목"
+ }
+ ]
+ },
+ "slots": {
+ "services": "DynamoDB 계정",
+ "endpoints": "테이블"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.pt.json
new file mode 100644
index 0000000..1147caf
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.pt.json
@@ -0,0 +1,188 @@
+{
+ "alias": "AWS DynamoDB",
+ "group": "AWS",
+ "slots": {
+ "services": "Contas do DynamoDB",
+ "endpoints": "Tabelas"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Leitura limitada"
+ },
+ {
+ "label": "Escrita limitada"
+ },
+ {
+ "label": "Erro de sistema (leitura)"
+ },
+ {
+ "label": "Erro de sistema (escrita)"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Limitação",
+ "metrics": [
+ {
+ "label": "Leituras limitadas",
+ "tip": "Requisições de leitura limitadas — capacidade esgotada."
+ },
+ {
+ "label": "Escritas limitadas",
+ "tip": "Requisições de escrita limitadas."
+ },
+ {
+ "label": "Erros de usuário",
+ "tip": "Erros de usuário tipo bad-request."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Requisições limitadas",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "Eventos de throttling",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "Erros do sistema",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "Erros do usuário"
+ },
+ {
+ "title": "Verificação condicional falhou"
+ },
+ {
+ "title": "Conflito de transação"
+ },
+ {
+ "title": "Capacidade de leitura (unidade/s)",
+ "expressionLabels": [
+ "provisionada",
+ "consumida"
+ ]
+ },
+ {
+ "title": "Capacidade de escrita (unidade/s)",
+ "expressionLabels": [
+ "provisionada",
+ "consumida"
+ ]
+ },
+ {
+ "title": "Latência de requisições bem-sucedidas (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "Itens removidos por TTL"
+ },
+ {
+ "title": "Itens retornados por scan"
+ },
+ {
+ "title": "Itens retornados por query"
+ },
+ {
+ "title": "Leituras / escritas máximas da conta",
+ "expressionLabels": [
+ "leituras por tabela",
+ "escritas por tabela",
+ "leituras",
+ "escritas"
+ ]
+ },
+ {
+ "title": "Utilização de capacidade da conta",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Requisições limitadas",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "Eventos de throttling",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "Erros do sistema",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "Verificação condicional falhou"
+ },
+ {
+ "title": "Conflito de transação"
+ },
+ {
+ "title": "Itens removidos por TTL"
+ },
+ {
+ "title": "Capacidade de leitura",
+ "expressionLabels": [
+ "provisionada",
+ "consumida"
+ ]
+ },
+ {
+ "title": "Capacidade de escrita",
+ "expressionLabels": [
+ "provisionada",
+ "consumida"
+ ]
+ },
+ {
+ "title": "Latência de requisições bem-sucedidas (ms)",
+ "expressionLabels": [
+ "get",
+ "put",
+ "query",
+ "scan"
+ ]
+ },
+ {
+ "title": "Itens retornados por scan"
+ },
+ {
+ "title": "Itens retornados por query"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.zh-CN.json
new file mode 100644
index 0000000..5e45627
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_dynamodb.i18n.zh-CN.json
@@ -0,0 +1,71 @@
+{
+ "alias": "AWS DynamoDB",
+ "group": "AWS",
+ "slots": {
+ "services": "DynamoDB 账户",
+ "endpoints": "表"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "读限流" },
+ { "label": "写限流" },
+ { "label": "读系统错误" },
+ { "label": "写系统错误" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "限流",
+ "metrics": [
+ { "label": "读限流", "tip": "读请求被限流 — 容量耗尽。" },
+ { "label": "写限流", "tip": "写请求被限流。" },
+ { "label": "用户错误", "tip": "类似 bad-request 的用户错误。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "被限流请求", "expressionLabels": ["read", "write"] },
+ { "title": "限流事件", "expressionLabels": ["read", "write"] },
+ { "title": "系统错误", "expressionLabels": ["read", "write"] },
+ { "title": "用户错误" },
+ { "title": "条件检查失败" },
+ { "title": "事务冲突" },
+ { "title": "读容量(unit/s)", "expressionLabels": ["provisioned", "consumed"] },
+ { "title": "写容量(unit/s)", "expressionLabels": ["provisioned", "consumed"] },
+ {
+ "title": "成功请求延迟(ms)",
+ "expressionLabels": ["get", "put", "query", "scan"]
+ },
+ { "title": "TTL 删除项数" },
+ { "title": "Scan 返回项数" },
+ { "title": "Query 返回项数" },
+ {
+ "title": "账户最大读 / 写",
+ "expressionLabels": ["table-level reads", "table-level writes", "reads", "writes"]
+ },
+ {
+ "title": "账户容量利用率",
+ "expressionLabels": ["read", "write"]
+ }
+ ],
+ "endpoint": [
+ { "title": "被限流请求", "expressionLabels": ["read", "write"] },
+ { "title": "限流事件", "expressionLabels": ["read", "write"] },
+ { "title": "系统错误", "expressionLabels": ["read", "write"] },
+ { "title": "条件检查失败" },
+ { "title": "事务冲突" },
+ { "title": "TTL 删除项数" },
+ { "title": "读容量", "expressionLabels": ["provisioned", "consumed"] },
+ { "title": "写容量", "expressionLabels": ["provisioned", "consumed"] },
+ {
+ "title": "成功请求延迟(ms)",
+ "expressionLabels": ["get", "put", "query", "scan"]
+ },
+ { "title": "Scan 返回项数" },
+ { "title": "Query 返回项数" }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.de.json
new file mode 100644
index 0000000..ef1f5a9
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.de.json
@@ -0,0 +1,209 @@
+{
+ "alias": "AWS EKS",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Knoten"
+ },
+ {
+ "label": "Fehlerhafte Knoten"
+ },
+ {
+ "label": "Namespaces"
+ },
+ {
+ "label": "Dienste"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Ressourcen",
+ "metrics": [
+ {
+ "label": "Knoten",
+ "tip": "EKS-Cluster-Knotenanzahl."
+ },
+ {
+ "label": "Fehlerhafte Knoten",
+ "tip": "Vom Cluster gemeldete fehlerhafte EKS-Knoten."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Knotenanzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Fehlerhafte Knoten",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Namespace-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "EKS-Servicezahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Cluster Netzwerk-Fehler",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ },
+ {
+ "title": "Cluster Netzwerk-Drops",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Pod-CPU-Auslastung (%)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Pod-Speicher-Auslastung (%)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Pod-Netzwerk RX (KB/s)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Pod RX-Fehler / s",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Pod-Netzwerk TX (KB/s)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Pod TX-Fehler / s",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "Pod-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "CPU-Auslastung (%)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Speicherauslastung (%)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "FS-Nutzung (%)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Netzwerk RX (KB/s)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "bytes",
+ "fehler"
+ ],
+ "expressionAxes": [
+ null,
+ null
+ ]
+ },
+ {
+ "title": "Netzwerk TX (KB/s)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "bytes",
+ "fehler"
+ ],
+ "expressionAxes": [
+ null,
+ null
+ ]
+ },
+ {
+ "title": "Disk-I/O (B/s)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Pod-CPU auf Knoten",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Pod-Speicher auf Knoten",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "Cluster",
+ "instances": "Knoten",
+ "endpoints": "EKS-Dienste"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.es.json
new file mode 100644
index 0000000..3e5d022
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.es.json
@@ -0,0 +1,133 @@
+{
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Nodos"
+ },
+ {
+ "label": "Nodos con fallo"
+ },
+ {
+ "label": "Namespaces"
+ },
+ {
+ "label": "Servicios"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "metrics": [
+ {
+ "label": "Nodos",
+ "tip": "Conteo de nodos del clúster EKS."
+ },
+ {
+ "label": "Nodos con fallo",
+ "tip": "Nodos EKS con fallo reportados por el clúster."
+ }
+ ],
+ "title": "Recurso"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Clústeres",
+ "instances": "Nodos",
+ "endpoints": "Servicios de EKS"
+ },
+ "alias": "AWS EKS",
+ "group": "AWS",
+ "dashboards": {
+ "service": [
+ {
+ "title": "Conteo de nodos"
+ },
+ {
+ "title": "Nodos con fallo"
+ },
+ {
+ "title": "Conteo de namespaces"
+ },
+ {
+ "title": "Conteo de servicios EKS"
+ },
+ {
+ "title": "Errores de red del clúster",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ },
+ {
+ "title": "Pérdidas de red del clúster",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Utilización de CPU del pod (%)"
+ },
+ {
+ "title": "Utilización de memoria del pod (%)"
+ },
+ {
+ "title": "Red RX del pod (KB/s)"
+ },
+ {
+ "title": "Errores RX del pod / s"
+ },
+ {
+ "title": "Red TX del pod (KB/s)"
+ },
+ {
+ "title": "Errores TX del pod / s"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Conteo de pods"
+ },
+ {
+ "title": "Utilización de CPU (%)"
+ },
+ {
+ "title": "Utilización de memoria (%)"
+ },
+ {
+ "title": "Utilización de FS (%)"
+ },
+ {
+ "title": "Red RX (KB/s)",
+ "expressionLabels": [
+ "bytes",
+ "errores"
+ ]
+ },
+ {
+ "title": "Red TX (KB/s)",
+ "expressionLabels": [
+ "bytes",
+ "errores"
+ ]
+ },
+ {
+ "title": "IO de disco (B/s)",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "CPU de pod en el nodo"
+ },
+ {
+ "title": "Memoria del pod en el nodo"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.fr.json
new file mode 100644
index 0000000..3be325c
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.fr.json
@@ -0,0 +1,133 @@
+{
+ "alias": "AWS EKS",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Nœuds"
+ },
+ {
+ "label": "Nœuds en échec"
+ },
+ {
+ "label": "Namespaces"
+ },
+ {
+ "label": "Services"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Ressources",
+ "metrics": [
+ {
+ "label": "Nœuds",
+ "tip": "Nombre de nœuds du cluster EKS."
+ },
+ {
+ "label": "Nœuds en échec",
+ "tip": "Nœuds EKS en échec remontés par le cluster."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Nombre de nœuds"
+ },
+ {
+ "title": "Nœuds en échec"
+ },
+ {
+ "title": "Nombre de namespaces"
+ },
+ {
+ "title": "Nombre de services EKS"
+ },
+ {
+ "title": "Erreurs réseau du cluster",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ },
+ {
+ "title": "Drops réseau du cluster",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Utilisation CPU pod (%)"
+ },
+ {
+ "title": "Utilisation mémoire pod (%)"
+ },
+ {
+ "title": "Réseau pod RX (Ko/s)"
+ },
+ {
+ "title": "Erreurs RX pod / s"
+ },
+ {
+ "title": "Réseau pod TX (Ko/s)"
+ },
+ {
+ "title": "Erreurs TX pod / s"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Nombre de pods"
+ },
+ {
+ "title": "Utilisation CPU (%)"
+ },
+ {
+ "title": "Utilisation mémoire (%)"
+ },
+ {
+ "title": "Utilisation FS (%)"
+ },
+ {
+ "title": "Réseau RX (Ko/s)",
+ "expressionLabels": [
+ "octets",
+ "erreurs"
+ ]
+ },
+ {
+ "title": "Réseau TX (Ko/s)",
+ "expressionLabels": [
+ "octets",
+ "erreurs"
+ ]
+ },
+ {
+ "title": "I/O disque (o/s)",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "CPU pod sur le nœud"
+ },
+ {
+ "title": "Mémoire pod sur le nœud"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Clusters",
+ "instances": "Nœuds",
+ "endpoints": "Services EKS"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ja.json
new file mode 100644
index 0000000..d940dfa
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ja.json
@@ -0,0 +1,133 @@
+{
+ "alias": "AWS EKS",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "ノード"
+ },
+ {
+ "label": "失敗ノード"
+ },
+ {
+ "label": "ネームスペース"
+ },
+ {
+ "label": "サービス"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "リソース",
+ "metrics": [
+ {
+ "label": "ノード",
+ "tip": "EKS クラスタのノード数。"
+ },
+ {
+ "label": "失敗ノード",
+ "tip": "クラスタが報告した失敗 EKS ノード。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "ノード数"
+ },
+ {
+ "title": "失敗ノード"
+ },
+ {
+ "title": "ネームスペース数"
+ },
+ {
+ "title": "EKS サービス数"
+ },
+ {
+ "title": "クラスタネットワークエラー",
+ "expressionLabels": [
+ "受信",
+ "送信"
+ ]
+ },
+ {
+ "title": "クラスタネットワーク破棄",
+ "expressionLabels": [
+ "受信",
+ "送信"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Pod CPU 使用率 (%)"
+ },
+ {
+ "title": "Pod メモリ使用率 (%)"
+ },
+ {
+ "title": "Pod ネットワーク RX (KB/s)"
+ },
+ {
+ "title": "Pod RX エラー / s"
+ },
+ {
+ "title": "Pod ネットワーク TX (KB/s)"
+ },
+ {
+ "title": "Pod TX エラー / s"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Pod 数"
+ },
+ {
+ "title": "CPU 使用率 (%)"
+ },
+ {
+ "title": "メモリ使用率 (%)"
+ },
+ {
+ "title": "FS 使用率 (%)"
+ },
+ {
+ "title": "ネットワーク RX (KB/s)",
+ "expressionLabels": [
+ "バイト",
+ "エラー"
+ ]
+ },
+ {
+ "title": "ネットワーク TX (KB/s)",
+ "expressionLabels": [
+ "バイト",
+ "エラー"
+ ]
+ },
+ {
+ "title": "ディスク IO (B/s)",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "ノード上の Pod CPU"
+ },
+ {
+ "title": "ノード上の Pod メモリ"
+ }
+ ]
+ },
+ "slots": {
+ "services": "クラスタ",
+ "instances": "ノード",
+ "endpoints": "EKS サービス"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ko.json
new file mode 100644
index 0000000..7b8a467
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.ko.json
@@ -0,0 +1,133 @@
+{
+ "alias": "AWS EKS",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "노드"
+ },
+ {
+ "label": "실패 노드"
+ },
+ {
+ "label": "네임스페이스"
+ },
+ {
+ "label": "서비스"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "리소스",
+ "metrics": [
+ {
+ "label": "노드",
+ "tip": "EKS 클러스터의 노드 수입니다."
+ },
+ {
+ "label": "실패 노드",
+ "tip": "클러스터가 보고한 실패 EKS 노드 수입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "노드 수"
+ },
+ {
+ "title": "실패 노드"
+ },
+ {
+ "title": "네임스페이스 수"
+ },
+ {
+ "title": "EKS 서비스 수"
+ },
+ {
+ "title": "클러스터 네트워크 오류",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ },
+ {
+ "title": "클러스터 네트워크 드롭",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Pod CPU 사용률 (%)"
+ },
+ {
+ "title": "Pod 메모리 사용률 (%)"
+ },
+ {
+ "title": "Pod 네트워크 RX (KB/s)"
+ },
+ {
+ "title": "Pod RX 오류 / s"
+ },
+ {
+ "title": "Pod 네트워크 TX (KB/s)"
+ },
+ {
+ "title": "Pod TX 오류 / s"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Pod 수"
+ },
+ {
+ "title": "CPU 사용률 (%)"
+ },
+ {
+ "title": "메모리 사용률 (%)"
+ },
+ {
+ "title": "파일 시스템 사용률 (%)"
+ },
+ {
+ "title": "네트워크 RX (KB/s)",
+ "expressionLabels": [
+ "바이트",
+ "오류"
+ ]
+ },
+ {
+ "title": "네트워크 TX (KB/s)",
+ "expressionLabels": [
+ "바이트",
+ "오류"
+ ]
+ },
+ {
+ "title": "디스크 I/O (B/s)",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "노드의 Pod CPU"
+ },
+ {
+ "title": "노드의 Pod 메모리"
+ }
+ ]
+ },
+ "slots": {
+ "services": "클러스터",
+ "instances": "노드",
+ "endpoints": "EKS 서비스"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.pt.json
new file mode 100644
index 0000000..5c850ae
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.pt.json
@@ -0,0 +1,133 @@
+{
+ "alias": "AWS EKS",
+ "group": "AWS",
+ "slots": {
+ "services": "Clusters",
+ "instances": "Nós",
+ "endpoints": "Serviços do EKS"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Nós"
+ },
+ {
+ "label": "Nós com falha"
+ },
+ {
+ "label": "Namespaces"
+ },
+ {
+ "label": "Serviços"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Recurso",
+ "metrics": [
+ {
+ "label": "Nós",
+ "tip": "Quantidade de nós do cluster EKS."
+ },
+ {
+ "label": "Nós com falha",
+ "tip": "Nós EKS com falha reportados pelo cluster."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Quantidade de nós"
+ },
+ {
+ "title": "Nós com falha"
+ },
+ {
+ "title": "Quantidade de namespaces"
+ },
+ {
+ "title": "Quantidade de serviços EKS"
+ },
+ {
+ "title": "Erros de rede do cluster",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ },
+ {
+ "title": "Pacotes descartados na rede do cluster",
+ "expressionLabels": [
+ "rx",
+ "tx"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Utilização de CPU do Pod (%)"
+ },
+ {
+ "title": "Utilização de memória do Pod (%)"
+ },
+ {
+ "title": "Rede RX do Pod (KB/s)"
+ },
+ {
+ "title": "Erros RX do Pod / s"
+ },
+ {
+ "title": "Rede TX do Pod (KB/s)"
+ },
+ {
+ "title": "Erros TX do Pod / s"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Quantidade de Pods"
+ },
+ {
+ "title": "Utilização de CPU (%)"
+ },
+ {
+ "title": "Utilização de memória (%)"
+ },
+ {
+ "title": "Utilização do FS (%)"
+ },
+ {
+ "title": "Rede RX (KB/s)",
+ "expressionLabels": [
+ "bytes",
+ "erros"
+ ]
+ },
+ {
+ "title": "Rede TX (KB/s)",
+ "expressionLabels": [
+ "bytes",
+ "erros"
+ ]
+ },
+ {
+ "title": "IO de disco (B/s)",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "CPU do Pod no nó"
+ },
+ {
+ "title": "Memória do Pod no nó"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_eks.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.zh-CN.json
new file mode 100644
index 0000000..1a7be20
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_eks.i18n.zh-CN.json
@@ -0,0 +1,66 @@
+{
+ "alias": "AWS EKS",
+ "group": "AWS",
+ "slots": {
+ "services": "集群",
+ "instances": "节点",
+ "endpoints": "EKS 服务"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "节点" },
+ { "label": "失败节点" },
+ { "label": "命名空间" },
+ { "label": "服务" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "资源",
+ "metrics": [
+ { "label": "节点", "tip": "EKS 集群节点数。" },
+ { "label": "失败节点", "tip": "集群上报的失败 EKS 节点数。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "节点数" },
+ { "title": "失败节点" },
+ { "title": "命名空间数" },
+ { "title": "EKS 服务数" },
+ { "title": "集群网络错误", "expressionLabels": ["rx", "tx"] },
+ { "title": "集群网络丢包", "expressionLabels": ["rx", "tx"] }
+ ],
+ "endpoint": [
+ { "title": "Pod CPU 使用率(%)" },
+ { "title": "Pod 内存使用率(%)" },
+ { "title": "Pod 网络 RX(KB/s)" },
+ { "title": "Pod RX 错误 / 秒" },
+ { "title": "Pod 网络 TX(KB/s)" },
+ { "title": "Pod TX 错误 / 秒" }
+ ],
+ "instance": [
+ { "title": "Pod 数量" },
+ { "title": "CPU 使用率(%)" },
+ { "title": "内存使用率(%)" },
+ { "title": "文件系统使用率(%)" },
+ {
+ "title": "网络 RX(KB/s)",
+ "expressionLabels": ["bytes", "errors"]
+ },
+ {
+ "title": "网络 TX(KB/s)",
+ "expressionLabels": ["bytes", "errors"]
+ },
+ {
+ "title": "磁盘 IO(B/s)",
+ "expressionLabels": ["read", "write"]
+ },
+ { "title": "节点上的 Pod CPU" },
+ { "title": "节点上的 Pod 内存" }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.de.json
new file mode 100644
index 0000000..92a7f11
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.de.json
@@ -0,0 +1,157 @@
+{
+ "alias": "AWS API Gateway",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Anfragen"
+ },
+ {
+ "label": "Latenz"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Fehler",
+ "metrics": [
+ {
+ "label": "4xx",
+ "tip": "Anzahl Client-Fehler von CloudWatch."
+ },
+ {
+ "label": "5xx",
+ "tip": "Anzahl Server-Fehler von CloudWatch."
+ },
+ {
+ "label": "Mittlere Latenz",
+ "tip": "Durchschnittliche Ende-zu-Ende-Latenz."
+ }
+ ]
+ },
+ {
+ "title": "Durchsatz",
+ "metrics": [
+ {
+ "label": "Anfragen",
+ "tip": "Gesamtanzahl Anfragen im Zeitfenster."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Anfrageanzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "4xx-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "5xx-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Mittlere Anfragelatenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Mittlere Integrations-Latenz",
+ "tip": "Latenz zwischen Gateway und Backend-Integration.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Verarbeitete Daten (nur HTTP API)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Cache-Trefferrate (nur REST API)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Cache-Fehlrate (nur REST API)",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Anfrageanzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "4xx-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "5xx-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Mittlere Anfragelatenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Mittlere Integrations-Latenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Verarbeitete Daten",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Cache-Trefferrate",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Cache-Fehlrate",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "AWS Gateways",
+ "endpoints": "Routes"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.es.json
new file mode 100644
index 0000000..c6d5a21
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.es.json
@@ -0,0 +1,109 @@
+{
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Peticiones"
+ },
+ {
+ "label": "Latencia"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Errores",
+ "metrics": [
+ {
+ "label": "4xx",
+ "tip": "Conteo de errores de cliente desde CloudWatch."
+ },
+ {
+ "label": "5xx",
+ "tip": "Conteo de errores de servidor desde CloudWatch."
+ },
+ {
+ "label": "Latencia media",
+ "tip": "Latencia media extremo a extremo."
+ }
+ ]
+ },
+ {
+ "title": "Rendimiento",
+ "metrics": [
+ {
+ "label": "Peticiones",
+ "tip": "Conteo total de peticiones en la ventana."
+ }
+ ]
+ }
+ ]
+ },
+ "alias": "AWS API Gateway",
+ "group": "AWS",
+ "dashboards": {
+ "service": [
+ {
+ "title": "Conteo de peticiones"
+ },
+ {
+ "title": "Conteo 4xx"
+ },
+ {
+ "title": "Conteo 5xx"
+ },
+ {
+ "title": "Latencia media de petición"
+ },
+ {
+ "title": "Latencia media de integración",
+ "tip": "Latencia entre el gateway y la integración backend."
+ },
+ {
+ "title": "Datos procesados (solo HTTP API)"
+ },
+ {
+ "title": "Tasa de aciertos de caché (solo REST API)"
+ },
+ {
+ "title": "Tasa de fallos de caché (solo REST API)"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Conteo de peticiones"
+ },
+ {
+ "title": "Conteo 4xx"
+ },
+ {
+ "title": "Conteo 5xx"
+ },
+ {
+ "title": "Latencia media de petición"
+ },
+ {
+ "title": "Latencia media de integración"
+ },
+ {
+ "title": "Datos procesados"
+ },
+ {
+ "title": "Tasa de aciertos de caché"
+ },
+ {
+ "title": "Tasa de fallos de caché"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Gateways de AWS",
+ "endpoints": "Rutas"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.fr.json
new file mode 100644
index 0000000..1e8bda8
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.fr.json
@@ -0,0 +1,109 @@
+{
+ "alias": "AWS API Gateway",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Requêtes"
+ },
+ {
+ "label": "Latence"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Erreurs",
+ "metrics": [
+ {
+ "label": "4xx",
+ "tip": "Nombre d'erreurs client depuis CloudWatch."
+ },
+ {
+ "label": "5xx",
+ "tip": "Nombre d'erreurs serveur depuis CloudWatch."
+ },
+ {
+ "label": "Latence moyenne",
+ "tip": "Latence moyenne de bout en bout."
+ }
+ ]
+ },
+ {
+ "title": "Débit",
+ "metrics": [
+ {
+ "label": "Requêtes",
+ "tip": "Nombre total de requêtes sur la fenêtre."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Nombre de requêtes"
+ },
+ {
+ "title": "Nombre de 4xx"
+ },
+ {
+ "title": "Nombre de 5xx"
+ },
+ {
+ "title": "Latence moyenne des requêtes"
+ },
+ {
+ "title": "Latence moyenne d'intégration",
+ "tip": "Latence entre la passerelle et l'intégration backend."
+ },
+ {
+ "title": "Données traitées (HTTP API uniquement)"
+ },
+ {
+ "title": "Taux de hit du cache (REST API uniquement)"
+ },
+ {
+ "title": "Taux de miss du cache (REST API uniquement)"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Nombre de requêtes"
+ },
+ {
+ "title": "Nombre de 4xx"
+ },
+ {
+ "title": "Nombre de 5xx"
+ },
+ {
+ "title": "Latence moyenne des requêtes"
+ },
+ {
+ "title": "Latence moyenne d'intégration"
+ },
+ {
+ "title": "Données traitées"
+ },
+ {
+ "title": "Taux de hit du cache"
+ },
+ {
+ "title": "Taux de miss du cache"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Passerelles AWS",
+ "endpoints": "Routes"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ja.json
new file mode 100644
index 0000000..c619de0
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ja.json
@@ -0,0 +1,109 @@
+{
+ "alias": "AWS API Gateway",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "リクエスト"
+ },
+ {
+ "label": "レイテンシ"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "エラー",
+ "metrics": [
+ {
+ "label": "4xx",
+ "tip": "CloudWatch からのクライアントエラー件数。"
+ },
+ {
+ "label": "5xx",
+ "tip": "CloudWatch からのサーバーエラー件数。"
+ },
+ {
+ "label": "平均レイテンシ",
+ "tip": "平均エンドツーエンドレイテンシ。"
+ }
+ ]
+ },
+ {
+ "title": "スループット",
+ "metrics": [
+ {
+ "label": "リクエスト",
+ "tip": "ウィンドウ内の合計リクエスト数。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "リクエスト数"
+ },
+ {
+ "title": "4xx 件数"
+ },
+ {
+ "title": "5xx 件数"
+ },
+ {
+ "title": "リクエスト平均レイテンシ"
+ },
+ {
+ "title": "統合平均レイテンシ",
+ "tip": "ゲートウェイとバックエンド統合間のレイテンシ。"
+ },
+ {
+ "title": "処理データ量 (HTTP API のみ)"
+ },
+ {
+ "title": "キャッシュヒット率 (REST API のみ)"
+ },
+ {
+ "title": "キャッシュミス率 (REST API のみ)"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "リクエスト数"
+ },
+ {
+ "title": "4xx 件数"
+ },
+ {
+ "title": "5xx 件数"
+ },
+ {
+ "title": "リクエスト平均レイテンシ"
+ },
+ {
+ "title": "統合平均レイテンシ"
+ },
+ {
+ "title": "処理データ量"
+ },
+ {
+ "title": "キャッシュヒット率"
+ },
+ {
+ "title": "キャッシュミス率"
+ }
+ ]
+ },
+ "slots": {
+ "services": "AWS ゲートウェイ",
+ "endpoints": "ルート"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ko.json
new file mode 100644
index 0000000..840c9bc
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.ko.json
@@ -0,0 +1,109 @@
+{
+ "alias": "AWS API Gateway",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "요청"
+ },
+ {
+ "label": "지연 시간"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "오류",
+ "metrics": [
+ {
+ "label": "4xx",
+ "tip": "CloudWatch에서 가져온 클라이언트 오류 수입니다."
+ },
+ {
+ "label": "5xx",
+ "tip": "CloudWatch에서 가져온 서버 오류 수입니다."
+ },
+ {
+ "label": "평균 지연 시간",
+ "tip": "평균 종단 간 지연 시간입니다."
+ }
+ ]
+ },
+ {
+ "title": "처리량",
+ "metrics": [
+ {
+ "label": "요청",
+ "tip": "윈도우 내 총 요청 수입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "요청 수"
+ },
+ {
+ "title": "4xx 수"
+ },
+ {
+ "title": "5xx 수"
+ },
+ {
+ "title": "요청 평균 지연 시간"
+ },
+ {
+ "title": "통합 평균 지연 시간",
+ "tip": "게이트웨이와 백엔드 통합 사이의 지연 시간입니다."
+ },
+ {
+ "title": "처리된 데이터 (HTTP API 전용)"
+ },
+ {
+ "title": "캐시 적중률 (REST API 전용)"
+ },
+ {
+ "title": "캐시 미스율 (REST API 전용)"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "요청 수"
+ },
+ {
+ "title": "4xx 수"
+ },
+ {
+ "title": "5xx 수"
+ },
+ {
+ "title": "요청 평균 지연 시간"
+ },
+ {
+ "title": "통합 평균 지연 시간"
+ },
+ {
+ "title": "처리된 데이터"
+ },
+ {
+ "title": "캐시 적중률"
+ },
+ {
+ "title": "캐시 미스율"
+ }
+ ]
+ },
+ "slots": {
+ "services": "AWS 게이트웨이",
+ "endpoints": "라우트"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.pt.json
new file mode 100644
index 0000000..b782f01
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.pt.json
@@ -0,0 +1,109 @@
+{
+ "alias": "AWS API Gateway",
+ "group": "AWS",
+ "slots": {
+ "services": "Gateways da AWS",
+ "endpoints": "Rotas"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Requisições"
+ },
+ {
+ "label": "Latência"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Erros",
+ "metrics": [
+ {
+ "label": "4xx",
+ "tip": "Contagem de erros de cliente vinda do CloudWatch."
+ },
+ {
+ "label": "5xx",
+ "tip": "Contagem de erros de servidor vinda do CloudWatch."
+ },
+ {
+ "label": "Latência média",
+ "tip": "Latência média ponta a ponta."
+ }
+ ]
+ },
+ {
+ "title": "Vazão",
+ "metrics": [
+ {
+ "label": "Requisições",
+ "tip": "Contagem total de requisições na janela."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Contagem de requisições"
+ },
+ {
+ "title": "Contagem de 4xx"
+ },
+ {
+ "title": "Contagem de 5xx"
+ },
+ {
+ "title": "Latência média da requisição"
+ },
+ {
+ "title": "Latência média da integração",
+ "tip": "Latência entre o gateway e a integração backend."
+ },
+ {
+ "title": "Dados processados (apenas HTTP API)"
+ },
+ {
+ "title": "Taxa de cache hit (apenas REST API)"
+ },
+ {
+ "title": "Taxa de cache miss (apenas REST API)"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Contagem de requisições"
+ },
+ {
+ "title": "Contagem de 4xx"
+ },
+ {
+ "title": "Contagem de 5xx"
+ },
+ {
+ "title": "Latência média da requisição"
+ },
+ {
+ "title": "Latência média da integração"
+ },
+ {
+ "title": "Dados processados"
+ },
+ {
+ "title": "Taxa de cache hit"
+ },
+ {
+ "title": "Taxa de cache miss"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.zh-CN.json
new file mode 100644
index 0000000..e03e496
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_gateway.i18n.zh-CN.json
@@ -0,0 +1,56 @@
+{
+ "alias": "AWS API Gateway",
+ "group": "AWS",
+ "slots": {
+ "services": "AWS Gateway",
+ "endpoints": "路由"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "请求数" },
+ { "label": "延迟" },
+ { "label": "4xx" },
+ { "label": "5xx" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "错误",
+ "metrics": [
+ { "label": "4xx", "tip": "来自 CloudWatch 的客户端错误数。" },
+ { "label": "5xx", "tip": "来自 CloudWatch 的服务端错误数。" },
+ { "label": "平均延迟", "tip": "平均端到端延迟。" }
+ ]
+ },
+ {
+ "title": "吞吐量",
+ "metrics": [
+ { "label": "请求数", "tip": "窗口内的请求总数。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "请求数" },
+ { "title": "4xx 数量" },
+ { "title": "5xx 数量" },
+ { "title": "请求平均延迟" },
+ { "title": "集成平均延迟", "tip": "网关与后端集成之间的延迟。" },
+ { "title": "处理数据量(仅 HTTP API)" },
+ { "title": "缓存命中率(仅 REST API)" },
+ { "title": "缓存未命中率(仅 REST API)" }
+ ],
+ "endpoint": [
+ { "title": "请求数" },
+ { "title": "4xx 数量" },
+ { "title": "5xx 数量" },
+ { "title": "请求平均延迟" },
+ { "title": "集成平均延迟" },
+ { "title": "处理数据量" },
+ { "title": "缓存命中率" },
+ { "title": "缓存未命中率" }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.de.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.de.json
new file mode 100644
index 0000000..8a0dc59
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.de.json
@@ -0,0 +1,108 @@
+{
+ "alias": "AWS S3",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Anfragen"
+ },
+ {
+ "label": "Mittlere Latenz"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Fehler",
+ "metrics": [
+ {
+ "label": "4xx-Anzahl",
+ "tip": "Client-Fehler, beobachtet von CloudWatch."
+ },
+ {
+ "label": "5xx-Anzahl",
+ "tip": "Server-Fehler, beobachtet von CloudWatch."
+ },
+ {
+ "label": "Mittlere Latenz",
+ "tip": "Durchschnittliche Anfragelatenz."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Gesamtanzahl Anfragen",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "GET-Anfrageanzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "PUT-Anfrageanzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "DELETE-Anfrageanzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "4xx-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "5xx-Anzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Mittlere Anfragelatenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "First Byte mittlere Latenz",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Heruntergeladen (KB)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Hochgeladen (KB)",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "S3 Buckets"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.es.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.es.json
new file mode 100644
index 0000000..e03b326
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.es.json
@@ -0,0 +1,78 @@
+{
+ "overview": {
+ "groups": [
+ {
+ "title": "Errores",
+ "metrics": [
+ {
+ "label": "Conteo 4xx",
+ "tip": "Errores de cliente observados por CloudWatch."
+ },
+ {
+ "label": "Conteo 5xx",
+ "tip": "Errores de servidor observados por CloudWatch."
+ },
+ {
+ "label": "Latencia media",
+ "tip": "Latencia media de petición."
+ }
+ ]
+ }
+ ]
+ },
+ "alias": "AWS S3",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Peticiones"
+ },
+ {
+ "label": "Latencia media"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Conteo de todas las peticiones"
+ },
+ {
+ "title": "Conteo de peticiones GET"
+ },
+ {
+ "title": "Conteo de peticiones PUT"
+ },
+ {
+ "title": "Conteo de peticiones DELETE"
+ },
+ {
+ "title": "Conteo 4xx"
+ },
+ {
+ "title": "Conteo 5xx"
+ },
+ {
+ "title": "Latencia media de petición"
+ },
+ {
+ "title": "Latencia media del primer byte"
+ },
+ {
+ "title": "Descargado (KB)"
+ },
+ {
+ "title": "Subido (KB)"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Buckets de S3"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.fr.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.fr.json
new file mode 100644
index 0000000..b66f482
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.fr.json
@@ -0,0 +1,78 @@
+{
+ "alias": "AWS S3",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Requêtes"
+ },
+ {
+ "label": "Latence moyenne"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Erreurs",
+ "metrics": [
+ {
+ "label": "Nombre de 4xx",
+ "tip": "Erreurs client observées par CloudWatch."
+ },
+ {
+ "label": "Nombre de 5xx",
+ "tip": "Erreurs serveur observées par CloudWatch."
+ },
+ {
+ "label": "Latence moyenne",
+ "tip": "Latence moyenne des requêtes."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Nombre total de requêtes"
+ },
+ {
+ "title": "Nombre de requêtes GET"
+ },
+ {
+ "title": "Nombre de requêtes PUT"
+ },
+ {
+ "title": "Nombre de requêtes DELETE"
+ },
+ {
+ "title": "Nombre de 4xx"
+ },
+ {
+ "title": "Nombre de 5xx"
+ },
+ {
+ "title": "Latence moyenne des requêtes"
+ },
+ {
+ "title": "Latence moyenne du premier octet"
+ },
+ {
+ "title": "Téléchargés (Ko)"
+ },
+ {
+ "title": "Téléversés (Ko)"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Buckets S3"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ja.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ja.json
new file mode 100644
index 0000000..57f1799
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ja.json
@@ -0,0 +1,78 @@
+{
+ "alias": "AWS S3",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "リクエスト"
+ },
+ {
+ "label": "平均レイテンシ"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "エラー",
+ "metrics": [
+ {
+ "label": "4xx 件数",
+ "tip": "CloudWatch で観測されたクライアントエラー。"
+ },
+ {
+ "label": "5xx 件数",
+ "tip": "CloudWatch で観測されたサーバーエラー。"
+ },
+ {
+ "label": "平均レイテンシ",
+ "tip": "平均リクエストレイテンシ。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "全リクエスト数"
+ },
+ {
+ "title": "GET リクエスト数"
+ },
+ {
+ "title": "PUT リクエスト数"
+ },
+ {
+ "title": "DELETE リクエスト数"
+ },
+ {
+ "title": "4xx 件数"
+ },
+ {
+ "title": "5xx 件数"
+ },
+ {
+ "title": "リクエスト平均レイテンシ"
+ },
+ {
+ "title": "First Byte 平均レイテンシ"
+ },
+ {
+ "title": "ダウンロード (KB)"
+ },
+ {
+ "title": "アップロード (KB)"
+ }
+ ]
+ },
+ "slots": {
+ "services": "S3 バケット"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ko.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ko.json
new file mode 100644
index 0000000..3f3530f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.ko.json
@@ -0,0 +1,78 @@
+{
+ "alias": "AWS S3",
+ "group": "AWS",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "요청"
+ },
+ {
+ "label": "평균 지연 시간"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "오류",
+ "metrics": [
+ {
+ "label": "4xx 수",
+ "tip": "CloudWatch가 관측한 클라이언트 오류입니다."
+ },
+ {
+ "label": "5xx 수",
+ "tip": "CloudWatch가 관측한 서버 오류입니다."
+ },
+ {
+ "label": "평균 지연 시간",
+ "tip": "평균 요청 지연 시간입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "전체 요청 수"
+ },
+ {
+ "title": "GET 요청 수"
+ },
+ {
+ "title": "PUT 요청 수"
+ },
+ {
+ "title": "DELETE 요청 수"
+ },
+ {
+ "title": "4xx 수"
+ },
+ {
+ "title": "5xx 수"
+ },
+ {
+ "title": "요청 평균 지연 시간"
+ },
+ {
+ "title": "첫 바이트 평균 지연 시간"
+ },
+ {
+ "title": "다운로드 (KB)"
+ },
+ {
+ "title": "업로드 (KB)"
+ }
+ ]
+ },
+ "slots": {
+ "services": "S3 버킷"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.pt.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.pt.json
new file mode 100644
index 0000000..31ac937
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.pt.json
@@ -0,0 +1,78 @@
+{
+ "alias": "AWS S3",
+ "group": "AWS",
+ "slots": {
+ "services": "Buckets do S3"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Requisições"
+ },
+ {
+ "label": "Latência média"
+ },
+ {
+ "label": "4xx"
+ },
+ {
+ "label": "5xx"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Erros",
+ "metrics": [
+ {
+ "label": "Contagem de 4xx",
+ "tip": "Erros de cliente observados pelo CloudWatch."
+ },
+ {
+ "label": "Contagem de 5xx",
+ "tip": "Erros de servidor observados pelo CloudWatch."
+ },
+ {
+ "label": "Latência média",
+ "tip": "Latência média da requisição."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Contagem total de requisições"
+ },
+ {
+ "title": "Contagem de requisições GET"
+ },
+ {
+ "title": "Contagem de requisições PUT"
+ },
+ {
+ "title": "Contagem de requisições DELETE"
+ },
+ {
+ "title": "Contagem de 4xx"
+ },
+ {
+ "title": "Contagem de 5xx"
+ },
+ {
+ "title": "Latência média da requisição"
+ },
+ {
+ "title": "Latência média do primeiro byte"
+ },
+ {
+ "title": "Baixado (KB)"
+ },
+ {
+ "title": "Enviado (KB)"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/aws_s3.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.zh-CN.json
new file mode 100644
index 0000000..49764b6
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/aws_s3.i18n.zh-CN.json
@@ -0,0 +1,41 @@
+{
+ "alias": "AWS S3",
+ "group": "AWS",
+ "slots": {
+ "services": "S3 存储桶"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "请求数" },
+ { "label": "平均延迟" },
+ { "label": "4xx" },
+ { "label": "5xx" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "错误",
+ "metrics": [
+ { "label": "4xx 数量", "tip": "CloudWatch 观测到的客户端错误。" },
+ { "label": "5xx 数量", "tip": "CloudWatch 观测到的服务端错误。" },
+ { "label": "平均延迟", "tip": "平均请求延迟。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "全部请求数" },
+ { "title": "GET 请求数" },
+ { "title": "PUT 请求数" },
+ { "title": "DELETE 请求数" },
+ { "title": "4xx 数量" },
+ { "title": "5xx 数量" },
+ { "title": "请求平均延迟" },
+ { "title": "首字节平均延迟" },
+ { "title": "下载量(KB)" },
+ { "title": "上传量(KB)" }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.de.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.de.json
new file mode 100644
index 0000000..8ee7a3d
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.de.json
@@ -0,0 +1,198 @@
+{
+ "alias": "BookKeeper",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Ledger"
+ },
+ {
+ "label": "Einträge"
+ },
+ {
+ "label": "Beschreibbare Verz."
+ },
+ {
+ "label": "Verz.-Nutzung"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Durchsatz",
+ "metrics": [
+ {
+ "label": "Schreiben B/s",
+ "tip": "Bookie Schreib-Durchsatz im Cluster."
+ },
+ {
+ "label": "Lesen B/s",
+ "tip": "Bookie Lese-Durchsatz im Cluster."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Bookie-Ledger",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Bookie-Einträge",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Beschreibbare Ledger-Verz.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Schreib-Cache",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "größe (MB)",
+ "einträge"
+ ],
+ "expressionAxes": [
+ null,
+ null
+ ]
+ },
+ {
+ "title": "Lese-Cache",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "größe (MB)",
+ "einträge"
+ ],
+ "expressionAxes": [
+ null,
+ null
+ ]
+ },
+ {
+ "title": "Lese-/Schreibrate (B/s)",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "Ledger-Verz.-Nutzung",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "JVM-Speicherpool (MB)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "JVM-Speicher (MB)",
+ "expressions": [
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "genutzt",
+ "committed",
+ "init"
+ ]
+ },
+ {
+ "title": "JVM-Threads",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aktuell",
+ "daemon",
+ "spitze",
+ "deadlocked"
+ ]
+ },
+ {
+ "title": "GC",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "sekunden",
+ "anzahl"
+ ],
+ "expressionAxes": [
+ null,
+ null
+ ]
+ },
+ {
+ "title": "Thread Executor",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "abgeschlossen",
+ "tasks abgeschlossen",
+ "abgelehnt",
+ "fehlgeschlagen"
+ ]
+ },
+ {
+ "title": "Pool-Threads",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "high-priority",
+ "lesen"
+ ]
+ },
+ {
+ "title": "Pool Max-Queue-Größe",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "high-priority",
+ "lesen"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "BookKeeper-Cluster",
+ "instances": "Bookies"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.es.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.es.json
new file mode 100644
index 0000000..cf29177
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.es.json
@@ -0,0 +1,130 @@
+{
+ "overview": {
+ "groups": [
+ {
+ "title": "Rendimiento",
+ "metrics": [
+ {
+ "label": "Escritura B/s",
+ "tip": "Rendimiento de escritura de bookies en el clúster."
+ },
+ {
+ "label": "Lectura B/s",
+ "tip": "Rendimiento de lectura de bookies en el clúster."
+ }
+ ]
+ }
+ ]
+ },
+ "alias": "BookKeeper",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Ledgers"
+ },
+ {
+ "label": "Entradas"
+ },
+ {
+ "label": "Directorios escribibles"
+ },
+ {
+ "label": "Uso de directorio"
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Ledgers del bookie"
+ },
+ {
+ "title": "Entradas del bookie"
+ },
+ {
+ "title": "Directorios de ledger escribibles"
+ },
+ {
+ "title": "Caché de escritura",
+ "expressionLabels": [
+ "tamaño (MB)",
+ "entradas"
+ ]
+ },
+ {
+ "title": "Caché de lectura",
+ "expressionLabels": [
+ "tamaño (MB)",
+ "entradas"
+ ]
+ },
+ {
+ "title": "Tasa de L/E (B/s)",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "Uso del directorio de ledgers"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Pool de memoria JVM (MB)"
+ },
+ {
+ "title": "Memoria JVM (MB)",
+ "expressionLabels": [
+ "en uso",
+ "confirmadas",
+ "init"
+ ]
+ },
+ {
+ "title": "Hilos JVM",
+ "expressionLabels": [
+ "actual",
+ "daemon",
+ "máximo",
+ "en deadlock"
+ ]
+ },
+ {
+ "title": "GC",
+ "expressionLabels": [
+ "segundos",
+ "conteo"
+ ]
+ },
+ {
+ "title": "Executor de hilos",
+ "expressionLabels": [
+ "completadas",
+ "tareas completadas",
+ "rechazados",
+ "fallidos"
+ ]
+ },
+ {
+ "title": "Hilos en pool",
+ "expressionLabels": [
+ "alta prioridad",
+ "lectura"
+ ]
+ },
+ {
+ "title": "Tamaño máximo de la cola del pool",
+ "expressionLabels": [
+ "alta prioridad",
+ "lectura"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "Clústeres de BookKeeper",
+ "instances": "Bookies"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.fr.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.fr.json
new file mode 100644
index 0000000..e690ece
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.fr.json
@@ -0,0 +1,130 @@
+{
+ "alias": "BookKeeper",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Ledgers"
+ },
+ {
+ "label": "Entrées"
+ },
+ {
+ "label": "Répertoires inscriptibles"
+ },
+ {
+ "label": "Utilisation des répertoires"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Débit",
+ "metrics": [
+ {
+ "label": "Écriture o/s",
+ "tip": "Débit d'écriture Bookie sur l'ensemble du cluster."
+ },
+ {
+ "label": "Lecture o/s",
+ "tip": "Débit de lecture Bookie sur l'ensemble du cluster."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Ledgers Bookie"
+ },
+ {
+ "title": "Entrées Bookie"
+ },
+ {
+ "title": "Répertoires de ledgers inscriptibles"
+ },
+ {
+ "title": "Cache d'écriture",
+ "expressionLabels": [
+ "taille (Mo)",
+ "entrées"
+ ]
+ },
+ {
+ "title": "Cache de lecture",
+ "expressionLabels": [
+ "taille (Mo)",
+ "entrées"
+ ]
+ },
+ {
+ "title": "Débit lecture / écriture (o/s)",
+ "expressionLabels": [
+ "lecture",
+ "écriture"
+ ]
+ },
+ {
+ "title": "Utilisation du répertoire de ledgers"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Pool mémoire JVM (Mo)"
+ },
+ {
+ "title": "Mémoire JVM (Mo)",
+ "expressionLabels": [
+ "utilisé",
+ "engagés",
+ "init"
+ ]
+ },
+ {
+ "title": "Threads JVM",
+ "expressionLabels": [
+ "courant",
+ "daemon",
+ "pic",
+ "en deadlock"
+ ]
+ },
+ {
+ "title": "GC",
+ "expressionLabels": [
+ "secondes",
+ "nombre"
+ ]
+ },
+ {
+ "title": "Exécuteur de threads",
+ "expressionLabels": [
+ "terminées",
+ "tâches terminées",
+ "rejetés",
+ "échec"
+ ]
+ },
+ {
+ "title": "Threads poolés",
+ "expressionLabels": [
+ "priorité haute",
+ "lecture"
+ ]
+ },
+ {
+ "title": "Taille max de la file du pool",
+ "expressionLabels": [
+ "priorité haute",
+ "lecture"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "Clusters BookKeeper",
+ "instances": "Bookies"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ja.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ja.json
new file mode 100644
index 0000000..c148a6a
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ja.json
@@ -0,0 +1,130 @@
+{
+ "alias": "BookKeeper",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Ledger"
+ },
+ {
+ "label": "Entry"
+ },
+ {
+ "label": "書き込み可能ディレクトリ"
+ },
+ {
+ "label": "ディレクトリ使用量"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "スループット",
+ "metrics": [
+ {
+ "label": "書き込み B/s",
+ "tip": "クラスタ全体の Bookie 書き込みスループット。"
+ },
+ {
+ "label": "読み取り B/s",
+ "tip": "クラスタ全体の Bookie 読み取りスループット。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Bookie Ledger"
+ },
+ {
+ "title": "Bookie Entry"
+ },
+ {
+ "title": "書き込み可能 Ledger ディレクトリ"
+ },
+ {
+ "title": "書き込みキャッシュ",
+ "expressionLabels": [
+ "サイズ (MB)",
+ "entry"
+ ]
+ },
+ {
+ "title": "読み取りキャッシュ",
+ "expressionLabels": [
+ "サイズ (MB)",
+ "entry"
+ ]
+ },
+ {
+ "title": "読み取り / 書き込みレート (B/s)",
+ "expressionLabels": [
+ "読み取り",
+ "書き込み"
+ ]
+ },
+ {
+ "title": "Ledger ディレクトリ使用量"
+ }
+ ],
+ "instance": [
+ {
+ "title": "JVM メモリプール (MB)"
+ },
+ {
+ "title": "JVM メモリ (MB)",
+ "expressionLabels": [
+ "使用中",
+ "コミット",
+ "初期化"
+ ]
+ },
+ {
+ "title": "JVM スレッド",
+ "expressionLabels": [
+ "現在",
+ "デーモン",
+ "ピーク",
+ "デッドロック"
+ ]
+ },
+ {
+ "title": "GC",
+ "expressionLabels": [
+ "秒",
+ "件数"
+ ]
+ },
+ {
+ "title": "Thread Executor",
+ "expressionLabels": [
+ "完了",
+ "完了タスク",
+ "拒否",
+ "失敗"
+ ]
+ },
+ {
+ "title": "プールスレッド",
+ "expressionLabels": [
+ "高優先度",
+ "読み取り"
+ ]
+ },
+ {
+ "title": "プール最大キューサイズ",
+ "expressionLabels": [
+ "高優先度",
+ "読み取り"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "BookKeeper クラスタ",
+ "instances": "Bookie"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ko.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ko.json
new file mode 100644
index 0000000..4702040
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.ko.json
@@ -0,0 +1,130 @@
+{
+ "alias": "BookKeeper",
+ "group": "MQ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "원장"
+ },
+ {
+ "label": "Entries"
+ },
+ {
+ "label": "쓰기 가능 디렉토리"
+ },
+ {
+ "label": "디렉토리 사용량"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "처리량",
+ "metrics": [
+ {
+ "label": "쓰기 B/s",
+ "tip": "클러스터 전체의 Bookie 쓰기 처리량입니다."
+ },
+ {
+ "label": "읽기 B/s",
+ "tip": "클러스터 전체의 Bookie 읽기 처리량입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Bookie 원장"
+ },
+ {
+ "title": "Bookie 엔트리"
+ },
+ {
+ "title": "쓰기 가능 원장 디렉토리"
+ },
+ {
+ "title": "쓰기 캐시",
+ "expressionLabels": [
+ "크기 (MB)",
+ "entries"
+ ]
+ },
+ {
+ "title": "읽기 캐시",
+ "expressionLabels": [
+ "크기 (MB)",
+ "entries"
+ ]
+ },
+ {
+ "title": "읽기 / 쓰기 비율 (B/s)",
+ "expressionLabels": [
+ "read",
+ "write"
+ ]
+ },
+ {
+ "title": "원장 디렉토리 사용량"
+ }
+ ],
+ "instance": [
+ {
+ "title": "JVM 메모리 풀 (MB)"
+ },
+ {
+ "title": "JVM 메모리 (MB)",
+ "expressionLabels": [
+ "사용",
+ "committed",
+ "init"
+ ]
+ },
+ {
+ "title": "JVM 스레드",
+ "expressionLabels": [
+ "current",
+ "daemon",
+ "피크",
+ "deadlocked"
+ ]
+ },
+ {
+ "title": "GC",
+ "expressionLabels": [
+ "초",
+ "count"
+ ]
+ },
+ {
+ "title": "스레드 실행기",
+ "expressionLabels": [
+ "completed",
+ "완료된 작업",
+ "rejected",
+ "실패"
+ ]
+ },
+ {
+ "title": "풀링된 스레드",
+ "expressionLabels": [
+ "높은 우선순위",
+ "read"
+ ]
+ },
+ {
+ "title": "풀 최대 큐 크기",
+ "expressionLabels": [
+ "높은 우선순위",
+ "read"
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "BookKeeper 클러스터",
+ "instances": "Bookie"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.pt.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.pt.json
new file mode 100644
index 0000000..c4914d2
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.pt.json
@@ -0,0 +1,130 @@
+{
+ "alias": "BookKeeper",
+ "group": "MQ",
+ "slots": {
+ "services": "Clusters do BookKeeper",
+ "instances": "Bookies"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Ledgers"
+ },
+ {
+ "label": "Entradas"
+ },
+ {
+ "label": "Diretórios graváveis"
+ },
+ {
+ "label": "Uso de diretório"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Vazão",
+ "metrics": [
+ {
+ "label": "Escrita B/s",
+ "tip": "Vazão de escrita dos bookies no cluster."
+ },
+ {
+ "label": "Leitura B/s",
+ "tip": "Vazão de leitura dos bookies no cluster."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Ledgers do bookie"
+ },
+ {
+ "title": "Entradas do bookie"
+ },
+ {
+ "title": "Diretórios de ledger graváveis"
+ },
+ {
+ "title": "Cache de escrita",
+ "expressionLabels": [
+ "tamanho (MB)",
+ "entradas"
+ ]
+ },
+ {
+ "title": "Cache de leitura",
+ "expressionLabels": [
+ "tamanho (MB)",
+ "entradas"
+ ]
+ },
+ {
+ "title": "Taxa de L/E (B/s)",
+ "expressionLabels": [
+ "leitura",
+ "escrita"
+ ]
+ },
+ {
+ "title": "Uso do diretório de ledgers"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Pool de memória JVM (MB)"
+ },
+ {
+ "title": "Memória JVM (MB)",
+ "expressionLabels": [
+ "em uso",
+ "comprometida",
+ "init"
+ ]
+ },
+ {
+ "title": "Threads JVM",
+ "expressionLabels": [
+ "atual",
+ "daemon",
+ "pico",
+ "em deadlock"
+ ]
+ },
+ {
+ "title": "GC",
+ "expressionLabels": [
+ "segundos",
+ "contagem"
+ ]
+ },
+ {
+ "title": "Executor de threads",
+ "expressionLabels": [
+ "concluídas",
+ "tarefas concluídas",
+ "rejeitadas",
+ "falhas"
+ ]
+ },
+ {
+ "title": "Threads em pool",
+ "expressionLabels": [
+ "alta prioridade",
+ "leitura"
+ ]
+ },
+ {
+ "title": "Tamanho máximo da fila do pool",
+ "expressionLabels": [
+ "alta prioridade",
+ "leitura"
+ ]
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.zh-CN.json
new file mode 100644
index 0000000..149f1a6
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/bookkeeper.i18n.zh-CN.json
@@ -0,0 +1,74 @@
+{
+ "alias": "BookKeeper",
+ "group": "MQ",
+ "slots": {
+ "services": "BookKeeper 集群",
+ "instances": "Bookie"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "Ledger 数" },
+ { "label": "Entry 数" },
+ { "label": "可写目录" },
+ { "label": "目录使用" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "吞吐量",
+ "metrics": [
+ { "label": "写入 B/s", "tip": "集群所有 Bookie 的写吞吐量。" },
+ { "label": "读取 B/s", "tip": "集群所有 Bookie 的读吞吐量。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "Bookie Ledger 数" },
+ { "title": "Bookie Entry 数" },
+ { "title": "可写 Ledger 目录数" },
+ {
+ "title": "写缓存",
+ "expressionLabels": ["size (MB)", "entries"]
+ },
+ {
+ "title": "读缓存",
+ "expressionLabels": ["size (MB)", "entries"]
+ },
+ {
+ "title": "读 / 写速率(B/s)",
+ "expressionLabels": ["read", "write"]
+ },
+ { "title": "Ledger 目录使用" }
+ ],
+ "instance": [
+ { "title": "JVM 内存池(MB)" },
+ {
+ "title": "JVM 内存(MB)",
+ "expressionLabels": ["used", "committed", "init"]
+ },
+ {
+ "title": "JVM 线程",
+ "expressionLabels": ["current", "daemon", "peak", "deadlocked"]
+ },
+ {
+ "title": "GC",
+ "expressionLabels": ["seconds", "count"]
+ },
+ {
+ "title": "线程执行器",
+ "expressionLabels": ["completed", "tasks completed", "rejected", "failed"]
+ },
+ {
+ "title": "线程池",
+ "expressionLabels": ["high-priority", "read"]
+ },
+ {
+ "title": "线程池最大队列大小",
+ "expressionLabels": ["high-priority", "read"]
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.de.json b/apps/bff/src/bundled_templates/layers/browser.i18n.de.json
new file mode 100644
index 0000000..cb6a664
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.de.json
@@ -0,0 +1,215 @@
+{
+ "alias": "Browser",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Seitenaufrufe"
+ },
+ {
+ "label": "Fehlerrate"
+ },
+ {
+ "label": "Fehler"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Seitenstatus",
+ "metrics": [
+ {
+ "label": "Fehlerrate",
+ "tip": "Prozentsatz der Seitenladevorgänge, die einen Fehler erzeugten."
+ }
+ ]
+ },
+ {
+ "title": "Durchsatz",
+ "metrics": [
+ {
+ "label": "PV / min",
+ "tip": "Seitenaufrufe pro Minute."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "App-Last (PV)",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "App-Fehlerrate",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "App-Fehleranzahl",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Top heiße Seiten",
+ "tip": "Seiten sortiert nach Page Views, Fehlern und Fehlerrate.",
+ "expressions": [
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "PV",
+ "Fehler",
+ "Fehlerrate"
+ ],
+ "expressionUnits": [
+ null,
+ null,
+ null
+ ]
+ },
+ {
+ "title": "Top-Versionen",
+ "tip": "App-Versions-Aufschlüsselung — Last + Fehler + Fehlerrate.",
+ "expressions": [
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "PV",
+ "Fehler",
+ "Fehlerrate"
+ ],
+ "expressionUnits": [
+ null,
+ null,
+ null
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "Versions-PV",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Versions-Fehlerrate",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Versions-Fehleranzahl",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "First Meaningful Paint Perzentil",
+ "tip": "p50–p99 der FMP-Latenz für die ausgewählte Seite. Unter 1 s für p75 ist ein übliches Ziel.",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Seitenlade-Perzentil",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Time-to-Live Perzentil",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "First-Pack-Latenz-Perzentil",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Seiten-Performance-Aufschlüsselung",
+ "tip": "Durchschnittliche Zeit in jeder Phase des Seitenladens — Resolve, Redirect, DNS, TCP, TTFB, Transfer, DOM-Analyse, DOM-Bereit, FPT, voll geladen.",
+ "expressions": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "dns",
+ "redirect",
+ "tcp",
+ "ttfb",
+ "transfer",
+ "dom-analyse",
+ "dom-bereit",
+ "fpt",
+ "last",
+ "resource"
+ ]
+ },
+ {
+ "title": "Seitenfehler nach Typ",
+ "tip": "Zähler für Resource- / JS- / AJAX- / unbekannte Fehler pro Minute.",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "resource",
+ "js",
+ "ajax",
+ "unbekannt"
+ ]
+ },
+ {
+ "title": "Web Vitals",
+ "tip": "Core Web Vitals — FMP, LCP, CLS (Mittel pro Minute). CLS wird durch 1000 geteilt, um es in den üblichen 0–1-Score-Bereich zu bringen.",
+ "expressions": [
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "FMP (ms)",
+ "LCP (ms)",
+ "CLS"
+ ]
+ },
+ {
+ "title": "Interaction-to-Next-Paint-Perzentil",
+ "tip": "INP — Reaktionsmetrik, die FID ersetzt.",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "slots": {
+ "services": "Apps",
+ "instances": "Versionen",
+ "endpoints": "Seiten"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.es.json b/apps/bff/src/bundled_templates/layers/browser.i18n.es.json
new file mode 100644
index 0000000..ea02391
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.es.json
@@ -0,0 +1,139 @@
+{
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Vistas de página"
+ },
+ {
+ "label": "Tasa de errores"
+ },
+ {
+ "label": "Errores"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "metrics": [
+ {
+ "label": "Tasa de errores",
+ "tip": "Porcentaje de cargas de página que produjeron un error."
+ }
+ ],
+ "title": "Estado de la página"
+ },
+ {
+ "title": "Rendimiento",
+ "metrics": [
+ {
+ "label": "PV / min",
+ "tip": "Vistas de página por minuto."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Carga de la app (PV)"
+ },
+ {
+ "title": "Tasa de errores de la app"
+ },
+ {
+ "title": "Conteo de errores de la app"
+ },
+ {
+ "expressionLabels": [
+ "PV",
+ "Errores",
+ "Tasa de errores"
+ ],
+ "title": "Páginas más populares",
+ "tip": "Páginas ordenadas por vistas, errores y tasa de errores."
+ },
+ {
+ "expressionLabels": [
+ "PV",
+ "Errores",
+ "Tasa de errores"
+ ],
+ "title": "Versiones top",
+ "tip": "Desglose por versión de la app — carga + errores + tasa de errores."
+ }
+ ],
+ "instance": [
+ {
+ "title": "PV por versión"
+ },
+ {
+ "title": "Tasa de errores de versión"
+ },
+ {
+ "title": "Conteo de errores de versión"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Percentil de First Meaningful Paint",
+ "tip": "p50–p99 de latencia FMP para la página seleccionada. Por debajo de 1s en p75 es un objetivo común."
+ },
+ {
+ "title": "Percentil de carga de página"
+ },
+ {
+ "title": "Percentil de Time-to-Live"
+ },
+ {
+ "title": "Percentil de latencia del primer paquete"
+ },
+ {
+ "title": "Desglose de rendimiento de página",
+ "tip": "Tiempo medio en cada fase de la carga de página — resolución, redirección, DNS, TCP, TTFB, transferencia, análisis del DOM, DOM listo, FPT, carga completa.",
+ "expressionLabels": [
+ "dns",
+ "redirección",
+ "tcp",
+ "ttfb",
+ "transferencia",
+ "análisis dom",
+ "dom listo",
+ "fpt",
+ "carga",
+ "recurso"
+ ]
+ },
+ {
+ "title": "Errores de página por tipo",
+ "tip": "Contadores de errores Resource / JS / AJAX / unknown por minuto.",
+ "expressionLabels": [
+ "recurso",
+ "js",
+ "ajax",
+ "desconocido"
+ ]
+ },
+ {
+ "title": "Web Vitals",
+ "tip": "Core Web Vitals — FMP, LCP, CLS (media por minuto). CLS se divide por 1000 para llevarlo al rango típico 0–1.",
+ "expressionLabels": [
+ "FMP (ms)",
+ "LCP (ms)",
+ "CLS"
+ ]
+ },
+ {
+ "title": "Percentil de Interaction to Next Paint",
+ "tip": "INP — métrica de responsividad que reemplaza a FID."
+ }
+ ]
+ },
+ "slots": {
+ "instances": "Versiones",
+ "endpoints": "Páginas",
+ "services": "Apps"
+ },
+ "alias": "Navegador"
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.fr.json b/apps/bff/src/bundled_templates/layers/browser.i18n.fr.json
new file mode 100644
index 0000000..fee99c0
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.fr.json
@@ -0,0 +1,139 @@
+{
+ "alias": "Navigateur",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Pages vues"
+ },
+ {
+ "label": "Taux d'erreur"
+ },
+ {
+ "label": "Erreurs"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Santé de la page",
+ "metrics": [
+ {
+ "label": "Taux d'erreur",
+ "tip": "Pourcentage de chargements de page ayant produit une erreur."
+ }
+ ]
+ },
+ {
+ "title": "Débit",
+ "metrics": [
+ {
+ "label": "PV / min",
+ "tip": "Pages vues par minute."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Charge de l'app (PV)"
+ },
+ {
+ "title": "Taux d'erreur de l'app"
+ },
+ {
+ "title": "Nombre d'erreurs de l'app"
+ },
+ {
+ "title": "Top pages chaudes",
+ "tip": "Pages classées par pages vues, erreurs et taux d'erreur.",
+ "expressionLabels": [
+ "PV",
+ "Erreurs",
+ "Taux d'erreur"
+ ]
+ },
+ {
+ "title": "Top versions",
+ "tip": "Ventilation par version de l'app — charge + erreurs + taux d'erreur.",
+ "expressionLabels": [
+ "PV",
+ "Erreurs",
+ "Taux d'erreur"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "PV par version"
+ },
+ {
+ "title": "Taux d'erreur par version"
+ },
+ {
+ "title": "Nombre d'erreurs par version"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Centile du First Meaningful Paint",
+ "tip": "p50–p99 de la latence FMP pour la page sélectionnée. Sous 1s au p75 est une cible courante."
+ },
+ {
+ "title": "Centile du chargement de page"
+ },
+ {
+ "title": "Centile du Time-to-Live"
+ },
+ {
+ "title": "Centile de latence du premier paquet"
+ },
+ {
+ "title": "Ventilation des performances de la page",
+ "tip": "Temps moyen passé à chaque phase du chargement de page — resolve, redirect, DNS, TCP, TTFB, transfer, analyse DOM, DOM prêt, FPT, chargement complet.",
+ "expressionLabels": [
+ "dns",
+ "redirect",
+ "tcp",
+ "ttfb",
+ "transfer",
+ "analyse dom",
+ "dom prêt",
+ "fpt",
+ "chargement",
+ "ressource"
+ ]
+ },
+ {
+ "title": "Erreurs de page par type",
+ "tip": "Compteurs d'erreurs resource / JS / AJAX / unknown par minute.",
+ "expressionLabels": [
+ "ressource",
+ "js",
+ "ajax",
+ "inconnu"
+ ]
+ },
+ {
+ "title": "Web Vitals",
+ "tip": "Core Web Vitals — FMP, LCP, CLS (moyenne par minute). CLS est divisé par 1000 pour obtenir la plage de score typique 0–1.",
+ "expressionLabels": [
+ "FMP (ms)",
+ "LCP (ms)",
+ "CLS"
+ ]
+ },
+ {
+ "title": "Centile Interaction to Next Paint",
+ "tip": "INP — métrique de réactivité remplaçant FID."
+ }
+ ]
+ },
+ "slots": {
+ "services": "Apps",
+ "instances": "Versions",
+ "endpoints": "Pages"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.ja.json b/apps/bff/src/bundled_templates/layers/browser.i18n.ja.json
new file mode 100644
index 0000000..125bced
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.ja.json
@@ -0,0 +1,139 @@
+{
+ "alias": "ブラウザ",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "ページビュー"
+ },
+ {
+ "label": "エラー率"
+ },
+ {
+ "label": "エラー"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "ページヘルス",
+ "metrics": [
+ {
+ "label": "エラー率",
+ "tip": "エラーを発生させたページロードの割合。"
+ }
+ ]
+ },
+ {
+ "title": "スループット",
+ "metrics": [
+ {
+ "label": "PV / 分",
+ "tip": "1分あたりのページビュー。"
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "アプリ負荷 (PV)"
+ },
+ {
+ "title": "アプリエラー率"
+ },
+ {
+ "title": "アプリエラー件数"
+ },
+ {
+ "title": "上位ホットページ",
+ "tip": "ページビュー、エラー、エラー率でランク付けしたページ。",
+ "expressionLabels": [
+ "PV",
+ "エラー",
+ "エラー率"
+ ]
+ },
+ {
+ "title": "上位バージョン",
+ "tip": "アプリバージョン内訳 — 負荷 + エラー + エラー率。",
+ "expressionLabels": [
+ "PV",
+ "エラー",
+ "エラー率"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "バージョン PV"
+ },
+ {
+ "title": "バージョン別エラー率"
+ },
+ {
+ "title": "バージョン別エラー件数"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "First Meaningful Paint パーセンタイル",
+ "tip": "選択中ページの FMP レイテンシ p50–p99。p75 で 1 秒以下が一般的な目標。"
+ },
+ {
+ "title": "ページロードパーセンタイル"
+ },
+ {
+ "title": "Time-to-Live パーセンタイル"
+ },
+ {
+ "title": "First Pack レイテンシパーセンタイル"
+ },
+ {
+ "title": "ページパフォーマンス内訳",
+ "tip": "ページロードの各フェーズに費やされた平均時間 — resolve、redirect、DNS、TCP、TTFB、transfer、DOM 解析、DOM ready、FPT、フルロード。",
+ "expressionLabels": [
+ "DNS",
+ "リダイレクト",
+ "TCP",
+ "TTFB",
+ "転送",
+ "DOM 解析",
+ "DOM ready",
+ "FPT",
+ "ロード",
+ "リソース"
+ ]
+ },
+ {
+ "title": "タイプ別ページエラー",
+ "tip": "1分あたりの Resource / JS / AJAX / 不明エラーカウンタ。",
+ "expressionLabels": [
+ "リソース",
+ "JS",
+ "AJAX",
+ "不明"
+ ]
+ },
+ {
+ "title": "Web Vitals",
+ "tip": "Core Web Vitals — FMP、LCP、CLS(1分あたり平均)。CLS は典型的な 0–1 スコア範囲に収めるため 1000 で除算。",
+ "expressionLabels": [
+ "FMP (ms)",
+ "LCP (ms)",
+ "CLS"
+ ]
+ },
+ {
+ "title": "Interaction to Next Paint パーセンタイル",
+ "tip": "INP — FID を置き換えた応答性メトリクス。"
+ }
+ ]
+ },
+ "slots": {
+ "services": "アプリ",
+ "instances": "バージョン",
+ "endpoints": "ページ"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.ko.json b/apps/bff/src/bundled_templates/layers/browser.i18n.ko.json
new file mode 100644
index 0000000..0d75014
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.ko.json
@@ -0,0 +1,139 @@
+{
+ "alias": "브라우저",
+ "layer-header": {
+ "columns": [
+ {
+ "label": "페이지 뷰"
+ },
+ {
+ "label": "오류율"
+ },
+ {
+ "label": "오류"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "페이지 상태",
+ "metrics": [
+ {
+ "label": "오류율",
+ "tip": "오류를 발생시킨 페이지 로드의 비율입니다."
+ }
+ ]
+ },
+ {
+ "title": "처리량",
+ "metrics": [
+ {
+ "label": "PV / 분",
+ "tip": "분당 페이지 뷰입니다."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "앱 로드 (PV)"
+ },
+ {
+ "title": "앱 오류율"
+ },
+ {
+ "title": "앱 오류 수"
+ },
+ {
+ "title": "인기 페이지",
+ "tip": "페이지 뷰, 오류, 오류율 기준으로 정렬된 페이지입니다.",
+ "expressionLabels": [
+ "PV",
+ "오류",
+ "오류율"
+ ]
+ },
+ {
+ "title": "상위 버전",
+ "tip": "앱 버전별 분포 — 로드 + 오류 + 오류율.",
+ "expressionLabels": [
+ "PV",
+ "오류",
+ "오류율"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "버전 PV"
+ },
+ {
+ "title": "버전 오류율"
+ },
+ {
+ "title": "버전 오류 수"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "First Meaningful Paint 백분위",
+ "tip": "선택한 페이지의 FMP 지연 시간 p50–p99 입니다. p75가 1초 미만이면 일반적인 목표를 달성한 것입니다."
+ },
+ {
+ "title": "페이지 로드 백분위"
+ },
+ {
+ "title": "TTL 백분위"
+ },
+ {
+ "title": "First Pack 지연 시간 백분위"
+ },
+ {
+ "title": "페이지 성능 분해",
+ "tip": "페이지 로드 각 단계의 평균 시간 — resolve, redirect, DNS, TCP, TTFB, transfer, DOM 분석, DOM ready, FPT, full load.",
+ "expressionLabels": [
+ "dns",
+ "리다이렉트",
+ "tcp",
+ "ttfb",
+ "transfer",
+ "dom 분석",
+ "dom ready",
+ "fpt",
+ "load",
+ "리소스"
+ ]
+ },
+ {
+ "title": "유형별 페이지 오류",
+ "tip": "Resource / JS / AJAX / unknown 오류의 분당 카운터입니다.",
+ "expressionLabels": [
+ "리소스",
+ "js",
+ "ajax",
+ "알 수 없음"
+ ]
+ },
+ {
+ "title": "Web Vitals",
+ "tip": "Core Web Vitals — FMP, LCP, CLS (분당 평균). CLS는 일반적인 0–1 점수 범위로 맞추기 위해 1000으로 나눕니다.",
+ "expressionLabels": [
+ "FMP (ms)",
+ "LCP (ms)",
+ "CLS"
+ ]
+ },
+ {
+ "title": "Interaction to Next Paint 백분위",
+ "tip": "INP — FID를 대체하는 반응성 지표입니다."
+ }
+ ]
+ },
+ "slots": {
+ "services": "앱",
+ "instances": "버전",
+ "endpoints": "페이지"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.pt.json b/apps/bff/src/bundled_templates/layers/browser.i18n.pt.json
new file mode 100644
index 0000000..ee8a8fe
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.pt.json
@@ -0,0 +1,139 @@
+{
+ "alias": "Navegador",
+ "slots": {
+ "services": "Apps",
+ "instances": "Versões",
+ "endpoints": "Páginas"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "Page Views"
+ },
+ {
+ "label": "Taxa de erros"
+ },
+ {
+ "label": "Erros"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Saúde da página",
+ "metrics": [
+ {
+ "label": "Taxa de erros",
+ "tip": "Porcentagem de carregamentos de página que resultaram em erro."
+ }
+ ]
+ },
+ {
+ "title": "Vazão",
+ "metrics": [
+ {
+ "label": "PV / min",
+ "tip": "Page views por minuto."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Carga do app (PV)"
+ },
+ {
+ "title": "Taxa de erros do app"
+ },
+ {
+ "title": "Contagem de erros do app"
+ },
+ {
+ "title": "Páginas mais acessadas",
+ "tip": "Páginas ordenadas por page views, erros e taxa de erros.",
+ "expressionLabels": [
+ "PV",
+ "Erros",
+ "Taxa de erros"
+ ]
+ },
+ {
+ "title": "Top versões",
+ "tip": "Detalhamento por versão do app — carga + erros + taxa de erros.",
+ "expressionLabels": [
+ "PV",
+ "Erros",
+ "Taxa de erros"
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "PV da versão"
+ },
+ {
+ "title": "Taxa de erros da versão"
+ },
+ {
+ "title": "Contagem de erros da versão"
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Percentil de First Meaningful Paint",
+ "tip": "p50–p99 da latência de FMP para a página selecionada. Abaixo de 1s no p75 é uma meta comum."
+ },
+ {
+ "title": "Percentil de carregamento de página"
+ },
+ {
+ "title": "Percentil de Time-to-Live"
+ },
+ {
+ "title": "Percentil de latência do primeiro pacote"
+ },
+ {
+ "title": "Detalhamento de performance da página",
+ "tip": "Tempo médio em cada fase do carregamento — resolve, redirect, DNS, TCP, TTFB, transferência, análise do DOM, DOM ready, FPT, carga completa.",
+ "expressionLabels": [
+ "dns",
+ "redirect",
+ "tcp",
+ "ttfb",
+ "transferência",
+ "análise do dom",
+ "dom ready",
+ "fpt",
+ "load",
+ "recurso"
+ ]
+ },
+ {
+ "title": "Erros da página por tipo",
+ "tip": "Contadores de erro Resource / JS / AJAX / unknown por minuto.",
+ "expressionLabels": [
+ "recurso",
+ "js",
+ "ajax",
+ "desconhecido"
+ ]
+ },
+ {
+ "title": "Web Vitals",
+ "tip": "Core Web Vitals — FMP, LCP, CLS (média por minuto). CLS é dividido por 1000 para entrar na faixa típica de 0–1.",
+ "expressionLabels": [
+ "FMP (ms)",
+ "LCP (ms)",
+ "CLS"
+ ]
+ },
+ {
+ "title": "Percentil de Interaction to Next Paint",
+ "tip": "INP — métrica de responsividade que substitui o FID."
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/browser.i18n.zh-CN.json b/apps/bff/src/bundled_templates/layers/browser.i18n.zh-CN.json
new file mode 100644
index 0000000..f068517
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/browser.i18n.zh-CN.json
@@ -0,0 +1,81 @@
+{
+ "alias": "浏览器",
+ "slots": {
+ "services": "应用",
+ "instances": "版本",
+ "endpoints": "页面"
+ },
+ "layer-header": {
+ "columns": [
+ { "label": "页面浏览量" },
+ { "label": "错误率" },
+ { "label": "错误" }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "页面健康",
+ "metrics": [
+ { "label": "错误率", "tip": "出现错误的页面加载比例。" }
+ ]
+ },
+ {
+ "title": "吞吐量",
+ "metrics": [
+ { "label": "PV / 分钟", "tip": "每分钟页面浏览量。" }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ { "title": "应用负载(PV)" },
+ { "title": "应用错误率" },
+ { "title": "应用错误数" },
+ {
+ "title": "热门页面",
+ "tip": "按页面浏览量、错误数与错误率排名的页面。",
+ "expressionLabels": ["PV", "错误", "错误率"]
+ },
+ {
+ "title": "热门版本",
+ "tip": "按版本统计的负载 + 错误 + 错误率。",
+ "expressionLabels": ["PV", "错误", "错误率"]
+ }
+ ],
+ "instance": [
+ { "title": "版本 PV" },
+ { "title": "版本错误率" },
+ { "title": "版本错误数" }
+ ],
+ "endpoint": [
+ {
+ "title": "首屏渲染(FMP)分位",
+ "tip": "所选页面 FMP 延迟的 p50–p99。常见目标是 p75 低于 1 秒。"
+ },
+ { "title": "页面加载分位" },
+ { "title": "存活时长分位" },
+ { "title": "首包延迟分位" },
+ {
+ "title": "页面性能分解",
+ "tip": "页面加载各阶段的平均耗时 — resolve、redirect、DNS、TCP、TTFB、传输、DOM 分析、DOM Ready、FPT、完整加载。",
+ "expressionLabels": ["dns", "redirect", "tcp", "ttfb", "transfer", "dom analysis", "dom ready", "fpt", "load", "resource"]
+ },
+ {
+ "title": "按类型的页面错误",
+ "tip": "Resource / JS / AJAX / 未知错误每分钟计数。",
+ "expressionLabels": ["resource", "js", "ajax", "unknown"]
+ },
+ {
+ "title": "Web Vitals",
+ "tip": "核心 Web Vitals — FMP、LCP、CLS(每分钟平均值)。CLS 除以 1000 以归一化到典型 0–1 评分范围。",
+ "expressionLabels": ["FMP (ms)", "LCP (ms)", "CLS"]
+ },
+ {
+ "title": "Interaction to Next Paint 分位",
+ "tip": "INP — 替代 FID 的响应性指标。"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/cilium_service.i18n.de.json b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.de.json
new file mode 100644
index 0000000..ce45bac
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.de.json
@@ -0,0 +1,311 @@
+{
+ "alias": "Cilium Service",
+ "group": "Kubernetes",
+ "naming": {
+ "alias": "namespace"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPM"
+ },
+ {
+ "label": "Latenz"
+ },
+ {
+ "label": "Erfolgsrate"
+ },
+ {
+ "label": "TCP-Drop"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Latenz & Fehler",
+ "metrics": [
+ {
+ "label": "Mittlere Latenz",
+ "tip": "Durchschnittliche Protokoll-Latenz (ms)."
+ },
+ {
+ "label": "Erfolgsrate",
+ "tip": "Erfolgreiche Aufrufe / Gesamtaufrufe."
+ }
+ ]
+ },
+ {
+ "title": "Durchsatz",
+ "metrics": [
+ {
+ "label": "Protokoll-RPM",
+ "tip": "Protokollaufrufe pro Minute."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "L4 Read-Pakete/min",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "L4 Write-Pakete/min",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "TCP-Drop / min",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "lesen",
+ "schreiben"
+ ]
+ },
+ {
+ "title": "TCP-Drop nach Grund",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ },
+ {
+ "title": "HTTP-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP Non-2xx-Status",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "1xx",
+ "3xx",
+ "4xx",
+ "5xx"
+ ]
+ },
+ {
+ "title": "DNS-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ },
+ {
+ "title": "DNS-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "DNS-Fehler / min",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Kafka-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ },
+ {
+ "title": "Kafka-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Kafka-Fehler / min",
+ "expressions": [
+ null
+ ]
+ }
+ ],
+ "instance": [
+ {
+ "title": "L4 Read-Pakete/min",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "L4 Write-Pakete/min",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ },
+ {
+ "title": "HTTP Non-2xx-Status",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "1xx",
+ "3xx",
+ "4xx",
+ "5xx"
+ ]
+ },
+ {
+ "title": "DNS-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ },
+ {
+ "title": "DNS-Fehler",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "Kafka-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "HTTP-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ },
+ {
+ "title": "HTTP-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "HTTP Non-2xx-Status",
+ "expressions": [
+ null,
+ null,
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "1xx",
+ "3xx",
+ "4xx",
+ "5xx"
+ ]
+ },
+ {
+ "title": "DNS-Last",
+ "expressions": [
+ null,
+ null
+ ],
+ "expressionLabels": [
+ "aufrufe",
+ "erfolg"
+ ]
+ },
+ {
+ "title": "DNS-Dauer",
+ "expressions": [
+ null
+ ]
+ },
+ {
+ "title": "DNS-Fehler",
+ "expressions": [
+ null
+ ]
+ }
+ ]
+ },
+ "topology": {
+ "nodeMetrics": [
+ {
+ "label": "RPM"
+ },
+ {
+ "label": "Erfolg %"
+ },
+ {
+ "label": "Latenz"
+ }
+ ],
+ "linkServerMetrics": [
+ {
+ "label": "HTTP RPM"
+ },
+ {
+ "label": "Mittlere Latenz"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Dienste",
+ "instances": "Pods",
+ "endpoints": "Endpunkte"
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/cilium_service.i18n.es.json b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.es.json
new file mode 100644
index 0000000..29a164f
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.es.json
@@ -0,0 +1,215 @@
+{
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPM"
+ },
+ {
+ "label": "Latencia"
+ },
+ {
+ "label": "Tasa de éxito"
+ },
+ {
+ "label": "TCP Drop"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Latencia y errores",
+ "metrics": [
+ {
+ "label": "Latencia media",
+ "tip": "Latencia media del protocolo (ms)."
+ },
+ {
+ "label": "Tasa de éxito",
+ "tip": "Llamadas exitosas / total de llamadas."
+ }
+ ]
+ },
+ {
+ "title": "Rendimiento",
+ "metrics": [
+ {
+ "label": "RPM de protocolo",
+ "tip": "Llamadas de protocolo por minuto."
+ }
+ ]
+ }
+ ]
+ },
+ "topology": {
+ "nodeMetrics": [
+ {
+ "label": "RPM"
+ },
+ {
+ "label": "Éxito %"
+ },
+ {
+ "label": "Latencia"
+ }
+ ],
+ "linkServerMetrics": [
+ {
+ "label": "RPM HTTP"
+ },
+ {
+ "label": "Latencia media"
+ }
+ ]
+ },
+ "slots": {
+ "services": "Servicios",
+ "instances": "Pods",
+ "endpoints": "Endpoints"
+ },
+ "alias": "Cilium Service",
+ "group": "Kubernetes",
+ "naming": {
+ "alias": "namespace"
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Paquetes L4 de lectura/min"
+ },
+ {
+ "title": "Paquetes L4 de escritura/min"
+ },
+ {
+ "title": "TCP Drop / min",
+ "expressionLabels": [
+ "lectura",
+ "escritura"
+ ]
+ },
+ {
+ "title": "TCP Drop por motivo"
+ },
+ {
+ "title": "Carga HTTP",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ },
+ {
+ "title": "Duración HTTP"
+ },
+ {
+ "title": "Estado HTTP no-2xx",
+ "expressionLabels": [
+ "1xx",
+ "3xx",
+ "4xx",
+ "5xx"
+ ]
+ },
+ {
+ "title": "Carga DNS",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ },
+ {
+ "title": "Duración DNS"
+ },
+ {
+ "title": "Errores DNS / min"
+ },
+ {
+ "title": "Carga de Kafka",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ },
+ {
+ "title": "Duración de Kafka"
+ },
+ {
+ "title": "Errores de Kafka / min"
+ }
+ ],
+ "instance": [
+ {
+ "title": "Paquetes L4 de lectura/min"
+ },
+ {
+ "title": "Paquetes L4 de escritura/min"
+ },
+ {
+ "title": "Carga HTTP",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ },
+ {
+ "title": "Estado HTTP no-2xx",
+ "expressionLabels": [
+ "1xx",
+ "3xx",
+ "4xx",
+ "5xx"
+ ]
+ },
+ {
+ "title": "Carga DNS",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ },
+ {
+ "title": "Errores DNS"
+ },
+ {
+ "title": "Carga de Kafka",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ }
+ ],
+ "endpoint": [
+ {
+ "title": "Carga HTTP",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ },
+ {
+ "title": "Duración HTTP"
+ },
+ {
+ "title": "Estado HTTP no-2xx",
+ "expressionLabels": [
+ "1xx",
+ "3xx",
+ "4xx",
+ "5xx"
+ ]
+ },
+ {
+ "title": "Carga DNS",
+ "expressionLabels": [
+ "llamadas",
+ "éxito"
+ ]
+ },
+ {
+ "title": "Duración DNS"
+ },
+ {
+ "title": "Errores DNS"
+ }
+ ]
+ }
+}
diff --git a/apps/bff/src/bundled_templates/layers/cilium_service.i18n.fr.json b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.fr.json
new file mode 100644
index 0000000..8121a55
--- /dev/null
+++ b/apps/bff/src/bundled_templates/layers/cilium_service.i18n.fr.json
@@ -0,0 +1,215 @@
+{
+ "alias": "Service Cilium",
+ "group": "Kubernetes",
+ "naming": {
+ "alias": "namespace"
+ },
+ "layer-header": {
+ "columns": [
+ {
+ "label": "RPM"
+ },
+ {
+ "label": "Latence"
+ },
+ {
+ "label": "Taux de succès"
+ },
+ {
+ "label": "Drop TCP"
+ }
+ ]
+ },
+ "overview": {
+ "groups": [
+ {
+ "title": "Latence et erreurs",
+ "metrics": [
+ {
+ "label": "Latence moyenne",
+ "tip": "Latence moyenne du protocole (ms)."
+ },
+ {
+ "label": "Taux de succès",
+ "tip": "Appels réussis / appels totaux."
+ }
+ ]
+ },
+ {
+ "title": "Débit",
+ "metrics": [
+ {
+ "label": "RPM de protocole",
+ "tip": "Appels de protocole par minute."
+ }
+ ]
+ }
+ ]
+ },
+ "dashboards": {
+ "service": [
+ {
+ "title": "Paquets L4 en lecture/min"
+ },
... 55407 lines suppressed ...