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