这个文档可以帮助新手学习:
- 在测试环境中安装并运行Elasticsearch
- 向Elasticsearch中增加数据
- 搜索和排序数据
- 在搜索中提取凌乱文档的字段
第一步:运行Elasticsearch
快速搭建Elasticsearch方式是在Elastic Cloud上创建一个可管理的Elasticsearch服务(要钱!)。如果你偏爱管理自己的测试环境,可以用Docker运行Elasticsearch。
安装和运行Elasticsearch
1.安装和运行Docker Desktop
2.运行命令:
docker network create elasticdocker pull docker.elastic.co/elasticsearch/elasticsearch:7.14.0docker run --name es01-test --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.14.0
安装和运行Kibana
安装Kibana进行界面交互来分析、可视化、管理你的数据。
1.在新的命令控制台,运行:
docker pull docker.elastic.co/kibana/kibana:7.14.0docker run --name kib01-test --net elastic -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://es01-test:9200" docker.elastic.co/kibana/kibana:7.14.0
2.访问Kibana,http://localhost:5601
第二步:向Elasticsearch发送请求
使用REST API来向Elasticsearch发送数据和请求。你可以使用发送HTTP请求来与Elasticsearch交互,列如curl。你也可以使用Kibana的控制台向Elasticsearch发送请求。
使用curl
在新的控制台运行下面的curl命令来提交一个简单的API请求。
curl -X GET http://localhost:9200/
使用Kibana
1.打开Kibana,找到菜单Dev Tools > Console
2.在控制台中运行下面的API请求GET /
第三步:添加数据
按照JSON格式向Elasticsearch添加的数据叫做文档,Elasticsearch把这些文档存储在可被搜索的索引中。
对于时间序列化数据,通常将文档添加到由多个自动生成的backing indices(索引)组成的数据流中。
数据流需要一个匹配它名字的索引模板。Elasticsearch用这个模板来配置流式的backing indices。发送到数据流中的文档必须有一个@timestamp字段。
添加单个文档
提交下面的索引请求来添加单个的日志到logs-my_app-default数据流中。因为logs-my_app-default不存在,这个请求会使用logs--索引模板自动创建它。
POST logs-my_app-default/_doc{"@timestamp": "2099-05-06T16:21:15.000Z","event": {"original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"}}
对应的返回数据会包含Elasticsearch为这个文档生成的元数据信息。
- 返回的_index包含了该文档,Elasticsearch自动生成了索引的名字。
- 该索引下唯一的id
添加多个文档{"_index": ".ds-logs-my_app-default-2099-05-06-000001","_type": "_doc","_id": "gl5MJXMBMk1dGnErnBW8","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1}
在一个请求中使用_bulk端点来添加多个文档。海量数据必须用换行来分割每一个JSON。每一行必须以换行符(\n)结束,包括最后一行也是。
PUT logs-my_app-default/_bulk{ "create": { } }{ "@timestamp": "2099-05-07T16:24:32.000Z", "event": { "original": "192.0.2.242 - - [07/May/2020:16:24:32 -0500] \"GET /images/hm_nbg.jpg HTTP/1.0\" 304 0" } }{ "create": { } }{ "@timestamp": "2099-05-08T16:25:42.000Z", "event": { "original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" } }
第四步:搜索数据
文档被索引后几乎立刻就可以被搜索到。下面的搜索请求搜索在logs-my_app-default中所有匹配的数据,并且以@timestamp倒叙排序。
GET logs-my_app-default/_search{"query": {"match_all": { }},"sort": [{"@timestamp": "desc"}]}
一般情况下,返回的hits节点会包含10个匹配的数据。hit中的每个_source包含了提交时原始的json数据。
{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 3,"relation": "eq"},"max_score": null,"hits": [{"_index": ".ds-logs-my_app-default-2099-05-06-000001","_type": "_doc","_id": "PdjWongB9KPnaVm2IyaL","_score": null,"_source": {"@timestamp": "2099-05-08T16:25:42.000Z","event": {"original": "192.0.2.255 - - [08/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638"}},"sort": [4081940742000]},...]}}
获取指定的字段
解析大型文档的整个_source是非常笨重的。如果要从返回的响应中排除这种它,把_source参数设置为false。使用fields参数来检索你想要的字段。
GET logs-my_app-default/_search{"query": {"match_all": { }},"fields": ["@timestamp"],"_source": false,"sort": [{"@timestamp": "desc"}]}
返回的响应中,每个hit字段的field是一个简单数组。
{..."hits": {..."hits": [{"_index": ".ds-logs-my_app-default-2099-05-06-000001","_type": "_doc","_id": "PdjWongB9KPnaVm2IyaL","_score": null,"fields": {"@timestamp": ["2099-05-08T16:25:42.000Z"]},"sort": [4081940742000]},...]}}
搜索时间范围内数据
搜索时间段或者IP段的数据,使用range查询。
GET logs-my_app-default/_search{"query": {"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}},"fields": ["@timestamp"],"_source": false,"sort": [{"@timestamp": "desc"}]}
您可以使用日期数学来定义相对时间范围,下面的请求目的是搜索前一天的数据,因此在logs-my_app-default中没有数据匹配。
GET logs-my_app-default/_search{"query": {"range": {"@timestamp": {"gte": "now-1d/d","lt": "now/d"}}},"fields": ["@timestamp"],"_source": false,"sort": [{"@timestamp": "desc"}]}
从非结构化的数据中提取字段
你可以在搜索中从非结构化的数据中提取runtime字段,例如日志消息。
下面的搜索从从event.original提取了source.ip字段。在fields参数中添加source.ip,使得返回的响应中包含这些字段。
GET logs-my_app-default/_search{"runtime_mappings": {"source.ip": {"type": "ip","script": """String sourceip=grok('%{IPORHOST:sourceip} .*').extract(doc[ "event.original" ].value)?.sourceip;if (sourceip != null) emit(sourceip);"""}},"query": {"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}},"fields": ["@timestamp","source.ip"],"_source": false,"sort": [{"@timestamp": "desc"}]}
联合搜索
你可以使用bool查询来组合多个查询。下面的搜索示例组合了两个范围查询:一个使用@timestamp,另一个使用source.ip字段。
GET logs-my_app-default/_search{"runtime_mappings": {"source.ip": {"type": "ip","script": """String sourceip=grok('%{IPORHOST:sourceip} .*').extract(doc[ "event.original" ].value)?.sourceip;if (sourceip != null) emit(sourceip);"""}},"query": {"bool": {"filter": [{"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}},{"range": {"source.ip": {"gte": "192.0.2.0","lte": "192.0.2.240"}}}]}},"fields": ["@timestamp","source.ip"],"_source": false,"sort": [{"@timestamp": "desc"}]}
聚合数据
使用聚合来总结数据,例如指标,统计,分析。
下面的搜索使用聚合和http.response.body.bytes运行时字段来计算average_response_size。这个请求只会统计匹配的文档。
GET logs-my_app-default/_search{"runtime_mappings": {"http.response.body.bytes": {"type": "long","script": """String bytes=grok('%{COMMONAPACHELOG}').extract(doc[ "event.original" ].value)?.bytes;if (bytes != null) emit(Integer.parseInt(bytes));"""}},"aggs": {"average_response_size":{"avg": {"field": "http.response.body.bytes"}}},"query": {"bool": {"filter": [{"range": {"@timestamp": {"gte": "2099-05-05","lt": "2099-05-08"}}}]}},"fields": ["@timestamp","http.response.body.bytes"],"_source": false,"sort": [{"@timestamp": "desc"}]}
返回的aggregations对象包括了聚合的结果。
探索更多的选项
To keep exploring, index more data to your data stream and check out Common search options.
第五步:清除
当你结束后,删除你的测试数据流和索引。DELETE _data_stream/logs-my_app-default
你也可以删除你的测试部署。
停止你的Elasticsearch和Kibana Docker容器,运行:docker stop es01-testdocker stop kib01-test
移除容器和网络,运行:docker network rm elasticdocker rm es01-testdocker rm kib01-test
下一步?
- 通过设置数据层和ILM,最大限度地利用时间序列数据。有关时间序列数据,请参见使用Elasticsearch
- 使用Fleet和Elastic Agent来直接从你的数据源中收集日志和metrics并发送到Elasticsearch。详情见Fleet quick start guide。
- 使用Kibana来探索、可视化、和管理你的Elasticsearch数据。详情见Kibana quick start guide。
