3 快速入门

Posted 大军001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3 快速入门相关的知识,希望对你有一定的参考价值。

这个手册帮助初学者如何开始:

  • 在测试环境安装和运行ES
  • 添加数据到ES
  • 查询和排序数据
  • 在查询期间从非结构内容中抽取字段

运行ES

安装ES最简单的方式是在Elastic云上使用ES服务创建一个管理部署。如果你更喜欢管理你自己的测试环境,你可以使用Docker安装和运行ES。

ES服务方式

1.Get a free trial

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联系,你需要你的集群的断电:

  1. 打开kibana的主菜单,然后点击Manage this deployment
  2. 来自你的部署菜单,到Elasticsearch页,点击Copy endpoint
  3. 去提交一个实例的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 快速入门的主要内容,如果未能解决你的问题,请参考以下文章

session

Session January 27,2020

Python一小时快速入门

云计算快速入门,云计算标准组织特性有哪些?

Guzzle 的快速入门

手把手教你快速入门知识图谱 - Neo4J教程