[{"data":1,"prerenderedAt":250},["ShallowReactive",2],{"blog-workspace-builder":3},{"id":4,"title":5,"author":6,"body":7,"date":240,"description":241,"extension":242,"meta":243,"navigation":244,"path":245,"readingTime":246,"seo":247,"stem":248,"__hash__":249},"blog\u002Fblog\u002Fworkspace-builder.md","Connect Frontend Bugs to Backend Logs with Workspace Builder","Signal Team",{"type":8,"value":9,"toc":229},"minimark",[10,15,24,27,43,46,50,53,65,68,72,84,104,111,130,137,142,153,159,163,166,194,197,201,208,212,219,223,226],[11,12,14],"h2",{"id":13},"the-gap-between-frontend-and-backend","The Gap Between Frontend and Backend",[16,17,18,19,23],"p",{},"A frontend exception is only half the story. When ",[20,21,22],"code",{},"POST \u002Fapi\u002Fcheckout"," returns a 500, the meaningful error is deep in the backend stack trace - not in the browser's network tab.",[16,25,26],{},"Historically, connecting the two required:",[28,29,30,34,37,40],"ol",{},[31,32,33],"li",{},"Copy the failing request's trace ID from the browser",[31,35,36],{},"Open Azure Monitor, Grafana, or Sentry in a separate tab",[31,38,39],{},"Search for that trace ID",[31,41,42],{},"Correlate timestamps manually across two systems",[16,44,45],{},"Signal's Workspace Builder closes this gap automatically.",[11,47,49],{"id":48},"what-is-a-workspace","What is a Workspace?",[16,51,52],{},"A workspace is a structured definition of your app's architecture. You tell Signal:",[54,55,56,59,62],"ul",{},[31,57,58],{},"What domains belong to this application",[31,60,61],{},"Where the backend services are located",[31,63,64],{},"Which log provider each service is connected to",[16,66,67],{},"Once configured, Signal correlates frontend network requests with backend log entries in real time inside the viewer, without leaving the browser.",[11,69,71],{"id":70},"setting-up-a-workspace","Setting Up a Workspace",[16,73,74,75,79,80,83],{},"In the Settings tab, go to ",[76,77,78],"strong",{},"Workspaces"," and click ",[76,81,82],{},"Builder",". The form lets you:",[28,85,86,92,98],{},[31,87,88,91],{},[76,89,90],{},"Name the workspace"," (e.g. \"Production\" or \"Staging\")",[31,93,94,97],{},[76,95,96],{},"Add web services"," - the recording domain is auto-detected and added automatically",[31,99,100,103],{},[76,101,102],{},"Add integrations"," - connect Azure Log Analytics, Sentry, or Grafana Loki to each service",[16,105,106,107,110],{},"For ",[76,108,109],{},"Azure Log Analytics",", you need:",[54,112,113,116,119],{},[31,114,115],{},"Workspace ID",[31,117,118],{},"Shared Key",[31,120,121,122,125,126,129],{},"A KQL query template with ",[20,123,124],{},"{START}"," and ",[20,127,128],{},"{END}"," timestamp placeholders",[16,131,132,133,136],{},"A default query targeting ",[20,134,135],{},"AppExceptions"," is provided. You can customize it to target any table in your workspace.",[16,138,106,139,110],{},[76,140,141],{},"Sentry",[54,143,144,147,150],{},[31,145,146],{},"Organization slug",[31,148,149],{},"Project slug",[31,151,152],{},"Auth token",[16,154,106,155,158],{},[76,156,157],{},"Grafana Loki",", you need the endpoint URL and any required headers.",[11,160,162],{"id":161},"the-correlation-engine","The Correlation Engine",[16,164,165],{},"When you open the Network tab in the viewer, each request now shows a badge indicating how many backend log entries were matched. Signal uses three correlation strategies in priority order:",[28,167,168,182,188],{},[31,169,170,173,174,177,178,181],{},[76,171,172],{},"Distributed trace headers"," - ",[20,175,176],{},"traceparent",", ",[20,179,180],{},"x-request-id",", or any custom header you configure",[31,183,184,187],{},[76,185,186],{},"Time window fallback"," - logs within a short window around the request timestamp",[31,189,190,193],{},[76,191,192],{},"URL path matching"," - as a last resort for requests without trace headers",[16,195,196],{},"Expanding any network request reveals the matched backend logs inline. JSON field values in log entries are automatically pretty-printed.",[11,198,200],{"id":199},"try-it-without-credentials","Try It Without Credentials",[16,202,203,204,207],{},"The Azure integration includes a ",[76,205,206],{},"Use Demo Account"," toggle that queries Microsoft's public Azure Log Analytics demo workspace. No credentials are needed. This lets you explore correlated logs immediately before connecting your own workspace.",[11,209,211],{"id":210},"adding-domains-on-the-fly","Adding Domains on the Fly",[16,213,214,215,218],{},"When you are viewing a recording and see a request to a domain not yet in your workspace (a third-party API, a microservice, a CDN), you can hover over that request in the Network tab and click the ",[76,216,217],{},"+ workspace"," button. The domain is added to your workspace as a new service entry immediately.",[11,220,222],{"id":221},"the-result","The Result",[16,224,225],{},"Instead of context-switching between browser DevTools and Azure Monitor, you get one view: the frontend exception, the network request that triggered it, and the backend log entries that explain why it failed.",[16,227,228],{},"For teams running distributed systems, this single feature eliminates the most common category of debugging overhead: the time spent manually connecting dots across systems.",{"title":230,"searchDepth":231,"depth":231,"links":232},"",2,[233,234,235,236,237,238,239],{"id":13,"depth":231,"text":14},{"id":48,"depth":231,"text":49},{"id":70,"depth":231,"text":71},{"id":161,"depth":231,"text":162},{"id":199,"depth":231,"text":200},{"id":210,"depth":231,"text":211},{"id":221,"depth":231,"text":222},"2026-04-25","How Signal Workspace Builder automatically links frontend network exceptions to Azure Log Analytics, Sentry, and Grafana traces in a single view.","md",{},true,"\u002Fblog\u002Fworkspace-builder","6 min read",{"title":5,"description":241},"blog\u002Fworkspace-builder","EmWGMvRFJfVgOc3H9Cd59I2dYLtE7gKczFUb_VNQEYE",1778935227765]