handleTelemetryData: function()

in backend/src/iotRules/handleTelemetryData.js [17:155]


    handleTelemetryData: function(event, context, cb) {
        var now = new Date();
        var last_recorded_at = null;
        var last_status = null;
        var version = null;
        var last_datapoint = null;
        var telemetry = event.telemetry || [];
        var params = {
            MetricData: [],
            Namespace: Constants.METRICS_NAMESPACE
        };
        telemetry.forEach(function(datapoint){
            last_recorded_at = new Date(datapoint.recorded_at);
            last_status = datapoint.status;
            version = datapoint.version;
            last_datapoint = datapoint;
            var metricData = {
                MetricName: Constants.BATTERY_LIFE_METRIC,
                Dimensions: [
                    {
                        Name: 'bot',
                        Value: event.dimension
                    }
                ],
                StorageResolution: 1,
                Timestamp: last_recorded_at,
                Unit: 'Percent',
                Value: datapoint.batteryLife
            }
            params.MetricData.push(metricData);
        });

        params.MetricData.push({
            MetricName: Constants.TELEMETRY_DELAY_METRIC,
            Dimensions: [
                {
                    Name: 'bot',
                    Value: event.dimension
                }
            ],
            StorageResolution: 1,
            Timestamp: now,
            Unit: 'Milliseconds',
            Value: now - last_recorded_at
        });

        params.MetricData.push({
            MetricName: Constants.TELEMETRY_PACKAGE_SIZE_METRIC,
            Dimensions: [
                {
                    Name: 'bot',
                    Value: event.dimension
                }
            ],
            StorageResolution: 1,
            Timestamp: now,
            Unit: 'Bytes',
            Value: jsonSize(event.telemetry)
        });

        cw.putMetricData(params, function(err, data) {
            if (err) console.log(err, err.stack);
        });

        // Update the dynamoDB item
        var expressionAttributeValues = {
            ":s": {
                S: last_status
            },
            ":l": {
                N: `${last_recorded_at.getTime()}`
            },
            ":b": {
                N: `${last_datapoint.batteryLife}`
            },
            ":v": {
                S: version
            },
            ":tn": {
                S: event.dimension
            }
        }
        var updateExpression = "SET #S = :s, #L = :l, #B = :b, #V = :v";
        var expressionAttributeNames= {
            "#S": "status",
            "#L": "lastSeenAt",
            "#B": "batteryLife",
            "#V": "version"
        }
        if(last_datapoint.batteryLife < 10.0) {
            expressionAttributeValues[":lbd"] = { S: "true" };
            updateExpression = updateExpression.concat(", #LBD = :lbd");
            expressionAttributeNames["#LBD"] = "lowBatteryDetected";
        } else {
            updateExpression = updateExpression.concat(" REMOVE lowBatteryDetected");
        }
        var ddbParams = {
            TableName: process.env.THINGS_TABLE,
            Key: {
                "thingName": {
                    S: event.dimension
                }
            },
            UpdateExpression: updateExpression,
            ExpressionAttributeNames: expressionAttributeNames, 
            ExpressionAttributeValues: expressionAttributeValues,
            ConditionExpression: "thingName = :tn",
        };
        ddb.updateItem(ddbParams, function(err, data) {
            if (err) {
                if( err.code == 'ConditionalCheckFailedException') {
                    data = {thingName: event.clientId, exists: false}
                    cb(null, data)
                } else {
                    cb(err, null);
                }
            } else {
                cb(err, data);
            }
        });

        // raise cw status event
        last_datapoint.botId = event.dimension;
        var cweParams = {
            Entries: [
                {
                    Detail: JSON.stringify(last_datapoint),
                    DetailType: 'AcmeBot Bot Status',
                    Resources: [],
                    Source: Constants.STATUS_EVENT_SOURCE,
                    Time: last_recorded_at
                }
            ]
        };
        cwe.putEvents(cweParams, function(err, data) {
            if (err) console.log(err, err.stack);
        });

    }