From 3353ce15bc0f30e3b092eadad1ed1e06e42aa677 Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Wed, 18 Nov 2020 16:31:50 -0800 Subject: [PATCH 1/8] Add blurb about distributed tracing --- .../Azure.Messaging.EventGrid/README.md | 3 ++ ...entGridPublisherClientBuilderExtensions.cs | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 sdk/eventgrid/Azure.Messaging.EventGrid/src/Compatibility/EventGridPublisherClientBuilderExtensions.cs diff --git a/sdk/eventgrid/Azure.Messaging.EventGrid/README.md b/sdk/eventgrid/Azure.Messaging.EventGrid/README.md index 3df37982c09b..12744ddeebf8 100644 --- a/sdk/eventgrid/Azure.Messaging.EventGrid/README.md +++ b/sdk/eventgrid/Azure.Messaging.EventGrid/README.md @@ -219,6 +219,9 @@ foreach (EventGridEvent egEvent in egEvents) } ``` +### Distributed Tracing +The Event Grid library supports distributing tracing out of the box. In order to adhere to the CloudEvents specification's [guidance](https://github.com/cloudevents/spec/blob/master/extensions/distributed-tracing.md) on distributing tracing, the library will set the `traceparent` and `tracestate` on the [ExtensionAttributes](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/eventgrid/Azure.Messaging.EventGrid/src/Customization/CloudEvent.cs#L126) of a `CloudEvent` when distributed tracing is enabled. To learn more about how to enable distributed tracing in your application, take a look at the Azure SDK [distributed tracing documentation](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/core/Azure.Core/samples/Diagnostics.md#Distributed-tracing). + ## Troubleshooting ### Service Responses diff --git a/sdk/eventgrid/Azure.Messaging.EventGrid/src/Compatibility/EventGridPublisherClientBuilderExtensions.cs b/sdk/eventgrid/Azure.Messaging.EventGrid/src/Compatibility/EventGridPublisherClientBuilderExtensions.cs new file mode 100644 index 000000000000..7896dfeaee51 --- /dev/null +++ b/sdk/eventgrid/Azure.Messaging.EventGrid/src/Compatibility/EventGridPublisherClientBuilderExtensions.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using Azure; +using Azure.Core.Extensions; +using Azure.Messaging.EventGrid; + +namespace Microsoft.Extensions.Azure +{ + /// + /// The set of extensions to add the type to the clients builder. + /// + public static class EventGridPublisherClientBuilderExtensions + { + /// + /// Registers a instance with the provided and ./>. + /// + public static IAzureClientBuilder AddEventGridPublisherClient( + this TBuilder builder, + Uri endpoint, + AzureKeyCredential credential) + where TBuilder : IAzureClientFactoryBuilder => + builder.RegisterClientFactory(options => new EventGridPublisherClient(endpoint, credential, options)); + + /// + /// Registers a instance with the provided and ./>. + /// + public static IAzureClientBuilder AddEventGridPublisherClient( + this TBuilder builder, + Uri endpoint, + EventGridSharedAccessSignatureCredential credential) + where TBuilder : IAzureClientFactoryBuilder => + builder.RegisterClientFactory(options => new EventGridPublisherClient(endpoint, credential, options)); + + /// + /// Registers a instance with connection options loaded from the provided instance. + /// + public static IAzureClientBuilder AddEventGridPublisherClient( + this TBuilder builder, + TConfiguration configuration) + where TBuilder : IAzureClientFactoryBuilderWithConfiguration => + builder.RegisterClientFactory(configuration); + } +} From ac33989514f9bf2ad55ad123480c3f7aacdfe91b Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Wed, 18 Nov 2020 16:33:32 -0800 Subject: [PATCH 2/8] Export API --- .../api/Azure.Messaging.EventGrid.netstandard2.0.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sdk/eventgrid/Azure.Messaging.EventGrid/api/Azure.Messaging.EventGrid.netstandard2.0.cs b/sdk/eventgrid/Azure.Messaging.EventGrid/api/Azure.Messaging.EventGrid.netstandard2.0.cs index 037015ecc6b2..52dba42fda0a 100644 --- a/sdk/eventgrid/Azure.Messaging.EventGrid/api/Azure.Messaging.EventGrid.netstandard2.0.cs +++ b/sdk/eventgrid/Azure.Messaging.EventGrid/api/Azure.Messaging.EventGrid.netstandard2.0.cs @@ -1341,3 +1341,12 @@ internal WebSlotSwapWithPreviewStartedEventData() { } public string Verb { get { throw null; } } } } +namespace Microsoft.Extensions.Azure +{ + public static partial class EventGridPublisherClientBuilderExtensions + { + public static Azure.Core.Extensions.IAzureClientBuilder AddEventGridPublisherClient(this TBuilder builder, System.Uri endpoint, Azure.AzureKeyCredential credential) where TBuilder : Azure.Core.Extensions.IAzureClientFactoryBuilder { throw null; } + public static Azure.Core.Extensions.IAzureClientBuilder AddEventGridPublisherClient(this TBuilder builder, System.Uri endpoint, Azure.Messaging.EventGrid.EventGridSharedAccessSignatureCredential credential) where TBuilder : Azure.Core.Extensions.IAzureClientFactoryBuilder { throw null; } + public static Azure.Core.Extensions.IAzureClientBuilder AddEventGridPublisherClient(this TBuilder builder, TConfiguration configuration) where TBuilder : Azure.Core.Extensions.IAzureClientFactoryBuilderWithConfiguration { throw null; } + } +} From b842df92d00d085bbd51026f6f1dd5e72c70a227 Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Wed, 18 Nov 2020 16:53:59 -0800 Subject: [PATCH 3/8] Move to troubleshooting section --- sdk/eventgrid/Azure.Messaging.EventGrid/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/eventgrid/Azure.Messaging.EventGrid/README.md b/sdk/eventgrid/Azure.Messaging.EventGrid/README.md index 12744ddeebf8..04da5c295a78 100644 --- a/sdk/eventgrid/Azure.Messaging.EventGrid/README.md +++ b/sdk/eventgrid/Azure.Messaging.EventGrid/README.md @@ -219,9 +219,6 @@ foreach (EventGridEvent egEvent in egEvents) } ``` -### Distributed Tracing -The Event Grid library supports distributing tracing out of the box. In order to adhere to the CloudEvents specification's [guidance](https://github.com/cloudevents/spec/blob/master/extensions/distributed-tracing.md) on distributing tracing, the library will set the `traceparent` and `tracestate` on the [ExtensionAttributes](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/eventgrid/Azure.Messaging.EventGrid/src/Customization/CloudEvent.cs#L126) of a `CloudEvent` when distributed tracing is enabled. To learn more about how to enable distributed tracing in your application, take a look at the Azure SDK [distributed tracing documentation](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/core/Azure.Core/samples/Diagnostics.md#Distributed-tracing). - ## Troubleshooting ### Service Responses @@ -234,6 +231,9 @@ The Event Grid library supports distributing tracing out of the box. In order to ### Setting up console logging You can also easily [enable console logging](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/core/Azure.Core/samples/Diagnostics.md#logging) if you want to dig deeper into the requests you're making against the service. +### Distributed Tracing +The Event Grid library supports distributing tracing out of the box. In order to adhere to the CloudEvents specification's [guidance](https://github.com/cloudevents/spec/blob/master/extensions/distributed-tracing.md) on distributing tracing, the library will set the `traceparent` and `tracestate` on the [ExtensionAttributes](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/eventgrid/Azure.Messaging.EventGrid/src/Customization/CloudEvent.cs#L126) of a `CloudEvent` when distributed tracing is enabled. To learn more about how to enable distributed tracing in your application, take a look at the Azure SDK [distributed tracing documentation](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/core/Azure.Core/samples/Diagnostics.md#Distributed-tracing). + ## Next steps View more https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/eventgrid/Azure.Messaging.EventGrid/samples here for common usages of the Event Grid client library: [Event Grid Samples](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/eventgrid/Azure.Messaging.EventGrid/samples). From 1e70541a6a3fb5b6298579fd9d9789bfbe77a417 Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Thu, 19 Nov 2020 13:14:39 -0800 Subject: [PATCH 4/8] Update linecounter --- .../linecounter/Controllers/HomeController.cs | 11 +++++++++-- samples/linecounter/LineCounter.csproj | 3 +++ samples/linecounter/README.md | 16 +++++++++++++--- samples/linecounter/Startup.cs | 3 ++- samples/linecounter/assets/monitor.PNG | Bin 0 -> 49949 bytes 5 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 samples/linecounter/assets/monitor.PNG diff --git a/samples/linecounter/Controllers/HomeController.cs b/samples/linecounter/Controllers/HomeController.cs index 4b6ebb119481..e051a473dd34 100644 --- a/samples/linecounter/Controllers/HomeController.cs +++ b/samples/linecounter/Controllers/HomeController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; +using Azure.Messaging.EventGrid; using Azure.Messaging.EventHubs; using Azure.Messaging.EventHubs.Producer; using Azure.Storage.Blobs; @@ -18,12 +19,18 @@ public class HomeController : Controller private readonly ILogger _logger; private readonly BlobContainerClient _blobContainerClient; private readonly EventHubProducerClient _uploadsProducer; + private readonly EventGridPublisherClient _publisherClient; - public HomeController(ILogger logger, BlobServiceClient blobServiceClient, IAzureClientFactory clientFactory) + public HomeController( + ILogger logger, + BlobServiceClient blobServiceClient, + IAzureClientFactory clientFactory, + EventGridPublisherClient publisherClient) { _logger = logger; _blobContainerClient = blobServiceClient.GetBlobContainerClient("uploads"); _uploadsProducer = clientFactory.CreateClient("Uploads"); + _publisherClient = publisherClient; } public IActionResult Index() @@ -60,7 +67,7 @@ public async Task Status(string name) { var properties = await _blobContainerClient.GetBlobClient(name).GetPropertiesAsync(); properties.Value.Metadata.TryGetValue("whitespacecount", out var count); - + await _publisherClient.SendEventsAsync(new CloudEvent[] { new CloudEvent("https://www.contoso.com/LineCounter", "LineCounter.Status.Viewed", name) }); return count ?? "-1"; } } diff --git a/samples/linecounter/LineCounter.csproj b/samples/linecounter/LineCounter.csproj index f2039159e1e2..45fc5bc38b51 100644 --- a/samples/linecounter/LineCounter.csproj +++ b/samples/linecounter/LineCounter.csproj @@ -13,4 +13,7 @@ + + + \ No newline at end of file diff --git a/samples/linecounter/README.md b/samples/linecounter/README.md index b1e7342dd607..14ed41260c30 100644 --- a/samples/linecounter/README.md +++ b/samples/linecounter/README.md @@ -6,15 +6,16 @@ products: - azure - azure-storage - azure-event-hubs +- azure-event-grid urlFragment: line-counter name: LineCounter -description: Sample that illustrates using Storage and Event Hubs clients along with ASP.NET Core integration, distributed tracing and hosted services. +description: Sample that illustrates using Storage, Event Hubs, and Event Grid clients along with ASP.NET Core integration, distributed tracing and hosted services. --- # LineCounter -This is a sample app that illustrates using Storage and Event Hubs clients along with ASP.NET Core integration, distributed tracing and hosted services. +This is a sample app that illustrates using Storage, Event Hubs, and Event Grid clients along with ASP.NET Core integration, distributed tracing and hosted services. It allows users to upload a file to a blob, which triggers an Event Hubs event containing the file name. -The Event Hubs Processor receives the event, and then the app downloads the blob and counts the number of lines in the file. +The Event Hubs Processor receives the event, and then the app downloads the blob and counts the number of lines in the file. The app displays a link to a page containing the line count. When the link is clicked, a CloudEvent containing the name of the file is published using Event Grid. # Configuration @@ -32,6 +33,11 @@ To run the sample set the following configuration properties using manage user s "Results": { "connectionString": "...", "eventHubName": "..." + }, + "Notification": { + "endpoint": "...", + "credential": { + "key": "..." } } ``` @@ -45,3 +51,7 @@ To light up App Insights, add the InstrumentationKey key and value to the Applic } } ``` + +# Azure Monitor +You can view an end-to-end transaction in the portal by going to your App. Click on the Search icon, and then click See all data. +After selecting a grouped result, you will be able to see something like this ![Monitor](/assets/monitor.png). diff --git a/samples/linecounter/Startup.cs b/samples/linecounter/Startup.cs index 49c6e681fe26..b6f5a5f98ac8 100644 --- a/samples/linecounter/Startup.cs +++ b/samples/linecounter/Startup.cs @@ -27,8 +27,9 @@ public void ConfigureServices(IServiceCollection services) builder.AddBlobServiceClient(Configuration.GetSection("Blob")); builder.AddEventHubProducerClient(Configuration.GetSection("Uploads")).WithName("Uploads"); - + builder.AddEventHubProducerClient(Configuration.GetSection("Results")).WithName("Results"); + builder.AddEventGridPublisherClient(Configuration.GetSection("Notification")); }); services.AddApplicationInsightsTelemetry(); } diff --git a/samples/linecounter/assets/monitor.PNG b/samples/linecounter/assets/monitor.PNG new file mode 100644 index 0000000000000000000000000000000000000000..4dc2535b5fe6fac125d93d68f9c64a417bdf0c90 GIT binary patch literal 49949 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 a`F1#6x}@e!Mk*9Y@7n3Qqj1}i3;zMULzNN$ literal 0 HcmV?d00001 From 9cd686f859a230d4adc79333d312320d7de27750 Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Thu, 19 Nov 2020 13:15:12 -0800 Subject: [PATCH 5/8] Update Diagnostics README --- sdk/core/Azure.Core/samples/Diagnostics.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdk/core/Azure.Core/samples/Diagnostics.md b/sdk/core/Azure.Core/samples/Diagnostics.md index 04ed8cd5b57b..bcf130fb0f42 100644 --- a/sdk/core/Azure.Core/samples/Diagnostics.md +++ b/sdk/core/Azure.Core/samples/Diagnostics.md @@ -102,6 +102,9 @@ To setup ApplicationInsights tracking for your application follow the [Start Mon Follow the [OpenTelemetry configuration guide](https://github.com/open-telemetry/opentelemetry-dotnet#configuration-with-microsoftextensionsdependencyinjection) to configure collecting distribute tracing event collection using the OpenTelemetry library. +### Sample +To see an example of distributed tracing in action, take a look at our [sample app](https://github.com/Azure/azure-sdk-for-net/blob/master/samples/linecounter/README.md) that combines several Azure SDKs. + ## Setting x-ms-client-request-id value sent with requests By default x-ms-client-request-id header gets a unique value per client method call. If you would like to use a specific value for a set of requests use the `HttpPipeline.CreateClientRequestIdScope` method. From f628f0ad16c1839f08d38940d368bc34a5abec74 Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Thu, 19 Nov 2020 13:20:03 -0800 Subject: [PATCH 6/8] image --- samples/linecounter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/linecounter/README.md b/samples/linecounter/README.md index 14ed41260c30..74e42d1fd769 100644 --- a/samples/linecounter/README.md +++ b/samples/linecounter/README.md @@ -54,4 +54,4 @@ To light up App Insights, add the InstrumentationKey key and value to the Applic # Azure Monitor You can view an end-to-end transaction in the portal by going to your App. Click on the Search icon, and then click See all data. -After selecting a grouped result, you will be able to see something like this ![Monitor](/assets/monitor.png). +After selecting a grouped result, you will be able to see something like this ![Monitor](assets/monitor.PNG). From a6ce2ad18036230ed935ef4a6037e9ea2801e821 Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Thu, 19 Nov 2020 13:21:20 -0800 Subject: [PATCH 7/8] update --- samples/linecounter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/linecounter/README.md b/samples/linecounter/README.md index 74e42d1fd769..13a733f9a86f 100644 --- a/samples/linecounter/README.md +++ b/samples/linecounter/README.md @@ -54,4 +54,4 @@ To light up App Insights, add the InstrumentationKey key and value to the Applic # Azure Monitor You can view an end-to-end transaction in the portal by going to your App. Click on the Search icon, and then click See all data. -After selecting a grouped result, you will be able to see something like this ![Monitor](assets/monitor.PNG). +After selecting a grouped result, you will be able to see a timeline of the grouped requests: ![Monitor](assets/monitor.PNG). From 8ee9de2a83307591cd83795274dacb73b8f30110 Mon Sep 17 00:00:00 2001 From: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Date: Mon, 23 Nov 2020 12:30:31 -0800 Subject: [PATCH 8/8] remove whitespace --- samples/linecounter/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/linecounter/Startup.cs b/samples/linecounter/Startup.cs index b6f5a5f98ac8..ecacd1aeca98 100644 --- a/samples/linecounter/Startup.cs +++ b/samples/linecounter/Startup.cs @@ -27,7 +27,7 @@ public void ConfigureServices(IServiceCollection services) builder.AddBlobServiceClient(Configuration.GetSection("Blob")); builder.AddEventHubProducerClient(Configuration.GetSection("Uploads")).WithName("Uploads"); - + builder.AddEventHubProducerClient(Configuration.GetSection("Results")).WithName("Results"); builder.AddEventGridPublisherClient(Configuration.GetSection("Notification")); });