我尝试在Kibana上将Shell的历史可视化
最初
当我在探索各种数据可视化的可能性时,我找到了一篇非常吸引人的文章。
- Vimでの作業をKibanaで可視化してみた
我对您开发一个插件以将Vim的度量指标投入到Elasticsearch中感到非常惊叹。
- ブラウザの閲覧履歴で人生の棚卸し(embulk + elasticsearch + kibanaで可視化)
如果有可以提取的历史数据,你会想要回顾一下的。
由于去年11月左右开始稍微接触了Embulk、Elasticsearch和Kibana,对它们的使用方法有了一定的了解,所以为了复习兼可视化shell历史文件,我想试一试。
必要的(环境)
-
- 有些时间戳是附在Shell历史文件上的
-
- Embulk 0.8.8
-
- Docker
-
- Elasticsearch 2.2.1
- Kibana 4.4.2
使用的环境是Debian GNU/Linux 8.2(jessie)。由于Docker用于简化Elastic环境的构建过程,因此不是必需的。
结果可视化
只有对Shell的历史文件有所了解,所以只能了解到频繁执行的命令。但是,通过加载多个历史文件,可以看到不同主机或时间段的差异,非常有趣。
“设置Shell历史记录”
zsh:终端命令行环境的一种选项。
在数据可视化中,时间戳非常重要,因此 extended_history 是必需的。
设定此选项后,历史记录文件将被记录如下。
: 1421072025:0;ls -l
: 時刻:経過秒;コマンド
顺便说一下,我使用的zsh历史相关的设置如下所示。设置更多的历史记录行数。详细内容请查阅手册。
- zsh: 16 Options – ZSH Documentation
HISTSIZE=1000000
SAVEHIST=$HISTSIZE
setopt extended_history
setopt hist_expire_dups_first
setopt hist_ignore_dups
setopt hist_ignore_space
setopt inc_append_history
setopt share_history
alias history='history -t "%Y-%m-%d %a %H:%M:%S"'
function history-all { history 1 }
猛烈击打
当指定HISTTIMEFORMAT时,将会输出经过的时间。
#1446886196
ls -l
HISTTIMEFORMAT='%Y-%m-%dT%T%z '
- Bash Reference Manual: Bash Variables
弹性搜索
因为不了解Java环境,所以选择使用Docker来简化操作。
sudo docker run -p 9200:9200 -p 9300:9300 --name es -d elasticsearch
Elasticsearch 插件
Elasticsearch-Kopf –> Elasticsearch-Kopf
为了方便地在浏览器上进行索引维护,我会安装kopf插件。
-
- lmenezes/elasticsearch-kopf
- elasticsearch-kopfの紹介(概要) – @johtaniの日記 2nd
sudo docker exec es /bin/bash -c '/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf'
elasticsearch-head 可以由Elasticsearch官方提供的图形用户界面工具替代。
是个人喜好,但使用head插件可能也可以。
- ElasticSearch Head
sudo docker exec es /bin/bash -c '/usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head'
基于中国语境的中文重述:
“Kibana” 可以是 “基邦纳”
因为不了解Node的环境,所以使用Docker来简化操作。
sudo docker run -p 5601:5601 --link es:elasticsearch --name kibana -d kibana
为了将Elasticsaerch集群的状态设为绿色,将Kibana使用的索引(.kibana)的副本数量设为0。
curl -XPUT 'localhost:9200/.kibana/_settings' -d '
{
"index" : {
"number_of_replicas" : 0
}
}'
Kibana插件 (Paraphrased in Chinese)
标签云
- stormpython/tagcloud: Tag Cloud Plugin for Kibana 4
docker exec kibana /bin/bash -c '/opt/kibana/bin/kibana plugin -i tagcloud -u https://github.com/stormpython/tagcloud/archive/master.zip'
热力图
- stormpython/heatmap: Heatmap Plugin for Kibana 4
由于在测试环境中成功运行,所以我们将使用适用于Kibana 4.3及以上版本的Alpha版。
sudo docker exec kibana /bin/bash -c '/opt/kibana/bin/kibana plugin -i heatmap -u https://github.com/stormpython/heatmap/archive/master.zip'
感知 zhī)
因为想要在浏览器中轻松进行注册数据的确认等操作,我们会添加一个Sense功能。
-
- Elasticsearch 2.0.0リリース(日本語訳) – @johtaniの日記 2nd
- The Sense UI
docker exec kibana /bin/bash -c '/opt/kibana/bin/kibana plugin --install elastic/sense'
为了加载插件,我们将重新启动Kibana。
sudo docker retsart kibana
Embulk 原生的中文句子翻譯。
我們使用Embulk作為將數據載入Elasticsearch的工具。
- http://www.embulk.org/
由于需要Java运行时环境,因此本次我们将安装OpenJDK。
sudo apt-get install openjdk-7-jdk
基本上,安装Embulk的步骤可以按照官方提供的指南进行。
- Quick Start – Linux & Mac & BSD
因为下载目标将重定向到使用SSL的CDN,所以请在curl选项中加上–insecure (-k)选项。
curl -k --create-dirs -o ~/.embulk/bin/embulk -L 'http://dl.embulk.org/embulk-latest.jar'
chmod +x ~/.embulk/bin/embulk
如果要将embulk的路径永久化,按照步骤进行。
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
这次只会暂时设定。
export PATH=$HOME/.embulk/bin:$PATH
Embulk插件
添加时间的Embulk过滤器
进行时间戳类型转换等操作的插件。
- treasure-data/embulk-filter-add_time
embulk gem install embulk-filter-add_time
用于将 timestamp 类型复制为 long 类型。
数据流过滤器-列
用于执行添加和删除列的插件。
- sonots/embulk-filter-column
embulk gem install embulk-filter-column
用于将多个列复制到后续过滤器所使用的列中。
评估过滤器-Embulk
一种能够在Ruby评估表达式中修改值的插件。
-
- embulk-filter-eval というフィルタープラグイン書いた – scramble cadenza
-
- mgi166/embulk-filter-eval
- A-AUTO 50 開発者ブログ: embulk-filter-evalでどんなデータ変換ができるのか試してみる
使用时间戳进行星期和时间转换,或者用于从命令行中分离命令和参数。
embulk gem install embulk-filter-eval
插入过滤器
向任意的列中添加指定的值的插件。
- muziyoshiz/embulk-filter-insert
为了识别是哪个主机的历史文件,将主机名作为liquid模板的变量来使用。
embulk gem install embulk-filter-insert
行过滤插件
根据指定的条件筛选数据的插件。
- sonots/embulk-filter-row
为了排除异常值使用(类似于grep -v)。
embulk gem install embulk-filter-row
将embulk-filter-split翻译成中文的一个选项 :
数据批量处理工具的分割过滤器
分割插件可根据指定的条件将数据分割成多个元素。
- toyama0919/embulk-filter-split
使用分号可以将在一行上执行的多个命令或通过管道连接在一起的命令分隔开来。
embulk gem install embulk-filter-split
embulk-output-elasticsearch -> 弹性搜索输出-Embulk
将输出插件连接到Elasticsearch。
- muga/embulk-output-elasticsearch
embulk gem install embulk-output-elasticsearch
数据加载
注册索引模板
将本次创建的索引定义作为索引模板进行注册。
- Index Templates
定义如下。
-
- Kibanaでの設定を手軽にするためインデックス名はlogstash-command_history
お試し環境なのでレプリカ数は0
全文検索は不要なので_allフィールドは使用しない
フィールド定義
@timestamp コマンド実行時刻。Kibanaで識別しやすいようにこの名前を使います
@wday コマンド実行時刻の曜日(1:月曜〜7:日曜)
@hour コマンド実行時刻の時間
@host シェル実行ホスト名
@shell シェル種別
@command コマンドライン(Analyzeしないものを@command.raw)
command コマンド名
args コマンド引数
curl -XPUT localhost:9200/_template/command_history_template -d'
{
"template": "logstash-*",
"settings": { "number_of_replicas" : 0 },
"mappings": {
"command_history": {
"_all": { "enabled": false },
"properties": {
"@timestamp": {
"type": "date"
},
"@wday": {
"type": "byte"
},
"@hour": {
"type": "byte"
},
"@host": {
"index": "not_analyzed",
"type": "string"
},
"@shell": {
"index": "not_analyzed",
"type": "string"
},
"@command": {
"type": "string",
"fields": {
"raw": {
"index": "not_analyzed",
"type": "string"
}
}
},
"command": {
"index": "not_analyzed",
"type": "string"
},
"args": {
"type": "string"
}
}
}
}
}
}'
Embulk的配置
由於使用Embulk插件將所有內容轉換為所需格式似乎很困難,所以我們決定在Shell中處理數據並將其作為標準輸入讀入。
-
- 入力はTSVを標準入力から
-
- 引数でホスト名とシェルを与える
- タイムスタンプが保持されていないヒストリを除くようにしています。(1327083640 2012-01-21 03:20:40)
in:
type: file
path_prefix: /dev/stdin
parser:
type: csv
delimiter: "\t"
columns:
- {name: '@timestamp', type: timestamp, format: '%s'}
- {name: '@command', type: string}
filters:
- type: row
conditions:
- {column: '@timestamp', operator: ">", argument: "1327083640", format: '%s' }
- type: insert
columns:
- '@host': {{ env.host }}
- '@shell': {{ env.shell }}
at: 1
- type: split
delimiter: '|'
keep_input: true
target_key: '@command'
- type: add_time
to_column:
name: '@wday'
type: long
from_column:
name: '@timestamp'
- type: column
add_columns:
- {name: '@hour', src: '@wday' }
- {name: command, src: '@command' }
- {name: args, src: '@command' }
- type: eval
eval_columns:
- '@wday': Time.at(value).strftime('%u')
- '@hour': Time.at(value).strftime('%H')
- command: value.sub(/^\s*(?:(?:env )?[^=]+=\S+ )*(\S+).*$/, '\1')
- args: if value.match(/^\s*\S+ (.*?)\s*$/) then
value=$1
else
value=nil
end
out:
type: elasticsearch
cluster_name: elasticsearch
nodes:
- {host: localhost, port: 9300}
index: logstash-command_history
index_type: command_history
加载历史文件(bash)
-
- awkで時刻文字列とコマンドラインを1行にしてタブ区切りにします
file に任意の.bash_historyのパス
host に任意のホスト名
file=/path/to/bash_history
host=somehost
cat $file | awk '{getline ts; print substr(ts,2)"\t"$0}' |
host=$host shell=bash embulk run ./command_history.yml.liquid
加载Histfile(Zsh)。
-
- sedでタブ区切りにします(複数行には対応しません)
file に任意の.zsh_historyのパス
host に任意のホスト名
file=/path/to/bash_history
host=somehost
cat $file | cut -b 3- | sed -e 's/:0;/\t/' |
host=$host shell=zsh embulk run ./command_history.yml.liquid
最后
这篇文章是去年年底开始写的,但因为一些事情而延迟发布,期间 embulk-output-plugin正式支持了Elasticsearch 2系列,embulk-filter_add_time也被创建了,使得向Elasticsearch注册变得更加简便。
另外,由於Kibana中的熱度圖插件已經處於 Alpha 版本並可運行,因此我們可以知道不需要將星期幾和時間段的柱狀圖並排。
而且,仅限于家里使用的主机,周末的活动时间也变得不规律了呢。。。
不要将其称为大数据,您也许可以尝试在Elastic环境中将您手头的历史数据可视化,可能会有新的发现。