3 快速入门
Posted 大军001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3 快速入门相关的知识,希望对你有一定的参考价值。
这个手册帮助初学者如何开始:
- 在测试环境安装和运行ES
- 添加数据到ES
- 查询和排序数据
- 在查询期间从非结构内容中抽取字段
运行ES
安装ES最简单的方式是在Elastic云上使用ES服务创建一个管理部署。如果你更喜欢管理你自己的测试环境,你可以使用Docker安装和运行ES。
ES服务方式
2.登录Elastic Cloud。
3.点击:Create deployment。
4.给你的部署一个名字。
5.点击 Create deployment ,以及下载elastic用户对应的这个密码。
6.点击Continue去打开Kibana。
7.点击Explore on my own。
自己管理方式
安装和运行ES:
1.安装和启动Docker Desktop。
2.运行:
docker network create elastic
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.1.2
docker run --name es-node01 --net elastic -p 9200:9200 -p 9300:9300 -it docker.elastic.co/elasticsearch/elasticsearch:8.1.2
当你第一次启动ES的时候,下面的安全配置将自动发生:
- 对于传输层和HTTP层,会生成Certificates and keys 。
- 这个传输层的安全(TLS)配置设置被写入到了elasticsearch.yml文件中。
- 对于elastic用户,一个密码被生成。
- 对于Kibana,一个登记的token被生成。
注意:在决定去看这个密码和登记的token,你可能需要往回回滚一点。
3.拷贝这个生成的密码和登记的token,在一个安全的位置保存他们。这些值只是在你第一次启动ES的时候显示。你将会使用他们去注册Kibana和你的ES集群并且登录。
注意:如果你需要重新设置elastic用户的密码或者其他的内置用户,运行elasticsearch-reset-password工具 。为了生成一个新的登记token,为了Kibana或者ES节点,运行elasticsearch-create-enrollment-token工具。这些工具在ES的bin目录下是可用的。
安装和运行Kibana
为了分析,可视化,以及管理ES数据,去使用一个简单的UI,安装Kibana。
1.在一个新的终端对话框里面,运行:
docker pull docker.elastic.co/kibana/kibana:8.1.2
docker run --name kib-01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.1.2
当你启动Kibana的时候,一个唯一的链接输出到你的终端。
2.为了访问Kibana,点击这个在你的终端里面生成的链接:
a.在你的浏览器里面,粘贴你拷贝的这个登记的token,并且点击这个按钮去用ES连接到你的Kibana实例上。
b.使用当你启动ES的时候生成的密码作为elastic用户登录到Kibana上。
发送请求到ES
你使用REST APIs发送数据和其他的请求到ES。这个就可以让你跟ES相互联系,使用任意的客户端去发送HTTP请求,例如curl。你也可以使用Kibana的控制台去发送请求给ES。
ES服务
使用Kibana
打开Kibana的主菜单并且到Dev Tools > Console。
2.在控制台运行下面的实例API请求:
使用curl
为了使用curl或者其他的客户端跟ES联系,你需要你的集群的断电:
- 打开kibana的主菜单,然后点击Manage this deployment。
- 来自你的部署菜单,到Elasticsearch页,点击Copy endpoint。
- 去提交一个实例的API请求,在一个新的终端回话中运行下面的curl命令。用elastic用户的密码代替<password>。用你的端点代替你的<elasticsearch_endpoint>。
curl -u elastic:<password> <elasticsearch_endpoint>/
自己管理
使用Kibana
1.打开kibana的主菜单,然后点击Manage this deployment。
2.在控制台运行下面的实例API请求:
使用curl
去提交一个实例API请求,在新的终端会话中运行下面的curl命令。
url -X GET http://localhost:9200/
添加数据
你添加数据到ES,作为称之为文档的JSON对象。ES在可查询的索引中存储这些文档。
对于时间序列数据,例如日志和指标数据,你一般添加文档到一个数据流中由多个自动生成的索引组成。
一个数据流需要一个索引模板去匹配它的名字。ES使用这个模板去配置这个流的背后的索引。文档发送数据流必须有一个@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"
这个响应包含了生成这个文档的元数据:
- 这个支持的_index包含了这个文档。ES自动生成了这个支持索引的名字。
- 在这个索引上对应的文档有一个唯一的_id。
"_index": ".ds-logs-my_app-default-2099-05-06-000001",
"_id": "gl5MJXMBMk1dGnErnBW8",
"_version": 1,
"result": "created",
"_shards":
"total": 2,
"successful": 1,
"failed": 0
,
"_seq_no": 0,
"_primary_term": 1
添加多个文档
在一个请求中使用_bulk去添加多个文档。批量数据必须以新行作为分隔JSON(NDJSON)。每一行必须以新行符(\\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个记录。每一个命中的_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",
"_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"
]
这个响应包含了每一个命中的字段的值,作为一个平面阵列。
...
"hits":
...
"hits": [
"_index": ".ds-logs-my_app-default-2099-05-06-000001",
"_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 fields,像在一个查询期间的日志信息。
使用下面的查询去抽取source.ip运行时字段从event.original。为了在响应中包含它,添加source.ip到fields参数中。
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查询去组合多个查询。下面的查询组合两个range查询。一个是在@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"
]
聚合数据
使用聚合去汇总数据,作为指标,统计,或者其他的分析。
下面的查询使用一个聚合去计算average_response_size,通过使用http.response.body.bytes运行时字段。这个聚合只是运行在匹配这个query的文档上。
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" :
"average_response_size" :
"value" : 12368.0
探索更多的查询选择
为了保持探索,索引更多的数据到你的数据流中,去检验Common search options。
清理
当你做完的时候,删除你的测试数据流和它的背后的索引。
DELETE _data_stream/logs-my_app-default
你也可以删除你的测试部署。
ES服务
在部署的页面点击Delete deployment,然后跟着提示往下走。
自己管理
去停止你的ES和Kibana的Docker容器,运行:
docker stop es-node01
docker stop kib-01
去移除他们的容器和网络,运行:
docker network rm elastic
docker rm es-node01
docker rm kib-01
接下来是什么
通过安装数据层和ILM,去更充分的得到你的时间序列数据。看Use Elasticsearch for time series data。
使用敏捷灵活的代理,直接从你的数据源去收集日志和指标数据,并且发送他们到ES。看这个 Ingest logs, metrics, and uptime data with Elastic Agent。
使用Kibana去探索,可视化,和管理你的ES数据。看这个Kibana quick start guide。
以上是关于3 快速入门的主要内容,如果未能解决你的问题,请参考以下文章