diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md index 35c890e1e4f2..fcd9368e12bc 100644 --- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md @@ -308,6 +308,10 @@ public static class BlobFunction_EnumerateBlobs_BlobClient } ``` +### Configuring the extension + +Please refer to [sample functions app]. + ## Troubleshooting Please refer to [Monitor Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-monitoring) for troubleshooting guidance. diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Directory.Build.props b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Directory.Build.props new file mode 100644 index 000000000000..7c94cde1f3a2 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Directory.Build.props @@ -0,0 +1,15 @@ + + + + true + false + true + false + + + + + + false + + \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj new file mode 100644 index 000000000000..832daf1b3dff --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj @@ -0,0 +1,21 @@ + + + netcoreapp3.1 + $(RequiredTargetFrameworks) + v3 + + + + + + + + + PreserveNewest + + + PreserveNewest + Never + + + diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/README.md new file mode 100644 index 000000000000..06573909d191 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/README.md @@ -0,0 +1,6 @@ +# Sample Azure Function App for Azure Azure WebJobs Storage Blobs + +This sample Azure Function application shows usage of Azure Azure WebJobs Storage Blobs extension. +`SampleFunctions` contains a pair of functions that work with an Azure Storage Blobs +as well as sample configuration files `host.json` and `local.settings.json`. Settings present in `host.json` are optional and used values can be different than defaults. +Connection string present in `local.settings.json` points to [Azurite](https://github.com/Azure/Azurite), however any valid connection string will work. \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/SampleFunctions.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/SampleFunctions.cs new file mode 100644 index 000000000000..4bbe99c7125d --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/SampleFunctions.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using Microsoft.Extensions.Logging; + +namespace Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App +{ + /// + /// A pair of sample functions. First that updates a blob on schedule and second that listens to blob changes. + /// + public static class SampleFunctions + { + /// + /// This function executes on schedule, produces a new content and udpates the blob. + /// + [FunctionName("SampleBlobContentUpdater")] + [return: Blob("sample-container/sample-blob")] + public static string UpdateSampleBlobContent([TimerTrigger("*/30 * * * * *")] TimerInfo timerInfo, ILogger logger) + { + if (timerInfo.IsPastDue) + { + logger.LogInformation("Timer is running late!"); + } + var now = DateTime.Now; + logger.LogInformation($"C# Timer trigger function executed at: {now}"); + + return $"Sample blob content produced at: {now}"; + } + + /// + /// This functions is executed when blob is modified. + /// + [FunctionName("SampleBlobUpdateListener")] + public static void OnBlobUpdate([BlobTrigger("sample-container/sample-blob")] string content, ILogger logger) + { + logger.LogInformation("Blob has been updated, content: {content}", content); + } + } +} diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/host.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/host.json new file mode 100644 index 000000000000..1d897c06e943 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/host.json @@ -0,0 +1,16 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingExcludedTypes": "Request", + "samplingSettings": { + "isEnabled": true + } + } + }, + "extensions": { + "blobs": { + "maxDegreeOfParallelism": "5" + } + } +} \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/local.settings.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/local.settings.json new file mode 100644 index 000000000000..b818866fce36 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/local.settings.json @@ -0,0 +1,7 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;", + "FUNCTIONS_WORKER_RUNTIME": "dotnet" + } +} \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/BlobExtensionSamples.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/BlobExtensionSamples.cs similarity index 100% rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/BlobExtensionSamples.cs rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/BlobExtensionSamples.cs diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj similarity index 57% rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj index a32e1d8abd6a..aa37cf960406 100644 --- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj @@ -8,7 +8,7 @@ - - + + diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md index 49f8d56c6be3..a7c0d2371d1e 100644 --- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md @@ -259,6 +259,10 @@ public static class Function_BindingToQueueClient } ``` +### Configuring the extension + +Please refer to [sample functions app]. + ## Troubleshooting Please refer to [Monitor Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-monitoring) for troubleshooting guidance. diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Directory.Build.props b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Directory.Build.props new file mode 100644 index 000000000000..7c94cde1f3a2 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Directory.Build.props @@ -0,0 +1,15 @@ + + + + true + false + true + false + + + + + + false + + \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj new file mode 100644 index 000000000000..1120b47412e5 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj @@ -0,0 +1,21 @@ + + + netcoreapp3.1 + $(RequiredTargetFrameworks) + v3 + + + + + + + + + PreserveNewest + + + PreserveNewest + Never + + + diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/README.md new file mode 100644 index 000000000000..430afe1f0d93 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/README.md @@ -0,0 +1,6 @@ +# Sample Azure Function App for Azure Azure WebJobs Storage Queues + +This sample Azure Function application shows usage of Azure Azure WebJobs Storage Queues extension. +`SampleFunctions` contains a pair of producer and consumer that work with an Azure Storage Queue +as well as sample configuration files `host.json` and `local.settings.json`. Settings present in `host.json` are optional and used values can be different than defaults. +Connection string present in `local.settings.json` points to [Azurite](https://github.com/Azure/Azurite), however any valid connection string will work. \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/SampleFunctions.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/SampleFunctions.cs new file mode 100644 index 000000000000..128e9e3d8b5e --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/SampleFunctions.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using Microsoft.Extensions.Logging; + +namespace Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App +{ + /// + /// A pair of sample functions. First that produces messages on schedule and second that consumes them. + /// + public static class SampleFunctions + { + /// + /// This function executes on schedule, produces a message and inserts it into the queue. + /// + [FunctionName("SampleQueueMessageProducer")] + [return: Queue("sample-queue")] + public static string ProduceSampleQueueMessage([TimerTrigger("*/10 * * * * *")] TimerInfo timerInfo, ILogger logger) + { + if (timerInfo.IsPastDue) + { + logger.LogInformation("Timer is running late!"); + } + var now = DateTime.Now; + logger.LogInformation($"C# Timer trigger function executed at: {now}"); + + return $"Sample queue message produced at: {now}"; + } + + /// + /// This functions is executed as new messages appear on the queue and consumes them. + /// + [FunctionName("SampleQueueMessageConsumer")] + public static void ConsumeSampleQueueMessage([QueueTrigger("sample-queue")] string message, ILogger logger) + { + logger.LogInformation("Queue message received: {message}", message); + } + } +} diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/host.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/host.json new file mode 100644 index 000000000000..49b881be321b --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/host.json @@ -0,0 +1,21 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingExcludedTypes": "Request", + "samplingSettings": { + "isEnabled": true + } + } + }, + "extensions": { + "queues": { + "messageEncoding": "none", + "maxPollingInterval": "00:00:02", + "visibilityTimeout": "00:00:30", + "batchSize": 16, + "maxDequeueCount": 5, + "newBatchThreshold": 8 + } + } +} \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/local.settings.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/local.settings.json new file mode 100644 index 000000000000..b818866fce36 --- /dev/null +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/local.settings.json @@ -0,0 +1,7 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;", + "FUNCTIONS_WORKER_RUNTIME": "dotnet" + } +} \ No newline at end of file diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj similarity index 56% rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj index 2f520a52c80e..773d4f494c6f 100644 --- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj @@ -8,7 +8,7 @@ - - + + diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/QueueExtensionSamples.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/QueueExtensionSamples.cs similarity index 100% rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/QueueExtensionSamples.cs rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/QueueExtensionSamples.cs diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln index 7c50ce4bf5f2..86d6aaa1dbae 100644 --- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln +++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln @@ -32,12 +32,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Ext EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Azure", "..\extensions\Microsoft.Extensions.Azure\src\Microsoft.Extensions.Azure.csproj", "{CB002B93-3D25-42DD-B1A6-472C10B99BA7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs\samples\Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj", "{77860E78-4770-4C48-8C2B-AF6B42A8D067}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs\samples\readmes\Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj", "{77860E78-4770-4C48-8C2B-AF6B42A8D067}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Queues\samples\Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj", "{A7A937E4-F4E1-47B7-8D25-AA5FB6BDE010}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Queues\samples\readmes\Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj", "{A7A937E4-F4E1-47B7-8D25-AA5FB6BDE010}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage", "Microsoft.Azure.WebJobs.Extensions.Storage\src\Microsoft.Azure.WebJobs.Extensions.Storage.csproj", "{022028DA-6134-4648-881C-9503E3034995}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App", "Microsoft.Azure.WebJobs.Extensions.Storage.Queues\samples\functionapp\Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj", "{342E84D9-3073-4536-A895-0F843782BA97}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App", "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs\samples\functionapp\Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj", "{22D974DB-0B34-48F5-90EC-F65F9902E7D3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -104,6 +108,14 @@ Global {022028DA-6134-4648-881C-9503E3034995}.Debug|Any CPU.Build.0 = Debug|Any CPU {022028DA-6134-4648-881C-9503E3034995}.Release|Any CPU.ActiveCfg = Release|Any CPU {022028DA-6134-4648-881C-9503E3034995}.Release|Any CPU.Build.0 = Release|Any CPU + {342E84D9-3073-4536-A895-0F843782BA97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {342E84D9-3073-4536-A895-0F843782BA97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {342E84D9-3073-4536-A895-0F843782BA97}.Release|Any CPU.ActiveCfg = Release|Any CPU + {342E84D9-3073-4536-A895-0F843782BA97}.Release|Any CPU.Build.0 = Release|Any CPU + {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE