1

Nous avons un travail Stream Analytics qui a un mappage d'entrée vers un point de terminaison IOT Hub Operations Monitoring. Nous avons initialement défini notre travail sur le portail Azure. Cela fonctionne bien quand créé/mis à jour. Nous utilisons la logique de travail dans plusieurs «environnements Azure» et la conservons maintenant dans le contrôle de la source. Nous avons utilisé le type de projet Visual Studio Stream Analytics pour gérer le code source.New-StreamAnalyticsJob ne peut pas créer d'entrée de surveillance des opérations pour un concentrateur IOT

Nous utilisons la commande Powershell New-StreamAnalyticsJob pour déployer notre travail dans différents environnements.

Chaque fois que nous déployons, l'entrée du travail d'analyse de flux qui en résulte pointe vers le point de terminaison de messagerie de notre concentrateur IOT au lieu du point de terminaison Operations Monitoring.

Y at-il quelque chose que nous pouvons entrer dans le fichier JSON de l'entrée pour exprimer le type de point de terminaison? Voici le contenu Input de notre entrée JSON à l'applet de commande:

"Inputs": [{ "Name": "IOT-Hub-Monitoring-By-Consumer-Group", "Properties": { "DataSource": { "Properties": { "ConsumerGroupName": "theConsumerGroup", "IotHubNamespace": "theIotNamespace", "SharedAccessPolicyKey": null, "SharedAccessPolicyName": "iothubowner" }, "Type": "Microsoft.Devices/IotHubs" }, "Serialization": { "Properties": { "Encoding": "UTF8", "Format": "LineSeparated" }, "Type": "Json" }, "Type": "Stream" } }, { "Name": "IOT-Hub-Messaging-By-Consumer-Group", "Properties": { "DataSource": { "Properties": { "ConsumerGroupName": "anotherConsumerGroup", "IotHubNamespace": "theIotNamespace", "SharedAccessPolicyKey": null, "SharedAccessPolicyName": "iothubowner" }, "Type": "Microsoft.Devices/IotHubs" }, "Serialization": { "Properties": { "Encoding": "UTF8", "Format": "LineSeparated" }, "Type": "Json" }, "Type": "Stream" } } ],

est-il un élément endpoint dans le IotHubProperties que nous ne sommes pas exprimer? Est-ce documenté quelque part?

+0

J'ai trouvé cette documentation au format JSON pour les entrées: https://docs.microsoft.com/en-us/rest/api/streamanalytics/stream-analytics-input. Cependant, il n'y a aucune mention d'Endpoint du Hub IOT, donc ma question demeure. Comment pouvons-nous exprimer le fait que nous devons utiliser le point de terminaison de la surveillance des opérations? –

Répondre

0

La suggestion de @DaveMontgomery était bon, mais se sont révélées être pas nécessaire. Une simple mise à niveau de CMDLET a permis de résoudre le problème.

La racine du problème est avéré être que l'Azure Powershell Cmdlets, jusqu'à et y compris la version 4.1.x utilisaient une version plus ancienne de l'assemblée Microsoft.Azure.Management.StreamAnalytics, à savoir 1.0. La version 2.0 de Microsoft.Azure.Management.StreamAnalytics est sortie il y a quelques mois et cette version incluait, si je comprends bien, l'ajout d'un élément endpoint à la structure JSON Inputs.

La nouvelle version de CMDLETs est documentée ici: https://github.com/Azure/azure-powershell/releases/tag/v4.2.0-July2017. Les validations de la version incluent https://github.com/Azure/azure-powershell/commit/0c00632aa8f767e58077e966c04bb6fc505da1ef, qui passe à Microsoft.Azure.Management.StreamAnalytics v2.0.

Notez qu'il s'agit d'un changement radical, car le JSON est passé de PascalCase à camelCase.

Avec ce changement dans la main, nous pouvons ajouter un élément endpoint au Properties/DataSource/Properties entrée IOT, et le flux Analytics emploi comme déployé contient une entrée IOT correctement cousu à l'extrémité operationsMonitoring.

1

Je remarque que le portail Azure appelle un point final différent de celui indiqué ici est: https://docs.microsoft.com/en-us/rest/api/streamanalytics/stream-analytics-definition

Il utilise extrémités sous https://main.streamanalytics.ext.azure.com/api. par exemple. GET/api/Emploi/GetStreamingJob subscriptionId = {guid} & resourcegroupname = MYRG & jobName = MyJobName

Vous remarquerez dans les résultats JSON:

{ 
    "properties": { 
    "inputs": { 
     { 
     "properties": { 
      "datasource": { 
      "inputIotHubSource": { 
       "iotHubNamespace":"HeliosIOTHubDev", 
       "sharedAccessPolicyName":"iothubowner", 
       "sharedAccessPolicyKey":null, 
     ---> "endpoint":"messages/events", <--- 
       "consumerGroupName":"devicehealthmonitoring" 
      } 

Pour le suivi, vous verrez des opérations "endpoint":"messages/operationsMonitoringEvents"

Ils semblent mettre en œuvre Save for Inputs comme PATCH /api/Inputs/PatchInput?... qui prend un JSON construit de manière similaire avec les mêmes 2 valeurs pour endpoint. Êtes-vous capable d'utiliser ce point de terminaison d'une manière ou d'une autre? dire appeler New-AzureRmStreamAnalyticsJob comme vous le feriez normalement alors Invoke-WebRequest -Method Patch -Uri ...

--Edit--

Le Invoke-WebRequest était un no-go - beaucoup trop d'authentification pour essayer de reproduire/Emuler.

Une meilleure option consiste à passer par this tutorial pour créer une application console et définir le point final après le déploiement à l'aide des scripts Powershell.

Quelque chose comme cela devrait fonctionner (mais sans aucune erreur/contrôle null):

string tenantId = "...";  //Tenant Id Guid 
string subscriptionId = "..."; //Subcription Id Guid 
string rgName = "...";   //Name of Resource Group 
string jobName = "...";   //Name of Stream Analytics Job 
string inputName = "...";  //Name-of-Input-requiring-operations-monitoring 
string accesskey = "...";  //Shared Access Key for the IoT Hub 

var login = new ServicePrincipalLoginInformation(); 
login.ClientId = "...";   //Client/Application Id for AD Service Principal (from tutorial) 
login.ClientSecret = "...";  //Password for AD Service Principal (from tutorial) 

var environment = new AzureEnvironment 
{ 
    AuthenticationEndpoint = "https://login.windows.net/", 
    GraphEndpoint = "https://graph.windows.net/", 
    ManagementEnpoint = "https://management.core.windows.net/", 
    ResourceManagerEndpoint = "https://management.azure.com/", 
}; 
var credentials = new AzureCredentials(login, tenantId, environment) 
    .WithDefaultSubscription(subscriptionId); 

var azure = Azure 
    .Configure() 
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic) 
    .Authenticate(credentials) 
    .WithDefaultSubscription(); 

var client = new StreamAnalyticsManagementClient(credentials); 
client.SubscriptionId = azure.SubscriptionId; 

var job = client.StreamingJobs.List(expand: "inputs").Where(j => j.Name == jobName).FirstOrDefault(); 
var input = job.Inputs.Where(i => i.Name == inputName).FirstOrDefault(); 

var props = input.Properties as StreamInputProperties; 
var ds = props.Datasource as IoTHubStreamInputDataSource; 

ds.Endpoint = "messages/operationsMonitoringEvents"; 
ds.SharedAccessPolicyKey = accesskey; 

client.Inputs.CreateOrReplace(input, rgName, jobName, inputName);