kibanna搜索规则
- 语法关键字
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
如果所要查询的查询词中本身包含关键字,则需要用\进行转义
- 查询词(Term)
在搜索框搜索balance, cert_no。包含balance 或者 cert_no 都会搜索到
用引号包裹起来"balance, cert_no"表示精确搜索
- 查询域(Field)
在搜索框中输入 appName:"mortgage-service"
- 通配符查询(Wildcard)
支持两种通配符:?表示一个字符,*表示多个字符。
在搜索框中输入 cha*name
- 模糊查询(Fuzzy)
quikc~ brwn~ foks~
- 临近查询(Proximity)
在搜索框中输入 "order by asc" ~2 表示这三个单子之间的距离不超过2
"order by create_time asc LIMIT" 可以被搜索到
- 区间查询(Range)
区间查询包含两种,一种是包含边界,用[A TO B]指定,一种是不包含边界,用{A TO B}指定。
bytes[1000 TO 10000] bytes:>100000
- 增加一个查询词的权重(Boost)
可以在查询词后面加^N来设定此查询词的权重,默认是1,如果N大于1,
则说明此查询词更重要,如果N小于1,则说明此查询词更不重要
例:(图片^2 执行) 包含图片的文档会排在前面
- 布尔操作符
quick brown +fox -news
fox是必须存在的
news是必须不包含的
quick and brown 是可选的 空格表示或的意思
- 组合
(quick OR brown) AND fox
status:(active OR pending) title:(full text search)^2
elasticsearch搜索
-
介绍
DSL.png
- 检索一月10号, 外微nginx日志中响应时间超过5秒的
- sql写法
select * from waiwei_nginx where request_time >5 and (datetime > 1515542400000 and datetime < 1515628800000)
- kibanna简短写法
request_time:>5 AND @timestamp:>1515542400000
- elasticsearch query DSL
- sql写法
GET /nginx-app-wechat_waiwei-*/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"request_time": {
"gt": 5
}
}
},
{
"range": {
"@timestamp": {
"gt": 1515542400000,
"lt": 1515628800000
}
}
}
]
}
}
}
- 检索一月10号,外微nginx日志中响应时间超过3秒的url,并统计每个url出现的次数
- sql写法
select count(*),url from waiwei_nginx where request_time >5 and datetime > 1515542400000 and datetime < 1515628800000 group by url
- elasticsearch query DSL
- sql写法
GET /nginx-app-wechat_waiwei-2018.01.10/_search
{
"size": 0,
"query": {
"bool": {
"filter": {
"range": {
"request_time": {
"gte": 5
}
}
}
}
},
"aggs": {
"url": {
"terms": {
"field": "url.keyword"
}
}
}
}
- 求外微nginx日志中每个url的平均耗时和调用次数以及响应码的占比,按平均时间排序取前5条
- sql 写法
select AVG( request_time) as avg_request_time,count(status),url,status from waiwei_nginx GROUP BY url,status order by avg_request_time LIMIT 5
- elasticsearch query DSL
- sql 写法
GET /nginx-app-wechat_waiwei-*/_search
{
"size": 0,
"aggs": {
"url": {
"terms": {
"field": "url.keyword",
"size":"5",
"order": {
"avg_request_time": "desc"
}
},
"aggs": {
"avg_request_time": {
"avg": {
"field": "request_time"
}
},
"status":{
"terms": {
"field": "status"
}
}
}
}
}
}
elk 部署
- 准备三个节点 elk1、elk2、elk3
1. docker-machine create --engine-registry-mirror=https://7os77co8.mirror.aliyuncs.com \
--driver generic \
--generic-ip-address=10.33.80.122 \
--generic-ssh-key ~/.ssh/id_rsa \
elk1
2. docker-machine create --engine-registry-mirror=https://7os77co8.mirror.aliyuncs.com \
--driver generic \
--generic-ip-address=10.33.80.123 \
--generic-ssh-key ~/.ssh/id_rsa \
elk2
3. docker-machine create --engine-registry-mirror=https://7os77co8.mirror.aliyuncs.com \
--driver generic \
--generic-ip-address=10.33.80.124 \
--generic-ssh-key ~/.ssh/id_rsa \
elk3
- 准备elk环境
1. docker-machine ssh elk1 "sysctl -w vm.max_map_count=262144"
2. docker-machine ssh elk1 "echo 'vm.max_map_count=262144' >> /etc/sysctl.conf"
3. docker-machine ssh elk1 "echo '* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
* soft memlock unlimited
* hard memlock unlimited' >> /etc/security/limits.conf"
4. docker-machine ssh elk1 "sudo swapoff -a" (永久关闭交换内存则需要修改/etc/fstab)
5. docker-machine ssh elk2、elk3也执行上述步骤。
- 准备swarm环境
1. docker-machine ssh elk1 "docker swarm init"
2. docker-machine ssh elk2 "docker swarm join --token SWMTKN-1-************************ IP(elk1的IP)"
3. docker-machine ssh elk3 "docker swarm join --token SWMTKN-1-************************ IP(elk1的IP)"
4. docker-machine ssh elk1 "firewall-cmd --permanent --zone=public --add-port=5601/tcp --add-port=9200/tcp --add-port=9300/tcp --add-port=5044/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent && firewall-cmd --reload"
5. docker-machine ssh elk2 "firewall-cmd --permanent --zone=public --add-port=5601/tcp --add-port=9200/tcp --add-port=9300/tcp --add-port=5044/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent && firewall-cmd --reload"
6. docker-machine ssh elk3 "firewall-cmd --permanent --zone=public --add-port=5601/tcp --add-port=9200/tcp --add-port=9300/tcp --add-port=5044/tcp --add-port=7946/tcp --add-port=7946/udp --add-port=4789/udp --permanent && firewall-cmd --reload"
备注:5601是kibana端口、9200是elasticsearch的端口、5044是beat接收日志的端口、7946与4789是swarm服务发现的端口
- 准备启动
1. eval $(docker-machine env elk1)
2. docker node update --label-add logstash=logstash elk2 && docker node update --label-add logstash=logstash elk3
备注: 有logstash标签的节点才会接受logstash服务
3. docker node update --label-add elasticsearch=elasticsearch elk1 && \
docker node update --label-add elasticsearch=elasticsearch elk2 && \
docker node update --label-add elasticsearch=elasticsearch elk3
备注: 有elasticsearch标签的节点才会接受elasticsearch服务
4. git clone https://github.com/yangzhenwei-java/docker-swarm-elk.git
5. cd docker-swarm-elk && docker stack deploy -c docker-compose.yml elk
6. docker run --name filebeat -v /root/logs:/usr/share/filebeat/logs registry.cn-beijing.aliyuncs.com/yangzhenwei/filebeat:6.1.0
备注:当前docker-machine的默认控制节点是elk1, 执行eval $(docker-machine env --unset)去除控制
- 备注:
1. registry.cn-beijing.aliyuncs.com/yangzhenwei/elasticsearch 只是为了加速下载镜像,
没有做别的改动。官方的镜像如docker.elastic.co/elasticsearch/elasticsearch:6.1.0 下载太慢了。
2. 收集tomcat的日志格式如下
<pattern> %d^|^%contextName^|^%X{requestId}^|^%level^|^%c{1.}^|^%t^|^%m%n</pattern>
3. 收集nginx的日志格式如下
log_format json '{"datetime":"$time_local",'
'"clientip":"$remote_addr",'
'"ident":"$remote_user",'
'"http_host":"$host",'
'"method":"$request_method",'
'"url":"$uri",'
'"status":$status,'
'"bytes":$body_bytes_sent,'
'"referrer":"$http_referer",'
'"agent":"$http_user_agent",'
'"x_forwarded_for":"$http_x_forwarded_for",'
'"appName":"$app_name",'
'"upstream_addr":"$upstream_addr",'
'"upstream_response_time":"$upstream_response_time",'
'"request_time":$request_time}';
网友评论