【问题标题】:Problem when querying Raw Data with STH-Comet - Returns empty使用 STH-Comet 查询原始数据时出现问题 - 返回空
【发布时间】:2020-06-11 14:46:43
【问题描述】:

我有 Orion、Cygnus 和 STH-Comet(以正式模式安装和配置)。每个组件都在一个容器泊坞窗中。我使用 docker-compose.yml 实现了基础架构。

Cygnus容器配置如下:

    image: fiware/cygnus-ngsi:latest
    hostname: cygnus
    container_name: cygnus
    volumes:
      - /home/ubuntu/cygnus/multisink_agent.conf:/opt/fiware-cygnus/docker/cygnus-ngsi/multisink_agent.conf
    depends_on:
      - mongo
    networks:
      - default
    expose:
      - "5050"
      - "5080"
    ports:
      - "5050:5050"
      - "5080:5080" 
    environment:
      - CYGNUS_SERVICE_PORT=5050
      - CYGNUS_MONITORING_TYPE=http
      - CYGNUS_AGENT_NAME=cygnus-ngsi
      - CYGNUS_MONGO_SERVICE_PORT=5050
      - CYGNUS_MONGO_HOSTS=mongo:27017
      - CYGNUS_MONGO_USER=
      - CYGNUS_MONGO_PASS=
      - CYGNUS_MONGO_ENABLE_ENCODING=false
      - CYGNUS_MONGO_ENABLE_GROUPING=false
      - CYGNUS_MONGO_ENABLE_NAME_MAPPINGS=false
      - CYGNUS_MONGO_DATA_MODEL=dm-by-entity
      - CYGNUS_MONGO_ATTR_PERSISTENCE=column
      - CYGNUS_MONGO_DB_PREFIX=sth_
      - CYGNUS_MONGO_COLLECTION_PREFIX=sth_   
      - CYGNUS_MONGO_ENABLE_LOWERCASE=false
      - CYGNUS_MONGO_BATCH_TIMEOUT=30
      - CYGNUS_MONGO_BATCH_TTL=10
      - CYGNUS_MONGO_DATA_EXPIRATION=0
      - CYGNUS_MONGO_COLLECTIONS_SIZE=0
      - CYGNUS_MONGO_MAX_DOCUMENTS=0
      - CYGNUS_MONGO_BATCH_SIZE=1
      - CYGNUS_LOG_LEVEL=DEBUG
      - CYGNUS_SKIP_CONF_GENERATION=false 
      - CYGNUS_STH_ENABLE_ENCODING=false
      - CYGNUS_STH_ENABLE_GROUPING=false
      - CYGNUS_STH_ENABLE_NAME_MAPPINGS=false
      - CYGNUS_STH_DB_PREFIX=sth_
      - CYGNUS_STH_COLLECTION_PREFIX=sth_
      - CYGNUS_STH_DATA_MODEL=dm-by-entity
      - CYGNUS_STH_ENABLE_LOWERCASE=false
      - CYGNUS_STH_BATCH_TIMEOUT=30
      - CYGNUS_STH_BATCH_TTL=10
      - CYGNUS_STH_DATA_EXPIRATION=0
      - CYGNUS_STH_BATCH_SIZE=1

Obs:在 multisink_agent.conf 文件中,我更改了服务和服务路径:

cygnus-ngsi.sources.http-source-mongo.handler.default_service = tese

cygnus-ngsi.sources.http-source-mongo.handler.default_service_path = /iot

STH-Comet 容器如下所示:

    image: fiware/sth-comet:latest
    hostname: sth
    container_name: sth
    depends_on:
      - cygnus
      - mongo
    networks:
      - default
    expose:
      - "8666"
    ports:
      - "8666:8666"
    environment:
      - STH_HOST=0.0.0.0
      - STH_PORT=8666
      - DB_URI=mongo:27017
      - DB_USERNAME=
      - DB_PASSWORD=
      - LOGOPS_LEVEL=DEBUG

在 STH-Comet config.js 文件中,我启用了 CORS,并更改了 defaultService 和 defaultServicePath。该文件如下所示:

var config = {};

// STH server configuration
//--------------------------
config.server = {
    host: 'localhost',
    port: '8666',
    // Default value: "testservice".
    defaultService: 'tese',
    // Default value: "/testservicepath".
    defaultServicePath: '/iot',
    filterOutEmpty: 'true',
    aggregationBy: ['day', 'hour', 'minute'],
    temporalDir: 'temp',
    maxPageSize: '100'
};

// Cors Configuration
config.cors = {
    // The enabled is use to set CORS policy
    enabled: 'true',
    options: {
        origin: ['*'],
        headers: [
            'Access-Control-Allow-Origin',
            'Access-Control-Allow-Headers',
            'Access-Control-Request-Headers',
            'Origin, Referer, User-Agent'
        ],
        additionalHeaders: ['fiware-servicepath', 'fiware-service'],
        credentials: 'true'
    }
};

// Database configuration
//------------------------
config.database = {
    dataModel: 'collection-per-entity',
    user: '',
    password: '',
    authSource: '',
    URI: 'localhost:27017',
    replicaSet: '',
    prefix: 'sth_',
    collectionPrefix: 'sth_',
    poolSize: '5',
    writeConcern: '1',
    shouldStore: 'both',
    truncation: {
        expireAfterSeconds: '0',
        size: '0',
        max: '0'
    },
    ignoreBlankSpaces: 'true',
    nameMapping: {
        enabled: 'false',
        configFile: './name-mapping.json'
    },
    nameEncoding: 'false'
};

// Logging configuration
//------------------------
config.logging = {
   
    level: 'debug',
    format: 'pipe',
    proofOfLifeInterval: '60',
    processedRequestLogStatisticsInterval: '60'
};

module.exports = config;

我使用 Cygnus 来保存历史数据。 STH-Comet 仅用于查询原始数据和聚合数据。

天鹅座在猎户座上的签名是这样做的:

  "description": "A subscription All Entities",
  "subject": {
    "entities": [
      {
        "idPattern": ".*"
      }
    ],
    "condition": {
      "attrs": []
    }
  },
  "notification": {
    "http": {
      "url": "http://cygnus:5050/notify"
    },
    "attrs": [],
    "attrsFormat":"legacy"
  },
  "expires": "2040-01-01T14:00:00.00Z",
  "throttling": 5
}

fiware-service 和 fiware-servicepath 使用的头文件是:

固件服务:tese

Fiware-servicepath: /iot

实体数据存储在 orion-tese 中。我有收藏:entities

{
        "_id" : {
                "id" : "Tank1",
                "type" : "Tank",
                "servicePath" : "/iot"
        },
        "attrNames" : [
                "temperature"
        ],
        "attrs" : {
                "temperature" : {
                        "value" : 0.333,
                        "type" : "Float",
                        "mdNames" : [ ],
                        "creDate" : 1594334464,
                        "modDate" : 1594337770
                }
        },
        "creDate" : 1594334464,
        "modDate" : 1594337771,
        "lastCorrelator" : "f86d0d74-c23c-11ea-9c82-0242ac1c0005"
}

原始数据和汇总数据存储在 sth_tese 中。 我有收藏:

sth_/iot_Tank1_Tank.aggr

sth_/iot_Tank1_Tank

sth_/iot_Tank1_Tank原始数据在mongoDB中:

{
        "_id" : ObjectId("5f079d0369591c06b0fc981a"),
        "temperature" : 279,
        "recvTime" : ISODate("2020-07-09T22:41:05.670Z")
}
{
        "_id" : ObjectId("5f07a9eb69591c06b0fc981b"),
        "temperature" : 0.333,
        "recvTime" : ISODate("2020-07-09T23:36:11.160Z")
}

当我跑步时:http://localhost:8666/STH/v1/contextEntities/type/Tank/id/Tank1/attributes/temperature?aggrMethod=sum&aggrPeriod=minute

http://localhost:8666/STH/v2/entities/Tank1/attrs/temperature?type=Tank&aggrMethod=sum&aggrPeriod=minute

我得到了结果:"sum": 279"sum": 0.333。我可以恢复所有的聚合数据,max、min、sum、sum2。

当我尝试检索原始数据时,困难在于 STH-Comet,返回码为 200,返回值为空。

我已尝试使用 API v1 和 v2,但无济于事。

v2 请求:

http://sth:8666/STH/v2/entities/Tank1/attrs/temperature?type=Tank&lastN=10

返回

{
  "type": "StructuredValue",
  "value": []
}

v1 请求:

http://sth:8666/STH/v1/contextEntities/type/Tank/id/Tank1/attributes/temperature?lastN=10

返回

{
  "contextResponses": [{
    "contextElement": {
      "attributes": [{
        "name": "temperature",
        "values": []
      }],
      "id": "Tank1",
      "isPattern": false,
      "type": "Tank"
    },
    "statusCode": {
      "code": "200",
      "reasonPhrase": "OK"
    }
  }]
}

STH-Comet 日志显示它在线并连接到正确的数据库:

time=2020-07-09T22:39:06.698Z | lvl=INFO | corr=n/a | trans=n/a | op=OPER_STH_DB_CONN_OPEN | from=n/a | srv=n/a | subsrv=n/a | comp=STH | msg=Establishing connection to the database at mongodb://@mongo:27017/sth_tese
time=2020-07-09T22:39:06.879Z | lvl=INFO | corr=n/a | trans=n/a | op=OPER_STH_DB_CONN_OPEN | from=n/a | srv=n/a | subsrv=n/a | comp=STH | msg=Connection successfully established to the database at mongodb://@mongo:27017/sth_tese
time=2020-07-09T22:39:07.218Z | lvl=INFO | corr=n/a | trans=n/a | op=OPER_STH_SERVER_START | from=n/a | srv=n/a | subsrv=n/a | comp=STH | msg=Server started at http://0.0.0.0:8666

带有 api v2 请求的 STH-Comet 日志:

time=2020-07-09T23:46:47.400Z | lvl=DEBUG | corr=998811d9-fac2-4701-b37c-bb9ae1b45b81 | trans=998811d9-fac2-4701-b37c-bb9ae1b45b81 | op=OPER_STH_GET | from=n/a | srv=tese | subsrv=/iot | comp=STH | msg=GET /STH/v2/entities/Tank1/attrs/temperature?type=Tank&lastN=10
time=2020-07-09T23:46:47.404Z | lvl=DEBUG | corr=998811d9-fac2-4701-b37c-bb9ae1b45b81 | trans=998811d9-fac2-4701-b37c-bb9ae1b45b81 | op=OPER_STH_GET | from=n/a | srv=tese | subsrv=/iot | comp=STH | msg=Getting access to the raw data collection for retrieval...
time=2020-07-09T23:46:47.408Z | lvl=DEBUG | corr=998811d9-fac2-4701-b37c-bb9ae1b45b81 | trans=998811d9-fac2-4701-b37c-bb9ae1b45b81 | op=OPER_STH_GET | from=n/a | srv=tese | subsrv=/iot | comp=STH | msg=The raw data collection for retrieval exists
time=2020-07-09T23:46:47.412Z | lvl=DEBUG | corr=998811d9-fac2-4701-b37c-bb9ae1b45b81 | trans=998811d9-fac2-4701-b37c-bb9ae1b45b81 | op=OPER_STH_GET | from=n/a | srv=tese | subsrv=/iot | comp=STH | msg=No raw data available for the request: /STH/v2/entities/Tank1/attrs/temperature?type=Tank&lastN=10
time=2020-07-09T23:46:47.412Z | lvl=DEBUG | corr=998811d9-fac2-4701-b37c-bb9ae1b45b81 | trans=998811d9-fac2-4701-b37c-bb9ae1b45b81 | op=OPER_STH_GET | from=n/a | srv=tese | subsrv=/iot | comp=STH | msg=Responding with no points

根据日志,它建立连接以恢复原始数据:msg=Getting access to the raw data collection for retrieval...。确认原始数据存在:msg=The raw data collection for retrieval exists。但是,它无法恢复此数据并生成原始数据不可用且不返回任何点的消息:msg=No raw data available for the requestmsg=Responding with no points

我已经阅读了文档中的配置部分。我已经重新安装了所有东西,好几次。我梳理了所有设置,但找不到任何可以证明这个问题的理由。

可能是什么? 有 STH-Comet 专业知识的人可以提供任何指导吗?

谢谢!

【问题讨论】:

  • 问题:如果您根据日期范围进行查询(而不是使用 lastN),它的行为如何?它有效还是问题相同?
  • 是的,和我用的一样:http://sth:8666/STH/v1/contextEntities/type/Tank/id/Tank1/attributes/pressure?hLimit=3&hOffset=0&dateFrom=2020-06-11T13:00:00.000Z&dateTo=2020-06-11T15:59:59.999Z 返回:{ "contextResponses": [{ "contextElement": { "attributes": [{ "name": "pressure", "values": [] }], "id": "Tank1", "isPattern": false, "type": "Tank" }, "statusCode": { "code": "200", "reasonPhrase": "OK" } }] }
  • 您在 STH 请求中使用了哪些 fiware-service 和 fiware-servicepath 标头?
  • @fgalan Fiware-service: iotFiware-servicepath: /
  • 有没有人解决过这个问题并得到了解决方案?

标签: fiware-orion fiware-cygnus fiware-sth-comet


【解决方案1】:

有时 STH 尝试恢复信息的方式与 Cygnus 存储信息的方式不匹配。但是,这里的情况并非如此。 STH 使用的数据模型配置为config.database.dataModel,它似乎是正确的:collection-per-entity(因为你有像sth_/iot_Tank1_Tank 这样的集合,它对应于单个实体,即具有 id Tank1 和类型 Tank 的那个)。

假设 config.js 中的设置没有被DATA_MODEL env var 覆盖(尽管检查这一点是明智的,查看 env vars 实际上被注入到运行 STH 的 docker 容器中,我猜想 docker inspect ) 我认为我们可以继续调试的唯一方法是检查在 MongoDB 上执行 STH 的哪个实际查询以 No raw data available for the request 结尾。

MongoDB 有a profiler 允许记录在数据库中完成的每个查询。因此程序如下:

  1. 避免(或尽量减少)对 MongoDB 实例的任何其他使用,以避免分析器记录的信息中出现“噪音”
  2. 以“所有查询”模式启动分析器(即分析级别 2)
  3. 在 STH API 上进行查询
  4. 停止分析器
  5. 根据第 3 步中完成的请求检查分析器记录的查询

解释 MongoDB 分析器的用法超出了此答案的范围,但如果您还不知道,我上面提供的参考资料是一个很好的起点。

获得有关查询的信息后,请以 cmets 的身份提供对此答案的反馈。谢谢!

【讨论】:

  • "executionTimeMillisEstimate" : 0, "works" : 4, "advanced" : 0, "needTime" : 3, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "invalidates" : 0, "direction" : "forward", "docsExamined" : 2 } } } }, "ts" : ISODate("2020-07-28T17:14:34.632Z"), "client" : "172.27.0.7", "allUsers" : [ ], "user" : "" }
  • 您建议的步骤摘要。
  • 恐怕有点难以阅读...我建议使用pastebin.com 之类的工具提供您的反馈,(包括指向您的文档的链接作为评论在这里。尝试以结构化的方式进行报告(即“当我执行此请求 X 时,我在分析器中得到此 Y”)并使用一些更漂亮的工具(例如 jsonlint.com)来格式化 JSON 片段。谢谢!
  • 您好@fgalan,每个 STH 配置都已经过验证并且 DATA_MODEL 是正确的。命令:docker inspect sth 在 STH-Comet 容器中执行。结果可见:[pastebin.com/w4bgUGZR].
  • MongoDB 使用以下命令为类型 2 配置文件配置:db.setProfilingLevel (2)。然后,在 STH-Comet 使用 api v1 进行了查询。然后探查器停止。咨询结果见:[pastebin.com/i6SJP9Bh].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 2019-08-18
相关资源
最近更新 更多