{"id":33159,"date":"2018-07-16T20:08:27","date_gmt":"2018-07-16T20:08:27","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/webdev\/?p=14285"},"modified":"2018-07-16T20:08:27","modified_gmt":"2018-07-16T20:08:27","slug":"exploring-azure-app-service-azure-diagnostics","status":"publish","type":"post","link":"https:\/\/sickgaming.net\/blog\/2018\/07\/16\/exploring-azure-app-service-azure-diagnostics\/","title":{"rendered":"Exploring Azure App Service \u2013 Azure Diagnostics"},"content":{"rendered":"<p>If you\u2019ve followed our previous posts about using Azure App Service to host web apps in the cloud (<span><a href=\"https:\/\/blogs.msdn.microsoft.com\/webdev\/2018\/05\/02\/exploring-azure-app-service-introduction\/\">1. Introduction to App Service<\/a><\/span>, <span><a href=\"https:\/\/blogs.msdn.microsoft.com\/webdev\/2018\/05\/18\/exploring-azure-app-service-web-apps-and-sql-azure\/\">2. Hosting web apps that use SQL<\/a><\/span>) you\u2019re already familiar with how easy it is to get an app running in the cloud; but what if the app doesn\u2019t work correctly (it\u2019s crashing, running too slow, etc.)?\u00a0 In this post we\u2019ll explore how to use Azure\u2019s Application Insights to have always on diagnostics that will help you find and fix these types of issues.<\/p>\n<p>Azure Application Insights provides seamless integration with Azure App Service for monitoring, triaging and diagnosing code-level issues. It can easily be enabled on an existing web app with a single button click. Profiler traces and exception snapshots will be available for identifying the lines of code that caused issues. Let\u2019s take a closer look at this experience.<\/p>\n<h2>Enable Application Insights on an existing web app to investigate issues<\/h2>\n<p>We recommend you follow along using your own application, but if you don\u2019t have one readily available we will be using the <span><a href=\"https:\/\/github.com\/CawaMS\/contoso-sample\">Contoso University<\/a><\/span> sample. The instructions on how to deploy it to App Service are in the readme file.<\/p>\n<p>If you are following along with Contoso University, you will notice the Instructors page throws errors. In addition, the Courses tab loads a bit slower than others.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics.png\" alt=\"\" width=\"723\" height=\"418\" class=\"alignnone size-full wp-image-14465\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-1.png\" alt=\"\" width=\"592\" height=\"528\" class=\"alignnone size-full wp-image-14475\" \/><\/a><\/p>\n<p>Let\u2019s turn on Application Insights to investigate. After the app is deployed to App service, Application Insights can be enabled from the App Service portal by clicking the button on the overview blade:<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/34.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-2.png\" alt=\"\" width=\"879\" height=\"472\" class=\"alignnone wp-image-14485 size-large\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-3.png\" alt=\"\" width=\"595\" height=\"639\" class=\"alignnone size-full wp-image-14495\" \/><\/a><\/p>\n<p>Fill out the Application Insights enablement blade the following way:<\/p>\n<ul>\n<li>Create a new resource, with an appropriate name.<\/li>\n<li>Leave all default options for Code-level diagnostics on. The added section <strong>Code level diagnostics<\/strong> is on by default to enable Profiler and Snapshot Debugger for diagnosing slow app performance and runtime exceptions.<\/li>\n<li>Click the \u2018OK\u2019 button. Once prompted if to restart the web app, click \u2018Continue\u2019 to proceed.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-4.png\" alt=\"\" width=\"450\" height=\"81\" class=\"alignnone size-full wp-image-14505\" \/><\/a><\/p>\n<p>Once Application Insights is enabled, you will be able to see its connection status<em>. <\/em>You can now navigate to the Application Insights overview blade by clicking on the link next to the green check mark:<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/61.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-5.png\" alt=\"\" width=\"500\" height=\"299\" class=\"alignnone wp-image-14515 size-mediumlarge\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-6.png\" alt=\"\" width=\"676\" height=\"611\" class=\"alignnone size-full wp-image-14305\" \/><\/a><\/p>\n<h2>Generate traffic for your web app in order to reproduce issues<\/h2>\n<p>Let\u2019s generate some traffic to reproduce our two issues: a) Courses page loading slowly, b) Instructors page throwing errors. You are going to use <a href=\"https:\/\/docs.microsoft.com\/vsts\/test\/load-test\/app-service-web-app-performance-test?view=vsts\">performance test with Azure portal<\/a> to make requests to the following URLs:<\/p>\n<ul>\n<li><span>http:\/\/&lt;your_webapp_name&gt;.azurewebsites.net\/Courses<\/span><\/li>\n<li><span>http:\/\/&lt;your_webapp_name&gt;.azurewebsites.net\/Instructors<\/span><\/li>\n<\/ul>\n<p>You are going to be creating two different performance tests, once for each URL. For the Courses page you are going to simulate 250 users over a duration of 5 minutes, since you are experiencing a performance issue. For the Instructors page you can simulate 10 users over 1 minutes since we\u2019d generally expect less instructors than users on the site at any given time.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-7.png\" alt=\"\" width=\"273\" height=\"422\" class=\"alignnone size-full wp-image-14535\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-8.png\" alt=\"\" width=\"630\" height=\"433\" class=\"alignnone size-full wp-image-14555\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-9.png\" alt=\"\" width=\"556\" height=\"285\" class=\"alignnone size-full wp-image-14565\" \/><\/a><\/p>\n<h2>Profile your app during performance tests to identify performance issues<\/h2>\n<p>A performance test will generate traffic, but if you want to understand how you app performs you have to analyze its performance while the test is running using a profiler. Let\u2019s do exactly that, using the Performance | Configure Profiler blade while one of our performance tests is running:<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-10.png\" alt=\"\" width=\"768\" height=\"249\" class=\"alignnone size-full wp-image-14575\" \/><\/a><\/p>\n<p>Later on we will walkthrough how to use the profiler to identify the exact lines of code responsible for the slow-down. For now, let\u2019s focus on simply profiling . After clicking on \u201cProfile now\u201d, wait until the performance test finishes and the profiler has completed its analysis. After a new entry in the section \u201cRecent profiling sessions\u201d appears, navigate back to the Overview blade.<\/p>\n<h2>Diagnose runtime exceptions<\/h2>\n<p>If your web app has any failed requests, you need to root cause and solve the issues to ensure your app works reliably. After running your performance test on the Instructors page you have some example failed requests to take a look at:<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-6.png\" alt=\"\" width=\"676\" height=\"611\" class=\"alignnone size-full wp-image-14305\" \/><\/a><\/p>\n<p>Let\u2019s go to Failures blade to investigate what failed.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-11.png\" alt=\"\" width=\"756\" height=\"608\" class=\"alignnone size-full wp-image-14315\" \/><\/a><\/p>\n<p>On the Failures blade, the top failed operation is \u2018GET Instructors\/Index\u2019 and the top exception is \u2018InvalidOperationException\u2019. Click on the \u2018COUNT\u2019 column of the exception count to open list of sample exceptions. Click on the suggested exception to open the End-to-End Transaction blade.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-12.png\" alt=\"\" width=\"780\" height=\"461\" class=\"alignnone size-full wp-image-14325\" \/><\/a><\/p>\n<p>In the End-to-End Transaction blade, you can see \u2018System.InvalidOperationException\u2019 exceptions thrown from GET Instructors\/Index operation. Select the exception row and click on \u2018Open debug snapshot\u2019.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-13.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-13.png\" alt=\"\" width=\"1053\" height=\"462\" class=\"alignnone size-full wp-image-14335\" \/><\/a><\/p>\n<p>If it\u2019s the first time you use Snapshot Debugger, you will prompt to request RBAC access to snapshots to safeguard the potentially sensitive data shown in local variables:<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/17.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-14.png\" alt=\"\" width=\"500\" height=\"319\" class=\"alignnone wp-image-14345 size-mediumlarge\" \/><\/a><\/p>\n<p>Once you get access, you will see a snapshot view like the following:<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-15.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-15.png\" alt=\"\" width=\"646\" height=\"362\" class=\"alignnone size-full wp-image-14365\" \/><\/a><\/p>\n<p>From the local variables and call stack, you can see the exception is thrown at InstructorsController.cs line 56 with message \u2018Nullable object must have a value\u2019. This provides sufficient information to proceed with debugging the app\u2019s source code.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-15.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-15.png\" alt=\"\" width=\"646\" height=\"362\" class=\"alignnone size-full wp-image-14365\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-16.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-16.png\" alt=\"\" width=\"742\" height=\"638\" class=\"alignnone size-full wp-image-14375\" \/><\/a><\/p>\n<p>To get a better experience, download the snapshot and debug it using <span><a href=\"https:\/\/www.visualstudio.com\/thank-you-downloading-visual-studio\/?sku=Enterprise&amp;rel=15\">Visual Studio Enterprise<\/a><\/span>. You will be able to interactively see which line of code caused the exception:<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/211.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-17.png\" alt=\"\" width=\"429\" height=\"350\" class=\"alignnone wp-image-14385 size-mediumlarge\" \/><\/a><\/p>\n<p>Looking at the code, the exception was thrown because \u2018id\u2019 is null and you are missing the appropriate check. When your app is running in the cloud, resources are dynamically provisioned and destroyed and so may not always get the chance to access the state of a failed component before it is reset. The Snapshot Debugger is a powerful tool that can maintain the failed state of the component even after the component\u2019s state has been reset, by capturing local variables and call stack at the time the exception is thrown.<\/p>\n<h2>Diagnose bad performance from your web app<\/h2>\n<p>The server response time chart on the overview blade provides quick information on how performant your web app is over time. In the Contoso example, we see some spikes on the chart indicating there is a short period of time where users experienced slow responses for the requests they made.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-18.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-18.png\" alt=\"\" width=\"402\" height=\"320\" class=\"alignnone size-full wp-image-14395\" \/><\/a><\/p>\n<p>To investigate further, navigate to the Performance blade in App Insights portal:<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/231.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-19.png\" alt=\"\" width=\"879\" height=\"568\" class=\"alignnone wp-image-14405 size-large\" \/><\/a><\/p>\n<p>Zoom into the time range 6pm-10pm in the \u2018Operation times: zoom into range\u2019 chart to see spikes on the Request count.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-20.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-20.png\" alt=\"\" width=\"790\" height=\"351\" class=\"alignnone size-full wp-image-14415\" \/><\/a><\/p>\n<p>Sort the Operations table by duration and request count to figure out where your web app spent the most time. In our example GET Courses\/Index operation has the longest average duration. Let\u2019s click on it to investigate why this operation takes so long.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-21.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-21.png\" alt=\"\" width=\"358\" height=\"200\" class=\"alignnone size-full wp-image-14425\" \/><\/a><\/p>\n<p>The right side of the blade provides insights based on the Course\/Index operation.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-22.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-22.png\" alt=\"\" width=\"784\" height=\"665\" class=\"alignnone size-full wp-image-14435\" \/><\/a><\/p>\n<p>From the chart you can see although most operations only took around 400ms, the worst ones took up to 35 seconds. This means some users are getting really bad experience when hitting this URL and you should address it. Let\u2019s look at Profiler traces to troubleshoot why GET Courses\/Index was being so slow.<\/p>\n<p><a href=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-23.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.sickgaming.net\/blog\/wp-content\/uploads\/2018\/07\/exploring-azure-app-service-azure-diagnostics-23.png\" alt=\"\" width=\"364\" height=\"101\" class=\"alignnone size-full wp-image-14445\" \/><\/a><\/p>\n<p>You should see profiler traces similar to the following:<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/28.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/28-1024x450.png\" alt=\"\" width=\"879\" height=\"386\" class=\"alignnone wp-image-14455 size-large\" \/><\/a><\/p>\n<p>The code path that\u2019s taking the most time is prefixed with the flame icon. In this particular request, most time was spent on reading the list of courses from the database. Browsing to the code <span><a href=\"https:\/\/github.com\/CawaMS\/contoso-sample\/blob\/master\/cu-final\/Controllers\/CoursesController.cs\">CourseController.cs<\/a><\/span> we can see that when loading the list of courses the AsNoTracking() optimization option is not used. By default, Entity Framework will turn on tracking which caches the results to compare with what\u2019s modified. This could add an approx. ~30% overhead to your app\u2019s performance. For simple read operation like this one, we can optimize the query performance by using the AsNoTracking() option.<\/p>\n<h2>Conclusion<\/h2>\n<p>We hope that you find it easy to use Application Insights to diagnose performance and errors in your web apps. We believe Azure App Service is a great place to get started hosting and maintaining your web apps. You don\u2019t have to enable App Insights upfront; the option is always there to be turned on when and as needed without re-deployment.<\/p>\n<p>If you have any questions or issues, let us know by leaving comments below.<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/cath_profile.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/msdnshared.blob.core.windows.net\/media\/2018\/07\/cath_profile.png\" alt=\"\" width=\"200\" height=\"200\" class=\"size-full wp-image-14585 alignleft\" \/><\/a><strong \/><\/p>\n<p><strong>Catherine Wang<\/strong> Program Manager, VS and .NET<\/p>\n<p>Catherine is on Azure developer experience team and is responsible for Azure diagnostics, security and storage tools.<\/p>\n<p> &#013; <\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you\u2019ve followed our previous posts about using Azure App Service to host web apps in the cloud (1. Introduction to App Service, 2. Hosting web apps that use SQL) you\u2019re already familiar with how easy it is to get an app running in the cloud; but what if the app doesn\u2019t work correctly (it\u2019s [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":33160,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66],"tags":[80,67],"class_list":["post-33159","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microsoft-webdev","tag-aspnet","tag-aspnetcore"],"_links":{"self":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/33159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/comments?post=33159"}],"version-history":[{"count":0,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/33159\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media\/33160"}],"wp:attachment":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media?parent=33159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/categories?post=33159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/tags?post=33159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}