|
| 1 | +{ |
| 2 | + "name": "Email delivery (Brevo)", |
| 3 | + "description": "Closes the '201 ≠ delivered' gap. Brevo's transactional API returns 201 the instant it accepts the POST; the actual SMTP relay happens async. This dashboard surfaces the RECEIVER-side ledger updates (api /webhooks/brevo/:secret) so the team sees what Brevo's relay actually did, not what the API said it would do. Source: brevo_webhook_events_total Prometheus counter + forwarder_sent rows via NRQL log queries.", |
| 4 | + "permissions": "PUBLIC_READ_WRITE", |
| 5 | + "pages": [ |
| 6 | + { |
| 7 | + "name": "Delivery", |
| 8 | + "description": "Live delivery ratio + per-event-class breakdown", |
| 9 | + "widgets": [ |
| 10 | + { |
| 11 | + "title": "Delivery ratio (delivered / all-terminal events)", |
| 12 | + "layout": { "column": 1, "row": 1, "width": 4, "height": 3 }, |
| 13 | + "visualization": { "id": "viz.billboard" }, |
| 14 | + "rawConfiguration": { |
| 15 | + "nrqlQueries": [ |
| 16 | + { |
| 17 | + "accountIds": [0], |
| 18 | + "query": "SELECT percentage(sum(brevo_webhook_events_total), WHERE event = 'delivered') AS 'delivered %' FROM Metric WHERE event IN ('delivered', 'bounced_hard', 'bounced_soft', 'rejected', 'complaint', 'deferred', 'unsubscribed', 'error') SINCE 1 hour ago" |
| 19 | + } |
| 20 | + ], |
| 21 | + "thresholds": [ |
| 22 | + { "value": 95, "alertSeverity": "CRITICAL" }, |
| 23 | + { "value": 98, "alertSeverity": "WARNING" } |
| 24 | + ], |
| 25 | + "platformOptions": { "ignoreTimeRange": false } |
| 26 | + } |
| 27 | + }, |
| 28 | + { |
| 29 | + "title": "Events received by class (1h)", |
| 30 | + "layout": { "column": 5, "row": 1, "width": 4, "height": 3 }, |
| 31 | + "visualization": { "id": "viz.pie" }, |
| 32 | + "rawConfiguration": { |
| 33 | + "nrqlQueries": [ |
| 34 | + { |
| 35 | + "accountIds": [0], |
| 36 | + "query": "SELECT sum(brevo_webhook_events_total) FROM Metric FACET event SINCE 1 hour ago" |
| 37 | + } |
| 38 | + ], |
| 39 | + "platformOptions": { "ignoreTimeRange": false } |
| 40 | + } |
| 41 | + }, |
| 42 | + { |
| 43 | + "title": "Delivery ratio over time", |
| 44 | + "layout": { "column": 9, "row": 1, "width": 4, "height": 3 }, |
| 45 | + "visualization": { "id": "viz.line" }, |
| 46 | + "rawConfiguration": { |
| 47 | + "nrqlQueries": [ |
| 48 | + { |
| 49 | + "accountIds": [0], |
| 50 | + "query": "SELECT percentage(sum(brevo_webhook_events_total), WHERE event = 'delivered') AS 'delivered %' FROM Metric WHERE event IN ('delivered', 'bounced_hard', 'bounced_soft', 'rejected', 'complaint', 'deferred', 'unsubscribed', 'error') TIMESERIES AUTO" |
| 51 | + } |
| 52 | + ], |
| 53 | + "platformOptions": { "ignoreTimeRange": false } |
| 54 | + } |
| 55 | + }, |
| 56 | + { |
| 57 | + "title": "Per-class event rate over time", |
| 58 | + "layout": { "column": 1, "row": 4, "width": 12, "height": 3 }, |
| 59 | + "visualization": { "id": "viz.line" }, |
| 60 | + "rawConfiguration": { |
| 61 | + "nrqlQueries": [ |
| 62 | + { |
| 63 | + "accountIds": [0], |
| 64 | + "query": "SELECT rate(sum(brevo_webhook_events_total), 5 minutes) FROM Metric WHERE event IN ('delivered', 'bounced_hard', 'bounced_soft', 'rejected', 'complaint', 'deferred', 'unsubscribed', 'error', 'unhandled') FACET event TIMESERIES AUTO" |
| 65 | + } |
| 66 | + ], |
| 67 | + "platformOptions": { "ignoreTimeRange": false } |
| 68 | + } |
| 69 | + }, |
| 70 | + { |
| 71 | + "title": "Receiver-side rejection paths (auth + payload)", |
| 72 | + "layout": { "column": 1, "row": 7, "width": 6, "height": 3 }, |
| 73 | + "visualization": { "id": "viz.line" }, |
| 74 | + "rawConfiguration": { |
| 75 | + "nrqlQueries": [ |
| 76 | + { |
| 77 | + "accountIds": [0], |
| 78 | + "query": "SELECT rate(sum(brevo_webhook_events_total), 5 minutes) FROM Metric WHERE event IN ('unauthorized', 'invalid_payload', 'oversized', 'missing_message_id') FACET event TIMESERIES AUTO" |
| 79 | + } |
| 80 | + ], |
| 81 | + "platformOptions": { "ignoreTimeRange": false } |
| 82 | + } |
| 83 | + }, |
| 84 | + { |
| 85 | + "title": "Send-vs-deliver (worker INFO logs vs receiver INFO logs)", |
| 86 | + "layout": { "column": 7, "row": 7, "width": 6, "height": 3 }, |
| 87 | + "visualization": { "id": "viz.line" }, |
| 88 | + "rawConfiguration": { |
| 89 | + "nrqlQueries": [ |
| 90 | + { |
| 91 | + "accountIds": [0], |
| 92 | + "query": "SELECT count(*) FROM Log WHERE message IN ('email.brevo.event_sent', 'webhook.brevo.delivered') FACET message TIMESERIES AUTO" |
| 93 | + } |
| 94 | + ], |
| 95 | + "platformOptions": { "ignoreTimeRange": false } |
| 96 | + } |
| 97 | + } |
| 98 | + ] |
| 99 | + } |
| 100 | + ] |
| 101 | +} |
0 commit comments