0

我有一些 JSON 数据进入 IOT 集线器,然后触发一个函数来取消嵌套数据。

该函数将此数据发送到事件中心,然后数据应该由 Azure 数据资源管理器根据我设置的映射来摄取。

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

是否可以通过 IOT 中心 -> 功能 -> 事件中心在数据浏览器中摄取数据?

编辑:

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

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"}]'
4

1 回答 1

1

应该可以使用您提供的设置来摄取数据。

由于没有摄取数据,因此您可能应该尝试诊断它卡在哪里。

我将提供一些有助于调试的通用指南。

数据未到达配置为 ADX 数据源的 EventHub

您可以检查 EventHub 监控并验证事件是否正在流动。另外,我建议从 EventHub 读取数据,以确保它看起来像您期望的那样。(好像你已经这样做了)

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

表/映射配置不正确

尝试手动从配置的 EventHub 中提取数据

// 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

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

数据源监控

您可以通过 Azure 门户查看的另一件事是 ADX 集群的指标。

尝试在 Azure 门户中访问您的集群,在Metrics 选项卡中,您可以选择两个可以帮助您进行故障排除的指标:

Events Processed- 让您了解 ADX 设法从 EventHub 读取了多少事件。这基本上让您知道数据源配置正确。如果您看不到事件,我建议您设置一个新来源。

Ingestion Result- 让您了解摄取状态(成功/失败),这也有助于诊断故障。

于 2019-05-12T10:47:33.690 回答