定义DSL
官方文档:https://www.elastic.co/guide/en/kibana/7.14/api.html
- elasticsearch 提供了基于json的完整query DSL (domain specifc languge领域特定语言)来定义查询
查看es的全部索引信息及表头
GET http://10.11.0.1:9200/_cat/indices?v
查看单个索引信息
GET http://10.11.0.1:9200/ingress_access_2022.11.22
全文检索-match查询
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"match": {
"upstream_status": 500
}
}
}
#查询状态码为500的
完全匹配-match_phrse查询
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"match_phrase": {
"env_name": "test"
}
}
}
#查询环境名为test精确查找
全量查询-match_all
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"match_all": {}
}
}
分页查询
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"match_all": {}
}
"size": 7
"from": 28
}
#size:每页显示多少条数据默认值为10
#from:指定跳过数据偏移量的大小,默认为0,默认看第一页
查询指定页码的from值=(页码 - 1)* 每页数据大小
查看对象的指定字段
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"match_all": {}
},
"_source": ["status","uri"]
}
"_source"用于查看返回指定的字段
查询包含指定字段的文档
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"exists": {
"field": "env_name"
}
}
}
#exists:判断字段是否存在,若存在返回改文档,若不存在不返回
基于字段进行排序sort
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"match_all": {}
},
"sort": {
"bytes_sent": {
"order": "asc"
}
}
}
#sort 基于指定的字段进行排序,此处为:"bytes_sent";针对_source来进行排序
order 指定排序规则asc升序;desc降序
多条件查询-bool
#布尔查询可以匹配多个条件查询:"must"(必须是) , "must_not"(不是) , "should" (条件满足其一即可),
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"status": 500
}
},
{
"match": {
"env_id": "kiku.cn"
}
}
]
}
}
}
#布尔值查询区条件区间range基于范围进行过滤:
gt:大于
lt:小于
gte:大于等于
lte:小于等于
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"bool": {
"filter": {
"range":{
"status":{
"gt": 500,
"lt": 600
}
}
}
}
}
}
##综合环境为dev4.everjiankang.cn,状态500-600之间
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"env_id": "kiku.cn"
}
}
],
"filter": {
"range":{
"status":{
"gt": 500,
"lt": 600
}
}
}
}
}
}
精确匹配值查询
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"query": {
"terms": {
"status": [
500,
504
]
}
}
}
#精确匹配数字,布尔值等。match是全文检索
聚合查询
POST http://10.11.0.1:9200/ingress_access_2022.11.22/_search
{
"aggs": {
"uri": {
"terms":{
"field": "uri.keyword"
}
}
},
"size": 0
}
基于uri进行聚合
基于uri.keyword进行分组
#"terms"基于什么进行分组
#"max"基于什么取最大值
#"min"统计最小值的
#"avg"统计平均值
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"env_id": "kiku.cn"
}
}
],
"filter": {
"range":{
"status":{
"gte": 500,
"lt": 600
}
}
}
}
},
"aggs": {
"uri": {
"terms":{
"field": "uri.keyword"
"size": 200
}
}
},
"size": 0
}
正则表达式用法
https://www.elastic.co/guide/en/elasticsearch/reference/7.14/query-dsl-regexp-query.html
把5xx数据发送到企业微信
企业微信参考官网:https://developer.work.weixin.qq.com/document/path/91770
#通过es的api接口查询前一天5xx访问情况
upload_file=`5xx_log`.csv
##取除数据
make_info() {
##设置每天的日志变量
year=`date -d last-day +%Y`
month=`date -d last-day +%m`
date=`date -d last-day +%d`
##需要统计的es集群的ip文件
ip=`cat es-ip.txt`
#把个各集群的数据请求集合到log.txt中
for i in $ip
do
curl --location --request POST --X POST http://$i:9200/nginx_${year}.${month}.${date}/_search \
--header 'User-Agent: Apipost client Runtime/+https://www.apipost.cn/' \
--header 'Content-Type: application/json' \
--data '{
"query": {
"bool": {
"filter": {
"range":{
"status":{
"gte": 500,
"lt": 600
}
}
}
}
},
"aggs": {
"uri": {
"terms":{
"field": "uri.keyword",
"size": 200
}
}
},
"size": 100
}'>> log.txt
done
##把json格式变成txt输出
cat log.txt|jq '.aggregations.uri.buckets[]|.key,.doc_count'|sed -n "N;s/\n/ /p"|awk -F '"' '{print $2","$3}'|grep -E '^/api'|column -t > $upload_file
##删除json格式的文档
rm -f log.txt
}
#往微信中发送消息
sent_wechat() {
##机器人信息
url="https://qyapi.weixin.qq.com/cgi-bin/webhook"
key="机器人的key"
# post 参数
upload="-H 'Content-Type:multipart/form-data' -F 'filename=@$upload_file;type=application/octet-stream' $url/upload_media?key=$key&type=file"
# 获取临时素材id
media_id=`curl -s -X POST $upload|jq -r .media_id`
###发送
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='$key'' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "file",
"file": {
"media_id": "'$media_id'"
}
}'
}
make_info
sent_wechat