OpenShift Container Platform では「OpenShift Logging」という Operator をインストールしてロギングの機能を追加できる。 この OpenShift Logging を使ってコンテナのログを New Relic に転送できるか試した。

バージョンの仕様変更

執筆時点の OpenShift Logging の最新バージョンは 6.1.0 だが、6.0.0 になったタイミングで仕様変更が入っている。 特に ClusterLogging.logging.openshift.ioClusterLogForwarder.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 宛のログ転送をサポートしていれば可能かも、ということで調べてみるとベータ版だけどドキュメントが見つかった。

New Relic sink

Deliver events to 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 が無かった。

11.4. ログ転送の設定 | Red Hat Product Documentation

11.4. ログ転送の設定 | Red Hat Documentation


New Relic 用はサポートされていないけど、汎用的な HTTP 転送はサポートされているみたいで、New Relic 側も Log API を使えばログ転送できるとある。

Log API を使用してログ データを送信します | New Relic Documentation

Use our Log API so you can send your monitored log data directly to New Relic via HTTP input.


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 にログが転送された。

New Relic ダッシュボード

課題

上記の ClusterLogForwarder で New Relic にログ転送できたけど、Header に New Relic のライセンスキーをそのまま埋め込まないといけないのでセキュリティ的によろしくないのでは、というのが課題。 ライセンスキーを格納した Secret リソースを参照して Header を設定できればいいのだけれど。