将数据从函数摄取到事件中心,再摄取到Azure data Explorer?

将数据从函数摄取到事件中心,再摄取到Azure data Explorer?,azure,azure-eventhub,azure-data-explorer,Azure,Azure Eventhub,Azure Data Explorer,我有一些JSON数据进入IOT中心,然后触发一个函数来取消数据嵌套 该函数将此数据发送到事件中心,然后根据我设置的映射,Azure data Explorer将接收该数据 问题是没有数据进入数据浏览器;它将通过映射接收数据的唯一方法是将原点设置为通过自定义路由接收信息的事件中心 是否可以通过IOT hub->function->event hub在data explorer中摄取数据 编辑: 用于取消嵌套并将数据转发到另一个事件中心的函数: module.exports = async func

我有一些JSON数据进入IOT中心,然后触发一个函数来取消数据嵌套

该函数将此数据发送到事件中心,然后根据我设置的映射,Azure data Explorer将接收该数据

问题是没有数据进入数据浏览器;它将通过映射接收数据的唯一方法是将原点设置为通过自定义路由接收信息的事件中心

是否可以通过IOT hub->function->event hub在data explorer中摄取数据

编辑:

用于取消嵌套并将数据转发到另一个事件中心的函数:

module.exports = async function (context, eventHubMessages) {

    // receive message from IOT hub
    eventHubMessages.forEach((message, index) => {
        var devicename = message.deviceName;
        // timestamp comes in two different texts, find and store correct one
        var timestamp = (message.timestamp == null) ? message.timeStamp : message.timestamp;
        //context.log("Message: " + JSON.stringify(message));
        if (message.tags != null) {
            message.tags.forEach((tag, index) => {
                // for each tag, create new object
                var name = tag.Name;
                var value = tag.Value;
                var newObject = {
                                 "name":name,
                                 "value": value,
                                 "eventenqueuedutctime": timestamp,
                                 "devicename": devicename
                                }                
                // output message object to 'splitmessage-dev' event hub
                context.bindings.outputEventHubMessage = newObject
                context.log("Sent object: " + JSON.stringify(newObject));
            })
        }
    });

};
我可以确认其他事件中心正在接收此数据(使用另一个打印传入消息的函数进行检查)

映射如下所示:

'testTableMap' '[{"column":"name", "path":"$.name"}, 
{"column":"value", "path":"$.value"}, 
{"column":"eventenqueuedutctime", "path":"$.eventenqueuedutctime"},
{"column":"devicename", "path":"$.devicename"}]'

应该可以使用您提供的设置接收数据

由于数据没有被摄取,您可能应该尝试并诊断数据被卡住的地方

我将提供一些有助于调试的一般准则

数据未到达配置为ADX数据源的EventHub 您可以检查EventHub监视并验证事件是否正在流动。 此外,我建议您从EventHub读取数据,以确保它与您期望的一样。(看起来你已经这么做了)

这里的情况似乎不是这样,因为您已经澄清,确实看到事件流入EventHub,并且可以通过另一个函数成功读取它们

表/映射配置不正确 尝试从配置的EventHub接收数据

如果上述方法有效,您可以尝试使用其他数据类型

数据源监控 您还可以通过Azure门户检查ADX集群的指标

尝试在Azure Portal中访问您的群集,在
Metrics
选项卡中,您可以选择两个有助于解决问题的指标:

已处理事件
-让您了解ADX管理从EventHub读取多少事件。这基本上让您知道数据源配置正确。如果您没有看到事件,我建议您建立一个新的源


摄取结果
-计算摄取状态(成功/失败),这也有助于诊断失败。

您是否在函数写入数据的事件中心看到数据?(以确保您的问题尚未出现)。一般来说,您的管道应该是这样工作的。您是否最终将Azure Data Explorer群集摄取源设置为事件中心:(IOT->function->event hub->ADX)[您是否也可以提供一个代码片段,说明“取消嵌套”的含义提供的摄取源映射是什么?数据确实显示在目标事件中心,管道设置为IOT->function->event hub->ADX ingestion。我面临一个类似的问题,JSON格式的日志从事件中心摄取到ADX。我在ADX表中看到空记录。没有摄取错误,我遵循了每个错误您提到的步骤似乎与JSON映射有关。@ashwiniprakash看到空记录表明数据的解析方式有问题。我建议创建一个包含单个字符串列的简单映射,映射整个文档(使用
$
)。如果这样做有效,下一步就是将其拆分为列。如果这样做无效,则可能是以错误的编码传递的数据有问题。请尝试并报告问题是否已解决。json映射中的“路径”区分大小写,我在那里犯了错误。谢谢!
// create table 
// I am assuming strings because other types can cause format errors, 
// so I would try strings before other specific types (dynamic, datetime)
.create table IngestionTest (name: string, value:string, eventenqueuedutctime:string, devicename:string)

// add mapping
.create table IngestionTest ingestion json mapping 'testTableMap' '[{"column":"name", "path":"$.name"}, {"column":"value", "path":"$.value"}, {"column":"eventenqueuedutctime", "path":"$.eventenqueuedutctime"},{"column":"devicename", "path":"$.devicename"}]'

// ingest data manually - replace with you actual data
.ingest inline into table IngestionTest with (jsonMappingReference='testTableMap') <| '{ "name" : "test", "value": { "some":"nested", "value": true}, "eventenqueuedutctime" : "2016-01-14", "devicename": "surface" }'
.show ingestion failures