Skip to content

Commit 0729e02

Browse files
authored
fix(trogonstack-datadog): reconcile Customer-Facing group with I/P/D prefix convention (#31)
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
1 parent 0dcf24b commit 0729e02

4 files changed

Lines changed: 58 additions & 55 deletions

File tree

plugins/trogonstack-datadog/skills/datadog-design-dashboard/SKILL.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Before designing, understand what you are building observability for. The metric
2929

3030
**If the user points you to a codebase**: Read it. Look at the entry points, the API routes, the database models, the queue consumers, the external service calls. Understanding the code gives you the context to choose metrics that actually matter — not just generic RED/USE signals.
3131

32-
**If the user describes the business**: Use that context to tailor the Customer-Facing section. An e-commerce service cares about checkout success rates. A messaging service cares about delivery latency. A payment service cares about transaction completion. Generic "request rate" and "error rate" are a starting point, but the real value comes from metrics that map to business outcomes.
32+
**If the user describes the business**: Use that context to tailor the Business (`B`) section. An e-commerce service cares about checkout success rates. A messaging service cares about delivery latency. A payment service cares about transaction completion. Generic "request rate" and "error rate" are a starting point, but the real value comes from metrics that map to customer-visible outcomes.
3333

3434
**Skip domain discovery if**: You already have deep context about the service from prior conversations or the user has provided detailed specifications.
3535

@@ -81,11 +81,11 @@ Using your domain understanding and the chosen framework, design the group struc
8181
- **[thresholds.md](references/thresholds.md)** — Alert threshold markers, threshold proximity, Y-axis configuration
8282

8383
**Key principles** (not rigid rules — use judgment):
84-
- **Prefix every widget title** with its layer and priority: `I0:` (most critical infra), `P0:` (most critical platform), `D0:` (most critical domain). See [widgets.md](references/widgets.md) for the full prefix system.
85-
- Start with a **Customer-Facing** group (5-8 metrics) so someone with zero service knowledge can tell if customers are affected within 5 seconds. Tailor the metrics to the domain.
84+
- **Prefix every widget title** with its layer and priority: `I0:` (most critical infra), `P0:` (most critical platform), `D0:` (most critical domain), `B0:` (most critical business). See [widgets.md](references/widgets.md) for the full prefix system.
85+
- Start with a **Business** group (5-8 `B`-prefixed metrics) so someone with zero service knowledge can tell if customers are affected within 5 seconds. Tailor the metrics to the domain.
8686
- Timeseries widgets should have **alert threshold markers** (red lines) with thresholds close to normal traffic. If a metric doesn't warrant an alert, question whether it belongs — but context-providing metrics can earn their place.
8787
- Set **Y-axis max** explicitly near the threshold — don't let auto-scaling compress the normal range.
88-
- Order groups macro-to-micro: customer-facing → overview → domain-specific → infrastructure.
88+
- Order groups macro-to-micro: business → overview → domain-specific → infrastructure.
8989

9090
### 4. Write the output
9191

@@ -130,12 +130,12 @@ pup metrics list --filter="trace.http.request.*"
130130
- [ ] Dashboard reflects the actual product and business — metrics tailored to the domain
131131
- [ ] Dashboard title is concise (no environment, region, or version)
132132
- [ ] Template variables defined for env, service, and relevant scopes (default `*`)
133-
- [ ] **Customer-Facing group** with 5-8 metrics tailored to the service's business impact
134-
- [ ] Groups ordered macro-to-micro (customer-facing → overview → details)
133+
- [ ] **Business group** with 5-8 `B`-prefixed metrics tailored to the service's customer-visible outcomes
134+
- [ ] Groups ordered macro-to-micro (business → overview → details)
135135
- [ ] **Timeseries widgets have alert threshold markers** (red lines) where the metric is alertable
136136
- [ ] **Thresholds close to normal traffic** — no excessive whitespace
137137
- [ ] **Zero-knowledge readability** — someone with no service knowledge can spot problems via red indicators
138-
- [ ] **Widget titles prefixed** with layer and priority (`I0:`, `P1:`, `D0:`, etc.)
138+
- [ ] **Widget titles prefixed** with layer and priority (`I0:`, `P1:`, `D0:`, `B0:`, etc.)
139139
- [ ] Widget titles use sentence case, don't repeat group name
140140
- [ ] Every metric earns its place — if it spikes, someone can act on it
141141

plugins/trogonstack-datadog/skills/datadog-design-dashboard/references/layouts.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ Template variables make one dashboard serve many contexts. Define them before la
2929

3030
| Approach | Strengths | Weaknesses |
3131
|----------|-----------|------------|
32-
| **Per-service** | Focused, fast to scan during incidents. Each team owns their dashboard. Customer-Facing section is specific and actionable. Ops reviews can go service-by-service. | More dashboards to maintain. Cross-service correlation requires switching dashboards. |
33-
| **Consolidated** | Single pane of glass for multiple services. Good for seeing cross-service dependencies. Fewer dashboards to maintain. | Can become overwhelming (100+ metrics). Customer-Facing section becomes diluted. Slower to load and harder to scan during incidents. |
34-
| **Hybrid** | Per-service dashboards for depth + one top-level dashboard with only the Customer-Facing section from each service. Best of both worlds. | Requires maintaining both levels. Customer-Facing metrics duplicated across dashboards. |
32+
| **Per-service** | Focused, fast to scan during incidents. Each team owns their dashboard. Business section is specific and actionable. Ops reviews can go service-by-service. | More dashboards to maintain. Cross-service correlation requires switching dashboards. |
33+
| **Consolidated** | Single pane of glass for multiple services. Good for seeing cross-service dependencies. Fewer dashboards to maintain. | Can become overwhelming (100+ metrics). Business section becomes diluted. Slower to load and harder to scan during incidents. |
34+
| **Hybrid** | Per-service dashboards for depth + one top-level dashboard with only the Business section from each service. Best of both worlds. | Requires maintaining both levels. Business metrics duplicated across dashboards. |
3535

3636
---
3737

@@ -41,7 +41,7 @@ Organize widgets into collapsible groups. Groups are the primary navigation mech
4141

4242
**Recommended groups** (in order):
4343

44-
1. **Customer-Facing** — 5-8 metrics that answer "are customers affected?" within 5 seconds. Should be the first group. The specific metrics depend on the product. Design so someone with zero service knowledge can spot problems via red indicators.
44+
1. **Business** — 5-8 `B`-prefixed metrics that answer "are customers affected?" within 5 seconds. Should be the first group. The specific metrics depend on the product. Design so someone with zero service knowledge can spot problems via red indicators.
4545
2. **Overview** — Service checks, key health indicators, monitor summaries.
4646
3. **Domain-specific groups** — Organized by the chosen framework (e.g., Rate / Errors / Duration for RED), adapted to the service's actual architecture and concerns.
4747

@@ -66,12 +66,12 @@ The most common dashboard type. Monitors a single service's request-level health
6666
┌─────────────────────────────────────────────────────┐
6767
│ Template Variables: env | service | region │
6868
├─────────────────────────────────────────────────────┤
69-
│ Group: Customer-Facing
69+
│ Group: Business
7070
│ ┌──────────┬──────────┬──────────┬──────────┐ │
71-
│ │ P0:Req/s │ P0:Errs │ P0:p99 │ P0:Apdex │ │
71+
│ │ B0:Req/s │ B0:Errs │ B0:p99 │ B0:Apdex │ │
7272
│ │ (QV+bg) │ (QV+bg) │ (QV+bg) │ (QV+bg) │ │
7373
│ ├──────────────────────┬────────────────────┤ │
74-
│ │ D0: Key txn success │ I0: DB conn pool │ │
74+
│ │ B0: Key txn success │ B1: DB conn pool │ │
7575
│ │ (TS + red threshold) │ (TS + red thresh.) │ │
7676
│ └──────────────────────┴────────────────────┘ │
7777
│ 5-8 metrics · zero-knowledge readable │
@@ -112,7 +112,7 @@ The most common dashboard type. Monitors a single service's request-level health
112112
└─────────────────────────────────────────────────────┘
113113
```
114114

115-
All widget titles use the layer-priority prefix system (`I0:`, `P0:`, `D0:`, etc.) — see [widgets.md](widgets.md) for details.
115+
All widget titles use the layer-priority prefix system (`I0:`, `P0:`, `D0:`, `B0:`, etc.) — see [widgets.md](widgets.md) for details.
116116
All timeseries widgets include red alert threshold markers set close to normal traffic.
117117

118118
**Widget count**: 20-24
@@ -128,12 +128,12 @@ Monitors host, container, or VM resource health.
128128
┌─────────────────────────────────────────────────────┐
129129
│ Template Variables: env | host | availability_zone │
130130
├─────────────────────────────────────────────────────┤
131-
│ Group: Customer-Facing
131+
│ Group: Business
132132
│ ┌──────────┬──────────┬──────────┬──────────┐ │
133-
│ │P0:Svc Rq │P0:Svc Err│P0:Svc p99│P0:Apdex │ │
133+
│ │B0:Svc Rq │B0:Svc Err│B0:Svc p99│B0:Apdex │ │
134134
│ │ (QV+bg) │ (QV+bg) │ (QV+bg) │ (QV+bg) │ │
135135
│ ├──────────────────────┬────────────────────┤ │
136-
│ │ I0: Host avail. │ I0: Network errors │ │
136+
│ │ B0: Host avail. │ B1: Network errors │ │
137137
│ │ (TS + red threshold) │ (TS + red thresh.) │ │
138138
│ └──────────────────────┴────────────────────┘ │
139139
│ 5-8 metrics · zero-knowledge readable │
@@ -186,12 +186,12 @@ High-level view across multiple services for leadership.
186186
┌─────────────────────────────────────────────────────┐
187187
│ Template Variables: env | team | region │
188188
├─────────────────────────────────────────────────────┤
189-
│ Group: Customer-Facing
189+
│ Group: Business
190190
│ ┌──────────┬──────────┬──────────┬──────────┐ │
191-
│ │P0:Uptime │P0:Cst Err│P0:p99 Lat│P0:Traffic│ │
191+
│ │B0:Uptime │B0:Cst Err│B0:p99 Lat│B0:Traffic│ │
192192
│ │ (QV+bg) │ (QV+bg) │ (QV+bg) │ (QV+bg) │ │
193193
│ ├──────────────────────┬────────────────────┤ │
194-
│ │ D0: Revenue txn succ │ D0: Checkout lat │ │
194+
│ │ B0: Revenue txn succ │ B0: Checkout lat │ │
195195
│ │ (TS + red threshold) │ (TS + red thresh.) │ │
196196
│ └──────────────────────┴────────────────────┘ │
197197
│ 5-8 metrics · zero-knowledge readable │
@@ -242,12 +242,12 @@ Deep-dive dashboard for active incident investigation.
242242
┌─────────────────────────────────────────────────────┐
243243
│ Template Variables: env | service | host | endpoint │
244244
├─────────────────────────────────────────────────────┤
245-
│ Group: Customer-Facing
245+
│ Group: Business
246246
│ ┌──────────┬──────────┬──────────┬──────────┐ │
247-
│ │P0:Cst Err│P0:p99 Lat│P0:Req/s │P0:Apdex │ │
247+
│ │B0:Cst Err│B0:p99 Lat│B0:Req/s │B0:Apdex │ │
248248
│ │ (QV+bg) │ (QV+bg) │ (QV+bg) │ (QV+bg) │ │
249249
│ ├──────────────────────┬────────────────────┤ │
250-
│ │ D0: Key txn success │ I0: DB conn pool │ │
250+
│ │ B0: Key txn success │ B1: DB conn pool │ │
251251
│ │ (TS + red threshold) │ (TS + red thresh.) │ │
252252
│ └──────────────────────┴────────────────────┘ │
253253
│ 5-8 metrics · zero-knowledge readable │

plugins/trogonstack-datadog/skills/datadog-design-dashboard/references/widgets.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ Every widget title starts with a layer-priority prefix so anyone can immediately
234234
|--------|-------|---------------|
235235
| `I` | **Infrastructure** | Load balancers, databases, networks, DNS, CDN, storage — shared infrastructure that the service depends on but doesn't own |
236236
| `P` | **Platform** | Service-specific platform components from the codebase — gRPC servers, connection pools, cache clients, queue consumers, circuit breakers |
237-
| `D` | **Domain** | Business and domain metrics — checkout success rate, order throughput, payment completion, delivery latency, user sign-ups |
237+
| `D` | **Domain** | Technical health of domain processes — saga failures, aggregate timeouts, domain event lag (tech stuff) |
238+
| `B` | **Business** | Business outcomes — checkout success rate, payment completion, on-time delivery (business stuff) |
238239

239240
### Priority Numbers
240241

@@ -249,21 +250,20 @@ The number after the layer letter indicates priority within that layer. `0` is t
249250
### Examples
250251

251252
```text
252-
Group: "Customer-Facing"
253-
D0: Checkout success rate
254-
D0: Order throughput
255-
I0: Load balancer 5xx
256-
P0: API p99 latency
257-
I1: Database connection pool
258-
P1: gRPC client errors
253+
Group: "Business"
254+
B0: Checkout success rate
255+
B0: Order throughput
256+
B1: API p99 latency
257+
B1: Customer-visible error rate
258+
B2: Failed payment rate
259259
260260
Group: "Rate"
261261
P0: Requests per second
262262
P1: By endpoint
263263
264264
Group: "Errors"
265265
P0: Error rate over time
266-
D1: Failed payment rate
266+
D1: Order saga failures
267267
P2: Top errors by endpoint
268268
269269
Group: "Infrastructure"
@@ -279,7 +279,8 @@ When assigning prefixes, use the domain discovery context:
279279

280280
- **I (Infrastructure)**: Would this metric exist even if your code didn't? Load balancer, database engine, OS resources, network — things the ops team manages.
281281
- **P (Platform)**: Is this about how your code runs? Connection pools your code configures, gRPC channels your code opens, cache hit rates for caches your code uses — the technical platform layer.
282-
- **D (Domain)**: Does this metric map to a business outcome? Checkout completions, delivery SLA, payment success — things a product manager would understand.
282+
- **D (Domain)**: Is this technical health of a domain process? Saga step failures, aggregate timeouts, domain event processing lag — tech stuff that a domain engineer cares about.
283+
- **B (Business)**: Is this a business outcome? Payment success rate, checkout completion, on-time delivery — business stuff that a product manager or customer cares about.
283284

284285
The priority number comes from the ops review order: what do you look at first when paged at 3am? That's `0`.
285286

@@ -291,7 +292,7 @@ The priority number comes from the ops review order: what do you look at first w
291292

292293
**Widget titles**: Prefix + sentence case, concise, action-oriented.
293294

294-
- Always start with the layer-priority prefix (`I0:`, `P1:`, `D0:`, etc.)
295+
- Always start with the layer-priority prefix (`I0:`, `P1:`, `D0:`, `B0:`, etc.)
295296
- Do not repeat the group title after the prefix
296297
- Do not repeat the integration name if it is obvious from context
297298
- Alias all formulas so legends are readable

0 commit comments

Comments
 (0)