Fiware - подписка Orion Context Broker не отправлена в STH, "условия должны были быть массивом"
При попытке использовать STH для сохранения и извлечения данных, отправленных в OCB, у меня возникла проблема при оформлении подписки.
Моя проблема в том, что создание подписки проходит хорошо. Когда я создаю подписку следующим образом:
POST /v1/contextSubscriptions HTTP/1.1
Host: <cb_host>:1026
Content-Type: application/json
Fiware-Service: myService
Fiware-ServicePath: /myServicePath
Cache-Control: no-cache
{
"entities": [
{
"type": "cameraSimple",
"isPattern": "true",
"id": "sensor03"
}
],
"attributes": [
"class"
],
"reference": "http://<cb_host>:8666/notify",
"duration": "P1M",
"notifyConditions": [
{
"type": "ONCHANGE",
"condValues": [
"class"
]
}
],
"throttling": "PT5S"
}
Я получаю следующий ответ:
{
"subscribeResponse": {
"subscriptionId": "588b4f38e2066a50fa98df9b",
"duration": "P1M",
"throttling": "PT5S"
}
}
но на сервере Fiware я вижу ошибку об условиях в терминале, в котором работают контейнеры, и еще одну об атрибутах:
orion | ERROR@14:06:10 safeMongo.cpp[302]: Runtime Error (field 'conditions' was supposed to be an array but type=4 in BSONObj <{ _id: ObjectId('588b4f96e2066a50fa98df9c'), expiration: 1488116886, reference: "http://<cb_host>:8666/notify", custom: false, throttling: 5, servicePath: "/myServicePath", status: "active", entities: [ { id: "sensor03", isPattern: "true", type: "cameraSimple", isTypePattern: false } ], attrs: [ "class" ], metadata: [], blacklist: false, conditions: [ "class" ], expression: { q: "", mq: "", geometry: "", coords: "", georel: "" }, format: "JSON" }> from caller mongoSubCacheItemInsert:221)
orion | ERROR@13:48:10 safeMongo.cpp[302]: Runtime Error (field 'attrs' was supposed to be an array but type=4 in BSONObj <{ _id: ObjectId('588b4f96e2066a50fa98df9c'), expiration: 1488116886, reference: "http://<cb_host>:8666/notify", custom: false, throttling: 5, servicePath: "/myServicePath", status: "active", entities: [ { id: "sensor03", isPattern: "true", type: "cameraSimple", isTypePattern: false } ], attrs: [ "class" ], metadata: [], blacklist: false, conditions: [ "class" ], expression: { q: "", mq: "", geometry: "", coords: "", georel: "" }, format: "JSON" }> from caller mongoSubCacheItemInsert:215)
Кроме того, при обновлении значения в моей сущности,
PUT /v2/entities/sensor03/attrs/class/value HTTP/1.1
Host: <cb_host>:1026
Accept: application/json
Fiware-Service: myService
Fiware-ServicePath: /myServicePath
Cache-Control: no-cache
"monitor"
Я ничего не получаю при запросе STH:
GET /STH/v1/contextEntities/type/myDevice/id/sensor03/attributes/class?lastN=10 HTTP/1.1
Host: <cb_host>:8666
Accept: application/json
Fiware-Service: myService
Fiware-ServicePath: /myServicePath
Cache-Control: no-cache
возвращает:
{
"contextResponses": [
{
"contextElement": {
"attributes": [
{
"name": "class",
"values": []
}
],
"id": "sensor03",
"isPattern": false,
"type": "myDevice"
},
"statusCode": {
"code": "200",
"reasonPhrase": "OK"
}
}
]
}
Замечания:
- Я использую NGSI V1, так как подозреваю, что V2 еще не поддерживается для STH, получающего уведомления NGSI V2 об этой проблеме. Кроме того, я не нашел никакой документации относительно "Получение исторической необработанной контекстной информации" с NGSI V2, например, на этой странице
Я использую Docker-машину с одной виртуальной машиной Debian 8, работающей в Fiware-Lab, со следующими изображениями:
mongodb: image: mongo:2.6 hostname: mongodb container_name: mongodb command: --smallfiles orion: image: fiware/orion:develop hostname: orion container_name: orion links: - mongodb expose: - "1026" ports: - "1026:1026" command: -dbhost mongodb fiware-sth-comet: image: telefonicaiot/fiware-sth-comet links: - mongodb ports: - "8666:8666" environment: - STH_HOST=0.0.0.0 - DB_URI=mongodb:27017
РЕДАКТИРОВАТЬ 1: После удаления "развертки" образа Orion Docker у меня теперь работает версия "1.6.0-next" Orion, и у меня больше нет ошибки времени выполнения. Тем не менее, я не могу получить какую-либо историческую ценность атрибутов сущности. Я, должно быть, делаю какую-то ошибку в запросе, но я не знаю где.
Теперь мой файл docker-compose выглядит так:
mongo:
image: mongo:3.2
command: --nojournal
orion:
image: fiware/orion
links:
- mongo
ports:
- "1026:1026"
command: -dbhost mongo
fiware-sth-comet:
image: telefonicaiot/fiware-sth-comet
links:
- mongo
ports:
- "8666:8666"
environment:
- STH_HOST=0.0.0.0
- DB_URI=mongo:27017
cygnus:
image: fiware/cygnus-ngsi
links:
-mongo
РЕДАКТИРОВАТЬ 2: Следуя совету @GermánTorodelValle, я пытаюсь смоделировать уведомление для контейнера STH, как отправляет CB:
curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Fiware-Service: myService" -H "Fiware-ServicePath: /myServicePath" -d '{
"subscriptionId" : "57a9ce8ae997e37e85a4be39",
"originator" : "orion.contextBroker.instance",
"contextResponses" : [
{
"contextElement" : {
"attributes" : [
{
"name" : "class",
"type" : "Text",
"value" : "monitor"
}
],
"type" : "cameraSimple",
"isPattern" : "false",
"id" : "sensor03"
},
"statusCode" : {
"code" : "200",
"reasonPhrase" : "OK"
}
}
]
}' "http://172.17.0.1:8666/notify"
Вход в контейнер STH выглядит следующим образом:
time=2017-02-02T13:50:36.809Z | lvl=ERROR | corr=39638217-c300-48c0-9122-bff6164d5298 | trans=39638217-c300-48c0-9122-bff6164d5298 | op=OPER_STH_POST | from=n/a | srv=myService | subsrv=/myServicePath | comp=STH | msg=Error when getting the raw data collection for storing:MongoError: db already exists with different case already have: [sth_myservice] trying to create [sth_myService]
time=2017-02-02T13:50:36.810Z | lvl=WARN | corr=c322ddc8-2140-484b-a123-4e5b9b60742e | trans=c322ddc8-2140-484b-a123-4e5b9b60742e | op=OPER_STH_POST | from=n/a | srv=myService | subsrv=/myServicePath | comp=STH | msg=POST /notify, event={"request":"1486043436805:3577e9b29ee6:1:iym1stlz:10018","timestamp":1486043436810,"tags":["handler","error"],"data":{"msec":3.6443320512771606,"error":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","data":{"name":"MongoError","message":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","ok":0,"errmsg":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","code":13297,"isBoom":true,"isServer":true,"data":null,"output":{"statusCode":500,"payload":{"statusCode":500,"error":"Internal Server Error","message":"An internal server error occurred"},"headers":{}}}},"internal":true}
time=2017-02-02T13:50:36.812Z | lvl=ERROR | corr=6c864793-c7ef-462a-a43d-75cdae8d20a3 | trans=6c864793-c7ef-462a-a43d-75cdae8d20a3 | op=OPER_STH_POST | from=n/a | srv=myService | subsrv=/myServicePath | comp=STH | msg=POST /notify, event={"request":"1486043436805:3577e9b29ee6:1:iym1stlz:10018","timestamp":1486043436811,"tags":["internal","error"],"data":{"name":"MongoError","message":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","ok":0,"errmsg":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","code":13297,"isBoom":true,"isServer":true,"data":null,"output":{"statusCode":500,"payload":{"statusCode":500,"error":"Internal Server Error","message":"An internal server error occurred"},"headers":{"content-type":"application/json; charset=utf-8","cache-control":"no-cache","content-length":96}}},"internal":true}
time=2017-02-02T13:50:38.143Z | lvl=INFO | corr=n/a | trans=n/a | op=OPER_STH_SERVER_LOG | from=n/a | srv=n/a | subsrv=n/a | comp=STH | msg=Everything OK, 0 requests attended in the last 60s interval
1 ответ
Поскольку вопрос настолько самодостаточен и полон (большое спасибо за это, @lukas), позвольте мне отметить два аспекта в качестве резюме и ответа:
- STH поддерживает только уведомления NGSI v1, поэтому, пожалуйста, подпишите STH на экземпляр Context Broker, используя NGSI v1.
- База данных MongoDB налагает как ограничение, что 2 базы данных не могут иметь одинаковое имя, но различную заглавную букву (см. https://docs.mongodb.com/manual/reference/limits/), следовательно, вы не можете использовать 2 разных имени службы которые изменяют только заглавные буквы с STH, так как имя базы данных генерируется из имени службы. Это вы не можете использовать
myservice
а такжеmyService
в качестве услуг, для которых STH собирается собирать данные. Включите какой-нибудь дополнительный символ в любой из них, и все должно быть хорошо.
Большое спасибо!;)