ElasticsearchのログをGKEでStackdriverで取り込む

GKEとかで普通にElasticsearchを使って、コンソールのログをStackdriverで回収してもらえば、Logs Viewerで見ることができると思うけど、ログレベルがINFOかERRORの2択になる。つまり、WARNとかのログはINFOとして出てしまう。これはStackdriverに投げているfluentdがログメッセージのパースができなければ、stdoutならINFOで、stderrならERRORみたいな決め方になっているためで、fluentd-configmap.yamlあたりをみればわかる。

それではどうするか?だけど、fluentd-configmap.yamlには

format /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<log>.*)/

という感じでパースするフォーマットが書いてあるのでこれに合わせる必要がある。<time>\d{4}って、何を指しているのだろうとかも思ったけど、MMddだった。

Elasticsearchのでデフォルトのログフォーマットとかはlog4j2.propertiesを見ると

appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n

という感じになっていると思うけど、この辺のログフォーマットを

appender.console.layout.pattern = %.-1p%d{MMdd HH:mm:ss.SSSSSS} 1 [%node_name] %m%xThrowable{separator(|)}%n

みたいな感じで、patternたちを変更しておく。ログレベルが始めの1文字で表されている。pidはとりあえず適当に1とかにしたけど、きちんと取得してもよいのかも(試してない)。あとは、スタックトレースが1行内に収めないと、Stackdriver上で分解されれるので1行にしておく。

これも普通にぐぐると、エージェントを組み込むとか、GKEのfluentdの設定をカスタマイズするとかがほとんどな気がするので、このログフォーマット問題は結構ハマる気がする…。

AdoptOpenJDKをパッケージで入れる

ここの情報によると、AdoptOpenJDKでようやくオフィシャルなRPMとDEBファイルが提供されるようになったらしい。というわけで、Ubuntu 18.04に入れてみる。

# wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | apt-key add -
# echo deb https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ bionic main > /etc/apt/sources.list.d/adoptopenjdk.list
# apt-get update
# apt-get install adoptopenjdk-11-hotspot

という感じで簡単にインストールできる。

$ java -version
 openjdk version "11.0.3" 2019-04-16
 OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
 OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)

デフォルトが変わらないようであれば

# update-alternatives --config java

をして切り替える。

Python 3.7のインストールに失敗するときに

Ubunut 18.04にpyenvで以下のような感じでPython 3.7のインストールに失敗するときには

$ pyenv install 3.7.3
 Downloading Python-3.7.3.tar.xz…
 -> https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
 Installing Python-3.7.3…
 BUILD FAILED (Ubuntu 18.04 using python-build 1.2.11-11-g7dd50144)
 Inspect or clean up the working tree at /tmp/python-build.20190516184525.2792
 Results logged to /tmp/python-build.20190516184525.2792.log
 Last 10 log lines:
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/commands/init.py", line 6, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/commands/completion.py", line 6, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/base_command.py", line 20, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/download.py", line 37, in 
   File "/tmp/tmp97wtapkd/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/utils/glibc.py", line 3, in 
   File "/tmp/python-build.20190516184525.2792/Python-3.7.3/Lib/ctypes/init.py", line 7, in 
     from _ctypes import Union, Structure, Array
 ModuleNotFoundError: No module named '_ctypes'
 Makefile:1130: recipe for target 'install' failed
 make: *** [install] Error 1

以下のような感じで、libffi-devを入れておく。

$ sudo apt install libffi-dev