elasticsearch 带Elasticsearch的Grafana-按平均值设置组时不显示数据,elasticsearch,logstash,grafana,fluentd,elasticsearch,Logstash,Grafana,Fluentd" /> elasticsearch 带Elasticsearch的Grafana-按平均值设置组时不显示数据,elasticsearch,logstash,grafana,fluentd,elasticsearch,Logstash,Grafana,Fluentd" />

elasticsearch 带Elasticsearch的Grafana-按平均值设置组时不显示数据

elasticsearch 带Elasticsearch的Grafana-按平均值设置组时不显示数据,elasticsearch,logstash,grafana,fluentd,elasticsearch,Logstash,Grafana,Fluentd,使用Grafana 7.2和Elasticsearch 7.5.1 在Openshift中,一切都已启动并运行。Elasticsearch数据源配置正确,并创建了一个非常简单的仪表板 从Openshift中运行的Springboot服务中,我使用Fluentd向Elasticsearch发送日志 Elasticsearch中存储的文档如下所示(取自Grafana“日志”结果面板): 编辑:根据@karan shah的建议,我添加了通过Fluentd发送给Elastichsearch的原始日志:

使用Grafana 7.2和Elasticsearch 7.5.1

在Openshift中,一切都已启动并运行。Elasticsearch数据源配置正确,并创建了一个非常简单的仪表板

从Openshift中运行的Springboot服务中,我使用Fluentd向Elasticsearch发送日志

Elasticsearch中存储的文档如下所示(取自Grafana“日志”结果面板):

编辑:根据@karan shah的建议,我添加了通过Fluentd发送给Elastichsearch的原始日志:

{
   "onpay":{
      "traceId":"9999",
      "inout":"OUT",
      "startTime":"2020-10-01T10:13:43.806+0200",
      "finishTime":"2020-10-01T10:13:43.827+0200",
      "executionTime":21.0,
      "entrySize":124.0,
      "exitSize":124.0,
      "differenceSize":0.0,
      "user":"pgallello",
      "methodPath":"http://localhost:8083/api/serviceEntryPoint",
      "errorMessage":null,
      "className":"com.myorganization.mypackage.MyController",
      "methodName":"serviceTemplateEntryPoint"
   }
}
这是一个Elasticsearch文档,其中包含一个字段“message”,这是我希望将仪表板置于其中的字段。 注意两点:

  • 该字段以红色标注:执行时间
  • 字段_源只有一个[object]值
问题1:

我需要做的(我没有得到)是棘手的部分:我需要得到一个直方图,显示每个间隔的executionTime字段值的平均值

特别是在官方文档之后,我应该能够将de Group By field更改为Average,并从字段选择器中选择@value。不幸的是,@value-value没有出现在那里(可能是
\u source=[object object]
字段有什么事要做吗?)

问题2:

另一个疑问是查询字段是否以该格式有效,或者访问Elasticsearch文档中消息字段中的executionTime字段的方式是什么。在某种层次结构中
message->onpay->executionTime

Fluentd配置文件:

  <source>
    @type forward
    port 24224
    bind "0.0.0.0"
  </source>
  <filter onpayapp.**>
    @type parser
    key_name "onpayapp"
    reserve_data true
    <parse>
      @type "json"
    </parse>
  </filter>
  <match onpay.**>
    @type copy
    <store>
      @type "elasticsearch"
      host "elasticdb"
      port 9200
      logstash_format true
      logstash_prefix "applogs"
      logstash_dateformat "%Y%m%d"
      include_tag_key true
      type_name "app_log"
      tag_key "@log_name"
      flush_interval 1s
      <parse>
        @type json
      </parse>
      <buffer>
        flush_interval 1s
      </buffer>
    </store>
    <store>
      @type "stdout"
    </store>
  </match>

@打字前进
端口24224
绑定“0.0.0.0”
@类型分析器
密钥名称“onpayapp”
保留数据为真
@键入“json”
@打印副本
@键入“elasticsearch”
主机“elasticdb”
端口9200
logstash_格式为true
logstash_前缀“applogs”
日志存储格式“%Y%m%d”
包含标记键为真
键入名称“应用程序日志”
标记键“@log\u name”
冲洗间隔1s
@类型json
冲洗间隔1s
@类型“stdout”

当前,消息字段中包含整个json字符串。所以Elastic无法对其应用任何数学运算。您需要做的是使用fluentd将日志行解析为json,这样在弹性文档中,json中的每个字段(如logger和level)都是弹性文档的一部分。 一旦你有了这个弹性,你就会自动地解释executionTime是一个数字,并使它可以用于聚合。之后,您将在Grafana下拉列表中看到该字段

您可以了解有关_源字段的更多信息

将您的原始日志行也添加到问题中,我认为这可能有助于理解您想要摄取的内容,以便对可能的fluentd配置提出建议

根据提供的其他信息更新答案

为了简单起见,我使用docker设置来运行和解析问题中提供的日志模式

Fluentd配置

我使用了HTTP输入,所以它允许我卷曲,但您可以切换回转发器。 我已经删除了过滤器,因为我假设您的源代码已经是JSON,所以您不需要将其解析为JSON。 如果通过管道处理了多种类型的数据,则可以重新添加匹配模式

 <source>
    @type http
    port 9880
    bind 0.0.0.0
  </source>
  <match *>
    @type copy
    <store>
      @type "elasticsearch"
      host "es01"
      port 9200
      logstash_format true
      logstash_prefix "applogs"
      logstash_dateformat "%Y%m%d"
      include_tag_key true
      type_name "app_log"
      tag_key "@log_name"
      flush_interval 1s
      <parse>
        @type json
      </parse>
      <buffer>
        flush_interval 1s
      </buffer>
    </store>
    <store>
      @type "stdout"
    </store>
  </match>
Docker Compose 您可以选择只运行elasticsearch的一个节点。我已经运行了这个安装程序

services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
    healthcheck:
      interval: 20s
      retries: 10
      test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"'

  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    ports:
      - 9201:9200
    networks:
      - elastic
    healthcheck:
      interval: 20s
      retries: 10
      test: curl -s http://localhost:9201/_cluster/health | grep -vq '"status":"red"'

  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    ports:
      - 9202:9200
    networks:
      - elastic
    healthcheck:
      interval: 20s
      retries: 10
      test: curl -s http://localhost:9202/_cluster/health | grep -vq '"status":"red"'

  kib01:
    image: docker.elastic.co/kibana/kibana:7.8.0
    container_name: kib01
    ports:
      - 5601:5601
    environment:
      ELASTICSEARCH_URL: http://es01:9200
      ELASTICSEARCH_HOSTS: http://es01:9200
    networks:
      - elastic
    healthcheck:
      interval: 10s
      retries: 20
      test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://localhost:5601/api/status
  
  fluentd:
    build: ./fluentd
    volumes:
      - "./fluentd/conf/:/fluentd/etc/:ro"
    networks:
      - elastic
    ports:
      - "9880:9880"

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge
测试卷曲

curl -X POST -d 'json={    "onpay": {        "traceId": "9999",        "inout": "OUT",        "startTime": "2020-10-01T10:13:43.806+0200",        "finishTime": "2020-10-01T10:13:43.827+0200",        "executionTime": 21.0,        "entrySize": 124.0,        "exitSize": 124.0,        "differenceSize": 0.0,        "user": "pgallello",        "methodPath": "http://localhost:8083/api/serviceEntryPoint",        "errorMessage": null,        "className": "com.myorganization.mypackage.MyController",        "methodName": "serviceTemplateEntryPoint"    }}' http://localhost:9880/
弹性搜索结果


一旦您像这样摄取了所有json密钥,Elastic将自动映射大多数字段,并允许基于字段类型进行搜索、聚合等。如果需要,您可以从kibana index management更改字段类型和格式。

谢谢您的回答,@karan。刚刚用原始日志行编辑了问题。为了确保这一点,有一个问题:你的前两段确实回答了两个不同的问题,对吗?第一个指向解决方案,第二个正好回答了我所说的关于_source字段的问题。但主要问题的解决方案将包含在你的主要解释(第一段)中,对吗?现在弄清楚如何在Fluentd中配置,以使我的邮件中的字段成为主要Elasticsearch文档fieldsYes@Eipter第一点回答了您的主要问题第二点只是从理解的角度。查看您的源日志,我认为这只是关于通过fluentd正确摄取的信息。根据您这样做的方式,您可以在弹性文档中获得
onpay.executionTime
executionTime
,之后可以从Grafana访问该文档。非常感谢。相信我,我正在阅读大量关于如何告诉Fluentd在我的弹性文件中获得执行时间的官方文件。但仍然没有得到:(.我会继续尝试…但是如果你有线索,我将非常感激:)你能分享你的fluentd配置吗。我已经在docker中进行了弹性设置,将旋转一个fluentd容器,看看是否可以帮助您确定确切的配置。嗨,我已经稍微简化了配置文件,删除了一些不必要的字段。不管怎样,结果还是一样:(.有什么线索吗?谢谢!!
curl -X POST -d 'json={    "onpay": {        "traceId": "9999",        "inout": "OUT",        "startTime": "2020-10-01T10:13:43.806+0200",        "finishTime": "2020-10-01T10:13:43.827+0200",        "executionTime": 21.0,        "entrySize": 124.0,        "exitSize": 124.0,        "differenceSize": 0.0,        "user": "pgallello",        "methodPath": "http://localhost:8083/api/serviceEntryPoint",        "errorMessage": null,        "className": "com.myorganization.mypackage.MyController",        "methodName": "serviceTemplateEntryPoint"    }}' http://localhost:9880/