New Relic用grepコマンド
はじめに
大量のログを保存して瞬時に検索が出来たり、ダッシュボードを作成してログから抽出した様々なメトリックスを可視化出来るようなサービスがいろいろあります。
そんなサービスのひとつ、New Relicを触る機会がありました。
大量のログを入れてみましたが、検索はめちゃめちゃ高速です。
対象のサーバーにログインして、対象の日付のログファイルを探して、grepして・・・なんてしなくても、全てのログをまとめて検索できてしまいます。
しかし、便利なのですが、うーん、Webのかっこいい画面で検索してログを見るのも、ま、いいのはいいのですが、やっぱり、コンソールでgrepをパイプでつないでごにょごにょしたいのです。
ということで、New Relicにため込んだログをgrepするコマンドを作りました。
題して、nrgrep
(ヌルグレップ)です。
ソースから見たい人はこちらです。
インストール
Pythonで書いたので、PyPIに置いておきました。
pipでインストールできます。
pip install newrelic-grep
事前準備
APIを使用するので、USERのAPI KEYとアカウントIDが必要です。
それぞれを取得して、環境変数に入れておきます。
.bash_profile
などに書いておくといいでしょう。
New Relicは1週間しか使っておらず、お作法がよくわからないので、とりあえず、NR_API_KEY
とNR_ACCOUNT_ID
にしました。
export NR_API_KEY=NRAK-4KCST5......
export NR_ACCOUNT_ID=1234567
という感じです。
使い方
基本的な使い方
grepコマンドのような雰囲気で使えます。
logind
を含むログを検索してみます。
nrgrep logind
Mar 15 22:01:36 ns1 systemd-logind: New session c55 of user root.
Mar 15 22:01:36 ns1 systemd-logind: Removed session c55.
Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
おお、いい感じです。
期間の指定
デフォルトでは3日前から検索するようにしてありますが、期間も指定できます。
2023年3月15日 22:15:00~2023年3月15日 22:25:00の間で検索してみましょう。
nrgrep --since 20230315221500 --until 20230315222500 logind
Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
絞り込むことが出来ました。
秒まで書くのも面倒なので、省略して月日のみや月日時などでも検索できます。
nrgrep --since 2023031522 --until 2023031523 logind
のようにした場合、2023/3/15 22:00~23:00の間で検索します。
行数の指定
デフォルトでは全て抽出するようになっていますが-l
オプションで取り出す行数を指定できます。
nrgrep -l 2 logind
正規表現での検索
-e
オプションを付けることで、正規表現で検索できます。
nrgrep -e 'Started.*Getty'
Mar 15 22:08:32 ns1 systemd: Started Console Getty.
Mar 15 22:08:32 ns1 systemd: Started Getty on tty2.
Mar 15 23:08:33 ns1 systemd: Started Getty on tty2.
Mar 15 23:08:33 ns1 systemd: Started Console Getty.
Attributeの表示
New Relicでは自動、または、ルールを作成することで、ログの中の有益な情報をAttributeと呼ばれるものに切り出すことができます。
このAttribute情報をログの左側に表示します。
-a
オプションでAttribute名を指定します。
複数記述することが可能です。
log
というキーワードで検索し、logtype
とtimestamp
というAttributeを表示してみます。
nrgrep -a logtype -a timestamp log
newrelic-cli:1678885235732:Log installation completed
newrelic-cli:1678885236973:Done executing and validating with progress for recipe name logs-integration.
linux_messages:1678885296242:Mar 15 22:01:36 ns1 systemd-logind: New session c55 of user root.
linux_messages:1678885296257:Mar 15 22:01:36 ns1 systemd-logind: Removed session c55.
linux_messages:1678886449540:Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
logtype
としてnewrelic-cli
とlinux_messages
が表示されました。また、その横にtimestampが表示されています。
Attributeで検索
Attributeで検索することも出来ます。
-q
オプションでAttribute名:抽出する値
という形式で指定します。
複数指定した場合はAND検索されます。
ここでは、log
というキーワードで、logtype
がlinux_messages
のものを検索します。
nrgrep -a logtype -a timestamp -q logtype:linux_messages log
linux_messages:1678885296242:Mar 15 22:01:36 ns1 systemd-logind: New session c55 of user root.
linux_messages:1678885296257:Mar 15 22:01:36 ns1 systemd-logind: Removed session c55.
linux_messages:1678886449540:Mar 15 22:20:49 ns1 systemd-logind: New session 16952719 of user root.
応用編
おしゃれなGUIではなくいつも通りのgrepコマンドと変わらないはずなので、パイプでつないだり今までのノウハウがそのまま生かせます。
log
というキーワードで検索してlogtype
の種類毎に結果の行数を集計して多い順に並べてみましょう。
nrgrep -a logtype log | awk -F: '{print $1}' | sort | uniq -c | sort -nr
69 linux_messages
14 newrelic-cli
いい感じです。
まとめ
New Relicにログを保存するのは便利なのですが、今まで通りgrepは使いたい。
そんな方向けのコマンドの紹介でした。
ソースも公開していますので、フォークして都合のいいように改造するもよし、改造したソースをプルリクしていただくのも歓迎です。
それでは、楽しいログライフを。