Creazione di risorse Application Insights con PowerShellCreate Application Insights resources using PowerShell

L'articolo descrive come automatizzare la creazione e l'aggiornamento di risorse di Application Insights usando Azure Resource Manager.This article shows you how to automate the creation and update of Application Insights resources automatically by using Azure Resource Management. Questo procedimento potrebbe, ad esempio, essere utilizzato come parte di un processo di compilazione.You might, for example, do so as part of a build process. Insieme alla risorsa di base di Application Insights, è possibile creare test Web di disponibilità, configurare avvisi, impostare lo schema dei prezzi e creare altre risorse di Azure.Along with the basic Application Insights resource, you can create availability web tests, set up alerts, set the pricing scheme, and create other Azure resources.

La chiave per la creazione di queste risorse è rappresentata dai modelli JSON per Gestione risorse di Azure.The key to creating these resources is JSON templates for Azure Resource Manager. In breve, la procedura consiste in: scaricare le definizioni JSON delle risorse esistenti; impostare i parametri per determinati valori, come ad esempio nomi; ed eseguire il modello ogni volta che si desidera creare una nuova risorsa.In a nutshell, the procedure is: download the JSON definitions of existing resources; parameterize certain values such as names; and then run the template whenever you want to create a new resource. È possibile raggruppare diverse risorse per crearle tutte in un’unica volta - ad esempio, un monitoraggio app con test di disponibilità, avvisi e risorsa di archiviazione per l'esportazione continua.You can package several resources together, to create them all in one go - for example, an app monitor with availability tests, alerts, and storage for continuous export. Esistono alcune sottigliezze di alcuni parametri, che verranno illustrate di seguito.There are some subtleties to some of the parameterizations, which we'll explain here.

Installazione singolaOne-time setup

Se non si è utilizzato prima PowerShell con la sottoscrizione di Azure:If you haven't used PowerShell with your Azure subscription before:

Installare il modulo Azure Powershell nel computer in cui si desidera eseguire gli script:Install the Azure Powershell module on the machine where you want to run the scripts:

  1. Installare Installazione guidata piattaforma Web Microsoft (v5 o versione successiva).Install Microsoft Web Platform Installer (v5 or higher).
  2. Usarla per installare Microsoft Azure Powershell.Use it to install Microsoft Azure Powershell.

Creare un modello di Azure Resource ManagerCreate an Azure Resource Manager template

Creare un nuovo file con estensione .json - definirlo template1.json in questo esempio.Create a new .json file - let's call it template1.json in this example. Copiare questo contenuto al suo interno:Copy this content into it:

    {
        "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "appName": {
                "type": "string",
                "metadata": {
                    "description": "Enter the application name."
                }
            },
            "appType": {
                "type": "string",
                "defaultValue": "web",
                "allowedValues": [
                    "web",
                    "java",
                    "HockeyAppBridge",
                    "other"
                ],
                "metadata": {
                    "description": "Enter the application type."
                }
            },
            "appLocation": {
                "type": "string",
                "defaultValue": "East US",
                "allowedValues": [
                    "South Central US",
                    "West Europe",
                    "East US",
                    "North Europe"
                ],
                "metadata": {
                    "description": "Enter the application location."
                }
            },
            "priceCode": {
                "type": "int",
                "defaultValue": 1,
                "allowedValues": [
                    1,
                    2
                ],
                "metadata": {
                    "description": "1 = Basic, 2 = Enterprise"
                }
            },
            "dailyQuota": {
                "type": "int",
                "defaultValue": 100,
                "minValue": 1,
                "metadata": {
                    "description": "Enter daily quota in GB."
                }
            },
            "dailyQuotaResetTime": {
                "type": "int",
                "defaultValue": 24,
                "metadata": {
                    "description": "Enter daily quota reset hour in UTC (0 to 23). Values outside the range will get a random reset hour."
                }
            },
            "warningThreshold": {
                "type": "int",
                "defaultValue": 90,
                "minValue": 1,
                "maxValue": 100,
                "metadata": {
                    "description": "Enter the % value of daily quota after which warning mail to be sent. "
                }
            }
        },
        "variables": {
            "priceArray": [
                "Basic",
                "Application Insights Enterprise"
            ],
            "pricePlan": "[take(variables('priceArray'),parameters('priceCode'))]",
            "billingplan": "[concat(parameters('appName'),'/', variables('pricePlan')[0])]"
        },
        "resources": [
            {
                "type": "microsoft.insights/components",
                "kind": "[parameters('appType')]",
                "name": "[parameters('appName')]",
                "apiVersion": "2014-04-01",
                "location": "[parameters('appLocation')]",
                "tags": {},
                "properties": {
                    "ApplicationId": "[parameters('appName')]"
                },
                "dependsOn": []
            },
            {
                "name": "[variables('billingplan')]",
                "type": "microsoft.insights/components/CurrentBillingFeatures",
                "location": "[parameters('appLocation')]",
                "apiVersion": "2015-05-01",
                "dependsOn": [
                    "[resourceId('microsoft.insights/components', parameters('appName'))]"
                ],
                "properties": {
                    "CurrentBillingFeatures": "[variables('pricePlan')]",
                    "DataVolumeCap": {
                        "Cap": "[parameters('dailyQuota')]",
                        "WarningThreshold": "[parameters('warningThreshold')]",
                        "ResetTime": "[parameters('dailyQuotaResetTime')]"
                    }
                }
            }
        ]
    }

Creare risorse di Application InsightsCreate Application Insights resources

  1. In PowerShell accedere ad Azure:In PowerShell, sign in to Azure:

    Login-AzureRmAccount

  2. Eseguire un comando simile al seguente:Run a command like this:

    
        New-AzureRmResourceGroupDeployment -ResourceGroupName Fabrikam `
               -TemplateFile .\template1.json `
               -appName myNewApp
    
    • -ResourceGroupName è il gruppo in cui si vogliono creare le nuove risorse.-ResourceGroupName is the group where you want to create the new resources.
    • -TemplateFile deve precedere i parametri personalizzati.-TemplateFile must occur before the custom parameters.
    • -appName è il nome della risorsa da creare.-appName The name of the resource to create.

È possibile aggiungere altri parametri le cui descrizioni sono disponibili nella sezione del modello dedicata ai parametri.You can add other parameters - you'll find their descriptions in the parameters section of the template.

Per impostare la chiave di strumentazioneTo get the instrumentation key

Dopo la creazione di una risorsa applicazione, è necessaria la chiave di strumentazione:After creating an application resource, you'll want the instrumentation key:

    $resource = Find-AzureRmResource -ResourceNameEquals "<YOUR APP NAME>" -ResourceType "Microsoft.Insights/components"
    $details = Get-AzureRmResource -ResourceId $resource.ResourceId
    $ikey = $details.Properties.InstrumentationKey

Impostare il piano tariffarioSet the price plan

È possibile impostare il piano tariffario.You can set the price plan.

Per creare una risorsa app con il piano tariffario Enterprise, usando il modello precedente:To create an app resource with the Enterprise price plan, using the template above:

        New-AzureRmResourceGroupDeployment -ResourceGroupName Fabrikam `
               -TemplateFile .\template1.json `
               -priceCode 2 `
               -appName myNewApp
priceCodepriceCode pianoplan
11 BasicBasic
22 EnterpriseEnterprise
  • Se si intende usare solo il piano tariffario Basic predefinito, è possibile omettere la risorsa CurrentBillingFeatures dal modello.If you only want to use the default Basic price plan, you can omit the CurrentBillingFeatures resource from the template.
  • Se si vuole modificare il piano tariffario dopo la creazione della risorsa dei componenti, è possibile usare un modello non contenente la risorsa "microsoft.insights/components".If you want to change the price plan after the component resource has been created, you can use a template that omits the "microsoft.insights/components" resource. Omettere anche il nodo dependsOn nella risorsa della fatturazione.Also, omit the dependsOn node from the billing resource.

Per verificare il piano tariffario aggiornato, esaminare il pannello "Funzionalità + prezzi" nel browser.To verify the updated price plan, look at the "Features+pricing" blade in the browser. Aggiornare la visualizzazione nel browser per assicurarsi che venga visualizzato lo stato più recente.Refresh the browser view to make sure you see the latest state.

Aggiungere un avviso per la metricaAdd a metric alert

Per configurare un avviso per la metrica contemporaneamente alla risorsa app, unire il codice seguente nel file modello:To set up a metric alert at the same time as your app resource, merge code like this into the template file:

{
    parameters: { ... // existing parameters ...
            "responseTime": {
              "type": "int",
              "defaultValue": 3,
              "minValue": 1,
              "metadata": {
                "description": "Enter response time threshold in seconds."
              }
    },
    variables: { ... // existing variables ...
      // Alert names must be unique within resource group.
      "responseAlertName": "[concat('ResponseTime-', toLower(parameters('appName')))]"
    }, 
    resources: { ... // existing resources ...
     {
      //
      // Metric alert on response time
      //
      "name": "[variables('responseAlertName')]",
      "type": "Microsoft.Insights/alertrules",
      "apiVersion": "2014-04-01",
      "location": "[parameters('appLocation')]",
      // Ensure this resource is created after the app resource:
      "dependsOn": [
        "[resourceId('Microsoft.Insights/components', parameters('appName'))]"
      ],
      "tags": {
        "[concat('hidden-link:', resourceId('Microsoft.Insights/components', parameters('appName')))]": "Resource"
      },
      "properties": {
        "name": "[variables('responseAlertName')]",
        "description": "response time alert",
        "isEnabled": true,
        "condition": {
          "$type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.ThresholdRuleCondition, Microsoft.WindowsAzure.Management.Mon.Client",
          "odata.type": "Microsoft.Azure.Management.Insights.Models.ThresholdRuleCondition",
          "dataSource": {
            "$type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.RuleMetricDataSource, Microsoft.WindowsAzure.Management.Mon.Client",
            "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
            "resourceUri": "[resourceId('microsoft.insights/components', parameters('appName'))]",
            "metricName": "request.duration"
          },
          "threshold": "[parameters('responseTime')]", //seconds
          "windowSize": "PT15M" // Take action if changed state for 15 minutes
        },
        "actions": [
          {
            "$type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.RuleEmailAction, Microsoft.WindowsAzure.Management.Mon.Client",
            "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
            "sendToServiceOwners": true,
            "customEmails": []
          }
        ]
      }
    }
}

Quando si richiama il modello, se si vuole, è possibile aggiungere questo parametro:When you invoke the template, you can optionally add this parameter:

`-responseTime 2`

È possibile impostare parametri anche per altri campi.You can of course parameterize other fields.

Per trovare i nomi dei tipi e i dettagli di configurazione di altre regole di avviso, creare una regola manualmente e quindi esaminarla in Azure Resource Manager.To find out the type names and configuration details of other alert rules, create a rule manually and then inspect it in Azure Resource Manager.

Aggiungere un test di disponibilitàAdd an availability test

Questo esempio è relativo a un test di ping (per testare una singola pagina).This example is for a ping test (to test a single page).

Sono due le parti di un test di disponibilità: il test stesso e l'avviso che notifica gli errori.There are two parts in an availability test: the test itself, and the alert that notifies you of failures.

Unire il codice seguente nel file modello che crea l'app.Merge the following code into the template file that creates the app.

{
    parameters: { ... // existing parameters here ...
      "pingURL": { "type": "string" },
      "pingText": { "type": "string" , defaultValue: ""}
    },
    variables: { ... // existing variables here ...
      "pingTestName":"[concat('PingTest-', toLower(parameters('appName')))]",
      "pingAlertRuleName": "[concat('PingAlert-', toLower(parameters('appName')), '-', subscription().subscriptionId)]"
    },
    resources: { ... // existing resources here ...
    { //
      // Availability test: part 1 configures the test
      //
      "name": "[variables('pingTestName')]",
      "type": "Microsoft.Insights/webtests",
      "apiVersion": "2014-04-01",
      "location": "[parameters('appLocation')]",
      // Ensure this is created after the app resource:
      "dependsOn": [
        "[resourceId('Microsoft.Insights/components', parameters('appName'))]"
      ],
      "tags": {
        "[concat('hidden-link:', resourceId('Microsoft.Insights/components', parameters('appName')))]": "Resource"
      },
      "properties": {
        "Name": "[variables('pingTestName')]",
        "Description": "Basic ping test",
        "Enabled": true,
        "Frequency": 900, // 15 minutes
        "Timeout": 120, // 2 minutes
        "Kind": "ping", // single URL test
        "RetryEnabled": true,
        "Locations": [
          {
            "Id": "us-va-ash-azr"
          },
          {
            "Id": "emea-nl-ams-azr"
          },
          {
            "Id": "apac-jp-kaw-edge"
          }
        ],
        "Configuration": {
          "WebTest": "[concat('<WebTest   Name=\"', variables('pingTestName'), '\"   Enabled=\"True\"         CssProjectStructure=\"\"    CssIteration=\"\"  Timeout=\"120\"  WorkItemIds=\"\"         xmlns=\"http://microsoft.com/schemas/VisualStudio/TeamTest/2010\"         Description=\"\"  CredentialUserName=\"\"  CredentialPassword=\"\"         PreAuthenticate=\"True\"  Proxy=\"default\"  StopOnError=\"False\"         RecordedResultFile=\"\"  ResultsLocale=\"\">  <Items>  <Request Method=\"GET\"    Version=\"1.1\"  Url=\"', parameters('Url'),   '\" ThinkTime=\"0\"  Timeout=\"300\" ParseDependentRequests=\"True\"         FollowRedirects=\"True\" RecordResult=\"True\" Cache=\"False\"         ResponseTimeGoal=\"0\"  Encoding=\"utf-8\"  ExpectedHttpStatusCode=\"200\"         ExpectedResponseUrl=\"\" ReportingName=\"\" IgnoreHttpStatusCode=\"False\" />        </Items>  <ValidationRules> <ValidationRule  Classname=\"Microsoft.VisualStudio.TestTools.WebTesting.Rules.ValidationRuleFindText, Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" DisplayName=\"Find Text\"         Description=\"Verifies the existence of the specified text in the response.\"         Level=\"High\"  ExectuionOrder=\"BeforeDependents\">  <RuleParameters>        <RuleParameter Name=\"FindText\" Value=\"',   parameters('pingText'), '\" />  <RuleParameter Name=\"IgnoreCase\" Value=\"False\" />  <RuleParameter Name=\"UseRegularExpression\" Value=\"False\" />  <RuleParameter Name=\"PassIfTextFound\" Value=\"True\" />  </RuleParameters> </ValidationRule>  </ValidationRules>  </WebTest>')]"
        },
        "SyntheticMonitorId": "[variables('pingTestName')]"
      }
    },

    {
      //
      // Availability test: part 2, the alert rule
      //
      "name": "[variables('pingAlertRuleName')]",
      "type": "Microsoft.Insights/alertrules",
      "apiVersion": "2014-04-01",
      "location": "[parameters('appLocation')]", 
      "dependsOn": [
        "[resourceId('Microsoft.Insights/webtests', variables('pingTestName'))]"
      ],
      "tags": {
        "[concat('hidden-link:', resourceId('Microsoft.Insights/components', parameters('appName')))]": "Resource",
        "[concat('hidden-link:', resourceId('Microsoft.Insights/webtests', variables('pingTestName')))]": "Resource"
      },
      "properties": {
        "name": "[variables('pingAlertRuleName')]",
        "description": "alert for web test",
        "isEnabled": true,
        "condition": {
          "$type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.LocationThresholdRuleCondition, Microsoft.WindowsAzure.Management.Mon.Client",
          "odata.type": "Microsoft.Azure.Management.Insights.Models.LocationThresholdRuleCondition",
          "dataSource": {
            "$type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.RuleMetricDataSource, Microsoft.WindowsAzure.Management.Mon.Client",
            "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleMetricDataSource",
            "resourceUri": "[resourceId('microsoft.insights/webtests', variables('pingTestName'))]",
            "metricName": "GSMT_AvRaW"
          },
          "windowSize": "PT15M", // Take action if changed state for 15 minutes
          "failedLocationCount": 2
        },
        "actions": [
          {
            "$type": "Microsoft.WindowsAzure.Management.Monitoring.Alerts.Models.RuleEmailAction, Microsoft.WindowsAzure.Management.Mon.Client",
            "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
            "sendToServiceOwners": true,
            "customEmails": []
          }
        ]
      }
    }
}

Per trovare i codici per altre posizioni di test o per automatizzare la creazione di test Web più complessi, creare un esempio manualmente e quindi impostare i parametri per il codice da Azure Resource Manager.To discover the codes for other test locations, or to automate the creation of more complex web tests, create an example manually and then parameterize the code from Azure Resource Manager.

Aggiungere altre risorseAdd more resources

Per automatizzare la creazione di altre risorse di qualsiasi tipo, creare un esempio manualmente e quindi copiare il codice e impostarne i parametri da Azure Resource Manager.To automate the creation of any other resource of any kind, create an example manually, and then copy and parameterize its code from Azure Resource Manager.

  1. Aprire Gestione risorse di Azure.Open Azure Resource Manager. Scorrere verso il basso subscriptions/resourceGroups/<your resource group>/providers/Microsoft.Insights/components fino alla risorsa dell'applicazione.Navigate down through subscriptions/resourceGroups/<your resource group>/providers/Microsoft.Insights/components, to your application resource.

    Navigare in Esplora risorse di Azure

    Componenti sono le risorse base di Application Insights per la visualizzazione di applicazioni.Components are the basic Application Insights resources for displaying applications. Sono disponibili risorse separate per le regole di avviso associate e i test web di disponibilità.There are separate resources for the associated alert rules and availability web tests.

  2. Copiare i JSON del componente nella posizione appropriata in template1.json.Copy the JSON of the component into the appropriate place in template1.json.
  3. Eliminare queste proprietà:Delete these properties:

    • id
    • InstrumentationKey
    • CreationDate
    • TenantId
  4. Aprire le sezioni webtests e alertrules e copiare i JSON per i singoli elementi nel modello.Open the webtests and alertrules sections and copy the JSON for individual items into your template. (Non copiare dai nodi webtests e alertrules: passare agli elementi sotto ad essi.)(Don't copy from the webtests or alertrules nodes: go into the items under them.)

    Ciascun test web dispone di una regola di avviso associata, perciò è necessario copiarli entrambi.Each web test has an associated alert rule, so you have to copy both of them.

    È possibile includere anche avvisi nelle metriche.You can also include alerts on metrics. Nomi delle metriche.Metric names.

  5. Inserire questa riga in ciascuna risorsa:Insert this line in each resource:

    "apiVersion": "2015-05-01",

Impostazione dei parametri per il modelloParameterize the template

È necessario sostituire i nomi specifici con i parametri.Now you have to replace the specific names with parameters. Per impostare i parametri di un modello, si scrivono espressioni mediante un set di funzioni di supporto.To parameterize a template, you write expressions using a set of helper functions.

È Impossibile impostare i parametri per una sola parte di una stringa, quindi utilizzare concat() per compilare stringhe.You can't parameterize just part of a string, so use concat() to build strings.

Di seguito sono riportati esempi delle sostituzioni che si possono apportare.Here are examples of the substitutions you'll want to make. Sono presenti più occorrenze di ogni sostituzione.There are several occurrences of each substitution. Potrebbero esserne necessarie altre nel modello.You might need others in your template. Questi esempi utilizzano i parametri e le variabili definite nella parte superiore del modello.These examples use the parameters and variables we defined at the top of the template.

findfind sostituire conreplace with
"hidden-link:/subscriptions/.../components/MyAppName" "[concat('hidden-link:',
resourceId('microsoft.insights/components',
parameters('appName')))]"
"/subscriptions/.../alertrules/myAlertName-myAppName-subsId", "[resourceId('Microsoft.Insights/alertrules', variables('alertRuleName'))]",
"/subscriptions/.../webtests/myTestName-myAppName", "[resourceId('Microsoft.Insights/webtests', parameters('webTestName'))]",
"myWebTest-myAppName" "[variables(testName)]"'
"myTestName-myAppName-subsId" "[variables('alertRuleName')]"
"myAppName" "[parameters('appName')]"
"myappname" (minuscolo)"myappname" (lower case) "[toLower(parameters('appName'))]"
"<WebTest Name=\"myWebTest\" ...
Url=\"http://fabrikam.com/home\" ...>"
[concat('<WebTest Name=\"',
parameters('webTestName'),
'\" ... Url=\"', parameters('Url'),
'\"...>')]"
Eliminare GUID e ID.Delete Guid and Id.

Impostazione di dipendenze tra le risorseSet dependencies between the resources

Azure deve configurare le risorse in ordine fisso.Azure should set up the resources in strict order. Per assicurarsi che un programma di installazione venga completato prima che inizi il successivo, aggiungere le righe delle dipendenze:To make sure one setup completes before the next begins, add dependency lines:

  • Nella risorsa del test di disponibilità:In the availability test resource:

    "dependsOn": ["[resourceId('Microsoft.Insights/components', parameters('appName'))]"],

  • Nella risorsa avviso per un test di disponibilità:In the alert resource for an availability test:

    "dependsOn": ["[resourceId('Microsoft.Insights/webtests', variables('testName'))]"],

Passaggi successiviNext steps

Altri articoli di automazione:Other automation articles: