{"id":1575,"date":"2021-10-07T16:00:33","date_gmt":"2021-10-07T23:00:33","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/azure-sdk\/?p=1575"},"modified":"2021-10-07T19:40:34","modified_gmt":"2021-10-08T02:40:34","slug":"announcing-the-new-azure-monitor-query-client-libraries","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/azure-sdk\/announcing-the-new-azure-monitor-query-client-libraries\/","title":{"rendered":"Announcing the new Azure Monitor Query client libraries"},"content":{"rendered":"<p>In February of this year, the Azure SDK team embarked on a project to modernize and enhance developers&#8217; data retrieval experience for Azure Monitor. The logs and metrics pillars of observability were identified as the focus areas. After analyzing <a href=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/new-azure-monitor-libraries-query\/#unified-client-library\">previous generations of the query libraries<\/a>, several shortcomings were identified. Most notably, the libraries:<\/p>\n<ul>\n<li>Felt unnatural to .NET, Java, JavaScript\/TypeScript, and Python developers.<\/li>\n<li>Lacked production support for Java, JavaScript\/TypeScript, and Python.<\/li>\n<li>Lacked Azure Active Directory (Azure AD) authentication support.<\/li>\n<li>Required separate packages for querying Azure Monitor&#8217;s two fundamental data platforms: <a href=\"https:\/\/docs.microsoft.com\/azure\/azure-monitor\/logs\/data-platform-logs\">Logs<\/a> and <a href=\"https:\/\/docs.microsoft.com\/azure\/azure-monitor\/essentials\/data-platform-metrics\">Metrics<\/a>.<\/li>\n<\/ul>\n<p>Each of these problems would need to be addressed in the new product. But this project was also an opportune time to incorporate customer feedback from each ecosystem. For example, .NET and Java customers wanted to deserialize Logs query results to models. With support for such a feature, much less code would be required in their apps.<\/p>\n<h2>The journey to GA<\/h2>\n<p>The initial preview release of the Azure Monitor Query client libraries <a href=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/new-azure-monitor-libraries-query\/\">was announced in June<\/a>. Since that release, the Azure SDK team has conducted extensive research with both existing and prospective customers. Public API surface design assumptions were both validated and invalidated. Learnings from each moderated UX study were incorporated into the product along the way. The team iterated on the libraries until consistently receiving encouraging feedback like &#8220;It&#8217;s easy to use. I didn&#8217;t need documentation to make progress.&#8221;<\/p>\n<p>Today, we&#8217;re thrilled to unveil the result of that iterative, customer-driven work. The Azure Monitor Query client libraries for .NET, Java, JavaScript\/TypeScript, and Python have reached general availability (GA)! These open-source GA libraries:<\/p>\n<ul>\n<li>Execute read-only queries in Azure Monitor&#8217;s Logs and Metrics data platforms.<\/li>\n<li>Combine Logs and Metrics query APIs into a single package for each language.<\/li>\n<li>Follow the <a href=\"https:\/\/aka.ms\/azsdk\/guide\">Azure SDK guidelines<\/a>, resulting in an idiomatic, consistent, approachable, diagnosable, and dependable design.<\/li>\n<li>Introduce new features and enhancements, such as:\n<ul>\n<li>Azure AD authentication support<\/li>\n<li>Asynchronous API calls support via <a href=\"https:\/\/projectreactor.io\/\">Reactor<\/a> (Java)<\/li>\n<li>Deserialize Logs query results to models (.NET and Java)<\/li>\n<li>Configurable server timeout for Logs queries<\/li>\n<li>Include performance statistics and visualization data in Logs query results<\/li>\n<li>Retrieve Logs query result column values by name<\/li>\n<li>Execute a batch of Logs queries in a single request<\/li>\n<li>Retrieve metric values by name<\/li>\n<li>List metric namespaces and definitions<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>From creating custom dashboards to configuring pager-style alerts, these libraries are sure to meet your needs. Wield the power of logs and metrics to increase confidence in your root cause analysis. Identify bottlenecks in your infrastructure and optimize app performance.<\/p>\n<h2>Get started<\/h2>\n<p>Before using the Azure Monitor Query libraries, ensure that you have an <a href=\"https:\/\/azure.microsoft.com\/free\">Azure subscription<\/a>. Then complete the following steps:<\/p>\n<ol>\n<li><a href=\"#1-install-the-dependencies\">Install the dependencies.<\/a><\/li>\n<li><a href=\"#2-create-and-authenticate-a-query-client\">Create and authenticate a query client.<\/a><\/li>\n<li><a href=\"#3-execute-a-query\">Execute a query.<\/a><\/li>\n<\/ol>\n<h3>1. Install the dependencies<\/h3>\n<p>You&#8217;ll need to install two packages:<\/p>\n<ol>\n<li>Install one of the four Azure Monitor Query libraries using the command\/instructions provided in the following table.\n<table>\n<thead>\n<tr>\n<th>Language<\/th>\n<th>Package<\/th>\n<th>Installation<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>.NET<\/td>\n<td><a href=\"https:\/\/www.nuget.org\/packages\/Azure.Monitor.Query\">Azure.Monitor.Query<\/a><\/td>\n<td><code>dotnet add package Azure.Monitor.Query<\/code><\/td>\n<\/tr>\n<tr>\n<td>Java<\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-monitor-query\">azure-monitor-query<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/tree\/main\/sdk\/monitor\/azure-monitor-query#install-the-package\">Add to pom.xml file<\/a><\/td>\n<\/tr>\n<tr>\n<td>JavaScript\/TypeScript<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/monitor-query\">@azure\/monitor-query<\/a><\/td>\n<td><code>npm install @azure\/monitor-query<\/code><\/td>\n<\/tr>\n<tr>\n<td>Python<\/td>\n<td><a href=\"https:\/\/pypi.org\/project\/azure-monitor-query\">azure-monitor-query<\/a><\/td>\n<td><code>pip install azure-monitor-query<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<li>Install the Azure Identity library. This library provides a variety of credential types for Azure AD authentication.\n<table>\n<thead>\n<tr>\n<th>Language<\/th>\n<th>Package<\/th>\n<th>Installation<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>.NET<\/td>\n<td><a href=\"https:\/\/www.nuget.org\/packages\/Azure.Identity\">Azure.Identity<\/a><\/td>\n<td><code>dotnet add package Azure.Identity<\/code><\/td>\n<\/tr>\n<tr>\n<td>Java<\/td>\n<td><a href=\"https:\/\/search.maven.org\/artifact\/com.azure\/azure-identity\">azure-identity<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/tree\/main\/sdk\/identity\/azure-identity#include-the-package\">Add to pom.xml file<\/a><\/td>\n<\/tr>\n<tr>\n<td>JavaScript\/TypeScript<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/identity\">@azure\/identity<\/a><\/td>\n<td><code>npm install @azure\/identity<\/code><\/td>\n<\/tr>\n<tr>\n<td>Python<\/td>\n<td><a href=\"https:\/\/pypi.org\/project\/azure-identity\">azure-identity<\/a><\/td>\n<td><code>pip install azure-identity<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/li>\n<\/ol>\n<h3>2. Create and authenticate a query client<\/h3>\n<p>An authenticated client object is required to execute a query. <code>LogsQueryClient<\/code> and <code>MetricsQueryClient<\/code> are the client objects for querying Logs and Metrics, respectively. The Azure Identity library&#8217;s <code>DefaultAzureCredential<\/code> type is the easiest way to authenticate a client with Azure AD.<\/p>\n<h4>.NET<\/h4>\n<pre><code class=\"language-csharp\">\/\/using Azure.Identity;\r\n\/\/using Azure.Monitor.Query;\r\n\r\nvar credential = new DefaultAzureCredential();\r\n\r\nvar logsQueryClient = new LogsQueryClient(credential);\r\n\/\/ or\r\nvar metricsQueryClient = new MetricsQueryClient(credential);<\/code><\/pre>\n<h4>Java<\/h4>\n<pre><code class=\"language-java\">\/\/import com.azure.identity.DefaultAzureCredential;\r\n\/\/import com.azure.identity.DefaultAzureCredentialBuilder;\r\n\/\/import com.azure.monitor.query.LogsQueryClient;\r\n\/\/import com.azure.monitor.query.LogsQueryClientBuilder;\r\n\/\/import com.azure.monitor.query.MetricsQueryClient;\r\n\/\/import com.azure.monitor.query.MetricsQueryClientBuilder;\r\n\r\nDefaultAzureCredential credential =\r\n    new DefaultAzureCredentialBuilder().build();\r\n\r\nLogsQueryClient logsQueryClient = new LogsQueryClientBuilder()\r\n    .credential(credential)\r\n    .buildClient();\r\n\/\/ or\r\nMetricsQueryClient metricsQueryClient = new MetricsQueryClientBuilder()\r\n    .credential(credential)\r\n    .buildClient();<\/code><\/pre>\n<h4>JavaScript\/TypeScript<\/h4>\n<pre><code class=\"language-typescript\">import { DefaultAzureCredential } from \"@azure\/identity\";\r\nimport { LogsQueryClient, MetricsQueryClient } from \"@azure\/monitor-query\";\r\n\r\nconst credential = new DefaultAzureCredential();\r\n\r\nconst logsQueryClient = new LogsQueryClient(credential);\r\n\/\/ or\r\nconst metricsQueryClient = new MetricsQueryClient(credential);<\/code><\/pre>\n<h4>Python<\/h4>\n<pre><code class=\"language-python\">from azure.identity import DefaultAzureCredential\r\nfrom azure.monitor.query import LogsQueryClient, MetricsQueryClient\r\n\r\ncredential = DefaultAzureCredential()\r\n\r\nlogs_query_client = LogsQueryClient(credential)\r\n# or\r\nmetrics_query_client = MetricsQueryClient(credential)<\/code><\/pre>\n<h3>3. Execute a query<\/h3>\n<p>To query Logs, you&#8217;ll need:<\/p>\n<ul>\n<li>An <a href=\"https:\/\/docs.microsoft.com\/azure\/azure-monitor\/logs\/quick-create-workspace\">Azure Log Analytics workspace<\/a>. That resource&#8217;s workspace ID will be used for all query operations.<\/li>\n<li>Basic knowledge of the <a href=\"https:\/\/docs.microsoft.com\/azure\/data-explorer\/kusto\/query\">Kusto Query Language<\/a>.<\/li>\n<\/ul>\n<p>To query Metrics, you&#8217;ll need an Azure resource of any kind. For example, an Azure Storage account. That resource&#8217;s resource ID\/URI will be used for all query operations.<\/p>\n<h4>Retrieve logs<\/h4>\n<p>Consider the following code snippets, which demonstrate querying an Azure Log Analytics workspace in the four supported languages. A Kusto query is executed on the <code>AzureActivity<\/code> table to examine write operations on the Azure subscription&#8217;s resources. The table&#8217;s first 10 rows are retrieved after sorting the <code>TimeGenerated<\/code> column in descending order. Only logs produced in the last day are considered.<\/p>\n<h5>.NET<\/h5>\n<pre><code class=\"language-csharp\">\/\/using System.Threading.Tasks;\r\n\r\nResponse&lt;LogsQueryResult&gt; response =\r\n    await logsQueryClient.QueryWorkspaceAsync(\r\n        workspaceId,\r\n        \"AzureActivity | top 10 by TimeGenerated\",\r\n        new QueryTimeRange(TimeSpan.FromDays(1)));<\/code><\/pre>\n<h5>Java<\/h5>\n<pre><code class=\"language-java\">LogsQueryResult response =\r\n    logsQueryClient.queryWorkspace(\r\n        workspaceId,\r\n        \"AzureActivity | top 10 by TimeGenerated\",\r\n        new QueryTimeInterval(Duration.ofDays(1)));<\/code><\/pre>\n<h5>JavaScript\/TypeScript<\/h5>\n<pre><code class=\"language-typescript\">const response = await logsQueryClient.queryWorkspace(\r\n    workspaceId,\r\n    \"AzureActivity | top 10 by TimeGenerated\",\r\n    {\r\n        duration: Durations.oneDay\r\n    });<\/code><\/pre>\n<h5>Python<\/h5>\n<pre><code class=\"language-python\">response = logs_query_client.query_workspace(\r\n    workspace_id,\r\n    query = \"AzureActivity | top 10 by TimeGenerated\",\r\n    timespan = timedelta(days=1))<\/code><\/pre>\n<h4>Retrieve metrics<\/h4>\n<p>Consider the following code snippets, which demonstrate querying an Azure Storage account in the four supported languages. Specifically, the snippets demonstrate querying the <code>Ingress<\/code> metric and including the <code>Average<\/code> and <code>Maximum<\/code> aggregations. Notice that unlike Logs queries, Kusto isn&#8217;t used for querying Metrics.<\/p>\n<h5>.NET<\/h5>\n<pre><code class=\"language-csharp\">\/\/using Azure.Monitor.Query.Models;\r\n\/\/using System.Threading.Tasks;\r\n\r\nvar response = await metricsQueryClient.QueryResourceAsync(\r\n    resourceId,\r\n    metrics: new[] { \"Ingress\" },\r\n    options: new MetricsQueryOptions\r\n    {\r\n        Aggregations = {\r\n            MetricAggregationType.Average,\r\n            MetricAggregationType.Maximum\r\n        }\r\n    });<\/code><\/pre>\n<h5>Java<\/h5>\n<pre><code class=\"language-java\">Response&lt;MetricsQueryResult&gt; response =\r\n    metricsQueryClient.queryResourceWithResponse(\r\n        resourceId,\r\n        Arrays.asList(\"Ingress\"),\r\n        new MetricsQueryOptions().setAggregations(Arrays.asList(\r\n            AggregationType.AVERAGE, AggregationType.MAXIMUM)),\r\n        Context.NONE);<\/code><\/pre>\n<h5>JavaScript\/TypeScript<\/h5>\n<pre><code class=\"language-typescript\">const response = await metricsQueryClient.queryResource(\r\n    resourceId,\r\n    metricNames: [\"Ingress\"],\r\n    {\r\n        aggregations: [AggregationType.Average, AggregationType.Maximum]\r\n    });<\/code><\/pre>\n<h5>Python<\/h5>\n<pre><code class=\"language-python\">response = metrics_query_client.query_resource(\r\n    resource_id,\r\n    metric_names = [\"Ingress\"],\r\n    aggregations = [\r\n        MetricAggregationType.AVERAGE,\r\n        MetricAggregationType.MAXIMUM\r\n    ])<\/code><\/pre>\n<h2>Summary<\/h2>\n<p>The complexities of your mission-critical apps demand robust performance and availability monitoring solutions. The Azure SDK team has invested heavily in that monitoring space with the Azure Monitor Query libraries. The libraries offer developers a modern, idiomatic, and secure solution for retrieving Logs and Metrics data. To learn more about the libraries, see the following language-specific <em>README<\/em> files:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/blob\/main\/sdk\/monitor\/Azure.Monitor.Query\/README.md#getting-started\">.NET<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/monitor\/azure-monitor-query\/README.md#getting-started\">Java<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/main\/sdk\/monitor\/monitor-query\/README.md#getting-started\">JavaScript\/TypeScript<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/tree\/main\/sdk\/monitor\/azure-monitor-query\/README.md#getting-started\">Python<\/a><\/li>\n<\/ul>\n<p>For language-specific examples, see the following code samples:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/tree\/main\/sdk\/monitor\/Azure.Monitor.Query#examples\">.NET<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/monitor\/azure-monitor-query\/README.md#examples\">Java<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/main\/sdk\/monitor\/monitor-query\/samples\/v1\/javascript\">JavaScript<\/a> \/ <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/main\/sdk\/monitor\/monitor-query\/samples\/v1\/typescript\">TypeScript<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/tree\/main\/sdk\/monitor\/azure-monitor-query\/samples\">Python<\/a><\/li>\n<\/ul>\n<p>As you use the library, you&#8217;re encouraged to provide feedback. Whether good or bad, the Azure SDK team wants to hear your thoughts. To report issues or send feedback to the Azure SDK engineering team, use the following language-specific links:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/issues\/new\/choose\">.NET<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/issues\/new\/choose\">Java<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/issues\/new\/choose\">JavaScript<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/issues\/new\/choose\">Python<\/a><\/li>\n<\/ul>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE --><\/p>\n<p><div  class=\"d-flex justify-content-center\"><a class=\"cta_button_link btn-primary mb-24\" href=\"https:\/\/aka.ms\/azsdk\/releases\" target=\"_blank\">Azure SDK Releases<\/a><\/div><\/p>\n<h2>Azure SDK Blog Contributions<\/h2>\n<p>Thanks for reading this Azure SDK blog post. We hope you learned something new, and we welcome you to share the post. We\u2019re open to Azure SDK blog contributions from our readers. To get started, contact us at <a href=\"mailto:azsdkblog@microsoft.com\">azsdkblog@microsoft.com<\/a> with your idea, and we&#8217;ll set you up as a guest blogger.<\/p>\n<ul>\n<li>Azure SDK Website: <a href=\"https:\/\/aka.ms\/azsdk\">aka.ms\/azsdk<\/a><\/li>\n<li>Azure SDK Intro (3-minute video): <a href=\"https:\/\/aka.ms\/azsdk\/intro\">aka.ms\/azsdk\/intro<\/a><\/li>\n<li>Azure SDK Intro Deck (PowerPoint deck): <a href=\"https:\/\/aka.ms\/azsdk\/intro\/deck\">aka.ms\/azsdk\/intro\/deck<\/a><\/li>\n<li>Azure SDK Releases: <a href=\"https:\/\/aka.ms\/azsdk\/releases\">aka.ms\/azsdk\/releases<\/a><\/li>\n<li>Azure SDK Blog: <a href=\"https:\/\/aka.ms\/azsdk\/blog\">aka.ms\/azsdk\/blog<\/a><\/li>\n<li>Azure SDK Twitter: <a href=\"https:\/\/twitter.com\/AzureSDK\">twitter.com\/AzureSDK<\/a><\/li>\n<li>Azure SDK Design Guidelines: <a href=\"https:\/\/aka.ms\/azsdk\/guide\">aka.ms\/azsdk\/guide<\/a><\/li>\n<li>Azure SDKs &amp; Tools: <a href=\"https:\/\/azure.microsoft.com\/downloads\">azure.microsoft.com\/downloads<\/a><\/li>\n<li>Azure SDK Central Repository: <a href=\"https:\/\/github.com\/azure\/azure-sdk#azure-sdk\">github.com\/azure\/azure-sdk<\/a><\/li>\n<li>Azure SDK for .NET: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-net\">github.com\/azure\/azure-sdk-for-net<\/a><\/li>\n<li>Azure SDK for Java: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-java\">github.com\/azure\/azure-sdk-for-java<\/a><\/li>\n<li>Azure SDK for Python: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-python\">github.com\/azure\/azure-sdk-for-python<\/a><\/li>\n<li>Azure SDK for JavaScript\/TypeScript: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-js\">github.com\/azure\/azure-sdk-for-js<\/a><\/li>\n<li>Azure SDK for Android: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-android\">github.com\/Azure\/azure-sdk-for-android<\/a><\/li>\n<li>Azure SDK for iOS: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-ios\">github.com\/Azure\/azure-sdk-for-ios<\/a><\/li>\n<li>Azure SDK for Go: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-go\">github.com\/Azure\/azure-sdk-for-go<\/a><\/li>\n<li>Azure SDK for C: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-c\">github.com\/Azure\/azure-sdk-for-c<\/a><\/li>\n<li>Azure SDK for C++: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-cpp\">github.com\/Azure\/azure-sdk-for-cpp<\/a><\/li>\n<\/ul>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE -->\n<!-- START: BLOG POST LINKS -->\n<!-- END: BLOG POST LINKS --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Announcing the GA release of the Azure Monitor Query client libraries for .NET, Java, JavaScript\/TypeScript, and Python.<\/p>\n","protected":false},"author":63456,"featured_media":1201,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[701,804,160,159,162,24],"class_list":["post-1575","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-sdk","tag-net","tag-azure-monitor","tag-java","tag-javascript","tag-python","tag-releases"],"acf":[],"blog_post_summary":"<p>Announcing the GA release of the Azure Monitor Query client libraries for .NET, Java, JavaScript\/TypeScript, and Python.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/1575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/users\/63456"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/comments?post=1575"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/1575\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media\/1201"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media?parent=1575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/categories?post=1575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/tags?post=1575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}