grafana with elasticsearch-按平均值设置组时不显示数据

oyxsuwqo  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(481)

使用grafana 7.2和elasticsearch 7.5.1。
一切都在openshift中启动和运行。elasticsearch数据源配置正确,并创建了一个非常简单的 Jmeter 板。
从同样在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”,这是我要将 Jmeter 板放在其中的字段。注意两点:
现场用红色表示:行刑时间。
字段源只有一个[object]值。
问题1:
我需要做的(我没有得到)是棘手的部分:我需要得到一个直方图,显示每个间隔的executiontime字段值的平均值。
遵循官方文档,特别是这个来自grafana的官方视频,我应该能够将de group by field更改为average,并从字段选择器中选择@value。不幸的是,@value没有出现在那里(可能 _source = [object Object] 有什么事吗?)

问题2:
另一个疑问是查询字段是否以这种格式有效,或者访问executiontime字段的方法是什么,executiontime字段位于elasticsearch文档的message字段中。在一种等级制度中 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>
nukf8bse

nukf8bse1#

目前,在消息字段中,整个json都是一个字符串。所以elastic不能对它进行任何数学运算。您需要做的是使用fluentd将日志行解析为json,这样在弹性文档中,json中的每个字段(如logger和level)都是弹性文档的一部分。一旦你有了这个弹性,你就可以自动解释executiontime是number,并使它可以用于聚合。在那之后,你将在你的grafana下拉列表中看到这个字段。
在这里,您可以了解有关源字段的更多信息。
把你原来的日志行也添加到这个问题中,我认为这可能有助于理解你想要摄取什么,以便对可能的fluentd配置提出建议。
根据提供的其他信息更新了答案
为了简单起见,我使用docker安装程序来运行和解析问题中提供的日志模式。
fluentd配置
我使用了http输入,所以它允许我 curl ,但您可以切换回转发器。我已经删除了过滤器,因为我假设您的源代码已经是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图像


# fluentd/Dockerfile

FROM fluent/fluentd:v1.11-debian-1

USER root

RUN touch ~/.gemrc
RUN echo ':ssl_verify_mode: 0' >> ~/.gemrc

RUN buildDeps="sudo make gcc g++ libc-dev" \
 && apt-get update \
 && apt-get install -y --no-install-recommends $buildDeps \
 && sudo gem install fluent-plugin-elasticsearch \
 && sudo gem sources --clear-all \
 && SUDO_FORCE_REMOVE=yes \
    apt-get purge -y --auto-remove \
                  -o APT::AutoRemove::RecommendsImportant=false \
                  $buildDeps \
 && rm -rf /var/lib/apt/lists/* \
 && rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

USER fluent

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 试验

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/

ElasticSearch结果

一旦你得到所有的json键,elastic将自动Map大多数字段,并允许根据字段类型进行搜索、聚合等。如果需要,可以从kibana索引管理更改字段类型和格式。

相关问题