{"id":4723,"date":"2012-07-09T03:30:00","date_gmt":"2012-07-09T03:30:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/visualstudioalm\/2012\/07\/09\/using-the-intellitrace-standalone-collector-remotely\/"},"modified":"2019-02-14T17:59:11","modified_gmt":"2019-02-15T01:59:11","slug":"using-the-intellitrace-standalone-collector-remotely","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/devops\/using-the-intellitrace-standalone-collector-remotely\/","title":{"rendered":"Using the IntelliTrace Standalone Collector Remotely"},"content":{"rendered":"<div>\n<p>This post pertains to the IntelliTrace Standalone Collector, a new feature associated with Visual Studio 2012.&nbsp; The Standalone Collector allows you to collect IntelliTrace logging information on one machine (e.g. a production server) and analyze the log on another machine (e.g. the dev machine in your office).&nbsp; This post will specifically provide some example scripts that may be helpful if you want to collect IntelliTrace information on your server via a remote PowerShell session.<\/p>\n<p>General information about IntelliTrace collection with the Standalone Collector can be found <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/hh398365(v=VS.110)\">here<\/a>&nbsp;(MSDN), or you can watch <a href=\"https:\/\/channel9.msdn.com\/Events\/TechEd\/NorthAmerica\/2012\/DEV365\">this video<\/a> from Tech Ed 2012.&nbsp; The IntelliTrace Standalone Collector is free for anyone to download (find the Microsoft Visual Studio 2012 Release Candidate <a href=\"http:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=29906\">here<\/a>), but opening the logs requires Visual Studio Ultimate.<\/p>\n<p><b>Disclaimer: <\/b>I am not an expert with PowerShell, so some of this code may violate best practices or otherwise reveal my na&iuml;vet&eacute;.&nbsp; My goal is simply to provide some initial examples that you can modify to suit your needs.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-size: medium\"><strong>High-Level Steps<\/strong><\/span><\/p>\n<ul>\n<li>Set Up an IntelliTrace Collection Folder<\/li>\n<li>Set Up a Remote PowerShell Session<\/li>\n<li>Start IntelliTrace Collection on an Application Pool<\/li>\n<li>Reproduce an Issue<\/li>\n<li>Stop IntelliTrace Collection on an Application Pool<\/li>\n<li>Review IntelliTrace Logs<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong><span style=\"font-size: medium\">Set Up an IntelliTrace Collection Folder<\/span><\/strong><\/p>\n<ol>\n<li>Create a folder on your server machine (assumed below to be C:IntelliTraceCollection)&nbsp;<\/li>\n<li>Grant write access for the folder to BUILTINIIS_IUSRS<\/li>\n<\/ol>\n<p>Steps 1-2 can be run using a PowerShell script like the following, and if you have the right permissions, there is no reason you couldn&#8217;t also run this remotely, as described below:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">#<\/span><span style=\"font-family: courier new,courier\"> <\/span><span style=\"color: #333399;font-family: courier new,courier\">SetupCollectionFolder.ps1<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$Drive=&#8221;C:&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$FolderName=&#8221;IntelliTraceCollection&#8221;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">New-Item -Path $Drive -Name $FolderName -Type Directory<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$StartingDir=&#8221;$Drive$FolderName&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">Set-Location $StartingDir<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$Right=&#8221;Write&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$Principal=&#8221;BUILTINIIS_IUSRS&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$Rule=New-Object System.Security.AccessControl.FileSystemAccessRule($Principal,$Right,&#8221;Allow&#8221;)<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$Acl=Get-Acl .<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$Acl.SetAccessRule($Rule)<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Set-Acl . $Acl<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">&nbsp;<\/span><\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. Expand IntellitraceCollection.cab to your collection folder through a command like the following.&nbsp; Note that this file will be located under the x86 Program Files directory at Microsoft Visual Studio 11.0Common7IDECommonExtensionsMicrosoftIntelliTrace11.0.0, or can be downloaded from MSDN <span style=\"line-height: 115%;font-family: 'Calibri','sans-serif';font-size: 11pt\">(Microsoft Visual Studio 2012 Release Candidate <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd264944(v=vs.110)\">here<\/a>):<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Expand IntelliTraceCollection.cab -f:* C:IntelliTraceCollection<\/span>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Note:<\/strong> I get an error if I try to run this through a remote PowerShell session.&nbsp; You may wish to run this while logged in to the server.&nbsp; It is also possible to expand the .cab file to a share on your server machine from your client machine, or to a mutually-accessible share from which you can copy files to your server via a remote session.&nbsp; These may not be best practices for your environment, but if you want to script them, here are some samples.&nbsp; I&rsquo;m assuming here that you are running on a dev machine with Visual Studio Ultimate installed to the default location:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># ExpandIntelliTraceCollectorFiles.ps1<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># This would be run from your client machine<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$SharePath=&rdquo;\\MACHINENAMESHAREPATH&rdquo;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$UserName=&rdquo;DOMAINUSERNAME&rdquo;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$Password=&rdquo;PASSWORD1&rdquo;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">net use $SharePath $Password \/User:$Username<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$VSPath=&#8221;C:Program FilesMicrosoft Visual Studio 11.0Common7IDE&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$IntelliTrace11Path=&#8221;CommonExtensionsMicrosoftIntelliTrace11.0.0&#8243;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$CabFilePath=&#8221;$VSPath$IntelliTrace11PathIntelliTraceCollection.cab&#8221;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Expand $CabFilePath -f:* $SharePath<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># CopyIntelliTraceCollectorFiles.ps1<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># This would be run on the server, or via a remote PowerShell session<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$Drive=&#8221;C:&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$FolderName=&#8221;IntelliTraceCollection&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$StartingDir=&#8221;$Drive$FolderName&#8221;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$SharePath=&rdquo;\\MACHINENAMESHAREPATH&rdquo;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$UserName=&rdquo;DOMAINUSERNAME&rdquo;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$Password=&rdquo;PASSWORD1&rdquo;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">net use $SharePath $Password \/User:$Username<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Copy-Item $SharePath* -Destination $StartingDir -Recurse<\/span><\/p>\n<p><strong>&nbsp;<\/strong><\/p>\n<p><strong>Note<\/strong> also that expanding in the Windows shell does not preserve the proper directory structure of these files.<\/p>\n<p>&nbsp;<\/p>\n<p><br><span style=\"font-size: medium\"><strong>Set Up a Remote PowerShell Session<\/strong><\/span><\/p>\n<p>The primary advantage of a remote PowerShell session is that it carries much less overhead, since it saves your server the trouble of spinning up UI.&nbsp; To enable remote PowerShell on the server machine, you (or someone) must run <span style=\"color: #333399;font-family: courier new,courier\">WinRM QuickConfig<\/span> from an elevated command prompt and say yes when prompted to enable a firewall exception:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">C:Windowssystem32&gt;WinRM QuickConfig<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">WinRM already is set up to receive requests on this machine.<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">WinRM is not set up to allow remote access to this machine for management.<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">The following changes must be made:<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Create a WinRM listener on HTTP:\/\/* to accept WS-Man requests to any IP on this machine<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">Enable the WinRM firewall exception.<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Make these changes [y\/n]?<\/span><\/p>\n<p>After this has been done, you will be able to enter remote PowerShell sessions on the server with a command like this:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Enter-PSSession -ComputerName COMPUTERNAME<\/span><\/p>\n<p><strong>Note<\/strong> that you can exit the session with <span style=\"color: #333399;font-family: courier new,courier\">Exit-PSSession<\/span>.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-size: medium\"><strong>Start IntelliTrace Collection on an Application Pool<\/strong><\/span><\/p>\n<p>The following example PowerShell script could be run to start collection:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># StartIntelliTraceCollection.ps1<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$Drive=&#8221;C:&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$FolderName=&#8221;IntelliTraceCollection&#8221;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Set-Location $Drive$FolderName<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Import-Module .Microsoft.VisualStudio.Intellitrace.PowerShell.dll<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$AppPool=&rdquo;DEFAULTAPPPOOL&rdquo;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$OutputPath=&rdquo;.&rdquo;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># For high collection, use .collection_plan.ASP.NET.trace.xml<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$CollectionPlan=&rdquo;.collection_plan.ASP.NET.default.xml&rdquo;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Start-IntelliTraceCollection $AppPool $CollectionPlan $OutputPath<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-size: medium\"><strong>Reproduce an Issue<\/strong><\/span><\/p>\n<p>Once you have started IntelliTrace collection on a given application pool, it will be recycled, and you can use the application to hit the scenario in which you are interested.&nbsp; If you know how to reproduce an issue, you may simply want to browse to the application from your client machine and do so.&nbsp; Under other circumstances, you might wait for a customer to hit the issue on your production server, or something like that.&nbsp; The key point is that the code in which you are interested must execute while IntelliTrace is collecting against the application pool.<\/p>\n<p>During collection, you can use <span style=\"color: #333399;font-family: courier new,courier\">Get-IntelliTraceCollectionStatus<\/span> to see information regarding the status of each of your IIS app pools.&nbsp; For example:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">PS C:IntelliTraceCollection&gt; Get-IntelliTraceCollectionStatus<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">ApplicationPool&nbsp;&nbsp;&nbsp; : DefaultAppPool<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">ProcessId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2336<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">ProcessStartTime&nbsp;&nbsp; : 7\/5\/2012 11:23:50 AM<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">CollectionPlanPath : C:WindowsTempDefaultAppPool_collection_plan.ASP.NET.default.xml<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">OutputPath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : C:IntelliTraceCollectionw3wp_00000920_120705_112350.iTrace<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">&#8230;<\/span><\/p>\n<p><br>&nbsp;<\/p>\n<p><span style=\"font-size: medium\"><strong>Stop IntelliTrace Collection on an Application Pool<\/strong><\/span><\/p>\n<p>During collection, trace information gets stored to IntelliTrace log files in the specified output path (<span style=\"color: #333399;font-family: courier new,courier\">$OutputPath<\/span> above) on a per-process basis.&nbsp; Once you think an issue has been reproduced during IntelliTrace Collection, you can use <span style=\"color: #333399;font-family: courier new,courier\">Stop-IntelliTraceCollection<\/span> to stop collection against a particular application pool, or <span style=\"color: #333399;font-family: courier new,courier\">Checkpoint-IntelliTraceCollection<\/span> to generate a snapshot log of what has been traced so far.&nbsp; The following script demonstrates how you might stop collection:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># StopIntelliTraceCollection.ps1<\/span><span style=\"color: #333399;font-family: courier new,courier\"><\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Import-Module .Microsoft.VisualStudio.Intellitrace.PowerShell.dll<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$AppPool=&rdquo;DEFAULTAPPPOOL&rdquo;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Stop-IntelliTraceCollection &#8220;$AppPool&#8221;<\/span><span style=\"color: #333399;font-family: courier new,courier\"><\/span><\/p>\n<p><br>&nbsp;<\/p>\n<p><span style=\"font-size: medium\"><strong>Review IntelliTrace Logs<\/strong><\/span><\/p>\n<p>Once you have stopped collection, you can view some basic information about a particular IntelliTrace log file(,iTrace) using <span style=\"color: #333399;font-family: courier new,courier\">Get-IntelliTraceFileInfo<\/span>.&nbsp; For example:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">PS C:IntelliTraceCollection&gt; Get-IntelliTraceFileInfo .w3wp_00000920_120705_112350.iTrace<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : C:IntelliTraceCollectionw3wp_00000920_120705_112350.iTrace<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">ProcessName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : C:windowssystem32inetsrvw3wp.exe<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">ProcessId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2336<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">ProcessStartTime : 7\/5\/2012 11:23:50 AM<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">ProcessStopTime&nbsp; : 7\/5\/2012 11:40:55 AM<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">ApplicationPool&nbsp; : DefaultAppPool<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">CheckpointTime&nbsp;&nbsp; :<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">TraceDuration&nbsp;&nbsp;&nbsp; : 00:16:59.4850000<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>To view the logged information in detail and step through code, you will need to copy the log file(s) from your output directory (C:IntelliTraceCollection if you follow the above instructions exactly) to your dev machine.&nbsp; The following is one final PowerShell script that you can adapt to carry out this step:<\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\"># CopyIntelliTraceLogs.ps1<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$Drive=&#8221;C:&#8221;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$FolderName=&#8221;IntelliTraceCollection&#8221;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Set-Location $Drive$FolderName<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">$SharePath=&rdquo;\\MACHINENAMESHAREPATH&rdquo;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$UserName=&rdquo;DOMAINUSERNAME&rdquo;<\/span><br><span style=\"color: #333399;font-family: courier new,courier\">$Password=&rdquo;PASSWORD1&rdquo;<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">net use $SharePath $Password \/User:$Username<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Copy-Item .*.itrace $CopyToLoc<\/span><\/p>\n<p><span style=\"color: #333399;font-family: courier new,courier\">Remove-Item -Path .*.itrace<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>Opening an Intellitrace log requires Visual Studio Ultimate, and if you are not already familiar with this scenario, the following resources may be helpful in explaining the process:<\/p>\n<ul>\n<li><a title=\"How to: Save, Open, Read, and Debug IntelliTrace Recordings\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd264963(v=vs.110)\">How to:&nbsp;Save, Open, Read, and Debug IntelliTrace Recordings<\/a><\/li>\n<li><a title=\"Navigating with IntelliTrace\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd264933(v=vs.110)\">Navigating with IntelliTrace<\/a><\/li>\n<li><a title=\"IntelliTrace Web Requests\" href=\"http:\/\/blogs.msdn.com\/b\/ianhu\/archive\/2012\/04\/05\/intellitrace-web-requests.aspx\">IntelliTrace Web Requests<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>The following resources can also provide some more robust general information about IntelliTrace:<\/p>\n<ul>\n<li><a title=\"Collecting IntelliTrace Information\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dd264944(v=vs.110)\">Collecting IntelliTrace Information<\/a><\/li>\n<li><a title=\"Collecting IntelliTrace Data Everywhere\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/hh398365(v=vs.110).aspx\">Collecting IntelliTrace Data Everywhere<\/a><\/li>\n<li><a title=\"&bull;Advanced IntelliTrace in Production with Visual Studio 2012\" href=\"https:\/\/channel9.msdn.com\/Events\/TechEd\/NorthAmerica\/2012\/DEV365\">Advanced IntelliTrace in Production with Visual Studio 2012<\/a> (video)<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>This post pertains to the IntelliTrace Standalone Collector, a new feature associated with Visual Studio 2012.&nbsp; The Standalone Collector allows you to collect IntelliTrace logging information on one machine (e.g. a production server) and analyze the log on another machine (e.g. the dev machine in your office).&nbsp; This post will specifically provide some example scripts [&hellip;]<\/p>\n","protected":false},"author":109,"featured_media":45953,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[226,1,225],"tags":[],"class_list":["post-4723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci","category-devops","category-git"],"acf":[],"blog_post_summary":"<p>This post pertains to the IntelliTrace Standalone Collector, a new feature associated with Visual Studio 2012.&nbsp; The Standalone Collector allows you to collect IntelliTrace logging information on one machine (e.g. a production server) and analyze the log on another machine (e.g. the dev machine in your office).&nbsp; This post will specifically provide some example scripts [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/4723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/users\/109"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/comments?post=4723"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/4723\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media\/45953"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media?parent=4723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/categories?post=4723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/tags?post=4723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}