<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tsuyoshi Ushio</title>
    <description>The latest articles on DEV Community by Tsuyoshi Ushio (@tsuyoshiushio).</description>
    <link>https://dev.to/tsuyoshiushio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F385191%2Ff8b8236c-4dff-41d6-87db-2f79d00c43ee.jpeg</url>
      <title>DEV Community: Tsuyoshi Ushio</title>
      <link>https://dev.to/tsuyoshiushio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tsuyoshiushio"/>
    <language>en</language>
    <item>
      <title>[Update] Creating Nostalgic AOP Using Source Generator</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Mon, 15 Jan 2024 06:00:29 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/update-creating-nostalgic-aop-using-source-generator-3i75</link>
      <guid>https://dev.to/tsuyoshiushio/update-creating-nostalgic-aop-using-source-generator-3i75</guid>
      <description>&lt;h1&gt;
  
  
  Introduction to Roslyn Source Generator
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview" rel="noopener noreferrer"&gt;Roslyn Source Generator&lt;/a&gt; is used in various repositories, such as &lt;a href="https://github.com/Azure/azure-functions-dotnet-worker" rel="noopener noreferrer"&gt;dotnet-isolated-worker&lt;/a&gt;. Unfortunately, I have never worked with it and couldn't understand the code. So, I decided to write a simple sample application to try and understand it.&lt;/p&gt;

&lt;p&gt;The challenge is to create a mock version of AOP (Aspect Oriented Programming). I wanted to see if I could write a sample that injects logs before and after the execution of a function based on defined attributes.&lt;/p&gt;

&lt;h1&gt;
  
  
  What are Roslyn APIs?
&lt;/h1&gt;

&lt;p&gt;Source Generator is part of the &lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/" rel="noopener noreferrer"&gt;Roslyn APIs (The .NET Compiler Platform SDK)&lt;/a&gt;. The Roslyn APIs allow the evaluation of source code during compilation to create a model of the application. These APIs are used to manipulate that model. Specifically, the following can be done:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static code analysis&lt;/li&gt;
&lt;li&gt;Code fixes&lt;/li&gt;
&lt;li&gt;Code refactoring&lt;/li&gt;
&lt;li&gt;Code generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using these features, Visual Studio can provide code suggestions and assist with code refactoring. This feature enables support for maintaining coding conventions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2Fdc023221-8955-01ba-599b-dd306fc3a07f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2Fdc023221-8955-01ba-599b-dd306fc3a07f.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.NET executes a pipeline similar to the one shown above during compilation. APIs are provided to support this pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Syntax Tree API&lt;/strong&gt;: Access the tree model created by parsing the source code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Symbol API&lt;/strong&gt;: Access the symbols created as a result of parsing the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binding and Flow Analysis APIs&lt;/strong&gt;: Bind symbols to identifiers in the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emit API&lt;/strong&gt;: Output assemblies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparing what Visual Studio can do with Roslyn APIs makes it easier to understand the capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2F12599c60-2401-6e7a-b74f-b7d9c74071ee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2F12599c60-2401-6e7a-b74f-b7d9c74071ee.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Source Generator
&lt;/h1&gt;

&lt;p&gt;For this investigation, I want to focus on &lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview" rel="noopener noreferrer"&gt;Source Generator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It allows you to perform the following steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access the Compilation object to access and analyze the structure of the code.&lt;/li&gt;
&lt;li&gt;Generate source code and compile it to create an assembly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Specifically, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve performance by performing tasks that are typically done with reflection using code generation.&lt;/li&gt;
&lt;li&gt;Manipulate the order of execution of tasks in MSBuild.&lt;/li&gt;
&lt;li&gt;Convert dynamic routing into static routing using code generation (used by ASP.NET).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some use cases I have come across are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a definition file for logging is cumbersome, so perform code analysis and generate patterns for all of them.&lt;/li&gt;
&lt;li&gt;Improve performance by generating code for methods that should be executed dynamically, referring to attributes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create a source generator project
&lt;/h3&gt;

&lt;p&gt;Reference the following libraries. Note that it seems to work only with &lt;code&gt;netstandard2.0&lt;/code&gt; currently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Project Sdk="Microsoft.NET.Sdk"&amp;gt;

    &amp;lt;PropertyGroup&amp;gt;
        &amp;lt;TargetFramework&amp;gt;netstandard2.0&amp;lt;/TargetFramework&amp;gt;
    &amp;lt;/PropertyGroup&amp;gt;

    &amp;lt;ItemGroup&amp;gt;
        &amp;lt;PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="all" /&amp;gt;
        &amp;lt;PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" /&amp;gt;
    &amp;lt;/ItemGroup&amp;gt;
&amp;lt;/Project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a generator
&lt;/h3&gt;

&lt;p&gt;To create a generator, implement the &lt;code&gt;ISourceGenerator&lt;/code&gt; interface. You need to implement the &lt;code&gt;Initialize(GeneratorInitializationContext context)&lt;/code&gt; and &lt;code&gt;Execute(GeneratorExecutionContext context)&lt;/code&gt; methods. You can access the current code model and perform code generation through the &lt;code&gt;context&lt;/code&gt; objects in each method. You can access the existing model using the &lt;code&gt;context.Compilation&lt;/code&gt; object, and perform code generation using the &lt;code&gt;context.AddSource&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;You can read, analyze the model, generate code according to your preferences, and compile it. In the following example, a factory is automatically created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace SourceGenerator
{
    [Generator]
    public class FactoryGenerator : ISourceGenerator
    {
        public void Execute(GeneratorExecutionContext context)
        {
            // How to access the CompilationObject
            INamedTypeSymbol attributeSymbol = context.Compilation.GetTypeByMetadataName("AOPLib.FunctionAttribute");
            // Create Factory
            context.AddSource("FunctionFactory.g.cs", SourceText.From($@"
namespace AOPLib{{
  public class FunctionFactory {{
    public static IFunction CreateFunction(string name) {{
          switch(name) {{
            default:
              return new SampleFunction();
          }}
    }}
  }}
}}
", Encoding.UTF8));
        }

        public void Initialize(GeneratorInitializationContext context)
        {

        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The caller would look like the following. We haven't created the code for the &lt;code&gt;FunctionFactory&lt;/code&gt; class anywhere, but there will be no complaints from the IDE about the missing class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;functionName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;IFunction&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AOPLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FunctionFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;functionName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;FunctionContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TraceId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, the project containing the original &lt;code&gt;Program.cs&lt;/code&gt; file, which acts as the caller, would have the following project definition. By setting &lt;code&gt;OutputItemType=Analyzer&lt;/code&gt; and &lt;code&gt;ReferenceOutputAssembly="false"&lt;/code&gt;, the SourceGenerator project's DLL is not imported, and the analyzer is executed. You can find detailed definitions in &lt;a href="https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2022#projectreference" rel="noopener noreferrer"&gt;Common MSBuild Project Items&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Project Sdk="Microsoft.NET.Sdk"&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;OutputType&amp;gt;Exe&amp;lt;/OutputType&amp;gt;
    &amp;lt;TargetFramework&amp;gt;net6.0&amp;lt;/TargetFramework&amp;gt;
    &amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;
    &amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;ProjectReference Include="..\SourceGenerator\SourceGenerator.csproj"
                      OutputItemType="Analyzer"
                      ReferenceOutputAssembly="false"/&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;

&amp;lt;/Project&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the basic usage of Source Generator.&lt;/p&gt;

&lt;h1&gt;
  
  
  Debugging with Source Generator
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Debugging
&lt;/h2&gt;

&lt;p&gt;By default, it is not possible to debug Source Generators directly. However, you can enable debugging in Visual Studio by calling the following method in the &lt;code&gt;Initialize&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GeneratorInitializationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Debugger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Launch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Viewing Generated Source
&lt;/h2&gt;

&lt;p&gt;By default, you cannot view the source code generated by the generator. However, you can enable it by adding the following definition to the &lt;code&gt;csproj&lt;/code&gt; file of the project where the &lt;code&gt;Program.cs&lt;/code&gt; is located. Add it to the &lt;code&gt;PropertyGroup&lt;/code&gt; section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;EmitCompilerGeneratedFiles&amp;gt;true&amp;lt;/EmitCompilerGeneratedFiles&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2Fa3c6486b-e374-0009-9b16-ee526ddf643a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2Fa3c6486b-e374-0009-9b16-ee526ddf643a.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating an AOP Sample
&lt;/h1&gt;

&lt;p&gt;The previous example was a simple one, but it would be better to try a slightly more complex sample. So let's implement a fake AOP (Aspect-Oriented Programming) by defining an attribute called &lt;code&gt;Function&lt;/code&gt;. If the &lt;code&gt;Logging&lt;/code&gt; flag in the attribute is set to &lt;code&gt;true&lt;/code&gt;, it automatically outputs logs when the method is executed.&lt;/p&gt;

&lt;p&gt;For example, if we write a program like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace AOPSample
{
    [Function(isLogging: true)]
    public class LoggingFunction : IFunction
    {
        public void Execute(FunctionContext context)
        {
            Console.WriteLine($"[{nameof(LoggingFunction)}]: execute. Name: {context.Name}");
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since the &lt;code&gt;isLogging&lt;/code&gt; attribute is set to &lt;code&gt;true&lt;/code&gt;, the Source Generator will automatically find this file and inject the logging logic.&lt;/p&gt;

&lt;p&gt;To make it easier, let's write an adapter like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class LoggingAdapter : IFunction
{
    private readonly IFunction _function;
    public LoggingAdapter(IFunction function)
    {
        _function = function;
    }
    public void Execute(FunctionContext context)
    {
        Console.WriteLine($"[{DateTime.UtcNow}] {_function.GetType().Name}: before execute. TraceId: {context.TraceId}");
        _function.Execute(context);
        Console.WriteLine($"[{DateTime.UtcNow}] {_function.GetType().Name}: after execute. TraceId: {context.TraceId}");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, you can generate the code by creating an instance of &lt;code&gt;LoggingAdapter&lt;/code&gt; and passing it to &lt;code&gt;new ***Function()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Generation Logic
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace SourceGenerator
{
    [Generator]
    public class FactoryGenerator : ISourceGenerator
    {
        public void Execute(GeneratorExecutionContext context)
        {
            // Get the symbol for the FunctionAttribute
            INamedTypeSymbol attributeSymbol = context.Compilation.GetTypeByMetadataName("AOPLib.FunctionAttribute");
            // Get all classes from Compilation.SyntaxTrees
            var targetClasses = context.Compilation.SyntaxTrees
                .SelectMany(st =&amp;gt; st.GetRoot().DescendantNodes().OfType&amp;lt;ClassDeclarationSyntax&amp;gt;());
            // Extract only the classes that have the FunctionAttribute
            var selectedTargetClasses = targetClasses.Where(p =&amp;gt; p.AttributeLists.FirstOrDefault()?.Attributes.FirstOrDefault()?.Name.NormalizeWhitespace().ToFullString() == "Function");
            // Save information about the selected classes as metadata in a dictionary
            var registeredClasses = new Dictionary&amp;lt;string, FunctionMetadata&amp;gt;();
            // Check the information of the Attribute used in the class.
            // Store the metadata information of the Function in the dictionary, such as `isLogging`.
            foreach (var clazz in selectedTargetClasses)
            {
                var attribute = clazz.AttributeLists.First()?.Attributes.FirstOrDefault();
                var attributeArgument = attribute.ArgumentList.Arguments.FirstOrDefault();
                var isLogging = attributeArgument.Expression.NormalizeWhitespace().ToFullString().Contains("true");
                var typeSymbol = context.Compilation.GetSemanticModel(clazz.SyntaxTree).GetDeclaredSymbol(clazz);
                var className = typeSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
                var classNameOnly = typeSymbol.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat);
                registeredClasses.Add(classNameOnly, new FunctionMetadata { FullyQualifiedName = className, Name = classNameOnly, IsLogging = isLogging });
            }

            // Create the code generation template and generate the code
            context.AddSource("FunctionFactory.g.cs", SourceText.From($@"
namespace AOPLib{{
  public class FunctionFactory {{
    public static IFunction CreateFunction(string name) {{
          switch(name) {{
            {GetFunctionsSection(registeredClasses)}
            default:
              return new SampleFunction();
          }}
    }}
  }}
}}
", Encoding.UTF8));
        }

        public void Initialize(GeneratorInitializationContext context)
        {
            Debugger.Launch();
        }

        private string GetFunctionsSection(Dictionary&amp;lt;string, FunctionMetadata&amp;gt; metadata)
        {
            var sb = new StringBuilder();
            foreach (var item in metadata)
            {
                sb.AppendLine($"case \"{item.Key}\":");
                if (item.Value.IsLogging)
                {
                    sb.AppendLine($"return new LoggingAdapter(new {item.Value.FullyQualifiedName}());");
                }
                else
                {
                    sb.AppendLine($"return new {item.Value.FullyQualifiedName}();");
                }
            }
            return sb.ToString();
        }
    }

    class FunctionMetadata
    {
        public string Name { get; set; }
        public string FullyQualifiedName { get; set; }
        public bool IsLogging { get; set; }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execution Result
&lt;/h3&gt;

&lt;p&gt;Although no code was written in the main program, logs are automatically outputted as expected with the fake AOP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2F9689fbcd-82d8-90da-6d37-8118ae554246.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2F9689fbcd-82d8-90da-6d37-8118ae554246.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;isLogging&lt;/code&gt; is set to &lt;code&gt;false&lt;/code&gt;, no logs will be outputted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2F088a4a86-cb06-f20c-b372-2afd3d62c71f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3470%2F088a4a86-cb06-f20c-b372-2afd3d62c71f.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  IncrementalGenerators
&lt;/h1&gt;

&lt;p&gt;Now, the interface I used in the above example is an official method, but it seems to be an older method. I received feedback from someone with worldwide expertise. It's amazing to receive feedback from such people when I write a blog!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/neuecc/status/1703657375394341330?s=20" rel="noopener noreferrer"&gt;https://x.com/neuecc/status/1703657375394341330?s=20&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should probably read the article &lt;a href="https://neue.cc/2022/12/16_IncrementalSourceGenerator.html" rel="noopener noreferrer"&gt;C# in 2022 (Incremental) Source Generator Development Method&lt;/a&gt; and the official documentation on &lt;a href="https://github.com/dotnet/roslyn/blob/main/docs/features/incremental-generators.md" rel="noopener noreferrer"&gt;Incremental Generators&lt;/a&gt;. Let's explain the new interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  IIncrementalGenerator
&lt;/h2&gt;

&lt;p&gt;Compared to &lt;code&gt;ISourceGenerator&lt;/code&gt;, it only has&lt;/p&gt;

&lt;h2&gt;
  
  
  Porting the AOP Sample
&lt;/h2&gt;

&lt;p&gt;Now that we have learned the new approach, let's rewrite the AOP sample with &lt;code&gt;Incremental Generators&lt;/code&gt;.&lt;br&gt;
Great! It has become much easier to understand! I will add explanations within the code. The process follows the same flow as explained earlier: we process the &lt;code&gt;IncrementalValue(s)Provider&amp;lt;T&amp;gt;&lt;/code&gt; using a Linq-like interface, manipulate it, and pass the final result to &lt;code&gt;RegisterOutput&lt;/code&gt; to generate the files. The key point is to realize that it may look like Linq, but it's not actually Linq. By correctly reading about &lt;a href="https://github.com/dotnet/roslyn/blob/main/docs/features/incremental-generators.md" rel="noopener noreferrer"&gt;Incremental Generators&lt;/a&gt;, you will understand that it's not about handling collections, so it can also return a single value. That's where &lt;code&gt;IncrementalValueProvider&amp;lt;T&amp;gt;&lt;/code&gt; comes in for singular values, and &lt;code&gt;IncrementalValuesProvider&amp;lt;T&amp;gt;&lt;/code&gt; for multiple values.&lt;/p&gt;

&lt;p&gt;I will add comments as needed throughout the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;SourceGenerator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LanguageNames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CSharp&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FactoryGenerator&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IIncrementalGenerator&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IncrementalGeneratorInitializationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Uncomment this line if you want to debug.&lt;/span&gt;
            &lt;span class="c1"&gt;// Debugger.Launch();&lt;/span&gt;
            &lt;span class="c1"&gt;// ExtensionMethod ForAttributeWithMetadataName() is awesome!&lt;/span&gt;
            &lt;span class="c1"&gt;// It returns all classes with the specified attribute.&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SyntaxProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ForAttributeWithMetadataName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"AOPLib.FunctionAttribute"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="c1"&gt;// It can be written in a similar way to Linq. Here we analyze the classes and &lt;/span&gt;
                &lt;span class="c1"&gt;// retrieve the values from the attributes attached to the classes and store &lt;/span&gt;
                &lt;span class="c1"&gt;// them in FunctionMetadata.&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
                    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;typeSymbol&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;INamedTypeSymbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TargetSymbol&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;fullType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typeSymbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToDisplayString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SymbolDisplayFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FullyQualifiedFormat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typeSymbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToDisplayString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SymbolDisplayFormat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MinimallyQualifiedFormat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;isLogging&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;()?.&lt;/span&gt;&lt;span class="n"&gt;ConstructorArguments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FunctionMetadata&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;FullyQualifiedName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fullType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IsLogging&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isLogging&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="c1"&gt;// Finally, we perform Collect() to convert it to IncrementalValueProvider.&lt;/span&gt;
            &lt;span class="c1"&gt;// It was IncrementalValuesProvider&amp;lt;FunctionMetadata&amp;gt; before, but now it&lt;/span&gt;
            &lt;span class="c1"&gt;// has been converted to IncrementalValueProvider&amp;lt;ImmutableArray&amp;lt;FunctionMetadata&amp;gt;&amp;gt;.&lt;/span&gt;
            &lt;span class="c1"&gt;// We convert it from plural to singular to ensure the Action is only called once.&lt;/span&gt;
            &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;Collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RegisterSourceOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Emit&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Since we have converted it to a singular form, this method will be called only once.&lt;/span&gt;
        &lt;span class="c1"&gt;// Without Collect(), it would be called multiple times.&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SourceProductionContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImmutableArray&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FunctionMetadata&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Create Factory&lt;/span&gt;
            &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FunctionFactory.g.cs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SourceText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$@"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s"&gt;namespace AOPLib&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FunctionFactory&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IFunction&lt;/span&gt; &lt;span class="nf"&gt;CreateFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;
          &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;GetFunctionsSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
              &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SampleFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="p"&gt;}}&lt;/span&gt;
  &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Encoding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF8&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;GetFunctionsSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ImmutableArray&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FunctionMetadata&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StringBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"case \"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;\":"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsLogging&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"return new LoggingAdapter(new &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FullyQualifiedName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;());"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"return new &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FullyQualifiedName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;();"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FunctionMetadata&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;FullyQualifiedName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;IsLogging&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compared to the previous version, it looks much cleaner. By the way, let's compare the case where &lt;code&gt;IIncrementalGenerator&lt;/code&gt; is available and when it's not, like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/AOPSample/tree/a0b9eeba3958fc7b4b1c8686db5797fd8e0ac334" rel="noopener noreferrer"&gt;With IIncrementalGenerator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/AOPSample/tree/b432bc952cd2556e2f59d96e707e146359cee634" rel="noopener noreferrer"&gt;Without IIncrementalGenerator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;This generator enables us to execute code that would normally be done using reflection in a static manner, or analyze the structure of the code. It is a very useful and interesting feature. However, I have only scratched the surface, and I think it may be difficult to detect bugs in the generated code. It seems that it would be necessary to write unit tests or other means to cover those cases.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;However, since I am still new to this, I can't say that I fully understand it yet. I will continue to investigate and write more samples.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;I have provided the sample used in this blog post here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/AOPSample/tree/main" rel="noopener noreferrer"&gt;AOP Sample&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md" rel="noopener noreferrer"&gt;Source Generation Cookbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.md" rel="noopener noreferrer"&gt;Source Generator Design document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/roslyn-sdk/tree/main/samples/CSharp/SourceGenerators" rel="noopener noreferrer"&gt;Official Samples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This blog is translated from &lt;a href="https://qiita.com/TsuyoshiUshio@github/items/b42773afaa4a25c2af60" rel="noopener noreferrer"&gt;[更新] Source Generator を使って懐かしの AOP を作ってみる&lt;/a&gt; Powered by &lt;a href="https://github.com/TsuyoshiUshio/BlogBabel" rel="noopener noreferrer"&gt;BlogBabel&lt;/a&gt;&lt;/p&gt;

</description>
      <category>roslyn</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Kafka ScaledJobs sample for KEDA with EventHubs</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Tue, 09 Feb 2021 07:38:51 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/kafka-scaledjobs-sample-for-keda-with-eventhubs-h2m</link>
      <guid>https://dev.to/tsuyoshiushio/kafka-scaledjobs-sample-for-keda-with-eventhubs-h2m</guid>
      <description>&lt;p&gt;I wanted to create a sample for testing Kafka Scaler with ScaledJob. It requires simple go client that will finish once the message has consumed. The reason why I use go is, &lt;a href="https://keda.sh/"&gt;KEDA&lt;/a&gt; Kafka Scaler using &lt;a href="https://github.com/Shopify/sarama"&gt;Sarama&lt;/a&gt; for implementing Kafka Scaler. So that I thought it might help to understand the kafka scaler implementation. &lt;/p&gt;

&lt;h1&gt;
  
  
  Kafka Broker
&lt;/h1&gt;

&lt;p&gt;I use the Kafka Broker as EventHubs for easily to create a broker. We can use EventHubs with Kafka API. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-for-kafka-ecosystem-overview"&gt;Use Azure Event Hubs from Apache Kafka applications&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Configuration
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Sarama
&lt;/h2&gt;

&lt;p&gt;Configuration for Sarama with EventHubs are like this.  You need to pass &lt;code&gt;EventHubs Connection String&lt;/code&gt; as &lt;code&gt;config.Net.SASL.Password&lt;/code&gt;.  Other consideration, is, &lt;code&gt;config.Consumer.Group.Session.Timeout&lt;/code&gt; If you don't configure the value, the client is easy to returns &lt;code&gt;panic: Error from consumer: read tcp 172.26.24.68:34288-&amp;gt;40.78.250.71:9093: i/o timeout&lt;/code&gt;. By configuring this value, your client works fine. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Azure/azure-event-hubs-for-kafka"&gt;EventHubs Kafka Trouble Shooting&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config := sarama.NewConfig()
config.Version = sarama.V1_0_0_0
config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRange
config.Net.SASL.Enable = true
config.Net.SASL.User = "$ConnectionString"
config.Net.SASL.Password = os.Getenv(saslPassword)
config.Consumer.Group.Session.Timeout = 60 * time.Second
config.Net.TLS.Enable = true

consumer := Consumer{
    ready: make(chan bool),
}

ctx, cancel := context.WithCancel(context.Background())
client, err := sarama.NewConsumerGroup(strings.Split(brokers, ","), group, config)
if err != nil {
    log.Panicf("Error creating consumer group client: %v", err)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the Scaled Job, I'd like to finish the pod once the app receive a message. We need to implement callback Struct for processing message. It is rough implementation for sample, however, I notify the message consuming by channel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;
&lt;span class="c"&gt;// Consumer struct&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Consumer&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ready&lt;/span&gt; &lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Setup method&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sarama&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConsumerGroupSession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Cleanup method&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sarama&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConsumerGroupSession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// ConsumeClaim method&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ConsumeClaim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="n"&gt;sarama&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConsumerGroupSession&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;claim&lt;/span&gt; &lt;span class="n"&gt;sarama&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConsumerGroupClaim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;claim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Messages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Message claimed: value = %s, timestamp = %v, topic = %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Topic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MarkMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;consumed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Scaled Job
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Secret
&lt;/h2&gt;

&lt;p&gt;For the Kafka Scaled Job, I create two secrets. One for Authentication for the Kafka Scaler, the other is Environment Variables for the Pod. Replace the value of &lt;code&gt;YOUR_EVENT_HUBS_CONNECTION_STRING_BASE64&lt;/code&gt; with your EventHubs connection string.Don't forget to convert into base64.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;secret.yaml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-kafka-secrets&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sasl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plaintext&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;as&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;base64"&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$ConnectionString&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;as&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;base64"&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_EVENT_HUBS_CONNECTION_STRING_BASE64"&lt;/span&gt;
  &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enable&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;as&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;base64"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;pod-secret.yaml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-kafka-pod-secrets&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;SASL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_EVENT_HUBS_CONNECTION_STRING_BASE64"&lt;/span&gt;
  &lt;span class="na"&gt;BROKER_LIST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BROKER_LIST_BASE64"&lt;/span&gt;
  &lt;span class="na"&gt;TOPICS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TOPIC_BASE64"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ScaledJob
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda.sh/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ScaledJob&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kafka-consumer&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;jobTargetRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kafka-consumer&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tsuyoshiushio/kafka-consumer:0.2&lt;/span&gt;
          &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
          &lt;span class="na"&gt;envFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;secretRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-kafka-pod-secrets&lt;/span&gt;
        &lt;span class="na"&gt;restartPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Never&lt;/span&gt;
  &lt;span class="na"&gt;pollingInterval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;maxReplicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;successfulJobsHistoryLimit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;failedJobsHistoryLimit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;scalingStrategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;accurate&lt;/span&gt;
  &lt;span class="na"&gt;triggers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kafka&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;bootstrapServers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MY_EVENT_HUB_NAMESPACE.servicebus.windows.net:9093&lt;/span&gt;
      &lt;span class="na"&gt;consumerGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$Default&lt;/span&gt;
      &lt;span class="na"&gt;topic&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;multi-topic&lt;/span&gt;
      &lt;span class="na"&gt;lagThreshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;5'&lt;/span&gt;
    &lt;span class="na"&gt;authenticationRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kafka-trigger-auth&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda.sh/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TriggerAuthentication&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kafka-trigger-auth&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;secretTargetRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;parameter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sasl&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-kafka-secrets&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sasl&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;parameter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;username&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-kafka-secrets&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;username&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;parameter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-kafka-secrets&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;password&lt;/span&gt;    
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;parameter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tls&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keda-kafka-secrets&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Run on kubernets
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://keda.sh/docs/1.4/deploy/"&gt;Install KEDA&lt;/a&gt; and make sure &lt;br&gt;
two keda pods working. You can see the operator logs by &lt;code&gt;kubectl logs -f  keda-operator-6b546dc696-gzc72&lt;/code&gt; in this case. It helps to understand how keda scale jobs works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; keda
NAME                                      READY   STATUS    RESTARTS   AGE
keda-metrics-apiserver-6dff8c4f7f-z9szt   1/1     Running   0          5d1h
keda-operator-6b546dc696-gzc72            1/1     Running   0          51m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clone and build and publish the image on samples. &lt;a href="https://github.com/TsuyoshiUshio/KafkaScaledJobWithGo"&gt;KafkaScaledJobWithGo&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-f&lt;/span&gt; tsuyoshiushio/kafka-consumer:0.2
&lt;span class="nv"&gt;$ &lt;/span&gt;docker push tsuyoshiushio/kafka-consumer:0.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you update the version or name, change the &lt;code&gt;scaledjob.yaml&lt;/code&gt; on the &lt;code&gt;image&lt;/code&gt; section.&lt;/p&gt;

&lt;p&gt;Apply the Secret and ScaledJob.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; secret.yaml
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pod-secret.yaml
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; scaledjob.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then send message to the target EventHub, then you will see the job is created according to the number of the messages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods
NAME                                   READY   STATUS      RESTARTS   AGE
func-deployment-http-7dffc56bc-6494h   1/1     Running     0          4d8h
kafka-consumer-5bmdd-dwb44             0/1     Completed   0          73s
kafka-consumer-n4vvx-gwrhf             0/1     Completed   0          82s
kafka-consumer-t2hth-cthlh             1/1     Running     0          64s
kafka-consumer-vzh4d-rjjt9             0/1     Completed   0          91s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Resource
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure/azure-event-hubs-for-kafka"&gt;EventHubs Kafka Trouble Shooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://keda.sh/docs/2.1/concepts/scaling-jobs/#overview"&gt;Scaling Jobs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://keda.sh/docs/2.1/scalers/apache-kafka/"&gt;Apache Kafka Scaler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/KafkaScaledJobWithGo"&gt;KafkaScaledJobWithGo (Sample Repo)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kafka</category>
      <category>keda</category>
      <category>go</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Enabling KEDA debugging</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Wed, 03 Feb 2021 04:57:54 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/enabling-keda-debugging-3h13</link>
      <guid>https://dev.to/tsuyoshiushio/enabling-keda-debugging-3h13</guid>
      <description>&lt;p&gt;If you are contributing the &lt;a href="https://github.com/kedacore/keda"&gt;KEDA&lt;/a&gt;, you might be wondering how we can debug it. I'd like to share the tips for debugging KEDA.&lt;/p&gt;

&lt;p&gt;We have several ways to do it. &lt;/p&gt;

&lt;h1&gt;
  
  
  Remote Debugging
&lt;/h1&gt;

&lt;p&gt;Remote debugging is not very recommended since it is relatively slow, however, sometimes, it requires. KEDA has two servers. one is &lt;code&gt;keda-operator&lt;/code&gt; that has reconcile loop. It ask the infromation to the &lt;code&gt;keda-metrics-apiserver&lt;/code&gt; that is only reside in the k8s cluster. In case you want to debug &lt;code&gt;keda-metrics-apiserver&lt;/code&gt; we need the remote debugging.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Dockerfile
&lt;/h2&gt;

&lt;p&gt;Create a Dockerfile that enalbes us to debug. It is just adding delv and  build with &lt;code&gt;gcflags "-N -l"&lt;/code&gt;.  then start the execution file with wrapping with &lt;code&gt;dlv&lt;/code&gt; command with exposing port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["/dlv", "--listen=:4040", "--headless=true", "--api-version=1", "--continue", "--accept-multiclient", "exec", "/workspace/keda-adapter", "--", "--secure-port=6443", "--logtostderr=true", "--v=0"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The parameters means following. &lt;code&gt;--&lt;/code&gt; means passing arguments to the executable (in this case, keda-adapter)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dlv &lt;span class="nt"&gt;--help&lt;/span&gt;
Delve is a &lt;span class="nb"&gt;source &lt;/span&gt;level debugger &lt;span class="k"&gt;for &lt;/span&gt;Go programs.

Delve enables you to interact with your program by controlling the execution of the process,
evaluating variables, and providing information of thread / goroutine state, CPU register state and more.

The goal of this tool is to provide a simple yet powerful interface &lt;span class="k"&gt;for &lt;/span&gt;debugging Go programs.

Pass flags to the program you are debugging using &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;, &lt;span class="k"&gt;for &lt;/span&gt;example:

&lt;span class="sb"&gt;`&lt;/span&gt;dlv &lt;span class="nb"&gt;exec&lt;/span&gt; ./hello &lt;span class="nt"&gt;--&lt;/span&gt; server &lt;span class="nt"&gt;--config&lt;/span&gt; conf/config.toml&lt;span class="sb"&gt;`&lt;/span&gt;

Usage:
  dlv &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;

Available Commands:
  attach      Attach to running process and begin debugging.
  connect     Connect to a headless debug server.
  core        Examine a core dump.
  dap         &lt;span class="o"&gt;[&lt;/span&gt;EXPERIMENTAL] Starts a TCP server communicating via Debug Adaptor Protocol &lt;span class="o"&gt;(&lt;/span&gt;DAP&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
  debug       Compile and begin debugging main package &lt;span class="k"&gt;in &lt;/span&gt;current directory, or the package specified.
  &lt;span class="nb"&gt;exec        &lt;/span&gt;Execute a precompiled binary, and begin a debug session.
  &lt;span class="nb"&gt;help        &lt;/span&gt;Help about any &lt;span class="nb"&gt;command
  &lt;/span&gt;run         Deprecated command. Use &lt;span class="s1"&gt;'debug'&lt;/span&gt; instead.
  &lt;span class="nb"&gt;test        &lt;/span&gt;Compile &lt;span class="nb"&gt;test &lt;/span&gt;binary and begin debugging program.
  trace       Compile and begin tracing program.
  version     Prints version.

Flags:
      &lt;span class="nt"&gt;--accept-multiclient&lt;/span&gt;   Allows a headless server to accept multiple client connections.
      &lt;span class="nt"&gt;--api-version&lt;/span&gt; int      Selects API version when headless. New clients should use v2. Can be reset via RPCServer.SetApiVersion. See Documentation/api/json-rpc/README.md. &lt;span class="o"&gt;(&lt;/span&gt;default 1&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--backend&lt;/span&gt; string       Backend selection &lt;span class="o"&gt;(&lt;/span&gt;see &lt;span class="s1"&gt;'dlv help backend'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;default &lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--build-flags&lt;/span&gt; string   Build flags, to be passed to the compiler.
      &lt;span class="nt"&gt;--check-go-version&lt;/span&gt;     Checks that the version of Go &lt;span class="k"&gt;in &lt;/span&gt;use is compatible with Delve. &lt;span class="o"&gt;(&lt;/span&gt;default &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--headless&lt;/span&gt;             Run debug server only, &lt;span class="k"&gt;in &lt;/span&gt;headless mode.
      &lt;span class="nt"&gt;--init&lt;/span&gt; string          Init file, executed by the terminal client.
  &lt;span class="nt"&gt;-l&lt;/span&gt;, &lt;span class="nt"&gt;--listen&lt;/span&gt; string        Debugging server listen address. &lt;span class="o"&gt;(&lt;/span&gt;default &lt;span class="s2"&gt;"127.0.0.1:0"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--log&lt;/span&gt;                  Enable debugging server logging.
      &lt;span class="nt"&gt;--log-dest&lt;/span&gt; string      Writes logs to the specified file or file descriptor &lt;span class="o"&gt;(&lt;/span&gt;see &lt;span class="s1"&gt;'dlv help log'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
      &lt;span class="nt"&gt;--log-output&lt;/span&gt; string    Comma separated list of components that should produce debug output &lt;span class="o"&gt;(&lt;/span&gt;see &lt;span class="s1"&gt;'dlv help log'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--only-same-user&lt;/span&gt;       Only connections from the same user that started this instance of Delve are allowed to connect. &lt;span class="o"&gt;(&lt;/span&gt;default &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="nt"&gt;--wd&lt;/span&gt; string            Working directory &lt;span class="k"&gt;for &lt;/span&gt;running the program. &lt;span class="o"&gt;(&lt;/span&gt;default &lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

Additional &lt;span class="nb"&gt;help &lt;/span&gt;topics:
  dlv backend Help about the &lt;span class="nt"&gt;--backend&lt;/span&gt; flag.
  dlv log     Help about logging flags.

Use &lt;span class="s2"&gt;"dlv [command] --help"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;more information about a command.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Docker.remote&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; golang:1.15 as builder&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /workspace&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;go get &lt;span class="nt"&gt;-u&lt;/span&gt; github.com/go-delve/delve/cmd/dlv

&lt;span class="c"&gt;# Copy the Go Modules manifests&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; go.mod go.mod&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; go.sum go.sum&lt;/span&gt;
&lt;span class="c"&gt;# cache deps before building and copying source so that we don't need to re-download as much&lt;/span&gt;
&lt;span class="c"&gt;# and so that source changes don't invalidate our downloaded layer&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;go mod download

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; Makefile Makefile&lt;/span&gt;

&lt;span class="c"&gt;# Copy the go source&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; hack/ hack/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; version/ version/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; main.go main.go&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; adapter/ adapter/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; api/ api/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; controllers/ controllers/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; pkg/ pkg/&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /apiserver.local.config/certificates &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 777 /apiserver.local.config

&lt;span class="c"&gt;# Build&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="nv"&gt;GOOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;linux &lt;span class="nv"&gt;GOARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amd64 &lt;span class="nv"&gt;GO111MODULE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on go build &lt;span class="nt"&gt;-gcflags&lt;/span&gt; &lt;span class="s2"&gt;"-N -l"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; keda-adapter adapter/main.go

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ubuntu:18.04&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /apiserver.local.config  /apiserver.local.config&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /workspace /workspace&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /go/bin/dlv /dlv&lt;/span&gt;

&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["/dlv", "--listen=:4040", "--headless=true", "--api-version=1", "--continue", "--accept-multiclient", "exec", "/workspace/keda-adapter", "--", "--secure-port=6443", "--logtostderr=true", "--v=0"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then build and publish to your dockerhub account. In my case,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker login
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-f&lt;/span&gt; Docker.remote &lt;span class="nt"&gt;-t&lt;/span&gt; tsuyoshiushio/adapter:1
&lt;span class="nv"&gt;$ &lt;/span&gt;docker push tsuyoshiushio/adapter:1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Update the deployment
&lt;/h2&gt;

&lt;p&gt;We can see the two deployment is available on the k8s cluster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ushio@DESKTOP-KIUTRHV:~/Code/keda&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get deployment &lt;span class="nt"&gt;-n&lt;/span&gt; keda
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
keda-metrics-apiserver   1/1     1            1           6h2m
keda-operator            1/1     1            1           6h2m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;let's edit the keda-metrics-apiserver.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl edit deployment keda-metrics-apiserver &lt;span class="nt"&gt;-n&lt;/span&gt; keda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;let's change the image part.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    spec:
      containers:
      - args:
        - /usr/local/bin/keda-adapter
        - &lt;span class="nt"&gt;--secure-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6443
        - &lt;span class="nt"&gt;--logtostderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
        - &lt;span class="nt"&gt;--v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
        &lt;span class="nb"&gt;env&lt;/span&gt;:
        - name: WATCH_NAMESPACE
        image: docker.io/tsuyoshiushio/adapter:3    // &amp;lt;- Change
        imagePullPolicy: Always
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then port forward it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; keda
NAME                                      READY   STATUS    RESTARTS   AGE
keda-metrics-apiserver-6d5689599f-884x9   1/1     Running   0          68s
keda-operator-6b546dc696-cxdbq            1/1     Running   0          5h49m
&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl port-forward keda-metrics-apiserver-6d5689599f-884x9  &lt;span class="nt"&gt;-n&lt;/span&gt; keda 4040:4040
Forwarding from 127.0.0.1:4040 -&amp;gt; 4040
Forwarding from &lt;span class="o"&gt;[&lt;/span&gt;::1]:4040 -&amp;gt; 4040
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For VS Code, you can configure &lt;code&gt;launch.json&lt;/code&gt; settings to attach remote server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Remote debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"attach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"remotePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/workspace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4040&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"127.0.0.1"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, it is sometimes, hard to wait very slow response. I recommend to go with Local debugging and adding log to see the remote container. &lt;/p&gt;

&lt;h1&gt;
  
  
  Local Debugging
&lt;/h1&gt;

&lt;p&gt;Set the &lt;code&gt;launch.json&lt;/code&gt; with VSCode. Just start the &lt;code&gt;main.go&lt;/code&gt; on the root of the KEDA repo. We can not use keda-metrics-apiserver since it reside in the cluster. However, we can do the local debugging for the keda-operator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Connect to server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"launch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"program"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}/main.go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"WATCH_NAMESPACE"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Build and publish KEDA to your kubernets cluster
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;make undeploy&lt;/code&gt; will remove the keda resources. &lt;code&gt;make deploy&lt;/code&gt; deploy the keda resources to the cluster when you in development.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get all &lt;span class="nt"&gt;-n&lt;/span&gt; keda
NAME                                          READY   STATUS    RESTARTS   AGE
pod/keda-metrics-apiserver-6dff8c4f7f-8qc9v   1/1     Running   0          30s
pod/keda-operator-6b546dc696-pf5ck            1/1     Running   0          29s

NAME                             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT&lt;span class="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt;          AGE
service/keda-metrics-apiserver   ClusterIP   10.0.16.80   &amp;lt;none&amp;gt;        443/TCP,80/TCP   31s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/keda-metrics-apiserver   1/1     1            1           30s
deployment.apps/keda-operator            1/1     1            1           29s

NAME                                                DESIRED   CURRENT   READY   AGE
replicaset.apps/keda-metrics-apiserver-6dff8c4f7f   1         1         1       31s
replicaset.apps/keda-operator-6b546dc696            1         1         1       30s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>keda</category>
      <category>go</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Using Fiddler for Application Insights codeless java agent with docker on WSL2</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Thu, 17 Dec 2020 09:24:36 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/using-fiddler-for-application-insights-codeless-java-agent-with-docker-on-wsl2-3kjl</link>
      <guid>https://dev.to/tsuyoshiushio/using-fiddler-for-application-insights-codeless-java-agent-with-docker-on-wsl2-3kjl</guid>
      <description>&lt;p&gt;I'm working on &lt;a href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/java-in-process-agent"&gt;Application Insights - Java codeless agent&lt;/a&gt; working on a docker container on WSL2. It works on the other guys machine, however, on my laptop, it sometimes work, most of the times, it doesn't work. &lt;/p&gt;

&lt;p&gt;My colleague gave me an advice to use &lt;a href="https://www.telerik.com/fiddler"&gt;Fiddler&lt;/a&gt;. I use it for watching network requests that is coming from a docker container on WSL2.&lt;/p&gt;

&lt;p&gt;Let's see how to configure it. &lt;/p&gt;

&lt;h1&gt;
  
  
  Strategy Overview
&lt;/h1&gt;

&lt;p&gt;We are configure the Java Application Insights agent for proxying to the Fiddler. We need to answer these questions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to extract a root certificate from Fiddler and import it to JVM KeyStore on Docker. (I use &lt;a href="https://www.azul.com/"&gt;zulu&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;How to send request from WSL2 to Windows 10&lt;/li&gt;
&lt;li&gt;How to configure Application Insights agent to proxy to the Fiddler.&lt;/li&gt;
&lt;li&gt;Is there any other configuration required?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Export a root certificate from Fiddler
&lt;/h1&gt;

&lt;p&gt;Go to &lt;code&gt;Tools &amp;gt; Options &amp;gt; HTTPS &amp;gt; Actions&lt;/code&gt; then select &lt;code&gt;Export Root Certificate to Desktop&lt;/code&gt;. Then move the file to WSL2 side. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e_tDa0ZR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6z2r39bt0819qezb14k1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e_tDa0ZR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6z2r39bt0819qezb14k1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the wsl2 side I do this after the moving the file to Download.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mv&lt;/span&gt; /mnt/c/Users/tsushi/Download/FiddlerRoot.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Import the certificate to the KeyStore on JVM
&lt;/h1&gt;

&lt;p&gt;We can use &lt;code&gt;keytool&lt;/code&gt; for import the certificate to the JVM KeyStore. In case of &lt;code&gt;zulu&lt;/code&gt;,  the KeyStore is &lt;code&gt;/usr/lib/jvm/zre-8-azure-amd64/lib/security/cacerts&lt;/code&gt; by default. The default password of the KeyStore is &lt;code&gt;changeit&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; FiddlerRoot.cer /&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;/usr/lib/jvm/zre-8-azure-amd64/bin/keytool &lt;span class="nt"&gt;-import&lt;/span&gt; &lt;span class="nt"&gt;-noprompt&lt;/span&gt; &lt;span class="nt"&gt;-trustcacerts&lt;/span&gt; &lt;span class="nt"&gt;-alias&lt;/span&gt; FiddlerRoot &lt;span class="nt"&gt;-file&lt;/span&gt; /FiddlerRoot.cer &lt;span class="nt"&gt;-keystore&lt;/span&gt; /usr/lib/jvm/zre-8-azure-amd64/lib/security/cacerts &lt;span class="nt"&gt;-storepass&lt;/span&gt; changeit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Configure Application Insights Codeless Agent for Proxy
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Find IPAddress for accessing from WSL2 to Windows 10
&lt;/h2&gt;

&lt;p&gt;To accessing from WSL2 to Windows 10, you can open &lt;code&gt;Network Connection&lt;/code&gt; from your &lt;code&gt;Type here to search&lt;/code&gt; box on your Windows 10. &lt;br&gt;
You can find a network adopter &lt;code&gt;vEthernet (WSL)&lt;/code&gt;, Find the IP address. The IP Address is the address that is seen it as Windows10 from WSL2. In my case it is, &lt;code&gt;172.20.64.1&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---WoRy1xN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g299fm5s9nvt3vkvom2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---WoRy1xN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g299fm5s9nvt3vkvom2r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find the Fiddler port number in here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nYMUkHjm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9dwcbl5b3wxcunm2t9ze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nYMUkHjm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9dwcbl5b3wxcunm2t9ze.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Configure the codeless agent
&lt;/h2&gt;

&lt;p&gt;Configure the &lt;code&gt;proxy&lt;/code&gt; section with the IP Address and port number. Then the Java codeless agent will send request to the proxy (Fiddler).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proxy"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"172.20.64.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8888&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"selfDiagnostics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"file+console"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"INFO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/var/log/applicationinsights/applicationinsights.log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"maxSizeMb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"maxHistory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Configure Fiddler to accept the request from WSL2
&lt;/h1&gt;

&lt;p&gt;Configure the &lt;code&gt;Allow remote computers to connect&lt;/code&gt; From the Windows 10 Fiddler, WSL2 is different computer. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LETTT7dX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7s0a41xs6tofeqtyihg2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LETTT7dX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7s0a41xs6tofeqtyihg2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start the Fiddler, and run the Docker container. You will find the two requests. These are the Application Insights telemetry. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rt.services.visualstudio.com&lt;/li&gt;
&lt;li&gt;{location}-{number}.in.applicationinsights.azure.com&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code-examples.net/ja/q/827575"&gt;How to capture https request on Java: Japanese&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/java-standalone-config#http-proxy"&gt;Http Proxy - Configuration options - Azure Monitor Application Insights for Java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>fiddler</category>
      <category>wsl2</category>
      <category>applicationinsights</category>
      <category>java</category>
    </item>
    <item>
      <title>Solves 0 function found on Azure Function - Linux Consumption plan</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Fri, 11 Dec 2020 08:25:31 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/solves-0-function-found-on-azure-function-linux-consumption-plan-1nnl</link>
      <guid>https://dev.to/tsuyoshiushio/solves-0-function-found-on-azure-function-linux-consumption-plan-1nnl</guid>
      <description>&lt;p&gt;I encounter an issue related archive. I trip to Japan. I use a desktop machine in Seattle, however, now I'm using my old laptop. I replaced the laptop with the desktop as my main machine. &lt;/p&gt;

&lt;p&gt;The behavior is, I use the same Azure Functions sample. I crone the repo, In this case, the app is Java. I build it with &lt;code&gt;mvn clean package&lt;/code&gt; then I archive it to a zip file. like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a zip file&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$currentDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$zipFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;join-path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$currentDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sample-cold.zip&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Compress-Archive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'.\target\azure-functions\sample\*'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DestinationPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$zipFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use the same logic and create an archive. However, the archive I created on my desktop works, but not for a zip from laptop. &lt;/p&gt;

&lt;p&gt;When I test both archives, extract these, it looks the same. I move the archive to WSL2 and extract these with unzip. It looks the same. According to the Azure Functions Host log, it says&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0 functions found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is the issue of the archive. I did &lt;code&gt;docker exec&lt;/code&gt; and find the root cause. When I go to &lt;code&gt;/home/site/wwwroot&lt;/code&gt; I found the files that is downloaded and extracted zip file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@658408192cc6:~/site/wwwroot# &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
total 57867
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app      354 Dec 10 11:51 &lt;span class="s1"&gt;'HttpTrigger-Java\function.json'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app     5267 Dec 10 11:51  codeless-azure-function-Test-1.0-SNAPSHOT.jar
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app       24 Dec 10 19:42  host.json
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app   317195 Dec 10 11:51 &lt;span class="s1"&gt;'lib\FastInfoset-1.2.16.jar'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app    30035 Dec 10 11:51 &lt;span class="s1"&gt;'lib\accessors-smart-1.2.jar'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app    62983 Dec 10 11:51 &lt;span class="s1"&gt;'lib\activation-1.1.jar'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app    94485 Dec 10 11:51 &lt;span class="s1"&gt;'lib\adal4j-1.6.2.jar'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app    17079 Dec 10 11:51 &lt;span class="s1"&gt;'lib\adapter-rxjava-2.4.0.jar'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app   136324 Dec 10 11:51 &lt;span class="s1"&gt;'lib\aether-api-1.0.2.v20150114.jar'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app   172998 Dec 10 11:51 &lt;span class="s1"&gt;'lib\aether-impl-1.0.2.v20150114.jar'&lt;/span&gt;
&lt;span class="nt"&gt;-rw-rw-r--&lt;/span&gt; 1 app app    30705 Dec 10 11:51 &lt;span class="s1"&gt;'lib\aether-spi-1.0.2.v20150114.jar'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is weird, It was not the directly. &lt;/p&gt;

&lt;h1&gt;
  
  
  Solution
&lt;/h1&gt;

&lt;p&gt;I found the issue was &lt;code&gt;Compress-Archive&lt;/code&gt; command let version. The version I had issue is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$Host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Version&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Major&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;Minor&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;Build&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;Revision&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;-----&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-----&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-----&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;--------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;19041&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;610&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I update the version to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;version&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Major&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;Minor&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;Build&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;Revision&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="o"&gt;-----&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-----&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-----&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;--------&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This version looks work. Now I can see the directory. &lt;/p&gt;

&lt;p&gt;The problem of the extract zip only happens with Azure Functions Host. Probably it is because of the library on C#.&lt;/p&gt;

&lt;p&gt;I can see several &lt;code&gt;Compress-Archive&lt;/code&gt; command let issue with Linux. &lt;br&gt;
&lt;a href="https://github.com/PowerShell/Microsoft.PowerShell.Archive/issues/93"&gt;Compress-Archive on linux creates zip files with no file permissions&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Happy coding with Azure Functions!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Enabling Memory Profiling on KEDA v2</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Tue, 20 Oct 2020 18:57:43 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/enabling-memory-profiling-on-keda-v2-157g</link>
      <guid>https://dev.to/tsuyoshiushio/enabling-memory-profiling-on-keda-v2-157g</guid>
      <description>&lt;p&gt;I have a minor memory leak issue to solve. So that I'm wondering how can we enable profiler on KEDA. KEDA uses &lt;a href="https://sdk.operatorframework.io/docs/"&gt;Operator SDK&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Go lang has a good profiler. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flaviocopes.com/golang-profiling/"&gt;Getting started with Go CPU and memory profiling&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/kedacore/keda"&gt;KEDA&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is very simple to use it. Just add this line for memory profiling.&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuration and Issue
&lt;/h1&gt;

&lt;p&gt;According to the documentation, the configuration will be like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get github.com/pkg/profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then add following line to the &lt;code&gt;main.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c"&gt;//...&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/pkg/profile"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MemProfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the KEDA on my local machine. However, it doesn't work. The root cause is, we need to stop the operator sdk with ctr+c. In this case, &lt;code&gt;defer&lt;/code&gt; method doesn't execute &lt;code&gt;Stop()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ushio@DESKTOP-KIUTRHV:~/Code/keda$ make run ARGS="--zap-log-level=debug"
/home/ushio/go/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go run \
-ldflags "-X=github.com/kedacore/keda/version.GitCommit=d0788b943ecf94f7f7c5b1a09f777cc3af6b746e -X=github.com/kedacore/keda/version.Version=v2" \
./main.go --zap-log-level=debug
2020/10/20 09:19:49 profile: memory profiling enabled (rate 4096), /tmp/profile174831365/mem.pprof
                   :
^C2020/10/20 09:20:02 profile: caught interrupt, stopping profiles
Exit 0 for profiling
make: *** [Makefile:96: run] Interrupt

$ ls -l /tmp/profile287657069/mem.pprof
-rw-r--r-- 1 ushio ushio 0 Oct 20 09:18 /tmp/profile287657069/mem.pprof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Solution
&lt;/h1&gt;

&lt;p&gt;If you want to handle the SIG interrupt, you can use &lt;code&gt;signal.Notify&lt;/code&gt; method for handling the signal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;SetupCloseHandler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Interrupt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;syscall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGTERM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s"&gt;- Ctrl+C pressed in Terminal"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;DeleteFiles&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I read the &lt;a href="https://github.com/kedacore/keda/blob/v2/main.go#L118-L121"&gt;main.go&lt;/a&gt; they are also having the signal handling part. Let's change it to call &lt;code&gt;profile.Stop()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Memory profiling&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MemProfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NoShutdownHook&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="c"&gt;//  if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {&lt;/span&gt;
    &lt;span class="c"&gt;//      setupLog.Error(err, "problem running manager")&lt;/span&gt;
    &lt;span class="c"&gt;//      os.Exit(1) // Profiling test&lt;/span&gt;
    &lt;span class="c"&gt;//  }&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-----SetupCloseHandler"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;setupSignalHandler&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stopCh&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Interrupt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;syscall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGTERM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Exit 0 for profiling"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// second signal. Exit directly.&lt;/span&gt;
        &lt;span class="p"&gt;}()&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;stop&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;mgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setupSignalHandler&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;setupLog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"problem running manager"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it. Works!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /tmp/profile388737932/mem.pprof
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 ushio ushio 47888 Oct 20 09:31 /tmp/profile388737932/mem.pprof
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Viewer
&lt;/h1&gt;

&lt;p&gt;The next step will be the view the analysis report. &lt;br&gt;
It looks requires &lt;a href="https://www.graphviz.org/download/"&gt;graphviz&lt;/a&gt;. Install it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go tool pprof &lt;span class="nt"&gt;--pdf&lt;/span&gt; /tmp/profile356144532/mem.pprof &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; file.pdf
failed to execute dot. Is Graphviz installed? Error: &lt;span class="nb"&gt;exec&lt;/span&gt;: &lt;span class="s2"&gt;"dot"&lt;/span&gt;: executable file not found &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;graphviz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go tool pprof &lt;span class="nt"&gt;--pdf&lt;/span&gt; /tmp/profile356144532/mem.pprof &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; file.pdf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bCnNvqLG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b8vwd9biqalyjpghud88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bCnNvqLG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b8vwd9biqalyjpghud88.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't know if there is better way to enable profiling using Operator SDK. Once I know it, I'll update this blog.&lt;/p&gt;

&lt;h1&gt;
  
  
  Reference
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://golangcode.com/handle-ctrl-c-exit-in-terminal/"&gt;Handle Ctrl+C (Signal Interrupt) Close in the Terminal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>keda</category>
    </item>
    <item>
      <title>Debugging Java Language Worker on Azure Functions</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Sat, 15 Aug 2020 07:47:31 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/debugging-java-language-worker-on-azure-functions-83f</link>
      <guid>https://dev.to/tsuyoshiushio/debugging-java-language-worker-on-azure-functions-83f</guid>
      <description>&lt;p&gt;If you want to contribute Java Language worker, how to debug it? It works with &lt;a href="https://github.com/Azure/azure-functions-host"&gt;Azure Functions Host&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is three player for this debug story. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1HOFZaeN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9ey4izqh0r6ed2drf6yo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1HOFZaeN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9ey4izqh0r6ed2drf6yo.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Architecture
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Azure Functions Host (C#)
&lt;/h2&gt;

&lt;p&gt;The main process of the &lt;a href="https://github.com/Azure/azure-functions-host"&gt;Azure Functions&lt;/a&gt; execution. Under the food, it uses &lt;a href="https://github.com/Azure/azure-webjobs-sdk"&gt;WebJobsSDK&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. Binding Extensions (C# + wrapper)
&lt;/h2&gt;

&lt;p&gt;Azure functions has a several &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings"&gt;Triggers and bindings&lt;/a&gt;. It will receive an event by the various measure. &lt;code&gt;Http&lt;/code&gt;, &lt;code&gt;Queue&lt;/code&gt;, &lt;code&gt;Kafka&lt;/code&gt;, &lt;code&gt;EventHubs&lt;/code&gt;, &lt;code&gt;CosmosDB&lt;/code&gt; ... and so on. It also outputs messages. It is written by C#. Language implementation is an wrapper of the C# implementation. &lt;/p&gt;

&lt;h2&gt;
  
  
  3. Java Language Worker (Java)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Azure/azure-functions-java-worker"&gt;Java Language Worker&lt;/a&gt; is a worker process. Except for C# precompile implementation, Azure Functions host delegate the function execution to each language workers via gRPC. &lt;/p&gt;

&lt;h2&gt;
  
  
  4. Azure Functions Java Library (Java)
&lt;/h2&gt;

&lt;p&gt;That is mainly the definition of annotation that is used by the Binding Extensions wrapper. The library is referenced by User's Azure Functions, Java Language Worker, and &lt;a href="https://github.com/microsoft/azure-maven-plugins"&gt;Azure Functions Maven Plugin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Application Insights Agent (Java)
&lt;/h2&gt;

&lt;p&gt;It is injected with the Java Language Worker as an &lt;a href="https://www.developer.com/java/data/what-is-java-agent.html"&gt;agent&lt;/a&gt;. It is automatically track the telemetries with correlation without changing any code. The automated dependency tracking is limited for some libraries. Please refer to it on this article. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/java-in-process-agent"&gt;Java codeless application monitoring Azure Monitor Application Insights - public preview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Azure Functions (Java)
&lt;/h2&gt;

&lt;p&gt;Azure Functions that customers write. The Language worker class loader load the functions by the annotations.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to debug it?
&lt;/h1&gt;

&lt;p&gt;Since there is a lot of players, how can I debug the Java Worker part? We can easily debug the Azure Functions part. However, Java Worker is started by the Azure Functions Host. &lt;/p&gt;

&lt;h2&gt;
  
  
  Create an Azure Functions
&lt;/h2&gt;

&lt;p&gt;For debugging the Java Language Worker, we need create a function to execute it. Please refer to &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function-azure-cli?tabs=bash%2Cbrowser&amp;amp;pivots=programming-language-java"&gt;Quickstart: Create a function in Azure that responds to HTTP requests&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One point for the debugging is, how to manage the &lt;code&gt;Binding extensions&lt;/code&gt;. Usually, we use &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-register#extension-bundles"&gt;Extension bundles&lt;/a&gt;. So we don't need to install the Bindings by setting the &lt;code&gt;host.json&lt;/code&gt;. It will automatically install the extensions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extensionBundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Azure.Functions.ExtensionBundle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[1.*, 2.0.0)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;However, the local debug scenario, you might need to install the extension by your self.  You need to have &lt;code&gt;extension.csproj&lt;/code&gt; file under the, &lt;code&gt;target/azure-functions/&amp;lt;YOUR_FUNCTION_APP_NAME&amp;gt;&lt;/code&gt; directory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install extension
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MaOxQ2GH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dc71dt0tvc9qvjfg4ra3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MaOxQ2GH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dc71dt0tvc9qvjfg4ra3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This code is a sample for &lt;code&gt;EventHubs&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt; &lt;span class="na"&gt;Sdk=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.NET.Sdk"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;netcoreapp3.1&lt;span class="nt"&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;WarningsAsErrors&amp;gt;&amp;lt;/WarningsAsErrors&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DefaultItemExcludes&amp;gt;&lt;/span&gt;**&lt;span class="nt"&gt;&amp;lt;/DefaultItemExcludes&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class="na"&gt;Include=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.Azure.WebJobs.Extensions.EventHubs"&lt;/span&gt; &lt;span class="na"&gt;Version=&lt;/span&gt;&lt;span class="s"&gt;"4.1.1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;PackageReference&lt;/span&gt; &lt;span class="na"&gt;Include=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator"&lt;/span&gt; &lt;span class="na"&gt;Version=&lt;/span&gt;&lt;span class="s"&gt;"1.1.7"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then go to the &lt;code&gt;target/azure-functions/&amp;lt;FUNCTION_APP_NAME&amp;gt;&lt;/code&gt; dir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mvn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nf"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;extension.csproj&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;target\azure-functions\fabrikam-functions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nf"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;target\azure-functions\fabrikam-functions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nf"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;extension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You will see the &lt;code&gt;bin&lt;/code&gt; directory that contains &lt;code&gt;DLL&lt;/code&gt; files for the extensions. The DLL is libraries of the Extension. &lt;/p&gt;

&lt;p&gt;Now ready to configure Azure Functions Host. &lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Azure Functions Host for Java Worker Debugging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  WebJobs.Script.WebHost as startup
&lt;/h3&gt;

&lt;p&gt;Clone the &lt;a href="https://github.com/Azure/azure-functions-host"&gt;Azure Functions Host&lt;/a&gt;. Then open Visual Studio and make &lt;code&gt;WebJobs.Script.WebHost&lt;/code&gt; as startup project. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H4sQb_Sd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9cy5h5md4v5xvpy0fz0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H4sQb_Sd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9cy5h5md4v5xvpy0fz0g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Environment Variables
&lt;/h3&gt;

&lt;p&gt;Right click &lt;code&gt;WebJobs.Script.WebHost&lt;/code&gt; &amp;gt; &lt;code&gt;Properties&lt;/code&gt; &amp;gt; Debug. Configure the environment variables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vTl4o2S4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fieaytmcbo86ql97qvwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vTl4o2S4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fieaytmcbo86ql97qvwx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Value (sample)&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AzureWebJobsScriptRoot&lt;/td&gt;
&lt;td&gt;C:\Users\tsushi\Code\java\azure-functions-samples\EventHubs\target\azure-functions\fabrikam-functions-20200814172147278&lt;/td&gt;
&lt;td&gt;Point to the azure functions function app directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASPNETCORE_ENVIRONMENT&lt;/td&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Mode for AspNetCore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AZURE_FUNCTIONS_ENVIRONMENT&lt;/td&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Mode for Azure Functions Host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AzureWebJobsDashboard&lt;/td&gt;
&lt;td&gt;UseDevelopmentStorage=true&lt;/td&gt;
&lt;td&gt;Connection string of Storage Account or Storage Emulator for the functions host dashboard.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AzureWebJobsStorage&lt;/td&gt;
&lt;td&gt;UseDevelopmentStorage=true&lt;/td&gt;
&lt;td&gt;Connection string of Storage Account or Storage Emulator for the functions host.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FUNCTIONS_WORKER_RUNTIME&lt;/td&gt;
&lt;td&gt;java&lt;/td&gt;
&lt;td&gt;Worker Runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;languageWorkers:java:arguments&lt;/td&gt;
&lt;td&gt;-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005&lt;/td&gt;
&lt;td&gt;Environment Variables for debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also you need to add &lt;strong&gt;AppSettings that your functions need&lt;/strong&gt;. &lt;br&gt;
You might wondering why &lt;code&gt;AZURE_FUNCTIONS_ENVIRONMENT&lt;/code&gt; and &lt;code&gt;ASPNETCORE_ENVIRONMENT&lt;/code&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You'll want to use &lt;code&gt;AZURE_FUNCTIONS_ENVIRONMENT&lt;/code&gt;. The Functions runtime that powers a Function app on Azure is the WebHost project in this repo. As the host is initializing, it looks for the &lt;code&gt;AZURE_FUNCTIONS_ENVIRONMENT&lt;/code&gt; app setting (as &lt;code&gt;EnvironmentSettingNames.EnvironmentNameKey&lt;/code&gt;) and &lt;a href="https://github.com/Azure/azure-functions-host/blob/bb15fba262572a9af1aff7f57edfaeb0f9f9b9de/src/WebJobs.Script.WebHost/Program.cs#L43"&gt;passes it to the IWebHostBuilder&lt;/a&gt;. Using only &lt;code&gt;ASPNETCORE_ENVIRONMENT&lt;/code&gt; can lead to desired behavior changes and telemetry being missed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Update JavaWorker
&lt;/h3&gt;

&lt;p&gt;If you modify your code on the Java worker, you need to build it and package it on the Java Worker's cloned repo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nf"&gt;PS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mvn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;clean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You will find &lt;code&gt;azure-functions-java-worker-&amp;lt;VERSION&amp;gt;.jar&lt;/code&gt;. Copy the jar file to the &lt;code&gt;WebJobs.Script.WebHost\bin\Debug\netcoreapp3.1\workers\java&lt;/code&gt; on the Azure Functions Host project. &lt;/p&gt;

&lt;p&gt;Now ready to debug. hit &lt;code&gt;F5&lt;/code&gt;. Then debugging starts. One tips is, if you choose &lt;code&gt;IIS Express&lt;/code&gt; you can not see a log. Choose 1WebJobs.Script.WebHost` instead. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xDubFIYj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fxkcdu3t2cwvu82c10tp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xDubFIYj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fxkcdu3t2cwvu82c10tp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Attach from an IntelliJ
&lt;/h3&gt;

&lt;p&gt;Follow &lt;a href="https://github.com/Azure/azure-functions-java-worker/wiki/Debugging-Azure-Functions-Host-and-Java-Worker"&gt;Debugging Azure Functions Host and Java Worker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a remote debugging. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fVyTskht--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kf99hh3jnhxh8da214fi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fVyTskht--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kf99hh3jnhxh8da214fi.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just click start the debugging on the IntelliJ. It attach to the &lt;code&gt;5005&lt;/code&gt; port that is the Java worker. Just send an request &lt;code&gt;http://localhost:5000/api/YOUR_FUNCTIONS_NAME&lt;/code&gt;. or sending queues for triggering your Azure Functions. &lt;/p&gt;

&lt;p&gt;It works!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lyvkkHZh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jcranhq6s6sxp4veewco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lyvkkHZh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jcranhq6s6sxp4veewco.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Resource
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure/azure-functions-host/wiki/Contributor-Onboarding"&gt;Contributor Onboarding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure/azure-functions-java-worker/wiki/Debugging-Azure-Functions-Host-and-Java-Worker"&gt;Debugging Azure Functions Host and Java Worker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>java</category>
    </item>
    <item>
      <title>Automatically create and deploy Java Azure Functions sample app to a Function App.</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Thu, 13 Aug 2020 07:45:44 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/automatically-create-and-deploy-java-azure-functions-sample-app-4p71</link>
      <guid>https://dev.to/tsuyoshiushio/automatically-create-and-deploy-java-azure-functions-sample-app-4p71</guid>
      <description>&lt;p&gt;The main tooling for the Azure Functions with Java is &lt;code&gt;maven&lt;/code&gt;. I wanted to automatically create an sample app and deploy to the Premium Linux App. How can we do it? &lt;/p&gt;

&lt;h1&gt;
  
  
  Create a sample project
&lt;/h1&gt;

&lt;p&gt;You can follow the quick start. However, I wanted to automate it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function-azure-cli?tabs=bash%2Cbrowser&amp;amp;pivots=programming-language-java"&gt;Quickstart: Create a function in Azure that responds to HTTP requests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To automate this part is quite easy. If you try the tutorial, you need to manually input some parameters. &lt;code&gt;groupId&lt;/code&gt;, &lt;code&gt;artifactId&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt; and &lt;code&gt;package&lt;/code&gt; is the one. Using &lt;code&gt;-D&lt;/code&gt; flag, we can pass it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn archetype:generate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-DarchetypeGroupId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;com.microsoft.azure &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-DarchetypeArtifactId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;azure-functions-archetype &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-DinteractiveMode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-DgroupId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;com.fabrikam &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-DartifactId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fabrikam-functions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dversion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0-SNAPSHOT &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dpackage&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;com.fabrikam
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It will create an &lt;code&gt;pom.xml&lt;/code&gt; file and sample project. It is ready to deploy. &lt;/p&gt;

&lt;h1&gt;
  
  
  The problem
&lt;/h1&gt;

&lt;p&gt;However, the problem is, the generated &lt;code&gt;pom.xml&lt;/code&gt; is like below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Java version on properties
&lt;/h2&gt;

&lt;p&gt;Obviously, it is fixed to the &lt;code&gt;Java8&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight xml"&gt;&lt;code&gt;        &lt;span class="nt"&gt;&amp;lt;java.version&amp;gt;&lt;/span&gt;1.8&lt;span class="nt"&gt;&amp;lt;/java.version&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Azure Functions Maven Plugin Config for Function APp.
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;azure-functions-maven-plugin&lt;/code&gt; can create/deploy an app to  &lt;code&gt;function app&lt;/code&gt;, however, it is already configured. If we want to automate it, we should modify the &lt;code&gt;pom.xml&lt;/code&gt;. It is windows, however, I want to use Linux. I want to modify a lot of parts.I can write some app to modify this &lt;code&gt;pom.xml&lt;/code&gt;, however, it is obviously, not cool. How can I modify it?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight xml"&gt;&lt;code&gt;            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.microsoft.azure&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;azure-functions-maven-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${azure.functions.maven.plugin.version}&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app name --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;appName&amp;gt;&lt;/span&gt;${functionAppName}&lt;span class="nt"&gt;&amp;lt;/appName&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app resource group --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;resourceGroup&amp;gt;&lt;/span&gt;java-functions-group&lt;span class="nt"&gt;&amp;lt;/resourceGroup&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app service plan name --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;appServicePlanName&amp;gt;&lt;/span&gt;java-functions-app-service-plan&lt;span class="nt"&gt;&amp;lt;/appServicePlanName&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app region--&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;region&amp;gt;&lt;/span&gt;westus&lt;span class="nt"&gt;&amp;lt;/region&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function pricingTier, default to be consumption if not specified --&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values --&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;pricingTier&amp;gt;&amp;lt;/pricingTier&amp;gt; --&amp;gt;&lt;/span&gt;

                    &lt;span class="c"&gt;&amp;lt;!-- Whether to disable application insights, default is false --&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights--&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;disableAppInsights&amp;gt;&amp;lt;/disableAppInsights&amp;gt; --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;runtime&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- runtime os, could be windows, linux or docker--&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;os&amp;gt;&lt;/span&gt;windows&lt;span class="nt"&gt;&amp;lt;/os&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;javaVersion&amp;gt;&lt;/span&gt;8&lt;span class="nt"&gt;&amp;lt;/javaVersion&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- for docker function, please set the following parameters --&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;image&amp;gt;[hub-user/]repo-name[:tag]&amp;lt;/image&amp;gt; --&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;serverId&amp;gt;&amp;lt;/serverId&amp;gt; --&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;registryUrl&amp;gt;&amp;lt;/registryUrl&amp;gt;  --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/runtime&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;appSettings&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;FUNCTIONS_EXTENSION_VERSION&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;~3&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/appSettings&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Generated pom.xml
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;project&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0"&lt;/span&gt; &lt;span class="na"&gt;xmlns:xsi=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt; &lt;span class="na"&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class="s"&gt;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span class="nt"&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fabrikam&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;fabrikam-functions&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;packaging&amp;gt;&lt;/span&gt;jar&lt;span class="nt"&gt;&amp;lt;/packaging&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Azure Java Functions&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;project.build.sourceEncoding&amp;gt;&lt;/span&gt;UTF-8&lt;span class="nt"&gt;&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;java.version&amp;gt;&lt;/span&gt;1.8&lt;span class="nt"&gt;&amp;lt;/java.version&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;azure.functions.maven.plugin.version&amp;gt;&lt;/span&gt;1.6.0&lt;span class="nt"&gt;&amp;lt;/azure.functions.maven.plugin.version&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;azure.functions.java.library.version&amp;gt;&lt;/span&gt;1.3.1&lt;span class="nt"&gt;&amp;lt;/azure.functions.java.library.version&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;functionAppName&amp;gt;&lt;/span&gt;fabrikam-functions-20200812194325715&lt;span class="nt"&gt;&amp;lt;/functionAppName&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;stagingDirectory&amp;gt;&lt;/span&gt;${project.build.directory}/azure-functions/${functionAppName}&lt;span class="nt"&gt;&amp;lt;/stagingDirectory&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.microsoft.azure.functions&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;azure-functions-java-library&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${azure.functions.java.library.version}&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

        &lt;span class="c"&gt;&amp;lt;!-- Test --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.junit.jupiter&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;junit-jupiter&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;5.4.2&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.mockito&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;mockito-core&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.23.4&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.8.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;source&amp;gt;&lt;/span&gt;${java.version}&lt;span class="nt"&gt;&amp;lt;/source&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;target&amp;gt;&lt;/span&gt;${java.version}&lt;span class="nt"&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;encoding&amp;gt;&lt;/span&gt;${project.build.sourceEncoding}&lt;span class="nt"&gt;&amp;lt;/encoding&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.microsoft.azure&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;azure-functions-maven-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${azure.functions.maven.plugin.version}&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app name --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;appName&amp;gt;&lt;/span&gt;${functionAppName}&lt;span class="nt"&gt;&amp;lt;/appName&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app resource group --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;resourceGroup&amp;gt;&lt;/span&gt;java-functions-group&lt;span class="nt"&gt;&amp;lt;/resourceGroup&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app service plan name --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;appServicePlanName&amp;gt;&lt;/span&gt;java-functions-app-service-plan&lt;span class="nt"&gt;&amp;lt;/appServicePlanName&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function app region--&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;region&amp;gt;&lt;/span&gt;westus&lt;span class="nt"&gt;&amp;lt;/region&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- function pricingTier, default to be consumption if not specified --&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values --&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;pricingTier&amp;gt;&amp;lt;/pricingTier&amp;gt; --&amp;gt;&lt;/span&gt;

                    &lt;span class="c"&gt;&amp;lt;!-- Whether to disable application insights, default is false --&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights--&amp;gt;&lt;/span&gt;
                    &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;disableAppInsights&amp;gt;&amp;lt;/disableAppInsights&amp;gt; --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;runtime&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- runtime os, could be windows, linux or docker--&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;os&amp;gt;&lt;/span&gt;windows&lt;span class="nt"&gt;&amp;lt;/os&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;javaVersion&amp;gt;&lt;/span&gt;8&lt;span class="nt"&gt;&amp;lt;/javaVersion&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- for docker function, please set the following parameters --&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;image&amp;gt;[hub-user/]repo-name[:tag]&amp;lt;/image&amp;gt; --&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;serverId&amp;gt;&amp;lt;/serverId&amp;gt; --&amp;gt;&lt;/span&gt;
                        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;registryUrl&amp;gt;&amp;lt;/registryUrl&amp;gt;  --&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/runtime&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;appSettings&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;property&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;FUNCTIONS_EXTENSION_VERSION&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;~3&lt;span class="nt"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/property&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/appSettings&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;package-functions&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;package&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-resources-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;copy-resources&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;package&lt;span class="nt"&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;copy-resources&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;overwrite&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/overwrite&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;outputDirectory&amp;gt;&lt;/span&gt;${stagingDirectory}&lt;span class="nt"&gt;&amp;lt;/outputDirectory&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;resources&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;resource&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;directory&amp;gt;&lt;/span&gt;${project.basedir}&lt;span class="nt"&gt;&amp;lt;/directory&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;includes&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;include&amp;gt;&lt;/span&gt;host.json&lt;span class="nt"&gt;&amp;lt;/include&amp;gt;&lt;/span&gt;
                                        &lt;span class="nt"&gt;&amp;lt;include&amp;gt;&lt;/span&gt;local.settings.json&lt;span class="nt"&gt;&amp;lt;/include&amp;gt;&lt;/span&gt;
                                    &lt;span class="nt"&gt;&amp;lt;/includes&amp;gt;&lt;/span&gt;
                                &lt;span class="nt"&gt;&amp;lt;/resource&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;/resources&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-dependency-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.1.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;copy-dependencies&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;prepare-package&lt;span class="nt"&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;copy-dependencies&lt;span class="nt"&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;outputDirectory&amp;gt;&lt;/span&gt;${stagingDirectory}/lib&lt;span class="nt"&gt;&amp;lt;/outputDirectory&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;overWriteReleases&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/overWriteReleases&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;overWriteSnapshots&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/overWriteSnapshots&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;overWriteIfNewer&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/overWriteIfNewer&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;includeScope&amp;gt;&lt;/span&gt;runtime&lt;span class="nt"&gt;&amp;lt;/includeScope&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;excludeArtifactIds&amp;gt;&lt;/span&gt;azure-functions-java-library&lt;span class="nt"&gt;&amp;lt;/excludeArtifactIds&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!--Remove obj folder generated by .NET SDK in maven clean--&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-clean-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.1.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;filesets&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;fileset&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;directory&amp;gt;&lt;/span&gt;obj&lt;span class="nt"&gt;&amp;lt;/directory&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/fileset&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/filesets&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  How to create a Zip file to deploy Azure?
&lt;/h1&gt;

&lt;p&gt;I thought that, it is not impossible, however, difficult to modify the &lt;code&gt;pom.xml&lt;/code&gt; it's self, can we modify it with command line? &lt;/p&gt;

&lt;p&gt;As I tested, we can modify &lt;code&gt;properties&lt;/code&gt; part, however, not for &lt;code&gt;azure functions maven plugin&lt;/code&gt; configuration. I'm asking how to modify it. Once I've got an answer, I'll update this blog. (8/13/2020)&lt;/p&gt;

&lt;p&gt;If we can create a Zip file to deploy to Azure, and forget about deployment using &lt;code&gt;maven&lt;/code&gt;, it might work and much easy to modify the deployment of Function App. We can use ARM template and Terraform. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/tsuyoshiushio/deploy-premium-linux-function-app-with-arm-template-2i6n"&gt;Deploy Premium Linux Function App with ARM template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/tsuyoshiushio/deploy-linux-appservice-with-arm-template-3556"&gt;Deploy Linux AppService Function App with ARM template&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I prefer the approach of &lt;a href="https://opensource.com/business/15/2/how-linux-philosophy-affects-you"&gt;Each Program Does One Thing Well&lt;/a&gt;. I remove the responsibility of deployment from &lt;code&gt;maven&lt;/code&gt;. It must work. &lt;/p&gt;

&lt;h2&gt;
  
  
  clean and package with modifying &lt;code&gt;properties&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;To modify the properties are easy. just use &lt;code&gt;-D&lt;/code&gt; flag with the property that you want to modify. It works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;fabrikam-functions
mvn clean package &lt;span class="nt"&gt;-DfunctionAppName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sample
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You will see that structure is created. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V9eiN_hq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7o3c5ie6t7dg5mx0n0t5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V9eiN_hq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7o3c5ie6t7dg5mx0n0t5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, the maven plugin doesn't have a goal that create zip file. They have deploy goal, however, we can't modify &lt;code&gt;pom&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Create a zip file only
&lt;/h2&gt;

&lt;p&gt;Just archive the red line part. &lt;code&gt;zip&lt;/code&gt; command might need to install. I'm using &lt;code&gt;WSL2&lt;/code&gt;. I needed to install the command. &lt;br&gt;
&lt;code&gt;-r&lt;/code&gt; means recursive, &lt;code&gt;-q&lt;/code&gt; means quiet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# packaging as a zip&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;target/azure-functions/sample
zip &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; sample &lt;span class="nb"&gt;.&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Deploy to the azure
&lt;/h2&gt;

&lt;p&gt;Instead of using &lt;code&gt;maven&lt;/code&gt; I use Azure CLI command instead. I deploy the zip file with &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/deployment-zip-push#cli"&gt;Zip deployment&lt;/a&gt;. It works both for Linux AppService Function App and Linux Premium!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# deploy the app to the function app&lt;/span&gt;
az functionapp deployment &lt;span class="nb"&gt;source &lt;/span&gt;config-zip &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;resourceGroup&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;baseName&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;-app&lt;/span&gt; &lt;span class="nt"&gt;--src&lt;/span&gt; sample.zip 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The official document says &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When deploying your functions to a Linux function app in a Premium plan, you should always run from the package file and publish your app using the Azure Functions Core Tools&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, it is old information. The &lt;code&gt;az&lt;/code&gt; command is already updated and ready to go!&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;By the series of the experiment, I successfully automate my workflow that is deploy function app with complex configuration and deploy sample app. Next time, I'll use &lt;a href="https://github.com/gruntwork-io/terratest"&gt;terratest&lt;/a&gt; to automate the endpoint testing. &lt;/p&gt;

&lt;p&gt;TBH, I'm not an expert of &lt;code&gt;maven&lt;/code&gt;. If you have an better way to do the same thing, could you leave your comment, please?&lt;/p&gt;

&lt;p&gt;The sample repo &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/FunctionsDeploymentTestingSuite"&gt;FunctionsDeploymentTestingSuite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/azure-maven-plugins"&gt;azure-maven-plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>java</category>
    </item>
    <item>
      <title>Deploy Linux AppService Function App with ARM template</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Thu, 13 Aug 2020 06:08:04 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/deploy-linux-appservice-with-arm-template-3556</link>
      <guid>https://dev.to/tsuyoshiushio/deploy-linux-appservice-with-arm-template-3556</guid>
      <description>&lt;p&gt;I explain how to do it for &lt;a href="https://dev.to/tsuyoshiushio/deploy-premium-linux-function-app-with-arm-template-2i6n"&gt;Linux Premium Plan&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Compared with Linux Premium, Linux AppService is much easier. I'll add some resources for the best practices for the ARM template. &lt;/p&gt;

&lt;p&gt;You can find a sample in here. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/FunctionsDeploymentTestingSuite"&gt;Azure Functions Deployment Testing suite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  serverfarms
&lt;/h1&gt;

&lt;p&gt;For the AppService Plan with Linux, &lt;code&gt;kind&lt;/code&gt; as &lt;code&gt;Linux&lt;/code&gt; and &lt;code&gt;reserved&lt;/code&gt; as &lt;code&gt;true&lt;/code&gt; is the point.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://crmchap.co.uk/resolving-the-parameter-linuxfxversion-has-an-invalid-value-error-azure-devops/"&gt;Resolving “The parameter LinuxFxVersion has an invalid value” Error&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Web/serverfarms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"apiVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2018-02-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('hostingPlanName')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('location')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Linux"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"tier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('sku')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('skuCode')]"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"reserved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Web/sites
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;kind&lt;/code&gt; as &lt;code&gt;functionapp,linux&lt;/code&gt;, &lt;code&gt;linuxFxVersion&lt;/code&gt; is the point. For more details about the &lt;code&gt;linuxFxVersion&lt;/code&gt; please refer to &lt;a href="https://dev.to/tsuyoshiushio/deploy-premium-linux-function-app-with-arm-template-2i6n"&gt;Deploy Premium Linux Function App with ARM template&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the premium and consumption plan, we DONT need WEBSITE_CONTENTAZUREFILECONNECTIONSTRING and WEBSITE_CONTENTSHARE.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"apiVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2018-11-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('name')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Web/sites"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"functionapp,linux"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('location')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dependsOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"[resourceId('microsoft.insights/components', parameters('appInsightsName'))]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('name')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"siteConfig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"linuxFxVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('linuxFxVersion')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"alwaysOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('alwaysOn')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"appSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FUNCTIONS_EXTENSION_VERSION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~3"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('functionWorkerRuntime')]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"APPINSIGHTS_INSTRUMENTATIONKEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[reference(concat('microsoft.insights/components/', parameters('appInsightsName')), '2015-05-01').InstrumentationKey]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"APPLICATIONINSIGHTS_CONNECTION_STRING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[reference(concat('microsoft.insights/components/', parameters('appInsightsName')), '2015-05-01').ConnectionString]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"serverFarmId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"clientAffinityEnabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  APPLICATIONINSIGHTS_CONNECTION_STRING
&lt;/h1&gt;

&lt;p&gt;What is that? As you can see, it is the same value. They want to move on CONNECTION_STRING that they can add other key/value info. Currently, we need to specify both.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;key&lt;/th&gt;
&lt;th&gt;value (sample)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;APPINSIGHTS_INSTRUMENTATIONKEY&lt;/td&gt;
&lt;td&gt;96cd2ffe-ef28-4809-b98a-8f1da9da4b5a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;APPLICATIONINSIGHTS_CONNECTION_STRING&lt;/td&gt;
&lt;td&gt;InstrumentationKey=96cd2ffe-ef28-4809-b98a-8f1da9da4b5a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The key is removed already. &lt;/p&gt;

&lt;h1&gt;
  
  
  ARM template resources
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Understand the structure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-syntax"&gt;Understand the structure and syntax of ARM templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't know the &lt;code&gt;functions&lt;/code&gt; section. It means, we can write custom functions with using existing build-in functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiProfile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variables"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"functions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;required&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;th&gt;sample&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$schema&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Location of the JSON schema file that describes the version of the template language. The version number you use depends on the scope of the deployment and your JSON editor.&lt;/td&gt;
&lt;td&gt;If you're using VS Code with the Azure Resource Manager tools extension, use the latest version &lt;code&gt;https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;contentVersion&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Version of the template&lt;/td&gt;
&lt;td&gt;1.0.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apiProfile&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;An API version that serves as a collection of API versions for resource types. Use this value to avoid having to specify API versions for each resource in the template. For more details refer to &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/templates-cloud-consistency#track-versions-using-api-profiles"&gt;Track versions using API profiles&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;2018–03-01-hybrid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parameters&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Values that are provided when deployment is executed to customize resource deployment.&lt;/td&gt;
&lt;td&gt;See the sample&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;variables&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Values that are used in the template. Usually modify it from parameters or default values.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-syntax#variables"&gt;Variables&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functions&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;User-defined functions that are available within the template.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-syntax#functions"&gt;functions&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;resources&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Resource types that are deployed or updated in a resource group or subscription.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-syntax#resources"&gt;resources&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;outputs&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Values that are returned after deployment. It is useful to get &lt;code&gt;ConnectionString&lt;/code&gt; for example&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-syntax#outputs"&gt;output&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to set the default value to the parameter?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;defaultValue&lt;/code&gt; works. Also you can add &lt;code&gt;description&lt;/code&gt; on the &lt;code&gt;metadata&lt;/code&gt; section. It helps users to understand the meaning.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        "linuxFxVersion": {
            "type": "string",
            "defaultValue": "Java|8",
            "metadata": {
                "description": "linuxFxVersion that specify the language runtime for linux. (Java|8) for example"
            }               
        },
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  How to generate random characters
&lt;/h2&gt;

&lt;p&gt;I want to add suffix for the storage account name. If you delete a storage account, then you want to use the same name, it won't work for a while (around 2 hours). Some resources requires random values. Terraform provide it, how about ARM template? &lt;/p&gt;

&lt;p&gt;There is. However, it looks not great. It is &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-string#uniquestring"&gt;uniquestring&lt;/a&gt; it says &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The returned value isn't a random string, but rather the result of a hash function. The returned value is 13 characters long. It isn't globally unique.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I eventually, create the random string with bash script. I frequently reference this repo. &lt;a href="https://github.com/Azure-Samples/openhack-devops-proctor"&gt;DevOps Openhack Proctor Repository&lt;/a&gt;. This repo is like a treasure box of DevOps practices.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;randomChar&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;abcdefghijklmnopqrstuvxwyz0123456789
    &lt;span class="nv"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="nv"&gt;$RANDOM&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="m"&gt;36&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;:&lt;span class="nv"&gt;$p&lt;/span&gt;:1&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

randomNum&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt; &lt;span class="nv"&gt;$RANDOM&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="k"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;randomChar&lt;span class="p"&gt;;&lt;/span&gt;randomChar&lt;span class="p"&gt;;&lt;/span&gt;randomChar&lt;span class="p"&gt;;&lt;/span&gt;randomNum&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  How to deploy the template from Azure CLI
&lt;/h1&gt;

&lt;p&gt;Create a resource group with &lt;code&gt;az group create&lt;/code&gt; then use &lt;code&gt;az deployment group create&lt;/code&gt;. I avoid the parameter files. I wanted to create resources with some base string. e.g. &lt;code&gt;tsuyoshi&lt;/code&gt; then I'd like to post fix these. &lt;code&gt;tsuyoshi012234sed&lt;/code&gt;, &lt;code&gt;tsuyoshi-app&lt;/code&gt;, &lt;code&gt;tsuyoshi-plan&lt;/code&gt; or something like that. It is enough through the parameters. Also, want to avoid the confusion when we both use parameter files and parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;az group exists &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; tsv&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Resource group with name"&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="s2"&gt;"could not be found. Creating new resource group.."&lt;/span&gt;
    &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;
    &lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"0-Provision Resource Group (az group create --name &lt;/span&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt;&lt;span class="s2"&gt; --location &lt;/span&gt;&lt;span class="nv"&gt;$location&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
        az group create &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$location&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Using existing resource group..."&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SubscriptionId : &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;subscriptionId&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Deploying Function App..."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"1-Provision FunctionApp (az group deployment create --name &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;deploymentName&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --resource-group &lt;/span&gt;&lt;span class="nv"&gt;$resourceGroupName&lt;/span&gt;&lt;span class="s2"&gt; --template-file &lt;/span&gt;&lt;span class="nv"&gt;$templateFile&lt;/span&gt;&lt;span class="s2"&gt; --parameters subscriptionId=&lt;/span&gt;&lt;span class="nv"&gt;$subscriptionId&lt;/span&gt;&lt;span class="s2"&gt; serverFarmResourceGroup=&lt;/span&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt;&lt;span class="s2"&gt; name=&lt;/span&gt;&lt;span class="nv"&gt;$functionAppName&lt;/span&gt;&lt;span class="s2"&gt; location="&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" hostingPlanName=&lt;/span&gt;&lt;span class="nv"&gt;$hostingPlanName&lt;/span&gt;&lt;span class="s2"&gt; storageAccountName=&lt;/span&gt;&lt;span class="nv"&gt;$storageAccountName&lt;/span&gt;&lt;span class="s2"&gt; appInsightsName=&lt;/span&gt;&lt;span class="nv"&gt;$appInsightsName&lt;/span&gt;&lt;span class="s2"&gt; linuxFxVersion=&lt;/span&gt;&lt;span class="nv"&gt;$linuxFxVersion&lt;/span&gt;&lt;span class="s2"&gt;  functionWorkerRuntime=&lt;/span&gt;&lt;span class="nv"&gt;$functionWorkerRuntime&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
az deployment group create &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;deploymentName&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--template-file&lt;/span&gt; &lt;span class="nv"&gt;$templateFile&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="nv"&gt;subscriptionId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$subscriptionId&lt;/span&gt; &lt;span class="nv"&gt;serverFarmResourceGroup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$resourceGroup&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$functionAppName&lt;/span&gt; &lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;location&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;hostingPlanName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$hostingPlanName&lt;/span&gt; &lt;span class="nv"&gt;storageAccountName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$storageAccountName&lt;/span&gt; &lt;span class="nv"&gt;appInsightsName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$appInsightsName&lt;/span&gt; &lt;span class="nv"&gt;linuxFxVersion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$linuxFxVersion&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;functionWorkerRuntime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$functionWorkerRuntime&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-cli"&gt;Deploy resources with ARM templates and Azure CLI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions"&gt;template functions&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-best-practices"&gt;ARM template best practices&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Deploy Premium Linux  Function App with ARM template</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Thu, 13 Aug 2020 04:34:07 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/deploy-premium-linux-function-app-with-arm-template-2i6n</link>
      <guid>https://dev.to/tsuyoshiushio/deploy-premium-linux-function-app-with-arm-template-2i6n</guid>
      <description>&lt;p&gt;I wanted to automate the deployment of the Premium Linux and AppService plan for Java application. I'd like to share what I learned. This repo is the repo I leave the samples.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/FunctionsDeploymentTestingSuite"&gt;Azure Functions Deployment Testing suite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Premimu Linux
&lt;/h1&gt;

&lt;p&gt;There is an official document however, I can't find Premium Linux configuration. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-infrastructure-as-code#premium"&gt;Deploy on Premium plan&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-premium-plan#:~:text=The%20Azure%20Functions%20Premium%20plan%20%28sometimes%20referred%20to,size%2C%20base%20plan%20size%2C%20and%20maximum%20plan%20size."&gt;Azure Functions Premium plan&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Serverfarms
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;targetWorkerCount&lt;/code&gt; and &lt;code&gt;targetWorkerSizeId&lt;/code&gt; are something we can't find on the official documentation. That is &lt;code&gt;int&lt;/code&gt; properties. Important point is, &lt;code&gt;kind&lt;/code&gt; as &lt;code&gt;elastic&lt;/code&gt; and &lt;code&gt;reserved&lt;/code&gt; as &lt;code&gt;true&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"apiVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2018-02-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('hostingPlanName')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Web/serverfarms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('location')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"elastic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dependsOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"targetWorkerCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('targetWorkerCount')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"targetWorkerSizeId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('targetWorkerSizeId')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"reserved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"maximumElasticWorkerCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('maximumElasticWorkerCount')]"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"tier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('sku')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('skuCode')]"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We have a several resouces, however, the reference looks the latest. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/templates/microsoft.web/2020-06-01/serverfarms"&gt;Microsoft.Web serverfarms template reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  targetWorkerSizeId
&lt;/h2&gt;

&lt;p&gt;Probably, these meaning.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Small = 0,
Medium = 1,
Large = 2,
D1 = 3,
D2 = 4,
D3 = 5,
SmallV3 = 6,
MediumV3 = 7,
LargeV3 = 8,
NestedSmall = 9,
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Web/sites
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;kind&lt;/code&gt; as &lt;code&gt;functionapp,linux&lt;/code&gt;. For specifying languages, I set &lt;code&gt;FUNCTIONS_WORKER_RUNTIME&lt;/code&gt; as &lt;code&gt;java&lt;/code&gt;, &lt;code&gt;linuxFxVersion&lt;/code&gt; as &lt;code&gt;Java|8&lt;/code&gt;. The &lt;code&gt;linuxFxVersion&lt;/code&gt; requires only on linux. It represents docker images that you found &lt;a href="https://github.com/Azure/azure-functions-docker"&gt;azure functions docker&lt;/a&gt;. You can find some possible value in &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-infrastructure-as-code#create-a-function-app-2"&gt;here&lt;/a&gt;. It can be specify the generic one like &lt;code&gt;Java|8&lt;/code&gt; but also you can specify specific docker image version like &lt;code&gt;DOCKER|mcr.microsoft.com/azure-functions/python:2.0.13351-python3.6-appservice&lt;/code&gt;. You can find it on &lt;a href="https://github.com/Azure/azure-functions-docker"&gt;azure functions docker&lt;/a&gt; repo.&lt;/p&gt;

&lt;p&gt;For the premium and consumption plan, we need &lt;code&gt;WEBSITE_CONTENTAZUREFILECONNECTIONSTRING&lt;/code&gt; and &lt;code&gt;WEBSITE_CONTENTSHARE&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"apiVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2018-11-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('name')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Web/sites"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"functionapp,linux"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('location')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dependsOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"[resourceId('microsoft.insights/components', parameters('appInsightsName'))]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('name')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"siteConfig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"appSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FUNCTIONS_EXTENSION_VERSION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~3"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('functionWorkerRuntime')]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"APPINSIGHTS_INSTRUMENTATIONKEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[reference(concat('microsoft.insights/components/', parameters('appInsightsName')), '2015-05-01').InstrumentationKey]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"APPLICATIONINSIGHTS_CONNECTION_STRING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[reference(concat('microsoft.insights/components/', parameters('appInsightsName')), '2015-05-01').ConnectionString]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WEBSITE_CONTENTAZUREFILECONNECTIONSTRING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WEBSITE_CONTENTSHARE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[concat(toLower(parameters('name')), '94ed')]"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="nl"&gt;"linuxFxVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('linuxFxVersion')]"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"serverFarmId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"clientAffinityEnabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/templates/microsoft.web/2020-06-01/sites/config"&gt;Microsoft.Web sites/config template reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/rest/api/appservice/webapps/createorupdate#siteconfig"&gt;Web Apps - Create Or Update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the question is &lt;a href="https://stackoverflow.com/questions/60691568/why-do-i-need-both-appinsights-instrumentationkey-and-applicationinsights-connec"&gt;Why do I need both APPINSIGHTS_INSTRUMENTATIONKEY and APPLICATIONINSIGHTS_CONNECTION_STRING in my Azure Function configuration?&lt;/a&gt;. You can find the answer on the link.&lt;/p&gt;

&lt;h1&gt;
  
  
  What did I google it?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Deployed not supported region
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Code": "BadRequest",
    "Message": "Requested features are not supported in region. Please try another region.",
    "Target": null,
    "Details": [
        {
            "Message": "Requested features are not supported in region. Please try another region."
        },
        {
            "Code": "BadRequest"
        },
        {
            "ErrorEntity": {
                "ExtendedCode": "59911",
                "MessageTemplate": "Requested features are not supported in region. Please try another region.",
                "Parameters": [],
                "Code": "BadRequest",
                "Message": "Requested features are not supported in region. Please try another region."
            }
        }
    ],
    "Innererror": null
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;These command shows you the location that available to you for each resources.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;az provider show &lt;span class="nt"&gt;--namespace&lt;/span&gt; Microsoft.Web | jq &lt;span class="s2"&gt;".resourceTypes[] | select(.resourceType == &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;serverFarms&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) | .locations"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/global-infrastructure/services/?products=functions"&gt;Products available by region&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Azure/azure-cli/issues/1520"&gt;az account list-location&lt;/a&gt; find locations that you can use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The serverFarm property has an incorrect value for App Service Plan
&lt;/h2&gt;

&lt;p&gt;The error message was very confusing. However, it was an issue of this part. It was not the &lt;code&gt;serverfarms&lt;/code&gt; resource. I forget to add value to &lt;code&gt;serverFarmResourceGroup&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"serverFarmId": "[concat('/subscriptions/', parameters('subscriptionId'),'/resourcegroups/', parameters('serverFarmResourceGroup'), '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The way I identify issue is portal. Even if I deploy from my local machine, if you go to portal and see the deployment history, then you can find which resources causes an issue. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zaQJ8vEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/im5ntvadnveznw8bu1kf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zaQJ8vEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/im5ntvadnveznw8bu1kf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deployment failed. Correlation ID: 95b838bf-3c0d-45f0-9457-0b10c916109f. {
  "Code": "BadRequest",
  "Message": "The serverFarm property has an incorrect value for App Service Plan. Valid values are a plan name as string or of format  subscriptions/subscriptionId/resourceGroups/resourceGroupName/providers/Microsoft.web/serverfarms/planName where the subscription is the same as the site's subscription.",
  "Target": null,
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  serverframs can not found
&lt;/h1&gt;

&lt;p&gt;I encounter the issue. The reason was, the template that I've got from &lt;code&gt;donwload automated script&lt;/code&gt; was wrong. It has a section like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            "dependsOn": [
                "microsoft.insights/components/tsushijava8trace",
                "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]"
            ],
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dependsOn&lt;/code&gt; section requires &lt;code&gt;resourceId&lt;/code&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            "dependsOn": [
                "[resourceId('microsoft.insights/components', parameters('appInsightsName'))]",
                "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
                "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
            ],
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Lessons Learned
&lt;/h1&gt;

&lt;p&gt;This time, I have no sample, so I can't identify how we can deploy Premium Functions. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy Premium Linux functions from portal and download automated script&lt;/li&gt;
&lt;li&gt;Deploy Premium Linux functions from portal and see &lt;code&gt;Export template&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Offical Doc &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-infrastructure-as-code"&gt;Automate resource deployment for your function app in Azure Functions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;References &lt;a href="https://docs.microsoft.com/en-us/azure/templates/microsoft.web/2020-06-01/serverfarms"&gt;Microsoft.Web serverfarms template reference&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/en-us/azure/templates/microsoft.web/2020-06-01/sites/config"&gt;Microsoft.Web sites/config template reference&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When I look back, the best way might be... &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learn the basic with the official document. &lt;/li&gt;
&lt;li&gt;Deploy Premimu Linux functions from portal and see &lt;code&gt;Export template&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Understand the meaning of the parameters with Reference&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;code&gt;download automated script&lt;/code&gt; is something I used to use frequently, however, this time, the template does not work. Understand the proper format and check with the &lt;code&gt;Export template&lt;/code&gt; is the &lt;code&gt;truth&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;I hope this helps.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>devops</category>
    </item>
    <item>
      <title>Find Expired Service Principal</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Tue, 11 Aug 2020 00:49:53 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/find-expired-service-principal-31hi</link>
      <guid>https://dev.to/tsuyoshiushio/find-expired-service-principal-31hi</guid>
      <description>&lt;p&gt;My tenant seems to have a quota limit of the Service Principal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;az ad sp create-for-rbac
The directory object quota limit &lt;span class="k"&gt;for &lt;/span&gt;the Principal has been exceeded. Please ask your administrator to increase the quota limit or delete objects to reduce the used quota.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Since I'm a DevOps guy, I frequently create a service principal. I'd like to find expired service principals on my tenant.&lt;/p&gt;

&lt;p&gt;I struggled for a while with &lt;a href="https://docs.microsoft.com/en-us/azure/search/search-query-odata-filter"&gt;OData&lt;/a&gt; and &lt;a href="https://jmespath.org/examples.html"&gt;JMESPath&lt;/a&gt; that is supported with &lt;code&gt;az&lt;/code&gt; command. I eventually use &lt;code&gt;jq&lt;/code&gt; instead. &lt;/p&gt;

&lt;h1&gt;
  
  
  Get the current date with the Azure CLI format.
&lt;/h1&gt;

&lt;p&gt;We can use &lt;code&gt;%N&lt;/code&gt; for nanosecond, however, it doesn't match the style of the Azure CLI output. I eventually use this command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;CURRENT_TIME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +&lt;span class="s1"&gt;'%Y-%m-%dT%H:%M:%S.024000+00:00'&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Get Expired Service Principal
&lt;/h1&gt;

&lt;p&gt;The query is only list the service principal that you create with password credentials.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;az ad sp list &lt;span class="nt"&gt;--show-mine&lt;/span&gt; | jq &lt;span class="s2"&gt;".[] | select(.passwordCredentials[].endDate &amp;lt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_TIME&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) | { objectId : .objectId, appId: .appId, passwordCredentials : .passwordCredentials, displayName: .displayName, tenantId : .appOwnerTenantId }"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;az ad sp list --show-mine&lt;/code&gt; will show the service principals that you created. &lt;code&gt;select&lt;/code&gt; will filter the json. The json start with array that has no name. so start with &lt;code&gt;.[]&lt;/code&gt;. &lt;code&gt;.[]&lt;/code&gt; returns each element of the array. After filter the result, it project some values. &lt;/p&gt;

&lt;h2&gt;
  
  
  The original structure of the &lt;code&gt;az ad sp list --show-time&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[{
  "appId": "YOUR_APP_ID_HERE",
  "appOwnerTenantId": "YOUR_TENANT_ID_HERE",
  "displayName": "procohapp10",
  "objectId": "YOUR_OBJECT_ID_HERE",
  "passwordCredentials": [
    {
      "additionalProperties": null,
      "customKeyIdentifier": null,
      "endDate": "2019-05-02T20:32:27.908964+00:00",
      "keyId": "YOUR_KEY_ID",
      "startDate": "2018-05-02T20:32:27.908964+00:00",
      "value": null
    }
  ],
             :
},
  :
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "objectId": "YOUR_OBJECT_ID",
  "appId": "YOUR_APP_ID",
  "passwordCredentials": [
    {
      "additionalProperties": null,
      "customKeyIdentifier": null,
      "endDate": "2019-05-02T20:32:27.908964+00:00",
      "keyId": "YOUR_KEY_ID",
      "startDate": "2018-05-02T20:32:27.908964+00:00",
      "value": null
    }
  ],
  "displayName": "procohapp10",
  "tenantId": "YOUR_TENANT_ID"
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Remove the expired service principal
&lt;/h1&gt;

&lt;p&gt;Please double check if your script works before execute the second last line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;az ad sp list &lt;span class="nt"&gt;--show-mine&lt;/span&gt; | jq &lt;span class="s2"&gt;".[] | select(.passwordCredentials[].endDate &amp;lt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_TIME&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) | .objectId"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; sp_list.txt
&lt;span class="nv"&gt;$ lines&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;sp_list.txt&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;item &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$lines&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$item&lt;/span&gt; | xargs az ad sp delete &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;rm &lt;/span&gt;sp_list.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Confirm removed
&lt;/h2&gt;

&lt;p&gt;It returns zero result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;az ad sp list &lt;span class="nt"&gt;--show-mine&lt;/span&gt; | jq &lt;span class="s2"&gt;".[] | select(.passwordCredentials[].endDate &amp;lt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_TIME&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) | .objectId"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Resource
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stedolan.github.io/jq/tutorial/"&gt;jq tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/buntafujikawa/items/a769ebabbdd324ff0d6f"&gt;Filter json with jq command (Japanese)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest#get-an-existing-service-principal"&gt;Get an existing service principal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/xargs_linux/"&gt;How to Use xargs on Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>azurecli</category>
    </item>
    <item>
      <title>Azure Storage Queue SDK for Go Samples for Enqueue/Dequeue and Count</title>
      <dc:creator>Tsuyoshi Ushio</dc:creator>
      <pubDate>Sat, 25 Jul 2020 05:22:09 +0000</pubDate>
      <link>https://dev.to/tsuyoshiushio/azure-storage-queue-sdk-for-go-samples-for-enqueue-dequeue-and-count-36nh</link>
      <guid>https://dev.to/tsuyoshiushio/azure-storage-queue-sdk-for-go-samples-for-enqueue-dequeue-and-count-36nh</guid>
      <description>&lt;p&gt;I searched a working sample of the Azure Storage Queue with &lt;a href="https://github.com/Azure/azure-storage-queue-go"&gt;Azure Storage Queue SDK for Go&lt;/a&gt; to save my time. However, I couldn't. Only we can find on the GitHub repo is &lt;a href="https://godoc.org/github.com/Azure/azure-storage-queue-go/azqueue#pkg-examples"&gt;documentation&lt;/a&gt;. So I create a sample for sending/receiving queue. You can refer the sample repository below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/TsuyoshiUshio/AzureStorageQueueSDKForGoSample"&gt;Sample Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Get the count of the messages
&lt;/h1&gt;

&lt;p&gt;The behavior is probably that you expected. However, I noticed that one thing. If you want to get a count of the queue, we can use &lt;code&gt;props.ApproximateMessagesCount()&lt;/code&gt; function on the &lt;code&gt;QueueGetPropertiesResponse&lt;/code&gt;. As it is represent the name, the count is &lt;code&gt;Approximate&lt;/code&gt; number.  If you run the example, you will see this output on the &lt;code&gt;receive.go&lt;/code&gt;. The log that shows &lt;code&gt;Approximate...&lt;/code&gt; is the one that I use the method. For the &lt;code&gt;Visible count of message&lt;/code&gt;, it is fetched by a function that I'll explain later. This receive sample Dequeue a message. Before the dequeue, the number of the message is 6. However, after the dequeue, &lt;code&gt;Approximate&lt;/code&gt; one is still 6. I should be 5. When you delete the message, the value is the same. It looks the &lt;code&gt;ApproximateMessagesCount()&lt;/code&gt; looks &lt;strong&gt;ignore the visibility&lt;/strong&gt; of the message.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;receive&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1: Approximate number of messages in the queue=7
2: Visible count of messages in the queue=7
3: Dequeue [25009-77-70 254:00:00 +0000 UTC] : Message: Hello!
4: Approximate number of messages in the queue=7
5: Visible count of messages in the queue=6
6: Delete message bc3ae6cc-3222-40c5-b922-f0a2b4266532
7: Approximate number of messages in the queue=6
8: Visible count of messages in the queue=6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;According to the official REST API documentation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The approximate number of messages in the queue. This number is not lower than the actual number of messages in the queue, but could be higher.&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/rest/api/storageservices/get-queue-metadata#response-headers"&gt;Response Headers&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to get the visible queue count?
&lt;/h2&gt;

&lt;p&gt;Just Peek the queue then, count the number. This method is accurate, however, one downside is, maximum &lt;code&gt;maxCount&lt;/code&gt; is 32. &lt;a href="https://docs.microsoft.com/en-us/rest/api/storageservices/peek-messages#uri-parameters"&gt;numofmessages&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;getVisibleCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messagesURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;azqueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MessagesURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxCount&lt;/span&gt; &lt;span class="kt"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;messagesURL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Peek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxCount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NumMessages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I'm writing a scaler logic by these values. I'll combine two method to scale my app. &lt;/p&gt;

&lt;p&gt;FYI, for the send message, I sent 100 messages. In this case, Visible count of message is 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1: Approximate number of messages in the queue=100
2: Visible count of messages in the queue=1
3: Enqueue Hello 99: ec979756-bbc2-42d0-a791-0a29bfb00d2b 
4: Approximate number of messages in the queue=101
5: Visible count of messages in the queue=1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For the Enqueue method, it has two parameters. The function signature is &lt;code&gt;func (m MessagesURL) Enqueue(ctx context.Context, messageText string, visibilityTimeout time.Duration, timeToLive time.Duration) (*EnqueueMessageResponse, error) {&lt;br&gt;
    vt := int32(visibilityTimeout.Seconds())&lt;/code&gt; I set the visibilityTimeout as &lt;code&gt;30*times.Second&lt;/code&gt; That is why it takes 30 sec for able to see the message. &lt;code&gt;timeToLive&lt;/code&gt; 0 means 7 days.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;messageURL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you want to visible immediately, let's make it &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;messageURL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then it works as you expected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1: Approximate number of messages in the queue=30
2: Visible count of messages in the queue=30
3: Enqueue Hello 30: 75909a2a-9d12-41c7-bb23-675c32dd8c88 
4: Approximate number of messages in the queue=31
5: Visible count of messages in the queue=31
1: Approximate number of messages in the queue=31
2: Visible count of messages in the queue=31
3: Enqueue Hello 31: 8898a793-d8d0-47d4-afaf-266fcacc3778 
4: Approximate number of messages in the queue=32
5: Visible count of messages in the queue=32
1: Approximate number of messages in the queue=32
2: Visible count of messages in the queue=32
3: Enqueue Hello 32: 7989faaf-3905-402d-9d3c-0caeebbdb705 
4: Approximate number of messages in the queue=33
5: Visible count of messages in the queue=32
1: Approximate number of messages in the queue=33
2: Visible count of messages in the queue=32
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>azure</category>
      <category>go</category>
    </item>
  </channel>
</rss>
