OpenShift Container Platform では「OpenShift Logging」という Operator をインストールしてロギングの機能を追加できる。 この OpenShift Logging を使ってコンテナのログを New Relic に転送できるか試した。
バージョンの仕様変更
執筆時点の OpenShift Logging の最新バージョンは 6.1.0 だが、6.0.0 になったタイミングで仕様変更が入っている。
特に ClusterLogging.logging.openshift.io
と ClusterLogForwarder.logging.openshift.io
という API が無くなり、ClusterLogForwarder.observability.openshift.io
に統一された。
今回試したのは 5.9.9 の環境なのでログ転送に ClusterLogForwarder.logging.openshift.io
を使っているが、ドキュメントを見る限り 6.0.0 以降の ClusterLogForwarder.observability.openshift.io
でも同じように動きそう。
Vector
OpenShift Logging では Vector というログやメトリクスなどの可観測性データを収集・加工・送信するツールをコレクターとして使っている。
OpenShift Logging をインストールすると DaemonSets として collector
がデプロイされて、Pod の中で Vector コンテナが動いてログを集めて転送する。
この Vector が New Relic 宛のログ転送をサポートしていれば可能かも、ということで調べてみるとベータ版だけどドキュメントが見つかった。
ドキュメント見る限り、Vector に New Relic 用の設定ができればログ転送できそう。
Vector の設定
Vecotr コンテナの /etc/vector/vector.toml
に転送先に関する設定がある。
マニフェストを見ると、この設定ファイルは Secret リソース collector-config
をマウントしていることが分かる。
この Secret リソースを直接編集するのかと言うとそうではなく、ClusterLogForwarder
カスタムリソースに転送設定をする必要がある。
直接編集しても Operator がよしなに戻してくれる。
というわけで Vector のドキュメントに合わせて ClusterLogForwarder
を次のようにしてみた。
# 動かないマニフェスト
apiVersion: logging.openshift.io/v1
kind: ClusterLogForwarder
metadata:
name: instance
namespace: openshift-logging
spec:
pipelines:
- name: new-relic
inputRefs:
- application
outputRefs:
- new-relic
outputs:
- name: new-relic
type: new_recli
inputs: [ "my-source-or-transform-id" ]
account_id: "xxxx"
api: "events"
license_key: "xxxx"
だけど「Error “Unsupported value: “new_relic”: supported values: “(省略)」とエラーが出てデプロイできなかった。 この書き方はサポートされていないらしい。
HTTP ログ転送
あらためて OpenShift Logging のドキュメントを見ると、ClusterLogForwarder
で指定できるタイプは決まっているみたいで、この中には New Relic が無かった。
New Relic 用はサポートされていないけど、汎用的な HTTP 転送はサポートされているみたいで、New Relic 側も Log API を使えばログ転送できるとある。
New Relic の Log API と OpenShift Logging のドキュメントを元にして設定した ClusterLogForwarder
がこちら。
apiVersion: logging.openshift.io/v1
kind: ClusterLogForwarder
metadata:
name: instance
namespace: openshift-logging
spec:
pipelines:
- name: new-relic
inputRefs:
- application
outputRefs:
- new-relic
outputs:
- name: new-relic
type: http
url: "https://log-api.newrelic.com/log/v1"
http:
headers:
Content-Type: application/json
Api-Key: xxxx
method: POST
tls:
insecureSkipVerify: true
このマニフェストをデプロイすると collector
DaemonSets がロールアウトされて、しばらくすると New Relic にログが転送された。
課題
上記の ClusterLogForwarder
で New Relic にログ転送できたけど、Header に New Relic のライセンスキーをそのまま埋め込まないといけないのでセキュリティ的によろしくないのでは、というのが課題。
ライセンスキーを格納した Secret リソースを参照して Header を設定できればいいのだけれど。