From 126472cbfb78946279c2922fc0a6e846f2ca19b3 Mon Sep 17 00:00:00 2001 From: Alex Kroman Date: Wed, 1 Jul 2026 13:29:04 -0400 Subject: [PATCH 1/2] Add Blurt Datadog dashboard (importable JSON) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dashboard-as-code JSON for the "Blurt — App Health" dashboard: errors, crashes, adoption (telemetry volume by version), unique users, and error breakdowns by version / OS / device — over Datadog Logs + Crash Reporting (service:blurt). Import via Datadog → New Dashboard → Import Dashboard JSON (or POST to /api/v1/dashboard). The unique-users + adoption widgets populate once the anonymous @usr.id install id lands (see the Datadog monitoring PR). Co-Authored-By: Claude Opus 4.8 (1M context) --- datadog/blurt-dashboard.json | 319 +++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 datadog/blurt-dashboard.json diff --git a/datadog/blurt-dashboard.json b/datadog/blurt-dashboard.json new file mode 100644 index 00000000..5d95ed27 --- /dev/null +++ b/datadog/blurt-dashboard.json @@ -0,0 +1,319 @@ +{ + "title": "Blurt — App Health", + "description": "Errors, crashes, adoption, and device breakdown for the Blurt macOS app.\nFed by Datadog Logs + Crash Reporting (service:blurt). Managed as code —\nsee datadog/blurt-dashboard.yml.\n", + "layout_type": "ordered", + "reflow_type": "auto", + "template_variables": [ + { + "name": "env", + "prefix": "env", + "available_values": [], + "default": "production" + } + ], + "widgets": [ + { + "definition": { + "type": "note", + "content": "**Blurt health.** Source: Datadog Logs + Crash Reporting (`service:blurt`).\nAdoption is proxied by telemetry volume per `version`; true adoption % and\n\"Unique users\" need an anonymous `@usr.id` install id + an app-launch log\n(see PR notes) and stay empty until then.\n", + "background_color": "blue", + "font_size": "14", + "text_align": "left", + "show_tick": false + } + }, + { + "definition": { + "title": "Total errors", + "type": "query_value", + "autoscale": true, + "precision": 0, + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "errors", + "data_source": "logs", + "search": { + "query": "service:blurt status:error $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "count" + } + } + ], + "formulas": [ + { + "formula": "errors" + } + ] + } + ] + } + }, + { + "definition": { + "title": "Crashes", + "type": "query_value", + "autoscale": true, + "precision": 0, + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "crashes", + "data_source": "logs", + "search": { + "query": "service:blurt status:error @error.is_crash:true $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "count" + } + } + ], + "formulas": [ + { + "formula": "crashes" + } + ] + } + ] + } + }, + { + "definition": { + "title": "Unique users (needs anonymous @usr.id install id)", + "type": "query_value", + "autoscale": true, + "precision": 0, + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "users", + "data_source": "logs", + "search": { + "query": "service:blurt $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "cardinality", + "metric": "@usr.id" + } + } + ], + "formulas": [ + { + "formula": "users" + } + ] + } + ] + } + }, + { + "definition": { + "title": "Errors over time (by version)", + "type": "timeseries", + "show_legend": true, + "requests": [ + { + "display_type": "bars", + "response_format": "timeseries", + "queries": [ + { + "name": "errors", + "data_source": "logs", + "search": { + "query": "service:blurt status:error $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "count" + }, + "group_by": [ + { + "facet": "version", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ] + } + ], + "formulas": [ + { + "formula": "errors" + } + ] + } + ] + } + }, + { + "definition": { + "title": "Adoption — telemetry volume by version", + "type": "timeseries", + "show_legend": true, + "requests": [ + { + "display_type": "area", + "response_format": "timeseries", + "queries": [ + { + "name": "events", + "data_source": "logs", + "search": { + "query": "service:blurt $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "count" + }, + "group_by": [ + { + "facet": "version", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ] + } + ], + "formulas": [ + { + "formula": "events" + } + ] + } + ] + } + }, + { + "definition": { + "title": "Top handled faults", + "type": "toplist", + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "faults", + "data_source": "logs", + "search": { + "query": "service:blurt status:error $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "count" + }, + "group_by": [ + { + "facet": "@underlying_error", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ] + } + ], + "formulas": [ + { + "formula": "faults" + } + ] + } + ] + } + }, + { + "definition": { + "title": "Errors by OS version", + "type": "toplist", + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "os", + "data_source": "logs", + "search": { + "query": "service:blurt status:error $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "count" + }, + "group_by": [ + { + "facet": "@os.version", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ] + } + ], + "formulas": [ + { + "formula": "os" + } + ] + } + ] + } + }, + { + "definition": { + "title": "Errors by device model", + "type": "toplist", + "requests": [ + { + "response_format": "scalar", + "queries": [ + { + "name": "device", + "data_source": "logs", + "search": { + "query": "service:blurt status:error $env" + }, + "indexes": ["*"], + "compute": { + "aggregation": "count" + }, + "group_by": [ + { + "facet": "@device.model", + "limit": 10, + "sort": { + "aggregation": "count", + "order": "desc" + } + } + ] + } + ], + "formulas": [ + { + "formula": "device" + } + ] + } + ] + } + } + ] +} From 2adab7eaeee0e38a4b35ce52dc4672e0b7c75066 Mon Sep 17 00:00:00 2001 From: Alex Kroman Date: Wed, 1 Jul 2026 13:29:42 -0400 Subject: [PATCH 2/2] docs(datadog): fix dashboard self-reference (.yml -> .json) Co-Authored-By: Claude Opus 4.8 (1M context) --- datadog/blurt-dashboard.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datadog/blurt-dashboard.json b/datadog/blurt-dashboard.json index 5d95ed27..631535cc 100644 --- a/datadog/blurt-dashboard.json +++ b/datadog/blurt-dashboard.json @@ -1,6 +1,6 @@ { "title": "Blurt — App Health", - "description": "Errors, crashes, adoption, and device breakdown for the Blurt macOS app.\nFed by Datadog Logs + Crash Reporting (service:blurt). Managed as code —\nsee datadog/blurt-dashboard.yml.\n", + "description": "Errors, crashes, adoption, and device breakdown for the Blurt macOS app.\nFed by Datadog Logs + Crash Reporting (service:blurt). Managed as code —\nsee datadog/blurt-dashboard.json.\n", "layout_type": "ordered", "reflow_type": "auto", "template_variables": [