2
1

More than 1 year has passed since last update.

nginxのログデータを更に深堀り: New RelicのLogs in Contextでトレースとログを関連付ける方法

Last updated at Posted at 2023-09-07

最新のアップデートの詳細はこちら。 New Relic アップデート一覧

はじめに

 こちらの記事では、OpenTelemetry を使用して nginx のテレメトリデータを収集し、New Relic でそのデータを可視化する方法を紹介しました。

 ただ、New Relic の分散トレーシングをフル活用するためには、まだまだ設定が不足しています。この記事では、New Relic の Logs in Context を使って nginx のログとトレース情報を関連付けてトランザクションごとのログを確認できるようにする方法を紹介します。Logs in Context については、こちらのブログを参考にしてください。

Logs.png

nginx のログをNew Relicに連携する

 今回は、nginx のログをfluent bit 経由で New Relic へ連携していきます。
 まず、Fluentd Forward Protocol を使って OpenTelemetry Collector がログを受信できるように設定を変更します。

otel-config.yml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
+ fluentforward:
+ endpoint: 0.0.0.0:8006
processors:
  batch:

exporters:
  otlp:
    endpoint: https://otlp.nr-data.net:4317
    headers:
      api-key: ${NEW_RELIC_LICENSE_KEY} # New Relicのライセンスキーを環境変数に設定

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]
    logs:
-     receivers: [otlp]
+     receivers: [otlp, fluentforward]
      processors: [batch]
      exporters: [otlp]

次に nginx から OpenTelemetry Collector にログが出力されるようにDocker Composeの定義ファイルを変更します。

docker-compose.yml
  # nginx
  web:
      container_name: nginx_web
      platform: 'linux/amd64'
      build:
        context: .
        dockerfile: ./containers/nginx.dockerfile
      ports:
          - "8080:80"
      depends_on:
          - php
+     logging:
+       driver: "fluentd"
+       options:
+         # OpenTelemetry Collector のポート 8006 を宛先に設定
+         fluentd-address: localhost:8006
+         # 起動時に接続を確立的無くても container は起動する設定
+         fluentd-async-connect: "true"
docker-compose.yml
  # OpenTelemetry Collector
  otel-collector:
    container_name: otel-collector
    platform: 'linux/amd64'
    image: otel/opentelemetry-collector-contrib:0.83.0
    restart: always
    command: ["--config=/etc/otel-config.yml", ""]
    volumes:
      - ./otel-config.yml:/etc/otel-config.yml
    environment:
        # 環境変数でNew Relicのライセンスキーを設定
        - NEW_RELIC_LICENSE_KEY
+   # fluentforward で受信するためのポートを公開
+   ports:
+       - "8006:8006"

 ここまでの設定で nginx のログを New Relic へ連携されます。それでは、New Relic Logs で連携されたログを確認してみましょう。

logs-without-servicename.png
 New Relicにコンテナ名:nginx_webのログが連携されていることが確認できました。OpenTelemetry Collector経由でログを転送しているため、newrelic.source に api.logs.otlp が設定されています。
 ログの詳細を確認してみましょう。
logs-detail-without-servicename.png
 JSON形式でログを転送しているため key-value 形式で表示されます。また、アプリケーションやインフラのエンティティとゴルが関連付けられていれば、画像の赤枠の位置にエンティティーへのリンクが表示されています。しかし、現状表示されていないため、ログとアプリケーション nginx-php-proxy が関連付ける必要があります。
 関連付けができていないため、下記の画像のように New Relic APM の Logs のメニューを開いてもデータが表示されません。
apm-logs-without-servicename.png

nginx のログをトレース情報と関連付けてNew Relicで表示する

 ログをアプリケーションと関連付けるには、ログの metadata にservice.nameを設定する必要があります。詳細はこちらの公式ドキュメントを参考にしてください。

 さらに、アプリケーションのトレース情報とログを関連付ける場合には、ログの metadata に trace.idspan.idを設定する必要があります。詳細はこちらの公式ドキュメントを参考にしてください。

 この内容に合わせて nginx のログ出力設定を変更していきます。

nginx.conf
    log_format json escape=json '{"time": "$time_iso8601",'
                                '"host": "$remote_addr",'
                                '"vhost": "$host",'
                                '"user": "$remote_user",'
                                '"status": "$status",'
                                '"protocol": "$server_protocol",'
                                '"method": "$request_method",'
                                '"path": "$request_uri",'
                                '"req": "$request",'
                                '"size": "$body_bytes_sent",'
                                '"reqtime": "$request_time",'
                                '"apptime": "$upstream_response_time",'
                                '"user_agent": "$http_user_agent",'
                                '"forwardedfor": "$http_x_forwarded_for",'
                                '"forwardedproto": "$http_x_forwarded_proto",'
-                               '"referrer": "$http_referer"}';
+                               '"referrer": "$http_referer",'
+                               '"service.name": "nginx-php-proxy",'
+                               '"trace.id": "$opentelemetry_trace_id",'
+                               '"span.id": "$opentelemetry_span_id"}';

 この変更で nginx のログを New RelicのUI上で nginx-php-proxy のエンティティとトレース情報に関連付けることができています。Dockerを再構築して結果を確認していきましょう。

まずは、nginx-php-proxy のエンティティとの関連付けを確認します。nginx-php-proxy の APM のメニューから Logs 開いて連携されているログを確認しましょう。
apm-logs-with-servicename.png
 service.name がログのメタデータに含まれているため、ログが APM の画面上で確認できるようになっています。
 ログの詳細も確認してみましょう。下記のようにログの詳細画面で Service や Distributed Trace の情報が確認できるようになっています。画面上の /index.phpのリンクから APM の Distributed Tracing の画面へ遷移できます。このリンクから Distributed Tracing の画面を開いてトレース情報に関連付けられたログを確認していきましょう。
apm-logs-detail-with-servicename.png
 このように Distributed Tracing の画面が表示されます。次に Logs のタブからこのトレースに関連付けられたログを確認していきます。
apm-dt-with-servicename.png
 下記が Logs のタブで表示した画面です。今回は、nginx のログのみが表示されていますが、同一トレース内でアプリケーションのログが出力されている場合はこちらに表示されます。
apm-dt-logs-with-servicename.png

参考情報

 この記事では nginx の計装をメインで説明したため、バックエンドのアプリケーションは簡易なものでした。実際のアプリケーションでは、以下のような表示になります。
スクリーンショット 2023-09-03 22.25.03.png
スクリーンショット 2023-09-03 22.25.26.png
 

まとめ

 この記事の中で、OpenTelemetry を使用して nginx のトレース情報とログを収集し、New Relic の Logs in Context でそのデータを関連付けて可視化する方法を解説しました。
 これにより、nginx のログデータを効果的に収集し、New Relic での可視化を実現することができます。特に、分散トレーシングを有効にすることで、トランザクション単位のログを明確に把握することができるようになりました。nginx のログは、システムの問題の発見・対応に役立つ重要な作業です。OpenTelemetry と New Relic を組み合わせることで、これらの作業を効率的に行うことができます。
 試してみたいという方は、今回紹介した OpenTelemetry と New Relic の連携は、永久無償ライセンスでも利用できます。是非永久無償ライセンスをこちらから試して見てください。

最新のアップデートの詳細はこちら。 New Relic アップデート一覧

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1