New-StreamAnalyticsJob 无法为 IOT 中心创建操作监控输入
New-StreamAnalyticsJob cannot create Operations Monitoring Input for an IOT Hub
我们有一个流分析作业,它有一个到 IOT 中心操作监控端点的输入映射。我们最初在 Azure 门户上定义了我们的工作。这样创建/更新后它工作正常。
我们在多个“Azure 环境”中使用作业逻辑,现在将其保存在源代码管理中。我们使用 Visual Studio 流分析项目类型来管理源代码。
我们正在使用 New-StreamAnalyticsJob
Powershell 命令将我们的作业部署到不同的环境中。
然而,每次我们部署时,生成的流分析作业的输入都会指向我们 IOT 中心的消息端点,而不是操作监控端点。
是否可以在输入的 JSON 文件中输入一些内容来表达端点类型?这是我们 JSON 输入到 cmdlet 的 Input
内容:
"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"
}
}
]
IotHubProperties
中是否有我们没有表达的 endpoint
元素?它在某处记录了吗?
我注意到 Azure 门户调用的端点与此处指示的端点不同:https://docs.microsoft.com/en-us/rest/api/streamanalytics/stream-analytics-definition
它使用 https://main.streamanalytics.ext.azure.com/api 下的端点。例如
GET /api/Jobs/GetStreamingJob?subscriptionId={guid}&resourceGroupName=MyRG&jobName=MyJobName
您会在结果中注意到 JSON:
{
"properties": {
"inputs": {
{
"properties": {
"datasource": {
"inputIotHubSource": {
"iotHubNamespace":"HeliosIOTHubDev",
"sharedAccessPolicyName":"iothubowner",
"sharedAccessPolicyKey":null,
---> "endpoint":"messages/events", <---
"consumerGroupName":"devicehealthmonitoring"
}
对于操作监控,您将看到 "endpoint":"messages/operationsMonitoringEvents"
他们似乎将输入保存为 PATCH /api/Inputs/PatchInput?...
,它采用类似构造的 JSON,endpoint
具有相同的 2 个值。
你能以某种方式使用那个端点吗?即像往常一样调用 New-AzureRmStreamAnalyticsJob
然后 Invoke-WebRequest -Method Patch -Uri ...
--编辑--
Invoke-WebRequest
是行不通的 -- 太多的身份验证无法尝试 replicate/emulate。
更好的选择是通过 this tutorial 创建控制台应用程序并在部署后使用 Powershell 脚本设置端点。
这样的事情应该可行(尽管绝对没有 error/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);
@DaveMontgomery 的建议很好,但结果证明不需要。
一个简单的 CMDLET 升级解决了这个问题。
原来的根本问题是 Azure Powershell Cmdlet,直到并包括版本 4.1.x
使用的是旧版本的 Microsoft.Azure.Management.StreamAnalytics
程序集,即 1.0
。 Microsoft.Azure.Management.StreamAnalytics
的 2.0
版本几个月前发布,据我所知,该版本包括向 Inputs
JSON 结构添加一个 endpoint
元素。
此处记录了新的 CMDLET 版本:https://github.com/Azure/azure-powershell/releases/tag/v4.2.0-July2017. The commits for the release included https://github.com/Azure/azure-powershell/commit/0c00632aa8f767e58077e966c04bb6fc505da1ef,升级到 Microsoft.Azure.Management.StreamAnalytics v2.0
。
请注意,这是一项重要的更改,因为 JSON 从 PascalCase 更改为 camelCase。
有了这个改变,我们可以将 endpoint
元素添加到 Properties
/ DataSource
/Properties
IOT 输入,以及部署的流分析作业包含正确缝合到 operationsMonitoring
端点的 IOT 输入。
我们有一个流分析作业,它有一个到 IOT 中心操作监控端点的输入映射。我们最初在 Azure 门户上定义了我们的工作。这样创建/更新后它工作正常。
我们在多个“Azure 环境”中使用作业逻辑,现在将其保存在源代码管理中。我们使用 Visual Studio 流分析项目类型来管理源代码。
我们正在使用 New-StreamAnalyticsJob
Powershell 命令将我们的作业部署到不同的环境中。
然而,每次我们部署时,生成的流分析作业的输入都会指向我们 IOT 中心的消息端点,而不是操作监控端点。
是否可以在输入的 JSON 文件中输入一些内容来表达端点类型?这是我们 JSON 输入到 cmdlet 的 Input
内容:
"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"
}
}
]
IotHubProperties
中是否有我们没有表达的 endpoint
元素?它在某处记录了吗?
我注意到 Azure 门户调用的端点与此处指示的端点不同:https://docs.microsoft.com/en-us/rest/api/streamanalytics/stream-analytics-definition
它使用 https://main.streamanalytics.ext.azure.com/api 下的端点。例如 GET /api/Jobs/GetStreamingJob?subscriptionId={guid}&resourceGroupName=MyRG&jobName=MyJobName
您会在结果中注意到 JSON:
{
"properties": {
"inputs": {
{
"properties": {
"datasource": {
"inputIotHubSource": {
"iotHubNamespace":"HeliosIOTHubDev",
"sharedAccessPolicyName":"iothubowner",
"sharedAccessPolicyKey":null,
---> "endpoint":"messages/events", <---
"consumerGroupName":"devicehealthmonitoring"
}
对于操作监控,您将看到 "endpoint":"messages/operationsMonitoringEvents"
他们似乎将输入保存为 PATCH /api/Inputs/PatchInput?...
,它采用类似构造的 JSON,endpoint
具有相同的 2 个值。
你能以某种方式使用那个端点吗?即像往常一样调用 New-AzureRmStreamAnalyticsJob
然后 Invoke-WebRequest -Method Patch -Uri ...
--编辑--
Invoke-WebRequest
是行不通的 -- 太多的身份验证无法尝试 replicate/emulate。
更好的选择是通过 this tutorial 创建控制台应用程序并在部署后使用 Powershell 脚本设置端点。
这样的事情应该可行(尽管绝对没有 error/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);
@DaveMontgomery 的建议很好,但结果证明不需要。
一个简单的 CMDLET 升级解决了这个问题。
原来的根本问题是 Azure Powershell Cmdlet,直到并包括版本 4.1.x
使用的是旧版本的 Microsoft.Azure.Management.StreamAnalytics
程序集,即 1.0
。 Microsoft.Azure.Management.StreamAnalytics
的 2.0
版本几个月前发布,据我所知,该版本包括向 Inputs
JSON 结构添加一个 endpoint
元素。
此处记录了新的 CMDLET 版本:https://github.com/Azure/azure-powershell/releases/tag/v4.2.0-July2017. The commits for the release included https://github.com/Azure/azure-powershell/commit/0c00632aa8f767e58077e966c04bb6fc505da1ef,升级到 Microsoft.Azure.Management.StreamAnalytics v2.0
。
请注意,这是一项重要的更改,因为 JSON 从 PascalCase 更改为 camelCase。
有了这个改变,我们可以将 endpoint
元素添加到 Properties
/ DataSource
/Properties
IOT 输入,以及部署的流分析作业包含正确缝合到 operationsMonitoring
端点的 IOT 输入。