2017-05-09 5 views
0

다음 라인에서 설명하는필드의 Kibana에서 문제가 있습니다. 나는 상황을 설명하려고 노력할 것이다.실제 값이 인식되지 않습니다. Kinesis Firehose에서 elasticsearch까지 JSON 데이터를 전송합니다.

나는 DynamoDB 스트림을 람다에게 보낸 다음 Kenesis Firehouse로 보내고 Firehose에서 Elasticsearch로 보냅니다. 데이터를 시각화하는 데 Kibana를 사용하고 있으며 여기에 문제가 있습니다. 람다에서

나는 다음과 같은 나타납니다 :

내가 DynamoDB의이 JSON을 보내고있다 말할 수 있습니다

{ 
    "data": { 
     "M": { 
      "machine": { 
       "M": { 
        "application": { 
         "S": "application" 
        }, 
        "brand": { 
         "S": "band" 
        } 
       } 
      }, 
      "description": { 
       "S": "This is the description" 
      }, 
      "id": { 
       "S": "identificator" 
      }, 
      "units": { 
       "S": "units" 
      }, 
      "value": { 
       "N": "33" 
      }, 
      "_msgid": { 
       "S": "85209b75.f51ee8" 
      }, 
      "timestamp": { 
       "S": "2017-05-09T06:38:00.337Z" 
      } 
     } 
    }, 
    "id": { 
     "S": "85209b75.f51ee8" 
    } 
} 

나는 경우 키바의 운동성 파이어 호스이 마지막으로 JSON을 전달하는 경우 인덱스 패턴을 구성하면 "timestamp"이 자동으로 인식됩니다. 여기서 문제는 필드 "value"이 문자열과 같아서 인식되지 않는다는 것입니다.

는 내가 JSON을 수정 한 다음 파이어 호스에 다시 보내려고하지만 키바는 인식하지 않습니다 "timestamp" :

{ 
    "data": { 
     "machine": { 
      "application": "application", 
      "brand": "brand" 
     }, 
     "description": "This is the description", 
     "id": "identificator", 
     "units": "KWh", 
     "value": 33, 
     "_msgid": "85209b75.f51ee8", 
     "timestamp": "2017-05-09T06:38:00.337Z" 
    }, 
    "id": "85209b75.f51ee8" 
} 
내가이 데이터를 보낼 수있는 방법을 알고 싶습니다

및 키바는 인식 " timestamp "및"value "필드에 표시됩니다.

var AWS = require('aws-sdk'); 
var unmarshalJson = require('dynamodb-marshaler').unmarshalJson; 

var firehose = new AWS.Firehose(); 

exports.lambda_handler = function(event, context) { 

    var record = JSON.stringify(event.Records[0].dynamodb.NewImage); 

    console.log("[INFO]:"+JSON.stringify(event.Records[0].dynamodb.NewImage)); 

    var params = { 
     DeliveryStreamName: 'DeliveryStreamName', 

     Record:{ 
      Data: record 
     } 
    }; 
    firehose.putRecord(params, function(err, data) { 

     if (err) console.log(err, err.stack); // an error occurred 
     else  console.log(JSON.stringify(data));   // successful response 

     context.done(); 
    }); 
}; 

답변

0

나는 그것이 나 자신에 의해 인덱스 매핑을 만드는 대신 운동성 파이어 호스가 그것을 만들 수 있습니다 해결 :

내가 람다에서 사용하고 코드의 예입니다.

{ 
    "data": { 
     "timestamp": "2017-05-09T11:30:41.484Z", 
     "tag": "tag", 
     "value": 33, 
     "units": "units", 
     "type": "type", 
     "machine":{ 
      "name": "name", 
      "type": "type", 
      "company": "company" 
     } 
    }, 
    "id": "85209b75.f51ee8" 
} 

나는 다음과 같은 elasticsearch 인덱스 및 매핑을 수동으로 작성 :

PUT /index 
{ 
    "settings" : { 
     "number_of_shards" : 2 
    }, 
    "mappings" : { 
     "type" : { 
      "properties" : { 
       "data" : { 
        "properties" : { 
         "machine":{ 
          "properties": { 
           "name": { "type" : "text" }, 
           "type": { "type" : "text" }, 
           "company": { "type" : "text" } 
          } 
         }, 
         "timestamp": { "type" : "date" }, 
         "tag" : { "type" : "text" }, 
         "value": { "type" : "float" }, 
         "description": { "type" : "text" }, 
         "units": { "type" : "text" }, 
         "type" : { "type" : "text" }, 
         "_msgid": { "type" : "text" } 
        } 
       }, 
       "id": { "type" : "text" }  
      } 
     } 
    } 
} 

그래서 그리고 JSON 이러한 유형의 예를 들어 { "type" : "float" }

{ "type" : "date" }"timestamp" 속성과 "value" attibute를 선언 그것을 해결하기 위해 더 좋은 해결책은 람다에서 인덱스 매핑이 존재하는지 확인해야하고 직접 생성하지 않는 것이 좋습니다.